diff --git a/code/game/gamemodes/shadowling/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
index 0c18d927e53..b57a75d9bf2 100644
--- a/code/game/gamemodes/shadowling/ascendant_shadowling.dm
+++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm
@@ -4,6 +4,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "shadowling_ascended"
icon_living = "shadowling_ascended"
+ speak = list("Azima'dox", "Mahz'kavek", "N'ildzak", "Kaz'vadosh")
speak_emote = list("telepathically thunders", "telepathically booms")
force_threshold = INFINITY //Can't die by normal means
health = 100000
@@ -13,6 +14,8 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
+ universal_speak = 1
+
response_help = "stares at"
response_disarm = "flails at"
response_harm = "flails at"
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 80c70788fc6..3d85f9ae4f9 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -133,8 +133,8 @@ Made by Xhuis
/datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind)
var/mob/living/carbon/human/S = shadow_mind.current
- shadow_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
- shadow_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/enthrall)
+ shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
+ shadow_mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/enthrall)
spawn(0)
shadow_mind.current.add_language("Shadowling Hivemind")
update_shadow_icons_added(shadow_mind)
@@ -152,9 +152,9 @@ Made by Xhuis
update_shadow_icons_added(new_thrall_mind)
new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall"
new_thrall_mind.current.add_language("Shadowling Hivemind")
- new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
- new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
- //new_thrall_mind.current.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/thrall_vision) //Uncomment when vision code is unfucked.
+ new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
+ new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
+ //new_thrall_mind.current.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/thrall_vision) //Uncomment when vision code is unfucked.
new_thrall_mind.current << "You see the truth. Reality has been torn away and you realize what a fool you've been."
new_thrall_mind.current << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals."
new_thrall_mind.current << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls."
@@ -168,10 +168,10 @@ Made by Xhuis
/datum/game_mode/proc/remove_thrall(datum/mind/thrall_mind, var/kill = 0)
if(!istype(thrall_mind) || !(thrall_mind in thralls) || !isliving(thrall_mind.current))
return 0 //If there is no mind, the mind isn't a thrall, or the mind's mob isn't alive, return
- update_shadow_icons_removed(thrall_mind)
thralls.Remove(thrall_mind)
thrall_mind.current.attack_log += "\[[time_stamp()]\] Dethralled"
thrall_mind.special_role = null
+ update_shadow_icons_removed(thrall_mind)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk)
//thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision) //uncomment when vision code is unfucked.
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 931f91ae361..09f089d1400 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -4,6 +4,7 @@
panel = "Shadowling Abilities"
charge_max = 300
clothes_req = 0
+ action_icon_state = "glare"
/obj/effect/proc_holder/spell/wizard/targeted/glare/cast(list/targets)
for(var/mob/living/carbon/human/target in targets)
@@ -34,6 +35,7 @@
panel = "Thrall Abilities"
charge_max = 450
clothes_req = 0
+ action_icon_state = "glare"
/obj/effect/proc_holder/spell/wizard/targeted/lesser_glare/cast(list/targets)
for(var/mob/living/carbon/human/target in targets)
@@ -65,13 +67,14 @@
clothes_req = 0
range = 5
var/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime)
+ action_icon_state = "veil"
/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/proc/extinguishItem(var/obj/item/I) //WARNING NOT SUFFICIENT TO EXTINGUISH AN ITEM HELD BY A MOB
if(istype(I, /obj/item/device/flashlight))
var/obj/item/device/flashlight/F = I
if(F.on)
if(is_type_in_list(I, blacklisted_lights))
- I.visible_message("[I] dims slightly, before the shadows around it scatter.")
+ I.visible_message("[I] dims slightly before scattering the shadows around it.")
return
F.on = 0
F.update_brightness()
@@ -125,6 +128,7 @@
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
@@ -149,6 +153,7 @@
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/lesser_shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
@@ -199,6 +204,7 @@
range = 5
charge_max = 1200
clothes_req = 0
+ action_icon_state = "icy_veins"
/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze/cast(list/targets)
usr << "You freeze the nearby air."
@@ -230,6 +236,7 @@
clothes_req = 0
range = 1 //Adjacent to user
var/enthralling = 0
+ action_icon_state = "enthrall"
/obj/effect/proc_holder/spell/wizard/targeted/enthrall/cast(list/targets)
var/mob/living/carbon/human/user = usr
@@ -319,6 +326,7 @@
var/screech_acquired
var/drainLifeAcquired
var/reviveThrallAcquired
+ action_icon_state = "collective_mind"
/obj/effect/proc_holder/spell/wizard/targeted/collective_mind/cast(list/targets)
for(var/mob/living/user in targets)
@@ -372,7 +380,7 @@
M.mind.spell_list -= CM
qdel(CM)
M.mind.remove_spell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
- M.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
+ M.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
if(M == usr)
M << "You project this power to the rest of the shadowlings."
else
@@ -388,6 +396,7 @@
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "black_smoke"
/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
for(var/mob/living/user in targets)
@@ -438,6 +447,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 300
clothes_req = 0
+ action_icon_state = "screech"
/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech/cast(list/targets)
usr.audible_message("[usr] lets out a horrible scream!")
@@ -458,7 +468,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
M.ear_damage += 3
else if(issilicon(target))
var/mob/living/silicon/S = target
- S << "ERROR $!(@ ERROR )#^! SENSOR OVERLOAD \[$(!@#"
+ S << "ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#"
S << 'sound/misc/interference.ogg'
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread
@@ -479,12 +489,15 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
var/targetsDrained
var/list/nearbyTargets
+ action_icon_state = "drain_life"
/obj/effect/proc_holder/spell/wizard/aoe_turf/drainLife/cast(list/targets, var/mob/living/carbon/human/U = usr)
targetsDrained = 0
nearbyTargets = list()
for(var/turf/T in targets)
for(var/mob/living/carbon/M in T.contents)
+ if(M == src)
+ continue
targetsDrained++
nearbyTargets.Add(M)
if(!targetsDrained)
@@ -514,6 +527,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
include_user = 0
var/list/thralls_in_world = list()
+ action_icon_state = "revive_thrall"
/obj/effect/proc_holder/spell/wizard/targeted/reviveThrall/cast(list/targets)
for(var/mob/living/carbon/human/thrallToRevive in targets)
@@ -531,15 +545,15 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
if(ghost)
ghost << "Your masters are resuscitating you! Return to your corpse if you wish to be brought to life. (Verbs -> Ghost -> Re-enter corpse)"
ghost << 'sound/effects/genetics.ogg'
- if(!do_mob(usr, thrallToRevive, 100))
+ if(!do_mob(usr, thrallToRevive, 30))
usr << "Your concentration snaps. The flow of energy ebbs."
charge_counter= charge_max
return
- usr << "You release a massive surge of energy into [thrallToRevive]!"
+ usr << "You release a massive surge of power into [thrallToRevive]!"
usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!")
playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
- sleep(20)
+ sleep(10)
thrallToRevive.revive()
thrallToRevive.visible_message("[thrallToRevive] draws in a huge breath, blinding violet light shining from their eyes.", \
"You have returned. One of your masters has brought you from the darkness beyond.")
@@ -556,6 +570,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 0
clothes_req = 0
+ action_icon_state = "annihilate"
/obj/effect/proc_holder/spell/wizard/targeted/annihilate/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -585,6 +600,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
range = 7
charge_max = 0
clothes_req = 0
+ action_icon_state = "enthrall"
/obj/effect/proc_holder/spell/wizard/targeted/hypnosis/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -627,6 +643,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
include_user = 1
charge_max = 15
clothes_req = 0
+ action_icon_state = "shadow_walk"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -645,37 +662,33 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
-/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast
- name = "Glacial Blast"
- desc = "Extremely empowered version of Icy Veins."
+/obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm
+ name = "Lightning Storm"
+ desc = "Shocks everyone nearby."
panel = "Ascendant"
- range = 5
+ range = 6
charge_max = 100
clothes_req = 0
+ action_icon_state = "lightning_storm"
-/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast/cast(list/targets)
+/obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
if(SHA.phasing)
usr << "You are not in the same plane of existence. Unphase first."
charge_counter = charge_max
return
- usr << "You freeze the nearby air."
- playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1)
+ usr.visible_message("A massive ball of lightning appears in [usr]'s hands and flares out!", \
+ "You conjure a ball of lightning and release it.")
for(var/turf/T in targets)
for(var/mob/living/carbon/human/target in T.contents)
if(is_shadow_or_thrall(target))
- if(target == usr) //No message for the user, of course
- continue
- else
- target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!"
- continue
- target << "You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel frost burns across your body!"
- target.Weaken(15)
- if(target.bodytemperature)
- target.bodytemperature -= INFINITY //:^)
- target.take_organ_damage(0,80)
+ continue
+ target << "You are struck by a bolt of lightning!"
+ playsound(target, 'sound/effects/eleczap.ogg', 50, 1)
+ target.electrocute_act(80, "lightning bolt")
+ usr.Beam(target,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit
name = "Ascendant Broadcast"
@@ -685,10 +698,11 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "transmit"
/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit/cast(list/targets)
for(var/mob/living/user in targets)
- var/text = stripped_input(user, "What do you want to say to everything on and near [world.name]?.", "Transmit to World", "")
+ var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
if(!text)
return
world << "\"[text]\""
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 8f4cdca3f73..0116b4f893f 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -8,6 +8,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "hatch"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr)
@@ -24,10 +25,8 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.visible_message("[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \
"You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.")
- for(var/obj/item/I in H) //drops all items
- var/obj/item/organ/O = I
- if(!istype(O) || O.owner != src)
- H.unEquip(I)
+ for(var/obj/item/I in H.contents - (H.organs | H.internal_organs)) //drops all items except organs
+ H.unEquip(I)
sleep(50)
var/turf/simulated/floor/F
@@ -91,12 +90,13 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
sleep(10)
H << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies."
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hatch)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/glare)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/veil)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/collective_mind)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/glare)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/veil)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze)
+ H.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/collective_mind)
+ H.mind.remove_spell(src)
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend
name = "Ascend"
@@ -106,6 +106,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
clothes_req = 0
range = -1
include_user = 1
+ action_icon_state = "ascend"
/obj/effect/proc_holder/spell/wizard/targeted/shadowling_ascend/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr)
@@ -153,14 +154,14 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list)
if(S == src) continue
H.mind.remove_spell(S)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/annihilate)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/hypnosis)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast)
- H.AddSpell(/obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit)
H.mind.transfer_to(A)
A.name = H.real_name
A.languages = H.languages
+ A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/annihilate)
+ A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/hypnosis)
+ A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift)
+ A.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/ascendant_storm)
+ A.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowlingAscendantTransmit)
if(A.real_name)
A.real_name = H.real_name
H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index b89c84cbcd8..3405a2489db 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -251,14 +251,13 @@
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
if(M.environment_smash >= 2)
- if(istype(src, /turf/simulated/wall/r_wall))
- if(M.environment_smash == 3)
- dismantle_wall(1)
- M << "You smash through the wall."
- else
- M << text("\blue You smash against the wall.")
- take_damage(rand(25, 75))
- return
+ if(M.environment_smash == 3)
+ dismantle_wall(1)
+ M << "You smash through the wall."
+ else
+ M << text("You smash against the wall.")
+ take_damage(rand(25, 75))
+ return
M << "\blue You push the wall but nothing happens!"
return
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 73053496473..72022255700 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -767,7 +767,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(isturf(loc))
var/turf/T = loc
light_amount = T.get_lumcount()*10
- if(light_amount > species.light_dam) //if there's enough light, start dying
+ if(light_amount > species.light_dam && !incorporeal_move) //if there's enough light, start dying
if(species.light_effect_amp)
adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10.
else
@@ -1797,9 +1797,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
holder.icon_state = "mutineer"
if("mutineer")
holder.icon_state = "mutineer"
- if("Shadowling")
+ if("shadowling")
holder.icon_state = "hudshadowling"
- if("Shadowling Thrall")
+ if("shadowling thrall")
holder.icon_state = "hudshadowlingthrall"
hud_list[SPECIALROLE_HUD] = holder
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 7a45b29f2ec..299c0a12e65 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 7103c823a4e..7ef3beadca4 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