Files
Paradise/code/game/dna/genes/goon_powers.dm
2015-05-25 19:48:13 -04:00

612 lines
19 KiB
Plaintext

#define EAT_MOB_DELAY 300 // 30s
// WAS: /datum/bioEffect/alcres
/datum/dna/gene/basic/sober
name="Sober"
activation_messages=list("You feel unusually sober.")
deactivation_messages = list("You feel like you could use a stiff drink.")
mutation=SOBER
New()
block=SOBERBLOCK
//WAS: /datum/bioEffect/psychic_resist
/datum/dna/gene/basic/psychic_resist
name="Psy-Resist"
desc = "Boosts efficiency in sectors of the brain commonly associated with meta-mental energies."
activation_messages = list("Your mind feels closed.")
deactivation_messages = list("You feel oddly exposed.")
instability=2
mutation=PSY_RESIST
New()
block=PSYRESISTBLOCK
/////////////////////////
// Stealth Enhancers
/////////////////////////
/datum/dna/gene/basic/stealth
instability=7
can_activate(var/mob/M, var/flags)
// Can only activate one of these at a time.
if(is_type_in_list(/datum/dna/gene/basic/stealth,M.active_genes))
testing("Cannot activate [type]: /datum/dna/gene/basic/stealth in M.active_genes.")
return 0
return ..(M,flags)
deactivate(var/mob/M)
..(M)
M.alpha=255
// WAS: /datum/bioEffect/darkcloak
/datum/dna/gene/basic/stealth/darkcloak
name = "Cloak of Darkness"
desc = "Enables the subject to bend low levels of light around themselves, creating a cloaking effect."
activation_messages = list("You begin to fade into the shadows.")
deactivation_messages = list("You become fully visible.")
activation_prob=10
New()
block=SHADOWBLOCK
OnMobLife(var/mob/M)
var/turf/simulated/T = get_turf(M)
if(!istype(T))
return
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
if(L)
light_available = L.get_clamped_lum()*10
else
light_available = 5
if(light_available <= 2)
M.alpha = round(M.alpha * 0.8)
else
M.alpha = 255
//WAS: /datum/bioEffect/chameleon
/datum/dna/gene/basic/stealth/chameleon
name = "Chameleon"
desc = "The subject becomes able to subtly alter light patterns to become invisible, as long as they remain still."
activation_messages = list("You feel one with your surroundings.")
deactivation_messages = list("You feel oddly exposed.")
activation_prob=10
New()
block=CHAMELEONBLOCK
OnMobLife(var/mob/M)
if((world.time - M.last_movement) >= 30 && !M.stat && M.canmove && !M.restrained())
M.alpha -= 25
else
M.alpha = round(255 * 0.80)
/////////////////////////////////////////////////////////////////////////////////////////
/datum/dna/gene/basic/grant_spell
var/obj/effect/proc_holder/spell/wizard/spelltype
activate(var/mob/M, var/connected, var/flags)
M.AddSpell(new spelltype(M))
..()
return 1
deactivate(var/mob/M, var/connected, var/flags)
for(var/obj/effect/proc_holder/spell/wizard/S in M.spell_list)
if(istype(S,spelltype))
M.spell_list.Remove(S)
..()
return 1
/datum/dna/gene/basic/grant_verb
var/verbtype
activate(var/mob/M, var/connected, var/flags)
..()
M.verbs += verbtype
return 1
deactivate(var/mob/M, var/connected, var/flags)
..()
M.verbs -= verbtype
// WAS: /datum/bioEffect/cryokinesis
/datum/dna/gene/basic/grant_spell/cryo
name = "Cryokinesis"
desc = "Allows the subject to lower the body temperature of others."
activation_messages = list("You notice a strange cold tingle in your fingertips.")
deactivation_messages = list("Your fingers feel warmer.")
instability=10
spelltype = /obj/effect/proc_holder/spell/wizard/targeted/cryokinesis
New()
..()
block = CRYOBLOCK
/obj/effect/proc_holder/spell/wizard/targeted/cryokinesis
name = "Cryokinesis"
desc = "Drops the bodytemperature of another person."
panel = "Abilities"
charge_type = "recharge"
charge_max = 1200
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 7
selection_type = "range"
include_user = 1
// centcomm_cancast = 0
var/list/compatible_mobs = list(/mob/living/carbon/human)
action_icon_state = "genetic_cryo"
/obj/effect/proc_holder/spell/wizard/targeted/cryokinesis/cast(list/targets)
if(!targets.len)
usr << "<span class='notice'>No target found in range.</span>"
return
var/mob/living/carbon/C = targets[1]
if(!iscarbon(C))
usr << "\red This will only work on normal organic beings."
return
if (RESIST_COLD in C.mutations)
C.visible_message("\red A cloud of fine ice crystals engulfs [C.name], but disappears almost instantly!")
return
var/handle_suit = 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(istype(H.head, /obj/item/clothing/head/helmet/space))
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
handle_suit = 1
if(H.internal)
H.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [H]!",
"<span class='notice'>[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
log_admin("[ckey(usr.key)] has used cryokinesis on [ckey(C.key)], internals yes, suit yes")
msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
else
H.visible_message("\red [usr] sprays a cloud of fine ice crystals engulfing, [H]!",
"<span class='warning'>[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
log_admin("[usr.real_name] ([ckey(usr.key)]) has used cryokinesis on [C.real_name] ([ckey(C.key)]), (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>)")
msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
H.bodytemperature = max(0, H.bodytemperature - 50)
H.adjustFireLoss(5)
if(!handle_suit)
C.bodytemperature = max(0, C.bodytemperature - 100)
C.adjustFireLoss(10)
C.ExtinguishMob()
C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!")
log_admin("[ckey(usr.key)] has used cryokinesis on [ckey(C.key)], internals no, suit no")
msg_admin_attack("[usr.real_name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has cast cryokinesis on [C.real_name] ([C.ckey]), (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
//playsound(usr.loc, 'bamf.ogg', 50, 0)
new/obj/effects/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
return
/obj/effects/self_deleting
density = 0
opacity = 0
anchored = 1
icon = null
desc = ""
//layer = 15
New(var/atom/location, var/icon/I, var/duration = 20, var/oname = "something")
src.name = oname
loc=location
src.icon = I
spawn(duration)
qdel(src)
///////////////////////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/mattereater
/datum/dna/gene/basic/grant_spell/mattereater
name = "Matter Eater"
desc = "Allows the subject to eat just about anything without harm."
activation_messages = list("You feel hungry.")
deactivation_messages = list("You don't feel quite so hungry anymore.")
instability=3
spelltype=/obj/effect/proc_holder/spell/wizard/targeted/eat
New()
..()
block = EATBLOCK
/obj/effect/proc_holder/spell/wizard/targeted/eat
name = "Eat"
desc = "Eat just about anything!"
panel = "Abilities"
charge_type = "recharge"
charge_max = 300
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 1
selection_type = "view"
action_icon_state = "genetic_eat"
var/list/types_allowed=list(/obj/item,/mob/living/simple_animal, /mob/living/carbon/human)
/obj/effect/proc_holder/spell/wizard/targeted/eat/choose_targets(mob/user = usr)
var/list/targets = new /list()
var/list/possible_targets = new /list()
for(var/atom/movable/O in view_or_range(range, user, selection_type))
if(is_type_in_list(O,types_allowed))
possible_targets += O
targets += input("Choose the target of your hunger.", "Targeting") as anything in possible_targets
if(!targets.len) //doesn't waste the spell
revert_cast(user)
return
perform(targets)
/obj/effect/proc_holder/spell/wizard/targeted/eat/proc/doHeal(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H=user
for(var/name in H.organs_by_name)
var/obj/item/organ/external/affecting = null
if(!H.organs[name])
continue
affecting = H.organs[name]
if(!istype(affecting, /obj/item/organ/external))
continue
affecting.heal_damage(4, 0)
H.UpdateDamageIcon()
H.updatehealth()
/obj/effect/proc_holder/spell/wizard/targeted/eat/cast(list/targets)
if(!targets.len)
usr << "<span class='notice'>No target found in range.</span>"
return
var/atom/movable/the_item = targets[1]
if(ishuman(the_item))
//My gender
var/m_his="his"
if(usr.gender==FEMALE)
m_his="her"
// Their gender
var/t_his="his"
if(the_item.gender==FEMALE)
t_his="her"
var/mob/living/carbon/human/H = the_item
var/obj/item/organ/external/limb = H.get_organ(usr.zone_sel.selecting)
if(!istype(limb))
usr << "\red You can't eat this part of them!"
revert_cast()
return 0
if(istype(limb,/obj/item/organ/external/head))
// Bullshit, but prevents being unable to clone someone.
usr << "\red You try to put \the [limb] in your mouth, but [t_his] ears tickle your throat!"
revert_cast()
return 0
if(istype(limb,/obj/item/organ/external/chest))
// Bullshit, but prevents being able to instagib someone.
usr << "\red You try to put their [limb] in your mouth, but it's too big to fit!"
revert_cast()
return 0
usr.visible_message("\red <b>[usr] begins stuffing [the_item]'s [limb.name] into [m_his] gaping maw!</b>")
var/oldloc = H.loc
if(!do_mob(usr,H,EAT_MOB_DELAY))
usr << "\red You were interrupted before you could eat [the_item]!"
else
if(!limb || !H)
return
if(H.loc!=oldloc)
usr << "\red \The [limb] moved away from your mouth!"
return
usr.visible_message("\red [usr] [pick("chomps","bites")] off [the_item]'s [limb]!")
playsound(usr.loc, 'sound/items/eatfood.ogg', 50, 0)
var/obj/limb_obj=limb.droplimb(0,DROPLIMB_BLUNT)
if(limb_obj)
var/obj/item/organ/external/chest=usr:get_organ("chest")
chest.implants += limb_obj
limb_obj.loc=usr
doHeal(usr)
else
usr.visible_message("\red [usr] eats \the [the_item].")
playsound(usr.loc, 'sound/items/eatfood.ogg', 50, 0)
qdel(the_item)
doHeal(usr)
return
////////////////////////////////////////////////////////////////////////
//WAS: /datum/bioEffect/jumpy
/datum/dna/gene/basic/grant_spell/jumpy
name = "Jumpy"
desc = "Allows the subject to leap great distances."
//cooldown = 30
activation_messages = list("Your leg muscles feel taut and strong.")
deactivation_messages = list("Your leg muscles shrink back to normal.")
instability=2
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/leap
New()
..()
block = JUMPBLOCK
/obj/effect/proc_holder/spell/wizard/targeted/leap
name = "Jump"
desc = "Leap great distances!"
panel = "Abilities"
range = -1
include_user = 1
charge_type = "recharge"
charge_max = 60
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
action_icon_state = "genetic_jump"
/obj/effect/proc_holder/spell/wizard/targeted/leap/cast(list/targets)
var/failure = 0
if (istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
usr << "\red You can't jump right now!"
return
if (istype(usr.loc,/turf/))
if(usr.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(usr, 1))
if(M.pulling == usr)
if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M))
failure = 1
else
M.stop_pulling()
if(usr.pinned.len)
failure = 1
usr.visible_message("\red <b>[usr.name]</b> takes a huge leap!")
playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failure)
usr.Weaken(5)
usr.Stun(5)
usr.visible_message("<span class='warning'> \the [usr] attempts to leap away but is slammed back down to the ground!</span>",
"<span class='warning'>You attempt to leap away but are suddenly slammed back down to the ground!</span>",
"<span class='notice'>You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.</span>")
return 0
var/prevLayer = usr.layer
usr.layer = 9
for(var/i=0, i<10, i++)
step(usr, usr.dir)
if(i < 5) usr.pixel_y += 8
else usr.pixel_y -= 8
sleep(1)
if (FAT in usr.mutations && prob(66))
usr.visible_message("\red <b>[usr.name]</b> crashes due to their heavy weight!")
//playsound(usr.loc, 'zhit.wav', 50, 1)
usr.weakened += 10
usr.stunned += 5
usr.layer = prevLayer
if (istype(usr.loc,/obj/))
var/obj/container = usr.loc
usr << "\red You leap and slam your head against the inside of [container]! Ouch!"
usr.paralysis += 3
usr.weakened += 5
container.visible_message("\red <b>[usr.loc]</b> emits a loud thump and rattles a bit.")
playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
container.pixel_x = rand(-3,3)
container.pixel_y = rand(-3,3)
sleep(1)
container.pixel_x = 0
container.pixel_y = 0
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/polymorphism
/datum/dna/gene/basic/grant_spell/polymorph
name = "Polymorphism"
desc = "Enables the subject to reconfigure their appearance to mimic that of others."
spelltype =/obj/effect/proc_holder/spell/wizard/targeted/polymorph
//cooldown = 1800
activation_messages = list("You don't feel entirely like yourself somehow.")
deactivation_messages = list("You feel secure in your identity.")
instability=5
New()
..()
block = POLYMORPHBLOCK
/obj/effect/proc_holder/spell/wizard/targeted/polymorph
name = "Polymorph"
desc = "Mimic the appearance of others!"
panel = "Abilities"
charge_max = 1800
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = 1
selection_type = "range"
action_icon_state = "genetic_poly"
/obj/effect/proc_holder/spell/wizard/targeted/polymorph/cast(list/targets)
var/mob/living/M=targets[1]
if(!ishuman(M))
usr << "\red You can only change your appearance to that of another human."
return
if(!ishuman(usr)) return
//playsound(usr.loc, 'blobattack.ogg', 50, 1)
usr.visible_message("\red [usr]'s body shifts and contorts.")
spawn(10)
if(M && usr)
//playsound(usr.loc, 'gib.ogg', 50, 1)
usr.UpdateAppearance(M.dna.UI)
usr:real_name = M:real_name
usr:name = M:name
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/empath
/datum/dna/gene/basic/grant_spell/empath
name = "Empathic Thought"
desc = "The subject becomes able to read the minds of others for certain information."
spelltype = /obj/effect/proc_holder/spell/wizard/targeted/empath
activation_messages = list("You suddenly notice more about others than you did before.")
deactivation_messages = list("You no longer feel able to sense intentions.")
instability=1
mutation=EMPATH
New()
..()
block = EMPATHBLOCK
/obj/effect/proc_holder/spell/wizard/targeted/empath
name = "Read Mind"
desc = "Read the minds of others for information."
charge_max = 180
clothes_req = 0
stat_allowed = 0
invocation_type = "none"
range = -2
selection_type = "range"
action_icon_state = "genetic_empath"
/obj/effect/proc_holder/spell/wizard/targeted/empath/choose_targets(mob/user = usr)
var/list/targets = new /list()
targets += input("Choose the target to spy on.", "Targeting") as mob in range(7,usr)
perform(targets)
/obj/effect/proc_holder/spell/wizard/targeted/empath/cast(list/targets)
if(!ishuman(usr)) return
for(var/mob/living/carbon/M in targets)
if(!iscarbon(M))
usr << "\red You may only use this on other organic beings."
return
if (PSY_RESIST in M.mutations)
usr << "\red You can't see into [M.name]'s mind at all!"
return
if (M.stat == 2)
usr << "\red [M.name] is dead and cannot have their mind read."
return
if (M.health < 0)
usr << "\red [M.name] is dying, and their thoughts are too scrambled to read."
return
usr << "\blue Mind Reading of [M.name]:</b>"
var/pain_condition = M.health
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
"their hair","what to do next","their job","space","amusing things","sad things",
"annoying things","happy things","something incoherent","something they did wrong")
var/thoughts = "thinking about [pick(randomthoughts)]"
if(M.fire_stacks)
pain_condition -= 50
thoughts = "preoccupied with the fire"
if (M.radiation)
pain_condition -= 25
switch(pain_condition)
if (81 to INFINITY)
usr << "\blue <b>Condition</b>: [M.name] feels good."
if (61 to 80)
usr << "\blue <b>Condition</b>: [M.name] is suffering mild pain."
if (41 to 60)
usr << "\blue <b>Condition</b>: [M.name] is suffering significant pain."
if (21 to 40)
usr << "\blue <b>Condition</b>: [M.name] is suffering severe pain."
else
usr << "\blue <b>Condition</b>: [M.name] is suffering excruciating pain."
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if ("help")
usr << "\blue <b>Mood</b>: You sense benevolent thoughts from [M.name]."
if ("disarm")
usr << "\blue <b>Mood</b>: You sense cautious thoughts from [M.name]."
if ("grab")
usr << "\blue <b>Mood</b>: You sense hostile thoughts from [M.name]."
if ("harm")
usr << "\blue <b>Mood</b>: You sense cruel thoughts from [M.name]."
for(var/mob/living/L in view(7,M))
if (L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
usr << "\blue <b>Mood</b>: You sense strange thoughts from [M.name]."
if (istype(M,/mob/living/carbon/human))
var/numbers[0]
var/mob/living/carbon/human/H = M
if(H.mind && H.mind.initial_account)
numbers += H.mind.initial_account.account_number
numbers += H.mind.initial_account.remote_access_pin
if(numbers.len>0)
usr << "\blue <b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name]."
usr << "\blue <b>Thoughts</b>: [M.name] is currently [thoughts]."
if (EMPATH in M.mutations)
M << "\red You sense [usr.name] reading your mind."
else if (prob(5) || M.mind.assigned_role=="Chaplain")
M << "\red You sense someone intruding upon your thoughts..."
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/superfart
/datum/dna/gene/basic/superfart
name = "High-Pressure Intestines"
desc = "Vastly increases the gas capacity of the subject's digestive tract."
activation_messages = list("You feel bloated and gassy.")
deactivation_messages = list("You no longer feel gassy. What a relief!")
instability=1
mutation = SUPER_FART
New()
..()
block = SUPERFARTBLOCK