diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 2fb31659600..dbe031d68ff 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -232,13 +232,15 @@ Made by Xhuis
if(A)
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
- if(light_amount > 2) //Rapid death while in the light, countered by...
+ if(light_amount > 4) //Not complete blackness - they can live in very small light levels plus starlight
H.take_overall_damage(0,10)
H << "The light burns you!"
H << 'sound/weapons/sear.ogg'
- else if (light_amount < 2) //...extreme benefits while in the dark
- H.heal_overall_damage(5,3)
- H.adjustToxLoss(-3)
+ else if (light_amount < 2)
+ H.heal_overall_damage(5,5)
+ H.adjustToxLoss(-5)
+ H.adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have
+ H.adjustCloneLoss(-1)
H.SetWeakened(0)
H.SetStunned(0)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index bed2aee850d..844f52bbe5b 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -53,10 +53,11 @@
L.on = 0
L.visible_message("[L] flickers and falls dark.")
L.update(0)
- for(var/obj/item/device/pda/P in orange(5, usr))
+ for(var/obj/item/device/pda/P in T.contents)
P.fon = 0
- P.SetLuminosity(0) //failsafe
- for(var/obj/effect/glowshroom/G in orange(3, usr)) //Smaller radius
+ P.SetLuminosity(0)
+ for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius
+ G.visible_message("\The [G] withers away!")
qdel(G)
for(var/mob/living/carbon/human/H in T.contents)
for(var/obj/item/device/flashlight/F in H)
@@ -69,6 +70,8 @@
for(var/obj/item/device/pda/P in H)
P.fon = 0
P.SetLuminosity(0) //failsafe
+ if(H != usr)
+ H << "You feel a chill and are plunged into darkness."
H.luminosity = 0 //This is required with the object-based lighting
@@ -178,11 +181,23 @@
usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.")
target << "Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away."
target.Weaken(12)
+ sleep(20)
+ if(isloyal(target))
+ usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time."
+ usr.visible_message("[usr] halts for a moment, then begins passing its hand over [target]'s body.")
+ target << "You feel your loyalties begin to weaken!"
+ sleep(150) //15 seconds - not spawn() so the enthralling takes longer
+ usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue."
+ usr.visible_message("[usr] halts thier hand and resumes staring into [target]'s face.")
+ for(var/obj/item/weapon/implant/loyalty/L in target)
+ if(L && L.implanted)
+ qdel(L)
+ target << "Your unwavering loyalty to Nanotrasen falters, dims, dies."
if(3)
usr << "You begin rearranging [target]'s memories."
usr.visible_message("[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...")
target << "Your head cries out. The veil of reality begins to crumple and something evil bleeds through." //Ow the edge
- if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling
+ if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant
usr << "The enthralling has been interrupted - your target's mind returns to its previous state."
target << "Your thoughts become coherent once more. Already you can barely remember what's happened to you."
enthralling = 0
@@ -220,6 +235,30 @@
+/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor
+ name = "Regenerate Chitin"
+ desc = "Re-forms protective chitin that may be lost during cloning or similar processes."
+ panel = "Shadowling Abilities"
+ charge_max = 600
+ clothes_req = 0
+ range = -1
+ include_user = 1
+
+/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets)
+ for(var/mob/living/user in targets)
+ user.visible_message("[user]'s skin suddenly bubbles and begins to shift around their body!", \
+ "You regenerate your protective armor and cleanse your form of defects.")
+ user.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
+ user.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes)
+ user.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit)
+ user.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head)
+ user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
+ user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
+ user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses)
+ hardset_dna(user, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling
+
+
+
/obj/effect/proc_holder/spell/targeted/collective_mind
name = "Collective Hivemind"
desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities."
@@ -266,7 +305,7 @@
user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies."
user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech
- if(thralls >= 10 && !thrall_swap_acquired)
+ if(thralls >= 9 && !thrall_swap_acquired)
thrall_swap_acquired = 1
user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \
addition to shattering nearby lights."
@@ -363,7 +402,6 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
if(iscarbon(target))
var/mob/living/carbon/M = target
M << "A spike of pain drives into your head and scrambles your thoughts!"
- M.Weaken(2)
M.confused += 10
M.setEarDamage(M.ear_damage + 3)
else if(issilicon(target))
@@ -376,7 +414,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
sp.start()
S.Weaken(6)
for(var/obj/structure/window/W in T.contents)
- W.hit(rand(25,50))
+ W.hit(rand(50,100))
@@ -460,7 +498,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
charge_counter = charge_max
return
- for(var/mob/boom in targets)
+ for(var/mob/living/carbon/human/boom in targets)
if(is_shadow_or_thrall(boom))
usr << "Making an ally explode seems unwise."
charge_counter = charge_max
diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm
index 683d0a4bb81..01e0f5ae928 100644
--- a/code/game/gamemodes/shadowling/shadowling_items.dm
+++ b/code/game/gamemodes/shadowling/shadowling_items.dm
@@ -46,7 +46,7 @@
/obj/item/clothing/gloves/shadowling
name = "chitin hands"
- desc = "An electricity-resistant yet thin covering of the hands."
+ desc = "An electricity-resistant covering of the hands."
icon_state = "golem"
item_state = null
origin_tech = null
@@ -75,10 +75,11 @@
vision_flags = SEE_MOBS
darkness_view = 3
invis_view = 2
- flash_protect = 2
+ flash_protect = -1
unacidable = 1
flags = ABSTRACT | NODROP
+
/obj/structure/shadow_vortex
name = "vortex"
desc = "A swirling hole in the fabric of reality. Eye-watering chimes sound from its depths."
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 472bee1cd61..c5af4e5c7a3 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -85,6 +85,7 @@
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadow_walk
usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/flashfreeze
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/collective_mind
+ usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_regenarmor
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index a8b7ae88590..c644c33ab0d 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -173,7 +173,7 @@
/obj/item/weapon/implant/loyalty/implanted(mob/target)
..()
- if((target.mind in ticker.mode.head_revolutionaries) || (target.mind in ticker.mode.A_bosses) || (target.mind in ticker.mode.B_bosses))
+ if((target.mind in ticker.mode.head_revolutionaries) || (target.mind in ticker.mode.A_bosses) || (target.mind in ticker.mode.B_bosses) || is_shadow_or_thrall(target))
target.visible_message("[target] seems to resist the implant!", "You feel the corporate tendrils of Nanotrasen try to invade your mind!")
return 0
if((target.mind in ticker.mode.revolutionaries) || (target.mind in ticker.mode.A_gangsters) || (target.mind in ticker.mode.B_gangsters))
diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm
index 864b48fd34a..2659fed7197 100644
--- a/code/modules/reagents/Chemistry-Goon-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm
@@ -684,7 +684,8 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone,
/mob/living/simple_animal/hostile/poison,
- /mob/living/simple_animal/hostile/blob
+ /mob/living/simple_animal/hostile/blob,
+ /mob/living/simple_animal/ascendant_shadowling
)//exclusion list for things you don't want the reaction to create.
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
var/atom/A = holder.my_atom