Shadowling update 3

This commit is contained in:
Xhuis
2015-08-03 16:35:42 -04:00
parent c9870a0fef
commit 4cefd114c5
13 changed files with 561 additions and 308 deletions
+6 -12
View File
@@ -1066,12 +1066,10 @@
src.spell_list = null
message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].")
log_admin("[key_name(usr)] has de-shadowling'ed [current].")
current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch
current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance
remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_ascend)
else if(src in ticker.mode.thralls)
ticker.mode.thralls -= src
special_role = null
current << "<span class='userdanger'>You have been brainwashed! You are no longer a thrall!</span>"
ticker.mode.remove_thrall(src,0)
message_admins("[key_name_admin(usr)] has de-thrall'ed [current].")
log_admin("[key_name(usr)] has de-thrall'ed [current].")
if("shadowling")
@@ -1080,9 +1078,9 @@
return
ticker.mode.shadows += src
special_role = "shadowling"
current << "<span class='deadsay'><b>You notice a brightening around you. No, it isn't that. The shadows grow, darken, swirl. The darkness has a new welcome for you, and you realize with a \
start that you can't be human. No, you are a shadowling, a harbringer of the shadows! Your alien abilities have been unlocked from within, and you may both commune with your allies and use \
a chrysalis to reveal your true form. You are to ascend at all costs.</b></span>"
current << "<span class='shadowling'><b>Something stirs deep in your mind. A red light floods your vision, and slowly you remember. Though your human disguise has served you well, the \
time is nigh to cast it off and enter your true form. You have disguised yourself amongst the humans, but you are not one of them. You are a shadowling, and you are to ascend at all costs.\
</b></span>"
ticker.mode.finalize_shadowling(src)
ticker.mode.update_shadow_icons_added(src)
if("thrall")
@@ -1090,10 +1088,6 @@
usr << "<span class='warning'>This only works on humans!</span>"
return
ticker.mode.add_thrall(src)
special_role = "thrall"
current << "<span class='deadsay'>All at once it becomes clear to you. Where others see darkness, you see an ally. You realize that the shadows are not dead and dark as one would think, but \
living, and breathing, and <b>eating</b>. Their children, the Shadowlings, are to be obeyed and protected at all costs.</span>"
current << "<span class='danger'>You may use the Hivemind Commune ability to communicate with your fellow enlightened ones.</span>"
message_admins("[key_name_admin(usr)] has thrall'ed [current].")
log_admin("[key_name(usr)] has thrall'ed [current].")
+11 -1
View File
@@ -89,6 +89,10 @@
src.text = ""
src.build_changeling(correct_person)
return src.text
if("shadowling")
src.text = ""
src.build_shadowling(correct_person)
return src.text
else
return null
@@ -289,4 +293,10 @@
*/
src.text += "These lifeforms are associated with the <B><U>[orgname1] [orgname2]</U></B> and may be attempting to acquire sensitive materials on their behalf. "
src.text += "Please take care not to alarm the crew, as <B><U>[cname]</U></B> may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!"
src.text += "<BR><HR>"
src.text += "<BR><HR>"
/datum/intercept_text/proc/build_shadowling(datum/mind/correct_person)
src.text += "<br><br>Sightings of strange alien creatures have been observed in your area. These aliens supposedly possess the ability to enslave unwitting personnel and leech from their power. \
Be wary of dark areas and ensure all lights are kept well-maintained. Closely monitor all crew for suspicious behavior and perform dethralling surgery if they have obvious tells. Investigate all \
reports of odd or suspicious sightings in maintenance."
src.text += "<br><br>"
@@ -1,6 +1,6 @@
/mob/living/simple_animal/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."
desc = "HOLY SHIT RUN THE FUCK AWAY"
icon = 'icons/mob/mob.dmi'
icon_state = "shadowling_ascended"
icon_living = "shadowling_ascended"
@@ -16,14 +16,14 @@
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
response_help = "stares at"
response_help = "pokes"
response_disarm = "flails at"
response_harm = "flails at"
harm_intent_damage = 0
melee_damage_lower = 35
melee_damage_upper = 35
attacktext = "claws at"
melee_damage_lower = 60 //Was 35, buffed
melee_damage_upper = 60
attacktext = "rends"
attack_sound = 'sound/weapons/slash.ogg'
minbodytemp = 0
@@ -36,4 +36,10 @@
return 1 //copypasta from carp code
/mob/living/simple_animal/ascendant_shadowling/get_spans()
return ..() | list(SPAN_REALLYBIG, SPAN_YELL)
return ..() | list(SPAN_REALLYBIG, SPAN_YELL) //MAKES THEM SHOUT WHEN THEY TALK
/mob/living/simple_animal/ascendant_shadowling/ex_act(severity)
return 0 //You think an ascendant can be hurt by bombs? HA
/mob/living/simple_animal/ascendant_shadowling/singularity_act()
return 0 //Well hi, fellow god! How are you today?
+56 -16
View File
@@ -131,27 +131,61 @@ Made by Xhuis
/datum/game_mode/proc/finalize_shadowling(datum/mind/shadow_mind)
var/mob/living/carbon/human/S = shadow_mind.current
shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch
shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/enthrall
shadow_mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
shadow_mind.add_spell(/obj/effect/proc_holder/spell/targeted/enthrall)
shadow_mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hivemind)
spawn(0)
shadow_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind
update_shadow_icons_added(shadow_mind)
if(shadow_mind.assigned_role == "Clown")
S << "<span class='notice'>Your alien nature has allowed you to overcome your clownishness.</span>"
S.dna.remove_mutation(CLOWNMUT)
/datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind)
if (!istype(new_thrall_mind))
if(!istype(new_thrall_mind))
return 0
if(!(new_thrall_mind in thralls))
update_shadow_icons_added(new_thrall_mind)
thralls += new_thrall_mind
new_thrall_mind.special_role = "thrall"
new_thrall_mind.current.attack_log += "\[[time_stamp()]\] <span class='danger'>Became a thrall</span>"
new_thrall_mind.memory += "<b>The Shadowlings' Objectives:</b> [objective_explanation]"
new_thrall_mind.current << "<b>The objectives of the shadowlings:</b> [objective_explanation]"
new_thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind
new_thrall_mind.add_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadowling_hivemind)
new_thrall_mind.add_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
new_thrall_mind.add_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
new_thrall_mind.add_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision)
new_thrall_mind.current << "<span class='shadowling'><b>You see the truth. Reality has been torn away and you realize what a fool you've been.</b></span>"
new_thrall_mind.current << "<span class='shadowling'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
new_thrall_mind.current << "<span class='shadowling'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
new_thrall_mind.current << "<span class='shadowling'>Your body has been irreversibly altered. The attentive can see this - you may conceal it by wearing a mask.</span>"
new_thrall_mind.current << "<span class='shadowling'>Though not nearly as powerful as your masters, you possess some weak powers. These can be found in the Thrall Abilities tab.</span>"
new_thrall_mind.current << "<span class='shadowling'>You may communicate with your allies by using the Lesser Commune ability.</span>"
return 1
/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()]\] <span class='danger'>Dethralled</span>"
thrall_mind.special_role = null
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadowling_hivemind)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
thrall_mind.remove_spell(/obj/effect/proc_holder/spell/targeted/thrall_vision)
if(kill && ishuman(thrall_mind.current)) //If dethrallization surgery fails, kill the mob as well as dethralling them
var/mob/living/carbon/human/H = thrall_mind.current
H.visible_message("<span class='warning'>[H] jerks violently and falls still.</span>", \
"<span class='userdanger'>A piercing white light floods your mind, banishing your memories as a thrall and--</span>")
H.death()
return 1
var/mob/living/M = thrall_mind.current
if(issilicon(M))
M.audible_message("<span class='notice'>[M] lets out a short blip.</span>", \
"<span class='userdanger'>You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...</span>")
else
M.visible_message("<span class='big'>[M] looks like their mind is their own again!</span>", \
"<span class='userdanger'>A piercing white light floods your eyes. Your mind is your own again! Though you try, you cannot remember anything about the shadowlings or your time \
under their command...</span>")
return 1
/datum/game_mode/shadowling/proc/check_shadow_victory()
var/success = 0 //Did they win?
if(shadow_objectives.Find("enthrall"))
@@ -165,7 +199,7 @@ Made by Xhuis
else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round
world << "<span class='redtext'><b>The shadowlings have been killed by the crew!</b></span>"
else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
world << "<span class='redtext'><b>The crew has escaped the station before the shadowlings could ascend!</b></span>"
world << "<span class='redtext'><b>The crew escaped the station before the shadowlings could ascend!</b></span>"
else
world << "<span class='redtext'><b>The shadowlings have failed!</b></span>"
..()
@@ -202,23 +236,20 @@ Made by Xhuis
heatmod = 2
/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H)
//H.shadowling_status = 1 //If they are affected more strongly by flashes and stuff
if(!H.weakeyes) H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs
var/light_amount = 0
H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry
if(isturf(H.loc)) //Copypasta
if(isturf(H.loc))
var/turf/T = H.loc
var/area/A = T.loc
if(A)
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
if(light_amount > LIGHT_DAM_THRESHOLD) //Not complete blackness - they can live in very small light levels plus starlight
light_amount = T.get_lumcount()
if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move) //Can survive in very small light levels. Also doesn't take damage while incorporeal, for shadow walk purposes
H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN)
H << "<span class='userdanger'>The light burns you!</span>"
H << 'sound/weapons/sear.ogg'
else if (light_amount < LIGHT_HEAL_THRESHOLD)
H.heal_overall_damage(5,5)
H.adjustToxLoss(-5)
H.adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have
H.adjustBrainLoss(-25) //Shad O. Ling gibbers, "CAN U BE MY THRALL?!!"
H.adjustCloneLoss(-1)
H.SetWeakened(0)
H.SetStunned(0)
@@ -232,3 +263,12 @@ Made by Xhuis
var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
shadow_hud.leave_hud(shadow_mind.current)
set_antag_hud(shadow_mind.current, null)
/turf/proc/get_lumcount()
var/light_amount
if(!src || !istype(src)) return
var/area/A = src.loc
if(!A || !istype(src)) return
if(A.lighting_use_dynamic) light_amount = src.lighting_lumcount
else light_amount = 10
return light_amount
@@ -1,4 +1,13 @@
/obj/effect/proc_holder/spell/targeted/glare
/obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H)
if(!H || !istype(H)) return
if(H.dna.species.id == "shadowling" && is_shadow(H)) return 1
if(!is_shadow_or_thrall(usr)) usr << "<span class='warning'>You can't wrap your head around how to do this.</span>"
else if(is_thrall(usr)) usr << "<span class='warning'>You aren't powerful enough to do this.</span>"
else if(is_shadow(usr)) usr << "<span class='warning'>Your telepathic ability is suppressed. Hatch or regenerate first.</span>"
return 0
/obj/effect/proc_holder/spell/targeted/glare //Stuns and mutes a human target for 10 seconds
name = "Glare"
desc = "Stuns and mutes a target for a decent duration."
panel = "Shadowling Abilities"
@@ -10,6 +19,9 @@
if(!ishuman(target))
charge_counter = charge_max
return
if(!shadowling_check(usr))
charge_counter = charge_max
return
if(target.stat)
charge_counter = charge_max
return
@@ -28,8 +40,7 @@
M.silent += 10
/obj/effect/proc_holder/spell/aoe_turf/veil
/obj/effect/proc_holder/spell/aoe_turf/veil //Puts out most nearby lights except for flares and yellow slime cores
name = "Veil"
desc = "Extinguishes most nearby light sources."
panel = "Shadowling Abilities"
@@ -38,12 +49,12 @@
range = 5
var/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime)
/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishItem(obj/item/I) //WARNING NOT SUFFICIENT TO EXTINGUISH AN ITEM HELD BY A MOB
/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishItem(obj/item/I) //Does not darken items held by mobs due to mobs having separate luminosity, use extinguishMob() or write your own proc.
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("<span class='danger'>[I] dims slightly, before the shadows around it scatter.</span>")
I.visible_message("<span class='danger'>[I] dims slightly before scattering the shadows around it.</span>")
return F.brightness_on //Necessary because flashlights become 0-luminosity when held. I don't make the rules of lightcode.
F.on = 0
F.update_brightness()
@@ -60,19 +71,22 @@
H.SetLuminosity(blacklistLuminosity) //I hate lightcode for making me do it this way
/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
usr << "<span class='shadowling'>You silently disable all nearby lights.</span>"
for(var/turf/T in targets)
for(var/obj/item/F in T.contents)
extinguishItem(F)
for(var/obj/machinery/light/L in T.contents)
L.on = 0
L.visible_message("<span class='danger'>[L] flickers and falls dark.</span>")
L.visible_message("<span class='warning'>[L] flickers and falls dark.</span>")
L.update(0)
for(var/obj/machinery/computer/C in T.contents)
C.SetLuminosity(0)
C.visible_message("<span class='danger'>[C] grows dim, its screen barely readable.</span>")
C.visible_message("<span class='warning'>[C] grows dim, its screen barely readable.</span>")
for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius
G.visible_message("<span class='warning'>\The [G] withers away!</span>")
G.visible_message("<span class='warning'>[G] withers away!</span>")
qdel(G)
for(var/mob/living/H in T.contents)
extinguishMob(H)
@@ -80,8 +94,7 @@
borgie.update_headlamp(1)
/obj/effect/proc_holder/spell/targeted/shadow_walk
/obj/effect/proc_holder/spell/targeted/shadow_walk //Grants the shadowling invisibility and phasing for 4 seconds
name = "Shadow Walk"
desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility."
panel = "Shadowling Abilities"
@@ -89,11 +102,15 @@
clothes_req = 0
range = -1
include_user = 1
sound = 'sound/effects/bamf.ogg'
/obj/effect/proc_holder/spell/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("<span class='warning'>[user] vanishes in a puff of black mist!</span>", "<span class='shadowling'>You enter the space between worlds as a passageway.</span>")
if(!shadowling_check(usr))
charge_counter = charge_max
return
playMagSound()
user.visible_message("<span class='warning'>[user] vanishes in a puff of black mist!</span>", "<span class='shadowling'>You enter the space between worlds as a tunnel.</span>")
user.SetStunned(0)
user.SetWeakened(0)
user.incorporeal_move = 1
@@ -101,47 +118,47 @@
if(user.buckled)
user.buckled.unbuckle_mob()
sleep(40) //4 seconds
user.visible_message("<span class='warning'>[user] suddenly manifests!</span>", "<span class='shadowling'>The pressure becomes too much and you vacate the interdimensional darkness.</span>")
user.visible_message("<span class='warning'>[user] suddenly manifests!</span>", "<span class='shadowling'>The pressure becomes too much and you exit the rift.</span>")
user.incorporeal_move = 0
user.alpha = 255
/obj/effect/proc_holder/spell/aoe_turf/flashfreeze
name = "Flash Freeze"
/obj/effect/proc_holder/spell/aoe_turf/flashfreeze //Stuns and freezes nearby people - a bit more effective than a changeling's cryosting
name = "Icy Veins"
desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage."
panel = "Shadowling Abilities"
range = 5
charge_max = 1200
clothes_req = 0
sound = 'sound/effects/ghost2.ogg'
/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
usr << "<span class='shadowling'>You freeze the nearby air.</span>"
playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1)
playMagSound()
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
for(var/mob/living/carbon/M in T.contents)
if(is_shadow_or_thrall(M))
if(M == usr) //No message for the user, of course
continue
else
target << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
M << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
continue
target << "<span class='userdanger'>You are hit by a blast of paralyzingly cold air and feel goosebumps break out across your body!</span>"
target.Stun(2)
if(target.bodytemperature)
target.bodytemperature -= 200 //Extreme amount of initial cold
if(target.reagents)
target.reagents.add_reagent("frostoil", 15) //Half of a cryosting
M << "<span class='userdanger'>A wave of shockingly cold air engulfs you!</span>"
M.Stun(2)
if(M.bodytemperature)
M.bodytemperature -= 200 //Extreme amount of initial cold
if(M.reagents)
M.reagents.add_reagent("frostoil", 15) //Half of a cryosting
//Enthrall is the single most important spell
/obj/effect/proc_holder/spell/targeted/enthrall
/obj/effect/proc_holder/spell/targeted/enthrall //Turns a target into the shadowling's slave. This overrides all previous loyalties
name = "Enthrall"
desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast."
panel = "Shadowling Abilities"
charge_max = 450
charge_max = 0
clothes_req = 0
range = 1 //Adjacent to user
var/enthralling = 0
@@ -149,7 +166,8 @@
/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets)
var/mob/living/carbon/human/user = usr
listclearnulls(ticker.mode.thralls)
if(ticker.mode.thralls.len >= 5 && (user.dna.species.id != "shadowling"))
if(!shadowling_check(usr)) return
if(ticker.mode.thralls.len >= 5)
user << "<span class='warning'>With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first.</span>"
charge_counter = charge_max
return
@@ -158,7 +176,7 @@
usr << "<span class='warning'>You need to be closer to enthrall [target].</span>"
charge_counter = charge_max
return
if(!target.key)
if(!target.key || !target.mind)
usr << "<span class='warning'>The target has no mind.</span>"
charge_counter = charge_max
return
@@ -179,7 +197,7 @@
charge_counter = charge_max
return
if(!target.client)
usr << "<span class='warning'>[target]'s mind is vacant of activity. Still, you may rearrange their memories in the case of their return.</span>"
usr << "<span class='warning'>[target]'s mind is vacant of activity.</span>"
enthralling = 1
usr << "<span class='danger'>This target is valid. You begin the enthralling.</span>"
target << "<span class='userdanger'>[usr] stares at you. You feel your head begin to pulse.</span>"
@@ -208,28 +226,24 @@
target << "<span class='boldannounce'>Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies. You feel a sense of liberation which is quickly stifled by terror.</span>"
if(3)
usr << "<span class='notice'>You begin rearranging [target]'s memories.</span>"
usr.visible_message("<span class='danger'>[usr]'s eyes flare brightly, their unflinching gaze staring constantly at [target].</span>")
usr.visible_message("<span class='danger'>[usr]'s eyes flare brightly.</span>")
target << "<span class='boldannounce'>Your head cries out. The veil of reality begins to crumple and something evil bleeds through.</span>" //Ow the edge
if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant
usr << "<span class='warning'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>"
target << "<span class='userdanger'>A spike of pain drives into your head. You aren't sure what's happened, but you feel a faint sense of revulsion.</span>"
target << "<span class='userdanger'>A spike of pain drives into your head, wiping your memory. You aren't sure what's happened, but you feel a faint sense of revulsion.</span>"
enthralling = 0
return
enthralling = 0
usr << "<span class='shadowling'>You have enthralled <b>[target]</b>!</span>"
target.visible_message("<span class='big'>[target]'s expression appears as if they have experienced a revelation!</span>", \
"<span class='shadowling'><b>You see the Truth. Reality has been torn away and you realize what a fool you've been.</b></span>")
target << "<span class='shadowling'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
target << "<span class='shadowling'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
target << "<span class='shadowling'>You can communicate with the other enlightened ones by using the Hivemind Commune ability.</span>"
target.visible_message("<span class='big'>[target] looks to have experienced a revelation!</span>", \
"<span class='warning'>False faces all d<b>ark not real not real not--</b></span>")
target.setOxyLoss(0) //In case the shadowling was choking them out
ticker.mode.add_thrall(target.mind)
target.mind.special_role = "Thrall"
target.mind.special_role = "thrall"
/obj/effect/proc_holder/spell/targeted/shadowling_hivemind
/obj/effect/proc_holder/spell/targeted/shadowling_hivemind //Lets a shadowling talk to its allies
name = "Hivemind Commune"
desc = "Allows you to silently communicate with all other shadowlings and thralls."
panel = "Shadowling Abilities"
@@ -240,16 +254,19 @@
/obj/effect/proc_holder/spell/targeted/shadowling_hivemind/cast(list/targets)
for(var/mob/living/user in targets)
var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "")
if(!is_shadow(user))
user << "<span class='warning'><b>As you attempt to commune with the others, an agonizing spike of pain drives itself into your head!</b></span>"
user.apply_damage(10, BRUTE, "head")
return
var/text = stripped_input(user, "What do you want to say your thralls and fellow shadowlings?.", "Hive Chat", "")
if(!text)
return
for(var/mob/M in mob_list)
if(is_shadow_or_thrall(M) || (M in dead_mob_list))
M << "<span class='shadowling'><b>\[Hive Chat\]</b><i> [usr.real_name]</i>: [text]</span>"
M << "<span class='shadowling'><b>\[Shadowling\]</b><i> [usr.real_name]</i>: [text]</span>"
/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor
/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor
name = "Regenerate Chitin"
desc = "Re-forms protective chitin that may be lost during cloning or similar processes."
panel = "Shadowling Abilities"
@@ -260,7 +277,7 @@
/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor/cast(list/targets)
for(var/mob/living/user in targets)
user.visible_message("<span class='warning'>[user]'s skin suddenly bubbles and begins to shift around their body!</span>", \
user.visible_message("<span class='warning'>[user]'s skin suddenly bubbles and shifts around their body!</span>", \
"<span class='shadowling'>You regenerate your protective armor and cleanse your form of defects.</span>")
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)
@@ -269,11 +286,10 @@
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
hardset_dna(user, null, null, null, null, /datum/species/shadow/ling)
/obj/effect/proc_holder/spell/targeted/collective_mind
/obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount
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."
panel = "Shadowling Abilities"
@@ -288,6 +304,9 @@
/obj/effect/proc_holder/spell/targeted/collective_mind/cast(list/targets)
for(var/mob/living/user in targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
var/thralls = 0
var/victory_threshold = 15
var/mob/M
@@ -312,7 +331,7 @@
if(thralls >= 5 && !drainLifeAcquired)
drainLifeAcquired = 1
user << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Drain Life</b> ability. You can now drain the health of nearby humans to heal yourself.</i></span>"
user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drainLife
user.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/drain_life
if(thralls >= 7 && !screech_acquired)
screech_acquired = 1
@@ -323,7 +342,7 @@
reviveThrallAcquired = 1
user << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Black Recuperation</b> ability. This will, after a short time, bring a dead thrall completely back to life \
with no bodily defects.</i></span>"
user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/reviveThrall
user.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revive_thrall
if(thralls < victory_threshold)
user << "<span class='shadowling'>You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.</span>"
@@ -333,17 +352,19 @@
usr << "<span class='shadowling'><b>You may find Ascendance in the Shadowling Evolution tab.</b></span>"
for(M in living_mob_list)
if(is_shadow(M))
M.mind.spell_list -= /obj/effect/proc_holder/spell/targeted/collective_mind
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
var/obj/effect/proc_holder/spell/targeted/collective_mind/CM
if(CM in M.mind.spell_list)
M.mind.spell_list -= CM
qdel(CM)
M.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
M.mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_ascend)
if(M == usr)
M << "<span class='shadowling'><i>You project this power to the rest of the shadowlings.</i></span>"
else
M << "<span class='shadowling'><b>[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)</b></span>" //Tells all the other shadowlings
/obj/effect/proc_holder/spell/targeted/blindness_smoke
/obj/effect/proc_holder/spell/targeted/blindness_smoke //Spawns a cloud of smoke that blinds non-thralls/shadows and grants slight healing to shadowlings and their allies
name = "Blindness Smoke"
desc = "Spews a cloud of smoke which will blind enemies."
panel = "Shadowling Abilities"
@@ -351,13 +372,17 @@
clothes_req = 0
range = -1
include_user = 1
sound = 'sound/effects/bamf.ogg'
/obj/effect/proc_holder/spell/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
for(var/mob/living/user in targets)
user.visible_message("<span class='warning'>[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!</span>")
if(!shadowling_check(usr))
charge_counter = charge_max
return
playMagSound()
user.visible_message("<span class='warning'>[user] bends over and coughs out a cloud of black smoke!</span>")
user << "<span class='shadowling'>You regurgitate a vast cloud of blinding smoke.</span>"
playsound(user, 'sound/effects/bamf.ogg', 50, 1)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc) //hacky
B.reagents.clear_reagents() //Just in case!
B.icon_state = null //Invisible
B.reagents.add_reagent("blindness_smoke", 10)
@@ -370,7 +395,7 @@
S.start()
qdel(B)
datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls
datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
name = "odd black liquid"
id = "blindness_smoke"
description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>"
@@ -394,19 +419,21 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
return
/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech
/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech //Damages nearby windows, confuses nearby carbons, and outright stuns silly cones
name = "Sonic Screech"
desc = "Deafens, stuns, and confuses nearby people. Also shatters windows."
panel = "Shadowling Abilities"
range = 7
charge_max = 300
clothes_req = 0
sound = 'sound/effects/screech.ogg'
/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
usr.audible_message("<span class='warning'><b>[usr] lets out a horrible scream!</b></span>")
playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1)
playMagSound()
for(var/turf/T in targets)
for(var/mob/target in T.contents)
if(is_shadow_or_thrall(target))
@@ -421,7 +448,7 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
M.setEarDamage(M.ear_damage + 3)
else if(issilicon(target))
var/mob/living/silicon/S = target
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSOR OVERLOAD \[$(!@#</b></span>"
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \[$(!@#</b></span>"
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
@@ -432,8 +459,7 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
W.hit(rand(80, 100))
/obj/effect/proc_holder/spell/aoe_turf/drainLife
/obj/effect/proc_holder/spell/aoe_turf/drain_life //Deals stamina and oxygen damage to nearby humans and heals the shadowling. On a short cooldown because of the small range and situational usefulness
name = "Drain Life"
desc = "Damages nearby humans, draining their life and healing your own wounds."
panel = "Shadowling Abilities"
@@ -443,7 +469,10 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
var/targetsDrained
var/list/nearbyTargets
/obj/effect/proc_holder/spell/aoe_turf/drainLife/cast(list/targets, mob/living/carbon/human/U = usr)
/obj/effect/proc_holder/spell/aoe_turf/drain_life/cast(list/targets, mob/living/carbon/human/U = usr)
if(!shadowling_check(usr))
charge_counter = charge_max
return
targetsDrained = 0
nearbyTargets = list()
for(var/turf/T in targets)
@@ -467,8 +496,7 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
usr << "<span class='shadowling'>You draw life from those around you to heal your wounds.</span>"
/obj/effect/proc_holder/spell/targeted/reviveThrall
/obj/effect/proc_holder/spell/targeted/revive_thrall //Completely revives a dead thrall
name = "Black Recuperation"
desc = "Brings a dead thrall back to life."
panel = "Shadowling Abilities"
@@ -478,13 +506,16 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
include_user = 0
var/list/thralls_in_world = list()
/obj/effect/proc_holder/spell/targeted/reviveThrall/Topic(href, href_list)
/obj/effect/proc_holder/spell/targeted/revive_thrall/Topic(href, href_list)
if(href_list["reenter"])
var/mob/dead/observer/ghost = usr
if(istype(ghost))
ghost.reenter_corpse(ghost)
/obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/revive_thrall/cast(list/targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
for(var/mob/living/carbon/human/thrallToRevive in targets)
if(!is_thrall(thrallToRevive))
usr << "<span class='warning'>[thrallToRevive] is not a thrall.</span>"
@@ -496,19 +527,16 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
return
usr.visible_message("<span class='danger'>[usr] kneels over [thrallToRevive], placing their hands on \his chest.</span>", \
"<span class='shadowling'>You crouch over the body of your thrall and begin gathering energy...</span>")
var/mob/dead/observer/ghost = thrallToRevive.get_ghost()
if(ghost)
ghost << "<span class='ghostalert'>Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.</span> <a href=?src=\ref[src];reenter=1>(Click to re-enter)</a>"
ghost << 'sound/effects/genetics.ogg'
if(!do_mob(usr, thrallToRevive, 100))
thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.")
if(!do_mob(usr, thrallToRevive, 30))
usr << "<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>"
charge_counter= charge_max
return
usr << "<span class='shadowling'><b><i>You release a massive surge of energy into [thrallToRevive]!</b></i></span>"
usr << "<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>"
usr.visible_message("<span class='boldannounce'><i>Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!</i></span>")
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("<span class='boldannounce'>[thrallToRevive] draws in a huge breath, blinding violet light shining from their eyes.</span>", \
"<span class='shadowling'><b><i>You have returned. One of your masters has brought you from the darkness beyond.</b></i></span>")
@@ -516,15 +544,124 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
thrallToRevive.emote("gasp")
playsound(thrallToRevive, "bodyfall", 50, 1)
// THRALL ABILITIES BEYOND THIS POINT //
/obj/effect/proc_holder/spell/targeted/lesser_glare //Thrall version of Glare - same effects but for 3 seconds
name = "Lesser Glare"
desc = "Stuns and mutes a target for a short duration."
panel = "Thrall Abilities"
charge_max = 450
clothes_req = 0
/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets)
for(var/mob/living/carbon/human/target in targets)
if(!ishuman(target) || !target)
charge_counter = charge_max
return
if(target.stat)
charge_counter = charge_max
return
if(is_shadow_or_thrall(target))
usr << "<span class='danger'>You don't see why you would want to paralyze an ally.</span>"
charge_counter = charge_max
return
var/mob/living/carbon/human/M = target
usr.visible_message("<span class='warning'><b>[usr]'s eyes flash a bright red!</b></span>")
target.visible_message("<span class='danger'>[target] freezes in place, their eyes clouding...</span>")
if(in_range(target, usr))
target << "<span class='userdanger'>Your gaze is forcibly drawn into [usr]'s eyes, and you are starstruck by the heavenly lights...</span>"
else //Only alludes to the shadowling if the target is close by
target << "<span class='userdanger'>Red lights suddenly dance in your vision, and you are starstruck by their heavenly beauty...</span>"
target.Stun(3) //Roughly 30% as long as the normal one
M.silent += 3
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk //Thrall version of Shadow Walk, only works in darkness, doesn't grant phasing, but gives near-invisibility
name = "Guise"
desc = "Wraps your form in shadows, making you harder to see."
panel = "Thrall Abilities"
charge_max = 1200
clothes_req = 0
range = -1
include_user = 1
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
var/lumcount = 0
var/turf/T = user.loc
lumcount = T.get_lumcount()
if(lumcount > LIGHT_DAM_THRESHOLD)
user << "<span class='warning'>It's too bright to do that!</span>"
charge_counter = charge_max
return
user.visible_message("<span class='warning'>[user] suddenly fades away!</span>", "<span class='shadowling'>You veil yourself in darkness, making you harder to see.</span>")
user.alpha = 20
sleep(40)
user.visible_message("<span class='warning'>[user] appears from nowhere!</span>", "<span class='shadowling'>Your shadowy guise slips away.</span>")
user.alpha = initial(user.alpha)
/obj/effect/proc_holder/spell/targeted/thrall_vision //Toggleable night vision for thralls
name = "Darksight"
desc = "Gives you night vision."
panel = "Thrall Abilities"
charge_max = 0
range = -1
include_user = 1
clothes_req = 0
var/active = 0
/obj/effect/proc_holder/spell/targeted/thrall_vision/cast(list/targets)
for(var/mob/living/user in targets)
if(!istype(user) || !ishuman(user)) return
var/mob/living/carbon/human/H = user
active = !active
if(active)
user << "<span class='notice'>You shift the nerves in your eyes, allowing you to see in the dark.</span>"
H.see_in_dark = 8
H.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM
else
user << "<span class='notice'>You return your vision to normal.</span>"
H.see_in_dark = 0
H.dna.species.invis_sight = initial(H.dna.species.invis_sight)
/obj/effect/proc_holder/spell/targeted/lesser_shadowling_hivemind //Lets a thrall talk with their allies
name = "Lesser Commune"
desc = "Allows you to silently communicate with all other shadowlings and thralls."
panel = "Thrall Abilities"
charge_max = 50
clothes_req = 0
range = -1
include_user = 1
/obj/effect/proc_holder/spell/targeted/lesser_shadowling_hivemind/cast(list/targets)
for(var/mob/living/user in targets)
if(!is_shadow_or_thrall(user))
user << "<span class='warning'><b>As you attempt to commune with the others, an agonizing spike of pain drives itself into your head!</b></span>"
user.apply_damage(10, BRUTE, "head")
return
var/text = stripped_input(user, "What do you want to say your masters and fellow thralls?.", "Lesser Commune", "")
if(!text)
return
for(var/mob/M in mob_list)
if(is_shadow_or_thrall(M) || (M in dead_mob_list))
M << "<span class='shadowling'><b>\[Thrall\]</b><i> [usr.real_name]</i>: [text]</span>"
// ASCENDANT ABILITIES BEYOND THIS POINT //
/obj/effect/proc_holder/spell/targeted/annihilate
/obj/effect/proc_holder/spell/targeted/annihilate //Gibs someone instantly.
name = "Annihilate"
desc = "Gibs a human after a short time."
desc = "Gibs someone instantly."
panel = "Ascendant"
range = 7
charge_max = 0
clothes_req = 0
sound = 'sound/magic/Staff_Chaos.ogg'
/obj/effect/proc_holder/spell/targeted/annihilate/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
@@ -533,24 +670,22 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
charge_counter = charge_max
return
for(var/mob/living/carbon/human/boom in targets)
for(var/mob/living/boom in targets)
if(is_shadow_or_thrall(boom))
usr << "<span class='warning'>Making an ally explode seems unwise.<span>"
charge_counter = charge_max
return
usr.visible_message("<span class='danger'>[usr]'s eyes flare as they gesture at [boom]!</span>", \
"<span class='shadowling'>You direct a lance of telekinetic energy at [boom].</span>")
boom << "<span class='userdanger'><font size=3>You feel an immense pressure building all across your body!</span></font>"
boom.Stun(10)
boom.audible_message("<b>[boom]</b> screams!")
sleep(20)
playsound(boom, 'sound/effects/splat.ogg', 100, 1)
usr.visible_message("<span class='danger'>[usr]'s markings flare as they gesture at [boom]!</span>", \
"<span class='shadowling'>You direct a lance of telekinetic energy into [boom].</span>")
playMagSound()
sleep(4)
if(iscarbon(boom))
playsound(boom, 'sound/magic/Disintegrate.ogg', 100, 1)
boom.visible_message("<span class='userdanger'>[boom] explodes!</span>")
boom.gib()
/obj/effect/proc_holder/spell/targeted/hypnosis
/obj/effect/proc_holder/spell/targeted/hypnosis //Enthralls someone instantly. Nonlethal alternative to Annihilate
name = "Hypnosis"
desc = "Instantly enthralls a human."
panel = "Ascendant"
@@ -570,7 +705,7 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
usr << "<span class='warning'>You cannot enthrall an ally.<span>"
charge_counter = charge_max
return
if(!target.ckey)
if(!target.ckey || !target.mind)
usr << "<span class='warning'>The target has no mind.</span>"
charge_counter = charge_max
return
@@ -585,18 +720,13 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
usr << "<span class='shadowling'>You instantly rearrange <b>[target]</b>'s memories, hyptonitizing them into a thrall.</span>"
target << "<span class='userdanger'><font size=3>An agonizing spike of pain drives into your mind, and--</font></span>"
target << "<span class='shadowling'><b>And you see the Truth. Reality has been torn away and you realize what a fool you've been.</b></span>"
target << "<span class='shadowling'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
target << "<span class='shadowling'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
target << "<span class='shadowling'>You can communicate with the other enlightened ones by using the Hivemind Commune ability.</span>"
ticker.mode.add_thrall(target.mind)
target.mind.special_role = "Thrall"
target.mind.special_role = "thrall"
var/datum/mind/thrall_mind = target.mind
thrall_mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind
/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift
/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift //Permanent version of shadow walk with no drawback. Toggleable.
name = "Phase Shift"
desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible."
panel = "Ascendant"
@@ -621,41 +751,38 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
SHA.alpha = 255
/obj/effect/proc_holder/spell/aoe_turf/glacial_blast
name = "Glacial Blast"
desc = "Extremely empowered version of Flash Freeze."
/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm //Releases bolts of lightning to everyone nearby
name = "Lightning Storm"
desc = "Shocks everyone nearby."
panel = "Ascendant"
range = 5
range = 6
charge_max = 100
clothes_req = 0
sound = 'sound/magic/lightningbolt.ogg'
/obj/effect/proc_holder/spell/aoe_turf/glacial_blast/cast(list/targets)
/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm/cast(list/targets)
var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
if(SHA.phasing)
usr << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
charge_counter = charge_max
return
usr << "<span class='shadowling'>You freeze the nearby air.</span>"
playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1)
playMagSound()
usr.visible_message("<span class='warning'><b>A massive ball of lightning appears in [usr]'s hands and flares out!</b></span>", \
"<span class='shadowling'>You conjure a ball of lightning and release it.</span>")
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 << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
continue
target << "<span class='userdanger'>You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel ice burns across your body!</span>"
target.Weaken(15)
if(target.bodytemperature)
target.bodytemperature -= INFINITY //:^)
target.take_organ_damage(0,80)
target << "<span class='userdanger'>You are struck by a bolt of lightning!</span>"
playsound(target, 'sound/magic/LightningShock.ogg', 50, 1)
target.Weaken(8)
target.take_organ_damage(0,50)
usr.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=1)
/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant
/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant //Large, all-caps text in shadowling chat
name = "Ascendant Commune"
desc = "Allows you to LOUDLY communicate with all other shadowlings and thralls."
panel = "Ascendant"
@@ -672,11 +799,10 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
text = "<font size=4>[text]</font>"
for(var/mob/M in mob_list)
if(is_shadow_or_thrall(M) || (M in dead_mob_list))
M << "<span class='shadowling'><b>\[Hive Chat\]<i> [usr.real_name] (ASCENDANT)</i>: [text]</b></span>" //Bigger text for ascendants.
M << "<span class='shadowling'><b>\[Ascendant\]<i> [usr.real_name]</i>: [text]</b></span>" //Bigger text for ascendants.
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit
/obj/effect/proc_holder/spell/targeted/ascendant_transmit //Sends a message to the entire world. If this gets abused too much it can be removed safely
name = "Ascendant Broadcast"
desc = "Sends a message to the whole wide world."
panel = "Ascendant"
@@ -685,7 +811,7 @@ datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowl
range = -1
include_user = 1
/obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/ascendant_transmit/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", "")
if(!text)
@@ -97,7 +97,6 @@
/obj/structure/shadow_vortex/Crossed(td)
..()
if(ismob(td))
td << "<span class='userdanger'><font size=3>You enter the rift. Sickening chimes begin to jangle in your ears. \
All around you is endless blackness. After you see something moving, you realize it isn't entirely lifeless.</font></span>" //A bit of spooking before they die
td << "<span class='userdanger'>You enter the rift. Deafening chimes jingle in your ears. You are swallowed in darkness.</span>"
playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1)
qdel(td)
@@ -1,167 +1,175 @@
//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"
var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "Noaey'gief", "Mii`mahza", "Amerziox", "Gyrg-mylin", "Kanet'pruunance", "Vigistaezian") //Unpronouncable 2: electric boogalo
/obj/effect/proc_holder/spell/targeted/shadowling_hatch
name = "Hatch"
desc = "Casts off your disguise."
panel = "Shadowling Evolution"
charge_max = 3000
clothes_req = 0
range = -1
include_user = 1
if(usr.stat)
return
usr.verbs -= /mob/living/carbon/human/proc/shadowling_hatch
switch(alert("Are you sure you want to hatch? You cannot undo this!",,"Yes","No"))
if("No")
usr << "<span class='warning'>You decide against hatching for now."
usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch
return
if("Yes")
usr.Stun(INFINITY) //This is bad but notransform won't work.
usr.visible_message("<span class='warning'>[usr]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!</span>", \
"<span class='shadowling'>You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.</span>")
/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr || !is_shadow(usr)) return
for(var/mob/living/carbon/human/H in targets)
var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No")
switch(hatch_or_no)
if("No")
H << "<span class='warning'>You decide against hatching for now."
charge_counter = charge_max
return
if("Yes")
H.Stun(INFINITY) //This is bad but notransform won't work.
H.visible_message("<span class='warning'>[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!</span>", \
"<span class='shadowling'>You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.</span>")
for(var/obj/item/I in usr) //drops all items
usr.unEquip(I)
for(var/obj/item/I in H) //drops all items
H.unEquip(I)
sleep(50)
var/turf/simulated/floor/F
var/turf/shadowturf = get_turf(usr)
for(F in orange(1, usr))
new /obj/structure/alien/resin/wall/shadowling(F)
for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky
qdel(R)
new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself with the chrysalis
sleep(50)
var/turf/simulated/floor/F
var/turf/shadowturf = get_turf(usr)
for(F in orange(1, usr))
new /obj/structure/alien/resin/wall/shadowling(F)
for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky
qdel(R)
new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself afterwards
usr.visible_message("<span class='warning'>A chrysalis forms around [usr], sealing them inside.</span>", \
"<span class='shadowling'>You create your chrysalis and begin to contort within.</span>")
H.visible_message("<span class='warning'>A chrysalis forms around [H], sealing them inside.</span>", \
"<span class='shadowling'>You create your chrysalis and begin to contort within.</span>")
sleep(100)
usr.visible_message("<span class='warning'><b>The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.</b></span>", \
"<span class='shadowling'>Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.</span>")
sleep(100)
H.visible_message("<span class='warning'><b>The skin on [H]'s back begins to split apart. Black spines slowly emerge from the divide.</b></span>", \
"<span class='shadowling'>Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.</span>")
sleep(90)
usr.visible_message("<span class='warning'><b>[usr], skin shifting, begins tearing at the walls around them.</b></span>", \
"<span class='shadowling'>Your false skin slips away. You begin tearing at the fragile membrane protecting you.</span>")
sleep(90)
H.visible_message("<span class='warning'><b>[H], skin shifting, begins tearing at the walls around them.</b></span>", \
"<span class='shadowling'>Your false skin slips away. You begin tearing at the fragile membrane protecting you.</span>")
sleep(80)
playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1)
usr << "<i><b>You rip and slice.</b></i>"
sleep(10)
playsound(usr.loc, 'sound/weapons/slashmiss.ogg', 25, 1)
usr << "<i><b>The chrysalis falls like water before you.</b></i>"
sleep(10)
playsound(usr.loc, 'sound/weapons/slice.ogg', 25, 1)
usr << "<i><b>You are free!</b></i>"
sleep(80)
playsound(H.loc, 'sound/weapons/slash.ogg', 25, 1)
H << "<i><b>You rip and slice.</b></i>"
sleep(10)
playsound(H.loc, 'sound/weapons/slashmiss.ogg', 25, 1)
H << "<i><b>The chrysalis falls like water before you.</b></i>"
sleep(10)
playsound(H.loc, 'sound/weapons/slice.ogg', 25, 1)
H << "<i><b>You are free!</b></i>"
sleep(10)
playsound(usr.loc, 'sound/effects/ghost.ogg', 100, 1)
var/newNameId = pick(possibleShadowlingNames)
possibleShadowlingNames.Remove(newNameId)
usr.real_name = newNameId
usr.name = usr.real_name
usr.SetStunned(0)
usr << "<i><b><font size=3>YOU LIVE!!!</i></b></font>"
sleep(10)
playsound(H.loc, 'sound/effects/ghost.ogg', 100, 1)
var/newNameId = pick(possibleShadowlingNames)
possibleShadowlingNames.Remove(newNameId)
H.real_name = newNameId
H.name = usr.real_name
H.SetStunned(0)
H << "<i><b><font size=3>YOU LIVE!!!</i></b></font>"
for(var/obj/structure/alien/resin/wall/shadowling/W in orange(usr, 1))
playsound(W, 'sound/effects/splat.ogg', 50, 1)
qdel(W)
for(var/obj/structure/alien/weeds/node/N in shadowturf)
qdel(N)
usr.visible_message("<span class='warning'>The chrysalis explodes in a shower of purple flesh and fluid!</span>")
var/mob/living/carbon/human/M = usr
M.underwear = "Nude"
M.undershirt = "Nude"
M.socks = "Nude"
M.faction |= "faithless"
for(var/obj/structure/alien/resin/wall/shadowling/W in orange(H, 1))
playsound(W, 'sound/effects/splat.ogg', 50, 1)
qdel(W)
for(var/obj/structure/alien/weeds/node/N in shadowturf)
qdel(N)
H.visible_message("<span class='warning'>The chrysalis explodes in a shower of purple flesh and fluid!</span>")
H.underwear = "Nude"
H.undershirt = "Nude"
H.socks = "Nude"
H.faction |= "faithless"
usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
usr.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes)
usr.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit)
usr.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head)
usr.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
usr.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
usr.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses)
hardset_dna(usr, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(H), slot_glasses)
hardset_dna(H, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling
sleep(10)
usr << "<span class='shadowling'><b><i>Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.</b></i></span>"
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/glare
usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/veil
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
sleep(10)
H << "<span class='shadowling'><b><i>Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.</b></i></span>"
H.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hatch)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/glare)
H.mind.add_spell(/obj/effect/proc_holder/spell/aoe_turf/veil)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadow_walk)
H.mind.add_spell(/obj/effect/proc_holder/spell/aoe_turf/flashfreeze)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/collective_mind)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_regenarmor)
/mob/living/carbon/human/proc/shadowling_ascendance()
set category = "Shadowling Evolution"
set name = "Ascendance"
/obj/effect/proc_holder/spell/targeted/shadowling_ascend
name = "Ascend"
desc = "Enters your true form."
panel = "Shadowling Evolution"
charge_max = 3000
clothes_req = 0
range = -1
include_user = 1
if(usr.stat)
return
usr.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance
switch(alert("It is time to ascend. Are you completely sure about this? You cannot undo this!",,"Yes","No"))
if("No")
usr << "<span class='warning'>You decide against ascending for now."
usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance
return
if("Yes")
usr.Stun(INFINITY)
usr.visible_message("<span class='warning'>[usr] rapidly bends and contorts, their eyes flaring a deep crimson!</span>", \
"<span class='shadowling'>You begin unlocking the genetic vault within you and prepare yourself for the power to come.</span>")
/obj/effect/proc_holder/spell/targeted/shadowling_ascend/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr || !shadowling_check(usr)) return
for(var/mob/living/carbon/human/H in targets)
var/hatch_or_no = alert(H,"It is time to ascend. Are you sure about this?",,"Yes","No")
switch(hatch_or_no)
if("No")
H << "<span class='warning'>You decide against ascending for now."
charge_counter = charge_max
return
if("Yes")
H.notransform = 1
H.visible_message("<span class='warning'>[H]'s things suddenly slip off. They gently rise into the air, red light glowing in their eyes.</span>", \
"<span class='shadowling'>You rise into the air and get ready for your transformation.</span>")
sleep(30)
usr.visible_message("<span class='danger'>[usr] suddenly shoots up a few inches in the air and begins hovering there, still twisting.</span>", \
"<span class='shadowling'>You hover into the air to make room for your new form.</span>")
for(var/obj/item/I in H) //drops all items
H.unEquip(I)
sleep(60)
usr.visible_message("<span class='danger'>[usr]'s skin begins to pulse red in sync with their eyes. Their form slowly expands outward.</span>", \
"<span class='shadowling'>You feel yourself beginning to mutate.</span>")
sleep(50)
sleep(20)
if(!ticker.mode.shadowling_ascended)
usr << "<span class='shadowling'>It isn't enough. Time to draw upon your thralls.</span>"
else
usr << "<span class='shadowling'>After some telepathic searching, you find the reservoir of life energy from the thralls and tap into it.</span>"
H.visible_message("<span class='warning'>[H]'s skin begins to crack and harden.</span>", \
"<span class='shadowling'>Your flesh begins creating a shield around yourself.</span>")
sleep(50)
for(var/mob/M in mob_list)
if(is_thrall(M) && !ticker.mode.shadowling_ascended)
M.visible_message("<span class='userdanger'>[M] trembles minutely as they collapse, black smoke pouring from their disintegrating face.</span>", \
"<span class='userdanger'>It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.</span>")
sleep(100)
H.visible_message("<span class='warning'>The small horns on [H]'s head slowly grow and elongate.</span>", \
"<span class='shadowling'>Your body continues to mutate. Your telepathic abilities grow.</span>") //y-your horns are so big, senpai...!~
ticker.mode.thralls -= M.mind //To prevent message spam
M.death(0)
sleep(90)
H.visible_message("<span class='warning'>[H]'s body begins to violently stretch and contort.</span>", \
"<span class='shadowling'>You begin to rend apart the final barries to godhood.</span>")
usr << "<span class='userdanger'>Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood.</b></span>"
sleep(20)
usr << "<span class='big'><b>Yes!</b></span>"
sleep(10)
usr << "<span class='reallybig'><b>YES!</b></span>"
sleep(10)
usr << "<font size=5><b><i>YE--</b></I></font>"
sleep(1)
for(var/mob/living/M in orange(7, src))
M.Weaken(10)
M << "<span class='userdanger'>An immense pressure slams you onto the ground!</span>"
world << "<font size=5><span class='shadowling'><b>\"VYSHA NERADA YEKHEZET U'RUU!!\"</font></span>"
world << 'sound/hallucinations/veryfar_noise.ogg'
for(var/obj/machinery/power/apc/A in world)
A.overload_lighting()
var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(usr.loc)
usr.mind.spell_list = list()
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/annihilate
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/hypnosis
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_phase_shift
usr.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/glacial_blast
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant
usr.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/shadowlingAscendantTransmit
usr.mind.transfer_to(A)
A.name = usr.real_name
if(A.real_name)
A.real_name = usr.real_name
usr.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly
usr.flags |= GODMODE
sleep(50)
if(!ticker.mode.shadowling_ascended)
SSshuttle.emergency.request(null, 0.3)
ticker.mode.shadowling_ascended = 1
qdel(usr)
sleep(40)
H << "<i><b>Yes!</b></i>"
sleep(10)
H << "<i><b><span class='big'>YES!!</span></b></i>"
sleep(10)
H << "<i><b><span class='reallybig'>YE--</span></b></i>"
sleep(1)
for(var/mob/living/M in orange(7, H))
M.Weaken(10)
M << "<span class='userdanger'>An immense pressure slams you onto the ground!</span>"
world << "<font size=5><span class='shadowling'><b>\"VYSHA NERADA YEKHEZET U'RUU!!\"</font></span>"
world << 'sound/hallucinations/veryfar_noise.ogg'
for(var/obj/machinery/power/apc/A in apcs_list)
A.overload_lighting()
var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(H.loc)
for(var/obj/effect/proc_holder/spell/S in H.mind.spell_list)
if(S == src) continue
H.mind.remove_spell(S)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/annihilate)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/hypnosis)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_phase_shift)
H.mind.add_spell(/obj/effect/proc_holder/spell/aoe_turf/ascendant_storm)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/shadowling_hivemind_ascendant)
H.mind.add_spell(/obj/effect/proc_holder/spell/targeted/ascendant_transmit)
H.mind.transfer_to(A)
A.name = H.real_name
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
H.flags |= GODMODE
H.loc = A
sleep(50)
if(!ticker.mode.shadowling_ascended)
SSshuttle.emergency.request(null, 0.3)
ticker.mode.shadowling_ascended = 1
A.mind.remove_spell(src)
qdel(H)
+12
View File
@@ -248,6 +248,18 @@
qdel(spell_to_remove)
mind.spell_list -= spell_to_remove
/datum/mind/proc/add_spell(var/obj/effect/proc_holder/spell/spell) //To add a specific spell to a mind
if(!spell)
return
spell_list += new spell
/datum/mind/proc/remove_spell(var/obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
if(!spell) return
for(var/obj/effect/proc_holder/spell/S in spell_list)
if(istype(S, spell))
qdel(S)
spell_list -= S
/*Checks if the wizard can cast spells.
Made a proc so this is not repeated 14 (or more) times.*/
/mob/proc/casting()
@@ -263,6 +263,8 @@
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
if(!wear_mask && is_thrall(src) && in_range(user,src))
msg += "Their features seem unnaturally tight and drawn.\n"
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
@@ -5,6 +5,7 @@
show_laws(0)
if(mind) ticker.mode.remove_revolutionary(mind)
if(mind) ticker.mode.remove_gangster(mind,1,remove_bosses=1)
if(mind) ticker.mode.remove_thrall(mind,0)
/mob/living/silicon/robot/update_hotkey_mode()
winset(src, null, "mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
+40
View File
@@ -0,0 +1,40 @@
/datum/surgery/dethrall
name = "dethralling"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/dethrall)
location = "head"
/datum/surgery_step/dethrall
accept_hand = 1
time = 70
var/obj/item/organ/brain/B = null
/datum/surgery_step/dethrall/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
B = target.getorgan(/obj/item/organ/brain)
if(B)
user.visible_message("[user] begins looking around in [target]'s head.", "<span class='notice'>You begin looking for foreign influences on [target]'s brain...")
/datum/surgery_step/dethrall/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(B)
if(!is_thrall(target))
user << "<span class='warning'>You are unable to locate anything on [target]'s brain.</span>"
return 1
user << "<span class='warning'>You locate a small, pulsing black tumor on the side of [target]'s brain and begin to remove it.</span>"
target << "<span class='boldannounce'>A small part of your head pulses with agony as the light impacts it.</span>"
sleep(30)
user.visible_message("[user] begins removing something from [target]'s head.</span>", \
"<span class='notice'>You begin carefully extracting the tumor...</span>")
if(!do_mob(user, target, 50))
if(prob(50))
user.visible_message("<span class='warning'>[user] slips and rips the tumor out from [target]'s head!</span>", \
"<span class='warning'><b>You fumble and tear out [target]'s tumor!</span>")
ticker.mode.remove_thrall(target.mind,1)
return 1
else
user.visible_message("<span class='warning'>[user] screws up!</span>")
return 0
user.visible_message("<span class='notice'>[user] carefully extracts the tumor from [target]'s brain!</span>", \
"<span class='notice'>You extract the black tumor from [target]'s head. It quickly shrivels and burns away.</span>")
ticker.mode.remove_thrall(target.mind,0)
else
user << "<span class='warning'>[target] has no brain!</span>"
return 1
+14
View File
@@ -0,0 +1,14 @@
author: Xhuis
delete-after: True
changes:
- rscadd: "Shadowling thralls can now be deconverted via surgery or borging."
- rscadd: "Thralls can be revealed by examining them. They can hide this by wearing a mask."
- rscadd: "Thralls have a few minor abilities they can use in addition to night vision."
- rscadd: "Hatch-exclusive abilities can no longer be used if you are not the shadowling mutant race."
- rscadd: "Ascendants are now immune to bombs and singularities. Honk."
- rscadd: "A Centcom report has been added for shadowlings."
- tweak: "Ascending no longer kills all shadowling thralls. This allows antagonists who were enthralled to succeed along with the ascendants."
- tweak: "Annihilate now has different sound and a shorter delay before the target explodes. In addition, it now works on all mobs, instead of just humans."
- bugfix: "Glacial Blast now properly has no cooldown if used while phase shifting."
- bugfix: "Fixes a runtime if a target with no mind is enthralled."
+1
View File
@@ -1486,6 +1486,7 @@
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\cybernetic_implants.dm"
#include "code\modules\surgery\dethrall.dm"
#include "code\modules\surgery\eye_surgery.dm"
#include "code\modules\surgery\gender_reassignment.dm"
#include "code\modules\surgery\generic_steps.dm"