Telepathy Refactor and Changes (#32604)

* Telepathy refactor

* fixes compiler errors

* add fungal features

* oof

* should work

* done

* Update powers.dm

* Update powers.dm

* Update powers.dm

* tele

* Update powers.dm
This commit is contained in:
adacovsk
2022-05-17 13:16:56 -04:00
committed by GitHub
parent b63bc16662
commit 3b56d1884e
13 changed files with 238 additions and 263 deletions

View File

@@ -460,7 +460,7 @@ var/global/list/BODY_COVER_VALUE_LIST=list("[HEAD]" = COVER_PROTECTION_HEAD,"[EY
#define M_REMOTE_VIEW 101 // remote viewing
#define M_REGEN 102 // health regen
#define M_RUN 103 // no slowdown
#define M_REMOTE_TALK 104 // remote talking
#define M_TELEPATHY 104 // remote talking
#define M_MORPH 105 // changing appearance
#define M_RESIST_HEAT 106 // heat resistance
#define M_HALLUCINATE 107 // hallucinations

View File

@@ -484,11 +484,11 @@
/datum/outfit/geneticist/pre_equip_priority(var/mob/living/carbon/human/H, var/species)
var/obj/item/weapon/reagent_containers/food/drinks/soda_cans/randomcan = pick(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lifeline_white, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lifeline_red, /obj/item/weapon/reagent_containers/food/drinks/soda_cans/lifeline_cryo)
var/obj/item/weapon/dnainjector/nofail/randominjector = pick(/obj/item/weapon/dnainjector/nofail/remotesay, /obj/item/weapon/dnainjector/nofail/runfast, /obj/item/weapon/dnainjector/nofail/strong)
var/obj/item/weapon/dnainjector/nofail/randominjector = pick(/obj/item/weapon/dnainjector/nofail/telepathy, /obj/item/weapon/dnainjector/nofail/runfast, /obj/item/weapon/dnainjector/nofail/strong)
items_to_collect[randomcan] = GRASP_RIGHT_HAND
items_to_collect[randominjector] = SURVIVAL_BOX
items_to_collect[/obj/item/weapon/storage/belt/medical] = GRASP_LEFT_HAND
items_to_collect[/obj/item/weapon/dnainjector/nofail/remotesay] = SURVIVAL_BOX
items_to_collect[/obj/item/weapon/dnainjector/nofail/telepathy] = SURVIVAL_BOX
items_to_collect[/obj/item/weapon/storage/pill_bottle/lollipops] = SURVIVAL_BOX
return ..()

View File

@@ -386,10 +386,10 @@
/datum/centcomm_order/department/medical/telepathy/ExtraChecks(var/obj/item/weapon/dnainjector/I)
if (!istype(I))
return 0
if (I.block == REMOTETALKBLOCK && I.buf)//Block Injector
if (I.block == TELEPATHYBLOCK && I.buf)//Block Injector
var/datum/dna2/record/R = I.buf
if (R.types & 4)//SE Injector
var/bstate = R.dna.GetSEState(REMOTETALKBLOCK)
var/bstate = R.dna.GetSEState(TELEPATHYBLOCK)
return bstate
return 0
@@ -399,7 +399,7 @@
I.buf.dna=new
I.buf.types = DNA2_BUF_SE
I.buf.dna.ResetSE()
I.SetValue(0xFFF,REMOTETALKBLOCK)
I.SetValue(0xFFF,TELEPATHYBLOCK)
/datum/centcomm_order/department/medical/remoteview/New()
..()

View File

@@ -104,7 +104,7 @@
/datum/dna/gene/basic/increaserun/New()
block = INCREASERUNBLOCK
/datum/dna/gene/basic/grant_spell/remotetalk
/datum/dna/gene/basic/grant_spell/telepathy
name = "Telepathy"
activation_messages = list("You feel your voice can penetrate other minds.")
deactivation_messages = list("Your mind can no longer project your voice onto others.")
@@ -112,46 +112,47 @@
drug_activation_messages = list("You feel your voice can reach the astral plane now.")
drug_deactivation_messages = list("Your voice can no longer reach the astral plane.")
mutation = M_REMOTE_TALK
mutation = M_TELEPATHY
spelltype = /spell/targeted/remotesay
spelltype = /spell/targeted/telepathy
/datum/dna/gene/basic/grant_spell/remotetalk/New()
/datum/dna/gene/basic/grant_spell/telepathy/New()
..()
block = REMOTETALKBLOCK
block = TELEPATHYBLOCK
/spell/targeted/remotesay
name = "Project Mind"
/spell/targeted/telepathy
name = "Telepathy"
desc = "Speak into the minds of others. You must either hear them speak or examine them to make contact."
panel = "Mutant Powers"
charge_type = Sp_RECHARGE
charge_max = 50
charge_max = 0
invocation_type = SpI_NONE
range = GLOBALCAST //the world
max_targets = 1
selection_type = "view"
spell_flags = SELECTABLE|TALKED_BEFORE
spell_flags = SELECTABLE|TALKED_BEFORE|INCLUDEUSER
override_base = "genetic"
hud_state = "gen_project"
compatible_mobs = list(/mob/living/carbon/human, /datum/mind)
mind_affecting = 1
/spell/targeted/remotesay/cast(var/list/targets, mob/living/carbon/human/user)
/spell/targeted/telepathy/cast_check(var/skipcharge = 0, var/mob/user = usr)
. = ..()
if (!.)
return FALSE
if(!user || !istype(user))
return
if(user.mind.miming)
to_chat(user, "<span class = 'warning'>You find yourself unable to convey your thoughts outside of gestures.</span>")
return
var/say = stripped_input(user, "What do you wish to say?", "Project Mind")
if(!say)
return 1
/spell/targeted/telepathy/cast(var/list/targets, mob/living/carbon/human/user)
var/datum/species/mushroom/M = user.species
var/message
if(!istype(M))
message = stripped_input(user, "What do you wish to say?", "Telepathy")
if(!message)
return 1
else
M.telepathic_target.len = 0
for(var/T in targets)
var/mob/living/target
@@ -160,18 +161,22 @@
if (istype (T, /datum/mind))
target = user.can_mind_interact(T)
if(!T || !istype(target) || tinfoil_check(target) || !user.can_mind_interact(target))
user.show_message("<span class='notice'>You project your mind towards [believed_name]: [say]</span>")
return
if(M_REMOTE_TALK in target.mutations)
target.show_message("<span class='notice'>You hear [user.real_name]'s voice: </span><span class='bold'>[say]</span>")
else
target.show_message("<span class='notice'>You hear a voice that seems to echo around the room: </span><span class='bold'>[say]</span>")
user.show_message("<span class='notice'>You project your mind towards [believed_name]: [say]</span>")
log_admin("[key_name(user)] projects his mind towards (believed:[believed_name]/actual:[key_name(target)]: [say]</span>")
message_admins("[key_name(user)] projects his mind towards (believed:[believed_name]/actual:[key_name(target)]: [say]</span>")
user.show_message("<span class='notice'>You are unable to use telepathy with [target].</span>")
continue
else if(istype(M))
M.telepathic_target += target
continue
for(var/mob/dead/observer/G in dead_mob_list)
G.show_message("<i>Telepathic message from <b>[user]</b> to <b>[target]</b>: [say]</i>")
G.show_message("<i>Telepathy, <b>[user]</b> to <b>[T]</b>: [message]</i>")
log_admin("[key_name(user)] projects his mind towards (believed:[T]/actual:[key_name(T)]: [message]")
if(T == user) //Talking to ourselves
to_chat(user,"<span class='notice'>Projected to self: [message]</span>")
return
if(M_TELEPATHY in target.mutations)
to_chat(T, "<span class='notice'>You hear [user.real_name]'s voice: [message]</span>")
else
to_chat(T,"<span class='notice'>You hear a voice inside your head: [message] </span>")
to_chat(user,"<span class='notice'>Projected to <b>[T]</b>: [message]</span>")
/datum/dna/gene/basic/morph
name = "Morph"

View File

@@ -21,7 +21,7 @@ var/NOBREATHBLOCK = 0
var/REMOTEVIEWBLOCK = 0
var/REGENERATEBLOCK = 0
var/INCREASERUNBLOCK = 0
var/REMOTETALKBLOCK = 0
var/TELEPATHYBLOCK = 0
var/MORPHBLOCK = 0
var/COLDBLOCK = 0
var/HALLUCINATIONBLOCK = 0
@@ -129,7 +129,7 @@ var/LACTOSEBLOCK = 0
REMOTEVIEWBLOCK = getAssignedBlock("REMOTEVIEW", numsToAssign, DNA_HARDER_BOUNDS, good=1)
REGENERATEBLOCK = getAssignedBlock("REGENERATE", numsToAssign, DNA_HARDER_BOUNDS, good=1)
INCREASERUNBLOCK = getAssignedBlock("INCREASERUN", numsToAssign, DNA_HARDER_BOUNDS, good=1)
REMOTETALKBLOCK = getAssignedBlock("REMOTETALK", numsToAssign, DNA_HARDER_BOUNDS, good=1)
TELEPATHYBLOCK = getAssignedBlock("TELEPATHY", numsToAssign, DNA_HARDER_BOUNDS, good=1)
MORPHBLOCK = getAssignedBlock("MORPH", numsToAssign, DNA_HARDER_BOUNDS, good=1)
COLDBLOCK = getAssignedBlock("COLD", numsToAssign, DNA_HARDER_BOUNDS, good=1)
HALLUCINATIONBLOCK = getAssignedBlock("HALLUCINATION", numsToAssign)

View File

@@ -1335,24 +1335,24 @@
block = FARSIGHTBLOCK
..()
/obj/item/weapon/dnainjector/nofail/remotesay
name = "DNA-Injector (Remote Say)"
/obj/item/weapon/dnainjector/nofail/telepathy
name = "DNA-Injector (Telepathy)"
desc = "Share it with the world."
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/weapon/dnainjector/nofail/remotesay/initialize()
block = REMOTETALKBLOCK
/obj/item/weapon/dnainjector/nofail/telepathy/initialize()
block = TELEPATHYBLOCK
..()
/obj/item/weapon/dnainjector/nofail/antiremotesay
name = "DNA-Injector (Remote Say)"
/obj/item/weapon/dnainjector/nofail/antitelepathy
name = "DNA-Injector (Telepathy)"
desc = "Keep it to yourself."
datatype = DNA2_BUF_SE
value = 0x001
/obj/item/weapon/dnainjector/nofail/antiremotesay/initialize()
block = REMOTETALKBLOCK
/obj/item/weapon/dnainjector/nofail/telepathy/initialize()
block = TELEPATHYBLOCK
..()
/obj/item/weapon/dnainjector/nofail/randompower/New(newloc)
@@ -1383,6 +1383,6 @@
/obj/item/weapon/dnainjector/nofail/immolate,
/obj/item/weapon/dnainjector/nofail/melt,
/obj/item/weapon/dnainjector/nofail/farsightmut,
/obj/item/weapon/dnainjector/nofail/remotesay)
/obj/item/weapon/dnainjector/nofail/telepathy)
new type(loc)
qdel(src)

