diff --git a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm b/code/game/gamemodes/shadowling/ascendant_shadowling.dm similarity index 94% rename from code/modules/mob/living/simple_animal/ascendant_shadowling.dm rename to code/game/gamemodes/shadowling/ascendant_shadowling.dm index 9445db7592c..a7c87ca7aa3 100644 --- a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm +++ b/code/game/gamemodes/shadowling/ascendant_shadowling.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/ascendant_shadowling - name = "Ascendant Shadowling" + name = "ascendant shadowling" desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support." icon = 'icons/mob/mob.dmi' icon_state = "shadowling_ascended" @@ -25,7 +25,7 @@ minbodytemp = 0 maxbodytemp = INFINITY - environment_smash = 2 + environment_smash = 3 faction = list("faithless") diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index c1acd926c97..0fbb94aaa2e 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -46,6 +46,7 @@ Made by Xhuis var/required_thralls = 15 //How many thralls are needed (hardcoded for now) var/shadowling_ascended = 0 //If at least one shadowling has ascended var/shadowling_dead = 0 //is shadowling kill + var/objective_explanation /proc/is_thrall(var/mob/living/M) @@ -124,7 +125,7 @@ Made by Xhuis var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y if(objective == "enthrall") - var/objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." + objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." shadow_objectives += "enthrall" shadow_mind.memory += "Objective #1: [objective_explanation]" shadow_mind.current << "Objective #1: [objective_explanation]
" @@ -149,10 +150,8 @@ Made by Xhuis shadowling_thralls += new_thrall_mind update_shadow_icons_added(new_thrall_mind) new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall" - new_thrall_mind.memory += "The Shadowlings' Objectives: Ascend to your true form by use of the Ascendance ability. \ - This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." - new_thrall_mind.current << "The objectives of your shadowlings:: Ascend to your true form by use of the Ascendance ability. \ - This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability." + new_thrall_mind.memory += "The Shadowlings' Objectives: [objective_explanation]" + new_thrall_mind.current << "The objectives of the shadowlings: [objective_explanation]" new_thrall_mind.current.add_language("Shadowling Hivemind") new_thrall_mind.current.hud_updateflag |= (1 << SPECIALROLE_HUD) return 1 diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index e9678fff949..1935f3159d7 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -18,71 +18,74 @@ charge_counter = charge_max return + var/mob/living/carbon/human/M = target usr.visible_message("[usr]'s eyes flash a blinding red!") target.visible_message("[target] freezes in place, their eyes glazing over...") if(in_range(target, usr)) - target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..." + target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by their heavenly beauty..." else //Only alludes to the shadowling if the target is close by target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..." target.Stun(10) - if(target.reagents) - target.reagents.add_reagent("capulettium_plus", 4) //This is really bad but it's the only way it works. + M.silent += 10 /obj/effect/proc_holder/spell/wizard/aoe_turf/veil name = "Veil" - desc = "Extinguishes all electronic lights in a decent radius." + desc = "Extinguishes most nearby light sources." panel = "Shadowling Abilities" charge_max = 250 //Short cooldown because people can just turn the lights back on clothes_req = 0 range = 5 + var/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime) -/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/cast(list/targets) - usr << "You silently disable all nearby lights." - var/list/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime) - for(var/turf/T in targets) - for(var/obj/item/device/flashlight/F in T.contents) - if(is_type_in_list(F, blacklisted_lights)) - F.visible_message("[F] goes slightly dim for a moment.") +/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.") return F.on = 0 - F.visible_message("[F] gutters and falls dark.") F.update_brightness() + else if(istype(I, /obj/item/device/pda)) + var/obj/item/device/pda/P = I + P.fon = 0 + P.set_light(0) + else if(istype(I, /obj/item/clothing/head/helmet/space/rig)) + var/obj/item/clothing/head/helmet/space/rig/R = I + if(R.on) + R.on = 0 + R.icon_state = "rig[R.on]-[R._color]" + R.visible_message("[R]'s light fades and turns off.") + R.set_light(0) + return I.light_range + +/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/proc/extinguishMob(var/mob/living/H) + for(var/obj/item/F in H) + if(F.light_range > 0) + extinguishItem(F) + +/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/cast(list/targets) + usr << "You silently disable all nearby lights." + for(var/turf/T in targets) + for(var/obj/item/F in T.contents) + extinguishItem(F) + for(var/obj/machinery/floodlight/F in T.contents) + F.on = 0 + F.set_light(0) for(var/obj/machinery/light/L in T.contents) L.on = 0 L.visible_message("[L] flickers and falls dark.") L.update(0) - for(var/obj/item/device/pda/P in T.contents) - P.fon = 0 - P.set_light(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) - if(is_type_in_list(F, blacklisted_lights)) - F.visible_message("[F] goes slightly dim for a moment.") - return - F.on = 0 - F.visible_message("[F] gutters and falls dark.") - F.update_brightness() - for(var/obj/item/device/pda/P in H) - P.fon = 0 - P.set_light(0) //failsafe - for(var/obj/item/clothing/head/helmet/space/rig/R in H) - if(R.on) - R.on = 0 - R.icon_state = "rig[R.on]-[R._color]" - H.update_inv_head() - R.visible_message("[R]'s light fades and turns off.") - H.set_light(H.luminosity - R.brightness_on) - R.set_light(0) - if(H != usr) - H << "You feel a chill and are plunged into darkness." - H.luminosity = 0 //This might not be required, but it just acts as another failsafe. - - + for(var/obj/machinery/computer/C in T.contents) + C.set_light(0) + C.visible_message("[C] grows dim, its screen barely readable.") + for(var/mob/living/H in T.contents) + extinguishMob(H) /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk name = "Shadow Walk" @@ -96,7 +99,7 @@ /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk/cast(list/targets) for(var/mob/living/user in targets) playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) - user.visible_message("[user] vanishes into thin air!", "You enter the space between worlds as a passageway.") + user.visible_message("[user] vanishes in a puff of black mist!", "You enter the space between worlds as a passageway.") user.SetStunned(0) user.SetWeakened(0) user.incorporeal_move = 1 @@ -104,7 +107,7 @@ if(user.buckled) user.buckled.unbuckle() sleep(40) //4 seconds - user.visible_message("[user] appears out of nowhere!", "The pressure becomes too much and you vacate the interdimensional darkness.") + user.visible_message("[user] suddenly manifests!", "The pressure becomes too much and you vacate the interdimensional darkness.") user.incorporeal_move = 0 user.alpha = 255 @@ -119,7 +122,7 @@ clothes_req = 0 /obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze/cast(list/targets) - usr << "You freeze the nearby air." + usr << "You freeze the nearby air." playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1) for(var/turf/T in targets) @@ -150,12 +153,18 @@ var/enthralling = 0 /obj/effect/proc_holder/spell/wizard/targeted/enthrall/cast(list/targets) + var/mob/living/carbon/human/user = usr + listclearnulls(ticker.mode.thralls) + if(ticker.mode.thralls.len >= 5 && (!istype(user.species, /datum/species/shadow/ling))) + user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first." + charge_counter = charge_max + return for(var/mob/living/carbon/human/target in targets) if(!in_range(usr, target)) usr << "You need to be closer to enthrall [target]." charge_counter = charge_max return - if(!target.ckey) + if(!target.key) usr << "The target has no mind." charge_counter = charge_max return @@ -172,18 +181,18 @@ charge_counter = charge_max return if(enthralling) - usr << "You are already enthralling!" + usr << "You are already enthralling!" charge_counter = charge_max return enthralling = 1 usr << "This target is valid. You begin the enthralling." - target << "[usr] focuses in concentration. Your head begins to ache." + target << "[usr] stares at you. You feel your head begin to pulse." for(var/progress = 0, progress <= 3, progress++) switch(progress) if(1) usr << "You begin allocating energy for the enthralling." - usr.visible_message("[usr]'s eyes begin to throb a piercing red.") + usr.visible_message("[usr]'s eyes begin to throb a piercing red.") if(2) usr << "You begin the enthralling of [target]." usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.") @@ -192,19 +201,19 @@ 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!" + 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." + 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 + usr.visible_message("[usr]'s eyes flare brightly, their unflinching gaze staring constantly at [target].") + 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, 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." @@ -212,12 +221,13 @@ return enthralling = 0 - usr << "You have enthralled [target]!" - target << "You see the Truth. Reality has been torn away and you realize what a fool you've been." - target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." - target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." - target << "You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8) ability." - target.adjustOxyLoss(-200) //In case the shadowling was choking them out + usr << "You have enthralled [target]!" + target.visible_message("[target]'s expression appears as if they have experienced a revelation!", \ + "You see the Truth. Reality has been torn away and you realize what a fool you've been.") + target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." + target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." + target << "You can communicate with the other enlightened ones by speaking in the shadowling hivemind (:8)." + target.setOxyLoss(0) //In case the shadowling was choking them out ticker.mode.add_thrall(target.mind) target.mind.special_role = "Shadowling Thrall" @@ -231,8 +241,8 @@ include_user = 1 var/blind_smoke_acquired var/screech_acquired - var/drain_thrall_acquired - var/thrall_swap_acquired + var/drainLifeAcquired + var/reviveThrallAcquired /obj/effect/proc_holder/spell/wizard/targeted/collective_mind/cast(list/targets) for(var/mob/living/user in targets) @@ -245,7 +255,7 @@ for(M in living_mob_list) if(is_thrall(M)) thralls++ - M << "You feel hooks sink into your mind and pull." + M << "You feel hooks sink into your mind and pull." if(!do_after(user, 30)) user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind." @@ -257,21 +267,21 @@ " user.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke) - if(thralls >= 5 && !drain_thrall_acquired) - drain_thrall_acquired = 1 - user << "The power of your thralls has granted you the Drain Thrall ability. You can now drain nearby thralls to heal yourself." - user.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls) + if(thralls >= 5 && !drainLifeAcquired) + drainLifeAcquired = 1 + user << "The power of your thralls has granted you the Drain Life ability. You can now drain the health of nearby humans to heal yourself." + user.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/drainLife) if(thralls >= 7 && !screech_acquired) screech_acquired = 1 - user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies." + user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms." user.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech) - 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." - user.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation) + if(thralls >= 9 && !reviveThrallAcquired) + reviveThrallAcquired = 1 + 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." + user.mind.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/reviveThrall if(thralls < victory_threshold) user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present." @@ -285,8 +295,9 @@ M.mind.current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch //In case a shadowling hasn't hatched M.mind.current.verbs += /mob/living/carbon/human/proc/shadowling_ascendance if(M == usr) - return - M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend." //Tells all the other shadowlings + M << "You project this power to the rest of the shadowlings." + else + M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)" //Tells all the other shadowlings @@ -317,7 +328,7 @@ qdel(B) datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls - name = "!(%@ ERROR )!@$" + name = "odd black liquid" id = "blindness_smoke" description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>" color = "#000000" //Complete black (RGB: 0, 0, 0) @@ -329,8 +340,8 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) M << "You breathe in the black smoke, and your eyes burn horribly!" M.eye_blind = 5 if(prob(25)) - M.visible_message("[M] screams and claws at their eyes!") - M.Stun(2) + M.visible_message("[M] claws at their eyes!") + M.Stun(3) else M << "You breathe in the black smoke, and you feel revitalized!" M.heal_organ_damage(2,2) @@ -368,7 +379,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 INTERFERENCE DETECTED" + S << "ERROR $!(@ ERROR )#^! SENSOR 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 @@ -376,72 +387,86 @@ 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(50,100)) + W.hit(rand(80,100)) -/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls - name = "Drain Thralls" - desc = "Damages nearby thralls, draining their life and healing yourself." +/obj/effect/proc_holder/spell/wizard/aoe_turf/drainLife + name = "Drain Life" + desc = "Damages nearby humans, draining their life and healing your own wounds." panel = "Shadowling Abilities" range = 3 charge_max = 100 clothes_req = 0 - var/thralls_drained = 0 - var/list/nearby_thralls = list() + var/targetsDrained + var/list/nearbyTargets -/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls/cast(list/targets) - thralls_drained = 0 - nearby_thralls = list() +/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(is_thrall(M)) - thralls_drained++ - nearby_thralls.Add(M) - M << "You feel a curious draining sensation and a wave of exhaustion washes over you." - for(var/mob/living/carbon/M in nearby_thralls) - nearby_thralls.Remove(M) //To prevent someone dying like a zillion times - M.take_organ_damage(25/thralls_drained,25/thralls_drained) //For every nearby thrall, the damage to each is reduced - 1 thrall = 50 for him, 2 thralls = 25 for each, etc. - usr << "You draw the life from [M] to heal your wounds." - if(thralls_drained) - var/mob/living/carbon/U = usr - U.heal_organ_damage(25, 25) - else + targetsDrained++ + nearbyTargets.Add(M) + if(!targetsDrained) charge_counter = charge_max - usr << "There were no nearby thralls for you to drain." + usr << "There were no nearby humans for you to drain." + return + for(var/mob/living/carbon/M in nearbyTargets) + U.heal_organ_damage(10, 10) + U.adjustToxLoss(-10) + U.adjustOxyLoss(-10) + U.adjustStaminaLoss(-20) + U.AdjustWeakened(-1) + U.AdjustStunned(-1) + M.adjustOxyLoss(20) + M.adjustStaminaLoss(20) + M << "You feel a wave of exhaustion and a curious draining sensation directed towards [usr]!" + usr << "You draw life from those around you to heal your wounds." -/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation - name = "Spatial Relocation" - desc = "Swaps places with a thrall and breaks nearby lights." +/obj/effect/proc_holder/spell/wizard/targeted/reviveThrall + name = "Black Recuperation" + desc = "Brings a dead thrall back to life." panel = "Shadowling Abilities" - range = -1 + range = 1 charge_max = 3000 clothes_req = 0 - include_user = 1 + include_user = 0 var/list/thralls_in_world = list() -/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation/cast(list/targets, distanceoverride) - for(var/mob/living/carbon/human/M in world) - if(is_thrall(M)) - thralls_in_world += M - if(!thralls_in_world) - charge_counter = charge_max - return - var/mob/living/carbon/thrall_to_swap = input("Who do you wish to swap places with?", "Available Thralls") as null|anything in (thralls_in_world) - var/turf/shadowturf = get_turf(usr) - var/turf/thrallturf = get_turf(thrall_to_swap) - thrall_to_swap.visible_message("[thrall_to_swap] suddenly vanishes in a puff of black smoke!") - thrall_to_swap << "You feel a brief sense of nausea before finding yourself in an entirely new place!" - usr.visible_message("[usr] suddenly goes transparent and vanishes!") - usr << "You experience vertigo as you swap your location with [thrall_to_swap]'s." - thrall_to_swap.loc = shadowturf - usr.loc = thrallturf - thrall_to_swap.Weaken(4) - usr.Weaken(4) - usr.regenerate_icons() - thrall_to_swap.regenerate_icons() +/obj/effect/proc_holder/spell/wizard/targeted/reviveThrall/cast(list/targets) + for(var/mob/living/carbon/human/thrallToRevive in targets) + if(!is_thrall(thrallToRevive)) + usr << "[thrallToRevive] is not a thrall." + charge_counter = charge_max + return + if(thrallToRevive.stat != DEAD) + usr << "[thrallToRevive] is not dead." + charge_counter = charge_max + return + usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \ + "You crouch over the body of your thrall and begin gathering energy...") + var/mob/dead/observer/ghost = thrallToRevive.get_ghost() + 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)) + 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.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) + 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.") + thrallToRevive.Weaken(4) + thrallToRevive.emote("gasp") + playsound(thrallToRevive, "bodyfall", 50, 1) // ASCENDANT ABILITIES BEYOND THIS POINT // @@ -450,7 +475,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) desc = "Gibs a human after a short time." panel = "Ascendant" range = 7 - charge_max = 300 + charge_max = 0 clothes_req = 0 /obj/effect/proc_holder/spell/wizard/targeted/annihilate/cast(list/targets) @@ -482,7 +507,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) desc = "Instantly enthralls a human." panel = "Ascendant" range = 7 - charge_max = 450 + charge_max = 0 clothes_req = 0 /obj/effect/proc_holder/spell/wizard/targeted/hypnosis/cast(list/targets) @@ -512,10 +537,10 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall." target << "An agonizing spike of pain drives into your mind, and--" - target << "And you see the Truth. Reality has been torn away and you realize what a fool you've been." - target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." - target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." - target << "You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8)." + target << "And you see the Truth. Reality has been torn away and you realize what a fool you've been." + target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals." + target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls." + target << "You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8)." ticker.mode.add_thrall(target.mind) target.mind.special_role = "Thrall" target.add_language("Shadowling Hivemind") @@ -553,7 +578,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) desc = "Extremely empowered version of Flash Freeze." panel = "Ascendant" range = 5 - charge_max = 600 + charge_max = 100 clothes_req = 0 /obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast/cast(list/targets) @@ -562,7 +587,7 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) usr << "You are not in the same plane of existence. Unphase first." return - usr << "You freeze the nearby air." + usr << "You freeze the nearby air." playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1) for(var/turf/T in targets) @@ -580,24 +605,3 @@ datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob) target.take_organ_damage(0,80) - -/obj/effect/proc_holder/spell/wizard/targeted/vortex - name = "Vortex" - desc = "Tears open a hole in reality. Anyone, INCLUDING YOU, walking through it will be trapped there for eternity." - panel = "Ascendant" - range = -1 - include_user = 1 - charge_max = 1200 - clothes_req = 0 - -/obj/effect/proc_holder/spell/wizard/targeted/vortex/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." - return - - for(SHA in targets) - SHA.visible_message("[SHA] raises their arms upward as the markings on their body flare a blinding red!", \ - "You tear open a rift to the black space between worlds. It would be wise to avoid it.") - - new /obj/structure/shadow_vortex(SHA.loc) diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 1f88f350c4c..05af76eb2a9 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -1,5 +1,5 @@ //In here: Hatch and Ascendance - +var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "Noaey'gief", "Mii`mahza", "Amerziox", "Gyrg-mylin", "Kanet'pruunance", "Vigistaezian") /mob/living/carbon/human/proc/shadowling_hatch() set category = "Shadowling Evolution" set name = "Hatch" @@ -13,7 +13,7 @@ usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch return if("Yes") - usr.notransform = 1 + usr.Stun(INFINITY) //This is bad but notransform won't work. usr.visible_message("[usr]'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.") @@ -39,8 +39,8 @@ "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.") sleep(90) - usr.visible_message("[usr], now no longer recognizable as human, begins clawing at the resin walls around them.", \ - "Your false skin slips away. You begin tearing at the fragile membrane protecting you.") + usr.visible_message("[usr], skin shifting, begins tearing at the walls around them.", \ + "Your false skin slips away. You begin tearing at the fragile membrane protecting you.") sleep(80) playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1) @@ -54,9 +54,11 @@ sleep(10) playsound(usr.loc, 'sound/effects/ghost.ogg', 100, 1) - usr.real_name = "Shadowling ([rand(1,1000)])" + var/newNameId = pick(possibleShadowlingNames) + possibleShadowlingNames.Remove(newNameId) + usr.real_name = newNameId usr.name = usr.real_name - usr.notransform = 0 + usr.SetStunned(0) usr << "YOU LIVE!!!" for(var/obj/structure/alien/resin/wall/shadowling/W in orange(usr, 1)) @@ -102,7 +104,7 @@ usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance return if("Yes") - usr.notransform = 1 + usr.Stun(INFINITY) usr.visible_message("[usr] rapidly bends and contorts, their eyes flaring a deep crimson!", \ "You begin unlocking the genetic vault within you and prepare yourself for the power to come.") @@ -123,21 +125,25 @@ sleep(50) for(var/mob/M in mob_list) if(is_thrall(M) && !ticker.mode.shadowling_ascended) - M.visible_message("[M] trembles minutely as their form turns to ash, black smoke pouring from their disintegrating face.", \ - "It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.") + M.visible_message("[M] trembles minutely as they collapse, black smoke pouring from their disintegrating face.", \ + "It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.") ticker.mode.thralls -= M.mind //To prevent message spam M.death(0) - M.dust() usr << "Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood." - sleep(40) + sleep(20) + usr << "Yes!" + sleep(10) + usr << "YES!" + sleep(10) + usr << "YE--" + sleep(1) for(var/mob/living/M in orange(7, src)) M.Weaken(10) M << "An immense pressure slams you onto the ground!" - usr << "YOU LIVE!!!" - world << "

