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 zcmai12UL^Gw*EsG0Rf{TAOVSrN)su1fIw&wQM&Xd9uW}fV1NLTLkk`y0*cZJB!CDJ zq=@t?7lkBQeAu2)_F<`0e%t=2y5)desqoe-_jd?R-d=moKGF`T_FY{iWrRI63UT*$Bz(gP03+C^4r60Zd3*+PC5(Zs2 zR>x>PG&y`b{jKKbV+X3LWFpNl{01p8V0?pf_v)$Gj>_^dSf3Nn>9F-GgBz$s$&x|1^glsR(XCg( zymF?SJ5HP}!M}Bq$=NC15MXs}&2Tc;wCM91qmkJnf^~3IOcw`MAyQA9j?6DDEeS`l zSlE>!FaD7P)teyvZ#4M2v_N%*lVV5;R4(Zo^&Qk005mi-rV*z#eNub4?%GR5op6V$ zOGreVd^zC?=2p+VSqk&#D(t$kJ-)1_UR!%Dg)4K)5oif-q{BqV+wVn}9Za8lCy)ZY zy36utT-|aKkPfN*r1EBBxqU*O6jP=7>V{DMW!dDtcfv_HU7JSVJGUD5Ya~ECSn(+z z^-nH4KZ(u+*9T-W`TXViDufImM^fnqk5)xrh$SRH$Vmnj+APUbMN8o#HDis6sbf~=jwu-xixx(qfNCjn>)MyTRpz@a!Ku`0maAW&ZN3@i56)ueX7*Tpocm$ z#39_yis{Un$+;RU*W3dZ|D&sbe>vIQN`@u(Qd`hb{&=g+jZK%A6MoDJvaex3#^Q*> zvQcuUdp>AUo}`LyZ%6qxDIPye-nu%ab%R96_jEqh5k&k2_^L}hU${zV?WO8h{Fn*L ziI`%tRn=1~LNl3V+SK_*w8B{ApPfF5UAU3w%0=`rJqQ;l=V?re zUSpJa`Z!3dwlYBop0m)si87aYvnI>({_AT2R$`J=nvjC6yZBwTD3l zDHQG*4X<#1Wav{O%&<+7%1A-aETjqlY51;|^fPH5>@{J|YtTeChB^SzL+${E z>k`@^MojlKT;RXW<_k=;t*!0k{gq?vo$ zXg&_Hsqv@^JFYKwZzXA7O{;0E_xB`%fpijHeXia*?f1kKXjtHy>Bay|_j7HEb)s`F zoL6|;I`Q%gE6L10qgNKnH?4{W8mCt5WEdyu7R)B@px&SNE9{ULwPB0ES>qV3fv}AB z6zHLgm$YRGcU2dGN%vR%ucDY@cy=8c3#~UyfnFO?-B!WOX)8y{lPVeU5%pxLX@n~= zauC$JxoeI+LugC=@q}TonDH)Vq&Hk8vo9Q?pSSyo zyu**R8~HcSK-wlAX0O+Q)OcL8?!t1HDZ%1>aIx8u;LZszj+p_7W>7893DQSKr4$Ol zbomUj&<1xt{_9BpheY^y<^sMv%cR=S0=Xxr(e^Jc#e(q`T-dk^=WPo3q+2Yo-&8XI z(av89_FW4tsFVPM$>P+GCfN2}=ZEIqrW3G4mXi)s{xHwmIGh|7 zdT4yPI@nfdLrdo;XOQa^n1GwfGELn6h4DjuYYT99Q{UhYr-IGZ;?5e4(Ax$CJI9~hjH9`aV80OC03>bk0#tKITn3w&9HH$hLj8PabpKk!*5!$CXju# zQMQa6X+v2s)3j(>|NYDwXjYhsEds^UU9y%;GUo>X^|XbZ+ntwP6IxcS>|e0iZd!>q z%d`lQuS61MBezxWN)@AR)nuwfju2cZ(x60>52rg8(^@sB$kwdlEuZUFD=$)%#-jy`9+=1#Z ze6Qx=qujq@4xYC#$5puf|Kk47m=2WEh0x~QUne6*<3~(}P@@TtOJF&%m&SV|jGZQU zcN>^Xg)paB+ImdIs!(X;w}&qLzo$gN7$9fsE=(OvYUmvb5=(J{_(Eyx4JAezN*a&x z{!YBqJ1Z<$f!m+7^+bmNaoqvh91@5(N>~7$+6)kn?;?2tkz)y^yOKRgrz+()OA7L| zIK)Ms{*8lRLT&F~&(I5DF3^$J_hZZKZC$6cqKrCroQIso{UjU}u0Zq@3#?ePDQg(( zXr~&|l&IyM>m}zdJ|1^?bJl%vKkL2f@VFPfHB#5x;5@Al139>aMC5oK+|bD`ZVOp8 z?X6cVkp6p`{31Y#{j*3F{N_1-s4_Zu=rUqIeo+BU zE0@vWIGzRB#`r;7mVk8Uw?)+Vndpe!>TjF7uBn^(WmETn^Vg&IX4WU{E}_AXnJXHm zl%T`lXY{bsIk>#E43764${;EkqqB1qE!vVj9u6^K-(%Rxua})ZyW^Yti_0VbLE!%! zb#!V zD{LGj?&!Hr$Aus1Z#ZD@z|4zm7SO=fuI0~;PnIx)VLBqtj3Z_bLWW9U&J#5b`&s?7 zuzxffo_~UZT_B2;OeFXjyHS1P80Z>7c_QHlY8lH;k$s)~uq=&3YlhJ1AT`mHbAb2K zxj=jf zpd@)rz_Q@xhse|E4maVsSD|Z-Mw!7ZgYuB8f&mn4!@!2QzGrUt`Fp&#-~9HVpJ)Jj zN;E1Nic~_~G3>bl**C60JvjO5rFP&ZzuYUD- zvm8E$)lxLT@x=Ukr2XFJ!*fx4M*+{W1MP8oPh$<}E9bV<0_UO{fQ;g#YD=*evn-d$ zaiJ^C5ya|!(&x$AoEaakrpl;YPGQAe{lz~nmMIz5o978TEJxQZTK@st-R~u$ZXxzW z$0WWE+A7*|QRt;G)g9~Z2w=LulezfE7T&YWti$#q5}W6|sJ}=zySbCYibw}xeIcIo z5^OE9L8*5}vR1ngcBS(^{BONoi$~PPE<@ihSL-$)Q7q(%nxGCe2Sow~A0jsrK+uW( zla!#xZa`19jsf%QX))cvmF8!#T0S1E6U(e{Kp_SMO`qm`&)D8&h<)MS5pWA?{%ybh z^Q7N~SK6svGq|Br_roV3pK|}*hZfbY&W<|@{RvcUtr@Y>@KqBD4&nrk*}{sc$xCAr z=mijelp(BYe7YQ-=G(l~o=#K0>B 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