mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 18:32:03 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user