Merge pull request #1661 from Citadel-Station-13/upstream-merge-28539

[MIRROR] Runes now innately support doing damage to their invokers
This commit is contained in:
LetterJay
2017-06-26 06:07:53 -05:00
committed by GitHub
+65 -69
View File
@@ -35,6 +35,7 @@ To draw a rune, use an arcane tome.
var/scribe_damage = 0.1 //how much damage you take doing it
var/allow_excess_invokers = FALSE //if we allow excess invokers when being invoked
var/invoke_damage = 0 //how much damage invokers take when invoking it
var/construct_invoke = TRUE //if constructs can invoke it
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
@@ -133,10 +134,13 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/proc/invoke(var/list/invokers)
//This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here.
if(invocation)
for(var/M in invokers)
var/mob/living/L = M
for(var/M in invokers)
var/mob/living/L = M
if(invocation)
L.say(invocation, language = /datum/language/common)
if(invoke_damage)
L.apply_damage(invoke_damage, BRUTE)
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
do_invoke_glow()
/obj/effect/rune/proc/do_invoke_glow()
@@ -159,6 +163,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_name = "malformed rune"
cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
invocation = "Ra'sha yoka!"
invoke_damage = 30
/obj/effect/rune/malformed/Initialize(mapload, set_keyword)
. = ..()
@@ -167,10 +172,6 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/malformed/invoke(var/list/invokers)
..()
for(var/M in invokers)
var/mob/living/L = M
to_chat(L, "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>")
L.apply_damage(30, BRUTE)
qdel(src)
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
@@ -508,9 +509,7 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/raise_dead/examine(mob/user)
..()
if(iscultist(user) || user.stat == DEAD)
var/revive_number = 0
if(GLOB.sacrificed.len)
revive_number = GLOB.sacrificed.len - revives_used
var/revive_number = LAZYLEN(GLOB.sacrificed) - revives_used
to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
@@ -520,6 +519,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/mob/living/user = invokers[1]
if(rune_in_use)
return
rune_in_use = TRUE
for(var/mob/living/M in T.contents)
if(iscultist(M) && M.stat == DEAD)
potential_revive_mobs |= M
@@ -527,18 +527,20 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
log_game("Raise Dead rune failed - no corpses to revive")
fail_invoke()
rune_in_use = FALSE
return
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
if(LAZYLEN(GLOB.sacrificed) <= revives_used)
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
fail_invoke()
rune_in_use = FALSE
return
if(potential_revive_mobs.len > 1)
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
else
mob_to_revive = potential_revive_mobs[1]
if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user))
rune_in_use = FALSE
return
rune_in_use = 1
if(user.name == "Herbert West")
invocation = "To life, to life, I bring them!"
else
@@ -550,34 +552,34 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
"<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
rune_in_use = 0
rune_in_use = FALSE
/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user)
var/turf/T = get_turf(src)
if(!user)
return 0
if(QDELETED(user))
return FALSE
if(!Adjacent(user) || user.incapacitated())
return 0
if(!target_mob)
return FALSE
if(QDELETED(target_mob))
fail_invoke()
return 0
return FALSE
if(!(target_mob in T.contents))
to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target moved")
return 0
return FALSE
var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
if(!ghost && (!target_mob.mind || !target_mob.mind.active))
to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
fail_invoke()
log_game("Raise Dead rune failed - revival target has no ghost")
return 0
return FALSE
if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
fail_invoke()
log_game("Raise Dead rune failed - too few sacrificed")
return 0
return 1
return FALSE
return TRUE
/obj/effect/rune/raise_dead/fail_invoke()
..()
@@ -592,7 +594,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons."
invocation = "Ta'gh fara'qha fel d'amar det!"
icon_state = "5"
allow_excess_invokers = 1
allow_excess_invokers = TRUE
color = RUNE_COLOR_EMP
/obj/effect/rune/emp/invoke(var/list/invokers)
@@ -624,10 +626,14 @@ structure_check() searches for nearby cultist structures required for the invoca
invocation = "Fwe'sh mah erl nyag r'ya!"
icon_state = "7"
color = RUNE_COLOR_DARKRED
rune_in_use = 0 //One at a time, please!
construct_invoke = 0
rune_in_use = FALSE //One at a time, please!
construct_invoke = FALSE
var/mob/living/affecting = null
/obj/effect/rune/spirit/Destroy()
affecting = null
return ..()
/obj/effect/rune/spirit/examine(mob/user)
..()
if(affecting)
@@ -651,41 +657,33 @@ structure_check() searches for nearby cultist structures required for the invoca
var/turf/T = get_turf(src)
rune_in_use = TRUE
affecting = user
user.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
user.visible_message("<span class='warning'>[user] freezes statue-still, glowing an unearthly red.</span>", \
affecting.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
affecting.visible_message("<span class='warning'>[affecting] freezes statue-still, glowing an unearthly red.</span>", \
"<span class='cult'>You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...</span>")
user.ghostize(1)
while(user)
if(!affecting)
visible_message("<span class='warning'>[src] pulses gently before falling dark.</span>")
affecting = null //In case it's assigned to a number or something
rune_in_use = FALSE
return
affecting.ghostize(1)
while(!QDELETED(affecting))
affecting.apply_damage(0.1, BRUTE)
if(!(user in T))
user.visible_message("<span class='warning'>A spectral tendril wraps around [user] and pulls [user.p_them()] back to the rune!</span>")
Beam(user,icon_state="drainbeam",time=2)
user.forceMove(get_turf(src)) //NO ESCAPE :^)
if(user.key)
user.visible_message("<span class='warning'>[user] slowly relaxes, the glow around [user.p_them()] dimming.</span>", \
if(!(affecting in T))
user.visible_message("<span class='warning'>A spectral tendril wraps around [affecting] and pulls [affecting.p_them()] back to the rune!</span>")
Beam(affecting, icon_state="drainbeam", time=2)
affecting.forceMove(get_turf(src)) //NO ESCAPE :^)
if(affecting.key)
affecting.visible_message("<span class='warning'>[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.</span>", \
"<span class='danger'>You are re-united with your physical form. [src] releases its hold over you.</span>")
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
user.Weaken(3)
rune_in_use = FALSE
affecting = null
return
if(user.stat == UNCONSCIOUS)
affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
affecting.Weaken(3)
break
if(affecting.stat == UNCONSCIOUS)
if(prob(1))
var/mob/dead/observer/G = user.get_ghost()
var/mob/dead/observer/G = affecting.get_ghost()
to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
if(user.stat == DEAD)
user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
rune_in_use = FALSE
affecting = null
var/mob/dead/observer/G = user.get_ghost()
else if(affecting.stat == DEAD)
affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
var/mob/dead/observer/G = affecting.get_ghost()
to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
return
break
sleep(1)
affecting = null
rune_in_use = FALSE
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
@@ -726,9 +724,10 @@ structure_check() searches for nearby cultist structures required for the invoca
update_state()
if(density)
spread_density()
user.visible_message("<span class='warning'>[user] [iscarbon(user) ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
"<span class='cultitalic'>You channel your life energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
if(iscarbon(user))
var/carbon_user = iscarbon(user)
user.visible_message("<span class='warning'>[user] [carbon_user ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
"<span class='cultitalic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
if(carbon_user)
var/mob/living/carbon/C = user
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
@@ -775,7 +774,7 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "summons a single cultist to the rune. Requires 2 invokers."
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
req_cultists = 2
allow_excess_invokers = 1
invoke_damage = 10
icon_state = "5"
color = RUNE_COLOR_SUMMON
@@ -812,7 +811,6 @@ structure_check() searches for nearby cultist structures required for the invoca
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
..()
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
user.apply_damage(10, BRUTE, "head")
cultist_to_summon.forceMove(get_turf(src))
qdel(src)
@@ -825,7 +823,8 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_MEDIUMRED
light_color = LIGHT_COLOR_LAVA
req_cultists = 3
construct_invoke = 0
invoke_damage = 10
construct_invoke = FALSE
var/tick_damage = 25
rune_in_use = FALSE
@@ -839,12 +838,8 @@ structure_check() searches for nearby cultist structures required for the invoca
rune_in_use = TRUE
var/turf/T = get_turf(src)
visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
set_light(6)
color = "#FC9B54"
for(var/M in invokers)
var/mob/living/L = M
L.apply_damage(10, BRUTE, pick("l_arm", "r_arm"))
to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
set_light(6, 1, color)
for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume)
var/obj/item/weapon/nullrod/N = L.null_rod_check()
@@ -856,23 +851,24 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(L, "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>")
animate(src, color = "#FCB56D", time = 4)
sleep(4)
if(!src)
if(QDELETED(src))
return
do_area_burn(T, 0.5)
animate(src, color = "#FFDF80", time = 5)
sleep(5)
if(!src)
if(QDELETED(src))
return
do_area_burn(T, 1)
animate(src, color = "#FFFDF4", time = 6)
sleep(6)
if(!src)
if(QDELETED(src))
return
do_area_burn(T, 1.5)
new /obj/effect/hotspot(T)
qdel(src)
/obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier)
set_light(6, 1, color)
for(var/mob/living/L in viewers(T))
if(!iscultist(L) && L.blood_volume)
var/obj/item/weapon/nullrod/N = L.null_rod_check()
@@ -888,7 +884,8 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_desc = "manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
construct_invoke = 0
invoke_damage = 10
construct_invoke = FALSE
color = RUNE_COLOR_MEDIUMRED
var/ghost_limit = 5
var/ghosts = 0
@@ -939,7 +936,6 @@ structure_check() searches for nearby cultist structures required for the invoca
..()
ghosts++
playsound(src, 'sound/magic/exit_blood.ogg', 50, 1)
user.apply_damage(10, BRUTE)
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
var/turf/T = get_turf(src)