diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index f975a67824ef..306f37deb8cb 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -69,6 +69,9 @@ /// From /proc/biohazard_lockdown() #define COMSIG_GLOB_RESEARCH_LOCKDOWN "!research_lockdown_closed" #define COMSIG_GLOB_RESEARCH_LIFT "!research_lockdown_opened" +/// From /proc/aicore_lockdown() +#define COMSIG_GLOB_AICORE_LOCKDOWN "!aicore_lockdown_closed" +#define COMSIG_GLOB_AICORE_LIFT "!aicore_lockdown_opened" /// From /obj/structure/machinery/power/reactor/proc/set_overloading() : (set_overloading) #define COMSIG_GLOB_GENERATOR_SET_OVERLOADING "!generator_set_overloading" diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm index 341e6a05acf4..6905c47febb8 100644 --- a/code/game/machinery/ARES/ARES_interface.dm +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -522,5 +522,12 @@ sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + if("security_lockdown") + if(!COOLDOWN_FINISHED(datacore, aicore_lockdown)) + to_chat(user, SPAN_BOLDWARNING("AI Core Lockdown procedures are on cooldown! They will be ready in [COOLDOWN_SECONDSLEFT(datacore, aicore_lockdown)] seconds!")) + return FALSE + aicore_lockdown(user) + return TRUE + if(playsound) playsound(src, "keyboard_alt", 15, 1) diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm index 48fcad588574..37b2fbda0ecb 100644 --- a/code/game/machinery/ARES/ARES_interface_apollo.dm +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -158,29 +158,29 @@ return var/playsound = TRUE - var/mob/living/carbon/human/operator = ui.user + var/mob/living/carbon/human/user = ui.user switch (action) if("go_back") if(!last_menu) - return to_chat(operator, SPAN_WARNING("Error, no previous page detected.")) + return to_chat(user, SPAN_WARNING("Error, no previous page detected.")) var/temp_holder = current_menu current_menu = last_menu last_menu = temp_holder if("login") - var/obj/item/card/id/idcard = operator.get_active_hand() + var/obj/item/card/id/idcard = user.get_active_hand() if(istype(idcard)) authentication = get_ares_access(idcard) last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id + else if(user.wear_id) + idcard = user.wear_id if(istype(idcard)) authentication = get_ares_access(idcard) last_login = idcard.registered_name else - to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) + to_chat(user, SPAN_WARNING("You require an ID card to access this terminal!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(authentication) @@ -222,23 +222,23 @@ if("new_report") var/priority_report = FALSE - var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) + var/maint_type = tgui_input_list(user, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) switch(maint_type) if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") priority_report = TRUE if(!maint_type) return FALSE - var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) + var/details = tgui_input_text(user, "What are the details for this report?", "Ticket Details", encode = FALSE) if(!details) return FALSE if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) - var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) + var/is_priority = tgui_alert(user, "Is this a priority report?", "Priority designation", list("Yes", "No")) if(is_priority == "Yes") priority_report = TRUE - var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") + var/confirm = alert(user, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") if(confirm == "Yes") if(link) var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) @@ -247,7 +247,7 @@ ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") else send_notifcation() - log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") + log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(user)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") return TRUE return FALSE @@ -259,14 +259,14 @@ var/assigned = ticket.ticket_assignee if(assigned) if(assigned == last_login) - var/prompt = tgui_alert(operator, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + var/prompt = tgui_alert(user, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) if(prompt != "Yes") return FALSE /// set ticket back to pending ticket.ticket_assignee = null ticket.ticket_status = TICKET_PENDING return claim - var/choice = tgui_alert(operator, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + var/choice = tgui_alert(user, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) if(choice != "Yes") claim = FALSE if(claim) @@ -279,9 +279,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_submitter != last_login) - to_chat(operator, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + to_chat(user, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) return FALSE - to_chat(operator, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + to_chat(user, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) ticket.ticket_status = TICKET_CANCELLED if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") @@ -294,9 +294,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(user, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE - var/choice = tgui_alert(operator, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + var/choice = tgui_alert(user, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) switch(choice) if(TICKET_COMPLETED) ticket.ticket_status = TICKET_COMPLETED @@ -308,39 +308,39 @@ ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") else send_notifcation() - to_chat(operator, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + to_chat(user, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) return TRUE if("new_access") - var/obj/item/card/id/idcard = operator.get_active_hand() + var/obj/item/card/id/idcard = user.get_active_hand() var/has_id = FALSE if(istype(idcard)) has_id = TRUE - else if(operator.wear_id) - idcard = operator.wear_id + else if(user.wear_id) + idcard = user.wear_id if(istype(idcard)) has_id = TRUE if(!has_id) - to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) + to_chat(user, SPAN_WARNING("You require an ID card to request an access ticket!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(idcard.registered_name != last_login) - to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) + to_chat(user, SPAN_WARNING("This ID card does not match the active login!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) + var/details = tgui_input_text(user, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) if(!details) return FALSE - var/confirm = alert(operator, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") + var/confirm = alert(user, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") if(confirm != "Yes" || !link) return FALSE var/datum/ares_ticket/access/access_ticket = new(last_login, details, FALSE, idcard.registered_gid) link.waiting_ids += idcard link.tickets_access += access_ticket - log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Details of '[details]'.") - message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) + log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(user)] as [last_login] with Details of '[details]'.") + message_admins(SPAN_STAFF_IC("[key_name_admin(user)] created a new ARES Access Ticket."), 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] requesting access for '[details].") return TRUE @@ -361,9 +361,9 @@ access_ticket.ticket_status = TICKET_RETURNED identification.access -= ACCESS_MARINE_AI_TEMP - identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." + identification.modification_log += "Temporary AI Access self-returned by [key_name(user)]." - to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) + to_chat(user, SPAN_NOTICE("Temporary Access Ticket surrendered.")) playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] surrendered their access.") @@ -372,7 +372,7 @@ datacore.apollo_login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." return TRUE - to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) + to_chat(user, SPAN_WARNING("This ID card does not have an access ticket!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE @@ -384,7 +384,7 @@ for(var/obj/item/card/id/identification in link.waiting_ids) if(identification.registered_gid != access_ticket.user_id_num) continue - identification.handle_ares_access(last_login, operator) + identification.handle_ares_access(last_login, user) access_ticket.ticket_status = TICKET_GRANTED playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") @@ -392,7 +392,7 @@ for(var/obj/item/card/id/identification in link.active_ids) if(identification.registered_gid != access_ticket.user_id_num) continue - identification.handle_ares_access(last_login, operator) + identification.handle_ares_access(last_login, user) access_ticket.ticket_status = TICKET_REVOKED playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] had access revoked by [last_login].") @@ -404,10 +404,10 @@ if(!istype(access_ticket)) return FALSE if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(user, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE access_ticket.ticket_status = TICKET_REJECTED - to_chat(operator, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + to_chat(user, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") for(var/obj/item/card/id/identification in link.waiting_ids) if(identification.registered_gid != access_ticket.user_id_num) @@ -422,36 +422,41 @@ playsound = FALSE var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) - to_chat(operator, SPAN_WARNING("ERROR: Gas release failure.")) + to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(!COOLDOWN_FINISHED(sec_vent, vent_trigger_cooldown)) - to_chat(operator, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent.")) + to_chat(user, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - to_chat(operator, SPAN_WARNING("Initiating gas release from [sec_vent.vent_tag].")) + to_chat(user, SPAN_WARNING("Initiating gas release from [sec_vent.vent_tag].")) playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") log_ares_security("Nerve Gas Release", "[last_login] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) - log_admin("[key_name(operator)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + + if("security_lockdown") + if(!COOLDOWN_FINISHED(datacore, aicore_lockdown)) + to_chat(user, SPAN_BOLDWARNING("AI Core Lockdown procedures are on cooldown! They will be ready in [COOLDOWN_SECONDSLEFT(datacore, aicore_lockdown)] seconds!")) + return FALSE + aicore_lockdown(user) + return TRUE if(playsound) playsound(src, "keyboard_alt", 15, 1) /obj/item/card/id/proc/handle_ares_access(logged_in = MAIN_AI_SYSTEM, mob/user) - var/operator = key_name(user) + var/changer = logged_in + if(user) + changer = key_name(user) var/datum/ares_link/link = GLOB.ares_link - if(logged_in == MAIN_AI_SYSTEM) - if(!user) - operator = "[MAIN_AI_SYSTEM] (Automated)" - else - operator = "[user.ckey]/([MAIN_AI_SYSTEM])" + if(ACCESS_MARINE_AI_TEMP in access) access -= ACCESS_MARINE_AI_TEMP link.active_ids -= src - modification_log += "Temporary AI access revoked by [operator]" + log_idmod(src, "Temporary AI access revoked by [logged_in]", changer) to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) var/mob/living/carbon/human/id_owner = registered_ref?.resolve() if(id_owner) @@ -459,7 +464,7 @@ playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0) else access += ACCESS_MARINE_AI_TEMP - modification_log += "Temporary AI access granted by [operator]" + log_idmod(src, "Temporary AI access granted by [logged_in]", changer) to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) link.waiting_ids -= src link.active_ids += src diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index 05f110ec1a0c..8ecb711e9fb7 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -106,9 +106,13 @@ GLOBAL_LIST_INIT(maintenance_categories, list( /// Is nuke request usable or not? var/nuke_available = TRUE + /// Status of the AI Core Lockdown + var/ai_lockdown_active = FALSE + COOLDOWN_DECLARE(ares_distress_cooldown) COOLDOWN_DECLARE(ares_nuclear_cooldown) COOLDOWN_DECLARE(ares_quarters_cooldown) + COOLDOWN_DECLARE(aicore_lockdown) // ------ ARES Logging Procs ------ // /proc/ares_is_active() diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm index e447bb6f7ee7..2f18a5ba0522 100644 --- a/code/game/machinery/ARES/apollo_pda.dm +++ b/code/game/machinery/ARES/apollo_pda.dm @@ -181,29 +181,29 @@ return var/playsound = TRUE - var/mob/living/carbon/human/operator = ui.user + var/mob/living/carbon/human/user = ui.user switch (action) if("go_back") if(!last_menu) - return to_chat(operator, SPAN_WARNING("Error, no previous page detected.")) + return to_chat(user, SPAN_WARNING("Error, no previous page detected.")) var/temp_holder = current_menu current_menu = last_menu last_menu = temp_holder if("login") - var/obj/item/card/id/idcard = operator.get_active_hand() + var/obj/item/card/id/idcard = user.get_active_hand() if(istype(idcard)) authentication = get_ares_access(idcard) last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id + else if(user.wear_id) + idcard = user.wear_id if(istype(idcard)) authentication = get_ares_access(idcard) last_login = idcard.registered_name else - to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) + to_chat(user, SPAN_WARNING("You require an ID card to access this terminal!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(authentication) @@ -248,23 +248,23 @@ if("new_report") var/priority_report = FALSE - var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) + var/maint_type = tgui_input_list(user, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) switch(maint_type) if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") priority_report = TRUE if(!maint_type) return FALSE - var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) + var/details = tgui_input_text(user, "What are the details for this report?", "Ticket Details", encode = FALSE) if(!details) return FALSE if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) - var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) + var/is_priority = tgui_alert(user, "Is this a priority report?", "Priority designation", list("Yes", "No")) if(is_priority == "Yes") priority_report = TRUE - var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") + var/confirm = alert(user, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") if(confirm == "Yes") if(link) var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) @@ -273,7 +273,7 @@ ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") else send_notifcation() - log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") + log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(user)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") return TRUE return FALSE @@ -285,14 +285,14 @@ var/assigned = ticket.ticket_assignee if(assigned) if(assigned == last_login) - var/prompt = tgui_alert(operator, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + var/prompt = tgui_alert(user, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) if(prompt != "Yes") return FALSE /// set ticket back to pending ticket.ticket_assignee = null ticket.ticket_status = TICKET_PENDING return claim - var/choice = tgui_alert(operator, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + var/choice = tgui_alert(user, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) if(choice != "Yes") claim = FALSE if(claim) @@ -305,9 +305,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_submitter != last_login) - to_chat(operator, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + to_chat(user, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) return FALSE - to_chat(operator, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + to_chat(user, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) ticket.ticket_status = TICKET_CANCELLED if(ticket.ticket_priority) ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") @@ -320,9 +320,9 @@ if(!istype(ticket)) return FALSE if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(user, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE - var/choice = tgui_alert(operator, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + var/choice = tgui_alert(user, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) switch(choice) if(TICKET_COMPLETED) ticket.ticket_status = TICKET_COMPLETED @@ -334,39 +334,39 @@ ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") else send_notifcation() - to_chat(operator, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + to_chat(user, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) return TRUE if("new_access") - var/obj/item/card/id/idcard = operator.get_active_hand() + var/obj/item/card/id/idcard = user.get_active_hand() var/has_id = FALSE if(istype(idcard)) has_id = TRUE - else if(operator.wear_id) - idcard = operator.wear_id + else if(user.wear_id) + idcard = user.wear_id if(istype(idcard)) has_id = TRUE if(!has_id) - to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) + to_chat(user, SPAN_WARNING("You require an ID card to request an access ticket!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(idcard.registered_name != last_login) - to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) + to_chat(user, SPAN_WARNING("This ID card does not match the active login!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) + var/details = tgui_input_text(user, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) if(!details) return FALSE - var/confirm = alert(operator, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") + var/confirm = alert(user, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") if(confirm != "Yes" || !link) return FALSE var/datum/ares_ticket/access/access_ticket = new(last_login, details, FALSE, idcard.registered_gid) link.waiting_ids += idcard link.tickets_access += access_ticket - log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Details of '[details]'.") - message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) + log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(user)] as [last_login] with Details of '[details]'.") + message_admins(SPAN_STAFF_IC("[key_name_admin(user)] created a new ARES Access Ticket."), 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] requesting access for '[details].") return TRUE @@ -387,9 +387,9 @@ access_ticket.ticket_status = TICKET_RETURNED identification.access -= ACCESS_MARINE_AI_TEMP - identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." + identification.modification_log += "Temporary AI Access self-returned by [key_name(user)]." - to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) + to_chat(user, SPAN_NOTICE("Temporary Access Ticket surrendered.")) playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] surrendered their access.") @@ -398,7 +398,7 @@ datacore.apollo_login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." return TRUE - to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) + to_chat(user, SPAN_WARNING("This ID card does not have an access ticket!")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE @@ -410,7 +410,7 @@ for(var/obj/item/card/id/identification in link.waiting_ids) if(identification.registered_gid != access_ticket.user_id_num) continue - identification.handle_ares_access(last_login, operator) + identification.handle_ares_access(last_login, user) access_ticket.ticket_status = TICKET_GRANTED playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") @@ -418,7 +418,7 @@ for(var/obj/item/card/id/identification in link.active_ids) if(identification.registered_gid != access_ticket.user_id_num) continue - identification.handle_ares_access(last_login, operator) + identification.handle_ares_access(last_login, user) access_ticket.ticket_status = TICKET_REVOKED playsound(src, 'sound/machines/chime.ogg', 15, 1) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] had access revoked by [last_login].") @@ -430,10 +430,10 @@ if(!istype(access_ticket)) return FALSE if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(operator, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + to_chat(user, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) return FALSE access_ticket.ticket_status = TICKET_REJECTED - to_chat(operator, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + to_chat(user, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") for(var/obj/item/card/id/identification in link.waiting_ids) if(identification.registered_gid != access_ticket.user_id_num) @@ -448,20 +448,27 @@ playsound = FALSE var/obj/structure/pipes/vents/pump/no_boom/gas/sec_vent = locate(params["vent"]) if(!istype(sec_vent) || sec_vent.welded) - to_chat(operator, SPAN_WARNING("ERROR: Gas release failure.")) + to_chat(user, SPAN_WARNING("ERROR: Gas release failure.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE if(!COOLDOWN_FINISHED(sec_vent, vent_trigger_cooldown)) - to_chat(operator, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent.")) + to_chat(user, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent.")) playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) return FALSE - to_chat(operator, SPAN_WARNING("Initiating gas release from [sec_vent.vent_tag].")) + to_chat(user, SPAN_WARNING("Initiating gas release from [sec_vent.vent_tag].")) playsound(src, 'sound/machines/chime.ogg', 15, 1) COOLDOWN_START(sec_vent, vent_trigger_cooldown, COOLDOWN_ARES_VENT) ares_apollo_talk("Nerve Gas release imminent from [sec_vent.vent_tag].") log_ares_security("Nerve Gas Release", "[last_login] released Nerve Gas from Vent '[sec_vent.vent_tag]'.") sec_vent.create_gas(VENT_GAS_CN20_XENO, 6, 5 SECONDS) - log_admin("[key_name(operator)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + log_admin("[key_name(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.") + + if("security_lockdown") + if(!COOLDOWN_FINISHED(datacore, aicore_lockdown)) + to_chat(user, SPAN_BOLDWARNING("AI Core Lockdown procedures are on cooldown! They will be ready in [COOLDOWN_SECONDSLEFT(datacore, aicore_lockdown)] seconds!")) + return FALSE + aicore_lockdown(user) + return TRUE if(playsound) var/sound = pick('sound/machines/pda_button1.ogg', 'sound/machines/pda_button2.ogg') diff --git a/code/game/machinery/aicore_lockdown.dm b/code/game/machinery/aicore_lockdown.dm new file mode 100644 index 000000000000..aaedf0fbfd63 --- /dev/null +++ b/code/game/machinery/aicore_lockdown.dm @@ -0,0 +1,118 @@ +/obj/structure/machinery/aicore_lockdown + name = "AI Core Lockdown" + icon_state = "big_red_button_tablev" + unslashable = TRUE + unacidable = TRUE + +/obj/structure/machinery/aicore_lockdown/ex_act(severity) + return FALSE + +/obj/structure/machinery/aicore_lockdown/attack_remote(mob/user as mob) + return FALSE + +/obj/structure/machinery/aicore_lockdown/attack_alien(mob/user as mob) + return FALSE + +/obj/structure/machinery/aicore_lockdown/attackby(obj/item/attacking_item, mob/user) + return attack_hand(user) + +/obj/structure/machinery/aicore_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(GLOB.ares_datacore, aicore_lockdown)) + to_chat(user, SPAN_BOLDWARNING("AI Core Lockdown procedures are on cooldown! They will be ready in [COOLDOWN_SECONDSLEFT(GLOB.ares_datacore, aicore_lockdown)] seconds!")) + return FALSE + + add_fingerprint(user) + aicore_lockdown(user) + +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown + name = "ARES Emergency Lockdown Shutter" + density = FALSE + open_layer = 1.9 + plane = FLOOR_PLANE + +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore + icon_state = "aidoor1" + base_icon_state = "aidoor" + +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore/white + icon_state = "w_aidoor1" + base_icon_state = "w_aidoor" + +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/white + icon_state = "w_almayer_pdoor1" + base_icon_state = "w_almayer_pdoor" + +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/Initialize() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_AICORE_LOCKDOWN, PROC_REF(close)) + RegisterSignal(SSdcs, COMSIG_GLOB_AICORE_LIFT, PROC_REF(open)) + + +/client/proc/admin_aicore_alert() + set name = "AI Core Lockdown" + set category = "Admin.Ship" + + if(!admin_holder ||!check_rights(R_EVENT)) + return FALSE + + var/prompt = "Are you sure you want to trigger an AI Core lockdown? This will raise to red alert, and lockdown the AI Core." + + if(GLOB.ares_datacore.ai_lockdown_active == TRUE) + prompt = "Are you sure you want to lift the AI Core lockdown? This will lower to blue alert." + + var/choice = tgui_alert(src, prompt, "Choose.", list("Yes", "No"), 20 SECONDS) + if(choice != "Yes") + return FALSE + + choice = tgui_alert(src, "Do you want to use a custom announcement?", "Choose.", list("Yes", "No"), 20 SECONDS) + if(choice == "Yes") + var/message = tgui_input_text(src, "Please enter announcement text.", "what?") + aicore_lockdown(usr, message, admin = TRUE) + else + aicore_lockdown(usr, admin = TRUE) + return TRUE + +/proc/aicore_lockdown(mob/user, message, admin = FALSE) + if(IsAdminAdvancedProcCall()) + return PROC_BLOCKED + + var/log = "[key_name(user)] triggered AI core lockdown!" + var/ares_log = "[user.name] triggered triggered AI Core Emergency Lockdown." + if(message) + log = "[key_name(user)] triggered AI core emergency lockdown! (Using a custom announcement)." + if(admin) + log += " (Admin Triggered)." + ares_log = "[MAIN_AI_SYSTEM] triggered AI Core Emergency Lockdown." + + if(GLOB.ares_datacore.ai_lockdown_active) + GLOB.ares_datacore.ai_lockdown_active = FALSE + if(!message) + message = "ATTENTION! \n\nAI CORE EMERGENCY LOCKDOWN LIFTED." + log = "[key_name(user)] lifted AI core lockdown!" + ares_log = "[user.name] lifted AI Core Emergency Lockdown." + if(admin) + log += " (Admin Triggered)." + ares_log = "[MAIN_AI_SYSTEM] lifted AI Core Emergency Lockdown." + + if(GLOB.security_level > SEC_LEVEL_GREEN) + set_security_level(SEC_LEVEL_BLUE, TRUE, FALSE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_AICORE_LIFT) + else + GLOB.ares_datacore.ai_lockdown_active = TRUE + if(!message) + message = "ATTENTION! \n\nCORE SECURITY ALERT. \n\nAI CORE UNDER LOCKDOWN." + if(GLOB.security_level < SEC_LEVEL_RED) + set_security_level(SEC_LEVEL_RED, TRUE, FALSE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_AICORE_LOCKDOWN) + + COOLDOWN_START(GLOB.ares_datacore, aicore_lockdown, 2 MINUTES) + shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') + message_admins(log) + log_ares_security("AI Core Lockdown", ares_log) diff --git a/code/game/machinery/biohazard_lockdown.dm b/code/game/machinery/biohazard_lockdown.dm index 2e3cbf6de234..fdf7c026185d 100644 --- a/code/game/machinery/biohazard_lockdown.dm +++ b/code/game/machinery/biohazard_lockdown.dm @@ -1,6 +1,6 @@ #define LOCKDOWN_READY 0 #define LOCKDOWN_ACTIVE 1 -GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) +GLOBAL_VAR_INIT(med_lockdown_state, LOCKDOWN_READY) /obj/structure/machinery/biohazard_lockdown name = "Emergency Containment Breach" @@ -51,7 +51,7 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) base_icon_state = "w_almayer_pdoor" /client/proc/admin_biohazard_alert() - set name = "Containment Breach Alert" + set name = "Research Containment Lockdown" set category = "Admin.Ship" if(!admin_holder ||!check_rights(R_EVENT)) @@ -63,8 +63,8 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) 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) + var/message = tgui_input_text(src, "Please enter announcement text.", "what?") + biohazard_lockdown(usr, message, admin = TRUE) else biohazard_lockdown(usr, admin = TRUE) return TRUE @@ -83,13 +83,14 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) log += " (Admin Triggered)." ares_log = "[MAIN_AI_SYSTEM] triggered Medical Research Biohazard Containment Lockdown." - switch(GLOB.lockdown_state) + switch(GLOB.med_lockdown_state) if(LOCKDOWN_READY) - GLOB.lockdown_state = LOCKDOWN_ACTIVE - set_security_level(SEC_LEVEL_RED, TRUE, FALSE) + GLOB.med_lockdown_state = LOCKDOWN_ACTIVE + if(GLOB.security_level < SEC_LEVEL_RED) + set_security_level(SEC_LEVEL_RED, TRUE, FALSE) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_RESEARCH_LOCKDOWN) if(LOCKDOWN_ACTIVE) - GLOB.lockdown_state = LOCKDOWN_READY + GLOB.med_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." @@ -97,7 +98,8 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) log += " (Admin Triggered)." ares_log = "[MAIN_AI_SYSTEM] lifted Medical Research Biohazard Containment Lockdown." - set_security_level(SEC_LEVEL_BLUE, TRUE, FALSE) + if(GLOB.security_level > SEC_LEVEL_GREEN) + 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') diff --git a/code/game/turfs/floor_types.dm b/code/game/turfs/floor_types.dm index 8a8698d0c047..0a1842134480 100644 --- a/code/game/turfs/floor_types.dm +++ b/code/game/turfs/floor_types.dm @@ -325,12 +325,21 @@ /turf/open/floor/almayer/aicore/glowing icon_state = "ai_floor2" light_color = "#d69c46" - light_range = 2 + light_range = 3 /turf/open/floor/almayer/aicore/glowing/Initialize(mapload, ...) . = ..() set_light_on(TRUE) + RegisterSignal(SSdcs, COMSIG_GLOB_AICORE_LOCKDOWN, PROC_REF(start_emergency_light_on)) + RegisterSignal(SSdcs, COMSIG_GLOB_AICORE_LIFT, PROC_REF(start_emergency_light_off)) + +/turf/open/floor/almayer/aicore/glowing/proc/start_emergency_light_on() + set_light(l_color = "#c70f0f") + +/turf/open/floor/almayer/aicore/glowing/proc/start_emergency_light_off() + set_light(l_color = "#d69c46") + /turf/open/floor/almayer/aicore/no_build allow_construction = FALSE hull_floor = TRUE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 626758fc2a5a..da95fc090da8 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -138,6 +138,7 @@ GLOBAL_LIST_INIT(admin_verbs_minor_event, list( /client/proc/adminpanelweapons, /client/proc/admin_general_quarters, /client/proc/admin_biohazard_alert, + /client/proc/admin_aicore_alert, /client/proc/toggle_hardcore_perma, /client/proc/toggle_bypass_joe_restriction, /client/proc/toggle_joe_respawns, diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm index 6e7de1101ae7..ddd4a9dc5d58 100644 --- a/code/modules/paperwork/desk_bell.dm +++ b/code/modules/paperwork/desk_bell.dm @@ -93,3 +93,12 @@ flick("desk_bell_activate", src) times_rang++ return TRUE + +/obj/item/desk_bell/ares + name = "AI core reception bell" + +/obj/item/desk_bell/ares/ring_bell(mob/living/user) + if(broken_ringer) + return FALSE + ares_apollo_talk("Attendence requested at AI Core Reception.") + return ..() diff --git a/colonialmarines.dme b/colonialmarines.dme index 9392e74febea..cab62dffd2fc 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -822,6 +822,7 @@ #include "code\game\jobs\job\special\provost.dm" #include "code\game\jobs\job\special\uaac.dm" #include "code\game\jobs\job\special\uscm.dm" +#include "code\game\machinery\aicore_lockdown.dm" #include "code\game\machinery\air_alarm.dm" #include "code\game\machinery\air_sensor.dm" #include "code\game\machinery\autolathe.dm" diff --git a/icons/obj/structures/doors/blastdoors_shutters.dmi b/icons/obj/structures/doors/blastdoors_shutters.dmi index 8c63d0580922..1fe1df44b23a 100644 Binary files a/icons/obj/structures/doors/blastdoors_shutters.dmi and b/icons/obj/structures/doors/blastdoors_shutters.dmi differ diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 6bc6bfeb4a22..1c2e3e5b68b0 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -14160,6 +14160,15 @@ icon_state = "red" }, /area/almayer/shipboard/weapon_room) +"bFg" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + layer = 3.3 + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "bFj" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -14601,15 +14610,7 @@ name = "\improper ARES Mainframe Shutters"; plane = -7 }, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -20167,15 +20168,15 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/disposaloutlet{ +/obj/structure/machinery/disposal/delivery{ density = 0; - desc = "An outlet for the pneumatic delivery system."; - icon_state = "delivery_outlet"; - name = "take-ins"; - pixel_x = -1; + desc = "A pneumatic delivery unit."; + icon_state = "delivery_engi"; + name = "Returns"; pixel_y = 28; - range = 0 + pixel_x = 25 }, +/obj/structure/surface/rack, /turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "cJK" = ( @@ -22464,7 +22465,9 @@ autoname = 0; c_tag = "AI - Secondary Processors" }, -/turf/open/floor/almayer/aicore/glowing/no_build, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, /area/almayer/command/airoom) "dzG" = ( /obj/structure/reagent_dispensers/peppertank{ @@ -25241,6 +25244,19 @@ icon_state = "plate" }, /area/almayer/shipboard/starboard_point_defense) +"etM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "etN" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/plating/plating_catwalk, @@ -26358,7 +26374,7 @@ /obj/structure/machinery/door_control{ id = "ARES StairsUpper"; name = "ARES Core Access"; - pixel_x = -10; + pixel_x = -5; pixel_y = -24; req_one_access_txt = "91;92" }, @@ -26366,20 +26382,14 @@ id = "ARES StairsLock"; name = "ARES Exterior Lockdown"; pixel_y = -24; - req_one_access_txt = "91;92" + req_one_access_txt = "91;92"; + pixel_x = 6 }, /obj/structure/surface/table/reinforced/almayer_B{ indestructible = 1; unacidable = 1; unslashable = 1 }, -/obj/structure/machinery/door_control{ - id = "ARES Emergency"; - name = "ARES Emergency Lockdown"; - pixel_x = 10; - pixel_y = -24; - req_one_access_txt = "91;92" - }, /obj/structure/machinery/computer/cameras/almayer{ dir = 4; pixel_y = 12 @@ -26769,18 +26779,19 @@ /turf/open/floor/almayer, /area/almayer/living/offices) "eXy" = ( -/obj/effect/step_trigger/teleporter_vector{ +/obj/effect/projector{ name = "Almayer_AresDown"; vector_x = 96; vector_y = -65 }, -/obj/structure/machinery/light{ - dir = 1 - }, /obj/structure/stairs{ - dir = 1 + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/aicore/glowing/no_build{ + icon_state = "ai_floor3"; + light_range = 3 }, -/turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "eXD" = ( /obj/structure/prop/invuln/lattice_prop{ @@ -28784,7 +28795,9 @@ /obj/effect/decal/warning_stripes{ icon_state = "SW-out" }, -/turf/open/floor/almayer/aicore/glowing/no_build, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, /area/almayer/command/airoom) "fKh" = ( /obj/structure/window/framed/almayer, @@ -28951,15 +28964,6 @@ plane = -7 }, /obj/effect/step_trigger/ares_alert/core, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, /obj/structure/sign/safety/laser{ pixel_x = 32; pixel_y = -8 @@ -28968,6 +28972,7 @@ pixel_x = 32; pixel_y = 6 }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -31207,6 +31212,9 @@ req_one_access_txt = "91;92"; dir = 1 }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore{ + plane = -6 + }, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -35739,7 +35747,9 @@ /obj/effect/decal/warning_stripes{ icon_state = "SE-out" }, -/turf/open/floor/almayer/aicore/glowing/no_build, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, /area/almayer/command/airoom) "igs" = ( /obj/structure/surface/table/almayer, @@ -36051,17 +36061,12 @@ name = "\improper ARES Core Shutters"; plane = -7 }, -/obj/structure/machinery/door/poddoor/almayer/blended/open{ - id = "ARES Emergency"; - name = "ARES Emergency Lockdown"; - open_layer = 1.9; - plane = -7 - }, /obj/structure/disposalpipe/up/almayer{ id = "ares_vault_in"; name = "aicore"; dir = 2 }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -36683,9 +36688,9 @@ }, /area/almayer/squads/delta) "izf" = ( -/obj/structure/disposalpipe/down/almayer{ +/obj/structure/disposalpipe/up/almayer{ dir = 4; - id = "ares_vault_in"; + id = "ares_vault_out"; name = "aicore" }, /turf/closed/wall/almayer/aicore/hull, @@ -38339,15 +38344,14 @@ pixel_x = -2; pixel_y = 26 }, -/obj/structure/machinery/door_control/brbutton{ - id = "ARES Emergency"; - name = "ARES Emergency Lockdown Override"; - pixel_x = 8; - pixel_y = 26 - }, /obj/structure/machinery/computer/cameras/almayer/ares{ dir = 4 }, +/obj/structure/machinery/aicore_lockdown{ + icon_state = "big_red_button_wallv"; + pixel_x = 8; + pixel_y = 26 + }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) "jbX" = ( @@ -39300,15 +39304,7 @@ plane = -7 }, /obj/effect/step_trigger/ares_alert/core, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -48270,6 +48266,10 @@ /area/almayer/living/port_emb) "mAe" = ( /obj/structure/window/framed/almayer/aicore/hull/black/hijack_bustable, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown{ + plane = -6; + dir = 4 + }, /turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "mAp" = ( @@ -48607,15 +48607,7 @@ name = "\improper ARES Mainframe Shutters"; plane = -7 }, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -49291,15 +49283,6 @@ plane = -7 }, /obj/effect/step_trigger/ares_alert/core, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, /obj/structure/sign/safety/terminal{ pixel_x = -18; pixel_y = -8 @@ -49308,6 +49291,7 @@ pixel_x = -18; pixel_y = 6 }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -50866,9 +50850,9 @@ /turf/open/floor/plating, /area/almayer/engineering/starboard_atmos) "npq" = ( -/obj/structure/disposalpipe/up/almayer{ +/obj/structure/disposalpipe/down/almayer{ dir = 8; - id = "ares_vault_out"; + id = "ares_vault_in"; name = "aicore" }, /turf/closed/wall/almayer/aicore/hull, @@ -51959,16 +51943,18 @@ }, /area/almayer/command/lifeboat) "nKO" = ( -/obj/structure/machinery/disposal/delivery{ - density = 0; - desc = "A pneumatic delivery unit."; - icon_state = "delivery_engi"; - name = "Returns"; - pixel_y = 28 - }, /obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/structure/disposaloutlet{ + density = 0; + desc = "An outlet for the pneumatic delivery system."; + icon_state = "delivery_outlet"; + name = "take-ins"; + pixel_x = 7; + pixel_y = 28; + range = 0 + }, /turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "nKP" = ( @@ -52089,6 +52075,19 @@ icon_state = "red" }, /area/almayer/hallways/upper/port) +"nNA" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "nNH" = ( /turf/open/floor/almayer{ dir = 1; @@ -52718,6 +52717,19 @@ }, /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/cells) +"nYg" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "nYi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer{ @@ -55897,6 +55909,20 @@ icon_state = "silver" }, /area/almayer/hallways/lower/repair_bay) +"oYZ" = ( +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresDown"; + vector_x = 96; + vector_y = -65 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/aicore/glowing/no_build{ + icon_state = "ai_floor3"; + light_range = 3 + }, +/area/almayer/command/airoom) "oZp" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/light, @@ -64093,6 +64119,15 @@ icon_state = "silver" }, /area/almayer/hallways/lower/repair_bay) +"rOz" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "rOC" = ( /obj/structure/machinery/light{ dir = 1 @@ -69482,12 +69517,7 @@ name = "\improper ARES Core Shutters"; plane = -7 }, -/obj/structure/machinery/door/poddoor/almayer/blended/open{ - id = "ARES Emergency"; - name = "ARES Emergency Lockdown"; - open_layer = 1.9; - plane = -7 - }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -71028,6 +71058,14 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) +"ujn" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, +/area/almayer/command/airoom) "ujz" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -72977,9 +73015,16 @@ unslashable = 1 }, /obj/item/paper_bin/uscm{ - pixel_y = 6 + pixel_y = 6; + pixel_x = -12 + }, +/obj/item/tool/pen{ + pixel_x = -14 + }, +/obj/structure/machinery/aicore_lockdown{ + pixel_y = 4; + pixel_x = 3 }, -/obj/item/tool/pen, /turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "uVc" = ( @@ -74300,15 +74345,15 @@ unacidable = 1; unslashable = 1 }, -/obj/item/desk_bell{ - pixel_y = 14; - pixel_x = -5; - anchored = 1 - }, /obj/structure/machinery/computer/working_joe{ layer = 3.3; dir = 8 }, +/obj/item/desk_bell/ares{ + pixel_y = 14; + pixel_x = -5; + anchored = 1 + }, /turf/open/floor/almayer/aicore/no_build, /area/almayer/command/airoom) "vpI" = ( @@ -75229,7 +75274,9 @@ c_tag = "AI - Primary Processors"; autoname = 0 }, -/turf/open/floor/almayer/aicore/glowing/no_build, +/turf/open/floor/almayer/aicore/no_build{ + icon_state = "ai_floor2" + }, /area/almayer/command/airoom) "vCO" = ( /obj/effect/landmark/start/bridge, @@ -77454,15 +77501,7 @@ alert_message = "Caution: Movement detected in ARES Core."; cooldown_duration = 1200 }, -/obj/structure/machinery/door/poddoor/almayer/blended/aicore/open{ - closed_layer = 3.2; - id = "ARES Emergency"; - layer = 3.2; - name = "ARES Emergency Lockdown"; - needs_power = 0; - open_layer = 1.9; - plane = -7 - }, +/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore, /turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, @@ -78331,12 +78370,7 @@ /area/almayer/maint/hull/lower/l_m_s) "wyQ" = ( /obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door_control{ - id = "ARES Emergency"; - indestructible = 1; - name = "ARES Emergency Lockdown"; - req_one_access_txt = "91;92" - }, +/obj/structure/machinery/aicore_lockdown, /turf/open/floor/almayer/no_build{ icon_state = "plating" }, @@ -121669,10 +121703,10 @@ sgH qdJ xIj mOi -eXy vRA +oYZ ezq -ezq +eXy tFe xQV pax @@ -140207,7 +140241,7 @@ qQS bIp fKe dDp -dDp +bFg frM lcg daz @@ -140409,9 +140443,9 @@ dIn rby bIp euN +ujn sEK -sEK -mlb +etM lcg daz lmz @@ -140611,10 +140645,10 @@ lnS uVv flf ebN -cxc +rOz kBy kBy -gfu +nNA fPB daz lmz @@ -142033,9 +142067,9 @@ yaQ vLz mFN kSy +bFg dDp -dDp -frM +nYg lcg daz lmz @@ -142237,7 +142271,7 @@ qQS mFN igr sEK -sEK +ujn mlb lcg daz diff --git a/tgui/packages/tgui/interfaces/AresInterface.jsx b/tgui/packages/tgui/interfaces/AresInterface.jsx index bcd200d45d74..115a5fd1e74f 100644 --- a/tgui/packages/tgui/interfaces/AresInterface.jsx +++ b/tgui/packages/tgui/interfaces/AresInterface.jsx @@ -386,6 +386,20 @@ const MainMenu = (props) => { onClick={() => act('page_core_sec')} /> + + act('security_lockdown')} + /> + )} diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.jsx b/tgui/packages/tgui/interfaces/WorkingJoe.jsx index 64aa5167d265..cc87399fef5f 100644 --- a/tgui/packages/tgui/interfaces/WorkingJoe.jsx +++ b/tgui/packages/tgui/interfaces/WorkingJoe.jsx @@ -259,6 +259,20 @@ const MainMenu = (props) => { onClick={() => act('page_core_gas')} /> + + act('security_lockdown')} + /> + )}