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