From 4ab423c3e32ef1f18f96e8535a0ab2c39c2dcd9b Mon Sep 17 00:00:00 2001
From: MrCastmer <125900379+MrCastmer@users.noreply.github.com>
Date: Fri, 12 Jan 2024 11:52:47 +0300
Subject: [PATCH 1/3] wip
not final version btw
---
code/game/mecha/mecha.dm | 1 +
code/game/mecha/mecha_actions.dm | 5 +
.../modules/mob/living/silicon/robot/robot.dm | 2 +-
.../spells/spell_types/jaunt/shadow_walk.dm | 7 +
.../code/_onclick/hud/alert.dm | 5 +
.../code/datums/diseases/transformation.dm | 80 ++++
.../shadowling/ascendant_shadowling.dm | 77 ++++
.../shadowling/shadowling items.dm | 5 +
.../human/species_types/shadowpeople.dm | 242 +++++++++++
.../chemistry/reagents/other_reagents.dm | 22 +
.../modules/surgery/organs/shadow_organs.dm | 24 ++
.../icons/mob/actions/actions_spells.dmi | Bin 0 -> 406 bytes
modular_dripstation/icons/mob/alert.dmi | Bin 0 -> 419 bytes
.../mob/inhands/antag/lighteater_lefthand.dmi | Bin 0 -> 485 bytes
.../inhands/antag/lighteater_righthand.dmi | Bin 0 -> 484 bytes
modular_dripstation/includes.dm | 10 +-
yogstation.dme | 4 +-
.../game/gamemodes/shadowling/shadowling.dm | 32 +-
.../shadowling/ascendant_shadowling.dm | 3 +-
.../antagonists/shadowling/shadowling.dm | 3 +
.../shadowling/shadowling_abilities.dm | 388 +++++++++++++-----
.../special_shadowling_abilities.dm | 18 +-
.../modules/antagonists/shadowling/thrall.dm | 48 ++-
yogstation/icons/mob/mutant_bodyparts.dmi | Bin 3920 -> 2425 bytes
24 files changed, 832 insertions(+), 144 deletions(-)
create mode 100644 modular_dripstation/code/_onclick/hud/alert.dm
create mode 100644 modular_dripstation/code/datums/diseases/transformation.dm
create mode 100644 modular_dripstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
create mode 100644 modular_dripstation/code/modules/antagonists/shadowling/shadowling items.dm
create mode 100644 modular_dripstation/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
create mode 100644 modular_dripstation/code/modules/reagents/chemistry/reagents/other_reagents.dm
create mode 100644 modular_dripstation/code/modules/surgery/organs/shadow_organs.dm
create mode 100644 modular_dripstation/icons/mob/actions/actions_spells.dmi
create mode 100644 modular_dripstation/icons/mob/alert.dmi
create mode 100644 modular_dripstation/icons/mob/inhands/antag/lighteater_lefthand.dmi
create mode 100644 modular_dripstation/icons/mob/inhands/antag/lighteater_righthand.dmi
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 8e6e98fd0169..33f4d50cb109 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -54,6 +54,7 @@
var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference
var/datum/effect_system/spark_spread/spark_system = new
var/lights = FALSE
+ var/lamp_cooldown = 0 //stores time of cooldown to force disabling. dripstation edit
var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference
var/completely_disabled = FALSE //stops the mech from doing anything
var/omnidirectional_attacks = FALSE //lets mech shoot anywhere, not just in front of it
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index bebbc829af15..815d8dfff7f0 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -112,6 +112,11 @@
/datum/action/innate/mecha/mech_toggle_lights/Activate()
if(!owner || !chassis || chassis.occupant != owner)
return
+ if(chassis.lamp_cooldown > world.time) //dripstation edit
+ chassis.set_light_on(chassis.lights) //dripstation edit
+ button_icon_state = "mech_lights_off" //dripstation edit
+ chassis.occupant_message("Something prevents toggling.") //dripstation edit
+ return //dripstation edit
chassis.lights = !chassis.lights
if(chassis.lights)
button_icon_state = "mech_lights_on"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 22bb114f4910..711acdb52975 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -835,7 +835,7 @@
*/
/mob/living/silicon/robot/proc/toggle_headlamp(turn_off = FALSE, update_color = FALSE)
//if both lamp is enabled AND the update_color flag is on, keep the lamp on. Otherwise, if anything listed is true, disable the lamp.
- if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || stat || low_power_mode))
+ if(!(update_color && lamp_enabled) && (turn_off || lamp_enabled || update_color || !lamp_functional || stat || low_power_mode || (lamp_cooldown > world.time))) //dripstation edit
if(lamp_functional && stat != DEAD)
set_light_on(TRUE) //If the lamp isn't broken and borg isn't dead, doomsday borgs cannot disable their light fully.
set_light_color("#FF0000") //This should only matter for doomsday borgs, as any other time the lamp will be off and the color not seen
diff --git a/code/modules/spells/spell_types/jaunt/shadow_walk.dm b/code/modules/spells/spell_types/jaunt/shadow_walk.dm
index 1b36a0e69501..a76e9f243368 100644
--- a/code/modules/spells/spell_types/jaunt/shadow_walk.dm
+++ b/code/modules/spells/spell_types/jaunt/shadow_walk.dm
@@ -23,6 +23,13 @@
return FALSE
if(is_jaunting(owner))
return TRUE
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ if(H.on_fire) //dripstation edit start
+ owner.visible_message(span_boldwarning("[owner]'s body shudders and flickers into darkness for a moment!"),
+ span_shadowling("The void rejects the flames engulfing your body, throwing you back into the burning light!"))
+ H.AdjustKnockdown(30)
+ return FALSE //dripstation edit end
var/turf/cast_turf = get_turf(owner)
if(cast_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD)
if(feedback)
diff --git a/modular_dripstation/code/_onclick/hud/alert.dm b/modular_dripstation/code/_onclick/hud/alert.dm
new file mode 100644
index 000000000000..bff14e67e37f
--- /dev/null
+++ b/modular_dripstation/code/_onclick/hud/alert.dm
@@ -0,0 +1,5 @@
+/atom/movable/screen/alert/lightexposure
+ name = "Light Exposure"
+ desc = "You're exposed to light."
+ icon_state = "lightexposure"
+ icon = 'modular_dripstation/icons/mob/alert.dmi'
\ No newline at end of file
diff --git a/modular_dripstation/code/datums/diseases/transformation.dm b/modular_dripstation/code/datums/diseases/transformation.dm
new file mode 100644
index 000000000000..f6c2e062701f
--- /dev/null
+++ b/modular_dripstation/code/datums/diseases/transformation.dm
@@ -0,0 +1,80 @@
+#define LIGHT_DAM_THRESHOLD 0.25
+///////////////////////////////// SHADOW MORPHISM /////////////////////////////////////
+// Shadow Morphism, also known as curse of darkness
+/datum/disease/transformation/shadow
+ name = "Shadow Morphism"
+ spread_text = "Shadowlings"
+ cure_text = "Sunshine. Rezadone" //Uh oh
+ cures = list(/datum/reagent/medicine/rezadone)
+ cure_chance = 6
+ stage_prob = 2
+ agent = "Pure Darkness"
+ desc = "Shadow curse"
+ severity = DISEASE_SEVERITY_BIOHAZARD
+ visibility_flags = 0
+ stage1 = list("You feel... You feel chill.")
+ stage2 = list("A cruel sense of cold overcomes you.")
+ stage3 = list(span_danger("You can't feel your eyes!"), span_danger("You feel strange anger at the light."))
+ stage4 = list(span_danger("You can't feel your eyes. It does not bother you anymore."), span_danger("You forget how it feels like to bask in the sun."))
+ stage5 = list("You feel the shadows invade your skin, leaping into the center of your chest! Now you're pure darkness!")
+ new_form = /mob/living/carbon/human/species/shadow
+
+/datum/disease/transformation/shadow/stage_act()
+ ..()
+ var/turf/T = affected_mob.loc
+ var/light_amount = T.get_lumcount()
+ switch(stage)
+ if(1)
+ if (prob(4))
+ to_chat(affected_mob, "Hmm. Must have been the wind.")
+ if (light_amount > LIGHT_DAM_THRESHOLD && prob(10))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/medicine/rezadone = 3))
+ if(2)
+ if (prob(8))
+ affected_mob.emote(pick("pale","shiver"))
+ if (light_amount > LIGHT_DAM_THRESHOLD && prob(10))
+ to_chat(affected_mob, span_danger("You feel a stabbing pain in your heart."))
+ affected_mob.Unconscious(50)
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/medicine/rezadone = 5))
+ if (light_amount < LIGHT_DAM_THRESHOLD && prob(10))
+ to_chat(affected_mob, span_danger("You feel fucking frostoil in your veins."))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/consumable/frostoil = 5))
+ if(3)
+ if (prob(6))
+ affected_mob.say(pick("Kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee...", "Mmyyy eeyyeesss..."), forced = "shadow transformation")
+ affected_mob.emote(pick("pale","shiver"))
+ if(light_amount > LIGHT_DAM_THRESHOLD && prob(30))
+ affected_mob.throw_alert("lightexposure", /atom/movable/screen/alert/lightexposure)
+ affected_mob.adjustCloneLoss(3)
+ affected_mob.adjustFireLoss(1)
+ to_chat(affected_mob, span_danger("You feel your skin turns to dust!"))//Message spam to say "GET THE FUCK OUT"
+ affected_mob.playsound_local(get_turf(affected_mob), 'sound/weapons/sear.ogg', 150, 1, pressure_affected = FALSE)
+ if(light_amount < LIGHT_DAM_THRESHOLD)
+ affected_mob.clear_alert("lightexposure")
+ if (light_amount < LIGHT_DAM_THRESHOLD && prob(20))
+ to_chat(affected_mob, span_danger("You feel fucking frostoil in your veins."))
+ affected_mob.reagents.add_reagent_list(list(/datum/reagent/consumable/frostoil = 5))
+ if(4)
+ if(light_amount > LIGHT_DAM_THRESHOLD)
+ affected_mob.throw_alert("lightexposure", /atom/movable/screen/alert/lightexposure)
+ affected_mob.adjustCloneLoss(5)
+ affected_mob.adjustFireLoss(2)
+ to_chat(affected_mob, span_danger("You feel your skin turns to dust!"))//Message spam to say "GET THE FUCK OUT"
+ affected_mob.playsound_local(get_turf(affected_mob), 'sound/weapons/sear.ogg', 150, 1, pressure_affected = FALSE)
+ if(light_amount < LIGHT_DAM_THRESHOLD)
+ affected_mob.adjustCloneLoss(-1)
+ affected_mob.adjustFireLoss(-2)
+ affected_mob.clear_alert("lightexposure")
+ if(affected_mob.cloneloss >= 100)
+ affected_mob.visible_message(span_danger("[affected_mob] skin turns to dust!"), "Your skin turns to dust!")
+ affected_mob.dust()
+ if(affected_mob.reagents.has_reagent(/datum/reagent/consumable/frostoil))
+ affected_mob.reagents.remove_reagent(/datum/reagent/consumable/frostoil)
+ to_chat(affected_mob, span_notice("You feel warmer... It feels good."))
+ affected_mob.bodytemperature = 310
+ if(affected_mob.reagents.has_reagent(/datum/reagent/medicine/rezadone))
+ affected_mob.reagents.remove_reagent(/datum/reagent/medicine/rezadone)
+ to_chat(affected_mob, span_notice("Nothing can help you at this point."))
+ if(5)
+ SEND_SOUND(affected_mob, sound('sound/effects/ghost.ogg'))
+ do_disease_transformation(affected_mob)
\ No newline at end of file
diff --git a/modular_dripstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm b/modular_dripstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
new file mode 100644
index 000000000000..9c78b4b0fafc
--- /dev/null
+++ b/modular_dripstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
@@ -0,0 +1,77 @@
+/mob/living/simple_animal/ascendant_shadowling
+ name = "ascendant shadowling"
+ desc = "HOLY SHIT RUN THE FUCK AWAY- RAAAAAAA!"
+ icon = 'yogstation/icons/mob/mob.dmi'
+ icon_state = "shadowling_ascended"
+ icon_living = "shadowling_ascended"
+ verb_say = "telepathically thunders"
+ verb_ask = "telepathically thunders"
+ verb_exclaim = "telepathically thunders"
+ verb_yell = "telepathically thunders"
+ force_threshold = 40 //INFINITY previously couldn`t die by normal means, now just very robast. They are halfway gods, u know.
+ damage_coeff = list(BRUTE = -0.5, BURN = 0.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
+ health = 1000
+ maxHealth = 1000 // Like maybe fire 40 times with pulse or do something crasy to stop them.
+ del_on_death = 1
+ speed = 0
+ see_in_dark = 9
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ response_help = "pokes"
+ response_disarm = "flails at"
+ response_harm = "flails at"
+ harm_intent_damage = 0
+ armour_penetration = 50 //Godlike attacks with claws of pure darkness
+ melee_damage_lower = 40 //Was 60, then 160, nerfed. Giving a chance to assistents and deathsquad members.
+ melee_damage_upper = 100 //Was 160, increased penetration for chadness (previously attacks do 40 damage to deathsquads)
+ attacktext = "rends"
+ attack_sound = 'sound/weapons/slash.ogg'
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+ environment_smash = 3
+ faction = list("faithless")
+ var/obj/item/gps/internal
+ var/internal_type = /obj/item/gps/internal/ascendant_shadowling
+ speech_span = SPAN_REALLYBIG //screw it someone else can figure out how to put both SPAN_YELL and SPAN_REALLYBIG on a speech_span later
+
+/mob/living/simple_animal/ascendant_shadowling/Initialize()
+ . = ..()
+ LoadComponent(/datum/component/walk)
+ internal = new internal_type(src)
+
+/mob/living/simple_animal/ascendant_shadowling/Destroy()
+ QDEL_NULL(internal)
+ . = ..()
+
+/mob/living/simple_animal/ascendant_shadowling/death(gibbed)
+ if(!gibbed)
+ send_to_playing_players(span_shadowling(" Shadow Signature Silently Sinks Into Void, Fleeing The Battle. Regroup. Reassemble. Evil Is Timeless, After All... "))
+ var/X
+ var/mob/M = X
+ for(X in GLOB.alive_mob_list)
+ M = X
+ to_chat(M, span_notice("You feel a woosh as newly released energy temporarily distorts space itself..."))
+ ..()
+
+/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(movement_dir = 0)
+ return TRUE //copypasta from carp code
+
+/mob/living/simple_animal/ascendant_shadowling/ex_act(severity)
+ return FALSE //You think an ascendant can be hurt by bombs? HA
+
+/obj/item/gps/internal/ascendant_shadowling
+ icon_state = null
+ gpstag = "Shadowy Signal"
+ desc = "Shadowy?.. Oh god, oh fuck..."
+ invisibility = 100
+
+/mob/living/simple_animal/ascendant_shadowling/singularity_act()
+ to_chat(src, " SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
+ H.take_overall_damage(1,1, 0, BODYPART_ORGANIC)
+ H.take_overall_damage(0,1, 0, BODYPART_ORGANIC)
+ H.adjustCloneLoss(1)
+ H.throw_alert("lightexposure", /atom/movable/screen/alert/lightexposure)
+ if(H.stat != DEAD)
+ to_chat(H, span_userdanger("The light burns you!")) //Message spam to say "GET THE FUCK OUT"
+ H.playsound_local(get_turf(H), 'sound/weapons/sear.ogg', 150, 1, pressure_affected = FALSE)
+ else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark
+ H.heal_overall_damage(1,1, 0, BODYPART_ORGANIC)
+ H.adjustCloneLoss(-1)
+ H.clear_alert("lightexposure")
+
+/datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ C.draw_yogs_parts(TRUE)
+ . = ..()
+
+/datum/species/shadow/ling/on_species_loss(mob/living/carbon/human/C)
+ C.draw_yogs_parts(FALSE)
+
+
+//nightmare
+/datum/species/shadow/nightmare
+ name = "Nightmare"
+ limbs_id = "l_shadowling"
+ inherent_traits = list(TRAIT_NOPULSE,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
+
+/datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ C.draw_yogs_parts(TRUE)
+ . = ..()
+ to_chat(C, "[info_text]")
+
+ C.fully_replace_character_name("[C.real_name]","[pick(GLOB.nightmare_names)]") // Yogs -- fixes nightmares not having special spooky names. this proc takes the old name first, and *THEN* the new name!
+
+/datum/species/shadow/ling/on_species_loss(mob/living/carbon/human/C)
+ C.draw_yogs_parts(FALSE)
+
+
+//heart
+/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target)
+ if(M != user)
+ return ..()
+ user.visible_message(span_warning("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!"), \
+ span_danger("[src] feels unnaturally cold in your hands. You raise [src] your mouth and devour it!"))
+ playsound(user, 'sound/magic/demon_consume.ogg', 50, 1)
+ Insert(user)
+
+/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0)
+ ..()
+ if(special != HEART_SPECIAL_SHADOWIFY)
+ M.visible_message(span_warning("Blood erupts from [M]'s arm as it reforms into a weapon!"), \
+ span_userdanger("Icy blood pumps through your veins as your arm reforms itself!"))
+ blade = new/obj/item/light_eater
+ M.put_in_hands(blade)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/organ/heart/nightmare/process()
+ if(QDELETED(owner) || owner.stat != DEAD)
+ respawn_progress = 0
+ return
+ var/turf/T = get_turf(owner)
+ if(istype(T))
+ var/light_amount = T.get_lumcount()
+ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
+ respawn_progress++
+ playsound(owner,'sound/effects/singlebeat.ogg',40,1)
+ if(respawn_progress >= HEART_RESPAWN_THRESHHOLD)
+ owner.revive(full_heal = TRUE)
+ if(!(owner.dna.species.id == "shadow" || owner.dna.species.id == "nightmare" || owner.dna.species.id == "shadowling" || owner.dna.species.id == "l_shadowling"))
+ var/mob/living/carbon/old_owner = owner
+ Remove(owner, HEART_SPECIAL_SHADOWIFY)
+ old_owner.set_species(/datum/species/shadow)
+ Insert(old_owner, HEART_SPECIAL_SHADOWIFY)
+ to_chat(owner, span_userdanger("You feel the shadows invade your skin, leaping into the center of your chest! You're alive!"))
+ SEND_SOUND(owner, sound('sound/effects/ghost.ogg'))
+ owner.visible_message(span_warning("[owner] staggers to [owner.p_their()] feet!"))
+ playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, 1)
+ respawn_progress = 0
+
+//Weapon
+/obj/item/light_eater
+ desc = "A grotesque blade made out of bone and pure night that cleaves through people as a hot knife through butter."
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ lefthand_file = 'modular_dripstation/icons/mob/inhands/antag/lighteater_lefthand.dmi'
+ righthand_file = 'modular_dripstation/icons/mob/inhands/antag/lighteater_righthand.dmi'
+
+/obj/item/light_eater/Initialize(mapload,silent)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
+ AddComponent(/datum/component/butchering, 80, 70)
+
+/obj/item/light_eater/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(isopenturf(AM)) //So you can actually melee with it
+ return
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(isethereal(AM))
+ AM.emp_act(EMP_LIGHT)
+ else if(iscyborg(AM))
+ var/mob/living/silicon/robot/borg = AM
+ if(borg.lamp_enabled)
+ borg.smash_headlamp()
+ else if(ishuman(AM))
+ for(var/obj/item/O in AM.get_all_contents())
+ if(O.light_range && O.light_power)
+ disintegrate(O)
+ if(L.pulling && L.pulling.light_range && isitem(L.pulling))
+ disintegrate(L.pulling)
+ else if(isitem(AM))
+ var/obj/item/I = AM
+ if(I.light_range && I.light_power)
+ disintegrate(I)
+
+ if(istype(AM, /obj/structure/table))
+ var/obj/structure/table/T = AM
+ T.deconstruct(FALSE)
+
+ else if(istype(AM, /obj/machinery/computer))
+ var/obj/machinery/computer/C = AM
+ C.attack_alien(user) //muh copypasta
+
+ else if(istype(AM, /obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/A = AM
+
+ if((!A.requiresID() || A.allowed(user)) && A.hasPower()) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message, power requirement is so this doesn't stop unpowered doors from being pried open if you have access
+ return
+
+ if(A.locked)
+ to_chat(user, span_warning("The airlock's bolts prevent it from being forced!"))
+ return
+ if(A.welded)
+ to_chat(user, span_warning("The airlock is welded shut, it won't budge!"))
+ return
+
+ if(A.hasPower())
+ user.visible_message(span_warning("[user] jams [src] into the airlock and starts prying it open!"), span_warning("We start forcing the airlock open."), //yogs modified description
+ span_italics("You hear a metal screeching sound."))
+ playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, 1)
+ if(!do_after(user, 6 SECONDS, A))
+ return
+ //user.say("Heeeeeeeeeerrre's Johnny!")
+ user.visible_message(span_warning("[user] forces the airlock to open with [user.p_their()] [src]!"), span_warning("We force the airlock to open."), //yogs modified description
+ span_italics("You hear a metal screeching sound."))
+ A.open(2)
+
+
+
+//actual shadowlings
+/datum/species/shadow/ling
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES)
+ inherent_traits = list(TRAIT_NOPULSE, TRAIT_NOGUNS, TRAIT_COLDBLOODED, TRAIT_STABLELIVER, TRAIT_STABLEHEART, TRAIT_SLEEPIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE, TRAIT_NOBREATH, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_PIERCEIMMUNE)
+ no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_EYES, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_ID, ITEM_SLOT_SUITSTORE)
+ punchdamagelow = 11 //shadow claws
+ punchdamagehigh = 20 //shadow claws
+ punchstunthreshold = 18 //shadow claws 30% chance to stun
+
+/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H)
+ H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry
+ if(isturf(H.loc))
+ var/turf/T = H.loc
+ var/light_amount = T.get_lumcount()
+ if(light_amount > LIGHT_DAM_THRESHOLD) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes
+ H.adjustCloneLoss(LIGHT_DAMAGE_TAKEN)
+ H.throw_alert("lightexposure", /atom/movable/screen/alert/lightexposure)
+ if(H.stat != DEAD)
+ to_chat(H, span_userdanger("The light burns you!")) //Message spam to say "GET THE FUCK OUT"
+ H.playsound_local(get_turf(H), 'sound/weapons/sear.ogg', 150, 1, pressure_affected = FALSE)
+ else if (light_amount < LIGHT_HEAL_THRESHOLD && !istype(H.loc, /obj/effect/dummy/phased_mob/shadowling)) //Can't heal while jaunting
+ H.heal_overall_damage(5,5)
+ H.adjustToxLoss(-5)
+ H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
+ H.adjustCloneLoss(-5)
+ H.SetKnockdown(0)
+ H.SetStun(0)
+ H.SetParalyzed(0)
+ H.AdjustUnconscious(-20)
+ H.clear_alert("lightexposure")
+ var/charge_time = 400 - ((SSticker.mode.thralls && SSticker.mode.thralls.len) || 0)*10
+ if(world.time >= charge_time+last_charge)
+ shadow_charges = min(shadow_charges + 1, 3)
+ last_charge = world.time
+
+//shadowleathermen
+/datum/species/shadow/ling/lesser
+ species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING)
+ inherent_traits = list(TRAIT_NOPULSE, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_STABLELIVER, TRAIT_STABLEHEART, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_RESISTLOWPRESSURE, TRAIT_RESISTCOLD)
+ no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_GLOVES, ITEM_SLOT_EYES, ITEM_SLOT_FEET)
+ mutanteyes = /obj/item/organ/eyes/night_vision/alien/sling/l_shadowling
+
+/datum/species/shadow/ling/lesser/spec_life(mob/living/carbon/human/H)
+ H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry
+ if(isturf(H.loc))
+ var/turf/T = H.loc
+ var/light_amount = T.get_lumcount()
+ if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move)
+ H.adjustCloneLoss(LIGHT_DAMAGE_TAKEN/2)
+ H.throw_alert("lightexposure", /atom/movable/screen/alert/lightexposure)
+ if(H.stat != DEAD)
+ to_chat(H, span_userdanger("The light burns you!")) //Message spam to say "GET THE FUCK OUT"
+ H.playsound_local(get_turf(H), 'sound/weapons/sear.ogg', 150, 1, pressure_affected = FALSE)
+ else if (light_amount < LIGHT_HEAL_THRESHOLD)
+ H.heal_overall_damage(4,4)
+ H.adjustToxLoss(-4)
+ H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -25)
+ H.adjustCloneLoss(-3)
+ H.clear_alert("lightexposure")
+
+#undef HEART_SPECIAL_SHADOWIFY
+#undef HEART_RESPAWN_THRESHHOLD
+#undef LIGHT_HEAL_THRESHOLD
+#undef LIGHT_DAMAGE_TAKEN
+#undef LIGHT_DAM_THRESHOLD
\ No newline at end of file
diff --git a/modular_dripstation/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_dripstation/code/modules/reagents/chemistry/reagents/other_reagents.dm
new file mode 100644
index 000000000000..6fa481a68e3b
--- /dev/null
+++ b/modular_dripstation/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -0,0 +1,22 @@
+/datum/reagent/shadowling_blindness_smoke
+ taste_description = "pure darkness"
+
+/datum/reagent/shadowling_blindness_smoke/on_mob_life(mob/living/M)
+ if(!is_shadow_or_thrall(M))
+ to_chat(M, span_warning("You breathe in the black smoke, and your eyes burn horribly!"))
+ M.blind_eyes(5)
+ if(prob(25))
+ M.visible_message("[M] claws at their eyes!")
+ M.Stun(3, 0)
+ . = 1
+ else
+ to_chat(M, span_notice("You breathe in the black smoke, and you feel revitalized!"))
+ M.adjustOxyLoss(-2, 0)
+ M.adjustToxLoss(-2, 0)
+ M.adjustBruteLoss(-1, 0)
+ M.adjustFireLoss(-1, 0)
+ . = 1
+ return ..() || .
+
+/datum/reagent/shadowfrost
+ taste_description = "pure darkness"
\ No newline at end of file
diff --git a/modular_dripstation/code/modules/surgery/organs/shadow_organs.dm b/modular_dripstation/code/modules/surgery/organs/shadow_organs.dm
new file mode 100644
index 000000000000..5711cbb2641b
--- /dev/null
+++ b/modular_dripstation/code/modules/surgery/organs/shadow_organs.dm
@@ -0,0 +1,24 @@
+/obj/item/organ/eyes/night_vision
+ name = "night vision eyes"
+ eye_color = "00FF00"
+
+//removing shity yogs nightvision code from my beloved shadows
+/obj/item/organ/eyes/shadow
+ flash_protect = -1
+ eye_color = "00FF00"
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
+ sight_flags = SEE_BLACKNESS
+ see_in_dark = 8
+
+//okay, they are actual antags, giving them ability to tweak their vision
+/obj/item/organ/eyes/night_vision/alien/sling
+ desc = "The eyes of a spooky shadowling! Even without their shadowy owner, looking at these eyes gives you a sense of dread."
+ icon_state = "burning_eyes"
+ eye_color = "BC2828"
+ see_in_dark = 9
+ sight_flags = SEE_MOBS //flag from alien eyes, just mention that they have it
+ flash_protect = -1
+
+/obj/item/organ/eyes/night_vision/alien/sling/l_shadowling
+ eye_color = "6432B7"
+ desc = "The eyes of a spooky shadowling! This pair exudes submission." //and breedable. Fuck, god save my soul.
\ No newline at end of file
diff --git a/modular_dripstation/icons/mob/actions/actions_spells.dmi b/modular_dripstation/icons/mob/actions/actions_spells.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..51ab47a3d01fde2de8a6a1054f0c4d195db3ca3d
GIT binary patch
literal 406
zcmV;H0crk;P)fFDZ*Bkpc$`yK
zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBS
zI3qD7zdXJ?F(=zdiHkEOv#1y-Y{>6upC7!Ah8P!{v4VgZp-#f0uMQlAz@=l
zxWoa7knp|;@2XIs%RQD{g$<=7*w92iZmKR3w<7!{AVZomF!Ak$)C%O3)!co{x_Uk_
zoGGw*80Waa4nFmoHq(@36O!Ihhy3>|??3yVA8ajSm+1Ec7ytkO07*qoM6N<$f^yKK
AegFUf
literal 0
HcmV?d00001
diff --git a/modular_dripstation/icons/mob/alert.dmi b/modular_dripstation/icons/mob/alert.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..c6727ed7e43955aa873668b97e7554d031de2c8e
GIT binary patch
literal 419
zcmV;U0bKrxP)5&zaCQhIVs00001bW%=J06^y0W&i*H
zZ+cW%bVOxyV{&P5bZKvH004NLQ&wH>al37#?6gTAJOe;#vO@*+P
z6%mjO*$I*BNJ_I+kI*3vq&8Al#sZ
zQ&eyS1yREw5s}=O061nu)|??RiVZLVq$-4eK!lvmWdl*kV5>`V(*l&Ar4eK%l!Wgb
zdB!~N)T8;96y2W+UhmlqUts@``>dM!tAa~t!G}XXwWyP0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5DX}OwJ}DYCm4FI>h
z8>Mpj%L>5qZJ_
z+p7gW7F2q)@(erNHI+9cc#yl{YxekOz>px29rc;$>JaQY91@%X8WxNpimbzdif`ay_ytY6d_nO~F)|
literal 0
HcmV?d00001
diff --git a/modular_dripstation/icons/mob/inhands/antag/lighteater_righthand.dmi b/modular_dripstation/icons/mob/inhands/antag/lighteater_righthand.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..55e30c91988c1b11044373d00be855e9d8423b12
GIT binary patch
literal 484
zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5DX}OwJ}DYCm4FI>h
z8>Mp7++fl
zOR4>07Z(k8`e;uM7n)u|y831fY>O;3_opquM*>GEA_fMw6ixPe3t$K%Diw?&fW*Vb
z5P}|`ij_1tP(WBB(=Og3Af3OKsZTL5^IoY~Lm=Bo!>EEi&{`VO3k3R=6!Q`TN16Bt
z0&dX6;*5Y=wa)JdxV7^B3IO=+UHw5(D`7o*G5x%sGmF5PSqvn`7hD;7wpR!^2vy~Y
zKIjY~_b1x3`QtMB8K7yTJ@>^s;gwpKwb3&lYZtsS&qkX7YILYd+f$|vOn{#bO?FSe
acJm)pMH)D_g*jjV0000= charge_time+last_charge)
shadow_charges = min(shadow_charges + 1, 3)
- last_charge = world.time
+ last_charge = world.time*/
/datum/species/shadow/ling/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
var/turf/T = H.loc
@@ -212,7 +216,7 @@ Made by Xhuis
if(light_amount > LIGHT_DAM_THRESHOLD)
C.remove_movespeed_modifier(id)
else
- C.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
+ C.add_movespeed_modifier(id, update=TRUE, priority=100, multiplicative_slowdown=-0.75, blacklisted_movetypes=(FLYING|FLOATING)) //shadowspeed dripstation tweak
/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful
@@ -225,7 +229,7 @@ Made by Xhuis
heatmod = 1.25
brutemod = 0.75
-/datum/species/shadow/ling/lesser/spec_life(mob/living/carbon/human/H)
+/*/datum/species/shadow/ling/lesser/spec_life(mob/living/carbon/human/H) //same as above, check shadowpeople.dm in modular_dripstation
H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry
if(isturf(H.loc))
var/turf/T = H.loc
@@ -236,11 +240,19 @@ Made by Xhuis
H.heal_overall_damage(4,4)
H.adjustToxLoss(-5)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, -25)
- H.adjustCloneLoss(-5)
+ H.adjustCloneLoss(-5)*/
/mob/living/proc/add_thrall()
if(!istype(mind))
return FALSE
+ var/mob/M //dripstation edit
+ var/thralls_warning_check = 0 //dripstation edit
+ for(M in GLOB.alive_mob_list) //dripstation edit
+ if(is_thrall(M)) //dripstation edit
+ thralls_warning_check++ //dripstation edit
+ if(!SSticker.mode.victory_warning_announced && (thralls_warning_check >= SSticker.mode.warning_threshold)) //dripstation edit
+ SSticker.mode.victory_warning_announced = TRUE //then let's give the station a warning dripstation edit
+ priority_announce("Large concentration of psychic bluespace energy detected by long-ranged scanners. Shadowling ascension event imminent. Any personnel is authorized to prevent it at all costs!", "Central Command Higher Dimensional Affairs", 'sound/AI/spanomalies.ogg') //dripstation edit
return mind.add_antag_datum(ANTAG_DATUM_THRALL)
/mob/living/proc/add_sling()
diff --git a/yogstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm b/yogstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
index b97ea0ee1262..e46191e89d2e 100644
--- a/yogstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
+++ b/yogstation/code/modules/antagonists/shadowling/ascendant_shadowling.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/ascendant_shadowling
+/*/mob/living/simple_animal/ascendant_shadowling //check modular_dripstation\code\modules\antagonists\shadowling\ascendant_shadowling.dm
name = "ascendant shadowling"
desc = "HOLY SHIT RUN THE FUCK AWAY- RAAAAAAA!"
icon = 'yogstation/icons/mob/mob.dmi'
@@ -46,3 +46,4 @@
to_chat(M, span_notice("You feel a woosh as newly released energy temporarily distorts space itself..."))
sound_to_playing_players('sound/hallucinations/wail.ogg') // Ghosts have ears!!
. = ..()
+*/
\ No newline at end of file
diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling.dm b/yogstation/code/modules/antagonists/shadowling/shadowling.dm
index a2d70b1d4fc0..98b0916b3714 100644
--- a/yogstation/code/modules/antagonists/shadowling/shadowling.dm
+++ b/yogstation/code/modules/antagonists/shadowling/shadowling.dm
@@ -14,6 +14,9 @@
log_game("[key_name(owner.current)] was made into a shadowling!")
var/datum/action/cooldown/spell/shadowling_hatch/hatch = new(owner.current)
hatch.Grant(owner.current)
+
+ var/datum/action/cooldown/spell/pointed/enthrall/enthrall = new(owner.current) //dripstation edit
+ enthrall.Grant(owner.current) //dripstation edit
var/datum/action/cooldown/spell/shadowling_hivemind/hivemind_chat = new(owner.current)
hivemind_chat.Grant(owner.current)
diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
index db2087d4c817..208126e10732 100644
--- a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
@@ -1,4 +1,4 @@
-#define EMPOWERED_THRALL_LIMIT 3
+#define EMPOWERED_THRALL_LIMIT 5 //dripstation edit
/datum/action/cooldown/spell/proc/shadowling_check(mob/living/carbon/human/H) //what the fuck was this shit
if(!H || !istype(H))
@@ -67,6 +67,10 @@
to_chat(owner, span_warning("[target] must be conscious!"))
revert_cast()
return FALSE
+ if(!target.getorganslot(ORGAN_SLOT_EYES) || (target.eye_blind)) //dripstation edit
+ to_chat(user, span_warning("Your target need functioning eyes to be glared!")) //dripstation edit
+ revert_cast() //dripstation edit
+ return FALSE //dripstation edit
if(is_shadow_or_thrall(target))
to_chat(owner, span_warning("You cannot glare at allies!"))
revert_cast()
@@ -74,11 +78,12 @@
var/mob/living/carbon/human/M = target
usr.visible_message(span_warning("[owner]'s eyes flash a purpleish-red!"))
var/distance = get_dist(target, owner)
- if (distance <= 2)
+ if ((distance <= 2) || (target.get_eye_protection() <= 0)) //dripstation edit. Not even flash but psy disable method. Moths and regular shadows as well as creatures with negative vision protection are exposed to glare at any distance even if wear sunglasses
target.visible_message(span_danger("[target] suddendly collapses..."))
to_chat(target, span_userdanger("A purple light flashes across your vision, and you lose control of your movements!"))
target.Paralyze(10 SECONDS)
M.silent += 10
+ M.adjust_confusion(3 SECONDS)
else //Distant glare
var/loss = 100 - (distance * 10)
target.adjustStaminaLoss(loss)
@@ -105,7 +110,7 @@
spell_requirements = SPELL_REQUIRES_HUMAN
/datum/action/cooldown/spell/aoe/proc/extinguishItem(obj/item/I, cold = FALSE) //Does not darken items held by mobs due to mobs having separate luminosity, use extinguish_mob() or write your own proc.
- var/blacklisted_lights = list(/obj/item/flashlight/flare, /obj/item/flashlight/slime)
+ var/blacklisted_lights = list(/obj/item/flashlight/flare, /obj/item/flashlight/slime, /obj/item/flashlight/glowstick) //dripstation edit
if(istype(I, /obj/item/flashlight))
var/obj/item/flashlight/F = I
if(F.light_on || F.on)
@@ -121,10 +126,17 @@
F.on = FALSE
F.set_light_on(FALSE)
F.update_brightness()
+ F.visible_message(span_warning("The unnatural darkness envelops [F]!")) //dripstation edit
else if(istype(I, /obj/item/pda))
var/obj/item/pda/P = I
P.set_light_on(FALSE)
+ if(istype(I, /obj/item/gun)) //dripstation edit
+ var/obj/item/gun/G = I //dripstation edit
+ if(G.gun_light.on == TRUE) //dripstation edit
+ G.toggle_gunlight() //dripstation edit
I.set_light_on(FALSE)
+ I.light_on = FALSE //dripstation edit
+ I.update_icon() //dripstation edit
return I.luminosity
/datum/action/cooldown/spell/aoe/proc/extinguish_mob(mob/living/H, cold = FALSE)
@@ -149,16 +161,19 @@
G.modify() // Re-sets glowy
G.current_nullify_timer = null
+/datum/action/cooldown/spell/aoe/veil/cast()
+ . = ..()
+ to_chat(owner, span_shadowling("You silently disable all nearby lights."))
+
/datum/action/cooldown/spell/aoe/veil/cast_on_thing_in_aoe(atom/target, atom/user)
if(!shadowling_check(owner) && !admin_override)
return
- to_chat(owner, span_shadowling("You silently disable all nearby lights."))
var/turf/T = get_turf(owner)
for(var/datum/light_source/LS in T.get_affecting_lights())
var/atom/LO = LS.source_atom
- if(isitem(LO))
- extinguishItem(LO)
- continue
+ //if(isitem(LO)) //dripstation edit
+ // extinguishItem(LO) //dripstation edit
+ // continue //dripstation edit
if(istype(LO, /obj/machinery/light))
var/obj/machinery/light/L = LO
L.on = FALSE
@@ -166,30 +181,89 @@
L.update(0)
L.set_light(0)
continue
- if(istype(LO, /obj/machinery/computer) || istype(LO, /obj/machinery/power/apc))
- LO.set_light(0)
- LO.visible_message(span_warning("[LO] grows dim, its screen barely readable."))
- continue
- if(ismob(LO))
- extinguish_mob(LO)
- if(istype(LO, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/borg = LO
- if(!borg.lamp_cooldown)
- borg.smash_headlamp()
- if(istype(LO, /obj/machinery/camera))
- LO.set_light(0)
- if(prob(10))
- LO.emp_act(2)
- continue
- if(istype(LO, /obj/mecha))
- var/obj/mecha/M = LO
+ //if(istype(LO, /obj/machinery/computer) || istype(LO, /obj/machinery/power/apc)) //dripstation edit start
+ // LO.set_light(0)
+ // LO.visible_message(span_warning("[LO] grows dim, its screen barely readable."))
+ // continue
+ //if(ismob(LO))
+ // extinguish_mob(LO)
+ //if(istype(LO, /mob/living/silicon/robot))
+ // var/mob/living/silicon/robot/borg = LO
+ // if(!borg.lamp_cooldown)
+ // borg.smash_headlamp()
+ //if(istype(LO, /obj/machinery/camera))
+ // LO.set_light(0)
+ // if(prob(10))
+ // LO.emp_act(2)
+ // continue
+ //if(istype(LO, /obj/mecha))
+ // var/obj/mecha/M = LO
+ // M.set_light(0)
+ // M.lights = FALSE
+ //if(istype(LO, /obj/machinery/power/floodlight))
+ // var/obj/machinery/power/floodlight/FL = LO
+ // FL.change_setting(2) // Set floodlight to lowest setting
+ //if(istype(LO, /obj/structure/light_prism))
+ // qdel(LO)
+ if(istype(LO, /obj/machinery))
+ var/obj/machinery/M = LO
+ M.light_on = FALSE
+ M.visible_message(span_warning("[M] grows dim, its screen barely readable."))
M.set_light(0)
- M.lights = FALSE
- if(istype(LO, /obj/machinery/power/floodlight))
- var/obj/machinery/power/floodlight/FL = LO
- FL.change_setting(2) // Set floodlight to lowest setting
- if(istype(LO, /obj/structure/light_prism))
- qdel(LO)
+ continue
+ if(isturf(target))
+ var/turf/tu = target
+ for(var/mob/M in tu.contents)
+ if(istype(M, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/borg = M
+ if(borg.light_on == TRUE)
+ if(prob(15))
+ borg.smash_headlamp()
+ borg.visible_message(span_warning("[borg]`s light smashes by the dark forces!"))
+ return
+ borg.visible_message(span_warning("[borg]`s light flickers and falls dark."))
+ borg.lamp_cooldown = world.time + 200
+ borg.toggle_headlamp(TRUE)
+ else
+ borg.visible_message(span_warning("[borg]`s light sparks but nothing happens."))
+ if(istype(M, /mob/living/simple_animal/bot))
+ var/mob/living/simple_animal/bot = M
+ if(prob(30))
+ bot.emp_act(2)
+ bot.visible_message(span_warning("[bot]`s lights dies."))
+ return
+ extinguish_mob(M)
+ for(var/obj/item/F in tu.contents)
+ extinguishItem(F)
+ for(var/obj/O in tu.contents)
+ if(istype(O, /obj/structure/light_prism))
+ var/obj/structure/light_prism/LP = O
+ LP.visible_message(span_warning("[LP] dispels by force!"))
+ qdel(LP)
+ if(istype(O, /obj/mecha))
+ var/obj/mecha/M = O
+ M.visible_message(span_warning("[M]`s lights shutting down."))
+ M.lights = FALSE
+ M.set_light_on(FALSE)
+ M.lamp_cooldown = world.time + 200
+ for(var/mob/living/carbon/H in M)
+ extinguish_mob(H)
+ if(istype(O, /obj/structure/closet))
+ var/obj/structure/closet/C = O
+ for(var/mob/living/carbon/H in C)
+ extinguish_mob(H)
+ for(var/obj/item/I in C)
+ extinguishItem(I)
+ if(istype(O, /obj/machinery/power/floodlight))
+ var/obj/machinery/power/floodlight/FL = O
+ FL.change_setting(2) // Set floodlight to lowest setting
+ continue
+ if(istype(O, /obj/machinery/camera))
+ var/obj/machinery/camera/C = O
+ if(prob(10))
+ C.emp_act(2)
+ C.visible_message(span_warning("[C]`s red dot dies away, it seems off for a short amount of time."))
+ return //dripstation edit end
for(var/obj/structure/glowshroom/G in orange(7, user)) //High radius because glowshroom spam wrecks shadowlings
if(G.light_power > 0)
@@ -220,12 +294,12 @@
/datum/action/cooldown/spell/aoe/flashfreeze/cast_on_thing_in_aoe(atom/target, atom/user)
if(!shadowling_check(owner))
return
- to_chat(owner, span_shadowling("You freeze the nearby air."))
if(isturf(target))
var/turf/T = target
for(var/mob/living/carbon/M in T.contents)
if(is_shadow_or_thrall(M))
- if(M == user) //No message for the user, of course
+ if(M == user)
+ to_chat(M, span_shadowling("You freeze the nearby air."))
continue
else
to_chat(M, span_danger("You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!"))
@@ -239,6 +313,18 @@
M.reagents.add_reagent(/datum/reagent/consumable/frostoil, 5) //some amount of a cryo sting fucked if I care
M.reagents.add_reagent(/datum/reagent/shadowfrost, 5)
extinguish_mob(M, TRUE)
+
+ for(var/obj/O in T.contents) //dripstation edit start
+ if(istype(O, /obj/mecha))
+ var/obj/mecha/M = O
+ for(var/mob/living/carbon/H in M)
+ extinguish_mob(H, TRUE)
+ if(istype(O, /obj/structure/closet))
+ var/obj/structure/closet/C = O
+ for(var/mob/living/carbon/H in C)
+ extinguish_mob(H, TRUE)
+ for(var/obj/item/I in C)
+ extinguishItem(I, TRUE) //dripstation edit end
for(var/obj/item/F in T.contents)
extinguishItem(F, TRUE)
@@ -261,7 +347,8 @@
listclearnulls(SSticker.mode.thralls)
if(!(user.mind in SSticker.mode.shadows)) return
if(user.dna.species.id != "shadowling")
- if(SSticker.mode.thralls.len >= 5)
+ if(SSticker.mode.thralls.len >= 3) //dripstation edit
+ to_chat(user, span_warning("You need more power to enthrall! Use hatch to become shadowling!")) //dripstation edit
return FALSE
var/mob/living/target = target_atom
if(!target.key || !target.mind)
@@ -320,24 +407,24 @@
to_chat(target, span_userdanger("You wrest yourself away from [user]'s hands and compose yourself!"))
enthralling = FALSE
return
- enthralling = FALSE
- to_chat(user, span_shadowling("You have enthralled [target.real_name]!"))
- target.visible_message(span_big("[target] looks to have experienced a revelation!"), \
- span_warning("False faces all dark not real not real not--"))
- target.setOxyLoss(0) //In case the shadowling was choking them out
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- var/datum/mutation/human/glow/G = M.dna.get_mutation(GLOWY)
- if(G)
- M.dna.remove_mutation(GLOWY)
- target.mind.special_role = "thrall"
- var/obj/item/organ/internal/shadowtumor/ST = new
- ST.Insert(target, FALSE, FALSE)
- target.add_thrall()
- if(target.reagents.has_reagent(/datum/reagent/consumable/frostoil)) //Stabilize body temp incase the sling froze them earlier
- target.reagents.remove_reagent(/datum/reagent/consumable/frostoil)
- to_chat(target, span_notice("You feel warmer... It feels good."))
- target.bodytemperature = 310
+ enthralling = FALSE
+ to_chat(user, span_shadowling("You have enthralled [target.real_name]!"))
+ target.visible_message(span_big("[target] looks to have experienced a revelation!"), \
+ span_warning("False faces all dark not real not real not--"))
+ target.setOxyLoss(0) //In case the shadowling was choking them out
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ var/datum/mutation/human/glow/G = M.dna.get_mutation(GLOWY)
+ if(G)
+ M.dna.remove_mutation(GLOWY)
+ target.mind.special_role = "thrall"
+ var/obj/item/organ/internal/shadowtumor/ST = new
+ ST.Insert(target, FALSE, FALSE)
+ target.add_thrall()
+ if(target.reagents.has_reagent(/datum/reagent/consumable/frostoil)) //Stabilize body temp incase the sling froze them earlier
+ target.reagents.remove_reagent(/datum/reagent/consumable/frostoil)
+ to_chat(target, span_notice("You feel warmer... It feels good."))
+ target.bodytemperature = 310
return TRUE
@@ -352,8 +439,6 @@
/datum/action/cooldown/spell/shadowling_hivemind/cast(atom/cast_on)
. = ..()
- if(!.)
- return FALSE
if(!is_shadow(owner))
to_chat(owner, span_warning("You must be a shadowling to do that!"))
return
@@ -370,29 +455,48 @@
return TRUE
-/datum/action/cooldown/spell/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor
+/datum/action/cooldown/spell/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, re-equips their armor and clean defects //dripstation edited
name = "Rapid Re-Hatch"
- desc = "Re-forms protective chitin that may be lost during cloning or similar processes."
+ desc = "Re-forms protective chitin that may be lost during cloning or similar processes. Also gets missing limbs back and regenerate eyes."
panel = "Shadowling Abilities"
button_icon = 'yogstation/icons/mob/actions.dmi'
button_icon_state = "regen_armor"
+ var/nightmare_heart_acquired = FALSE //dripstation edit
- cooldown_time = 1 MINUTES
+ cooldown_time = 5 MINUTES
spell_requirements = SPELL_REQUIRES_HUMAN
/datum/action/cooldown/spell/shadowling_regenarmor/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
if(!is_shadow(user))
to_chat(user, span_warning("You must be a shadowling to do this!"))
return
+ var/obj/item/organ/heart/CH = user.getorganslot(ORGAN_SLOT_HEART) //dripstation edit
+ if(CH != null) //dripstation edit
+ nightmare_heart_acquired = TRUE //dripstation edit
user.visible_message(span_warning("[user]'s skin suddenly bubbles and shifts around their body!"), \
span_shadowling("You regenerate your protective armor and cleanse your form of defects."))
user.setCloneLoss(0)
+ user.setOrganLoss(ORGAN_SLOT_EYES, 0) //dripstation edit
+ user.update_sight() //dripstation edit
+ user.remove_all_embedded_objects() //dripstation edit
user.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), ITEM_SLOT_OCLOTHING)
user.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), ITEM_SLOT_HEAD)
user.set_species(/datum/species/shadow/ling)
+ var/list/missing = user.get_missing_limbs() //dripstation edit start
+ if(missing.len)
+ playsound(user, 'sound/magic/demon_consume.ogg', 50, 1)
+ user.visible_message("[user]'s missing limbs \
+ reform, making a loud, grotesque sound!",
+ "Your limbs regrow, making a \
+ loud, crunchy sound and giving you great pain!",
+ "You hear organic matter ripping \
+ and tearing!")
+ user.emote("scream")
+ user.regenerate_limbs(1)
+ if(nightmare_heart_acquired == TRUE)
+ var/obj/item/organ/heart/NH = new/obj/item/organ/heart/nightmare(user)
+ NH.Insert(user) //dripstation edit end
return TRUE
@@ -410,11 +514,10 @@
var/screech_acquired = FALSE
var/reviveThrallAcquired = FALSE
var/null_charge_acquired = FALSE
+ var/nightmare_heart_acquired = FALSE //dripstation edit
/datum/action/cooldown/spell/collective_mind/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
if(!shadowling_check(user))
return
var/thralls = 0
@@ -443,18 +546,33 @@
empower.Grant(M)
var/datum/action/cooldown/spell/blindness_smoke/smoke = new(M)
smoke.Grant(M)
- if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !null_charge_acquired)
- null_charge_acquired = TRUE
- to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
- or sending power until repaired.")
- var/datum/action/cooldown/spell/null_charge/null_charge = new(M)
- null_charge.Grant(M)
- if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
+ //if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !null_charge_acquired) //dripstation edit start
+ // null_charge_acquired = TRUE
+ // to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
+ // or sending power until repaired.")
+ // var/datum/action/cooldown/spell/null_charge/null_charge = new(M)
+ // null_charge.Grant(M)
+ //if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
+ if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
reviveThrallAcquired = TRUE
to_chat(user, "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.")
var/datum/action/cooldown/spell/pointed/revive_thrall/revive = new(M)
revive.Grant(M)
+ if(thralls >= CEILING(8 * SSticker.mode.thrall_ratio, 1) && !null_charge_acquired)
+ null_charge_acquired = TRUE
+ to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
+ or sending power until repaired.")
+ var/datum/action/cooldown/spell/null_charge/null_charge = new(M)
+ null_charge.Grant(M)
+ if(thralls >= CEILING(10 * SSticker.mode.thrall_ratio, 1) && !nightmare_heart_acquired)
+ nightmare_heart_acquired = TRUE
+ to_chat(user, "The power of your thralls has granted you the Nightmare heart. This will, after some amount of time, bring you completely back to life in the darkness.")
+ var/obj/item/organ/heart/OH = user.getorganslot(ORGAN_SLOT_HEART)
+ var/obj/item/organ/heart/NH
+ qdel(OH)
+ NH = new/obj/item/organ/heart/nightmare(user)
+ NH.Insert(user) //dripstation edit end
if(thralls < victory_threshold)
to_chat(user, span_shadowling("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)
@@ -489,8 +607,6 @@
/datum/action/cooldown/spell/null_charge/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
if(!shadowling_check(user))
return
@@ -510,7 +626,7 @@
target_apc.visible_message(span_warning("The [target_apc] flickers and begins to grow dark."))
to_chat(user, span_shadowling("You dim the APC's screen and carefully begin siphoning its power into the void."))
- if(!do_after(user, 15 SECONDS, target_apc))
+ if(!do_after(user, 8 SECONDS, target_apc)) //dripstation edit
//Whoops! The APC's light turns back on
to_chat(user, span_shadowling("Your concentration breaks and the APC suddenly repowers!"))
target_apc.set_light(2)
@@ -538,8 +654,6 @@
/datum/action/cooldown/spell/blindness_smoke/cast(mob/living/carbon/human/user) //Extremely hacky
. = ..()
- if(!.)
- return FALSE
if(!shadowling_check(user))
return
user.visible_message(span_warning("[user] bends over and coughs out a cloud of black smoke!"))
@@ -576,7 +690,7 @@
var/turf/T = target_atom
for(var/mob/target in T.contents)
if(is_shadow_or_thrall(target))
- if(target == user) //No message for the user, of course
+ if(target == user)
continue
else
continue
@@ -585,6 +699,10 @@
to_chat(M, span_danger("A spike of pain drives into your head and scrambles your thoughts!"))
M.adjust_confusion(10 SECONDS)
M.adjustEarDamage(0, 30)//as bad as a changeling shriek
+ var/obj/item/radio/headset/R = M.ears //dripstation edit
+ if (R) //dripstation edit
+ R.emp_act(2) //dripstation edit
+ to_chat(M, span_danger("Your sensitive headset resonates with screech!")) //dripstation edit
else if(issilicon(target))
var/mob/living/silicon/S = target
to_chat(S, span_warning("ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#"))
@@ -598,7 +716,7 @@
/datum/action/cooldown/spell/pointed/empower_thrall //turns a thrall into a lesser shadowling
name = "Dark Acceleration"
- desc = "Empowers a thrall. You can only have 3 empowered thralls at a time. Empowered thralls become lesser versions of yourself, gaining a small selection of your abilities as well as your healing in the dark and aversion to light."
+ desc = "Empowers a thrall. You can only have 5 empowered thralls at a time. Empowered thralls become lesser versions of yourself, gaining a small selection of your abilities as well as your healing in the dark and aversion to light." //dripstation edit
panel = "Shadowling Abilities"
button_icon = 'yogstation/icons/mob/actions.dmi'
button_icon_state = "darksight"
@@ -606,12 +724,15 @@
cast_range = 1
cooldown_time = 1 MINUTES
spell_requirements = SPELL_REQUIRES_HUMAN
+ var/cast_time = 40
+ var/whitelist_species = list("human", "felinid", "shadow", "pod", "lizard")
-/datum/action/cooldown/spell/pointed/empower_thral/InterceptClickOn(mob/living/user, params, atom/target)
+/datum/action/cooldown/spell/pointed/empower_thrall/InterceptClickOn(mob/living/user, params, atom/target)
. = ..()
if(!.)
return FALSE
- if(!shadowling_check(user))
+ if(!shadowling_check(user) && !istype(user, /mob/living/simple_animal/ascendant_shadowling)) //dripstation edit
+ to_chat(user, span_warning("You don`t know how to do that.")) //dripstation edit
return
if(!ishuman(target))
return
@@ -619,12 +740,15 @@
if(!is_thrall(thrallToEmpower))
to_chat(user, span_warning("[thrallToEmpower] is not a thrall."))
return
- if(thrallToEmpower.stat != CONSCIOUS)
- to_chat(user, span_warning("[thrallToEmpower] must be conscious to become empowered."))
- return
+ //if(thrallToEmpower.stat != CONSCIOUS) //nobody cares on dripstation
+ // to_chat(user, span_warning("[thrallToEmpower] must be conscious to become empowered.")) //dripstation edit
+ // return //dripstation edit
if(thrallToEmpower.dna.species.id == "l_shadowling")
to_chat(user, span_warning("[thrallToEmpower] is already empowered."))
return
+ if(!(thrallToEmpower.dna.species.id in whitelist_species)) //dripstation edit
+ to_chat(user, span_warning("You don`t know how to empower this weakling.")) //dripstation edit
+ return //dripstation edit
var/empowered_thralls = 0
for(var/datum/mind/M in SSticker.mode.thralls)
if(!ishuman(M.current))
@@ -632,13 +756,13 @@
var/mob/living/carbon/human/H = M.current
if(H.dna.species.id == "l_shadowling")
empowered_thralls++
- if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
+ if((empowered_thralls >= EMPOWERED_THRALL_LIMIT) && !istype(user, /mob/living/simple_animal/ascendant_shadowling)) //dripstation edit
to_chat(user, span_warning("You cannot spare this much energy. There are too many empowered thralls."))
return
user.visible_message(span_danger("[user] places their hands over [thrallToEmpower]'s face, red light shining from beneath."), \
span_shadowling("You place your hands on [thrallToEmpower]'s face and begin gathering energy..."))
to_chat(thrallToEmpower, span_userdanger("[user] places their hands over your face. You feel energy gathering. Stand still..."))
- if(!do_after(user, 8 SECONDS, thrallToEmpower))
+ if(!do_after(user, (cast_time*2), thrallToEmpower)) //dripstation edit
to_chat(user, span_warning("Your concentration snaps. The flow of energy ebbs."))
return
to_chat(user, span_shadowling("You release a massive surge of power into [thrallToEmpower]!"))
@@ -649,7 +773,7 @@
thrallToEmpower.Knockdown(5)
thrallToEmpower.visible_message(span_warning("[thrallToEmpower] collapses, their skin and face distorting!"), \
span_userdanger("AAAAAAAAAAAAAAAAAAAGH-"))
- if (!do_after(user, 5, thrallToEmpower))
+ if (!do_after(user, (cast_time/2), thrallToEmpower)) //dripstation edit
thrallToEmpower.Unconscious(1 MINUTES)
thrallToEmpower.visible_message(span_warning("[thrallToEmpower] gasps, and passes out!"), span_warning("That... feels nice...."))
to_chat(user, span_warning("We have been interrupted! [thrallToEmpower] will need to rest to recover."))
@@ -660,6 +784,10 @@
thrallToEmpower.set_species(/datum/species/shadow/ling/lesser)
for(var/datum/action/cooldown/spell/pointed/lesser_glare/lglare in thrallToEmpower.actions)
LAZYREMOVE(thrallToEmpower.actions, lglare)
+ for(var/datum/action/cooldown/spell/thrall_night_vision/tnv in thrallToEmpower.actions) //dripstation edit
+ LAZYREMOVE(thrallToEmpower.actions, tnv) //dripstation edit
+ for(var/datum/action/cooldown/spell/lesser_shadow_walk/lsw in thrallToEmpower.actions) //dripstation edit
+ LAZYREMOVE(thrallToEmpower.actions, lsw) //dripstation edit
var/datum/action/cooldown/spell/pointed/sling/glare/sglare = new(thrallToEmpower)
sglare.Grant(thrallToEmpower)
@@ -667,15 +795,16 @@
var/datum/action/cooldown/spell/aoe/veil/veil = new(thrallToEmpower)
veil.Grant(thrallToEmpower)
- var/datum/action/cooldown/spell/jaunt/void_jaunt/jaunt = new(thrallToEmpower)
- jaunt.Grant(thrallToEmpower)
+ var/datum/action/cooldown/spell/jaunt/shadow_walk/jaunt = new(thrallToEmpower) //dripstation edit
+ jaunt.Grant(thrallToEmpower) //dripstation edit
-/datum/action/cooldown/spell/pointed/revive_thrall //Completely revives a dead thrall
+/datum/action/cooldown/spell/pointed/revive_thrall //Completely revives a dead thrall or shadowling, dripstation edited
name = "Black Recuperation"
- desc = "Revives or empowers a thrall."
+ desc = "Performs dark ritual to revive human being." //dripstation edit
panel = "Shadowling Abilities"
button_icon = 'yogstation/icons/mob/actions.dmi'
button_icon_state = "revive_thrall"
+ var/cast_time = 60
cast_range = 1
cooldown_time = 1 MINUTES
@@ -685,25 +814,33 @@
. = ..()
if(!.)
return FALSE
- if(!shadowling_check(user))
+ if(!shadowling_check(user) && !istype(user, /mob/living/simple_animal/ascendant_shadowling)) //dripstation edit
return
if(!ishuman(target))
+ to_chat(user, span_warning("You may only revive humans!")) //dripstation edit
return
var/mob/living/carbon/human/thrallToRevive = target
- if(!is_thrall(thrallToRevive))
- to_chat(user, span_warning("[thrallToRevive] is not a thrall."))
- return
+ if(HAS_TRAIT(thrallToRevive, TRAIT_MINDSHIELD)) //dripstation edit
+ to_chat(user, span_warning("This body has been corrupted by strange machinery. You should shut down the implant preventing your abilities!")) //dripstation edit
if(thrallToRevive.stat != DEAD)
to_chat(user, span_warning("[thrallToRevive] is not dead."))
return
+ if(issilicon(thrallToRevive)) //dripstation edit
+ to_chat(user, span_warning("[thrallToRevive] is non-humanoid machine.")) //dripstation edit
+ return //dripstation edit
if(HAS_TRAIT(thrallToRevive, TRAIT_BADDNA))
to_chat(user, span_warning("[thrallToRevive] is too far gone."))
return
user.visible_message(span_danger("[user] kneels over [thrallToRevive], placing their hands on \his chest."), \
span_shadowling("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_after(user, 3 SECONDS, thrallToRevive))
+ if(is_thrall(thrallToRevive))
+ thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
+ if(is_shadow(thrallToRevive))
+ thrallToRevive.notify_ghost_cloning("Your fellow brothers are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
+ if(!is_shadow_or_thrall(thrallToRevive))
+ thrallToRevive.notify_ghost_cloning("The dark ritual is performed on your body! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
+ if (!do_after(user, cast_time, thrallToRevive)) //dripstation edit
to_chat(user, span_warning("Your concentration snaps. The flow of energy ebbs."))
return
to_chat(user, span_shadowling("You release a massive surge of power into [thrallToRevive]!"))
@@ -717,9 +854,23 @@
span_shadowling("You have returned. One of your masters has brought you from the darkness beyond."), \
)
thrallToRevive.Knockdown(4)
- thrallToRevive.emote("gasp")
+ if(!(thrallToRevive.dna.species.id == "ipc"))
+ thrallToRevive.visible_message(span_boldannounce("[thrallToRevive] heaves in breath, dim red light shining in their eyes."))
+ thrallToRevive.emote("gasp")
+ else
+ thrallToRevive.visible_message(span_boldannounce("[thrallToRevive] sistems seems brought back to nominal, dim red light shining on their monitor."))
+ thrallToRevive.emote("buzz")
+ thrallToRevive.visible_message(span_shadowling("You have returned. One of shadowlings has brought you from the darkness beyond."))
+ thrallToRevive.Knockdown(50)
+ thrallToRevive.Unconscious(20)
+ if(thrallToRevive.handcuffed)
+ thrallToRevive.uncuff()
+ thrallToRevive.visible_message(span_boldannounce("[thrallToRevive] restrains fallen!"))
+ thrallToRevive.resting = FALSE //remove all
playsound(thrallToRevive, "bodyfall", 50, 1)
- if (!do_after(user, 2 SECONDS, thrallToRevive))
+ if(!(thrallToRevive.dna.species.id == "shadow" || thrallToRevive.dna.species.id == "nightmare" || thrallToRevive.dna.species.id == "shadowling" || thrallToRevive.dna.species.id == "l_shadowling"))
+ thrallToRevive.ForceContractDisease(new/datum/disease/transformation/shadow())
+ if (!do_after(user, cast_time, thrallToRevive))
thrallToRevive.Knockdown(50)
thrallToRevive.Unconscious(500)
thrallToRevive.visible_message(span_boldannounce("[thrallToRevive] collapses in exhaustion."), \
@@ -789,8 +940,8 @@
name = "Void Jaunt"
desc = "Move through the void for a time, avoiding mortal eyes and lights."
panel = "Shadowling Abilities"
- button_icon = 'icons/mob/actions/actions_spells.dmi'
- button_icon_state = "jaunt"
+ button_icon = 'modular_dripstation/icons/mob/actions/actions_spells.dmi' //dripstation edit
+ button_icon_state = "shadow_walk2" //dripstation edit
cooldown_time = 80 SECONDS
spell_requirements = SPELL_REQUIRES_HUMAN
@@ -798,8 +949,6 @@
/datum/action/cooldown/spell/jaunt/void_jaunt/cast(mob/living/user)
. = ..()
- if(!.)
- return FALSE
if(iscarbon(user)) //If we're not an ascendant sling
var/mob/living/carbon/C = user
if(C.on_fire)
@@ -945,6 +1094,9 @@
if(M.stat)
to_chat(user, span_warning("[target] must be conscious!"))
return
+ if(!M.getorganslot(ORGAN_SLOT_EYES) || (M.eye_blind))
+ to_chat(user, span_warning("[target] need functioning eyes to be glared!"))
+ return
if(is_shadow_or_thrall(M))
to_chat(user, span_warning("You cannot glare at allies!"))
return
@@ -977,8 +1129,6 @@
/datum/action/cooldown/spell/lesser_shadow_walk/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
user.visible_message(span_warning("[user] suddenly fades away!"), span_shadowling("You veil yourself in darkness, making you harder to see."))
user.alpha = 10
addtimer(CALLBACK(src, PROC_REF(reappear), user), 10 SECONDS)
@@ -995,25 +1145,24 @@
/datum/action/cooldown/spell/thrall_night_vision/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
if(!is_shadow_or_thrall(user))
return
var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES)
if(!eyes)
return
+ var/default_vision = eyes.see_in_dark //dripstation edit
eyes.sight_flags = initial(eyes.sight_flags)
switch(eyes.lighting_alpha)
- if (LIGHTING_PLANE_ALPHA_VISIBLE)
- eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
- eyes.see_in_dark = 8
if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
- else
+ if (LIGHTING_PLANE_ALPHA_INVISIBLE) //dripstation edit
eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
- eyes.see_in_dark = 2 //default
+ eyes.see_in_dark = default_vision //default, dripstation edit
+ else //dripstation edit
+ eyes.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE //dripstation edit
+ eyes.see_in_dark = 8 //dripstation edit
user.update_sight()
return TRUE
@@ -1030,8 +1179,6 @@
/datum/action/cooldown/spell/lesser_shadowling_hivemind/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
if(!is_shadow_or_thrall(user))
to_chat(user, span_warning("As you attempt to commune with the others, an agonizing spike of pain drives itself into your head!"))
user.apply_damage(10, BRUTE, "head")
@@ -1091,11 +1238,11 @@
to_chat(boom, "You feel a slight recoil from the bag of holding!")
/datum/action/cooldown/spell/pointed/sling/hypnosis //Enthralls someone instantly. Nonlethal alternative to Annihilate
- name = "Hypnosis"
+ name = "Subjugate" //dripstation edit
desc = "Instantly enthralls a human."
panel = "Ascendant"
button_icon = 'yogstation/icons/mob/actions.dmi'
- button_icon_state = "enthrall"
+ button_icon_state = "gore"
spell_requirements = NONE
@@ -1169,8 +1316,6 @@
/datum/action/cooldown/spell/shadowling_hivemind_ascendant/cast(mob/living/carbon/human/user)
. = ..()
- if(!.)
- return FALSE
var/text = sanitize(tgui_input_text(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", ""))
if(!text)
return
@@ -1197,3 +1342,20 @@
panel = "Ascendant"
apply_damage = FALSE
+
+
+/datum/action/cooldown/spell/pointed/revive_thrall/ascendant
+ name = "Resurrect a weakling"
+ desc = "Resurrect mortals to kill them again."
+ panel = "Ascendant"
+ cooldown_time = 2 SECONDS
+ spell_requirements = NONE
+ cast_time = 10
+
+/datum/action/cooldown/spell/pointed/empower_thrall/ascendant
+ name = "Empower a weakling"
+ desc = "The best reward would probably be death."
+ panel = "Ascendant"
+ cooldown_time = 2 SECONDS
+ spell_requirements = NONE
+ cast_time = 10
\ No newline at end of file
diff --git a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
index 4b1b2f9f39a0..469886acb2d9 100644
--- a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
@@ -6,7 +6,7 @@
button_icon = 'yogstation/icons/mob/actions.dmi'
button_icon_state = "hatch"
- cooldown_time = 5 MINUTES
+ cooldown_time = 1 MINUTES
spell_requirements = SPELL_REQUIRES_HUMAN
/obj/structure/alien/resin/wall/shadowling //For chrysalis
@@ -16,8 +16,6 @@
/datum/action/cooldown/spell/shadowling_hatch/cast(mob/living/user)
. = ..()
- if(!.)
- return FALSE
if(user.stat || !ishuman(user) || !user || !is_shadow(user) || user.isinspace())
return
var/mob/living/carbon/human/H = user
@@ -94,19 +92,17 @@
H.faction |= "faithless"
for(var/datum/antagonist/shadowling/antag_datum in H.mind.antag_datums)
antag_datum.show_to_ghosts = TRUE
- H.LoadComponent(/datum/component/walk/shadow)
+ //H.LoadComponent(/datum/component/walk/shadow) //dripstation edit, remove comment when somebody fixes pulling while having this component
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), ITEM_SLOT_OCLOTHING)
H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(H), ITEM_SLOT_HEAD)
H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE)
Remove(H)
- if(!do_after(H, 10 SECONDS))
- return
to_chat(H, span_shadowling("Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies."))
- var/datum/action/cooldown/spell/pointed/enthrall/enthrall = new(H)
- enthrall.Grant(H)
+ //var/datum/action/cooldown/spell/pointed/enthrall/enthrall = new(H) //dripstation edit, actually granted
+ //enthrall.Grant(H) //dripstation edit
var/datum/action/cooldown/spell/pointed/sling/glare/glare = new(H)
glare.Grant(H)
@@ -219,6 +215,12 @@
var/datum/action/cooldown/spell/aoe/ascendant_storm/storm = new(A)
storm.Grant(A)
+ var/datum/action/cooldown/spell/pointed/empower_thrall/ascendant/empasc = new(A)
+ empasc.Grant(A)
+
+ var/datum/action/cooldown/spell/pointed/revive_thrall/ascendant/revasc = new(A)
+ revasc.Grant(A)
+
var/datum/action/cooldown/spell/jaunt/void_jaunt/ascendant/jaunt = new(A)
jaunt.Grant(A)
diff --git a/yogstation/code/modules/antagonists/shadowling/thrall.dm b/yogstation/code/modules/antagonists/shadowling/thrall.dm
index c25d821af63a..51b2c58ab4e6 100644
--- a/yogstation/code/modules/antagonists/shadowling/thrall.dm
+++ b/yogstation/code/modules/antagonists/shadowling/thrall.dm
@@ -7,6 +7,7 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
roundend_category = "thralls"
antagpanel_category = "Shadowlings"
antag_moodlet = /datum/mood_event/thrall
+ var/list/objectives_given = list()
/datum/antagonist/thrall/can_be_owned(datum/mind/new_owner)
. = ..()
@@ -28,9 +29,23 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
owner.special_role = "thrall"
message_admins("[key_name_admin(owner.current)] was enthralled by a shadowling!")
log_game("[key_name(owner.current)] was enthralled by a shadowling!")
- for(var/datum/action/cooldown/spell/spells as anything in GLOB.thrall_spell_types)
- spells = new(owner.current)
- spells.Grant(owner.current)
+ var/datum/action/cooldown/spell/lesser_shadowling_hivemind/hivemind_chat = new(owner.current)
+ hivemind_chat.Grant(owner.current)
+
+ var/datum/action/cooldown/spell/thrall_night_vision/tnv = new(owner.current)
+ tnv.Grant(owner.current)
+
+ var/datum/action/cooldown/spell/pointed/lesser_glare/lglare = new(owner.current)
+ lglare.Grant(owner.current)
+
+ var/datum/action/cooldown/spell/jaunt/shadow_walk/walk = new(owner.current)
+ walk.Grant(owner.current)
+
+ var/datum/objective/helpsling/O = new
+ O.update_explanation_text()
+ objectives += O
+ objectives_given += O
+ owner.announce_objectives()
/datum/antagonist/thrall/apply_innate_effects(mob/living/mob_override)
. = ..()
@@ -42,9 +57,17 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
message_admins("[key_name_admin(owner.current)] was dethralled!")
log_game("[key_name(owner.current)] was dethralled!")
owner.special_role = null
- for(var/datum/action/cooldown/spell/spells in owner.current.actions)
- if(is_type_in_typecache(spells, GLOB.thrall_spell_types)) //only remove thrall spells!
- spells.Remove(owner.current)
+ var/datum/action/cooldown/spell/lesser_shadowling_hivemind/hivemind_chat = new(owner.current)
+ hivemind_chat.Remove(owner.current)
+
+ var/datum/action/cooldown/spell/thrall_night_vision/tnv = new(owner.current)
+ tnv.Remove(owner.current)
+
+ var/datum/action/cooldown/spell/pointed/lesser_glare/lglare = new(owner.current)
+ lglare.Remove(owner.current)
+
+ var/datum/action/cooldown/spell/jaunt/shadow_walk/walk = new(owner.current)
+ walk.Remove(owner.current)
var/mob/living/M = owner.current
if(issilicon(M))
M.audible_message(span_notice("[M] lets out a short blip, followed by a low-pitched beep."))
@@ -55,6 +78,17 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
M.update_sight()
return ..()
+/datum/objective/helpsling
+ explanation_text = "Help your masters at all cost. They need to create 15 or more of your fellow brothers."
+
+/datum/objective/helpsling/check_completion()
+ if(..())
+ return TRUE
+ return (SSticker && SSticker.mode && SSticker.mode.shadowling_ascended)
+
+/datum/objective/helpsling/update_explanation_text()
+ explanation_text = "Help your masters at all cost. They need to create at least [SSticker.mode.required_thralls] your fellow brothers."
+
/datum/antagonist/thrall/greet()
to_chat(owner, span_shadowling("You see the truth. Reality has been torn away and you realize what a fool you've been."))
if(ispreternis(owner.current))
@@ -62,6 +96,7 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
else
to_chat(owner, span_shadowling("The shadowlings are your masters. Serve them above all else and ensure they complete their goals."))
to_chat(owner, span_shadowling("You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls."))
+ to_chat(owner, span_shadowling("Сonsider lesser shadowlings as blessed beings. Obey them as long as their orders do not conflict with real shadowlings orders."))
to_chat(owner, span_shadowling("Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask."))
to_chat(owner, span_shadowling("Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab."))
to_chat(owner, span_shadowling("You may communicate with your allies by using the Lesser Commune ability."))
@@ -69,3 +104,4 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
/datum/antagonist/thrall/roundend_report()
return "[printplayer(owner)]"
+
diff --git a/yogstation/icons/mob/mutant_bodyparts.dmi b/yogstation/icons/mob/mutant_bodyparts.dmi
index 24e542bbaad44812f4e31e8c576aaf39a44b2d44..f7a0dab1284c7ecd8fd929530f1094261ca2f94e 100644
GIT binary patch
literal 2425
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
T%y9km7Xl!!pe&x5xfA~e)(w-X
literal 3920
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
Date: Sat, 13 Jan 2024 09:26:58 +0300
Subject: [PATCH 2/3] fixing fixes
---
.../antagonists/shadowling/shadowling_abilities.dm | 2 --
.../shadowling/special_shadowling_abilities.dm | 8 ++++----
yogstation/code/modules/antagonists/shadowling/thrall.dm | 2 +-
3 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
index c6b3d5e198e9..096cd049b10d 100644
--- a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
@@ -786,8 +786,6 @@
LAZYREMOVE(thrallToEmpower.actions, lglare)
for(var/datum/action/cooldown/spell/thrall_night_vision/tnv in thrallToEmpower.actions) //dripstation edit
LAZYREMOVE(thrallToEmpower.actions, tnv) //dripstation edit
- for(var/datum/action/cooldown/spell/lesser_shadow_walk/lsw in thrallToEmpower.actions) //dripstation edit
- LAZYREMOVE(thrallToEmpower.actions, lsw) //dripstation edit
var/datum/action/cooldown/spell/pointed/sling/glare/sglare = new(thrallToEmpower)
sglare.Grant(thrallToEmpower)
diff --git a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
index 469886acb2d9..e8148b2e2642 100644
--- a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm
@@ -110,8 +110,8 @@
var/datum/action/cooldown/spell/aoe/veil/veil = new(H)
veil.Grant(H)
- var/datum/action/cooldown/spell/jaunt/void_jaunt/void_jaunt = new(H)
- void_jaunt.Grant(H)
+ //var/datum/action/cooldown/spell/jaunt/void_jaunt/void_jaunt = new(H) //dripstation edit, actually broken
+ //void_jaunt.Grant(H)
var/datum/action/cooldown/spell/jaunt/shadow_walk/shadow_walk = new(H)
shadow_walk.Grant(H)
@@ -221,8 +221,8 @@
var/datum/action/cooldown/spell/pointed/revive_thrall/ascendant/revasc = new(A)
revasc.Grant(A)
- var/datum/action/cooldown/spell/jaunt/void_jaunt/ascendant/jaunt = new(A)
- jaunt.Grant(A)
+ //var/datum/action/cooldown/spell/jaunt/void_jaunt/ascendant/jaunt = new(A) dripstation edit, actually broken
+ //jaunt.Grant(A)
var/datum/action/cooldown/spell/shadowling_hivemind_ascendant/hivemind = new(A)
hivemind.Grant(A)
diff --git a/yogstation/code/modules/antagonists/shadowling/thrall.dm b/yogstation/code/modules/antagonists/shadowling/thrall.dm
index 51b2c58ab4e6..998ad99a1e26 100644
--- a/yogstation/code/modules/antagonists/shadowling/thrall.dm
+++ b/yogstation/code/modules/antagonists/shadowling/thrall.dm
@@ -38,7 +38,7 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
var/datum/action/cooldown/spell/pointed/lesser_glare/lglare = new(owner.current)
lglare.Grant(owner.current)
- var/datum/action/cooldown/spell/jaunt/shadow_walk/walk = new(owner.current)
+ var/datum/action/cooldown/spell/jaunt/lesser_shadow_walk/walk = new(owner.current)
walk.Grant(owner.current)
var/datum/objective/helpsling/O = new
From a6627b5400d2402f3b5e562c612a385c9f641712 Mon Sep 17 00:00:00 2001
From: MrCastmer <125900379+MrCastmer@users.noreply.github.com>
Date: Thu, 1 Feb 2024 22:27:58 +0300
Subject: [PATCH 3/3] fix
---
.../human/species_types/shadowpeople.dm | 1 -
.../shadowling/shadowling_abilities.dm | 68 +++++++++----------
.../modules/antagonists/shadowling/thrall.dm | 2 +-
3 files changed, 35 insertions(+), 36 deletions(-)
diff --git a/modular_dripstation/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/modular_dripstation/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 374958ce128d..ebb1428b9a3b 100644
--- a/modular_dripstation/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/modular_dripstation/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -2,7 +2,6 @@
#define HEART_SPECIAL_SHADOWIFY 2
#define LIGHT_HEAL_THRESHOLD 2
#define LIGHT_DAMAGE_TAKEN 6
-#define LIGHT_DAM_THRESHOLD 0.25
/datum/species/shadow
burnmod = 1.1
diff --git a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
index 096cd049b10d..46b4ab4a83b3 100644
--- a/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
+++ b/yogstation/code/modules/antagonists/shadowling/shadowling_abilities.dm
@@ -171,9 +171,9 @@
var/turf/T = get_turf(owner)
for(var/datum/light_source/LS in T.get_affecting_lights())
var/atom/LO = LS.source_atom
- //if(isitem(LO)) //dripstation edit
- // extinguishItem(LO) //dripstation edit
- // continue //dripstation edit
+ /*if(isitem(LO)) //dripstation edit start
+ extinguishItem(LO)
+ continue*/ //dripstation edit end
if(istype(LO, /obj/machinery/light))
var/obj/machinery/light/L = LO
L.on = FALSE
@@ -181,30 +181,30 @@
L.update(0)
L.set_light(0)
continue
- //if(istype(LO, /obj/machinery/computer) || istype(LO, /obj/machinery/power/apc)) //dripstation edit start
- // LO.set_light(0)
- // LO.visible_message(span_warning("[LO] grows dim, its screen barely readable."))
- // continue
- //if(ismob(LO))
- // extinguish_mob(LO)
- //if(istype(LO, /mob/living/silicon/robot))
- // var/mob/living/silicon/robot/borg = LO
- // if(!borg.lamp_cooldown)
- // borg.smash_headlamp()
- //if(istype(LO, /obj/machinery/camera))
- // LO.set_light(0)
- // if(prob(10))
- // LO.emp_act(2)
- // continue
- //if(istype(LO, /obj/mecha))
- // var/obj/mecha/M = LO
- // M.set_light(0)
- // M.lights = FALSE
- //if(istype(LO, /obj/machinery/power/floodlight))
- // var/obj/machinery/power/floodlight/FL = LO
- // FL.change_setting(2) // Set floodlight to lowest setting
- //if(istype(LO, /obj/structure/light_prism))
- // qdel(LO)
+ /*if(istype(LO, /obj/machinery/computer) || istype(LO, /obj/machinery/power/apc)) //dripstation edit start
+ LO.set_light(0)
+ LO.visible_message(span_warning("[LO] grows dim, its screen barely readable."))
+ continue
+ if(ismob(LO))
+ extinguish_mob(LO)
+ if(istype(LO, /mob/living/silicon/robot))
+ var/mob/living/silicon/robot/borg = LO
+ if(!borg.lamp_cooldown)
+ borg.smash_headlamp()
+ if(istype(LO, /obj/machinery/camera))
+ LO.set_light(0)
+ if(prob(10))
+ LO.emp_act(2)
+ continue
+ if(istype(LO, /obj/mecha))
+ var/obj/mecha/M = LO
+ M.set_light(0)
+ M.lights = FALSE
+ if(istype(LO, /obj/machinery/power/floodlight))
+ var/obj/machinery/power/floodlight/FL = LO
+ FL.change_setting(2) // Set floodlight to lowest setting
+ if(istype(LO, /obj/structure/light_prism))
+ qdel(LO)*/ //dripstation edit end
if(istype(LO, /obj/machinery))
var/obj/machinery/M = LO
M.light_on = FALSE
@@ -546,13 +546,13 @@
empower.Grant(M)
var/datum/action/cooldown/spell/blindness_smoke/smoke = new(M)
smoke.Grant(M)
- //if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !null_charge_acquired) //dripstation edit start
- // null_charge_acquired = TRUE
- // to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
- // or sending power until repaired.")
- // var/datum/action/cooldown/spell/null_charge/null_charge = new(M)
- // null_charge.Grant(M)
- //if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
+ /*if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !null_charge_acquired) //dripstation edit start
+ null_charge_acquired = TRUE
+ to_chat(user, "The power of your thralls has granted you the Null Charge ability. This ability will drain an APC's contents to the void, preventing it from recharging \
+ or sending power until repaired.")
+ var/datum/action/cooldown/spell/null_charge/null_charge = new(M)
+ null_charge.Grant(M)
+ if(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)*/
if(thralls >= CEILING(7 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)
reviveThrallAcquired = TRUE
to_chat(user, "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 \
diff --git a/yogstation/code/modules/antagonists/shadowling/thrall.dm b/yogstation/code/modules/antagonists/shadowling/thrall.dm
index 998ad99a1e26..0521c4d04cfe 100644
--- a/yogstation/code/modules/antagonists/shadowling/thrall.dm
+++ b/yogstation/code/modules/antagonists/shadowling/thrall.dm
@@ -38,7 +38,7 @@ GLOBAL_LIST_INIT(thrall_spell_types, typecacheof(list(/datum/action/cooldown/spe
var/datum/action/cooldown/spell/pointed/lesser_glare/lglare = new(owner.current)
lglare.Grant(owner.current)
- var/datum/action/cooldown/spell/jaunt/lesser_shadow_walk/walk = new(owner.current)
+ var/datum/action/cooldown/spell/lesser_shadow_walk/walk = new(owner.current)
walk.Grant(owner.current)
var/datum/objective/helpsling/O = new