A horrible wail echoes in your mind as the world plunges into blackness.

" + world << "\"VYSHA NERADA YEKHEZET U'RUU!!\"" world << 'sound/hallucinations/veryfar_noise.ogg' for(var/obj/machinery/power/apc/A in world) A.overload_lighting() @@ -147,16 +153,14 @@ usr.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/hypnosis) usr.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift) usr.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast) - usr.mind.AddSpell(new /obj/effect/proc_holder/spell/wizard/targeted/vortex) usr.mind.transfer_to(A) A.spell_list = usr.spell_list A.name = usr.real_name A.languages = usr.languages if(A.real_name) A.real_name = usr.real_name - usr.alpha = 0 //This is pretty bad, but is also necessary for the shuttle call to function properly + usr.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly usr.flags |= GODMODE - usr.notransform = 1 sleep(50) if(!ticker.mode.shadowling_ascended) if(emergency_shuttle && emergency_shuttle.can_call()) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index fac26760073..9ba50242b59 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -83,7 +83,7 @@ h1.alert, h2.alert {color: #000000;} .kidan {color: #664205;} .slime {color: #0077AA;} .clown {color: #ff0000;} -.shadowling {color: #311648;} +.shadowling {color: #3b2769;} .vulpkanin {color: #B97A57;} .rough {font-family: "Trebuchet MS", cursive, sans-serif;} .say_quote {font-family: Georgia, Verdana, sans-serif;} @@ -94,6 +94,7 @@ h1.alert, h2.alert {color: #000000;} .interface {color: #330033;} .big {font-size: 3;} +.reallybig {font-size: 4;} .greentext {color: #00FF00; font-size: 3;} .redtext {color: #FF0000; font-size: 3;} diff --git a/paradise.dme b/paradise.dme index 131d5139d79..dc1abbf3b06 100644 --- a/paradise.dme +++ b/paradise.dme @@ -352,6 +352,7 @@ #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\revolution\rp_revolution.dm" +#include "code\game\gamemodes\shadowling\ascendant_shadowling.dm" #include "code\game\gamemodes\shadowling\shadowling.dm" #include "code\game\gamemodes\shadowling\shadowling_abilities.dm" #include "code\game\gamemodes\shadowling\shadowling_items.dm" @@ -1389,7 +1390,6 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\simple_animal\ascendant_shadowling.dm" #include "code\modules\mob\living\simple_animal\bees.dm" #include "code\modules\mob\living\simple_animal\borer.dm" #include "code\modules\mob\living\simple_animal\constructs.dm"