From dbc73875d7d4b2224fd18e0bab11825ae9acf505 Mon Sep 17 00:00:00 2001 From: Markolie Date: Tue, 25 Oct 2016 18:11:09 +0200 Subject: [PATCH] Fix spells, shadow/Diona QoL improvements (HUD icons) --- code/_onclick/hud/alert.dm | 10 + code/datums/spells/conjure.dm | 6 +- code/datums/spells/dumbfire.dm | 4 +- code/datums/spells/emplosion.dm | 2 +- code/datums/spells/ethereal_jaunt.dm | 2 +- code/datums/spells/explosion.dm | 2 +- code/datums/spells/genetic.dm | 2 +- code/datums/spells/inflict_handler.dm | 2 +- code/datums/spells/knock.dm | 2 +- code/datums/spells/projectile.dm | 2 +- code/datums/spells/summonitem.dm | 32 +- code/datums/spells/touch_attacks.dm | 6 +- code/datums/spells/trigger.dm | 2 +- code/datums/spells/wizard.dm | 2 +- code/game/dna/genes/goon_disabilities.dm | 4 +- code/game/dna/genes/goon_powers.dm | 169 ++++---- .../miniantags/revenant/revenant_abilities.dm | 4 +- code/game/gamemodes/shadowling/shadowling.dm | 6 +- .../shadowling/shadowling_abilities.dm | 360 +++++++++--------- .../special_shadowling_abilities.dm | 32 +- code/game/gamemodes/vampire/vampire_powers.dm | 138 +++---- code/modules/mining/lavaland/colossus_loot.dm | 6 +- code/modules/mob/dead/observer/spells.dm | 2 +- .../mob/living/carbon/human/species/shadow.dm | 40 +- .../living/carbon/human/species/species.dm | 4 +- .../living/carbon/human/species/station.dm | 13 +- code/modules/mob/living/carbon/superheroes.dm | 56 +-- .../living/simple_animal/hostile/hostile.dm | 5 + .../living/simple_animal/hostile/statue.dm | 8 +- code/modules/mob/spirit/mask/mask.dm | 36 +- icons/mob/screen_alert.dmi | Bin 35731 -> 36690 bytes 31 files changed, 511 insertions(+), 448 deletions(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 4761832bc89..cb36ab280d7 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -182,6 +182,16 @@ The box in your backpack has an oxygen tank and gas mask in it." name = "High Pressure" desc = "The air around you is hazardously thick. A fire suit would protect you." icon_state = "highpressure" + +/obj/screen/alert/lightexposure + name = "Light Exposure" + desc = "You're exposed to light." + icon_state = "lightexposure" + +/obj/screen/alert/nolight + name = "No Light" + desc = "You're not exposed to any light." + icon_state = "nolight" /obj/screen/alert/blind name = "Blind" diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 26a56603aff..aa0b524ec5a 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -23,7 +23,7 @@ targets -= T playsound(get_turf(src), 'sound/items/welder.ogg', 50, 1) - if(do_after(usr,delay, target = usr)) + if(do_after(user,delay, target = user)) for(var/i=0,iYou are somehow too bound to your current location to abandon it.") diff --git a/code/datums/spells/explosion.dm b/code/datums/spells/explosion.dm index 7bb7195c2dd..4beeae1206a 100644 --- a/code/datums/spells/explosion.dm +++ b/code/datums/spells/explosion.dm @@ -7,7 +7,7 @@ var/ex_light = 3 var/ex_flash = 4 -/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/explosion/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) explosion(target.loc,ex_severe,ex_heavy,ex_light,ex_flash) diff --git a/code/datums/spells/genetic.dm b/code/datums/spells/genetic.dm index e61819dc183..697337d85e0 100644 --- a/code/datums/spells/genetic.dm +++ b/code/datums/spells/genetic.dm @@ -15,7 +15,7 @@ 6th bit - ? */ -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) for(var/x in mutations) diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm index 9ddac0b0920..6dd0439e8c6 100644 --- a/code/datums/spells/inflict_handler.dm +++ b/code/datums/spells/inflict_handler.dm @@ -19,7 +19,7 @@ var/summon_type = null //this will put an obj at the target's location -/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) switch(destroys) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index 6d2b46f5b9c..8351d4739fb 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -13,7 +13,7 @@ action_icon_state = "knock" sound = "sound/magic/Knock.ogg" -/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets, mob/user = usr) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) spawn(1) diff --git a/code/datums/spells/projectile.dm b/code/datums/spells/projectile.dm index 611c45b1595..55d607d852e 100644 --- a/code/datums/spells/projectile.dm +++ b/code/datums/spells/projectile.dm @@ -37,7 +37,7 @@ projectile.dir = get_dir(target,projectile) projectile.name = proj_name - var/current_loc = usr.loc + var/current_loc = user.loc projectile.loc = current_loc diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm index 53d5478f257..f9ef1d39b36 100644 --- a/code/datums/spells/summonitem.dm +++ b/code/datums/spells/summonitem.dm @@ -15,9 +15,9 @@ action_icon_state = "summons" -/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets) - for(var/mob/living/user in targets) - var/list/hand_items = list(user.get_active_hand(),user.get_inactive_hand()) +/obj/effect/proc_holder/spell/targeted/summonitem/cast(list/targets, mob/user = usr) + for(var/mob/living/target in targets) + var/list/hand_items = list(target.get_active_hand(),target.get_inactive_hand()) var/butterfingers = 0 var/message @@ -56,7 +56,7 @@ if(issilicon(M)) //Items in silicons warp the whole silicon M.loc.visible_message("[M] suddenly disappears!") - M.loc = user.loc + M.loc = target.loc M.loc.visible_message("[M] suddenly appears!") item_to_retrive = null break @@ -68,10 +68,10 @@ /*if(C.internal_organs_by_name && item_to_retrive in C.internal_organs_by_name ) //This won't work, as we use organ datums instead of objects. --DZD C.internal_organs_by_name -= item_to_retrive if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy - var/obj/item/brain/B = new /obj/item/brain(user.loc) + var/obj/item/brain/B = new /obj/item/brain(target.loc) B.transfer_identity(C) C.death() - add_logs(user, C, "magically debrained", addition="INTENT: [uppertext(user.a_intent)]")*/ + add_logs(target, C, "magically debrained", addition="INTENT: [uppertext(target.a_intent)]")*/ if(C.stomach_contents && item_to_retrive in C.stomach_contents) C.stomach_contents -= item_to_retrive @@ -91,21 +91,21 @@ item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly disappears!") - if(user.hand) //left active hand - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) + if(target.hand) //left active hand + if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) butterfingers = 1 else //right active hand - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) - if(!user.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrive, slot_r_hand, 0, 1, 1)) + if(!target.equip_to_slot_if_possible(item_to_retrive, slot_l_hand, 0, 1, 1)) butterfingers = 1 if(butterfingers) - item_to_retrive.loc = user.loc + item_to_retrive.loc = target.loc item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears!") - playsound(get_turf(user),"sound/magic/SummonItems_generic.ogg",50,1) + playsound(get_turf(target),"sound/magic/SummonItems_generic.ogg",50,1) else - item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [user]'s hand!") - playsound(get_turf(user),"sound/magic/SummonItems_generic.ogg",50,1) + item_to_retrive.loc.visible_message("The [item_to_retrive.name] suddenly appears in [target]'s hand!") + playsound(get_turf(target),"sound/magic/SummonItems_generic.ogg",50,1) if(message) - to_chat(user, message) + to_chat(target, message) diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm index 6f659e5e98d..44993cb69b2 100644 --- a/code/datums/spells/touch_attacks.dm +++ b/code/datums/spells/touch_attacks.dm @@ -14,10 +14,10 @@ return 0 ..() -/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets) - for(var/mob/living/carbon/user in targets) +/obj/effect/proc_holder/spell/targeted/touch/cast(list/targets, mob/user = usr) + for(var/mob/living/carbon/target in targets) if(!attached_hand) - if(!ChargeHand(user)) + if(!ChargeHand(target)) return 0 while(attached_hand) //hibernate untill the spell is actually used charge_counter = 0 diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm index 0db9ae7d9a0..6c21153bb83 100644 --- a/code/datums/spells/trigger.dm +++ b/code/datums/spells/trigger.dm @@ -19,7 +19,7 @@ starting_spells = null return ..() -/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) for(var/obj/effect/proc_holder/spell/spell in contents) spell.perform(list(target),0) diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index d08af293415..ca91ea1b5f6 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -57,7 +57,7 @@ action_icon_state = "mutate" sound = "sound/magic/Mutate.ogg" -/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/genetic/mutate/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) target.dna.SetSEState(HULKBLOCK, 1) genemutcheck(target, HULKBLOCK, null, MUTCHK_FORCED) diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm index f2489a2490a..a2ad15e797b 100644 --- a/code/game/dna/genes/goon_disabilities.dm +++ b/code/game/dna/genes/goon_disabilities.dm @@ -259,8 +259,8 @@ action_icon_state = "genetic_incendiary" -/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets) - var/mob/living/carbon/L = usr +/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr) + var/mob/living/carbon/L = user L.adjust_fire_stacks(0.5) L.visible_message("[L.name] suddenly bursts into flames!") L.IgniteMob() diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index f9e9c2678a5..778fed2ef9f 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -148,15 +148,15 @@ action_icon_state = "genetic_cryo" -/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr) if(!targets.len) - to_chat(usr, "No target found in range.") + to_chat(user, "No target found in range.") return var/mob/living/carbon/C = targets[1] if(!iscarbon(C)) - to_chat(usr, "This will only work on normal organic beings.") + to_chat(user, "This will only work on normal organic beings.") return if(RESIST_COLD in C.mutations) @@ -169,15 +169,15 @@ if(istype(H.wear_suit, /obj/item/clothing/suit/space)) handle_suit = 1 if(H.internal) - H.visible_message("[usr] sprays a cloud of fine ice crystals, engulfing [H]!", - "[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + H.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [H]!", + "[user] sprays a cloud of fine ice crystals over your [H.head]'s visor.") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") else - H.visible_message("[usr] sprays a cloud of fine ice crystals engulfing, [H]!", - "[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + H.visible_message("[user] sprays a cloud of fine ice crystals engulfing, [H]!", + "[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") H.bodytemperature = max(0, H.bodytemperature - 50) H.adjustFireLoss(5) if(!handle_suit) @@ -185,11 +185,11 @@ C.adjustFireLoss(10) C.ExtinguishMob() - C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!") - log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit") - msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]") + C.visible_message("\red [user] sprays a cloud of fine ice crystals, engulfing [C]!") + log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit") + msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]") - //playsound(usr.loc, 'bamf.ogg', 50, 0) + //playsound(user.loc, 'bamf.ogg', 50, 0) new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis")) @@ -298,8 +298,7 @@ perform(targets) -/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets) - var/mob/user = usr +/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr) if(!targets.len) to_chat(user, "No target found in range.") return @@ -385,60 +384,60 @@ action_icon_state = "genetic_jump" -/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr) var/failure = 0 - if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat) - to_chat(usr, "You can't jump right now!") + if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat) + to_chat(user, "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)) + if(istype(user.loc,/turf/)) + if(user.restrained())//Why being pulled while cuffed prevents you from moving + for(var/mob/M in range(user, 1)) + if(M.pulling == user) + if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M)) failure = 1 else M.stop_pulling() - if(usr.pinned.len) + if(user.pinned.len) failure = 1 - usr.visible_message("[usr.name] takes a huge leap!") - playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) + user.visible_message("[user.name] takes a huge leap!") + playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1) if(failure) - usr.Weaken(5) - usr.Stun(5) - usr.visible_message("[usr] attempts to leap away but is slammed back down to the ground!", + user.Weaken(5) + user.Stun(5) + user.visible_message("[user] attempts to leap away but is slammed back down to the ground!", "You attempt to leap away but are suddenly slammed back down to the ground!", "You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.") return 0 - var/prevLayer = usr.layer - var/prevFlying = usr.flying - usr.layer = 9 + var/prevLayer = user.layer + var/prevFlying = user.flying + user.layer = 9 - usr.flying = 1 + user.flying = 1 for(var/i=0, i<10, i++) - step(usr, usr.dir) - if(i < 5) usr.pixel_y += 8 - else usr.pixel_y -= 8 + step(user, user.dir) + if(i < 5) user.pixel_y += 8 + else user.pixel_y -= 8 sleep(1) - usr.flying = prevFlying + user.flying = prevFlying - if(FAT in usr.mutations && prob(66)) - usr.visible_message("[usr.name] crashes due to their heavy weight!") - //playsound(usr.loc, 'zhit.wav', 50, 1) - usr.AdjustWeakened(10) - usr.AdjustStunned(5) + if(FAT in user.mutations && prob(66)) + user.visible_message("[user.name] crashes due to their heavy weight!") + //playsound(user.loc, 'zhit.wav', 50, 1) + user.AdjustWeakened(10) + user.AdjustStunned(5) - usr.layer = prevLayer + user.layer = prevLayer - if(istype(usr.loc,/obj/)) - var/obj/container = usr.loc - to_chat(usr, "You leap and slam your head against the inside of [container]! Ouch!") - usr.AdjustParalysis(3) - usr.AdjustWeakened(5) - container.visible_message("[usr.loc] emits a loud thump and rattles a bit.") - playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1) + if(istype(user.loc,/obj/)) + var/obj/container = user.loc + to_chat(user, "You leap and slam your head against the inside of [container]! Ouch!") + user.AdjustParalysis(3) + user.AdjustWeakened(5) + container.visible_message("[user.loc] emits a loud thump and rattles a bit.") + playsound(user.loc, 'sound/effects/bang.ogg', 50, 1) var/wiggle = 6 while(wiggle > 0) wiggle-- @@ -484,21 +483,21 @@ action_icon_state = "genetic_poly" -/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr) var/mob/living/M=targets[1] if(!ishuman(M)) - to_chat(usr, "You can only change your appearance to that of another human.") + to_chat(user, "You can only change your appearance to that of another human.") return - if(!ishuman(usr)) + if(!ishuman(user)) return - usr.visible_message("[usr]'s body shifts and contorts.") + user.visible_message("[user]'s body shifts and contorts.") spawn(10) - if(M && usr) - playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) - var/mob/living/carbon/human/H = usr + if(M && user) + playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) + var/mob/living/carbon/human/H = user var/mob/living/carbon/human/target = M H.UpdateAppearance(target.dna.UI) H.real_name = target.real_name @@ -543,27 +542,27 @@ perform(targets) -/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets) - if(!ishuman(usr)) return +/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr) + if(!ishuman(user)) return for(var/mob/living/carbon/M in targets) if(!iscarbon(M)) - to_chat(usr, "You may only use this on other organic beings.") + to_chat(user, "You may only use this on other organic beings.") return if(PSY_RESIST in M.mutations) - to_chat(usr, "You can't see into [M.name]'s mind at all!") + to_chat(user, "You can't see into [M.name]'s mind at all!") return if(M.stat == 2) - to_chat(usr, "[M.name] is dead and cannot have their mind read.") + to_chat(user, "[M.name] is dead and cannot have their mind read.") return if(M.health < 0) - to_chat(usr, "[M.name] is dying, and their thoughts are too scrambled to read.") + to_chat(user, "[M.name] is dying, and their thoughts are too scrambled to read.") return - to_chat(usr, "Mind Reading of [M.name]:") + to_chat(user, "Mind Reading of [M.name]:") var/pain_condition = M.health // lower health means more pain var/list/randomthoughts = list("what to have for lunch","the future","the past","money", @@ -580,33 +579,33 @@ switch(pain_condition) if(81 to INFINITY) - to_chat(usr, "Condition: [M.name] feels good.") + to_chat(user, "Condition: [M.name] feels good.") if(61 to 80) - to_chat(usr, "Condition: [M.name] is suffering mild pain.") + to_chat(user, "Condition: [M.name] is suffering mild pain.") if(41 to 60) - to_chat(usr, "Condition: [M.name] is suffering significant pain.") + to_chat(user, "Condition: [M.name] is suffering significant pain.") if(21 to 40) - to_chat(usr, "Condition: [M.name] is suffering severe pain.") + to_chat(user, "Condition: [M.name] is suffering severe pain.") else - to_chat(usr, "Condition: [M.name] is suffering excruciating pain.") + to_chat(user, "Condition: [M.name] is suffering excruciating pain.") thoughts = "haunted by their own mortality" switch(M.a_intent) if(I_HELP) - to_chat(usr, "Mood: You sense benevolent thoughts from [M.name].") + to_chat(user, "Mood: You sense benevolent thoughts from [M.name].") if(I_DISARM) - to_chat(usr, "Mood: You sense cautious thoughts from [M.name].") + to_chat(user, "Mood: You sense cautious thoughts from [M.name].") if(I_GRAB) - to_chat(usr, "Mood: You sense hostile thoughts from [M.name].") + to_chat(user, "Mood: You sense hostile thoughts from [M.name].") if(I_HARM) - to_chat(usr, "Mood: You sense cruel thoughts from [M.name].") + to_chat(user, "Mood: 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 - to_chat(usr, "Mood: You sense strange thoughts from [M.name].") + to_chat(user, "Mood: You sense strange thoughts from [M.name].") if(istype(M,/mob/living/carbon/human)) var/numbers[0] @@ -615,11 +614,11 @@ numbers += H.mind.initial_account.account_number numbers += H.mind.initial_account.remote_access_pin if(numbers.len>0) - to_chat(usr, "b>Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") - to_chat(usr, "Thoughts: [M.name] is currently [thoughts].") + to_chat(user, "b>Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") + to_chat(user, "Thoughts: [M.name] is currently [thoughts].") if(EMPATH in M.mutations) - to_chat(M, "You sense [usr.name] reading your mind.") + to_chat(M, "You sense [user.name] reading your mind.") else if(prob(5) || M.mind.assigned_role=="Chaplain") to_chat(M, "You sense someone intruding upon your thoughts...") return @@ -656,16 +655,16 @@ invocation_emote_self = invocation ..(user) -/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets) - var/UT = get_turf(usr) +/obj/effect/proc_holder/spell/aoe_turf/superfart/cast(list/targets, mob/user = usr) + var/UT = get_turf(user) - if(do_after(usr, 30, target = usr)) + if(do_after(user, 30, target = user)) playsound(UT, 'sound/goonstation/effects/superfart.ogg', 50, 0) - usr.visible_message("[usr] unleashes a [pick("tremendous","gigantic","colossal")] fart!", "You hear a [pick("tremendous","gigantic","colossal")] fart.") + user.visible_message("[user] unleashes a [pick("tremendous","gigantic","colossal")] fart!", "You hear a [pick("tremendous","gigantic","colossal")] fart.") for(var/T in targets) for(var/mob/living/M in T) shake_camera(M, 10, 5) - if(M == usr) + if(M == user) continue to_chat(M, "You are sent flying!") M.Weaken(5) @@ -673,4 +672,4 @@ step_away(M, UT, 15) step_away(M, UT, 15) else - to_chat(usr, "You were interrupted and couldn't fart! Rude!") + to_chat(user, "You were interrupted and couldn't fart! Rude!") diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index 26fb00b42a8..2d0d9028fe3 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -127,12 +127,12 @@ /obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, mob/living/simple_animal/revenant/user = usr) for(var/mob/living/M in targets) spawn(0) - var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") + var/msg = stripped_input(user, "What do you wish to tell [M]?", null, "") if(!msg) charge_counter = charge_max return log_say("RevenantTransmit: [key_name(user)]->[key_name(M)] : [msg]") - to_chat(usr, "You transmit to [M]: [msg]") + to_chat(user, "You transmit to [M]: [msg]") to_chat(M, "An alien voice resonates from all around... [msg]") diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index c9f29cefc2f..f28e5cce64e 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -151,7 +151,6 @@ Made by Xhuis new_thrall_mind.current.add_language("Shadowling Hivemind") new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_glare(null)) new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null)) - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null)) to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") @@ -306,6 +305,7 @@ Made by Xhuis hot_env_multiplier = 1.5 silent_steps = 1 + grant_vision_toggle = 0 /datum/species/shadow/ling/handle_life(var/mob/living/carbon/human/H) if(!H.weakeyes) @@ -316,11 +316,13 @@ Made by Xhuis var/turf/T = H.loc light_amount = T.get_lumcount() * 10 if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes + H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN) if(H.stat != DEAD) to_chat(H, "The light burns you!")//Message spam to say "GET THE FUCK OUT" H << 'sound/weapons/sear.ogg' else if(light_amount < LIGHT_HEAL_THRESHOLD) + H.clear_alert("lightexposure") H.heal_overall_damage(5, 5) H.adjustToxLoss(-5) H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!" @@ -351,8 +353,10 @@ Made by Xhuis var/turf/T = H.loc light_amount = T.get_lumcount() * 10 if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) + H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2) else if(light_amount < LIGHT_HEAL_THRESHOLD) + H.clear_alert("lightexposure") H.heal_overall_damage(2,2) H.adjustToxLoss(-5) H.adjustBrainLoss(-25) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 70471a91aff..e5f3025b8e5 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -21,28 +21,28 @@ clothes_req = 0 action_icon_state = "glare" -/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/target in targets) if(!ishuman(target)) - to_chat(usr, "You may only glare at humans!") + to_chat(user, "You may only glare at humans!") charge_counter = charge_max return - if(!shadowling_check(usr)) + if(!shadowling_check(user)) charge_counter = charge_max return if(target.stat) - to_chat(usr, "[target] must be conscious!") + to_chat(user, "[target] must be conscious!") charge_counter = charge_max return if(is_shadow_or_thrall(target)) - to_chat(usr, "You don't see why you would want to paralyze an ally.") + to_chat(user, "You don't see why you would want to paralyze an ally.") charge_counter = charge_max return var/mob/living/carbon/human/M = target - usr.visible_message("[usr]'s eyes flash a blinding red!") + user.visible_message("[user]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") - if(in_range(target, usr)) - to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty...") + if(in_range(target, user)) + to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by their heavenly beauty...") else //Only alludes to the shadowling if the target is close by to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...") target.Stun(10) @@ -57,25 +57,25 @@ clothes_req = 0 action_icon_state = "glare" -/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/target in targets) if(!ishuman(target) || !target) - to_chat(usr, "You nay only glare at humans!") + to_chat(user, "You nay only glare at humans!") charge_counter = charge_max return if(target.stat) - to_chat(usr, "[target] must be conscious!") + to_chat(user, "[target] must be conscious!") charge_counter = charge_max return if(is_shadow_or_thrall(target)) - to_chat(usr, "You cannot glare at allies!") + to_chat(user, "You cannot glare at allies!") charge_counter = charge_max return var/mob/living/carbon/human/M = target - usr.visible_message("[usr]'s eyes flash a blinding red!") + user.visible_message("[user]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") - if(in_range(target, usr)) - to_chat(target, "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights...") + if(in_range(target, user)) + to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by the heavenly lights...") else to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by their heavenly beauty...") target.Stun(3) //Roughly 30% as long as the normal one @@ -138,12 +138,12 @@ if(F.light_range > 0) extinguishItem(F) -/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return - to_chat(usr, "You silently disable all nearby lights.") - for(var/obj/effect/glowshroom/G in orange(2, usr)) //Why the fuck was this in the loop below? + to_chat(user, "You silently disable all nearby lights.") + for(var/obj/effect/glowshroom/G in orange(2, user)) //Why the fuck was this in the loop below? G.visible_message("\The [G] withers away!") qdel(G) for(var/turf/T in targets) @@ -175,30 +175,30 @@ include_user = 1 action_icon_state = "shadow_walk" -/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/shadow_walk/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return - for(var/mob/living/user in targets) + for(var/mob/living/target in targets) playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) - user.visible_message("[user] vanishes in a puff of black mist!", "You enter the space between worlds as a passageway.") - user.SetStunned(0) - user.SetWeakened(0) - user.incorporeal_move = 1 - user.alpha = 0 - user.ExtinguishMob() - var/turf/T = get_turf(user) - user.forceMove(T) //to properly move the mob out of a potential container - if(user.buckled) - user.buckled.unbuckle_mob() - if(user.pulledby) - user.pulledby.stop_pulling() - user.stop_pulling() + target.visible_message("[target] vanishes in a puff of black mist!", "You enter the space between worlds as a passageway.") + target.SetStunned(0) + target.SetWeakened(0) + target.incorporeal_move = 1 + target.alpha = 0 + target.ExtinguishMob() + var/turf/T = get_turf(target) + target.forceMove(T) //to properly move the mob out of a potential container + if(target.buckled) + target.buckled.unbuckle_mob() + if(target.pulledby) + target.pulledby.stop_pulling() + target.stop_pulling() sleep(40) //4 seconds - user.visible_message("[user] suddenly manifests!", "The pressure becomes too much and you vacate the interdimensional darkness.") - user.incorporeal_move = 0 - user.alpha = 255 - user.forceMove(user.loc) + target.visible_message("[target] suddenly manifests!", "The pressure becomes too much and you vacate the interdimensional darkness.") + target.incorporeal_move = 0 + target.alpha = 255 + target.forceMove(user.loc) /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk name = "Guise" @@ -210,13 +210,13 @@ include_user = 1 action_icon_state = "shadow_walk" -/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets) - for(var/mob/living/user in targets) - user.visible_message("[user] suddenly fades away!", "You veil yourself in darkness, making you harder to see.") - user.alpha = 10 +/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets, mob/user = usr) + for(var/mob/living/target in targets) + target.visible_message("[target] suddenly fades away!", "You veil yourself in darkness, making you harder to see.") + target.alpha = 10 sleep(40) - user.visible_message("[user] appears from nowhere!", "Your shadowy guise slips away.") - user.alpha = initial(user.alpha) + target.visible_message("[target] appears from nowhere!", "Your shadowy guise slips away.") + target.alpha = initial(target.alpha) /obj/effect/proc_holder/spell/targeted/shadow_vision @@ -230,11 +230,11 @@ var/datum/vision_override/vision_path = /datum/vision_override/nightvision action_icon_state = "darksight" -/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets) - for(var/mob/living/user in targets) - if(!istype(user) || !ishuman(user)) +/obj/effect/proc_holder/spell/targeted/shadow_vision/cast(list/targets, mob/user = usr) + for(var/mob/living/L in targets) + if(!istype(L) || !ishuman(L)) return - var/mob/living/carbon/human/H = user + var/mob/living/carbon/human/H = L if(!H.vision_type) to_chat(H, "You shift the nerves in your eyes, allowing you to see in the dark.") H.vision_type = new vision_path @@ -256,17 +256,17 @@ clothes_req = 0 action_icon_state = "icy_veins" -/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return - to_chat(usr, "You freeze the nearby air.") - playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) + to_chat(user, "You freeze the nearby air.") + playsound(user.loc, 'sound/effects/ghost2.ogg', 50, 1) for(var/turf/T in targets) for(var/mob/living/carbon/M in T.contents) if(is_shadow_or_thrall(M)) - if(M == usr) //No message for the user, of course + if(M == user) //No message for the user, of course continue else to_chat(M, "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!") @@ -290,80 +290,80 @@ var/enthralling = 0 action_icon_state = "enthrall" -/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets) - var/mob/living/carbon/human/user = usr +/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) + var/mob/living/carbon/human/ling = user listclearnulls(ticker.mode.shadowling_thralls) - if(!(user.mind in ticker.mode.shadows)) + if(!(ling.mind in ticker.mode.shadows)) return - if(user.get_species() != "Shadowling") + if(ling.get_species() != "Shadowling") if(ticker.mode.shadowling_thralls.len >= 5) charge_counter = charge_max return for(var/mob/living/carbon/human/target in targets) - if(!in_range(usr, target)) - to_chat(usr, "You need to be closer to enthrall [target].") + if(!in_range(user, target)) + to_chat(user, "You need to be closer to enthrall [target].") charge_counter = charge_max return if(!target.key || !target.mind) - to_chat(usr, "The target has no mind.") + to_chat(user, "The target has no mind.") charge_counter = charge_max return if(target.stat) - to_chat(usr, "The target must be conscious.") + to_chat(user, "The target must be conscious.") charge_counter = charge_max return if(is_shadow_or_thrall(target)) - to_chat(usr, "You can not enthrall allies.") + to_chat(user, "You can not enthrall allies.") charge_counter = charge_max return if(!ishuman(target)) - to_chat(usr, "You can only enthrall humans.") + to_chat(user, "You can only enthrall humans.") charge_counter = charge_max return if(enthralling) - to_chat(usr, "You are already enthralling!") + to_chat(user, "You are already enthralling!") charge_counter = charge_max return if(!target.client) - to_chat(usr, "[target]'s mind is vacant of activity.") + to_chat(user, "[target]'s mind is vacant of activity.") enthralling = 1 - to_chat(usr, "This target is valid. You begin the enthralling.") - to_chat(target, "[usr] stares at you. You feel your head begin to pulse.") + to_chat(user, "This target is valid. You begin the enthralling.") + to_chat(target, "[user] stares at you. You feel your head begin to pulse.") for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) - to_chat(usr, "You place your hands to [target]'s head...") - usr.visible_message("[usr] places their hands onto the sides of [target]'s head!") + to_chat(user, "You place your hands to [target]'s head...") + user.visible_message("[user] places their hands onto the sides of [target]'s head!") if(2) - to_chat(usr, "You begin preparing [target]'s mind as a blank slate...") - usr.visible_message("[usr]'s palms flare a bright red against [target]'s temples!") + to_chat(user, "You begin preparing [target]'s mind as a blank slate...") + user.visible_message("[user]'s palms flare a bright red against [target]'s temples!") to_chat(target, "A terrible red light floods your mind. You collapse as conscious thought is wiped away.") target.Weaken(12) sleep(20) if(isloyal(target)) - to_chat(usr, "They have a mindshield implant. You begin to deactivate it - this will take some time.") - usr.visible_message("[usr] pauses, then dips their head in concentration!") + to_chat(user, "They have a mindshield implant. You begin to deactivate it - this will take some time.") + user.visible_message("[user] pauses, then dips their head in concentration!") to_chat(target, "Your mindshield implant becomes hot as it comes under attack!") sleep(100) //10 seconds - not spawn() so the enthralling takes longer - to_chat(usr, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.") - usr.visible_message("[usr] relaxes again.") + to_chat(user, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.") + user.visible_message("[user] relaxes again.") for(var/obj/item/weapon/implant/loyalty/L in target) if(L && L.implanted) qdel(L) to_chat(target, "Your mental protection implant unexpectedly falters, dims, dies.") if(3) - to_chat(usr, "You begin planting the tumor that will control the new thrall...") - usr.visible_message("A strange energy passes from [usr]'s hands into [target]'s head!") + to_chat(user, "You begin planting the tumor that will control the new thrall...") + user.visible_message("A strange energy passes from [user]'s hands into [target]'s head!") to_chat(target, "You feel your memories twisting, morphing. A sense of horror dominates your mind.") - if(!do_mob(usr, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant - to_chat(usr, "The enthralling has been interrupted - your target's mind returns to its previous state.") - to_chat(target, "You wrest yourself away from [usr]'s hands and compose yourself") + if(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 31 for someone with a mindshield implant + to_chat(user, "The enthralling has been interrupted - your target's mind returns to its previous state.") + to_chat(target, "You wrest yourself away from [user]'s hands and compose yourself") enthralling = 0 return enthralling = 0 - to_chat(usr, "You have enthralled [target]!") + to_chat(user, "You have enthralled [target]!") target.visible_message("[target] looks to have experienced a revelation!", \ "False faces all dark not real not real not--") target.setOxyLoss(0) //In case the shadowling was choking them out @@ -380,18 +380,18 @@ clothes_req = 0 action_icon_state = "regen_armor" -/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets) - if(!is_shadow(usr)) - to_chat(usr, "You must be a shadowling to do this!") +/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets, mob/user = usr) + if(!is_shadow(user)) + to_chat(user, "You must be a shadowling to do this!") charge_counter = charge_max return - for(var/mob/living/user in targets) - if(!istype(user) || !ishuman(user)) + for(var/mob/living/target in targets) + if(!istype(target) || !ishuman(target)) return - var/mob/living/carbon/human/H = user + var/mob/living/carbon/human/H = target H.visible_message("[H]'s skin suddenly bubbles and shifts around their body!", \ "You regenerate your protective armor and cleanse your form of defects.") - H.adjustCloneLoss(user.getCloneLoss()) + H.adjustCloneLoss(target.getCloneLoss()) H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit) @@ -415,54 +415,54 @@ var/reviveThrallAcquired action_icon_state = "collective_mind" -/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return - for(var/mob/living/user in targets) + for(var/mob/living/target in targets) var/thralls = 0 var/victory_threshold = 15 var/mob/M - to_chat(user, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") + to_chat(target, "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.") for(M in living_mob_list) if(is_thrall(M)) thralls++ to_chat(M, "You feel hooks sink into your mind and pull.") - if(!do_after(user, 30, target = user)) - to_chat(user, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") + if(!do_after(target, 30, target = target)) + to_chat(target, "Your concentration has been broken. The mental hooks you have sent out now retract into your mind.") return if(thralls >= 3 && !screech_acquired) screech_acquired = 1 - to_chat(user, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) + to_chat(target, "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.") + target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null)) if(thralls >= 5 && !blind_smoke_acquired) blind_smoke_acquired = 1 - to_chat(user, "The power of your thralls has granted you the Blinding Smoke ability. \ + to_chat(target, "The power of your thralls has granted you the Blinding Smoke ability. \ It will create a choking cloud that will blind any non-thralls who enter.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) + target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/blindness_smoke(null)) if(thralls >= 7 && !drainLifeAcquired) drainLifeAcquired = 1 - to_chat(user, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null)) + to_chat(target, "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself.") + target.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/drainLife(null)) if(thralls >= 9 && !reviveThrallAcquired) reviveThrallAcquired = 1 - to_chat(user, "The power of your thralls has granted you the Black Recuperation ability. \ + to_chat(target, "The power of your thralls has granted you the Black Recuperation ability. \ This will, after a short time, bring a dead thrall completely back to life with no bodily defects.") - user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null)) + target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/reviveThrall(null)) if(thralls < victory_threshold) - to_chat(user, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") + to_chat(target, "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.") else if(thralls >= victory_threshold) - to_chat(usr, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.") - to_chat(usr, "You may find Ascendance in the Shadowling Evolution tab.") + to_chat(target, "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls.") + to_chat(target, "You may find Ascendance in the Shadowling Evolution tab.") for(M in living_mob_list) if(is_shadow(M)) var/obj/effect/proc_holder/spell/targeted/collective_mind/CM @@ -471,10 +471,10 @@ qdel(CM) M.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch) M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadowling_ascend(null)) - if(M == usr) + if(M == target) to_chat(M, "You project this power to the rest of the shadowlings.") else - to_chat(M, "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)")//Tells all the other shadowlings + to_chat(M, "[target.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)")//Tells all the other shadowlings @@ -489,15 +489,15 @@ include_user = 1 action_icon_state = "black_smoke" -/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets, mob/user = usr) //Extremely hacky + if(!shadowling_check(user)) charge_counter = charge_max return - for(var/mob/living/user in targets) - user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") - to_chat(user, "You regurgitate a vast cloud of blinding smoke.") - playsound(user, 'sound/effects/bamf.ogg', 50, 1) - var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) + for(var/mob/living/target in targets) + target.visible_message("[target] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!") + to_chat(target, "You regurgitate a vast cloud of blinding smoke.") + playsound(target, 'sound/effects/bamf.ogg', 50, 1) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(target.loc) B.reagents.clear_reagents() //Just in case! B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) @@ -539,17 +539,17 @@ clothes_req = 0 action_icon_state = "screech" -/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return - usr.audible_message("[usr] lets out a horrible scream!") - playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1) + user.audible_message("[user] lets out a horrible scream!") + playsound(user.loc, 'sound/effects/screech.ogg', 100, 1) for(var/turf/T in targets) for(var/mob/target in T.contents) if(is_shadow_or_thrall(target)) - if(target == usr) //No message for the user, of course + if(target == user) //No message for the user, of course continue else continue @@ -584,7 +584,7 @@ action_icon_state = "drain_life" /obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, var/mob/living/carbon/human/U = usr) - if(!shadowling_check(usr)) + if(!shadowling_check(U)) charge_counter = charge_max return targetsDrained = 0 @@ -597,7 +597,7 @@ nearbyTargets.Add(M) if(!targetsDrained) charge_counter = charge_max - to_chat(usr, "There were no nearby humans for you to drain.") + to_chat(U, "There were no nearby humans for you to drain.") return for(var/mob/living/carbon/M in nearbyTargets) U.heal_organ_damage(10, 10) @@ -608,8 +608,8 @@ U.AdjustStunned(-1) M.adjustOxyLoss(20) M.adjustStaminaLoss(20) - to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!") - to_chat(usr, "You draw life from those around you to heal your wounds.") + to_chat(M, "You feel a wave of exhaustion and a curious draining sensation directed towards [U]!") + to_chat(U, "You draw life from those around you to heal your wounds.") @@ -623,24 +623,24 @@ include_user = 0 action_icon_state = "revive_thrall" -/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return for(var/mob/living/carbon/human/thrallToRevive in targets) - var/choice = alert(usr,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel") + var/choice = alert(user,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel") switch(choice) if("Empower") if(!is_thrall(thrallToRevive)) - to_chat(usr, "[thrallToRevive] is not a thrall.") + to_chat(user, "[thrallToRevive] is not a thrall.") charge_counter = charge_max return if(thrallToRevive.stat != CONSCIOUS) - to_chat(usr, "[thrallToRevive] must be conscious to become empowered.") + to_chat(user, "[thrallToRevive] must be conscious to become empowered.") charge_counter = charge_max return if(thrallToRevive.get_species() == "Lesser Shadowling") - to_chat(usr, "[thrallToRevive] is already empowered.") + to_chat(user, "[thrallToRevive] is already empowered.") charge_counter = charge_max return var/empowered_thralls = 0 @@ -651,21 +651,21 @@ if(H.get_species() == "Lesser Shadowling") empowered_thralls++ if(empowered_thralls >= EMPOWERED_THRALL_LIMIT) - to_chat(usr, "You cannot spare this much energy. There are too many empowered thralls.") + to_chat(user, "You cannot spare this much energy. There are too many empowered thralls.") charge_counter = charge_max return - usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ + user.visible_message("[user] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \ "You place your hands on [thrallToRevive]'s face and begin gathering energy...") - to_chat(thrallToRevive, "[usr] places their hands over your face. You feel energy gathering. Stand still...") - if(!do_mob(usr, thrallToRevive, 80)) - to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") + to_chat(thrallToRevive, "[user] places their hands over your face. You feel energy gathering. Stand still...") + if(!do_mob(user, thrallToRevive, 80)) + to_chat(user, "Your concentration snaps. The flow of energy ebbs.") charge_counter = charge_max return - to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") - usr.visible_message("Red lightning surges into [thrallToRevive]'s face!") + to_chat(user, "You release a massive surge of power into [thrallToRevive]!") + user.visible_message("Red lightning surges into [thrallToRevive]'s face!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) thrallToRevive.Weaken(5) thrallToRevive.visible_message("[thrallToRevive] collapses, their skin and face distorting!", \ "AAAAAAAAAAAAAAAAAAAGH-") @@ -680,25 +680,25 @@ thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null)) if("Revive") if(!is_thrall(thrallToRevive)) - to_chat(usr, "[thrallToRevive] is not a thrall.") + to_chat(user, "[thrallToRevive] is not a thrall.") charge_counter = charge_max return if(thrallToRevive.stat != DEAD) - to_chat(usr, "[thrallToRevive] is not dead.") + to_chat(user, "[thrallToRevive] is not dead.") charge_counter = charge_max return - usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \ + user.visible_message("[user] kneels over [thrallToRevive], placing their hands on \his chest.", \ "You crouch over the body of your thrall and begin gathering energy...") thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive) - if(!do_mob(usr, thrallToRevive, 30)) - to_chat(usr, "Your concentration snaps. The flow of energy ebbs.") + if(!do_mob(user, thrallToRevive, 30)) + to_chat(user, "Your concentration snaps. The flow of energy ebbs.") charge_counter = charge_max return - to_chat(usr, "You release a massive surge of power into [thrallToRevive]!") - usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!") + to_chat(user, "You release a massive surge of power into [thrallToRevive]!") + user.visible_message("Red lightning surges from [user]'s hands into [thrallToRevive]'s chest!") playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1) playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1) - usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) sleep(10) if(thrallToRevive.revive()) thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \ @@ -719,8 +719,8 @@ charge_max = 600 action_icon_state = "extend_shuttle" -/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets) - if(!shadowling_check(usr)) +/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/user = usr) + if(!shadowling_check(user)) charge_counter = charge_max return for(var/mob/living/carbon/human/target in targets) @@ -728,23 +728,23 @@ charge_counter = charge_max return if(!is_thrall(target)) - to_chat(usr, "[target] must be a thrall.") + to_chat(user, "[target] must be a thrall.") charge_counter = charge_max return if(shuttle_master.emergency.mode != SHUTTLE_CALL) - to_chat(usr, "The shuttle must be inbound only to the station.") + to_chat(user, "The shuttle must be inbound only to the station.") charge_counter = charge_max return var/mob/living/carbon/human/M = target - usr.visible_message("[usr]'s eyes flash a bright red!", \ + user.visible_message("[user]'s eyes flash a bright red!", \ "You begin to draw [M]'s life force.") M.visible_message("[M]'s face falls slack, their jaw slightly distending.", \ "You are suddenly transported... far, far away...") - if(!do_after(usr, 50, target = M)) + if(!do_after(user, 50, target = M)) to_chat(M, "You are snapped back to reality, your haze dissipating!") - to_chat(usr, "You have been interrupted. The draw has failed.") + to_chat(user, "You have been interrupted. The draw has failed.") return - to_chat(usr, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!") + to_chat(user, "You project [M]'s life force toward the approaching shuttle, extending its arrival duration!") M.visible_message("[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.", \ "...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...") M.death() @@ -754,7 +754,7 @@ timer += more_minutes command_announcement.Announce("Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes..", "System Failure", 'sound/misc/notice1.ogg') shuttle_master.emergency.setTimer(timer) - usr.mind.spell_list.Remove(src) //Can only be used once! + user.mind.spell_list.Remove(src) //Can only be used once! qdel(src) // ASCENDANT ABILITIES BEYOND THIS POINT // @@ -768,20 +768,20 @@ clothes_req = 0 action_icon_state = "annihilate" -/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr +/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets, mob/user = usr) + var/mob/living/simple_animal/ascendant_shadowling/SHA = user if(SHA.phasing) - to_chat(usr, "You are not in the same plane of existence. Unphase first.") + to_chat(user, "You are not in the same plane of existence. Unphase first.") charge_counter = charge_max return - playsound(usr.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1) + playsound(user.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1) for(var/mob/living/boom in targets) if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. - to_chat(usr, "Making an ally explode seems unwise.") + to_chat(user, "Making an ally explode seems unwise.") charge_counter = charge_max return - usr.visible_message("[usr]'s markings flare as they gesture at [boom]!", \ + user.visible_message("[user]'s markings flare as they gesture at [boom]!", \ "You direct a lance of telekinetic energy at [boom].") sleep(4) if(iscarbon(boom)) @@ -800,32 +800,32 @@ clothes_req = 0 action_icon_state = "enthrall" -/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr +/obj/effect/proc_holder/spell/targeted/hypnosis/cast(list/targets, mob/user = usr) + var/mob/living/simple_animal/ascendant_shadowling/SHA = user if(SHA.phasing) charge_counter = charge_max - to_chat(usr, "You are not in the same plane of existence. Unphase first.") + to_chat(user, "You are not in the same plane of existence. Unphase first.") return for(var/mob/living/carbon/human/target in targets) if(is_shadow_or_thrall(target)) - to_chat(usr, "You cannot enthrall an ally.") + to_chat(user, "You cannot enthrall an ally.") charge_counter = charge_max return if(!target.ckey || !target.mind) - to_chat(usr, "The target has no mind.") + to_chat(user, "The target has no mind.") charge_counter = charge_max return if(target.stat) - to_chat(usr, "The target must be conscious.") + to_chat(user, "The target must be conscious.") charge_counter = charge_max return if(!ishuman(target)) - to_chat(usr, "You can only enthrall humans.") + to_chat(user, "You can only enthrall humans.") charge_counter = charge_max return - to_chat(usr, "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall.") + to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall.") to_chat(target, "An agonizing spike of pain drives into your mind, and--") ticker.mode.add_thrall(target.mind) target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL @@ -843,8 +843,8 @@ clothes_req = 0 action_icon_state = "shadow_walk" -/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr +/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift/cast(list/targets, mob/user = usr) + var/mob/living/simple_animal/ascendant_shadowling/SHA = user for(SHA in targets) SHA.phasing = !SHA.phasing if(SHA.phasing) @@ -869,16 +869,16 @@ clothes_req = 0 action_icon_state = "lightning_storm" -/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets) - var/mob/living/simple_animal/ascendant_shadowling/SHA = usr +/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets, mob/user = usr) + var/mob/living/simple_animal/ascendant_shadowling/SHA = user if(SHA.phasing) - to_chat(usr, "You are not in the same plane of existence. Unphase first.") + to_chat(user, "You are not in the same plane of existence. Unphase first.") charge_counter = charge_max return - usr.visible_message("A massive ball of lightning appears in [usr]'s hands and flares out!", \ + user.visible_message("A massive ball of lightning appears in [user]'s hands and flares out!", \ "You conjure a ball of lightning and release it.") - playsound(usr.loc, 'sound/magic/lightningbolt.ogg', 100, 1) + playsound(user.loc, 'sound/magic/lightningbolt.ogg', 100, 1) for(var/turf/T in targets) for(var/mob/living/carbon/human/target in T.contents) if(is_shadow_or_thrall(target)) @@ -887,7 +887,7 @@ playsound(target, 'sound/magic/LightningShock.ogg', 50, 1) target.Weaken(8) target.take_organ_damage(0,50) - usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) + user.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1) /obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit name = "Ascendant Broadcast" @@ -899,9 +899,9 @@ include_user = 1 action_icon_state = "transmit" -/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets) - for(var/mob/living/user in targets) - var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "") +/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets, mob/user = usr) + for(var/mob/living/target in targets) + var/text = stripped_input(target, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "") if(!text) return to_chat(world, "\"[text]\"") diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 2c06168499e..f8feb532cbd 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -10,11 +10,11 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N include_user = 1 action_icon_state = "hatch" -/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets) - if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr || isinspace(usr))) +/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets, mob/user = usr) + if(user.stat || !ishuman(user) || !user || !is_shadow(user || isinspace(user))) return - if(!isturf(usr.loc)) - to_chat(usr, "You can't hatch here!") + if(!isturf(user.loc)) + to_chat(user, "You can't hatch here!") return for(var/mob/living/carbon/human/H in targets) var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No") @@ -33,8 +33,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N sleep(50) var/turf/simulated/floor/F - var/turf/shadowturf = get_turf(usr) - for(F in orange(1, usr)) + var/turf/shadowturf = get_turf(user) + for(F in orange(1, user)) new /obj/structure/alien/resin/wall/shadowling(F) for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky qdel(R) @@ -68,7 +68,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N var/newNameId = pick(possibleShadowlingNames) possibleShadowlingNames.Remove(newNameId) H.real_name = newNameId - H.name = usr.real_name + H.name = user.real_name H.SetStunned(0) to_chat(H, "YOU LIVE!!!") @@ -83,13 +83,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.socks = "None" H.faction |= "faithless" - H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(usr), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(user), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(user), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses) H.set_species("Shadowling") //can't be a shadowling without being a shadowling H.mind.RemoveSpell(src) @@ -116,8 +116,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N include_user = 1 action_icon_state = "ascend" -/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets) - var/mob/living/carbon/human/H = usr +/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets, mob/user = usr) + var/mob/living/carbon/human/H = user if(!shadowling_check(H)) return for(H in targets) diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index f8e1575efc1..17f26d8753d 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -150,14 +150,14 @@ charge_max = 200 stat_allowed = 1 -/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast() - var/mob/living/U = usr +/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr) + var/mob/living/U = user - usr.SetWeakened(0) - usr.SetStunned(0) - usr.SetParalysis(0) + user.SetWeakened(0) + user.SetStunned(0) + user.SetParalysis(0) U.adjustStaminaLoss(-75) - to_chat(usr, "You flush your system with clean blood and remove any incapacitating effects.") + to_chat(user, "You flush your system with clean blood and remove any incapacitating effects.") spawn(1) if(usr.mind.vampire.get_ability(/datum/vampire_passive/regen)) for(var/i = 1 to 5) @@ -173,15 +173,15 @@ action_icon_state = "vampire_hypnotise" required_blood = 20 -/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets) +/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) - usr.visible_message("[usr]'s eyes flash briefly as he stares into [target]'s eyes") - if(do_mob(usr, target, 50)) + user.visible_message("[user]'s eyes flash briefly as he stares into [target]'s eyes") + if(do_mob(user, target, 50)) if(!affects(target)) - to_chat(usr, "Your piercing gaze fails to knock out [target].") - to_chat(target, "\blue [usr]'s feeble gaze is ineffective.") + to_chat(user, "Your piercing gaze fails to knock out [target].") + to_chat(target, "\blue [user]'s feeble gaze is ineffective.") else - to_chat(usr, "Your piercing gaze knocks out [target].") + to_chat(user, "Your piercing gaze knocks out [target].") to_chat(target, "You find yourself unable to move and barely able to speak.") target.Weaken(10) target.Stun(10) @@ -197,12 +197,12 @@ action_icon_state = "vampire_disease" required_blood = 100 -/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets) +/obj/effect/proc_holder/spell/vampire/targetted/disease/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/target in targets) - to_chat(usr, "You stealthily infect [target] with your diseased touch.") - target.help_shake_act(usr) + to_chat(user, "You stealthily infect [target] with your diseased touch.") + target.help_shake_act(user) if(!affects(target)) - to_chat(usr, "They seem to be unaffected.") + to_chat(user, "They seem to be unaffected.") continue var/datum/disease/D = new /datum/disease/vampire target.ForceContractDisease(D) @@ -214,10 +214,10 @@ charge_max = 300 stat_allowed = 1 -/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets) - usr.visible_message("[usr]'s eyes emit a blinding flash!") - if(istype(usr:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) - to_chat(usr, "You're blindfolded!") +/obj/effect/proc_holder/spell/vampire/mob_aoe/glare/cast(list/targets, mob/user = usr) + user.visible_message("[user]'s eyes emit a blinding flash!") + if(istype(user:glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) + to_chat(user, "You're blindfolded!") return for(var/mob/living/target in targets) if(!affects(target)) @@ -225,7 +225,7 @@ target.Stun(5) target.Weaken(5) target.stuttering = 20 - to_chat(target, "You are blinded by [usr]'s glare.") + to_chat(target, "You are blinded by [user]'s glare.") /obj/effect/proc_holder/spell/vampire/self/shapeshift name = "Shapeshift (50)" @@ -234,12 +234,12 @@ action_icon_state = "genetic_poly" required_blood = 50 -/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast() - usr.visible_message("[usr] transforms!") - usr.client.prefs.real_name = usr.generate_name() - usr.client.prefs.random_character() - usr.client.prefs.copy_to(usr) - usr.regenerate_icons() +/obj/effect/proc_holder/spell/vampire/self/shapeshift/cast(list/targets, mob/user = usr) + user.visible_message("[user] transforms!") + user.client.prefs.real_name = user.generate_name() + user.client.prefs.random_character() + user.client.prefs.copy_to(user) + user.regenerate_icons() /obj/effect/proc_holder/spell/vampire/self/screech name = "Chiroptean Screech (30)" @@ -248,10 +248,10 @@ action_icon_state = "vampire_screech" required_blood = 30 -/obj/effect/proc_holder/spell/vampire/self/screech/cast() - usr.visible_message("[usr] lets out an ear piercing shriek!", "You let out a loud shriek.", "You hear a loud painful shriek!") +/obj/effect/proc_holder/spell/vampire/self/screech/cast(list/targets, mob/user = usr) + user.visible_message("[user] lets out an ear piercing shriek!", "You let out a loud shriek.", "You hear a loud painful shriek!") for(var/mob/living/carbon/C in hearers(4)) - if(C == usr) + if(C == user) continue if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) continue @@ -265,7 +265,7 @@ C.Jitter(150) for(var/obj/structure/window/W in view(4)) W.destroy() - playsound(usr.loc, 'sound/effects/creepyshriek.ogg', 100, 1) + playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, 1) /proc/isvampirethrall(mob/living/M as mob) @@ -278,19 +278,19 @@ action_icon_state = "vampire_enthrall" required_blood = 300 -/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets) +/obj/effect/proc_holder/spell/vampire/targetted/enthrall/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) - usr.visible_message("[usr] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") + user.visible_message("[user] bites [target]'s neck!", "You bite [target]'s neck and begin the flow of power.") to_chat(target, "You feel the tendrils of evil invade your mind.") if(!ishuman(target)) - to_chat(usr, "You can only enthrall humans.") + to_chat(user, "You can only enthrall humans.") break - if(do_mob(usr, target, 50)) - if(can_enthrall(usr, target)) - handle_enthrall(usr, target) + if(do_mob(user, target, 50)) + if(can_enthrall(user, target)) + handle_enthrall(user, target) else - revert_cast(usr) - to_chat(usr, "You or your target either moved or you dont have enough usable blood.") + revert_cast(user) + to_chat(user, "You or your target either moved or you dont have enough usable blood.") /obj/effect/proc_holder/spell/vampire/targetted/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C) var/enthrall_safe = 0 @@ -359,11 +359,11 @@ return name = "[initial(name)] ([user.mind.vampire.iscloaking ? "Deactivate" : "Activate"])" -/obj/effect/proc_holder/spell/vampire/self/cloak/cast() - var/datum/vampire/V = usr.mind.vampire +/obj/effect/proc_holder/spell/vampire/self/cloak/cast(list/targets, mob/user = usr) + var/datum/vampire/V = user.mind.vampire V.iscloaking = !V.iscloaking update_name() - to_chat(usr, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.") + to_chat(user, "You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.") /obj/effect/proc_holder/spell/vampire/bats name = "Summon Bats (75)" @@ -389,9 +389,9 @@ perform(locs) -/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets) +/obj/effect/proc_holder/spell/vampire/bats/cast(list/targets, mob/user = usr) for(var/T in targets) - new /mob/living/simple_animal/hostile/scarybat(T, usr) + new /mob/living/simple_animal/hostile/scarybat(T, user) /obj/effect/proc_holder/spell/vampire/self/jaunt name = "Mist Form (30)" @@ -402,12 +402,12 @@ required_blood = 30 var/jaunt_duration = 50 //in deciseconds -/obj/effect/proc_holder/spell/vampire/self/jaunt/cast() - if(usr.buckled) - usr.buckled.unbuckle_mob() +/obj/effect/proc_holder/spell/vampire/self/jaunt/cast(list/targets, mob/user = usr) + if(user.buckled) + user.buckled.unbuckle_mob() spawn(0) - var/mob/living/U = usr - var/originalloc = get_turf(usr.loc) + var/mob/living/U = user + var/originalloc = get_turf(user.loc) var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc) animation.name = "water" @@ -418,34 +418,34 @@ animation.layer = 5 animation.master = holder U.ExtinguishMob() - if(usr.buckled) - usr.buckled.unbuckle_mob() + if(user.buckled) + user.buckled.unbuckle_mob() flick("liquify", animation) - usr.forceMove(holder) - usr.client.eye = holder + user.forceMove(holder) + user.client.eye = holder var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread() steam.set_up(10, 0, originalloc) steam.start() sleep(jaunt_duration) - var/mobloc = get_turf(usr.loc) + var/mobloc = get_turf(user.loc) if(get_area(mobloc) == /area/security/armoury/gamma) - to_chat(usr, "A strange energy repels you!") + to_chat(user, "A strange energy repels you!") mobloc = originalloc animation.loc = mobloc steam.location = mobloc steam.start() - usr.canmove = 0 + user.canmove = 0 sleep(20) flick("reappear",animation) sleep(5) - if(!usr.Move(mobloc)) + if(!user.Move(mobloc)) for(var/direction in list(1,2,4,8,5,6,9,10)) var/turf/T = get_step(mobloc, direction) if(T) - if(usr.Move(T)) + if(user.Move(T)) break - usr.canmove = 1 - usr.client.eye = usr + user.canmove = 1 + user.client.eye = user qdel(animation) qdel(holder) @@ -494,27 +494,27 @@ perform(turfs) -/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets) +/obj/effect/proc_holder/spell/vampire/shadowstep/cast(list/targets, mob/user = usr) if(usr.buckled) - usr.buckled.unbuckle_mob() + user.buckled.unbuckle_mob() spawn(0) var/turf/picked = pick(targets) if(!picked || !isturf(picked)) return - var/mob/living/U = usr + var/mob/living/U = user U.ExtinguishMob() - if(usr.buckled) - usr.buckled.unbuckle_mob() - var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(usr)) - animation.name = usr.name + if(user.buckled) + user.buckled.unbuckle_mob() + var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(user)) + animation.name = user.name animation.density = 0 animation.anchored = 1 - animation.icon = usr.icon + animation.icon = user.icon animation.alpha = 127 animation.layer = 5 //animation.master = src - usr.forceMove(picked) + user.forceMove(picked) spawn(10) qdel(animation) diff --git a/code/modules/mining/lavaland/colossus_loot.dm b/code/modules/mining/lavaland/colossus_loot.dm index 6e18a4831e3..5df742bd9f6 100644 --- a/code/modules/mining/lavaland/colossus_loot.dm +++ b/code/modules/mining/lavaland/colossus_loot.dm @@ -211,7 +211,7 @@ NewTerrainFloors = /turf/simulated/floor/mineral/abductor NewTerrainWalls = /turf/simulated/wall/mineral/abductor NewTerrainChairs = /obj/structure/stool/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline. - NewTerrainTables = /obj/machinery/optable/abductor + NewTerrainTables = /obj/structure/table/abductor /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) if(..()) @@ -239,7 +239,9 @@ qdel(Stuff) continue if(istype(Stuff, /obj/structure/table) && NewTerrainTables) - new NewTerrainTables(Stuff.loc) + var/obj/structure/table/Original = Stuff + var/obj/structure/table/T = new NewTerrainTables(Original.loc) + T.dir = Original.dir qdel(Stuff) continue affected_targets += A diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 39dae4c0746..620c1854e73 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -25,7 +25,7 @@ var/global/list/boo_phrases=list( invocation_type = "none" range = 1 // Or maybe 3? -/obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/boo/cast(list/targets, mob/user = usr) for(var/turf/T in targets) for(var/atom/A in T.contents) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index fa7dadfebcb..a0ec23eae12 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -7,7 +7,10 @@ default_language = "Galactic Common" unarmed_type = /datum/unarmed_attack/claws + darksight = 8 + + ignored_by = list(/mob/living/simple_animal/hostile/faithless) blood_color = "#CCCCCC" flesh_color = "#AAAAAA" @@ -17,6 +20,7 @@ flags = NO_BLOOD | NO_BREATHE | RADIMMUNE virus_immune = 1 + dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG suicide_messages = list( @@ -24,14 +28,46 @@ "is jamming their claws into their eye sockets!", "is twisting their own neck!", "is staring into the closest light source!") + + var/grant_vision_toggle = 1 + var/datum/action/innate/shadow/darkvision/vision_toggle + +/datum/action/innate/shadow/darkvision //Darkvision toggle so shadowpeople can actually see where darkness is + name = "Toggle Darkvision" + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_default" + button_icon_state = "blind" + +/datum/action/innate/shadow/darkvision/Activate() + var/mob/living/carbon/human/H = owner + if(!H.vision_type) + H.vision_type = new /datum/vision_override/nightvision + to_chat(H, "You adjust your vision to pierce the darkness.") + else + H.vision_type = null + to_chat(H, "You adjust your vision to recognize the shadows.") + +/datum/species/shadow/grant_abilities(var/mob/living/carbon/human/H) + . = ..() + if(grant_vision_toggle) + vision_toggle = new + vision_toggle.Grant(H) + +/datum/species/shadow/remove_abilities(var/mob/living/carbon/human/H) + . = ..() + if(grant_vision_toggle && vision_toggle) + H.vision_type = null + vision_toggle.Remove(H) /datum/species/shadow/handle_life(var/mob/living/carbon/human/H) var/light_amount = 0 if(isturf(H.loc)) var/turf/T = H.loc - light_amount = T.get_lumcount()*10 + light_amount = T.get_lumcount() * 10 if(light_amount > 2) //if there's enough light, start dying H.take_overall_damage(1,1) + H.throw_alert("lightexposure", /obj/screen/alert/lightexposure) else if(light_amount < 2) //heal in the dark - H.heal_overall_damage(1,1) \ No newline at end of file + H.heal_overall_damage(1,1) + H.clear_alert("lightexposure") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 33aa58b94d4..b025904c92d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -47,6 +47,7 @@ var/siemens_coeff = 1 //base electrocution coefficient var/darksight = 2 + var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. @@ -76,6 +77,8 @@ var/ventcrawler = 0 //Determines if the mob can go through the vents. var/has_fine_manipulation = 1 // Can use small items. + + var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here. @@ -154,7 +157,6 @@ "l_foot" = list("path" = /obj/item/organ/external/foot), "r_foot" = list("path" = /obj/item/organ/external/foot/right) ) - var/cyborg_type = "Cyborg" var/list/proc/species_abilities = list() /datum/species/New() diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 924a7c03bf4..ebaefe02c81 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -804,8 +804,8 @@ return ..() /datum/species/diona/handle_life(var/mob/living/carbon/human/H) - var/rads = H.radiation/25 - H.radiation = Clamp(H.radiation - rads, 0, 100) + var/rads = H.radiation / 25 + H.apply_effect(-rads,IRRADIATE,0) H.nutrition += rads H.adjustBruteLoss(-(rads)) H.adjustOxyLoss(-(rads)) @@ -814,18 +814,23 @@ var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(H.loc)) //else, there's considered to be no light var/turf/T = H.loc - light_amount = min(T.get_lumcount()*10, 5) //hardcapped so it's not abused by having a ton of flashlights + light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights H.nutrition += light_amount H.traumatic_shock -= light_amount if(H.nutrition > 450) H.nutrition = 450 + + if(light_amount > 0) + H.clear_alert("nolight") + else + H.throw_alert("nolight", /obj/screen/alert/nolight) if((light_amount >= 5) && !H.suiciding) //if there's enough light, heal + H.adjustBruteLoss(-(light_amount/2)) H.adjustFireLoss(-(light_amount/4)) H.adjustOxyLoss(-(light_amount)) - if(H.nutrition < 200) H.take_overall_damage(10,0) H.traumatic_shock++ diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm index 60e1cd82654..fac41aa66f7 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -147,69 +147,69 @@ action_icon_state = "spell_greytide" var/recruiting = 0 -/obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/recruit/cast(list/targets,mob/living/user = usr) for(var/mob/living/carbon/human/target in targets) var/obj/item/organ/external/head/head_organ = target.get_organ("head") if(ticker.mode.greyshirts.len >= 3) - to_chat(usr, "You have already recruited the maximum number of henchmen.") - if(!in_range(usr, target)) - to_chat(usr, "You need to be closer to enthrall [target].") + to_chat(user, "You have already recruited the maximum number of henchmen.") + if(!in_range(user, target)) + to_chat(user, "You need to be closer to enthrall [target].") charge_counter = charge_max return if(!target.ckey) - to_chat(usr, "The target has no mind.") + to_chat(user, "The target has no mind.") charge_counter = charge_max return if(target.stat) - to_chat(usr, "The target must be conscious.") + to_chat(user, "The target must be conscious.") charge_counter = charge_max return if(!ishuman(target)) - to_chat(usr, "You can only recruit humans.") + to_chat(user, "You can only recruit humans.") charge_counter = charge_max return if(target.mind.assigned_role != "Civilian") - to_chat(usr, "You can only recruit Civilians.") + to_chat(user, "You can only recruit Civilians.") if(recruiting) - to_chat(usr, "You are already recruiting!") + to_chat(user, "You are already recruiting!") charge_counter = charge_max return recruiting = 1 - to_chat(usr, "This target is valid. You begin the recruiting process.") - to_chat(target, "[usr] focuses in concentration. Your head begins to ache.") + to_chat(user, "This target is valid. You begin the recruiting process.") + to_chat(target, "[user] focuses in concentration. Your head begins to ache.") for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) - to_chat(usr, "You begin by introducing yourself and explaining what you're about.") - usr.visible_message("[usr]'s introduces himself and explains his plans.") + to_chat(user, "You begin by introducing yourself and explaining what you're about.") + user.visible_message("[user]'s introduces himself and explains his plans.") if(2) - to_chat(usr, "You begin the recruitment of [target].") - usr.visible_message("[usr] leans over towards [target], whispering excitedly as he gives a speech.") - to_chat(target, "You feel yourself agreeing with [usr], and a surge of loyalty begins building.") + to_chat(user, "You begin the recruitment of [target].") + user.visible_message("[user] leans over towards [target], whispering excitedly as he gives a speech.") + to_chat(target, "You feel yourself agreeing with [user], and a surge of loyalty begins building.") target.Weaken(12) sleep(20) if(isloyal(target)) - to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.") - usr.visible_message("[usr] stops talking for a moment, then moves back away from [target].") + to_chat(user, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.") + user.visible_message("[user] stops talking for a moment, then moves back away from [target].") to_chat(target, "Your mindshield implant activates, protecting you from conversion.") return if(3) - to_chat(usr, "You begin filling out the application form with [target].") - usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target].") - to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman.")//Ow the edge + to_chat(user, "You begin filling out the application form with [target].") + user.visible_message("[user] pulls out a pen and paper and begins filling an application form with [target].") + to_chat(target, "You are being convinced by [user] to fill out an application form to become a henchman.")//Ow the edge - if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant - to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target].") - to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void.") + if(!do_mob(user, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant + to_chat(user, "The enrollment process has been interrupted - you have lost the attention of [target].") + to_chat(target, "You move away and are no longer under the charm of [user]. The application form is null and void.") recruiting = 0 return recruiting = 0 - to_chat(usr, "You have recruited [target] as your henchman!") - to_chat(target, "You have decided to enroll as a henchman for [usr]. You are now part of the feared 'Greyshirts'.") - to_chat(target, "You must follow the orders of [usr], and help him succeed in his dastardly schemes.") - to_chat(target, "You may not harm other Greyshirt or [usr]. However, you do not need to obey other Greyshirts.") + to_chat(user, "You have recruited [target] as your henchman!") + to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.") + to_chat(target, "You must follow the orders of [user], and help him succeed in his dastardly schemes.") + to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.") ticker.mode.greyshirts += target.mind target.set_species("Human") head_organ.h_style = "Bald" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 62babcaa1bd..1df7348a839 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -176,6 +176,11 @@ if(faction_check && !attack_same) return 0 return 1 + + if(ishuman(the_target)) + var/mob/living/carbon/human/H = the_target + if(is_type_in_list(src, H.species.ignored_by)) + return 0 if(istype(the_target, /obj/mecha)) var/obj/mecha/M = the_target diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index cb48c63b66f..6b90853c3d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -163,7 +163,7 @@ clothes_req = 0 range = 14 -/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr) for(var/turf/T in targets) for(var/obj/machinery/light/L in T) L.flicker() @@ -179,9 +179,9 @@ clothes_req = 0 range = 10 -/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/blindness/cast(list/targets, mob/user = usr) for(var/mob/living/L in living_mob_list) - if(L == usr) + if(L == user) continue var/turf/T = get_turf(L.loc) if(T && T in targets) @@ -200,7 +200,7 @@ range = -1 include_user = 1 -/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets) +/obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets, mob/user = usr) for(var/mob/living/target in targets) if(target.see_invisible == SEE_INVISIBLE_LIVING) diff --git a/code/modules/mob/spirit/mask/mask.dm b/code/modules/mob/spirit/mask/mask.dm index 2b907ca7f5a..d4811975eb6 100644 --- a/code/modules/mob/spirit/mask/mask.dm +++ b/code/modules/mob/spirit/mask/mask.dm @@ -125,17 +125,17 @@ invocation_type = "none" range = 0 -/obj/effect/proc_holder/spell/aoe_turf/blood_speech/cast(list/targets) - var/input = stripped_input(usr, "Please choose a message to tell your acolytes.", "Voice of Blood", "") +/obj/effect/proc_holder/spell/aoe_turf/blood_speech/cast(list/targets, mob/user = usr) + var/input = stripped_input(user, "Please choose a message to tell your acolytes.", "Voice of Blood", "") if(!input) - revert_cast(usr) - cult_log("[key_name_admin(usr)]says : [input]") - flicker_mask(usr) + revert_cast(user) + cult_log("[key_name_admin(user)]says : [input]") + flicker_mask(user) for(var/datum/mind/H in ticker.mode.cult) if(H.current) - to_chat(H.current, "[usr.name]: [input]") + to_chat(H.current, "[user.name]: [input]") for(var/mob/spirit/spirit in spirits) - to_chat(spirit, "[usr.name]: [input]") + to_chat(spirit, "[user.name]: [input]") /obj/effect/proc_holder/spell/aoe_turf/shatter_lights @@ -149,11 +149,11 @@ invocation_type = "none" range = 0 -/obj/effect/proc_holder/spell/aoe_turf/shatter_lights/cast(list/targets) - cult_log("[key_name_admin(usr)] used Spread Shadows.") - flicker_mask(usr) +/obj/effect/proc_holder/spell/aoe_turf/shatter_lights/cast(list/targets, mob/user = usr) + cult_log("[key_name_admin(user)] used Spread Shadows.") + flicker_mask(user) spawn(0) - for(var/area/A in range(3,get_turf(usr))) + for(var/area/A in range(3,get_turf(user))) for(var/obj/machinery/light/L in A) L.on = 1 L.broken() @@ -189,25 +189,25 @@ "Construct"="construct") -/obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman/cast(list/targets) +/obj/effect/proc_holder/spell/aoe_turf/conjure/create_talisman/cast(list/targets, mob/user = usr) var/talisman = input("Pick a talisman type", "Talisman", null, null) as null|anything in talismans var/imbue_value = talismans[talisman] if(!talisman) - to_chat(usr, "You choose not to create a talisman.") - revert_cast(usr) + to_chat(user, "You choose not to create a talisman.") + revert_cast(user) return - cult_log("[key_name_admin(usr,0)] created a talisman of type [talisman].") - flicker_mask(usr) + cult_log("[key_name_admin(user,0)] created a talisman of type [talisman].") + flicker_mask(user) switch(talisman) if("Teleport") var/target_rune = input("Pick a teleport target", "Teleport Rune", null, null) as null|anything in engwords if(!target_rune) - to_chat(usr, "You choose not to create a talisman.") - revert_cast(usr) + to_chat(user, "You choose not to create a talisman.") + revert_cast(user) return summon_type = list(/obj/item/weapon/paper/talisman) newVars = list("imbue" = "[target_rune]", "info" = "[target_rune]") diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 9cadad8834fa8fd11fc3c21ac2d7e9292eea17f6..7cc23dca587afba6cefc48f28de59b60d4595d68 100644 GIT binary patch delta 15544 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 delta 14577 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