From 15136717ded70485c52195e5a2c860c26e7f0598 Mon Sep 17 00:00:00 2001 From: Dan-Neposh Date: Mon, 19 Oct 2020 14:14:13 -0400 Subject: [PATCH] Beginnings on eminence rework turns the eminence vote into an innate action all cultists get. Pending what to do with constructs/silicons when they try to become an eminence with this --- .../clockcult/clock_helpers/leader_helpers.dm | 124 ++++++++++++++++++ .../clockcult/clock_mobs/_eminence.dm | 10 +- .../antagonists/clockcult/clockcult.dm | 13 ++ tgstation.dme | 3 +- 4 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 code/modules/antagonists/clockcult/clock_helpers/leader_helpers.dm diff --git a/code/modules/antagonists/clockcult/clock_helpers/leader_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/leader_helpers.dm new file mode 100644 index 0000000000..768f1970bc --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_helpers/leader_helpers.dm @@ -0,0 +1,124 @@ +/datum/action/innate/eminence_ascend + name = "Ascend as eminence" + button_icon_state = "eminence_action" + background_icon_state = "bg_clock" + buttontooltipstyle = "clockcult" + var/mob/eminence_nominee + var/selection_timer //Timer ID; this is canceled if the vote is canceled + var/kingmaking + +/datum/action/innate/eminence_ascend/activate() + var/datum/antagonist/clockcult/C = user.mind.has_antag_datum(/datum/antagonist/clockcult) + if(!C || !C.clock_team) + return + if(C.clock_team.eminence) + to_chat(user, "There's already an Eminence!") + return + if(eminence_nominee) //This could be one large proc, but is split into three for ease of reading + if(eminence_nominee == user) + cancelation(user) + else + objection(user) + else + nomination(user) + +/datum/action/innate/eminence_ascend/attack_drone(mob/living/simple_animal/drone/user) + if(!is_servant_of_ratvar(user)) + ..() + else + to_chat(user, "You feel the omniscient gaze turn into a puzzled frown. Perhaps you should just stick to building.") + return + + var/datum/mind/rando = locate() in get_antag_minds(/datum/antagonist/clockcult) //if theres no cultists new team without eminence will be created anyway. + if(rando) + var/datum/antagonist/clockcult/random_cultist = rando.has_antag_datum(/datum/antagonist/clockcult) + if(random_cultist && random_cultist.clock_team && random_cultist.clock_team.eminence) + to_chat(user, "There's already an Eminence - too late!") + return + if(!GLOB.servants_active) + to_chat(user, "The Ark must be active first!") + return + if(alert(user, "Become the Eminence using admin?", "Become Eminence", "Yes", "No") != "Yes") + return + message_admins("Admin [key_name_admin(user)] directly became the Eminence of the cult!") + log_admin("Admin [key_name(user)] made themselves the Eminence.") + var/mob/camera/eminence/eminence = new(get_turf(src)) + user.transfer_ckey(eminence, FALSE) + hierophant_message("Ratvar has directly assigned the Eminence!") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE) + +/datum/action/innate/eminence_ascend/proc/nomination(mob/living/nominee) //A user is nominating themselves or ghosts to become Eminence + var/nomination_choice = alert(nominee, "Who would you like to nominate?", "Eminence Nomination", "Nominate Yourself", "Nominate Ghosts", "Cancel") + if(!is_servant_of_ratvar(nominee) || !nominee.canUseTopic(src) || eminence_nominee) + return + switch(nomination_choice) + if("Cancel") + return + if("Nominate Yourself") + eminence_nominee = nominee + hierophant_message("[nominee] nominates [nominee.p_them()]self as the Eminence! You may object by interacting with the eminence spire. The vote will otherwise pass in 30 seconds.") + if("Nominate Ghosts") + eminence_nominee = "ghosts" + hierophant_message("[nominee] proposes selecting an Eminence from ghosts! You may object by interacting with the eminence spire. The vote will otherwise pass in 30 seconds.") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/ocularwarden-target.ogg', 50, FALSE) + selection_timer = addtimer(CALLBACK(src, .proc/kingmaker), 300, TIMER_STOPPABLE) + +/datum/action/innate/eminence_ascend/proc/objection(mob/living/wright) + if(alert(wright, "Object to the selection of [eminence_nominee] as Eminence?", "Objection!", "Object", "Cancel") == "Cancel" || !is_servant_of_ratvar(wright) || !wright.canUseTopic(src) || !eminence_nominee) + return + hierophant_message("[wright] objects to the nomination of [eminence_nominee]! The eminence spire has been reset.") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/integration_cog_install.ogg', 50, FALSE) + eminence_nominee = null + deltimer(selection_timer) + +/datum/action/innate/eminence_ascend/proc/cancelation(mob/living/cold_feet) + if(alert(cold_feet, "Cancel your nomination?", "Cancel Nomination", "Withdraw Nomination", "Cancel") == "Cancel" || !is_servant_of_ratvar(cold_feet) || !cold_feet.canUseTopic(src) || !eminence_nominee) + return + hierophant_message("[eminence_nominee] has withdrawn their nomination! The eminence spire has been reset.") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/integration_cog_install.ogg', 50, FALSE) + eminence_nominee = null + deltimer(selection_timer) + +/datum/action/innate/eminence_ascend/proc/kingmaker() + if(!eminence_nominee) + return + if(ismob(eminence_nominee)) + if(!eminence_nominee.client || !eminence_nominee.mind) + hierophant_message("[eminence_nominee] somehow lost their sentience! The eminence spire has been reset.") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/integration_cog_install.ogg', 50, FALSE) + eminence_nominee = null + return + playsound(eminence_nominee, 'sound/machines/clockcult/ark_damage.ogg', 50, FALSE) + eminence_nominee.visible_message("A blast of white-hot light flows into [eminence_nominee], vaporizing [eminence_nominee.p_them()] in an instant!", \ + "allthelightintheuniverseflowing.into.YOU") + for(var/obj/item/I in eminence_nominee) + eminence_nominee.dropItemToGround(I) + var/mob/camera/eminence/eminence = new(get_turf(src)) + eminence_nominee.mind.transfer_to(eminence) + eminence_nominee.dust() + hierophant_message("[eminence_nominee] has ascended into the Eminence!") + else if(eminence_nominee == "ghosts") + kingmaking = TRUE + hierophant_message("The eminence spire is now selecting a ghost to be the Eminence...") + var/list/candidates = pollGhostCandidates("Would you like to play as the servants' Eminence?", ROLE_SERVANT_OF_RATVAR, null, ROLE_SERVANT_OF_RATVAR, poll_time = 100) + kingmaking = FALSE + if(!LAZYLEN(candidates)) + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/integration_cog_install.ogg', 50, FALSE) + hierophant_message("No ghosts accepted the offer! The eminence spire has been reset.") + eminence_nominee = null + return + visible_message("A blast of white-hot light spirals from [src] in waves!") + playsound(src, 'sound/machines/clockcult/ark_damage.ogg', 50, FALSE) + var/mob/camera/eminence/eminence = new(get_turf(src)) + eminence_nominee = pick(candidates) + eminence_nominee.transfer_ckey(eminence) + hierophant_message("A ghost has ascended into the Eminence!") + for(var/mob/M in servants_and_ghosts()) + M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE) + eminence_nominee = null \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index dfda2bf152..365cf964d0 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -251,8 +251,8 @@ var/mob/camera/eminence/E = owner E.eminence_help() -/* -//Returns to the Ark - Commented out and replaced with obelisk_jump + +//Returns to the Ark - Going along with their superior mobility /datum/action/innate/eminence/ark_jump name = "Return to Ark" desc = "Warps you to the Ark." @@ -265,8 +265,8 @@ owner.playsound_local(owner, 'sound/magic/magic_missile.ogg', 50, TRUE) flash_color(owner, flash_color = "#AF0AAF", flash_time = 25) else - to_chat(owner, "There is no Ark!") -*/ + to_chat(owner, "There is no Ark to warp to, ascendant one.") + //Warps to a chosen Obelisk /datum/action/innate/eminence/obelisk_jump @@ -334,4 +334,4 @@ if(G && !G.recalling && G.recalls_remaining) if(alert(owner, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(owner) || QDELETED(G) || !G.obj_integrity) return - G.initiate_mass_recall() + G.initiate_mass_recall() \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index b6ed7dfe65..fcd23aeff1 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -7,6 +7,7 @@ antag_moodlet = /datum/mood_event/cult skill_modifiers = list(/datum/skill_modifier/job/level/wiring) var/datum/action/innate/hierophant/hierophant_network = new + var/datum/action/innate/hierophant/eminence_ascend = new threat = 3 var/datum/team/clockcult/clock_team var/make_team = TRUE //This should be only false for tutorial scarabs @@ -27,8 +28,20 @@ show_in_roundend = FALSE make_team = FALSE +/datum/antagonist/clockcult/eminence + var/datum/action/innate/eminence/mass_recall = new + var/datum/action/innate/eminence/obelisk_jump = new + var/datum/action/innate/eminence/ark_jump = new + /datum/antagonist/clockcult/Destroy() qdel(hierophant_network) + qdel(eminence_ascend) + return ..() + +/datum/antagonist/clockcult/eminence/Destroy() + qdel(mass_recall) + qdel(obelisk_jump) + qdel(ark_jump) return ..() /datum/antagonist/clockcult/get_team() diff --git a/tgstation.dme b/tgstation.dme index 14a6a7cd10..03e8c6f1e5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1570,6 +1570,7 @@ #include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\leader_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm" #include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm" @@ -1599,8 +1600,6 @@ #include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" #include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" #include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" -#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" -#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" #include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" #include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" #include "code\modules\antagonists\clockcult\clock_structures\prolonging_prism.dm"