Files
vgstation13/code/game/dna/genes/goon_powers.dm
west3436 ff68825c5d Mob Ignition Fixes/Cleanup (#36968)
* mob ignition fix

* debug text
2024-08-29 19:47:02 -05:00

730 lines
25 KiB
Plaintext

#define EAT_MOB_DELAY 30 SECONDS
// 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 = M_SOBER
/datum/dna/gene/basic/sober/New()
block = SOBERBLOCK
/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.")
mutation = M_PSY_RESIST
/datum/dna/gene/basic/psychic_resist/New()
block = PSYRESISTBLOCK
/datum/dna/gene/basic/psychic_resist/activate(var/mob/M, var/connected, var/flags)
..()
INVOKE_EVENT(M, /event/camera_sight_changed, "mover" = M)
return 1
/*/datum/dna/gene/basic/psychic_resist/deactivate(var/mob/M, var/connected, var/flags)
if(!..())
return 0
INVOKE_EVENT(M, /event/camera_sight_changed, "mover" = M)
return 1*/ // Allows retracking, uncomment to enable
/////////////////////////
// Stealth Enhancers
/////////////////////////
/datum/dna/gene/basic/stealth
/datum/dna/gene/basic/stealth/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)
/datum/dna/gene/basic/stealth/deactivate(var/mob/M, var/connected, var/flags)
if(..(M,connected,flags))
M.alphas -= "chameleon_stealth"
M.handle_alpha()
//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.")
/datum/dna/gene/basic/stealth/chameleon/New()
block = CHAMELEONBLOCK
/datum/dna/gene/basic/stealth/chameleon/activate(var/mob/M, var/connected, var/flags)
..()
M.register_event(/event/moved, src, nameof(src::mob_moved()))
return 1
/datum/dna/gene/basic/stealth/chameleon/deactivate(var/mob/M, var/connected, var/flags)
if(!..())
return 0
M.alphas["chameleon_stealth"] = 255
M.unregister_event(/event/moved, src, nameof(src::mob_moved()))
return 1
/datum/dna/gene/basic/stealth/chameleon/proc/mob_moved(var/mob/mover)
mover.alphas["chameleon_stealth"] = round(255 * 0.80)
/datum/dna/gene/basic/stealth/chameleon/OnMobLife(var/mob/M)
if((world.time - M.last_movement) >= 30 && !M.isUnconscious() && M.canmove && !M.restrained())
M.alphas["chameleon_stealth"] = max(M.alphas["chameleon_stealth"] - 25, 0)
else
mob_moved(M)
/////////////////////////////////////////////////////////////////////////////////////////
/datum/dna/gene/basic/grant_spell
var/spell/spelltype
var/list/granted_spells
/datum/dna/gene/basic/grant_spell/activate(var/mob/M, var/connected, var/flags)
..()
var/spell/granted = new spelltype
M.add_spell(granted, "genetic_spell_ready", /obj/abstract/screen/movable/spell_master/genetic)
if(!granted_spells)
granted_spells = list()
granted_spells += granted
//testing("[M] added [granted.name] from [name]")
return 1
/datum/dna/gene/basic/grant_spell/deactivate(var/mob/M, var/connected, var/flags)
if(!..())
return 0
for(var/spell/S in M.spell_list)
if(S in granted_spells)
M.remove_spell(S)
granted_spells -= S
//testing("[M] removed [S.name] from [name]")
qdel(S)
return 1
/datum/dna/gene/basic/grant_verb
var/verbtype
/datum/dna/gene/basic/grant_verb/activate(var/mob/M, var/connected, var/flags)
..()
M.verbs += verbtype
//testing("[M] added [verbtype] from [name]")
return 1
/datum/dna/gene/basic/grant_verb/deactivate(var/mob/M, var/connected, var/flags)
if(!..())
return 0
M.verbs -= verbtype
//testing("[M] removed [verbtype] from [name]")
return 1
// 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.")
drug_activation_messages=list("Your skin is icy to the touch.")
drug_deactivation_messages=list("Your skin stops feeling icy.")
spelltype = /spell/targeted/cryokinesis
/datum/dna/gene/basic/grant_spell/cryo/New()
..()
block = CRYOBLOCK
/spell/targeted/cryokinesis
name = "Cryokinesis"
user_type = USER_TYPE_GENETIC
desc = "Drops the body temperature of another person."
panel = "Mutant Powers"
charge_type = Sp_RECHARGE
charge_max = 600
spell_flags = WAIT_FOR_CLICK
invocation_type = SpI_NONE
range = 7
max_targets = 1
selection_type = "range"
override_base = "genetic"
hud_state = "gen_ice"
valid_targets = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
/spell/targeted/cryokinesis/cast(list/targets)
..()
for(var/mob/living/carbon/target in targets)
if (M_RESIST_COLD in target.mutations)
target.visible_message("<span class='warning'>A cloud of fine ice crystals engulfs [target.name], but disappears almost instantly!</span>")
return
var/handle_suit = 0
if(ishuman(target))
var/mob/living/carbon/human/H = target
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("<span class='warning'>A cloud of fine ice crystals engulfs [H]!</span>",
"<span class='notice'>A cloud of fine ice crystals cover your [H.head]'s visor.</span>")
else
H.visible_message("<span class='warning'>A cloud of fine ice crystals engulfs [H]!</span>",
"<span class='warning'>A cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!</span>")
H.bodytemperature = max(T0C + 31, H.bodytemperature - 3)
H.adjustFireLoss(5)
if(!handle_suit)
target.bodytemperature = max(T0C + 29, target.bodytemperature - 5)
target.adjustFireLoss(10)
target.extinguish()
target.visible_message("<span class='warning'>A cloud of fine ice crystals engulfs [target]!</span>")
anim(target = target, a_icon = 'icons/effects/genetics.dmi', flick_anim = "cryokinesis")
///////////////////////////////////////////////////////////////////////////////////////////
// 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.")
drug_activation_messages = list("You are getting the munchies.")
drug_deactivation_messages = list("You no longer getting the munchies.")
spelltype = /spell/targeted/eat
/datum/dna/gene/basic/grant_spell/mattereater/New()
..()
block = EATBLOCK
/spell/targeted/eat
name = "Eat"
desc = "Eat just about anything!"
user_type = USER_TYPE_GENETIC
panel = "Mutant Powers"
charge_type = Sp_RECHARGE
charge_max = 300
invocation_type = SpI_NONE
range = 1
max_targets = 1
selection_type = "view"
spell_flags = WAIT_FOR_CLICK | CAN_CHANNEL_RESTRAINED
override_base = "genetic"
hud_state = "gen_eat"
cast_sound = 'sound/items/eatfood.ogg'
valid_targets = list(
/obj/item,
/mob/living/simple_animal/parrot,
/mob/living/simple_animal/cat,
/mob/living/simple_animal/corgi,
/mob/living/simple_animal/crab,
/mob/living/simple_animal/mouse,
/mob/living/carbon/monkey,
/mob/living/carbon/human,
/mob/living/carbon/slime,
/mob/living/carbon/alien/larva,
/mob/living/simple_animal/slime,
/mob/living/simple_animal/hostile/retaliate/tomato,
/mob/living/simple_animal/chick,
/mob/living/simple_animal/chicken,
/mob/living/simple_animal/hostile/lizard,
/mob/living/simple_animal/cow,
/mob/living/simple_animal/spiderbot
)
/spell/targeted/eat/proc/doHeal(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H=user
for(var/datum/organ/external/affecting in H.organs)
affecting.heal_damage(4, 0)
H.UpdateDamageIcon()
H.updatehealth()
/spell/targeted/eat/is_valid_target(atom/target, mob/user, options, bypass_range = 0)
if(!(spell_flags & INCLUDEUSER) && target == usr)
return 0
if(get_dist(usr, target) > range)
return 0
return is_type_in_list(target, valid_targets)
/spell/targeted/eat/choose_targets(mob/user = usr)
var/list/targets = list()
if(max_targets == 0) //unlimited
for(var/atom/movable/target in view_or_range(range, user, selection_type))
if(!is_type_in_list(target, valid_targets) && !istype(target, /obj/item))
continue
if(istype(target, /obj/item/weapon/implant))
var/obj/item/weapon/implant/implant = target
if(implant.imp_in) //Implanted implant, don't eat that
continue
targets += target
else if(max_targets == 1) //single target can be picked
if(range <= 0 && spell_flags & INCLUDEUSER)
targets += user
else
var/list/possible_targets = list()
for(var/atom/movable/M in view_or_range(range, user, selection_type))
if(!(spell_flags & INCLUDEUSER) && M == user)
continue
if(!is_type_in_list(M, valid_targets) && !istype(M, /obj/item))
continue
if(istype(M, /obj/item/weapon/implant))
var/obj/item/weapon/implant/implant = M
if(implant.imp_in) //Implanted implant, don't eat that
continue
possible_targets += M
if(possible_targets.len)
if(spell_flags & SELECTABLE) //if we are allowed to choose. see setup.dm for details
var/atom/movable/M = input("Choose something to eat.", "Targeting") as null|anything in possible_targets
if(M)
targets += M
else
targets += pick(possible_targets)
//Adds a safety check post-input to make sure those targets are actually in range.
else
var/list/possible_targets = list()
for(var/atom/movable/target in view_or_range(range, user, selection_type))
if(istype(target, /obj/item/weapon/implant))
var/obj/item/weapon/implant/implant = target
if(implant.imp_in) //Implanted implant, don't eat that
continue
possible_targets += target
if(spell_flags & SELECTABLE)
for(var/i = 1; i<=max_targets, i++)
var/atom/movable/M = input("Choose something to eat.", "Targeting") as null|anything in possible_targets
if(!M)
break
if(M in view_or_range(range, user, selection_type))
targets += M
possible_targets -= M
else
for(var/i=1,i<=max_targets,i++)
if(!possible_targets.len)
break
if(target_ignore_prev)
var/target = pick(possible_targets)
possible_targets -= target
targets += target
else
targets += pick(possible_targets)
if(!(spell_flags & INCLUDEUSER) && (user in targets))
targets -= user
if(valid_targets && valid_targets.len)
for(var/mob/living/target in targets) //filters out all the non-compatible mobs
var/found = 0
for(var/mob_type in valid_targets)
if(istype(target, mob_type))
found = 1
if(!found)
targets -= target
for(var/obj/item/I in targets)
if(!istype(I) || !holder.Adjacent(I))
targets -= I
return targets
/spell/targeted/eat/cast(list/targets, mob/user)
if(!targets || !targets.len)
return 0
var/atom/movable/the_item = targets[1]
if(!the_item || !the_item.Adjacent(user))
return
// if(istype(the_item, /obj/item/organ/external/head))
// to_chat(user, "<span class='warning'>You try to put the [the_item] in your mouth, but the ears tickle your throat!</span>")
// return 0
// else if(isbrain(the_item))
// to_chat(user, "<span class='warning'>You try to put [the_item] in your mouth, but the texture makes you gag!</span>")
// return 0
else if(ishuman(the_item))
//My gender
var/m_his = "its"
if(user.gender == MALE)
m_his = "his"
if(user.gender == FEMALE)
m_his = "her"
var/mob/living/carbon/human/H = the_item
var/datum/organ/external/limb = H.get_organ(usr.zone_sel.selecting)
if(!istype(limb))
to_chat(user, "<span class='warning'>You can't eat this part of them!</span>")
return 0
if(istype(limb, /datum/organ/external/head))
//Bullshit, but prevents being unable to clone someone.
to_chat(user, "<span class='warning'>You try to put [the_item]'s [limb.display_name] in your mouth, but \his ears tickle your throat!</span>")
return 0
if(istype(limb, /datum/organ/external/chest))
//Bullshit, but you cannot break it anyways
to_chat(user, "<span class='warning'>You try to put [the_item]'s [limb.display_name] in your mouth, but it's too big to fit!</span>")
return 0
if(istype(limb, /datum/organ/external/groin))
//Bullshit, but you cannot break it anyways
to_chat(user, "<span class='warning'>You try to put [the_item]'s [limb.display_name] in your mouth, but it feels far too inappropriate!</span>")
return 0
user.visible_message("<span class='danger'>[user] begins stuffing [the_item]'s [limb.display_name] into [m_his] gaping maw!</span>")
if(!do_mob(user, the_item,EAT_MOB_DELAY))
to_chat(user, "<span class='warning'>You were interrupted before you could eat [the_item]'s [limb.display_name]!</span>")
else
user.visible_message("<span class='danger'>[user] eats [the_item]'s [limb.display_name].</span>", \
"<span class='danger'>You eat [the_item]'s [limb.display_name].</span>")
playsound(user, 'sound/items/eatfood.ogg', 50, 0)
message_admins("[user] ate [the_item]'s [limb]: (<A href='?_src_=holder;jumpto=\ref[user]'><b>Jump to</b></A>)")
log_game("[user] ate \the [the_item]'s [limb] at [user.x], [user.y], [user.z]")
limb.droplimb("override" = 1, "spawn_limb" = 0)
doHeal(user)
else
user.visible_message("<span class='warning'>[usr] eats \the [the_item].")
playsound(user, 'sound/items/eatfood.ogg', 50, 0)
message_admins("[user] ate \the [the_item]: (<A href='?_src_=holder;jumpto=\ref[user]'><b>Jump to</b></A>)")
log_game("[user] ate \the [the_item] at [user.x], [user.y], [user.z]")
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.</span>"
activation_messages = list("Your leg muscles feel taut and strong.")
deactivation_messages = list("Your leg muscles shrink back to normal.")
drug_activation_messages = list()
drug_deactivation_messages = list()
spelltype = /spell/targeted/leap
/datum/dna/gene/basic/grant_spell/jumpy/New()
..()
block = JUMPBLOCK
/spell/targeted/leap
name = "Jump"
desc = "Leap great distances!"
panel = "Mutant Powers"
user_type = USER_TYPE_GENETIC
range = SELFCAST
charge_type = Sp_RECHARGE
charge_max = 60
spell_flags = INCLUDEUSER
invocation_type = SpI_NONE
duration = 10 //used for jump distance here
cast_sound = 'sound/weapons/thudswoosh.ogg'
hud_state = "gen_leap"
override_base = "genetic"
/spell/targeted/leap/cast(list/targets)
set waitfor = FALSE
for(var/mob/living/target in targets)
if (istype(target.loc,/mob/) || target.lying || target.stunned || target.locked_to)
to_chat(target, "<span class='warning'>You can't jump right now!</span>")
continue
var/failed_leap = 0
if (istype(target.loc,/turf/))
if(istype(target.loc, /turf/space))
var/spaced = 1
for(var/turf/T in oview(1,target))
if(T.has_gravity(target))
spaced = 0
break
for(var/obj/O in T.contents)
if((O) && (O.density) && (O.anchored))
spaced = 0
break
if(spaced)
to_chat(target, "<span class='warning'>There is nothing to leap off of!</span>")
return
if(target.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(target, 1))
if(M.pulling == target)
if(!M.restrained() && !usr.isUnconscious() && M.canmove && usr.Adjacent(M))
failed_leap = 1
else
M.stop_pulling()
if(target.pinned.len)
failed_leap = 1
target.visible_message("<span class='warning'><b>[target.name]</b> takes a huge leap!</span>")
playsound(target.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failed_leap)
target.Knockdown(5)
target.Stun(5)
target.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>")
continue
var/prevLayer = target.layer
target.plane = EFFECTS_PLANE
target.flying = 1
for(var/i=0, i<duration, i++)
step(target, target.dir)
if(i < 5)
target.pixel_y += 8 * PIXEL_MULTIPLIER
else
target.pixel_y -= 8 * PIXEL_MULTIPLIER
sleep(1)
target.pixel_y = 0
target.stop_flying()
if (M_FAT in target.mutations && prob(66))
target.visible_message("<span class='warning'><b>[target.name]</b> crashes due to their heavy weight!</span>")
//playsound(usr.loc, 'zhit.wav', 50, 1)
target.AdjustKnockdown(10)
target.AdjustStunned(5)
target.layer = prevLayer
if (istype(target.loc,/obj/))
var/obj/container = target.loc
to_chat(target, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
target.AdjustParalysis(3)
target.AdjustKnockdown(5)
container.visible_message("<span class='warning'><b>[container]</b> emits a loud thump and rattles a bit.</span>")
playsound(target.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
container.pixel_x = rand(-3,3) * PIXEL_MULTIPLIER
container.pixel_y = rand(-3,3) * PIXEL_MULTIPLIER
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 = /spell/targeted/polymorph
activation_messages = list("You don't feel entirely like yourself somehow.")
deactivation_messages = list("You feel secure in your identity.")
drug_activation_messages = list()
drug_deactivation_messages = list()
/datum/dna/gene/basic/grant_spell/polymorph/New()
..()
block = POLYMORPHBLOCK
/spell/targeted/polymorph
name = "Polymorph"
desc = "Mimic the appearance of others!"
panel = "Mutant Powers"
user_type = USER_TYPE_GENETIC
charge_max = 1800
spell_flags = 0
invocation_type = SpI_NONE
range = 1
max_targets = 1
selection_type = "range"
valid_targets = list(/mob/living/carbon/human)
hud_state = "wiz_hulk"
override_base = "genetic"
/spell/targeted/polymorph/cast(list/targets, mob/living/carbon/human/user)
..()
if(!istype(user))
return
for(var/mob/living/carbon/human/target in targets)
user.visible_message("<span class='sinister'>[user.name]'s body shifts and contorts.</span>")
spawn(10)
if(target && user)
//playsound(usr.loc, 'gib.ogg', 50, 1)
user.UpdateAppearance(target.dna.UI)
user.real_name = target.real_name
user.name = target.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 = /spell/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.")
drug_activation_messages=list("You feel more social!")
drug_deactivation_messages=list("You feel less social.")
/datum/dna/gene/basic/grant_spell/empath/New()
..()
block = EMPATHBLOCK
/spell/targeted/empath
name = "Read Mind"
desc = "Read the minds of others for information."
panel = "Mutant Powers"
user_type = USER_TYPE_GENETIC
range = 7
max_targets = 1
spell_flags = SELECTABLE
invocation_type = SpI_NONE
charge_type = Sp_RECHARGE
charge_max = 100
valid_targets = list(/mob/living/carbon)
hud_state = "gen_rmind"
override_base = "genetic"
mind_affecting = 1
/spell/targeted/empath/cast(var/list/targets, mob/user)
if(!targets || !targets.len)
return
var/mob/living/carbon/M = targets[1] //only one mob in the list, so we want that one
if(!M || !M.loc) //Either chose to not read a mind or the mob was caught by qdel
return 1
if(!istype(M))
to_chat(user, "<span class='warning'>This can only be used on carbon beings.</span>")
return 1
if (M_PSY_RESIST in M.mutations)
to_chat(user, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
return 1
if (M.isDead())
to_chat(user, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
return 1
if (M.health < 0)
to_chat(user, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
return 1
to_chat(user, "<span class='notice'><b>Mind Reading of [M.name]:</b></span>")
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",
"getting those valids","burning catpeople","something spooky","something lewd","odd things",
"dumb things","lighting things on fire","lighting themselves on fire","blowing things up",
"blowing themeselves up","shooting everyone","shooting themselves")
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)
to_chat(user, "<span class='notice'> <b>Condition</b>: [M.name] feels good.</span>")
if (61 to 80)
to_chat(user, "<span class='notice'> <b>Condition</b>: [M.name] is suffering mild pain.</span>")
if (41 to 60)
to_chat(user, "<span class='notice'> <b>Condition</b>: [M.name] is suffering significant pain.</span>")
if (21 to 40)
to_chat(user, "<span class='notice'> <b>Condition</b>: [M.name] is suffering severe pain.</span>")
else
to_chat(user, "<span class='notice'> <b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if (I_HELP)
to_chat(user, "<span class='notice'> <b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
if (I_DISARM)
to_chat(user, "<span class='notice'> <b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
if (I_GRAB)
to_chat(user, "<span class='notice'> <b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
if (I_HURT)
to_chat(user, "<span class='notice'> <b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
for(var/mob/living/L in view(7,M))
if (L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
to_chat(user, "<span class='notice'> <b>Mood</b>: You sense strange thoughts from [M.name].</span>")
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)
to_chat(user, "<span class='notice'> <b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
to_chat(user, "<span class='notice'> <b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
if (/spell/targeted/empath in M.spell_list)
to_chat(M, "<span class='warning'>You sense [usr.name] reading your mind.</span>")
else if (prob(5) || (M.mind && M.mind.assigned_role=="Chaplain"))
to_chat(M, "<span class='warning'>You sense someone intruding upon your thoughts...</span>")
////////////////////////////////////////////////////////////////////////
// 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!")
drug_activation_messages = list()
drug_deactivation_messages = list()
mutation = M_SUPER_FART
/datum/dna/gene/basic/superfart/New()
..()
block = SUPERFARTBLOCK
// WAS: /datum/bioEffect/strong
/datum/dna/gene/basic/strong
// pretty sure this doesn't do jack shit, putting it here until it does
name = "Strong"
desc = "Enhances the subject's ability to build and retain heavy muscles."
activation_messages = list("You feel buff!")
deactivation_messages = list("You feel wimpy and weak.")
mutation = M_STRONG
/datum/dna/gene/basic/strong/New()
..()
block = STRONGBLOCK