From fe1cd9a5faab8e82e284c2d896e3b37a71001a55 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 24 Aug 2023 10:12:02 +0100 Subject: [PATCH] Research Biohazard Lockdown (#4067) # About the pull request Adds a unique lockdown system for research biohazards. # Explain why it's good for the game Adds some nice flavour to research. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added a new lockdown system to research. add: Added an admin button to interact with above. /:cl: --------- Co-authored-by: harryob --- code/__DEFINES/dcs/signals/signals_global.dm | 4 + code/game/machinery/biohazard_lockdown.dm | 109 ++++++++ code/modules/admin/admin_verbs.dm | 3 +- code/modules/admin/verbs/adminpanelgq.dm | 36 +-- colonialmarines.dme | 1 + .../structures/doors/blastdoors_shutters.dmi | Bin 6216 -> 7754 bytes maps/map_files/USS_Almayer/USS_Almayer.dmm | 242 ++++++------------ sound/effects/biohazard.ogg | Bin 0 -> 86483 bytes 8 files changed, 216 insertions(+), 179 deletions(-) create mode 100644 code/game/machinery/biohazard_lockdown.dm create mode 100644 sound/effects/biohazard.ogg diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index a288ac2c8be7..e33a75aee132 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -59,3 +59,7 @@ /// From #define COMSIG_GLOB_YAUTJA_ARMORY_OPENED "yautja_armory_opened" + +/// From /proc/biohazard_lockdown() +#define COMSIG_GLOB_RESEARCH_LOCKDOWN "research_lockdown_closed" +#define COMSIG_GLOB_RESEARCH_LIFT "research_lockdown_opened" diff --git a/code/game/machinery/biohazard_lockdown.dm b/code/game/machinery/biohazard_lockdown.dm new file mode 100644 index 000000000000..fd6205baa1d9 --- /dev/null +++ b/code/game/machinery/biohazard_lockdown.dm @@ -0,0 +1,109 @@ +#define LOCKDOWN_READY 0 +#define LOCKDOWN_ACTIVE 1 +GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) + +/obj/structure/machinery/biohazard_lockdown + name = "Emergency Containment Breach" + icon_state = "big_red_button_tablev" + unslashable = TRUE + unacidable = TRUE + COOLDOWN_DECLARE(containment_lockdown) + +/obj/structure/machinery/biohazard_lockdown/ex_act(severity) + return FALSE + +/obj/structure/machinery/biohazard_lockdown/attack_remote(mob/user as mob) + return FALSE + +/obj/structure/machinery/biohazard_lockdown/attack_alien(mob/user as mob) + return FALSE + +/obj/structure/machinery/biohazard_lockdown/attackby(obj/item/attacking_item, mob/user) + return attack_hand(user) + +/obj/structure/machinery/biohazard_lockdown/attack_hand(mob/living/user) + if(isxeno(user)) + return FALSE + if(!allowed(user)) + to_chat(user, SPAN_DANGER("Access Denied")) + flick(initial(icon_state) + "-denied", src) + return FALSE + + if(!COOLDOWN_FINISHED(src, containment_lockdown)) + to_chat(user, SPAN_BOLDWARNING("Biohazard Lockdown procedures are on cooldown! They will be ready in [COOLDOWN_SECONDSLEFT(src, containment_lockdown)] seconds!")) + return FALSE + + add_fingerprint(user) + biohazard_lockdown(user) + COOLDOWN_START(src, containment_lockdown, 5 MINUTES) + +/obj/structure/machinery/door/poddoor/almayer/biohazard + name = "Biohazard Containment Airlock" + density = FALSE + +/obj/structure/machinery/door/poddoor/almayer/biohazard/Initialize() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_RESEARCH_LOCKDOWN, PROC_REF(close)) + RegisterSignal(SSdcs, COMSIG_GLOB_RESEARCH_LIFT, PROC_REF(open)) + +/obj/structure/machinery/door/poddoor/almayer/biohazard/white + icon_state = "w_almayer_pdoor1" + base_icon_state = "w_almayer_pdoor" + +/client/proc/admin_biohazard_alert() + set name = "Containment Breach Alert" + set category = "Admin.Ship" + + if(!admin_holder ||!check_rights(R_EVENT)) + return FALSE + + var/prompt = tgui_alert(src, "Are you sure you want to trigger a containment breach alert? This will force red alert, and lockdown research.", "Choose.", list("Yes", "No"), 20 SECONDS) + if(prompt != "Yes") + return FALSE + + prompt = tgui_alert(src, "Do you want to use a custom announcement?", "Choose.", list("Yes", "No"), 20 SECONDS) + if(prompt == "Yes") + var/whattoannounce = tgui_input_text(src, "Please enter announcement text.", "what?") + biohazard_lockdown(usr, whattoannounce, TRUE) + else + biohazard_lockdown(usr, admin = TRUE) + return TRUE + +/proc/biohazard_lockdown(mob/user, message, admin = FALSE) + if(IsAdminAdvancedProcCall()) + return PROC_BLOCKED + + var/log = "[key_name(user)] triggered research bio lockdown!" + var/ares_log = "[user.name] triggered Medical Research Biohazard Containment Lockdown." + if(!message) + message = "ATTENTION! \n\nBIOHAZARD CONTAINMENT BREACH. \n\nRESEARCH DEPARTMENT UNDER LOCKDOWN." + else + log = "[key_name(user)] triggered research bio lockdown! (Using a custom announcement)." + if(admin) + log += " (Admin Triggered)." + ares_log = "[MAIN_AI_SYSTEM] triggered Medical Research Biohazard Containment Lockdown." + + switch(GLOB.lockdown_state) + if(LOCKDOWN_READY) + GLOB.lockdown_state = LOCKDOWN_ACTIVE + set_security_level(SEC_LEVEL_RED, TRUE, FALSE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_RESEARCH_LOCKDOWN) + if(LOCKDOWN_ACTIVE) + GLOB.lockdown_state = LOCKDOWN_READY + message = "ATTENTION! \n\nBIOHAZARD CONTAINMENT LOCKDOWN LIFTED." + log = "[key_name(user)] lifted research bio lockdown!" + ares_log = "[user.name] lifted Medical Research Biohazard Containment Lockdown." + if(admin) + log += " (Admin Triggered)." + ares_log = "[MAIN_AI_SYSTEM] lifted Medical Research Biohazard Containment Lockdown." + + set_security_level(SEC_LEVEL_BLUE, TRUE, FALSE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_RESEARCH_LIFT) + + shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') + message_admins(log) + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Containment Lockdown", ares_log) + +#undef LOCKDOWN_READY +#undef LOCKDOWN_ACTIVE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 368e2766ccfc..5e527e6a5442 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -133,7 +133,8 @@ var/list/admin_verbs_minor_event = list( /client/proc/toggle_shipside_sd, /client/proc/shakeshipverb, /client/proc/adminpanelweapons, - /client/proc/adminpanelgq, + /client/proc/admin_general_quarters, + /client/proc/admin_biohazard_alert, /client/proc/toggle_hardcore_perma ) diff --git a/code/modules/admin/verbs/adminpanelgq.dm b/code/modules/admin/verbs/adminpanelgq.dm index 13b6e329aa69..8ef1ed869661 100644 --- a/code/modules/admin/verbs/adminpanelgq.dm +++ b/code/modules/admin/verbs/adminpanelgq.dm @@ -1,22 +1,24 @@ -/client/proc/adminpanelgq() +/client/proc/admin_general_quarters() set name = "Call General Quarters" set category = "Admin.Ship" if(security_level == SEC_LEVEL_RED || security_level == SEC_LEVEL_DELTA) tgui_alert(src, "Security is already red or above, General Quarters cannot be called.", "Acknowledge!", list("ok."), 10 SECONDS) - else - var/whattoannounce = "ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS." - var/prompt = tgui_alert(src, "Do you want to leave the announcement as the default one?", "Choose.", list("Yes", "No"), 20 SECONDS) - if(prompt == "No") - whattoannounce = tgui_input_text(src, "Please enter announcement text.", "what?") - prompt = tgui_alert(src, "Are you sure you want to send General Quarters? This will force red alert.", "Choose.", list("Yes", "No"), 20 SECONDS) - if(prompt == "Yes") - set_security_level(2, no_sound=1, announce=0) - shipwide_ai_announcement(whattoannounce, MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') - message_admins("[key_name_admin(src)] Sent General Quarters with a custom announcement!") - else - prompt = tgui_alert(src, "Are you sure you want to send General Quarters? This will force red alert.", "Choose.", list("Yes", "No"), 20 SECONDS) - if(prompt == "Yes") - set_security_level(2, no_sound=1, announce=0) - shipwide_ai_announcement(whattoannounce, MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') - message_admins("[key_name_admin(src)] Sent General Quarters!") + return FALSE + + var/prompt = tgui_alert(src, "Are you sure you want to send General Quarters? This will force red alert.", "Choose.", list("Yes", "No"), 20 SECONDS) + if(prompt != "Yes") + return FALSE + + var/whattoannounce = "ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS." + var/log = "[key_name_admin(src)] Sent General Quarters!" + + prompt = tgui_alert(src, "Do you want to use a custom announcement?", "Choose.", list("Yes", "No"), 20 SECONDS) + if(prompt == "Yes") + whattoannounce = tgui_input_text(src, "Please enter announcement text.", "what?") + log = "[key_name_admin(src)] Sent General Quarters! (Using a custom announcement)" + + set_security_level(SEC_LEVEL_RED, TRUE, FALSE) + shipwide_ai_announcement(whattoannounce, MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') + message_admins(log) + return TRUE diff --git a/colonialmarines.dme b/colonialmarines.dme index 42e7880bd313..43a250b7b091 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -741,6 +741,7 @@ #include "code\game\machinery\autolathe_datums.dm" #include "code\game\machinery\Beacon.dm" #include "code\game\machinery\bio-dome_floodlights.dm" +#include "code\game\machinery\biohazard_lockdown.dm" #include "code\game\machinery\bioprinter.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" diff --git a/icons/obj/structures/doors/blastdoors_shutters.dmi b/icons/obj/structures/doors/blastdoors_shutters.dmi index 0c91c00f0f79422f45dbef1f653c8a3e162a2dd6..c5ec97be49b8ffebd7a4ac69e0cda89664ebf6bd 100644 GIT binary patch literal 7754 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 literal 6216 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
    8kgzCt;zh&nI-6nd>=R#=-PpQs=FYhS|h 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