View File

@@ -1,159 +0,0 @@
//For spells designed to be inherent abilities given to mobs via their species datum
/spell/swallow_light //Umbra
name = "Swallow Light"
abbreviation = "SL"
desc = "Create a void of darkness around yourself."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "racial_dark"
spell_flags = INCLUDEUSER
charge_type = Sp_GRADUAL
charge_max = 600
minimum_charge = 100
range = SELFCAST
cast_sound = 'sound/misc/grue_growl.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/swallow_light/cast(list/targets, mob/user)
user.set_light(8,-20)
playsound(user, cast_sound, 50, 1)
playsound(user, 'sound/misc/grue_ambience.ogg', 50, channel = CHANNEL_UMBRA)
/spell/swallow_light/stop_casting(list/targets, mob/user)
user.set_light(0)
playsound(user, null, 50, channel = CHANNEL_UMBRA)
/spell/swallow_light/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/swallow_light/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/shatter_lights //Umbra
name = "Shatter Lights"
abbreviation = "ST"
desc = "Shatter all nearby lights with a shriek."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "blackout"
charge_max = 1200
spell_flags = null
range = SELFCAST
cast_sound = 'sound/misc/grue_screech.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/shatter_lights/cast(list/targets, mob/user)
playsound(user, cast_sound, 100)
for(var/obj/machinery/light/L in range(7))
L.broken()
/spell/shatter_lights/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/shatter_lights/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/regen_limbs //Slime people
name = "Regenerate Limbs"
abbreviation = "RL"
desc = "Sprout new limbs to replace lost ones."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "racial_regen_limbs"
spell_flags = INCLUDEUSER
charge_type = Sp_RECHARGE
charge_max = 100
range = SELFCAST
cast_sound = 'sound/effects/squelch1.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/regen_limbs/cast(list/targets, mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/list/priority_organs = list()
if(H.get_organ(LIMB_GROIN))
priority_organs.Add(H.get_organ(LIMB_GROIN))
if(H.get_organ(LIMB_RIGHT_LEG))
priority_organs.Add(H.get_organ(LIMB_RIGHT_LEG))
if(H.get_organ(LIMB_LEFT_LEG))
priority_organs.Add(H.get_organ(LIMB_LEFT_LEG))
if(H.get_organ(LIMB_RIGHT_FOOT))
priority_organs.Add(H.get_organ(LIMB_RIGHT_FOOT))
if(H.get_organ(LIMB_LEFT_FOOT))
priority_organs.Add(H.get_organ(LIMB_LEFT_FOOT))
for(var/organ_name in H.organs_by_name)
if(!(H.organs_by_name[organ_name] in priority_organs))
priority_organs.Add(H.organs_by_name[organ_name])
var/has_regenerated = FALSE
for(var/datum/organ/external/O in priority_organs)
if(O.status & ORGAN_DESTROYED)
if(O.name == LIMB_LEFT_FOOT || O.name == LIMB_RIGHT_FOOT || O.name == LIMB_LEFT_HAND || O.name == LIMB_RIGHT_HAND)
if(!(O.parent.status & ORGAN_DESTROYED))
if(H.nutrition >= 50)
H.nutrition -= 50
O.rejuvenate_limb()
has_regenerated = TRUE
user.visible_message("<span class='warning'>\The [user] sprouts a new [O.display_name]!</span>",\
"<span class='notice'>You sprout a new [O.display_name]!</span>")
else if(H.nutrition >= 100)
H.nutrition -= 100
O.rejuvenate_limb()
has_regenerated = TRUE
user.visible_message("<span class='warning'>\The [user] sprouts a new [O.display_name]!</span>",\
"<span class='notice'>You sprout a new [O.display_name]!</span>")
H.resting = 0
H.regenerate_icons()
H.update_canmove()
if(!has_regenerated)
to_chat(user, "<span class='warning'>You don't have enough energy to regenerate!</span>")
/spell/regen_limbs/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/regen_limbs/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/targeted/transfer_reagents
name = "Fertilize"
desc = "Taps into your internal nutrient storage to fertilize a plant."
abbreviation = "TR"
spell_flags = WAIT_FOR_CLICK
range = 1
max_targets = 1
override_base = "racial"
hud_state = "transfer_reagents"
charge_max = 20
invocation_type = SpI_NONE
/spell/targeted/transfer_reagents/is_valid_target(target, mob/user, options)
if(!istype(target, /obj/machinery/portable_atmospherics/hydroponics))
to_chat(holder, "<span class='warning'>That's neither soil nor an hydroponic tray!</span>")
return FALSE
return TRUE
/spell/targeted/transfer_reagents/cast(var/list/targets, mob/user)
..()
if(!holder.reagents)
to_chat(holder, "<span class='warning'>Uhh that's not gonna work. You don't seem to have reagents!</span>")
CRASH("[holder] tried to cast [name] but has no reagents!")
if(holder.reagents.total_volume <= 5)
to_chat(holder, "<span class='warning'>You don't have enough reagents in your system!</span>")
return 1
for(var/obj/machinery/portable_atmospherics/hydroponics/target in targets)
to_chat(holder, "You secrete some nutritional sap from your fingertips and let it fall into \the [target].")
holder.reagents.trans_to(target, 5, log_transfer = TRUE, whodunnit = holder)

