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