diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 73b5e59c713..7dbb6838046 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -16,35 +16,35 @@
message_admins("[key_name_admin(usr)] created traitors.")
log_admin("[key_name(usr)] created traitors.")
else
- message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create traitors.")
if("2")
if(src.makeChanglings())
message_admins("[key_name(usr)] created changelings.")
log_admin("[key_name(usr)] created changelings.")
else
- message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create changelings.")
if("3")
if(!src.makeRevs())
message_admins("[key_name(usr)] started a revolution.")
log_admin("[key_name(usr)] started a revolution.")
else
- message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to start a revolution.")
if("4")
if(src.makeCult())
message_admins("[key_name(usr)] started a cult.")
log_admin("[key_name(usr)] started a cult.")
else
- message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to start a cult.")
if("5")
if(src.makeMalfAImode())
message_admins("[key_name(usr)] caused an AI to malfunction.")
log_admin("[key_name(usr)] caused an AI to malfunction.")
else
- message_admins("[key_name_admin(usr)] tried to cause an AI to malfunction. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to cause an AI to malfunction. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to cause an AI to malfunction.")
if("6")
message_admins("[key_name(usr)] is creating a wizard...")
@@ -52,7 +52,7 @@
message_admins("[key_name(usr)] created a wizard.")
log_admin("[key_name(usr)] created a wizard.")
else
- message_admins("[key_name_admin(usr)] tried to create a wizard. Unfortunatly there were no candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create a wizard. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create a wizard.")
if("7")
message_admins("[key_name(usr)] is creating a nuke team...")
@@ -60,7 +60,7 @@
message_admins("[key_name(usr)] created a nuke team.")
log_admin("[key_name(usr)] created a nuke team.")
else
- message_admins("[key_name_admin(usr)] tried to create a nuke team. Unfortunatly there were not enough candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create a nuke team. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create a nuke team.")
if("8")
message_admins("[key_name(usr)] spawned a ninja.")
@@ -76,7 +76,7 @@
message_admins("[key_name(usr)] created a death squad.")
log_admin("[key_name(usr)] created a death squad.")
else
- message_admins("[key_name_admin(usr)] tried to create a death squad. Unfortunatly there were not enough candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create a death squad. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create a death squad.")
if("11")
var/strength = input("Set Blob Strength (1=Weak, 2=Strong, 3=Full)","Set Strength",1) as num
@@ -88,7 +88,7 @@
message_admins("[key_name(usr)] started a gang war.")
log_admin("[key_name(usr)] started a gang war.")
else
- message_admins("[key_name(usr)] tried to start a gang war. Unfortunatly there were not enough candidates available.")
+ message_admins("[key_name(usr)] tried to start a gang war. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to start a gang war.")
if("13")
message_admins("[key_name(usr)] is creating an emergency response team...")
@@ -96,7 +96,7 @@
message_admins("[key_name(usr)] created an emergency response team.")
log_admin("[key_name(usr)] created an emergency response team.")
else
- message_admins("[key_name_admin(usr)] tried to create an emergency response team. Unfortunatly there were not enough candidates available.")
+ message_admins("[key_name_admin(usr)] tried to create an emergency response team. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create an emergency response team.")
if("14")
message_admins("[key_name(usr)] is creating an abductor team...")
@@ -106,6 +106,14 @@
else
message_admins("[key_name_admin(usr)] tried to create an abductor team. Unfortunatly there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create an abductor team.")
+ if("15")
+ message_admins("[key_name(usr)] is creating a revenant...")
+ if(src.makeRevenant())
+ message_admins("[key_name(usr)] created a revenant.")
+ log_admin("[key_name(usr)] created a revenant.")
+ else
+ message_admins("[key_name_admin(usr)] tried to create a revenant. Unfortunately, there were no candidates available.")
+ log_admin("[key_name(usr)] failed to create a revenant.")
else if(href_list["forceevent"])
if(!check_rights(R_FUN)) return
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index c78793ac84a..7d63ed56914 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -23,6 +23,7 @@ client/proc/one_click_antag()
Make Deathsquad (Requires Ghosts)
Make Emergency Response Team (Requires Ghosts)
Make Abductor Team (Requires Ghosts)
+ Make Revenant (Requires Ghost)
"}
/* These dont work just yet
Ninja, aliens and deathsquad I have not looked into yet
@@ -537,6 +538,20 @@ client/proc/one_click_antag()
else
return
+/datum/admins/proc/makeRevenant()
+ var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null)
+ if(candidates.len >= 1)
+ var/spook_op = pick(candidates)
+ var/mob/dead/observer/O = spook_op
+ candidates -= spook_op
+ var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant(get_turf(O))
+ revvie.key = O.key
+ revvie.mind.assigned_role = "revenant"
+ revvie.mind.special_role = "Revenant"
+ return 1
+ else
+ return
+
/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck)
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
@@ -553,12 +568,19 @@ client/proc/one_click_antag()
if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate"))
continue
spawn(0)
+ G << 'sound/misc/notice2.ogg' //Alerting them to their consideration
switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No"))
if("Yes")
+ G << 'sound/machines/ping.ogg'
+ G << "Choice registered: Yes."
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
+ G << "Sorry, you were too late for the consideration!"
+ G << 'sound/machines/buzz-sigh.ogg'
return
candidates += G
if("No")
+ G << "Choice registered: No."
+ G << 'sound/machines/buzz-sigh.ogg'
return
else
return
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm
index 39585652c63..e14a9902ee9 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm
@@ -31,7 +31,7 @@
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_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
- var/strikes = 2 //How many times a revenant can die before dying for good
+ var/strikes = 3 //How many times a revenant can die before dying for good
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.
@@ -97,21 +97,39 @@
/mob/living/simple_animal/revenant/New()
..()
- notransform = 1
- spawn(50)
+ spawn(5)
if(src.mind)
- 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/targeted/revenant_life_tap
- src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_seed_drain
- src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_mindspike
- src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_mindblast
- notransform = 0
- else
- qdel(src)
+ src << 'sound/effects/ghost.ogg'
+ src.store_memory("I am a revenant. My spectral form has been empowered. My only goal is to gather essence from the humans of [world.name].")
+ src << "
"
+ src << "You are a revenant!"
+ src << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant."
+ src << "You are not dead, not alive, but somewhere in between. You are capable of very limited interaction with both worlds."
+ src << "You are invincible and invisible to everyone but other ghosts. Some abilities may change this."
+ src << "Your goal is to gather essence from humans. Your essence passively regenerates up to 25E over time. You can use the Harvest abilities to gather more from corpses."
+ src << "Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant !"
+ src << "
"
+ if(!src.giveSpells())
+ message_admins("Revenant was created but has no mind. Trying again in five seconds.")
+ spawn(50)
+ if(!src.giveSpells())
+ message_admins("Revenant still has no mind. Deleting...")
+ qdel(src)
+
+/mob/living/simple_animal/revenant/proc/giveSpells()
+ if(src.mind)
+ 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/targeted/revenant_life_tap
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_seed_drain
+ src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_mindspike
+ return 1
+ return 0
/mob/living/simple_animal/revenant/death()
+ if(!src.strikes)
+ return 0 //Impossible to die with strikes still active
..(1)
src.invisibility = 0
visible_message("[src] pulses with an eldritch purple light as its form unwinds into smoke.")
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm
index ce77282a185..0f1d6b6e391 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant_abilities.dm
@@ -50,6 +50,13 @@
if(5 to INFINITY)
user << "Such a feast! [target] will yield much essence to you."
sleep(30)
+ if(!in_range(user, target))
+ user << "You are not close enough to siphon [target]'s soul. The link has been broken."
+ draining = 1
+ return
+ if(!target.stat)
+ user << "They are now powerful enough to fight off your draining."
+ target << "You feel something tugging across your body before subsiding."
user << "You begin siphoning essence from [target]'s soul. You can not move while this is happening."
if(target.stat != DEAD)
target << "You feel a horribly unpleasant draining sensation as your grip on life weakens..."
@@ -58,7 +65,7 @@
user.revealed = 1
user.invisibility = 0
target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.")
- target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=50)
+ target.Beam(user,icon_state="drain_life",icon='icons/effects/effects.dmi',time=80)
target.death(0)
target.visible_message("[target] gently slumps back onto the ground.")
user.icon_state = "revenant_idle"
@@ -116,7 +123,7 @@
panel = "Revenant Abilities (Locked)"
charge_max = 300
clothes_req = 0
- range = 5
+ range = -1
var/locked = 1
/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
@@ -129,6 +136,7 @@
name = "Overload Light (25E)"
panel = "Revenant Abilities"
locked = 0
+ range = 5
charge_counter = charge_max
return
if(locked)
@@ -199,7 +207,7 @@
panel = "Revenant Abilities (Locked)"
charge_max = 1200
clothes_req = 0
- range = 1 //Adjacent
+ range = -1
include_user = 1
var/locked = 1
var/planted = 0
@@ -215,6 +223,7 @@
name = "Seed of Draining (20E)"
locked = 0
panel = "Revenant Abilities"
+ range = 1
include_user = 0
return
if(locked)
@@ -249,9 +258,9 @@
name = "Unlock: Mind Spike (5E)"
desc = "Drives a spike of dark energy into the target's mind. Cheap but effective and doesn't take long to cool down."
panel = "Revenant Abilities (Locked)"
- charge_max = 15
+ charge_max = 40
clothes_req = 0
- range = 3
+ range = -1
include_user = 1
var/locked = 1
@@ -266,6 +275,7 @@
name = "Mind Spike (5E)"
locked = 0
panel = "Revenant Abilities"
+ range = 3
include_user = 0
return
if(locked)
@@ -289,52 +299,6 @@
user.revealed = 0
user.invisibility = INVISIBILITY_OBSERVER
-
-//Mind Blast: A big-hitting damage ability.
-/obj/effect/proc_holder/spell/targeted/revenant_mindblast
- name = "Unlock: Mind Blast (25E)"
- desc = "Blasts the target's mind with dark energy, doing a hefty amount of damage."
- panel = "Revenant Abilities (Locked)"
- charge_max = 250
- clothes_req = 0
- range = 3
- include_user = 1
- var/locked = 1
-
-/obj/effect/proc_holder/spell/targeted/revenant_mindblast/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
- if(user.inhibited)
- user << "Something is blocking the use of [src]!"
- charge_counter = charge_max
- return
- if(locked && essence_check(25, 1))
- user << "You have unlocked Mind Blast!"
- charge_counter = charge_max
- name = "Mind Blast (25E)"
- locked = 0
- panel = "Revenant Abilities"
- include_user = 0
- return
- if(locked)
- charge_counter = charge_max
- return
- if(!essence_check(25))
- charge_counter = charge_max
- return
- for(var/mob/living/carbon/human/M in targets)
- user << "You blast [M]'s mind with energy!"
- M << "You feel a sudden explosion of agony in your head!"
- M.apply_damage(40, BRUTE, "head")
- M.adjustBrainLoss(20)
- M.emote("scream")
- M.Weaken(4)
- //M << 'sound/effects/mind_blast.ogg'
- user.revealed = 1
- user.invisibility = 0
- spawn(30)
- user.revealed = 0
- user.invisibility = INVISIBILITY_OBSERVER
-
-
//Hypnotize: Makes the target fall asleep, make them vulnerable to draining.
/obj/effect/proc_holder/spell/targeted/revenant_hypnotize
name = "Unlock: Hypnotize (15E)"
@@ -342,7 +306,7 @@
panel = "Revenant Abilities (Locked)"
charge_max = 900
clothes_req = 0
- range = 3
+ range = -1
include_user = 1
var/locked = 1
@@ -356,6 +320,7 @@
charge_counter = charge_max
name = "Hypnotize (15E)"
locked = 0
+ range = 3
panel = "Revenant Abilities"
include_user = 0
return
@@ -370,4 +335,12 @@
M << "Tired... so tired..."
M.drowsyness += 7
spawn(70)
- M.sleeping += 12
+ M.sleeping += 30
+
+
+/* (WIP)
+Strangulate: Chokes the target with crushing force.
+/obj/effect/proc_holder/spell/targeted/revenant_strangulate
+ name = "Unlock: Strangulate (30E)"
+ desc = "Strangles a target with an asphyxiating hand, dealing decent oxygen damage to them."
+*/
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm
index a2e7553753c..fd897699a43 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm
@@ -1,6 +1,7 @@
/datum/round_event_control/revenant
name = "Spawn Revenant"
typepath = /datum/round_event/revenant
+ weight = 15
max_occurrences = 3
earliest_start = 0 //Meant to mix things up early-game.
@@ -37,21 +38,11 @@
return find_revenant()
var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs))
player_mind.transfer_to(revvie)
- player_mind.assigned_role = "MODE"
+ player_mind.assigned_role = "revenant"
player_mind.special_role = "Revenant"
ticker.mode.traitors |= player_mind
- revvie << 'sound/effects/ghost.ogg'
message_admins("[key_of_revenant] has been made into a Revenant by an event.")
log_game("[key_of_revenant] was spawned as a Revenant by an event.")
- player_mind.store_memory("I am a revenant. My spectral form has been empowered. My only goal is to gather essence from the humans of [world.name].")
- revvie << "
"
- revvie << "You are a revenant!"
- revvie << "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant."
- revvie << "You are not dead, not alive, but somewhere in between. You are capable of very limited interaction with both worlds."
- revvie << "You are invincible and invisible to everyone but other ghosts. Some abilities may change this."
- revvie << "Your goal is to gather essence from humans. Your essence passively regenerates up to 25E over time. You can use the Harvest abilities to gather more from corpses."
- //revvie << "Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant !" //Not added yet.
- revvie << "
"
return 1