View File

@@ -615,9 +615,7 @@ var/global/list/whitelisted_species = list("Human")
flags = IS_WHITELISTED
anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS | ACID4WATER
// Both must be set or it's only a 45% chance of manifesting.
default_mutations=list(M_REMOTE_TALK)
default_block_names=list("REMOTETALK")
spells = list(/spell/targeted/telepathy)
//PLEASE IF YOU MAKE A NEW RACE, KEEP IN MIND PEOPLE WILL PROBABLY MAKE UNIFORM SPRITES.
uniform_icons = 'icons/mob/species/grey/uniform.dmi'
@@ -1293,7 +1291,7 @@ var/list/has_died_as_golem = list()
primitive = /mob/living/carbon/monkey/mushroom
spells = list(/spell/targeted/genetic/invert_eyes, /spell/targeted/genetic/fungaltelepathy)
spells = list(/spell/targeted/genetic/invert_eyes, /spell/targeted/telepathy)
default_mutations=list() //exoskeleton someday...
@@ -1334,7 +1332,7 @@ var/list/has_died_as_golem = list()
You have a resistance to burn and toxin, but you are vulnerable to brute attacks.<br>\
You are adept at seeing in the dark, moreso with your light inversion ability. When you speak, it will only go to the target chosen with your Fungal Telepathy.<br>\
You also have access to the Sporemind, which allows you to communicate with others on the Sporemind through :~"
var/mob/living/telepathic_target
var/mob/living/telepathic_target[] = list()
/datum/species/mushroom/makeName()
return capitalize(pick(mush_first)) + " " + capitalize(pick(mush_last))
@@ -1344,16 +1342,21 @@ var/list/has_died_as_golem = list()
H.default_gib()
/datum/species/mushroom/silent_speech(mob/M, message)
if(istype(telepathic_target) && M.can_mind_interact(telepathic_target))
if(!telepathic_target.len)
for(var/mob/dead/observer/G in dead_mob_list)
G.show_message("<i>Fungal Telepathy, <b>[M]</b> to <b>[telepathic_target]</b>: [message]</i>")
log_admin("[key_name(M)] mushroom projects his mind towards (believed:[telepathic_target]/actual:[key_name(telepathic_target)]: [message]</span>")
if(telepathic_target == M) //Talking to ourselves
to_chat(M,"<span class='mushroom'>Projected to self: [message]</span>")
return
to_chat(telepathic_target,"<span class='notice'>You feel <b>[M]</b>'s thoughts: </span><span class='mushroom'>[message]</span>")
to_chat(M,"<span class='mushroom'>Projected to <b>[telepathic_target]</b>: [message]</span>")
G.show_message("<i>[key_name(M)] projects its mind towards itself: [message]</i>")
log_admin("[key_name(M)] projects its mind towards itself: [message]</span>")
to_chat(M,"<span class='mushroom'>Projected to self: [message]</span>")
for(var/mob/living/T in telepathic_target)
if(istype(T) && M.can_mind_interact(T))
for(var/mob/dead/observer/G in dead_mob_list)
G.show_message("<i>Telepathy, <b>[M]</b> to <b>[T]</b>: [message]</i>")
log_admin("[key_name(M)] projects his mind towards (believed:[T]/actual:[key_name(T)]: [message]")
if(T == M) //Talking to ourselves
to_chat(M,"<span class='mushroom'>Projected to self: [message]</span>")
return
to_chat(T,"<span class='notice'>You feel <b>[M]</b>'s thoughts: </span><span class='mushroom'>[message]</span>")
to_chat(M,"<span class='mushroom'>Projected to <b>[T]</b>: [message]</span>")
/datum/species/lich
name = "Undead"

