Merge pull request #1778 from Markolie/events

Revenant update, event weight tweaks
This commit is contained in:
Fox-McCloud
2015-08-19 17:04:14 -04:00
27 changed files with 336 additions and 466 deletions
+1 -1
View File
@@ -97,7 +97,7 @@
return (copytext(message, length(message)) == "!") ? 2 : 1
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
log_say("[key_name(speaker)] : ([name]) [message]")
log_say("[key_name(speaker)]: ([name]) [message]")
if(!speaker_mask) speaker_mask = speaker.name
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
@@ -43,9 +43,11 @@ Doesn't work on other aliens/AI.*/
adjustToxLoss(-10)
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
if(msg)
log_say("AlienWhisper: [key_name(src)]->[M.key] : [msg]")
log_say("Alien Whisper: [key_name(src)]->[key_name(M)]: [msg]")
M << "<span class='noticealien'>You hear a strange, alien voice in your head...<span class='noticealien'>[msg]"
src << {"<span class='noticealien'>You said: "[msg]" to [M]</span>"}
src << "<span class='noticealien'>You said: [msg] to [M]</span>"
for(var/mob/dead/observer/G in player_list)
G.show_message("<i>Alien message from <b>[src]</b> ([ghost_follow_link(src, ghost=G)]) to <b>[M]</b> ([ghost_follow_link(M, ghost=G)]): [msg]</i>")
return
/mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview())
@@ -30,7 +30,7 @@
min_n2 = 0
max_n2 = 0
var/dead = 0
unsuitable_atoms_damage = 15
unsuitable_atmos_damage = 15
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
@@ -8,7 +8,7 @@
max_co2 = 0
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
unsuitable_atmos_damage = 15
faction = list("mining")
environment_smash = 2
minbodytemp = 0
@@ -27,7 +27,7 @@
max_co2 = 5
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
unsuitable_atmos_damage = 15
speak_emote = list("yarrs")
var/corpse = /obj/effect/landmark/mobcorpse/pirate
var/weapon1 = /obj/item/weapon/melee/energy/sword/pirate
@@ -36,4 +36,4 @@
maxbodytemp = 370
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
unsuitable_atoms_damage = 10
unsuitable_atmos_damage = 10
@@ -29,7 +29,7 @@
max_co2 = 5
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
unsuitable_atmos_damage = 15
faction = list("russian")
status_flags = CANPUSH
@@ -30,7 +30,7 @@
max_co2 = 5
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 15
unsuitable_atmos_damage = 15
faction = list("syndicate")
status_flags = CANPUSH
@@ -12,47 +12,52 @@
invisibility = INVISIBILITY_OBSERVER
health = 25
maxHealth = 25
see_in_dark = 255
see_invisible = SEE_INVISIBLE_OBSERVER
universal_understand = 1
response_help = "passes through"
response_disarm = "swings at"
response_harm = "punches"
unsuitable_atmos_damage = 0
minbodytemp = 0
maxbodytemp = INFINITY
harm_intent_damage = 5
speak_emote = list("hisses", "spits", "growls")
harm_intent_damage = 0
friendly = "touches"
status_flags = 0
wander = 0
density = 0
flying = 1
anchored = 1
var/essence = 25 //The resource of revenants. Max health is equal to twice this amount
var/essence = 25 //The resource of revenants. Max health is equal to three times this amount
var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
var/essence_regen = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no
var/essence_regenerating = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no
var/essence_regen_amount = 2 //How much essence regenerates
var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
var/strikes = 0 //How many times a revenant can die before dying for good
var/essence_accumulated = 0 //How much essence the revenant has stolen
var/revealed = 0 //If the revenant can take damage from normal sources.
var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power.
var/essence_drained = 0 //How much essence the revenant has drained.
var/draining = 0 //If the revenant is draining someone.
var/list/drained_mobs = list() //Cannot harvest the same mob twice
/mob/living/simple_animal/revenant/Life()
..()
if(essence < essence_min)
essence = essence_min
if(strikes > 0)
strikes--
src << "<span class='boldannounce'>Your essence has dropped below critical levels. You barely manage to save yourself - [strikes ? "you can't keep this up!" : "next time, it's death."]</span>"
else if(strikes <= 0)
Die()
maxHealth = essence * 2
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence += essence_regen_amount
if(essence > essence_regen_cap)
essence = essence_regen_cap
maxHealth = essence * 3
if(!revealed)
health = maxHealth //Heals to full when not revealed
if(essence_regen && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence++
/mob/living/simple_animal/revenant/ex_act(severity)
return 1 //Immune to the effects of explosions.
/mob/living/simple_animal/revenant/blob_act()
return 1 //blah blah blobs aren't in tune with the spirit world, or something.
/mob/living/simple_animal/revenant/ClickOn(var/atom/A, var/params) //Copypaste from ghost code - revenants can't interact with the world directly.
if(client.buildmode)
build_click(src, client.buildmode, params, A)
@@ -75,6 +80,70 @@
if(world.time <= next_move)
return
A.attack_ghost(src)
if(ishuman(A) && in_range(src, A))
Harvest(A)
/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target)
if(!castcheck(0))
return
if(draining)
src << "<span class='warning'>You are already siphoning the essence of a soul!</span>"
return
if(target in drained_mobs)
src << "<span class='warning'>[target]'s soul is dead and empty.</span>"
return
if(!target.stat)
src << "<span class='notice'>This being's soul is too strong to harvest.</span>"
if(prob(10))
target << "You feel as if you are being watched."
return
draining = 1
essence_drained = 2
src << "<span class='notice'>You search for the soul of [target].</span>"
if(do_after(src, 10, 3, 0, target)) //did they get deleted in that second?
if(target.ckey)
src << "<span class='notice'>Their soul burns with intelligence.</span>"
essence_drained += 2
if(target.stat != DEAD)
src << "<span class='notice'>Their soul blazes with life!</span>"
essence_drained += 2
else
src << "<span class='notice'>Their soul is weak and faltering.</span>"
if(do_after(src, 20, 6, 0, target)) //did they get deleted NOW?
switch(essence_drained)
if(1 to 2)
src << "<span class='info'>[target] will not yield much essence. Still, every bit counts.</span>"
if(3 to 4)
src << "<span class='info'>[target] will yield an average amount of essence.</span>"
if(5 to INFINITY)
src << "<span class='info'>Such a feast! [target] will yield much essence to you.</span>"
if(do_after(src, 30, 9, 0, target)) //how about now
if(!target.stat)
src << "<span class='warning'>They are now powerful enough to fight off your draining.</span>"
target << "<span class='boldannounce'>You feel something tugging across your body before subsiding.</span>"
draining = 0
return //hey, wait a minute...
src << "<span class='danger'>You begin siphoning essence from [target]'s soul.</span>"
if(target.stat != DEAD)
target << "<span class='warning'>You feel a horribly unpleasant draining sensation as your grip on life weakens...</span>"
icon_state = "revenant_draining"
reveal(65)
stun(65)
target.visible_message("<span class='warning'>[target] suddenly rises slightly into the air, their skin turning an ashy gray.</span>")
target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=60)
if(target) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
change_essence_amount(essence_drained * 5, 0, target)
src << "<span class='info'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
target.visible_message("<span class='warning'>[target] gently slumps back onto the ground.</span>")
drained_mobs.Add(target)
target.death(0)
icon_state = "revenant_idle"
else
src << "<span class='warning'>You are not close enough to siphon [target]'s soul. The link has been broken.</span>"
draining = 0
return
draining = 0
return
/mob/living/simple_animal/revenant/say(message)
return 0 //Revenants cannot speak out loud.
@@ -83,6 +152,7 @@
..()
if(statpanel("Status"))
stat(null, "Current essence: [essence]E")
stat(null, "Stolen essence: [essence_accumulated]E")
/mob/living/simple_animal/revenant/New()
..()
@@ -99,11 +169,11 @@
src << "<b><i>You do not remember anything of your past lives, nor will you remember anything about this one after your death.</i></b>"
src << "<b>Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.</b>"
var/datum/objective/revenant/objective = new
objective.owner = src
objective.owner = src.mind
src.mind.objectives += objective
src << "<b>Objective #1</b>: [objective.explanation_text]"
var/datum/objective/revenantFluff/objective2 = new
objective2.owner = src
objective2.owner = src.mind
src.mind.objectives += objective2
src << "<b>Objective #2</b>: [objective2.explanation_text]"
ticker.mode.traitors |= src.mind //Necessary for announcing
@@ -119,13 +189,12 @@
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_harvest
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenantDefile
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_defile
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_malf
return 1
return 0
/mob/living/simple_animal/revenant/Die()
if(strikes)
return 0 //Impossible to die with strikes still active
..()
src << "<span class='userdanger'><b>NO! No... it's too late, you can feel yourself fading...</b></span>"
notransform = 1
@@ -145,74 +214,78 @@
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
..()
if(istype(W, /obj/item/weapon/nullrod))
visible_message("<span class='warning'>[src] violently flinches!</span>", \
"<span class='boldannounce'>The null rod invokes agony in you! You feel your essence draining away!</span>")
"<span class='boldannounce'>As the null rod passes through you, you feel your essence draining away!</span>")
essence -= 25 //hella effective
inhibited = 1
spawn(30)
inhibited = 0
..()
/mob/living/simple_animal/revenant/proc/castcheck(var/essence_cost)
var/mob/living/simple_animal/revenant/user = usr
if(!istype(user) || !user)
/mob/living/simple_animal/revenant/proc/castcheck(essence_cost)
if(!src)
return
var/turf/T = get_turf(usr)
var/turf/T = get_turf(src)
if(istype(T, /turf/simulated/wall))
user << "<span class='warning'>You cannot use abilities from inside of a wall.</span>"
src << "<span class='warning'>You cannot use abilities from inside of a wall.</span>"
return 0
if(!user.change_essence_amount(essence_cost, 1))
user << "<span class='warning'>You lack the essence to use that ability.</span>"
if(src.inhibited)
src << "<span class='warning'>Your powers have been suppressed by nulling energy!</span>"
return 0
if(user.inhibited)
user << "<span class='warning'>Your powers have been suppressed by holy energies!</span>"
if(!src.change_essence_amount(essence_cost, 1))
src << "<span class='warning'>You lack the essence to use that ability.</span>"
return 0
return 1
/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null)
var/mob/living/simple_animal/revenant/user = usr
if(!istype(usr) || !usr)
/mob/living/simple_animal/revenant/proc/change_essence_amount(essence_amt, silent = 0, source = null)
if(!src)
return
if(user.essence + essence_amt <= 0)
if(essence + essence_amt <= 0)
return
user.essence += essence_amt
user.essence = Clamp(user.essence, 0, INFINITY)
essence += essence_amt
essence = max(0, essence)
if(essence_amt > 0)
essence_accumulated += essence_amt
essence_accumulated = max(0, essence_accumulated)
if(!silent)
if(essence_amt > 0)
user << "<span class='notice'>Gained [essence_amt]E from [source].</span>"
src << "<span class='notice'>Gained [essence_amt]E from [source].</span>"
else
user << "<span class='danger'>Lost [essence_amt]E from [source].</span>"
src << "<span class='danger'>Lost [essence_amt]E from [source].</span>"
return 1
/mob/living/simple_animal/revenant/proc/reveal(var/time, var/stun)
var/mob/living/simple_animal/revenant/R = usr
if(!istype(usr) || !usr)
/mob/living/simple_animal/revenant/proc/reveal(time)
if(!src)
return
R.revealed = 1
R.invisibility = 0
if(stun)
R.notransform = 1
R << "<span class='warning'>You have been revealed [stun ? "and cannot move" : ""].</span>"
if(time <= 0)
return
revealed = 1
invisibility = 0
src << "<span class='warning'>You have been revealed.</span>"
spawn(time)
R.revealed = 0
R.invisibility = INVISIBILITY_OBSERVER
if(stun)
R.notransform = 0
R << "<span class='notice'>You are once more concealed [stun ? "and can move again" : ""].</span>"
revealed = 0
invisibility = INVISIBILITY_OBSERVER
src << "<span class='notice'>You are once more concealed.</span>"
/mob/living/simple_animal/revenant/proc/stun(time)
if(!src)
return
if(time <= 0)
return
notransform = 1
src << "<span class='warning'>You cannot move!</span>"
spawn(time)
notransform = 0
src << "<span class='notice'>You can move again!</span>"
/datum/objective/revenant
var/targetAmount = 100
/datum/objective/revenant/New()
targetAmount = rand(100,200)
explanation_text = "Absorb [targetAmount] points of essence."
explanation_text = "Absorb [targetAmount] points of essence from humans."
..()
/datum/objective/revenant/check_completion()
@@ -221,8 +294,8 @@
var/mob/living/simple_animal/revenant/R = owner.current
if(!R || R.stat == DEAD)
return 0
var/essenceAccumulated = R.essence
if(essenceAccumulated < targetAmount)
var/essence_stolen = R.essence_accumulated
if(essence_stolen < targetAmount)
return 0
return 1
@@ -254,7 +327,7 @@
/obj/item/weapon/ectoplasm/revenant/New()
..()
reforming = 1
spawn(1800) //3 minutes
spawn(600) //1 minutes
if(src && reforming)
return reform()
if(src && !reforming)
@@ -290,7 +363,7 @@
/obj/item/weapon/ectoplasm/revenant/proc/reform()
if(!reforming || !src)
return
message_admins("Revenant ectoplasm was left undestroyed for 3 minutes and has reformed into a new revenant.")
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and has reformed into a new revenant.")
loc = get_turf(src) //In case it's in a backpack or someone's hand
visible_message("<span class='boldannounce'>[src] suddenly rises into the air before fading away.</span>")
var/mob/living/simple_animal/revenant/R = new(get_turf(src))
@@ -1,128 +1,66 @@
//Harvest Essence: The bread and butter of the revenant. The basic way of harvesting additional essence.
/obj/effect/proc_holder/spell/targeted/revenant_harvest
name = "Harvest (0E)"
name = "Harvest"
desc = "Siphons the lingering spectral essence from a human, empowering yourself."
panel = "Revenant Abilities"
charge_max = 100 //Short cooldown
charge_max = 0 //Short cooldown
clothes_req = 0
range = 5
var/essence_drained = 0
var/draining
var/list/drained_mobs = list() //Cannot harvest the same mob twice
range = 1
/obj/effect/proc_holder/spell/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
if(!user.castcheck(0))
charge_counter = charge_max
return
for(var/mob/living/carbon/human/target in targets)
spawn(0)
if(draining)
user << "<span class='warning'>You are already siphoning the essence of a soul!</span>"
return
if(target in drained_mobs)
user << "<span class='warning'>[target]'s soul is dead and empty.</span>"
return
if(target.stat != DEAD)
user << "<span class='notice'>This being's soul is too strong to harvest.</span>"
if(prob(10))
target << "You feel as if you are being watched."
return
draining = 1
essence_drained = 1
user << "<span class='notice'>You search for the still-living soul of [target].</span>"
sleep(10)
if(target.ckey)
user << "<span class='notice'>Their soul burns with intelligence.</span>"
essence_drained += 3
sleep(20)
switch(essence_drained)
if(1 to 2)
user << "<span class='info'>[target] will not yield much essence. Still, every bit counts.</span>"
if(3 to 4)
user << "<span class='info'>[target] will yield an average amount of essence.</span>"
if(5 to INFINITY)
user << "<span class='info'>Such a feast! [target] will yield much essence to you.</span>"
sleep(30)
if(!in_range(user, target))
user << "<span class='warning'>You are not close enough to siphon [target]'s soul. The link has been broken.</span>"
draining = 0
return
if(!target.stat)
user << "<span class='warning'>They are now powerful enough to fight off your draining.</span>"
target << "<span class='boldannounce'>You feel something tugging across your body before subsiding.</span>"
user << "<span class='danger'>You begin siphoning essence from [target]'s soul. You can not move while this is happening.</span>"
if(target.stat != DEAD)
target << "<span class='warning'>You feel a horribly unpleasant draining sensation as your grip on life weakens...</span>"
user.icon_state = "revenant_draining"
user.notransform = 1
user.revealed = 1
user.invisibility = 0
target.visible_message("<span class='warning'>[target] suddenly rises slightly into the air, their skin turning an ashy gray.</span>")
target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=80)
target.death(0)
target.visible_message("<span class='warning'>[target] gently slumps back onto the ground.</span>")
user.icon_state = "revenant_idle"
user.change_essence_amount(essence_drained * 5, 0, target)
user << "<span class='info'>[target]'s soul has been considerably weakened and will yield no more essence for the time being.</span>"
user.revealed = 0
user.notransform = 0
user.invisibility = INVISIBILITY_OBSERVER
drained_mobs.Add(target)
draining = 0
user.Harvest(target)
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E.
/obj/effect/proc_holder/spell/targeted/revenant_transmit
name = "Transmit (5E)"
name = "Transmit"
desc = "Telepathically transmits a message to the target."
panel = "Revenant Abilities (Locked)"
charge_max = 50
panel = "Revenant Abilities"
charge_max = 0
clothes_req = 0
range = -1
include_user = 1
var/locked = 1
range = 7
include_user = 0
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
if(!user.castcheck(-5))
charge_counter = charge_max
return
if(locked)
usr << "<span class='info'>You have unlocked Transmit!</span>"
locked = 0
charge_counter = charge_max
panel = "Revenant Abilities"
range = 7
include_user = 0
return
for(var/mob/living/M in targets)
spawn(0)
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
if(!msg)
charge_counter = charge_max
return
usr << "<span class='info'><b>You transmit to [M]:</b> [msg]</span>"
M << "<span class='deadsay'><b>A strange voice resonates in your head...</b></span><i> [msg]</I>"
log_say("Revenant Transmit: [key_name(usr)]->[key_name(M)]: [msg]")
usr << "<span class='info'><b>You transmit to [M]: </b>[msg]</span>"
M << "<span class='deadsay'><b>A strange voice resonates in your head... </b></span><i>[msg]</I>"
for(var/mob/dead/observer/G in player_list)
G.show_message("<i>Revenant message from <b>[usr]</b> ([ghost_follow_link(usr, ghost=G)]) to <b>[M]</b> ([ghost_follow_link(M, ghost=G)]): [msg]</i>")
//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people.
/obj/effect/proc_holder/spell/aoe_turf/revenant_light
name = "Overload Light (25E)"
desc = "Directs a large amount of essence into an electrical light, causing an impressive light show."
name = "Overload Light (30E)"
desc = "Directs a large amount of essence into nearby electrical lights, causing lights to shock those nearby."
panel = "Revenant Abilities (Locked)"
charge_max = 300
charge_max = 200
clothes_req = 0
range = 1
var/reveal = 80
var/stun = 20
var/locked = 1
/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
if(!user.castcheck(-25))
charge_counter = charge_max
return
if(locked)
user << "<span class='info'>You have unlocked Overload Light!</span>"
if(!user.castcheck(-30))
charge_counter = charge_max
return
user << "<span class='info'>You have unlocked Overload Lights!</span>"
name = "Overload Lights (20E)"
panel = "Revenant Abilities"
locked = 0
range = 5
range = 6
charge_counter = charge_max
return
if(!user.castcheck(-20))
charge_counter = charge_max
return
for(var/turf/T in targets)
@@ -132,57 +70,106 @@
if(!L.on)
return
L.visible_message("<span class='warning'><b>\The [L] suddenly flares brightly and begins to spark!</span>")
sleep(20)
sleep(10)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(4, 1, L)
s.start()
sleep(10)
for(var/mob/living/M in orange(4, L))
if(M == user)
return
M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
M.electrocute_act(25, "[L.name]")
var/datum/effect/effect/system/spark_spread/z = new /datum/effect/effect/system/spark_spread
z.set_up(4, 1, M)
z.start()
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
user.reveal(50, 1)
user.reveal(reveal)
user.stun(stun)
//Defile: Corrupts nearby stuff, unblesses floor tiles.
/obj/effect/proc_holder/spell/aoe_turf/revenantDefile
name = "Defile (30E)"
desc = "Twists and corrupts certain nearby objects. Also dispels holy auras on floors, but not salt lines."
/obj/effect/proc_holder/spell/aoe_turf/revenant_defile
name = "Defile (35E)"
desc = "Twists and corrupts the nearby area. Also dispels holy auras on floors, but not salt lines."
panel = "Revenant Abilities (Locked)"
charge_max = 300
charge_max = 200
clothes_req = 0
range = 1
var/reveal = 100
var/stun = 20
var/locked = 1
/obj/effect/proc_holder/spell/aoe_turf/revenantDefile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
if(!user.castcheck(-30))
charge_counter = charge_max
return
/obj/effect/proc_holder/spell/aoe_turf/revenant_defile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
if(locked)
if(!user.castcheck(-35))
charge_counter = charge_max
return
user << "<span class='info'>You have unlocked Defile!</span>"
name = "Defile (20E)"
panel = "Revenant Abilities"
locked = 0
range = 4
range = 3
charge_counter = charge_max
return
if(!user.castcheck(-20))
charge_counter = charge_max
return
for(var/turf/T in targets)
spawn(0)
if(T.flags & NOJAUNT)
T.flags -= NOJAUNT
for(var/obj/machinery/bot/secbot/secbot in T.contents) //Not including ED-209
secbot.emagged = 2
secbot.Emag(null)
for(var/obj/machinery/bot/cleanbot/cleanbot in T.contents)
cleanbot.emagged = 2
cleanbot.Emag(null)
if(!istype(T, /turf/simulated/wall/cult) && istype(T, /turf/simulated/wall) && prob(40))
T.ChangeTurf(/turf/simulated/wall/cult)
if(!istype(T, /turf/simulated/floor/engine/cult) && istype(T, /turf/simulated/floor) && prob(40))
T.ChangeTurf(/turf/simulated/floor/engine/cult)
for(var/mob/living/carbon/human/human in T.contents)
human << "<span class='warning'>You suddenly feel tired.</span>"
human.adjustStaminaLoss(25)
for(var/mob/living/silicon/robot/robot in T.contents)
robot.visible_message("<span class='warning'>[robot] lets out an alarm!</span>", \
"<span class='boldannounce'>01001111 01010110 01000101 01010010 01001100 01001111 01000001 01000100</span>") //Translates to "OVERLOAD"
robot << 'sound/misc/interference.ogg'
playsound(robot, 'sound/machines/warning-buzzer.ogg', 50, 1)
human.adjustStaminaLoss(35)
for(var/obj/structure/window/window in T.contents)
window.hit(rand(10,50))
window.hit(rand(50,125))
for(var/obj/machinery/light/light in T.contents)
light.flicker() //spooky
user.reveal(30, 1)
user.reveal(reveal)
user.stun(stun)
//Malfunction: Makes bad stuff happen to robots and machines.
/obj/effect/proc_holder/spell/aoe_turf/revenant_malf
name = "Malfunction (50E)"
desc = "Corrupts and damages nearby machines and mechanical objects."
panel = "Revenant Abilities (Locked)"
charge_max = 150
clothes_req = 0
range = 1
var/reveal = 60
var/stun = 30
var/locked = 1
/obj/effect/proc_holder/spell/aoe_turf/revenant_malf/cast(list/targets, mob/living/simple_animal/revenant/user = usr)
if(locked)
if(!user.castcheck(-50))
charge_counter = charge_max
return
user << "<span class='info'>You have unlocked Malfunction!</span>"
name = "Malfunction (15E)"
panel = "Revenant Abilities"
locked = 0
range = 4
charge_counter = charge_max
return
if(!user.castcheck(-15))
charge_counter = charge_max
return
for(var/turf/T in targets)
spawn(0)
for(var/obj/machinery/bot/bot in T.contents)
if(!bot.emagged)
bot.locked = 0
bot.open = 1
bot.Emag(null)
for(var/obj/machinery/mach in T.contents)
if(prob(10))
mach.emag_act(null)
empulse(user.loc, 3, 5)
user.reveal(reveal)
user.stun(stun)
@@ -51,7 +51,7 @@
var/max_co2 = 5
var/min_n2 = 0
var/max_n2 = 0
var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
var/unsuitable_atmos_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
@@ -227,7 +227,7 @@
fire_alert = 0
if(!atmos_suitable)
adjustBruteLoss(unsuitable_atoms_damage)
adjustBruteLoss(unsuitable_atmos_damage)
return 1
/mob/living/simple_animal/Bumped(AM as mob|obj)
@@ -120,8 +120,12 @@
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
if(!(msg))
return
usr << "<span class='info'><b>You whisper to [M]:</b> [msg]</span>"
M << "<span class='deadsay'><b>Suddenly a strange,demonic,voice resonates in your head...</b></span><i><span class='danger'> [msg]</span></I>"
log_say("Slaughter Demon Transmit: [key_name(usr)]->[key_name(M)]: [msg]")
usr << "<span class='info'><b>You whisper to [M]: </b>[msg]</span>"
M << "<span class='deadsay'><b>Suddenly a strange, demonic voice resonates in your head... </b></span><i><span class='danger'> [msg]</span></I>"
for(var/mob/dead/observer/G in player_list)
G.show_message("<i>Demonic message from <b>[usr]</b> ([ghost_follow_link(usr, ghost=G)]) to <b>[M]</b> ([ghost_follow_link(M, ghost=G)]): [msg]</i>")
//////////The Loot