View File

@@ -1,4 +1,6 @@
//For spells designed to be inherent abilities given to mobs via their species datum
/spell/targeted/genetic/invert_eyes
name = "Invert eyesight"
desc = "Inverts the colour spectrum you see, letting you see clearly in the dark, but not in the light."
@@ -15,48 +17,166 @@
override_base = "genetic"
hud_state = "wiz_sleepold"
/spell/targeted/genetic/invert_eyes/cast(list/targets, mob/user)
for(var/mob/living/carbon/human/M in targets)
var/datum/organ/internal/eyes/mushroom/E = M.internal_organs_by_name["eyes"]
if(istype(E))
E.dark_mode = !E.dark_mode
/spell/targeted/genetic/fungaltelepathy
name = "Fungal telepathy"
desc = "Allows you to remotely speak to another being. You must either hear them speak or examine them to make contact."
panel = "Mutant Powers"
user_type = USER_TYPE_GENETIC
/spell/swallow_light //Umbra
name = "Swallow Light"
abbreviation = "SL"
desc = "Create a void of darkness around yourself."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "racial_dark"
spell_flags = INCLUDEUSER
charge_type = Sp_GRADUAL
charge_max = 600
minimum_charge = 100
range = SELFCAST
cast_sound = 'sound/misc/grue_growl.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/swallow_light/cast(list/targets, mob/user)
user.set_light(8,-20)
playsound(user, cast_sound, 50, 1)
playsound(user, 'sound/misc/grue_ambience.ogg', 50, channel = CHANNEL_UMBRA)
/spell/swallow_light/stop_casting(list/targets, mob/user)
user.set_light(0)
playsound(user, null, 50, channel = CHANNEL_UMBRA)
/spell/swallow_light/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/swallow_light/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/shatter_lights //Umbra
name = "Shatter Lights"
abbreviation = "ST"
desc = "Shatter all nearby lights with a shriek."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "blackout"
charge_max = 1200
spell_flags = null
range = SELFCAST
cast_sound = 'sound/misc/grue_screech.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/shatter_lights/cast(list/targets, mob/user)
playsound(user, cast_sound, 100)
for(var/obj/machinery/light/L in range(7))
L.broken()
/spell/shatter_lights/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/shatter_lights/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/regen_limbs //Slime people
name = "Regenerate Limbs"
abbreviation = "RL"
desc = "Sprout new limbs to replace lost ones."
panel = "Racial Abilities"
override_base = "racial"
hud_state = "racial_regen_limbs"
spell_flags = INCLUDEUSER
charge_type = Sp_RECHARGE
charge_max = 50
invocation_type = SpI_NONE
range = GLOBALCAST //the world
charge_max = 100
range = SELFCAST
cast_sound = 'sound/effects/squelch1.ogg'
still_recharging_msg = "<span class='notice'>You're still regaining your strength.</span>"
/spell/regen_limbs/cast(list/targets, mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/list/priority_organs = list()
if(H.get_organ(LIMB_GROIN))
priority_organs.Add(H.get_organ(LIMB_GROIN))
if(H.get_organ(LIMB_RIGHT_LEG))
priority_organs.Add(H.get_organ(LIMB_RIGHT_LEG))
if(H.get_organ(LIMB_LEFT_LEG))
priority_organs.Add(H.get_organ(LIMB_LEFT_LEG))
if(H.get_organ(LIMB_RIGHT_FOOT))
priority_organs.Add(H.get_organ(LIMB_RIGHT_FOOT))
if(H.get_organ(LIMB_LEFT_FOOT))
priority_organs.Add(H.get_organ(LIMB_LEFT_FOOT))
for(var/organ_name in H.organs_by_name)
if(!(H.organs_by_name[organ_name] in priority_organs))
priority_organs.Add(H.organs_by_name[organ_name])
var/has_regenerated = FALSE
for(var/datum/organ/external/O in priority_organs)
if(O.status & ORGAN_DESTROYED)
if(O.name == LIMB_LEFT_FOOT || O.name == LIMB_RIGHT_FOOT || O.name == LIMB_LEFT_HAND || O.name == LIMB_RIGHT_HAND)
if(!(O.parent.status & ORGAN_DESTROYED))
if(H.nutrition >= 50)
H.nutrition -= 50
O.rejuvenate_limb()
has_regenerated = TRUE
user.visible_message("<span class='warning'>\The [user] sprouts a new [O.display_name]!</span>",\
"<span class='notice'>You sprout a new [O.display_name]!</span>")
else if(H.nutrition >= 100)
H.nutrition -= 100
O.rejuvenate_limb()
has_regenerated = TRUE
user.visible_message("<span class='warning'>\The [user] sprouts a new [O.display_name]!</span>",\
"<span class='notice'>You sprout a new [O.display_name]!</span>")
H.resting = 0
H.regenerate_icons()
H.update_canmove()
if(!has_regenerated)
to_chat(user, "<span class='warning'>You don't have enough energy to regenerate!</span>")
/spell/regen_limbs/choose_targets(mob/user = usr)
var/list/targets = list()
targets += user
return targets
/spell/regen_limbs/is_valid_target(var/target, mob/user, options)
return(target == user)
/spell/targeted/transfer_reagents
name = "Fertilize"
desc = "Taps into your internal nutrient storage to fertilize a plant."
abbreviation = "TR"
spell_flags = WAIT_FOR_CLICK
range = 1
max_targets = 1
selection_type = "view"
spell_flags = SELECTABLE|TALKED_BEFORE|INCLUDEUSER
override_base = "genetic"
hud_state = "gen_project"
compatible_mobs = list(/mob/living/carbon/human, /datum/mind)
mind_affecting = 1
/spell/targeted/genetic/fungaltelepathy/cast(var/list/targets, mob/living/carbon/human/user)
if(!user || !istype(user))
return
override_base = "racial"
hud_state = "transfer_reagents"
if(user.mind.miming)
to_chat(user, "<span class = 'warning'>You find yourself unable to convey your thoughts outside of gestures.</span>")
return
charge_max = 20
for(var/T in targets)
var/mob/living/target
if (isliving(T))
target = T
if (istype (T, /datum/mind))
target = user.can_mind_interact(T)
if(!T || !istype(target) || tinfoil_check(target))
return
to_chat(user, "<span class = 'notice'>You orient your mind toward [target].</span>")
var/datum/species/mushroom/M = user.species
if(!istype(M))
return
M.telepathic_target = target
invocation_type = SpI_NONE
/spell/targeted/transfer_reagents/is_valid_target(target, mob/user, options)
if(!istype(target, /obj/machinery/portable_atmospherics/hydroponics))
to_chat(holder, "<span class='warning'>That's neither soil nor an hydroponic tray!</span>")
return FALSE
return TRUE
/spell/targeted/transfer_reagents/cast(var/list/targets, mob/user)
..()
if(!holder.reagents)
to_chat(holder, "<span class='warning'>Uhh that's not gonna work. You don't seem to have reagents!</span>")
CRASH("[holder] tried to cast [name] but has no reagents!")
if(holder.reagents.total_volume <= 5)
to_chat(holder, "<span class='warning'>You don't have enough reagents in your system!</span>")
return 1
for(var/obj/machinery/portable_atmospherics/hydroponics/target in targets)
to_chat(holder, "You secrete some nutritional sap from your fingertips and let it fall into \the [target].")
holder.reagents.trans_to(target, 5, log_transfer = TRUE, whodunnit = holder)

View File

@@ -31,7 +31,6 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp
var/mind_affecting = 0 //Determines if it can be blocked by PSY_RESIST or tinfoil hat
var/list/compatible_mobs = list()
var/believed_name
/spell/targeted/is_valid_target(var/target, mob/user, list/options)
if(!(spell_flags & INCLUDEUSER) && target == user)
@@ -61,14 +60,22 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp
if(!user || !user.mind || !user.mind.heard_before.len)
return
var/list/possible_targets = user.mind.heard_before.Copy()
possible_targets += "All"
if(spell_flags & INCLUDEUSER)
possible_targets[user.real_name] = user.mind
var/target_name = input(user, "Choose the target, from those whose voices you've heard before.", "Targeting") as null|anything in possible_targets
if(isnull(target_name))
return
var/datum/mind/temp_target = possible_targets[target_name]
believed_name = target_name
targets += temp_target.current
var/datum/mind/temp_target
if(target_name == "All")
for(var/T in possible_targets)
if(T == "All")
continue
temp_target = possible_targets[T]
targets += temp_target.current
else
temp_target = possible_targets[target_name]
targets += temp_target.current
else if((range == 0 || range == SELFCAST) && (spell_flags & INCLUDEUSER))
targets += user
else

View File

@@ -30,7 +30,7 @@
/datum/disease2/effect/telepathic/activate(var/mob/living/mob)
if (mob.dna)
mob.dna.check_integrity()
mob.dna.SetSEState(REMOTETALKBLOCK,1)
mob.dna.SetSEState(TELEPATHYBLOCK,1)
domutcheck(mob, null)
/datum/disease2/effect/mind

View File

@@ -487,7 +487,7 @@
"NG" = (/obj/structure/bed/roller/surgery,/turf/simulated/floor{dir = 5; icon_state = "whitegreen"; tag = "icon-whitegreen (NORTHEAST)"},/area/vault/mothership_lab/research)
"NN" = (/obj/effect/decal/warning_stripes{icon_state = "unloading"},/obj/effect/decal/cleanable/blood/gibs/robot{icon_state = "gib3"},/turf/simulated/floor/plating{icon_state = "platingdmg1"; tag = ""},/area/vault/mothership_lab/research)
"NW" = (/obj/machinery/light/he{dir = 1},/turf/simulated/floor{icon_state = "showroomfloor"},/area/vault/mothership_lab/research)
"Oe" = (/obj/item/weapon/storage/lockbox/diskettebox/open/cloning{pixel_x = 2; pixel_y = 2},/obj/structure/table/reinforced,/obj/item/weapon/dnainjector/nofail/elvis,/obj/item/weapon/dnainjector/nofail/empath,/obj/item/weapon/dnainjector/nofail/insulation,/obj/item/weapon/dnainjector/nofail/psychic_resist,/obj/item/weapon/dnainjector/nofail/remotesay,/obj/item/weapon/dnainjector/nofail/remotesay,/obj/item/weapon/dnainjector/nofail/strong,/obj/item/weapon/dnainjector/nofail/remoteview,/obj/item/weapon/dnainjector/nofail/regenerate,/obj/item/weapon/dnainjector/nofail/sweedish,/obj/machinery/camera{id_tag = "labcameras"; name = "Genetics Research North"; network = list("MOTHERSHIPLAB")},/obj/item/weapon/dnainjector/nofail/farsightmut,/obj/item/weapon/dnainjector/nofail/farsightmut,/obj/item/weapon/dnainjector/nofail/insulation,/turf/simulated/floor{icon_state = "dark vault full"},/area/vault/mothership_lab/research)
"Oe" = (/obj/item/weapon/storage/lockbox/diskettebox/open/cloning{pixel_x = 2; pixel_y = 2},/obj/structure/table/reinforced,/obj/item/weapon/dnainjector/nofail/elvis,/obj/item/weapon/dnainjector/nofail/empath,/obj/item/weapon/dnainjector/nofail/insulation,/obj/item/weapon/dnainjector/nofail/psychic_resist,/obj/item/weapon/dnainjector/nofail/telepathy,/obj/item/weapon/dnainjector/nofail/telepathy,/obj/item/weapon/dnainjector/nofail/strong,/obj/item/weapon/dnainjector/nofail/remoteview,/obj/item/weapon/dnainjector/nofail/regenerate,/obj/item/weapon/dnainjector/nofail/sweedish,/obj/machinery/camera{id_tag = "labcameras"; name = "Genetics Research North"; network = list("MOTHERSHIPLAB")},/obj/item/weapon/dnainjector/nofail/farsightmut,/obj/item/weapon/dnainjector/nofail/farsightmut,/obj/item/weapon/dnainjector/nofail/insulation,/turf/simulated/floor{icon_state = "dark vault full"},/area/vault/mothership_lab/research)
"Of" = (/obj/structure/flora/pottedplant/random{icon_state = "plant-10"; tag = "icon-plant-10"},/turf/simulated/floor{dir = 1; icon_state = "darkred"},/area/vault/mothership_lab/research)
"Oi" = (/obj/structure/bed/chair/shuttle/gamer{dir = 4},/mob/living/simple_animal/hostile/humanoid/grey/researcher/surgeon{dir = 4},/turf/simulated/floor{icon_state = "dark vault full"},/area/vault/mothership_lab/research)
"Oj" = (/obj/structure/bed,/turf/simulated/floor{dir = 6; icon_state = "darkred"},/area/vault/mothership_lab/research)

View File

@@ -1838,7 +1838,6 @@
#include "code\modules\mob\living\carbon\give.dm"
#include "code\modules\mob\living\carbon\internals.dm"
#include "code\modules\mob\living\carbon\inventory.dm"
#include "code\modules\mob\living\carbon\racial_spells.dm"
#include "code\modules\mob\living\carbon\shock.dm"
#include "code\modules\mob\living\carbon\species.dm"
#include "code\modules\mob\living\carbon\species_powers.dm"