diff --git a/code/__DEFINES/ARES.dm b/code/__DEFINES/ARES.dm
index db50ac05f2b9..b7a292a4900d 100644
--- a/code/__DEFINES/ARES.dm
+++ b/code/__DEFINES/ARES.dm
@@ -28,6 +28,7 @@
#define ARES_RECORD_MAINTENANCE "Maintenance Ticket"
#define ARES_RECORD_ACCESS "Access Ticket"
#define ARES_RECORD_FLIGHT "Flight Record"
+#define ARES_RECORD_TECH "Tech Control Record"
/// Not by ARES logged through marine_announcement()
#define ARES_LOG_NONE 0
@@ -77,6 +78,7 @@
/// Cooldowns
#define COOLDOWN_ARES_SENSOR 60 SECONDS
#define COOLDOWN_ARES_ACCESS_CONTROL 20 SECONDS
+#define COOLDOWN_ARES_VENT 60 SECONDS
/// Time until someone can respawn as Working Joe
#define JOE_JOIN_DEAD_TIME (15 MINUTES)
diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index 1b2907cf57ce..5ab7dcdb25ec 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -122,6 +122,7 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST)
#define JOB_GENERAL "USCM General"
#define JOB_ACMC "Assistant Commandant of the Marine Corps"
#define JOB_CMC "Commandant of the Marine Corps"
+#define JOB_AI_TECH "AI Service Technician"
// Used to add a timelock to a job. Will be passed onto derivatives
#define AddTimelock(Path, timelockList) \
diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 28471f3a5ea1..335a3856f57b 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -107,6 +107,7 @@
#define ROLE_WHITELISTED 16
#define ROLE_NO_ACCOUNT 32
#define ROLE_CUSTOM_SPAWN 64
+#define ROLE_HIDDEN 128
//=================================================
//Role defines, specifically lists of roles for job bans, crew manifests and the like.
@@ -118,7 +119,7 @@ GLOBAL_LIST_INIT(ROLES_CIC, list(JOB_CO, JOB_XO, JOB_SO, JOB_WO_CO, JOB_WO_XO))
GLOBAL_LIST_INIT(ROLES_AUXIL_SUPPORT, list(JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_CAS_PILOT, JOB_DROPSHIP_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT))
GLOBAL_LIST_INIT(ROLES_MISC, list(JOB_SYNTH, JOB_WORKING_JOE, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_MESS_SERGEANT, JOB_WO_CORPORATE_LIAISON, JOB_WO_SYNTH))
GLOBAL_LIST_INIT(ROLES_POLICE, list(JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE))
-GLOBAL_LIST_INIT(ROLES_ENGINEERING, list(JOB_CHIEF_ENGINEER, JOB_ORDNANCE_TECH, JOB_MAINT_TECH, JOB_WO_CHIEF_ENGINEER, JOB_WO_ORDNANCE_TECH))
+GLOBAL_LIST_INIT(ROLES_ENGINEERING, list(JOB_CHIEF_ENGINEER, JOB_ORDNANCE_TECH, JOB_MAINT_TECH, JOB_WO_CHIEF_ENGINEER, JOB_WO_ORDNANCE_TECH, JOB_AI_TECH))
GLOBAL_LIST_INIT(ROLES_REQUISITION, list(JOB_CHIEF_REQUISITION, JOB_CARGO_TECH, JOB_WO_CHIEF_REQUISITION, JOB_WO_REQUISITION))
GLOBAL_LIST_INIT(ROLES_MEDICAL, list(JOB_CMO, JOB_RESEARCHER, JOB_DOCTOR, JOB_NURSE, JOB_WO_CMO, JOB_WO_RESEARCHER, JOB_WO_DOCTOR))
GLOBAL_LIST_INIT(ROLES_MARINES, list(JOB_SQUAD_LEADER, JOB_SQUAD_TEAM_LEADER, JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN, JOB_SQUAD_MEDIC, JOB_SQUAD_ENGI, JOB_SQUAD_MARINE))
diff --git a/code/controllers/subsystem/objectives_controller.dm b/code/controllers/subsystem/objectives_controller.dm
index a858dff07475..38accda46004 100644
--- a/code/controllers/subsystem/objectives_controller.dm
+++ b/code/controllers/subsystem/objectives_controller.dm
@@ -96,6 +96,7 @@ SUBSYSTEM_DEF(objectives)
ai_silent_announcement(message, ":v", TRUE)
ai_silent_announcement(message, ":t", TRUE)
+ log_ares_tech(MAIN_AI_SYSTEM, FALSE, "TECH REPORT", "[round(tree.points, 0.1)] points available.", 0)
tree.total_points_last_sitrep = tree.total_points
next_sitrep = world.time + SITREP_INTERVAL
diff --git a/code/datums/factions/uscm.dm b/code/datums/factions/uscm.dm
index a19faba32d81..5a6a51be49f7 100644
--- a/code/datums/factions/uscm.dm
+++ b/code/datums/factions/uscm.dm
@@ -143,6 +143,8 @@
if(JOB_PROVOST_MARSHAL, JOB_PROVOST_CMARSHAL, JOB_PROVOST_SMARSHAL)
marine_rk = "pvm"
border_rk = "command"
+ if(JOB_AI_TECH)
+ marine_rk = "aist"
// TIS
if(JOB_TIS_IO)
marine_rk = "tisio"
diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm
index 2ebba6a774e8..7cf15682e81d 100644
--- a/code/defines/procs/announcement.dm
+++ b/code/defines/procs/announcement.dm
@@ -47,9 +47,9 @@
switch(logging)
if(ARES_LOG_MAIN)
- log_ares_announcement(title, message)
+ log_ares_announcement(title, message, signature)
if(ARES_LOG_SECURITY)
- log_ares_security(title, message)
+ log_ares_security(title, message, signature)
else if(faction_to_display == "Everyone (-Yautja)")
for(var/mob/M in targets)
diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm
index b75baccd7353..6ac34e1ea7c3 100644
--- a/code/game/area/almayer.dm
+++ b/code/game/area/almayer.dm
@@ -79,6 +79,15 @@
is_resin_allowed = FALSE
resin_construction_allowed = FALSE
+/area/almayer/command/aist_office
+ name = "\improper AIST Office"
+ icon_state = "airoom"
+ fake_zlevel = 1 // upperdeck
+ flags_area = AREA_NOTUNNEL|AREA_UNWEEDABLE
+ can_build_special = FALSE
+ is_resin_allowed = FALSE
+ resin_construction_allowed = FALSE
+
/area/almayer/command/securestorage
name = "\improper Upper Deck Secure Storage"
icon_state = "corporatespace"
diff --git a/code/game/jobs/job/special/uscm.dm b/code/game/jobs/job/special/uscm.dm
index 2308c5af2961..b8f9e435d7bb 100644
--- a/code/game/jobs/job/special/uscm.dm
+++ b/code/game/jobs/job/special/uscm.dm
@@ -12,3 +12,26 @@
title = JOB_RIOT
/datum/job/special/uscm/riot/chief
title = JOB_RIOT_CHIEF
+
+/datum/job/special/uscm/ai_tech
+ title = JOB_AI_TECH
+ selection_class = "job_ce"
+ supervisors = "the acting commanding officer"
+ total_positions = 1
+ spawn_positions = 1
+ flags_startup_parameters = ROLE_WHITELISTED|ROLE_HIDDEN
+ gear_preset = /datum/equipment_preset/uscm_event/ai_tech
+
+/datum/job/special/uscm/ai_tech/check_whitelist_status(mob/user)
+ if(check_rights(R_PERMISSIONS, show_msg = FALSE))
+ return TRUE
+ return FALSE
+
+/datum/job/special/uscm/ai_tech/generate_entry_message()
+ entry_message_body = "You are a USCM AI Service Technician temporarily assigned to the [MAIN_SHIP_NAME]. Your goal is to ensure the onboard AI, [MAIN_AI_SYSTEM], is operating effectively. Your job involves heavy roleplay and requires you to behave like a high-ranking officer and to stay in character at all times. You are required to adhere to and obey Marine Law. Failure to do so may result in punitive action against you. Godspeed."
+ return ..()
+
+/obj/effect/landmark/start/aist
+ name = JOB_AI_TECH
+ icon_state = "aist_spawn"
+ job = /datum/job/special/uscm/ai_tech
diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm
index dd99240b2550..4900e6ed64d5 100644
--- a/code/game/machinery/ARES/ARES_interface.dm
+++ b/code/game/machinery/ARES/ARES_interface.dm
@@ -183,6 +183,17 @@
logged_orders += list(current_order)
data["records_requisition"] = logged_orders
+ var/list/logged_techs = list()
+ for(var/datum/ares_record/tech/tech_unlock as anything in datacore.records_tech)
+ var/list/current_tech = list()
+ current_tech["time"] = tech_unlock.time
+ current_tech["details"] = tech_unlock.details
+ current_tech["user"] = tech_unlock.user
+ current_tech["tier_changer"] = tech_unlock.is_tier
+ current_tech["ref"] = "\ref[tech_unlock]"
+ logged_techs += list(current_tech)
+ data["records_tech"] = logged_techs
+
var/list/logged_convos = list()
var/list/active_convo = list()
var/active_ref
@@ -203,6 +214,23 @@
data["active_ref"] = active_ref
data["conversations"] = logged_convos
+ var/list/security_vents = list()
+ for(var/obj/structure/pipes/vents/pump/no_boom/gas/vent in link.linked_vents)
+ if(!vent.vent_tag)
+ vent.vent_tag = "Security Vent #[link.tag_num]"
+ link.tag_num++
+
+ var/list/current_vent = list()
+ var/is_available = TRUE
+ if(!COOLDOWN_FINISHED(vent, vent_trigger_cooldown))
+ is_available = FALSE
+ current_vent["vent_tag"] = vent.vent_tag
+ current_vent["ref"] = "\ref[vent]"
+ current_vent["available"] = is_available
+ security_vents += list(current_vent)
+
+ data["security_vents"] = security_vents
+
return data
/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state)
@@ -216,19 +244,19 @@
. = ..()
if(.)
return
-
- playsound(src, "keyboard_alt", 15, 1)
- var/mob/living/carbon/human/operator = ui.user
+ var/mob/user = ui.user
+ var/playsound = TRUE
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/mob/living/carbon/human/operator = user
var/obj/item/card/id/idcard = operator.get_active_hand()
if(istype(idcard))
authentication = get_ares_access(idcard)
@@ -239,7 +267,7 @@
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)
@@ -247,14 +275,14 @@
current_menu = "main"
if("sudo")
- var/new_user = tgui_input_text(operator, "Enter Sudo Username", "Sudo User", encode = FALSE)
+ var/new_user = tgui_input_text(user, "Enter Sudo Username", "Sudo User", encode = FALSE)
if(new_user)
if(new_user == sudo_holder)
last_login = sudo_holder
sudo_holder = null
return FALSE
if(new_user == last_login)
- to_chat(operator, SPAN_WARNING("Already remote logged in as this user."))
+ to_chat(user, SPAN_WARNING("Already remote logged in as this user."))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
sudo_holder = last_login
@@ -317,6 +345,12 @@
if("page_deleted_1to1")
last_menu = current_menu
current_menu = "deleted_talks"
+ if("page_tech")
+ last_menu = current_menu
+ current_menu = "tech_log"
+ if("page_core_sec")
+ last_menu = current_menu
+ current_menu = "core_security"
// -- Delete Button -- //
if("delete_record")
@@ -345,6 +379,10 @@
new_title = "[record.title] at [record.time]"
new_details = "[record.details] Launched by [record.user]."
datacore.records_bombardment -= record
+ if(ARES_RECORD_TECH)
+ new_title = "[record.title] at [record.time]"
+ new_details = record.details
+ datacore.records_tech -= record
new_delete.details = new_details
new_delete.user = last_login
@@ -370,9 +408,9 @@
datacore.records_talking -= conversation
if("message_ares")
- var/message = tgui_input_text(operator, "What do you wish to say to ARES?", "ARES Message", encode = FALSE)
+ var/message = tgui_input_text(user, "What do you wish to say to ARES?", "ARES Message", encode = FALSE)
if(message)
- message_ares(message, operator, params["active_convo"])
+ message_ares(message, user, params["active_convo"])
if("read_record")
var/datum/ares_record/deleted_talk/conversation = locate(params["record"])
@@ -385,36 +423,36 @@
// -- Emergency Buttons -- //
if("general_quarters")
if(!COOLDOWN_FINISHED(datacore, ares_quarters_cooldown))
- to_chat(operator, SPAN_WARNING("It has not been long enough since the last General Quarters call!"))
+ to_chat(user, SPAN_WARNING("It has not been long enough since the last General Quarters call!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(GLOB.security_level < SEC_LEVEL_RED)
set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE)
shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg')
- log_game("[key_name(operator)] has called for general quarters via ARES.")
- message_admins("[key_name_admin(operator)] has called for general quarters via ARES.")
+ log_game("[key_name(user)] has called for general quarters via ARES.")
+ message_admins("[key_name_admin(user)] has called for general quarters via ARES.")
log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.")
COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES)
. = TRUE
if("evacuation_start")
if(GLOB.security_level < SEC_LEVEL_RED)
- to_chat(operator, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures."))
+ to_chat(user, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures."))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(SShijack.evac_admin_denied)
- to_chat(operator, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods."))
+ to_chat(user, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods."))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(!SShijack.initiate_evacuation())
- to_chat(operator, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!"))
+ to_chat(user, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
- log_game("[key_name(operator)] has called for an emergency evacuation via ARES.")
- message_admins("[key_name_admin(operator)] has called for an emergency evacuation via ARES.")
+ log_game("[key_name(user)] has called for an emergency evacuation via ARES.")
+ message_admins("[key_name_admin(user)] has called for an emergency evacuation via ARES.")
log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.")
. = TRUE
@@ -422,27 +460,27 @@
if(!SSticker.mode)
return FALSE //Not a game mode?
if(world.time < DISTRESS_TIME_LOCK)
- to_chat(operator, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!"))
+ to_chat(user, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(!COOLDOWN_FINISHED(datacore, ares_distress_cooldown))
- to_chat(operator, SPAN_WARNING("The distress launcher is cooling down!"))
+ to_chat(user, SPAN_WARNING("The distress launcher is cooling down!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(GLOB.security_level == SEC_LEVEL_DELTA)
- to_chat(operator, SPAN_WARNING("The ship is already undergoing self destruct procedures!"))
+ to_chat(user, SPAN_WARNING("The ship is already undergoing self destruct procedures!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(GLOB.security_level < SEC_LEVEL_RED)
- to_chat(operator, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!"))
+ to_chat(user, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
for(var/client/admin in GLOB.admins)
if((R_ADMIN|R_MOD) & admin.admin_holder.rights)
playsound_client(admin,'sound/effects/sos-morse-code.ogg',10)
- SSticker.mode.request_ert(operator, TRUE)
- to_chat(operator, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command."))
+ SSticker.mode.request_ert(user, TRUE)
+ to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command."))
COOLDOWN_START(datacore, ares_distress_cooldown, COOLDOWN_COMM_REQUEST)
return TRUE
@@ -450,28 +488,50 @@
if(!SSticker.mode)
return FALSE //Not a game mode?
if(world.time < NUCLEAR_TIME_LOCK)
- to_chat(operator, SPAN_WARNING("It is too soon to request Nuclear Ordnance!"))
+ to_chat(user, SPAN_WARNING("It is too soon to request Nuclear Ordnance!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(!COOLDOWN_FINISHED(datacore, ares_nuclear_cooldown))
- to_chat(operator, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!"))
+ to_chat(user, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
if(GLOB.security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame)
- to_chat(operator, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!"))
+ to_chat(user, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!"))
playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
return FALSE
- var/reason = tgui_input_text(operator, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance")
+ var/reason = tgui_input_text(user, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance")
if(!reason)
return FALSE
for(var/client/admin in GLOB.admins)
if((R_ADMIN|R_MOD) & admin.admin_holder.rights)
playsound_client(admin,'sound/effects/sos-morse-code.ogg',10)
- message_admins("[key_name(operator)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(operator)] (APPROVE) (DENY) [ADMIN_JMP_USER(operator)] [CC_REPLY(operator)]")
- to_chat(operator, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]"))
+ message_admins("[key_name(user)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(user)] (APPROVE) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]")
+ to_chat(user, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]"))
log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]")
if(ares_can_interface())
ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V")
ai_silent_announcement("Reason given: [reason].", ".V")
COOLDOWN_START(datacore, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT)
return TRUE
+
+ if("trigger_vent")
+ 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(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(user, SPAN_WARNING("ERROR: Insufficient gas reserve for this vent."))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ 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(user)] released nerve gas from Vent '[sec_vent.vent_tag]' via ARES.")
+
+ if(playsound)
+ playsound(src, "keyboard_alt", 15, 1)
diff --git a/code/game/machinery/ARES/ARES_interface_admin.dm b/code/game/machinery/ARES/ARES_interface_admin.dm
index e388c0eb453d..e0e49aa31b08 100644
--- a/code/game/machinery/ARES/ARES_interface_admin.dm
+++ b/code/game/machinery/ARES/ARES_interface_admin.dm
@@ -50,8 +50,10 @@
return FALSE
var/list/data = list()
+ data["is_pda"] = FALSE
+
data["admin_login"] = "[admin_interface.logged_in], [user.client.admin_holder?.rank]"
- data["admin_access_log"] = list(admin_interface.access_list)
+ data["admin_access_log"] = admin_interface.access_list
data["current_menu"] = admin_interface.current_menu
data["last_page"] = admin_interface.last_menu
@@ -160,6 +162,17 @@
logged_orders += list(current_order)
data["records_requisition"] = logged_orders
+ var/list/logged_techs = list()
+ for(var/datum/ares_record/tech/tech_unlock as anything in datacore.records_tech)
+ var/list/current_tech = list()
+ current_tech["time"] = tech_unlock.time
+ current_tech["details"] = tech_unlock.details
+ current_tech["user"] = tech_unlock.user
+ current_tech["tier_changer"] = tech_unlock.is_tier
+ current_tech["ref"] = "\ref[tech_unlock]"
+ logged_techs += list(current_tech)
+ data["records_tech"] = logged_techs
+
var/list/logged_convos = list()
var/list/active_convo = list()
var/active_ref
@@ -307,6 +320,12 @@
if("page_deleted_1to1")
admin_interface.last_menu = admin_interface.current_menu
admin_interface.current_menu = "deleted_talks"
+ if("page_tech")
+ admin_interface.last_menu = admin_interface.current_menu
+ admin_interface.current_menu = "tech_log"
+ if("page_core_sec")
+ admin_interface.last_menu = admin_interface.current_menu
+ admin_interface.current_menu = "core_security"
if("page_access_management")
admin_interface.last_menu = admin_interface.current_menu
admin_interface.current_menu = "access_management"
diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm
index c1c936676dc5..caca569cc53b 100644
--- a/code/game/machinery/ARES/ARES_interface_apollo.dm
+++ b/code/game/machinery/ARES/ARES_interface_apollo.dm
@@ -141,6 +141,23 @@
requesting_access += access_ticket.ticket_name
data["access_tickets"] = logged_access
+ var/list/security_vents = list()
+ for(var/obj/structure/pipes/vents/pump/no_boom/gas/vent in link.linked_vents)
+ if(!vent.vent_tag)
+ vent.vent_tag = "Security Vent #[link.tag_num]"
+ link.tag_num++
+
+ var/list/current_vent = list()
+ var/is_available = TRUE
+ if(!COOLDOWN_FINISHED(vent, vent_trigger_cooldown))
+ is_available = FALSE
+ current_vent["vent_tag"] = vent.vent_tag
+ current_vent["ref"] = "\ref[vent]"
+ current_vent["available"] = is_available
+ security_vents += list(current_vent)
+
+ data["security_vents"] = security_vents
+
return data
/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state)
@@ -211,6 +228,9 @@
if("page_maintenance")
last_menu = current_menu
current_menu = "maint_claim"
+ if("page_core_gas")
+ last_menu = current_menu
+ current_menu = "core_security_gas"
if("toggle_sound")
notify_sounds = !notify_sounds
@@ -413,6 +433,25 @@
playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0)
return TRUE
+ if("trigger_vent")
+ 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."))
+ 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."))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ to_chat(operator, 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.")
+
if(playsound)
playsound(src, "keyboard_alt", 15, 1)
diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm
index 90616add6d25..65e167c169a9 100644
--- a/code/game/machinery/ARES/ARES_procs.dm
+++ b/code/game/machinery/ARES/ARES_procs.dm
@@ -29,6 +29,10 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/datum/ares_datacore/datacore
var/list/obj/structure/machinery/computer/working_joe/ticket_computers = list()
+ /// Linked security gas vents.
+ var/list/linked_vents = list()
+ /// The tag number for generated vent labels, if none is manually set.
+ var/tag_num = 1
/// Working Joe stuff
var/list/tickets_maintenance = list()
@@ -80,6 +84,8 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/list/records_security = list()
/// Holds all (/datum/ares_record/flight)s
var/list/records_flight = list()
+ /// Holds all (/datum/ares_record/tech)s
+ var/list/records_tech = list()
/// Is nuke request usable or not?
var/nuke_available = TRUE
@@ -148,11 +154,14 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/datum/ares_datacore/datacore = GLOB.ares_datacore
datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name))
-/proc/log_ares_announcement(title, message)
+/proc/log_ares_announcement(title, message, signature)
if(!ares_can_log())
return FALSE
+ var/final_msg = message
+ if(signature)
+ final_msg = "[signature]: - [final_msg]"
var/datum/ares_datacore/datacore = GLOB.ares_datacore
- datacore.records_announcement.Add(new /datum/ares_record/announcement(title, message))
+ datacore.records_announcement.Add(new /datum/ares_record/announcement(title, final_msg))
/proc/log_ares_requisition(source, details, user_name)
if(!ares_can_log())
@@ -160,11 +169,14 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/datum/ares_datacore/datacore = GLOB.ares_datacore
datacore.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name))
-/proc/log_ares_security(title, details)
+/proc/log_ares_security(title, details, signature)
if(!ares_can_log())
return FALSE
+ var/final_msg = details
+ if(signature)
+ final_msg = "[signature]: - [final_msg]"
var/datum/ares_datacore/datacore = GLOB.ares_datacore
- datacore.records_security.Add(new /datum/ares_record/security(title, details))
+ datacore.records_security.Add(new /datum/ares_record/security(title, final_msg))
/proc/log_ares_antiair(details)
if(!ares_can_log())
@@ -177,6 +189,16 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
return FALSE
var/datum/ares_datacore/datacore = GLOB.ares_datacore
datacore.records_flight.Add(new /datum/ares_record/flight(details, user_name))
+
+/proc/log_ares_tech(user_name, tier_tech = FALSE, title, details, point_cost, current_points)
+ if(!ares_can_log())
+ return FALSE
+ var/new_details = "[title] - [details]"
+ if(point_cost)
+ new_details += " - Used [point_cost] INT of [current_points]."
+ var/datum/ares_datacore/datacore = GLOB.ares_datacore
+ datacore.records_tech.Add(new /datum/ares_record/tech(title, new_details, user_name, tier_tech))
+
// ------ End ARES Logging Procs ------ //
// ------ ARES Interface Procs ------ //
diff --git a/code/game/machinery/ARES/ARES_records.dm b/code/game/machinery/ARES/ARES_records.dm
index e8dc11fa3995..9516c676777b 100644
--- a/code/game/machinery/ARES/ARES_records.dm
+++ b/code/game/machinery/ARES/ARES_records.dm
@@ -49,6 +49,15 @@
src.details = details
src.user = user
+/datum/ares_record/flight
+ record_name = ARES_RECORD_FLIGHT
+
+/datum/ares_record/flight/New(details, user)
+ time = worldtime2text()
+ src.title = "Flight Log"
+ src.details = details
+ src.user = user
+
/datum/ares_record/bombardment
record_name = ARES_RECORD_BOMB
@@ -58,6 +67,18 @@
src.details = details
src.user = user
+/datum/ares_record/tech
+ record_name = ARES_RECORD_TECH
+ /// If this tech unlock changed the tier.
+ var/is_tier = FALSE
+
+/datum/ares_record/tech/New(title, details, user, tier_tech)
+ time = worldtime2text()
+ src.title = title
+ src.details = details
+ src.user = user
+ is_tier = tier_tech
+
/datum/ares_record/deletion
record_name = ARES_RECORD_DELETED
diff --git a/code/game/machinery/ARES/apollo_pda.dm b/code/game/machinery/ARES/apollo_pda.dm
index 69e774cf0da3..dd0d2cba0129 100644
--- a/code/game/machinery/ARES/apollo_pda.dm
+++ b/code/game/machinery/ARES/apollo_pda.dm
@@ -166,6 +166,23 @@
requesting_access += access_ticket.ticket_name
data["access_tickets"] = logged_access
+ var/list/security_vents = list()
+ for(var/obj/structure/pipes/vents/pump/no_boom/gas/vent in link.linked_vents)
+ if(!vent.vent_tag)
+ vent.vent_tag = "Security Vent #[link.tag_num]"
+ link.tag_num++
+
+ var/list/current_vent = list()
+ var/is_available = TRUE
+ if(!COOLDOWN_FINISHED(vent, vent_trigger_cooldown))
+ is_available = FALSE
+ current_vent["vent_tag"] = vent.vent_tag
+ current_vent["ref"] = "\ref[vent]"
+ current_vent["available"] = is_available
+ security_vents += list(current_vent)
+
+ data["security_vents"] = security_vents
+
return data
/obj/item/device/working_joe_pda/ui_status(mob/user, datum/ui_state/state)
@@ -237,6 +254,9 @@
if("page_maintenance")
last_menu = current_menu
current_menu = "maint_claim"
+ if("page_core_gas")
+ last_menu = current_menu
+ current_menu = "core_security_gas"
if("toggle_sound")
notify_sounds = !notify_sounds
@@ -439,6 +459,25 @@
playsound_client(id_owner?.client, 'sound/machines/pda_ping.ogg', src, 25, 0)
return TRUE
+ if("trigger_vent")
+ 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."))
+ 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."))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ to_chat(operator, 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.")
+
if(playsound)
var/sound = pick('sound/machines/pda_button1.ogg', 'sound/machines/pda_button2.ogg')
playsound(src, sound, 15, TRUE)
diff --git a/code/game/machinery/ARES/debug_pda.dm b/code/game/machinery/ARES/debug_pda.dm
new file mode 100644
index 000000000000..729a33e49586
--- /dev/null
+++ b/code/game/machinery/ARES/debug_pda.dm
@@ -0,0 +1,658 @@
+/obj/item/device/ai_tech_pda
+ icon = 'icons/obj/items/synth/ait_pda.dmi'
+ name = "T411 AIDT"
+ desc = "Artifical Intelligence Diagnostic Tablet model T411. Built to withstand a nuclear bomb."
+ icon_state = "karnak_off"
+ unacidable = TRUE
+ indestructible = TRUE
+ req_access = list(ACCESS_ARES_DEBUG)
+
+ /// The ID used to link all devices.
+ var/datum/ares_link/link
+ /// The datacore storing all the information.
+ var/datum/ares_datacore/datacore
+
+ var/current_menu = "login"
+ var/last_menu = "off"
+
+ var/authentication = APOLLO_ACCESS_LOGOUT
+ /// The last person to login.
+ var/logged_in
+ /// A record of who logged in and when.
+ var/list/access_list = list()
+ var/list/deleted_1to1 = list()
+
+/obj/item/device/ai_tech_pda/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override)
+ if(link && !override)
+ return FALSE
+ if(new_link)
+ new_link.ticket_computers += src
+ link = new_link
+ new_link.linked_systems += src
+ if(!datacore)
+ datacore = GLOB.ares_datacore
+ return TRUE
+
+/obj/item/device/ai_tech_pda/Initialize(mapload, ...)
+ link_systems(override = FALSE)
+ . = ..()
+
+/obj/item/device/ai_tech_pda/proc/delink()
+ if(link)
+ link.ticket_computers -= src
+ link.linked_systems -= src
+ link = null
+ datacore = null
+
+/obj/item/device/ai_tech_pda/Destroy()
+ delink()
+ return ..()
+
+/obj/item/device/ai_tech_pda/update_icon()
+ . = ..()
+ if(last_menu == "off")
+ icon_state = "karnak_off"
+ else if(current_menu == "login")
+ icon_state = "karnak_login_anim"
+ else
+ icon_state = "karnak_on_anim"
+
+/obj/item/device/ai_tech_pda/attack_self(mob/living/carbon/human/user)
+ if(..() || !allowed(user))
+ to_chat(user, SPAN_WARNING("Access Denied!"))
+ return FALSE
+
+ if((last_menu == "off") && (current_menu == "login"))
+ last_menu = "main"
+ update_icon()
+
+ tgui_interact(user)
+ return TRUE
+
+/obj/item/device/ai_tech_pda/tgui_interact(mob/user, datum/tgui/ui)
+ if(!link.interface || !datacore)
+ to_chat(user, SPAN_WARNING("ARES DATA LINK FAILED"))
+ return FALSE
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "AresAdmin", name)
+ ui.open()
+
+/obj/item/device/ai_tech_pda/ui_data(mob/user)
+ if(!link.interface)
+ to_chat(user, SPAN_WARNING("ARES ADMIN DATA LINK FAILED"))
+ return FALSE
+ var/list/data = list()
+
+ data["is_pda"] = TRUE
+
+ data["admin_login"] = "[logged_in], AI Service Technician"
+ data["admin_access_log"] = access_list
+
+ data["current_menu"] = current_menu
+ data["last_page"] = last_menu
+
+ data["logged_in"] = link.interface.last_login
+ data["sudo"] = link.interface.sudo_holder ? TRUE : FALSE
+
+ data["access_text"] = "[link.interface.sudo_holder ? "(SUDO)," : ""] access level [link.interface.authentication], [link.interface.ares_auth_to_text(link.interface.authentication)]."
+ data["access_level"] = link.interface.authentication
+
+ data["alert_level"] = GLOB.security_level
+ data["evac_status"] = SShijack.evac_status
+ data["worldtime"] = world.time
+
+ data["access_log"] = datacore.interface_access_list
+ data["apollo_log"] = datacore.apollo_log
+
+ data["deleted_conversation"] = deleted_1to1
+
+ data["distresstime"] = datacore.ares_distress_cooldown
+ data["distresstimelock"] = DISTRESS_TIME_LOCK
+ data["mission_failed"] = SSticker.mode.is_in_endgame
+ data["nuketimelock"] = NUCLEAR_TIME_LOCK
+ data["nuke_available"] = datacore.nuke_available
+
+ var/list/logged_announcements = list()
+ for(var/datum/ares_record/announcement/broadcast as anything in datacore.records_announcement)
+ var/list/current_broadcast = list()
+ current_broadcast["time"] = broadcast.time
+ current_broadcast["title"] = broadcast.title
+ current_broadcast["details"] = broadcast.details
+ current_broadcast["ref"] = "\ref[broadcast]"
+ logged_announcements += list(current_broadcast)
+ data["records_announcement"] = logged_announcements
+
+ var/list/logged_alerts = list()
+ for(var/datum/ares_record/security/security_alert as anything in datacore.records_security)
+ var/list/current_alert = list()
+ current_alert["time"] = security_alert.time
+ current_alert["title"] = security_alert.title
+ current_alert["details"] = security_alert.details
+ current_alert["ref"] = "\ref[security_alert]"
+ logged_alerts += list(current_alert)
+ data["records_security"] = logged_alerts
+
+ var/list/logged_flights = list()
+ for(var/datum/ares_record/flight/flight_log as anything in datacore.records_flight)
+ var/list/current_flight = list()
+ current_flight["time"] = flight_log.time
+ current_flight["title"] = flight_log.title
+ current_flight["details"] = flight_log.details
+ current_flight["user"] = flight_log.user
+ current_flight["ref"] = "\ref[flight_log]"
+ logged_flights += list(current_flight)
+ data["records_flight"] = logged_flights
+
+ var/list/logged_bioscans = list()
+ for(var/datum/ares_record/bioscan/scan as anything in datacore.records_bioscan)
+ var/list/current_scan = list()
+ current_scan["time"] = scan.time
+ current_scan["title"] = scan.title
+ current_scan["details"] = scan.details
+ current_scan["ref"] = "\ref[scan]"
+ logged_bioscans += list(current_scan)
+ data["records_bioscan"] = logged_bioscans
+
+ var/list/logged_bombs = list()
+ for(var/datum/ares_record/bombardment/bomb as anything in datacore.records_bombardment)
+ var/list/current_bomb = list()
+ current_bomb["time"] = bomb.time
+ current_bomb["title"] = bomb.title
+ current_bomb["details"] = bomb.details
+ current_bomb["user"] = bomb.user
+ current_bomb["ref"] = "\ref[bomb]"
+ logged_bombs += list(current_bomb)
+ data["records_bombardment"] = logged_bombs
+
+ var/list/logged_deletes = list()
+ for(var/datum/ares_record/deletion/deleted as anything in datacore.records_deletion)
+ if(!istype(deleted))
+ continue
+ var/list/current_delete = list()
+ current_delete["time"] = deleted.time
+ current_delete["title"] = deleted.title
+ current_delete["details"] = deleted.details
+ current_delete["user"] = deleted.user
+ current_delete["ref"] = "\ref[deleted]"
+ logged_deletes += list(current_delete)
+ data["records_deletion"] = logged_deletes
+
+ var/list/logged_discussions = list()
+ for(var/datum/ares_record/deleted_talk/deleted_convo as anything in datacore.records_deletion)
+ if(!istype(deleted_convo))
+ continue
+ var/list/deleted_disc = list()
+ deleted_disc["time"] = deleted_convo.time
+ deleted_disc["title"] = deleted_convo.title
+ deleted_disc["ref"] = "\ref[deleted_convo]"
+ logged_discussions += list(deleted_disc)
+ data["deleted_discussions"] = logged_discussions
+
+ var/list/logged_orders = list()
+ for(var/datum/ares_record/requisition_log/req_order as anything in datacore.records_asrs)
+ if(!istype(req_order))
+ continue
+ var/list/current_order = list()
+ current_order["time"] = req_order.time
+ current_order["details"] = req_order.details
+ current_order["title"] = req_order.title
+ current_order["user"] = req_order.user
+ current_order["ref"] = "\ref[req_order]"
+ logged_orders += list(current_order)
+ data["records_requisition"] = logged_orders
+
+ var/list/logged_convos = list()
+ var/list/active_convo = list()
+ var/active_ref
+ for(var/datum/ares_record/talk_log/log as anything in datacore.records_talking)
+ if(!istype(log))
+ continue
+ if(log.user == link.interface.last_login)
+ active_convo = log.conversation
+ active_ref = "\ref[log]"
+
+ var/list/current_convo = list()
+ current_convo["user"] = log.user
+ current_convo["ref"] = "\ref[log]"
+ current_convo["conversation"] = log.conversation
+ logged_convos += list(current_convo)
+
+ data["active_convo"] = active_convo
+ data["active_ref"] = active_ref
+ data["conversations"] = logged_convos
+
+ var/list/logged_maintenance = list()
+ for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance)
+ if(!istype(maint_ticket))
+ continue
+ var/lock_status = TICKET_OPEN
+ switch(maint_ticket.ticket_status)
+ if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED)
+ lock_status = TICKET_CLOSED
+
+ var/list/current_maint = list()
+ current_maint["id"] = maint_ticket.ticket_id
+ current_maint["time"] = maint_ticket.ticket_time
+ current_maint["priority_status"] = maint_ticket.ticket_priority
+ current_maint["category"] = maint_ticket.ticket_name
+ current_maint["details"] = maint_ticket.ticket_details
+ current_maint["status"] = maint_ticket.ticket_status
+ current_maint["submitter"] = maint_ticket.ticket_submitter
+ current_maint["assignee"] = maint_ticket.ticket_assignee
+ current_maint["lock_status"] = lock_status
+ current_maint["ref"] = "\ref[maint_ticket]"
+ logged_maintenance += list(current_maint)
+ data["maintenance_tickets"] = logged_maintenance
+
+ var/list/logged_access = list()
+ for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access)
+ var/lock_status = TICKET_OPEN
+ switch(access_ticket.ticket_status)
+ if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED)
+ lock_status = TICKET_CLOSED
+
+ var/list/current_ticket = list()
+ current_ticket["id"] = access_ticket.ticket_id
+ current_ticket["time"] = access_ticket.ticket_time
+ current_ticket["priority_status"] = access_ticket.ticket_priority
+ current_ticket["title"] = access_ticket.ticket_name
+ current_ticket["details"] = access_ticket.ticket_details
+ current_ticket["status"] = access_ticket.ticket_status
+ current_ticket["submitter"] = access_ticket.ticket_submitter
+ current_ticket["assignee"] = access_ticket.ticket_assignee
+ current_ticket["lock_status"] = lock_status
+ current_ticket["ref"] = "\ref[access_ticket]"
+ logged_access += list(current_ticket)
+ data["access_tickets"] = logged_access
+
+ return data
+
+/obj/item/device/ai_tech_pda/ui_close(mob/user)
+ . = ..()
+ current_menu = "login"
+ last_menu = "off"
+ if(logged_in)
+ access_list += "[logged_in] logged out at [worldtime2text()]."
+ logged_in = null
+ update_icon()
+
+/obj/item/device/ai_tech_pda/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/user = usr
+ var/playsound = TRUE
+
+ switch(action)
+ if("go_back")
+ if(!last_menu)
+ 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/card = user.wear_id
+ if(!card || !card.check_biometrics(user))
+ to_chat(user, SPAN_WARNING("You require an authenticated ID card to access this device!"))
+ playsound(src, 'sound/machines/terminal_error.ogg', 15, TRUE)
+ return FALSE
+ logged_in = user.real_name
+ access_list += "[logged_in] at [worldtime2text()]."
+ current_menu = "main"
+
+ // -- Page Changers -- //
+ if("logout")
+ current_menu = "login"
+ last_menu = "login"
+ access_list += "[logged_in] logged out at [worldtime2text()]."
+ logged_in = null
+
+ if("home")
+ last_menu = current_menu
+ current_menu = "main"
+ if("page_1to1")
+ last_menu = current_menu
+ current_menu = "talking"
+ if("page_announcements")
+ last_menu = current_menu
+ current_menu = "announcements"
+ if("page_bioscans")
+ last_menu = current_menu
+ current_menu = "bioscans"
+ if("page_bombardments")
+ last_menu = current_menu
+ current_menu = "bombardments"
+ if("page_apollo")
+ last_menu = current_menu
+ current_menu = "apollo"
+ if("page_access")
+ last_menu = current_menu
+ current_menu = "access_log"
+ if("page_admin_list")
+ last_menu = current_menu
+ current_menu = "admin_access_log"
+ if("page_security")
+ last_menu = current_menu
+ current_menu = "security"
+ if("page_requisitions")
+ last_menu = current_menu
+ current_menu = "requisitions"
+ if("page_flight")
+ last_menu = current_menu
+ current_menu = "flight_log"
+ if("page_emergency")
+ last_menu = current_menu
+ current_menu = "emergency"
+ if("page_deleted")
+ last_menu = current_menu
+ current_menu = "delete_log"
+ if("page_deleted_1to1")
+ last_menu = current_menu
+ current_menu = "deleted_talks"
+ if("page_access_management")
+ last_menu = current_menu
+ current_menu = "access_management"
+ if("page_maint_management")
+ last_menu = current_menu
+ current_menu = "maintenance_management"
+
+ // -- 1:1 Conversation -- //
+ if("new_conversation")
+ if(link.interface.last_login == "No User")
+ return FALSE
+ var/datum/ares_record/talk_log/convo = new(link.interface.last_login)
+ convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [link.interface.last_login].'"
+ datacore.records_talking += convo
+
+ if("clear_conversation")
+ var/datum/ares_record/talk_log/conversation = locate(params["active_convo"])
+ if(!istype(conversation))
+ return FALSE
+ var/datum/ares_record/deleted_talk/deleted = new
+ deleted.title = conversation.title
+ deleted.conversation = conversation.conversation
+ deleted.user = MAIN_AI_SYSTEM
+ datacore.records_deletion += deleted
+ datacore.records_talking -= conversation
+
+ if("fake_message_ares")
+ var/message = tgui_input_text(user, "What do you wish to say to ARES?", "ARES Message", encode = FALSE)
+ if(message)
+ link.interface.message_ares(message, user, params["active_convo"], TRUE)
+ if("ares_reply")
+ var/message = tgui_input_text(user, "What do you wish to reply with?", "ARES Response", encode = FALSE)
+ if(message)
+ link.interface.response_from_ares(message, params["active_convo"])
+ var/datum/ares_record/talk_log/conversation = locate(params["active_convo"])
+ var/admin_log = SPAN_STAFF_IC("ADMINS/MODS: [SPAN_RED("[key_name(user)] replied to [conversation.user]'s ARES message")] [SPAN_GREEN("via Remote link.interface")] with: [SPAN_BLUE(message)] ")
+ for(var/client/admin in GLOB.admins)
+ if((R_ADMIN|R_MOD) & admin.admin_holder.rights)
+ to_chat(admin, admin_log)
+
+ if("read_record")
+ var/datum/ares_record/deleted_talk/conversation = locate(params["record"])
+ deleted_1to1 = conversation.conversation
+ last_menu = current_menu
+ current_menu = "read_deleted"
+
+ if("claim_ticket")
+ var/datum/ares_ticket/ticket = locate(params["ticket"])
+ if(!istype(ticket))
+ return FALSE
+ var/claim = TRUE
+ var/assigned = ticket.ticket_assignee
+ if(assigned)
+ if(assigned == logged_in)
+ 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(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)
+ ticket.ticket_assignee = logged_in
+ ticket.ticket_status = TICKET_ASSIGNED
+ return claim
+
+ if("auth_access")
+ playsound = FALSE
+ var/datum/ares_ticket/access/access_ticket = locate(params["ticket"])
+ if(!access_ticket)
+ return FALSE
+ for(var/obj/item/card/id/identification in link.waiting_ids)
+ if(!istype(identification))
+ continue
+ if(identification.registered_gid != access_ticket.user_id_num)
+ continue
+ identification.handle_ares_access(logged_in, user)
+ access_ticket.ticket_status = TICKET_GRANTED
+ playsound(src, 'sound/machines/chime.ogg', 15, TRUE)
+ ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] granted core access.")
+ return TRUE
+ for(var/obj/item/card/id/identification in link.active_ids)
+ if(!istype(identification))
+ continue
+ if(identification.registered_gid != access_ticket.user_id_num)
+ continue
+ identification.handle_ares_access(logged_in, user)
+ access_ticket.ticket_status = TICKET_REVOKED
+ playsound(src, 'sound/machines/chime.ogg', 15, TRUE)
+ ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: core access for [access_ticket.ticket_submitter] revoked.")
+ return TRUE
+ return FALSE
+
+ if("reject_access")
+ var/datum/ares_ticket/access/access_ticket = locate(params["ticket"])
+ if(!istype(access_ticket))
+ return FALSE
+ access_ticket.ticket_status = TICKET_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] rejected.")
+ return TRUE
+
+ if("new_report")
+ var/priority_report = FALSE
+ 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(user, "What are the details for this report?", "Ticket Details", encode = FALSE)
+ if(!details)
+ return FALSE
+
+ if(!priority_report)
+ 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(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")
+ var/datum/ares_ticket/maintenance/maint_ticket = new("[logged_in] (AIST)", maint_type, details, priority_report)
+ link.tickets_maintenance += maint_ticket
+ if(priority_report)
+ ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.")
+ log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(user)] as AI-ST with Category '[maint_type]' and Details of '[details]'.")
+ return TRUE
+ return FALSE
+
+ if("cancel_ticket")
+ var/datum/ares_ticket/ticket = locate(params["ticket"])
+ if(!istype(ticket))
+ return FALSE
+ 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.")
+ return TRUE
+
+ if("mark_ticket")
+ var/datum/ares_ticket/ticket = locate(params["ticket"])
+ if(!istype(ticket))
+ return FALSE
+ var/options_list = list(TICKET_COMPLETED, TICKET_REJECTED)
+ if(ticket.ticket_priority)
+ options_list += TICKET_NON_PRIORITY
+ else
+ options_list += TICKET_PRIORITY
+ var/choice = tgui_alert(user, "What do you wish to mark the ticket as?", "Mark", options_list, 20 SECONDS)
+ switch(choice)
+ if(TICKET_PRIORITY)
+ ticket.ticket_priority = TRUE
+ ares_apollo_talk("[ticket.ticket_type] [ticket.ticket_id] upgraded to Priority.")
+ return TRUE
+ if(TICKET_NON_PRIORITY)
+ ticket.ticket_priority = FALSE
+ ares_apollo_talk("[ticket.ticket_type] [ticket.ticket_id] downgraded from Priority.")
+ return TRUE
+ if(TICKET_COMPLETED)
+ ticket.ticket_status = TICKET_COMPLETED
+ if(TICKET_REJECTED)
+ ticket.ticket_status = TICKET_REJECTED
+ else
+ return FALSE
+ if(ticket.ticket_priority)
+ ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by AI-ST [logged_in].")
+ to_chat(user, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice]."))
+ return TRUE
+
+ if("delete_record")
+ playsound = FALSE
+ var/datum/ares_record/record = locate(params["record"])
+ if(record.record_name == ARES_RECORD_DELETED)
+ return FALSE
+ var/datum/ares_record/deletion/new_delete = new
+ var/new_details = "Error"
+ var/new_title = "Error"
+ switch(record.record_name)
+ if(ARES_RECORD_ANNOUNCE)
+ new_title = "[record.title] at [record.time]"
+ new_details = record.details
+ datacore.records_announcement -= record
+ if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR)
+ new_title = "[record.title] at [record.time]"
+ new_details = record.details
+ datacore.records_security -= record
+ if(ARES_RECORD_BIOSCAN)
+ new_title = "[record.title] at [record.time]"
+ new_details = record.details
+ datacore.records_bioscan -= record
+ if(ARES_RECORD_BOMB)
+ new_title = "[record.title] at [record.time]"
+ new_details = "[record.details] Launched by [record.user]."
+ datacore.records_bombardment -= record
+
+ new_delete.details = new_details
+ new_delete.user = "[logged_in] (AIST)"
+ new_delete.title = new_title
+
+ datacore.records_deletion += new_delete
+ playsound(src, 'sound/machines/terminal_error.ogg', 15, TRUE)
+
+ if("general_quarters")
+ if(!COOLDOWN_FINISHED(datacore, ares_quarters_cooldown))
+ to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(GLOB.security_level < SEC_LEVEL_RED)
+ set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE)
+ shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg')
+ log_game("[key_name(usr)] has called for general quarters via ARES.")
+ message_admins("[key_name_admin(usr)] has called for general quarters via ARES.")
+ log_ares_security("General Quarters", "[logged_in] has called for general quarters via ARES.")
+ COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES)
+ . = TRUE
+
+ if("evacuation_start")
+ if(GLOB.security_level < SEC_LEVEL_RED)
+ to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures."))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+
+ if(SShijack.evac_admin_denied)
+ to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods."))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+
+ if(!SShijack.initiate_evacuation())
+ to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+
+ log_game("[key_name(usr)] has called for an emergency evacuation via ARES.")
+ message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.")
+ log_ares_security("Initiate Evacuation", "[logged_in] has called for an emergency evacuation via ARES.")
+ . = TRUE
+
+ if("distress")
+ if(!SSticker.mode)
+ return FALSE //Not a game mode?
+ if(world.time < DISTRESS_TIME_LOCK)
+ to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(!COOLDOWN_FINISHED(datacore, ares_distress_cooldown))
+ to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(GLOB.security_level == SEC_LEVEL_DELTA)
+ to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(GLOB.security_level < SEC_LEVEL_RED)
+ to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+
+ for(var/client/admin in GLOB.admins)
+ if((R_ADMIN|R_MOD) & admin.admin_holder.rights)
+ playsound_client(admin,'sound/effects/sos-morse-code.ogg',10)
+ SSticker.mode.request_ert(usr, TRUE)
+ to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command."))
+ COOLDOWN_START(datacore, ares_distress_cooldown, COOLDOWN_COMM_REQUEST)
+ return TRUE
+
+ if("nuclearbomb")
+ if(!SSticker.mode)
+ return FALSE //Not a game mode?
+ if(world.time < NUCLEAR_TIME_LOCK)
+ to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(!COOLDOWN_FINISHED(datacore, ares_nuclear_cooldown))
+ to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(GLOB.security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame)
+ to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance")
+ if(!reason)
+ return FALSE
+ for(var/client/admin in GLOB.admins)
+ if((R_ADMIN|R_MOD) & admin.admin_holder.rights)
+ playsound_client(admin,'sound/effects/sos-morse-code.ogg',10)
+ message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]")
+ to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]"))
+ log_ares_security("Nuclear Ordnance Request", "[logged_in] has sent a request for nuclear ordnance for the following reason: [reason]")
+ if(ares_can_interface())
+ ai_silent_announcement("[logged_in] has sent a request for nuclear ordnance to USCM High Command.", ".V")
+ ai_silent_announcement("Reason given: [reason].", ".V")
+ COOLDOWN_START(datacore, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT)
+ return TRUE
+
+
+
+
+ if(playsound)
+ var/sound = pick('sound/machines/pda_button1.ogg', 'sound/machines/pda_button2.ogg')
+ playsound(src, sound, 15, TRUE)
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 103e3f709afe..a1d7f00cf94a 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -97,7 +97,7 @@
/obj/structure/machinery/camera/autoname/almayer/containment/ares
name = "ares core camera"
- network = list(CAMERA_NET_ALMAYER, CAMERA_NET_ARES)
+ network = list(CAMERA_NET_ARES)
//used by the landing camera dropship equipment. Do not place them right under where the dropship lands.
//Should place them near each corner of your LZs.
diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm
index bf3b952edcf5..3203e567ec15 100644
--- a/code/game/objects/effects/landmarks/landmarks.dm
+++ b/code/game/objects/effects/landmarks/landmarks.dm
@@ -404,6 +404,9 @@
name = "working joe late join"
job = JOB_WORKING_JOE
+/obj/effect/landmark/late_join/aist
+ name = "AIST late join"
+ job = JOB_AI_TECH
/obj/effect/landmark/late_join/cmo
name = "Chief Medical Officer late join"
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 58d8cd8d8d5f..290c77920dd0 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -12,6 +12,7 @@
var/abstract = FALSE
/obj/item/device/encryptionkey/binary
+ name = "APOLLO relay key"
icon_state = "binary_key"
translate_apollo = TRUE
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 00f0ad16220c..22da3bfffa88 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -559,6 +559,11 @@
initial_keys = list(/obj/item/device/encryptionkey/cmpcom/cdrcom)
volume = RADIO_VOLUME_CRITICAL
+/obj/item/device/radio/headset/almayer/mcom/cdrcom/aist
+ name = "marine AI service technician headset"
+ desc = "Issued to USCM AISTs. Allows the wearer to listen to, and broadcast over, the APOLLO Link."
+ initial_keys = list(/obj/item/device/encryptionkey/binary, /obj/item/device/encryptionkey/cmpcom/cdrcom)
+
/obj/item/device/radio/headset/almayer/mcom/synth
name = "marine synth headset"
desc = "Issued only to USCM synthetics. Channels are as follows: :v - marine command, :p - military police, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel"
diff --git a/code/game/objects/structures/pipes/vents/pump_scrubber.dm b/code/game/objects/structures/pipes/vents/pump_scrubber.dm
index a4565c610ad5..acc8b4784af9 100644
--- a/code/game/objects/structures/pipes/vents/pump_scrubber.dm
+++ b/code/game/objects/structures/pipes/vents/pump_scrubber.dm
@@ -21,6 +21,35 @@
name = "Reinforced Air Vent"
explodey = FALSE
+/// Vents that are linked to ARES Security Protocols, allowing the ARES Interface to trigger security measures.
+/obj/structure/pipes/vents/pump/no_boom/gas
+ name = "Security Air Vent"
+ var/datum/ares_link/link
+ var/vent_tag
+ COOLDOWN_DECLARE(vent_trigger_cooldown)
+
+/obj/structure/pipes/vents/pump/no_boom/gas/Initialize()
+ link_systems(override = FALSE)
+ . = ..()
+
+/obj/structure/pipes/vents/pump/no_boom/gas/Destroy()
+ delink()
+ return ..()
+
+/obj/structure/pipes/vents/pump/no_boom/gas/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override)
+ if(link && !override)
+ return FALSE
+ delink()
+ if(new_link)
+ link = new_link
+ new_link.linked_vents += src
+ return TRUE
+
+/obj/structure/pipes/vents/pump/no_boom/gas/proc/delink()
+ if(link)
+ link.linked_vents -= src
+ link = null
+
/obj/structure/pipes/vents/pump/on
icon_state = "on"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a3d6dd0c80c0..07b40c3a70ec 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -680,6 +680,8 @@ GLOBAL_LIST_INIT(bgstate_options, list(
if(!job)
debug_log("Missing job for prefs: [role_name]")
continue
+ if(job.flags_startup_parameters & ROLE_HIDDEN)
+ continue
index++
if((index >= limit) || (job.title in splitJobs))
HTML += "
"
@@ -798,6 +800,8 @@ GLOBAL_LIST_INIT(bgstate_options, list(
if(!job)
debug_log("Missing job for prefs: [role_name]")
continue
+ if(job.flags_startup_parameters & ROLE_HIDDEN)
+ continue
index++
if((index >= limit) || (job.title in splitJobs))
HTML += " | "
diff --git a/code/modules/cm_marines/marines_consoles.dm b/code/modules/cm_marines/marines_consoles.dm
index 7e57430f081a..f88591cd0aea 100644
--- a/code/modules/cm_marines/marines_consoles.dm
+++ b/code/modules/cm_marines/marines_consoles.dm
@@ -894,6 +894,7 @@ GLOBAL_LIST_EMPTY_TYPED(crewmonitor, /datum/crewmonitor)
JOB_PROVOST_MARSHAL = 02,//Grade O8
JOB_COLONEL = 04,//Grade O6
JOB_PROVOST_INSPECTOR = 04,
+ JOB_AI_TECH = 9,
// 10-19: Command
JOB_CO = 10,
JOB_XO = 11,
diff --git a/code/modules/cm_tech/tech.dm b/code/modules/cm_tech/tech.dm
index dea505f3237a..1750f7e7dbbf 100644
--- a/code/modules/cm_tech/tech.dm
+++ b/code/modules/cm_tech/tech.dm
@@ -21,9 +21,11 @@
var/background_icon = "background"
var/background_icon_locked = "marine"
- var/announce_name
+ var/announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED"
var/announce_message
+ var/is_tier_changer = FALSE
+
/datum/tech/proc/can_unlock(mob/M)
SHOULD_CALL_PARENT(TRUE)
@@ -58,6 +60,7 @@
return TRUE
+
/** Called when a tech is unlocked. Usually, benefits can be applied here
* however, the purchase can still be cancelled by returning FALSE
*
@@ -69,11 +72,17 @@
unlocked = TRUE
to_chat(user, SPAN_HELPFUL("You have purchased the '[name]' tech node."))
log_admin("[key_name_admin(user)] has bought '[name]' via tech points.")
+ if(!is_tier_changer)
+ var/log_details = announce_message
+ if(!log_details)
+ log_details = name
+ var/current_points = holder.points
+ log_ares_tech(user.real_name, is_tier_changer, announce_name, log_details, required_points, current_points)
holder.spend_points(required_points)
update_icon(node)
if(!(tech_flags & TECH_FLAG_NO_ANNOUNCE) && announce_message && announce_name)
- marine_announcement(announce_message, announce_name, 'sound/misc/notice2.ogg')
+ marine_announcement(announce_message, announce_name, 'sound/misc/notice2.ogg', logging = ARES_LOG_NONE)
return TRUE
diff --git a/code/modules/cm_tech/techs/abstract/transitory.dm b/code/modules/cm_tech/techs/abstract/transitory.dm
index 7798b6053d0e..1737b6b21ee6 100644
--- a/code/modules/cm_tech/techs/abstract/transitory.dm
+++ b/code/modules/cm_tech/techs/abstract/transitory.dm
@@ -7,6 +7,7 @@
var/datum/tier/next
var/techs_to_unlock = 0
+ is_tier_changer = TRUE
/datum/tech/transitory/check_tier_level(mob/M)
if(before && before != holder.tier.type)
@@ -22,7 +23,7 @@
return TRUE
-/datum/tech/transitory/on_unlock()
+/datum/tech/transitory/on_unlock(mob/user)
. = ..()
if(!next)
return
@@ -31,6 +32,10 @@
if(next_tier)
holder.tier = next_tier
holder.on_tier_change(previous_tier)
+ if(flags & TREE_FLAG_MARINE)
+ /// Due to calling parent, points will have already been spent by now.
+ var/current_points = holder.points + required_points
+ log_ares_tech(user.real_name, is_tier_changer, "ALMAYER DEFCON LEVEL INCREASED", "THREAT ASSESSMENT LEVEL INCREASED TO LEVEL [next_tier.tier].\n\nLEVEL [next_tier.tier] assets have been authorised to handle the situation.", required_points, current_points)
/datum/tech/transitory/get_tier_overlay()
if(!next)
diff --git a/code/modules/cm_tech/techs/marine/tier1/points.dm b/code/modules/cm_tech/techs/marine/tier1/points.dm
index d6bb5bace6fc..7768d8da2ab7 100644
--- a/code/modules/cm_tech/techs/marine/tier1/points.dm
+++ b/code/modules/cm_tech/techs/marine/tier1/points.dm
@@ -31,7 +31,6 @@
icon_state = "budget_ds"
desc = "Distributes resources to the dropship fabricator."
- announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED"
announce_message = "Additional dropship part fabricator points have been authorised for this operation."
required_points = 12
diff --git a/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm b/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm
index 303ea6121734..51675ccd27f2 100644
--- a/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm
+++ b/code/modules/cm_tech/techs/marine/tier2/orbital_ammo.dm
@@ -7,8 +7,6 @@
tier = /datum/tier/two
- announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED"
-
var/type_to_give
/datum/tech/repeatable/ob/on_unlock()
diff --git a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm
index acee904af305..06770b1d6afe 100644
--- a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm
+++ b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm
@@ -3,7 +3,6 @@
desc = "Wakes up an additional specialist to fight against any threats."
icon_state = "overshield"
- announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED"
announce_message = "An additional specialist is being taken out of cryo."
required_points = 8
diff --git a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm
index 404fbd07c2ae..19200698db02 100644
--- a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm
+++ b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm
@@ -4,7 +4,6 @@
desc = "Wakes up additional troops to fight against any threats."
icon_state = "cryotroops"
- announce_name = "ALMAYER SPECIAL ASSETS AUTHORIZED"
announce_message = "Additional troops are being taken out of cryo."
required_points = 6
diff --git a/code/modules/cm_tech/trees/marine.dm b/code/modules/cm_tech/trees/marine.dm
index aae057b90198..046712f9656b 100644
--- a/code/modules/cm_tech/trees/marine.dm
+++ b/code/modules/cm_tech/trees/marine.dm
@@ -174,4 +174,4 @@ GLOBAL_LIST_EMPTY(tech_controls_marine)
return //No need to announce tier updates for tier 1
var/name = "ALMAYER DEFCON LEVEL INCREASED"
var/input = "THREAT ASSESSMENT LEVEL INCREASED TO LEVEL [tier.tier].\n\nLEVEL [tier.tier] assets have been authorised to handle the situation."
- marine_announcement(input, name, 'sound/AI/commandreport.ogg')
+ marine_announcement(input, name, 'sound/AI/commandreport.ogg', logging = ARES_LOG_NONE)
diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm
index dc6eb34161ee..45626f4c4150 100644
--- a/code/modules/gear_presets/uscm_event.dm
+++ b/code/modules/gear_presets/uscm_event.dm
@@ -466,3 +466,55 @@
/*****************************************************************************************************/
+/datum/equipment_preset/uscm_event/ai_tech
+ name = "USCM AI Technician"
+ flags = EQUIPMENT_PRESET_EXTRA
+ faction = FACTION_MARINE
+ faction_group = list(FACTION_MARINE)
+ assignment = JOB_AI_TECH
+ rank = JOB_AI_TECH
+ paygrade = PAY_SHORT_MO2
+ role_comm_title = "AIST"
+ skills = /datum/skills/CE
+ languages = list(LANGUAGE_ENGLISH, LANGUAGE_RUSSIAN, LANGUAGE_JAPANESE, LANGUAGE_GERMAN, LANGUAGE_SPANISH, LANGUAGE_CHINESE)
+ idtype = /obj/item/card/id/silver
+ access = list(
+ ACCESS_MARINE_CE,
+ ACCESS_MARINE_ENGINEERING,
+ ACCESS_MARINE_COMMAND,
+ ACCESS_CIVILIAN_ENGINEERING,
+ ACCESS_MARINE_DATABASE,
+ ACCESS_MARINE_MAINT,
+ ACCESS_MARINE_OT,
+ ACCESS_MARINE_SYNTH,
+ ACCESS_MARINE_AI,
+ ACCESS_ARES_DEBUG,
+ )
+
+/datum/equipment_preset/uscm_event/ai_tech/load_vanity(mob/living/carbon/human/new_human)
+ return
+
+/datum/equipment_preset/uscm_event/ai_tech/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/dress(new_human), WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding(new_human), WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(new_human), WEAR_HANDS)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver/m44/custom/pkd_special(new_human.back), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/pkd(new_human.back), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/revolver/pkd(new_human.back), WEAR_IN_ACCESSORY)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_human), WEAR_WAIST)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/hazardvest/black(new_human), WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/flash(new_human), WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_J_STORE)
+
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mcom/cdrcom/aist(new_human), WEAR_L_EAR)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/sling(new_human), WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/ai_tech_pda(new_human.back), WEAR_IN_L_STORE)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_R_STORE)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 84569c5884b1..445f7b12757d 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -885,6 +885,7 @@
#include "code\game\machinery\ARES\ARES_procs.dm"
#include "code\game\machinery\ARES\ARES_records.dm"
#include "code\game\machinery\ARES\ARES_step_triggers.dm"
+#include "code\game\machinery\ARES\debug_pda.dm"
#include "code\game\machinery\atmoalter\canister.dm"
#include "code\game\machinery\atmoalter\meter.dm"
#include "code\game\machinery\atmoalter\portable_atmospherics.dm"
diff --git a/icons/landmarks.dmi b/icons/landmarks.dmi
index 08b23758beaa..54ab20593c62 100644
Binary files a/icons/landmarks.dmi and b/icons/landmarks.dmi differ
diff --git a/icons/mob/hud/marine_hud.dmi b/icons/mob/hud/marine_hud.dmi
index c5372245bdc7..ca9a0994bbde 100644
Binary files a/icons/mob/hud/marine_hud.dmi and b/icons/mob/hud/marine_hud.dmi differ
diff --git a/icons/mob/hud/sec_hud.dmi b/icons/mob/hud/sec_hud.dmi
index 9cc3e66c3e0b..c33950cb867a 100644
Binary files a/icons/mob/hud/sec_hud.dmi and b/icons/mob/hud/sec_hud.dmi differ
diff --git a/icons/obj/items/synth/ait_pda.dmi b/icons/obj/items/synth/ait_pda.dmi
new file mode 100644
index 000000000000..3242473c2d3a
Binary files /dev/null and b/icons/obj/items/synth/ait_pda.dmi differ
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index dec4291668b1..e2e6ed13db3f 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -638,6 +638,22 @@
icon_state = "plate"
},
/area/almayer/living/offices/flight)
+"adb" = (
+/obj/effect/step_trigger/clone_cleaner,
+/obj/structure/machinery/door/poddoor/shutters/almayer{
+ id = "ARES AIST";
+ name = "\improper Privacy Shutters"
+ },
+/obj/structure/machinery/door/airlock/almayer/generic/glass{
+ name = "\improper AIST Office";
+ dir = 1;
+ req_one_access_txt = "90;91;92";
+ masterkey_resist = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_plates"
+ },
+/area/almayer/command/aist_office)
"add" = (
/turf/open/floor/almayer{
icon_state = "mono"
@@ -3928,10 +3944,10 @@
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
"avM" = (
-/obj/structure/machinery/computer/cameras/almayer/ares{
+/obj/structure/machinery/computer/cameras/almayer{
dir = 8;
pixel_x = 17;
- pixel_y = 6
+ pixel_y = 8
},
/obj/structure/surface/table/reinforced/almayer_B{
climbable = 0;
@@ -3943,7 +3959,14 @@
pixel_y = 6
},
/obj/item/tool/pen,
-/turf/open/floor/almayer/aicore/no_build,
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 8;
+ pixel_x = 17;
+ pixel_y = -6
+ },
+/turf/open/floor/almayer/no_build{
+ icon_state = "ai_floors"
+ },
/area/almayer/command/airoom)
"avN" = (
/obj/structure/machinery/telecomms/processor/preset_two,
@@ -4624,7 +4647,13 @@
/obj/item/storage/belt/medical/full,
/obj/structure/machinery/computer/working_joe{
dir = 8;
- pixel_x = 17
+ pixel_x = 17;
+ pixel_y = 8
+ },
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 8;
+ pixel_x = 17;
+ pixel_y = -6
},
/turf/open/floor/almayer{
icon_state = "plate"
@@ -5971,13 +6000,13 @@
/area/almayer/living/grunt_rnr)
"aDX" = (
/obj/structure/surface/table/almayer,
-/obj/structure/machinery/computer/cameras/containment{
- dir = 4
- },
/obj/structure/sign/safety/terminal{
pixel_x = 8;
pixel_y = 32
},
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 4
+ },
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -9207,7 +9236,8 @@
"aWb" = (
/obj/structure/machinery/computer/working_joe{
dir = 4;
- pixel_x = -17
+ pixel_x = -17;
+ pixel_y = 8
},
/obj/structure/machinery/door_control/brbutton{
id = "engie_store";
@@ -9216,6 +9246,11 @@
pixel_y = 26;
req_one_access_txt = "6"
},
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 4;
+ pixel_x = -17;
+ pixel_y = -6
+ },
/turf/open/floor/almayer{
dir = 1;
icon_state = "orangecorner"
@@ -11168,6 +11203,14 @@
icon_state = "cargo_arrow"
},
/area/almayer/living/offices)
+"bjM" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
+ dir = 4
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"bjQ" = (
/obj/structure/machinery/shower{
dir = 8
@@ -11593,6 +11636,19 @@
icon_state = "test_floor4"
},
/area/almayer/squads/req)
+"bmy" = (
+/obj/structure/stairs{
+ icon_state = "ramptop"
+ },
+/obj/effect/projector{
+ name = "Almayer_AresUp";
+ vector_x = 3;
+ vector_y = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"bmz" = (
/obj/structure/surface/table/almayer,
/obj/item/tool/kitchen/utensil/spoon{
@@ -13232,6 +13288,15 @@
icon_state = "sterile_green_side"
},
/area/almayer/medical/operating_room_four)
+"byf" = (
+/obj/structure/stairs,
+/obj/effect/step_trigger/teleporter_vector{
+ name = "Almayer_AresUp";
+ vector_x = -3;
+ vector_y = -1
+ },
+/turf/open/floor/almayer/aicore/no_build,
+/area/almayer/command/airoom)
"bym" = (
/obj/structure/disposalpipe/segment{
dir = 2;
@@ -15297,11 +15362,14 @@
name = "ARES Core Lockdown";
pixel_x = 24;
pixel_y = -8;
- req_one_access_txt = "90;91;92"
+ req_one_access_txt = "90;91;92";
+ indestructible = 1
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
dir = 8;
- pixel_y = 2
+ pixel_y = 2;
+ c_tag = "AI Core - Access #2";
+ autoname = 0
},
/turf/open/floor/almayer/aicore/no_build{
dir = 4;
@@ -17670,6 +17738,17 @@
/obj/item/circuitboard,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/lifeboat_pumps/north1)
+"cbS" = (
+/obj/structure/stairs,
+/obj/effect/step_trigger/teleporter_vector{
+ name = "Almayer_AresUp";
+ vector_x = 3;
+ vector_y = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"ccb" = (
/obj/structure/surface/table/reinforced/black,
/turf/open/floor/almayer{
@@ -19129,6 +19208,17 @@
icon_state = "plate"
},
/area/almayer/maint/hull/upper/u_a_s)
+"cnQ" = (
+/obj/structure/stairs{
+ icon_state = "ramptop"
+ },
+/obj/effect/projector{
+ name = "Almayer_AresUp";
+ vector_x = -3;
+ vector_y = -1
+ },
+/turf/open/floor/almayer/aicore/no_build,
+/area/almayer/command/airoom)
"cnR" = (
/obj/structure/surface/table/reinforced/almayer_B,
/obj/structure/machinery/door/firedoor/border_only/almayer{
@@ -20520,6 +20610,17 @@
icon_state = "plating"
},
/area/almayer/shipboard/stern_point_defense)
+"cLs" = (
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Inner";
+ name = "AIST Office";
+ pixel_x = -24;
+ pixel_y = 24;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/turf/open/floor/almayer/aicore/no_build,
+/area/almayer/command/airoom)
"cLA" = (
/obj/structure/machinery/cryopod/right{
pixel_y = 6
@@ -23199,6 +23300,12 @@
icon_state = "mono"
},
/area/almayer/lifeboat_pumps/south2)
+"dHi" = (
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 10
+ },
+/area/almayer/command/aist_office)
"dHu" = (
/obj/structure/desertdam/decals/road_edge{
pixel_x = 2;
@@ -24323,6 +24430,17 @@
icon_state = "plate"
},
/area/almayer/shipboard/navigation)
+"edc" = (
+/obj/structure/stairs,
+/obj/effect/step_trigger/teleporter_vector{
+ name = "Almayer_AresUp";
+ vector_x = 3;
+ vector_y = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_plates"
+ },
+/area/almayer/command/aist_office)
"edn" = (
/obj/structure/machinery/door/firedoor/border_only/almayer,
/turf/open/floor/almayer{
@@ -24757,6 +24875,12 @@
/obj/structure/window/framed/almayer,
/turf/open/floor/plating,
/area/almayer/living/grunt_rnr)
+"ejS" = (
+/obj/structure/flora/pottedplant/random,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
"ejV" = (
/obj/structure/closet,
/obj/item/device/flashlight/pen,
@@ -24774,6 +24898,16 @@
icon_state = "mono"
},
/area/almayer/lifeboat_pumps/south1)
+"ekg" = (
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 4;
+ autoname = 0;
+ c_tag = "AI Core - Core Chamber #1"
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "ai_floor3"
+ },
+/area/almayer/command/airoom)
"eky" = (
/turf/open/floor/almayer,
/area/almayer/command/lifeboat)
@@ -25921,6 +26055,18 @@
},
/turf/open/floor/almayer,
/area/almayer/living/bridgebunks)
+"eDL" = (
+/obj/structure/machinery/light{
+ dir = 4
+ },
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
+ dir = 10
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 4
+ },
+/area/almayer/command/aist_office)
"eEc" = (
/obj/structure/machinery/light,
/obj/effect/decal/warning_stripes{
@@ -25960,6 +26106,16 @@
},
/turf/open/floor/almayer,
/area/almayer/hallways/upper/midship_hallway)
+"eEU" = (
+/obj/item/bedsheet/rd,
+/obj/structure/bed{
+ icon_state = "psychbed"
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"eFa" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -26969,7 +27125,9 @@
/area/almayer/living/briefing)
"eYz" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 1
+ dir = 1;
+ autoname = 0;
+ c_tag = "AI Core - Reception"
},
/obj/structure/machinery/computer/working_joe{
dir = 8;
@@ -28681,17 +28839,22 @@
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hallways/lower/starboard_midship_hallway)
"fEN" = (
-/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 4
+/obj/structure/pipes/vents/pump/no_boom{
+ dir = 1
},
-/turf/open/floor/almayer/aicore/no_build,
-/area/almayer/command/airoom)
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
"fER" = (
/obj/structure/machinery/autolathe,
/turf/open/floor/almayer{
icon_state = "cargo"
},
/area/almayer/hallways/hangar)
+"fFc" = (
+/turf/closed/wall/almayer/aicore/white/hull,
+/area/almayer/command/aist_office)
"fFe" = (
/obj/structure/sign/safety/maint{
pixel_x = 32
@@ -28846,6 +29009,14 @@
icon_state = "plate"
},
/area/almayer/command/cic)
+"fHp" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
+ dir = 5
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"fHz" = (
/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
pixel_y = 25
@@ -29591,6 +29762,22 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/almayer/medical/morgue)
+"fXq" = (
+/obj/structure/machinery/door/airlock/almayer/secure/reinforced{
+ name = "\improper AIST Office";
+ req_access = null;
+ req_one_access_txt = "90;91;92"
+ },
+/obj/effect/step_trigger/clone_cleaner,
+/obj/structure/machinery/door/poddoor/shutters/almayer{
+ id = "ARES AIST Inner";
+ name = "\improper Access Shutters";
+ dir = 4
+ },
+/turf/open/floor/almayer/no_build{
+ icon_state = "test_floor4"
+ },
+/area/almayer/command/airoom)
"fXx" = (
/obj/structure/surface/rack,
/turf/open/floor/almayer{
@@ -30824,6 +31011,15 @@
/obj/structure/machinery/light,
/turf/open/floor/almayer,
/area/almayer/hallways/lower/port_midship_hallway)
+"gvS" = (
+/obj/structure/machinery/status_display{
+ pixel_y = 30
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"gvU" = (
/obj/structure/machinery/disposal,
/obj/structure/disposalpipe/trunk{
@@ -31115,7 +31311,8 @@
name = "Working Joe Cryogenics Lockdown";
pixel_x = 24;
pixel_y = 8;
- req_one_access_txt = "91;92"
+ req_one_access_txt = "91;92";
+ indestructible = 1
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -31286,6 +31483,14 @@
icon_state = "red"
},
/area/almayer/shipboard/brig/processing)
+"gDB" = (
+/obj/structure/pipes/vents/scrubber/no_boom{
+ dir = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"gDF" = (
/obj/structure/largecrate/random/case{
layer = 2.98
@@ -32455,6 +32660,15 @@
icon_state = "bluefull"
},
/area/almayer/living/briefing)
+"gXI" = (
+/obj/structure/machinery/light{
+ unacidable = 1;
+ unslashable = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
"gYe" = (
/obj/structure/machinery/vending/sea,
/turf/open/floor/almayer{
@@ -33301,6 +33515,11 @@
pixel_x = -1;
pixel_y = 3
},
+/obj/item/reagent_container/spray/cleaner{
+ layer = 3.04;
+ pixel_x = 5;
+ pixel_y = 22
+ },
/turf/open/floor/wood/ship,
/area/almayer/living/commandbunks)
"hlH" = (
@@ -34130,6 +34349,15 @@
icon_state = "plate"
},
/area/almayer/living/offices)
+"hyx" = (
+/obj/structure/closet/secure_closet/personal/cabinet{
+ req_access = null
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 5
+ },
+/area/almayer/command/aist_office)
"hyE" = (
/obj/structure/machinery/door/poddoor/almayer/open{
dir = 4;
@@ -34762,6 +34990,11 @@
},
/turf/open/floor/almayer,
/area/almayer/engineering/lower/workshop/hangar)
+"hJR" = (
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
"hKe" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -36509,6 +36742,30 @@
icon_state = "sterile_green_side"
},
/area/almayer/medical/medical_science)
+"isg" = (
+/obj/structure/machinery/cryopod/right{
+ layer = 3.1;
+ pixel_y = 13
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "W";
+ pixel_x = -1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_cargo"
+ },
+/area/almayer/command/aist_office)
"ish" = (
/turf/open/floor/almayer{
dir = 4;
@@ -36689,6 +36946,22 @@
},
/turf/open/floor/plating,
/area/almayer/maint/lower/constr)
+"ive" = (
+/obj/structure/filingcabinet{
+ density = 0;
+ pixel_x = 8;
+ pixel_y = 18
+ },
+/obj/structure/filingcabinet{
+ density = 0;
+ pixel_x = -8;
+ pixel_y = 18
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 9
+ },
+/area/almayer/command/aist_office)
"ivf" = (
/obj/structure/surface/table/reinforced/almayer_B,
/obj/item/device/camera,
@@ -37627,6 +37900,15 @@
icon_state = "silver"
},
/area/almayer/living/briefing)
+"iPx" = (
+/obj/structure/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 8
+ },
+/area/almayer/command/aist_office)
"iPD" = (
/obj/structure/pipes/standard/manifold/hidden/supply{
dir = 4
@@ -37753,13 +38035,14 @@
layer = 3.2;
pixel_y = 4
},
-/obj/structure/machinery/computer/secure_data{
- dir = 4;
- pixel_y = 23
- },
/obj/structure/machinery/light{
dir = 8
},
+/obj/structure/machinery/computer/secure_data{
+ dir = 4;
+ pixel_y = 23;
+ layer = 2.99
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "red"
@@ -38468,15 +38751,6 @@
/obj/structure/machinery/light{
dir = 8
},
-/obj/item/clothing/mask/cigarette/pipe{
- layer = 2.8;
- pixel_y = -7
- },
-/obj/item/reagent_container/spray/cleaner{
- layer = 3.04;
- pixel_x = -4;
- pixel_y = 7
- },
/obj/structure/machinery/door_control/brbutton{
id = "Brig Lockdown Shutters";
name = "Brig Lockdown";
@@ -38495,6 +38769,9 @@
pixel_x = 8;
pixel_y = 26
},
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 4
+ },
/turf/open/floor/wood/ship,
/area/almayer/living/commandbunks)
"jbO" = (
@@ -39697,6 +39974,15 @@
icon_state = "greencorner"
},
/area/almayer/hallways/lower/port_fore_hallway)
+"jvI" = (
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 4
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 8
+ },
+/area/almayer/command/aist_office)
"jvM" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -40677,6 +40963,17 @@
icon_state = "orange"
},
/area/almayer/engineering/lower/engine_core)
+"jPi" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/structure/sign/safety/terminal{
+ pixel_y = 26;
+ pixel_x = 8
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"jPq" = (
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/almayer{
@@ -41174,7 +41471,9 @@
layer = 3.3
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 4
+ dir = 4;
+ c_tag = "AI Core - Processors #1";
+ autoname = 0
},
/turf/open/floor/almayer/aicore/glowing/no_build,
/area/almayer/command/airoom)
@@ -41497,6 +41796,16 @@
"kcN" = (
/turf/closed/wall/almayer/reinforced/temphull,
/area/almayer/living/commandbunks)
+"kcY" = (
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Ladder 2";
+ name = "Access Shutters";
+ req_one_access_txt = "31;92";
+ pixel_y = -24;
+ indestructible = 1
+ },
+/turf/open/floor/plating/plating_catwalk,
+/area/almayer/maint/hull/upper/u_m_s)
"kde" = (
/turf/open/floor/plating/plating_catwalk,
/area/almayer/shipboard/brig/general_equipment)
@@ -41726,7 +42035,9 @@
layer = 3.3
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8
+ dir = 8;
+ c_tag = "AI Core - Processors #2";
+ autoname = 0
},
/turf/open/floor/almayer/aicore/glowing/no_build,
/area/almayer/command/airoom)
@@ -42722,7 +43033,8 @@
name = "ARES Core Lockdown";
pixel_x = -24;
pixel_y = -8;
- req_one_access_txt = "90;91;92"
+ req_one_access_txt = "90;91;92";
+ indestructible = 1
},
/turf/open/floor/almayer/aicore/no_build{
dir = 8;
@@ -43666,6 +43978,12 @@
},
/turf/open/floor/wood/ship,
/area/almayer/living/basketball)
+"kQp" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"kQr" = (
/obj/structure/surface/table/almayer,
/obj/item/trash/pistachios,
@@ -43715,6 +44033,15 @@
icon_state = "plate"
},
/area/almayer/maint/upper/u_m_s)
+"kRp" = (
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 8
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 4
+ },
+/area/almayer/command/aist_office)
"kRD" = (
/obj/item/reagent_container/glass/bucket/janibucket,
/obj/structure/machinery/light{
@@ -45327,6 +45654,30 @@
/obj/effect/landmark/start/working_joe,
/turf/open/floor/plating/plating_catwalk/aicore,
/area/almayer/command/airoom)
+"ltf" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/structure/machinery/light{
+ unacidable = 1;
+ unslashable = 1
+ },
+/obj/structure/transmitter/rotary{
+ name = "Office Telephone";
+ phone_category = "ARES";
+ phone_color = "blue";
+ phone_id = "AIST Office";
+ pixel_x = 8;
+ pixel_y = 9
+ },
+/obj/structure/machinery/door_control/brbutton/alt{
+ pixel_x = -5;
+ name = "Core Lockdown";
+ id = "ARES Emergency";
+ req_one_access_txt = "92"
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
"ltm" = (
/obj/structure/bed/chair/comfy/orange,
/turf/open/floor/almayer{
@@ -46010,6 +46361,15 @@
"lFp" = (
/turf/closed/wall/almayer,
/area/almayer/engineering/lower/workshop/hangar)
+"lFq" = (
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "Observation";
+ dir = 1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "ai_plates"
+ },
+/area/almayer/command/airoom)
"lFr" = (
/obj/structure/machinery/firealarm{
dir = 8;
@@ -46313,6 +46673,12 @@
/obj/structure/surface/table/almayer,
/turf/open/floor/almayer,
/area/almayer/squads/charlie)
+"lLM" = (
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 4
+ },
+/area/almayer/command/aist_office)
"lLO" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -46409,6 +46775,9 @@
icon_state = "plate"
},
/area/almayer/squads/charlie)
+"lNN" = (
+/turf/closed/wall/almayer/reinforced/temphull,
+/area/almayer/maint/hull/upper/u_m_s)
"lNR" = (
/obj/structure/window/framed/almayer,
/obj/structure/machinery/door/firedoor/border_only/almayer,
@@ -48933,6 +49302,15 @@
icon_state = "plate"
},
/area/almayer/living/port_emb)
+"mLd" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8;
+ layer = 3.25
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"mLe" = (
/obj/structure/pipes/vents/pump{
dir = 8
@@ -49118,6 +49496,21 @@
icon_state = "plate"
},
/area/almayer/maint/upper/u_f_s)
+"mPb" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 8;
+ c_tag = "AI Core - Reception Exterior";
+ autoname = 0
+ },
+/turf/open/floor/almayer{
+ dir = 4;
+ icon_state = "silver"
+ },
+/area/almayer/hallways/upper/midship_hallway)
"mPc" = (
/obj/structure/sign/safety/hvac_old{
pixel_x = 8;
@@ -50484,15 +50877,14 @@
/area/almayer/hallways/upper/starboard)
"nkX" = (
/obj/structure/surface/table/almayer,
-/obj/structure/machinery/computer/cameras/almayer_network{
- dir = 4;
- layer = 2.8;
- pixel_y = 5
- },
/obj/structure/sign/safety/terminal{
pixel_x = 8;
pixel_y = 32
},
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ dir = 4;
+ pixel_y = 5
+ },
/turf/open/floor/almayer{
dir = 9;
icon_state = "red"
@@ -51397,6 +51789,10 @@
pixel_x = -1;
pixel_y = 2
},
+/obj/item/clothing/mask/cigarette/pipe{
+ layer = 2.8;
+ pixel_x = 14
+ },
/turf/open/floor/wood/ship,
/area/almayer/living/commandbunks)
"nCD" = (
@@ -51513,6 +51909,17 @@
icon_state = "mono"
},
/area/almayer/medical/medical_science)
+"nEI" = (
+/obj/structure/stairs,
+/obj/effect/step_trigger/teleporter_vector{
+ name = "Almayer_AresUp";
+ vector_x = -3;
+ vector_y = -1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "ai_floor3"
+ },
+/area/almayer/command/airoom)
"nEJ" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/almayer{
@@ -51633,6 +52040,20 @@
icon_state = "plate"
},
/area/almayer/maint/hull/lower/l_a_p)
+"nGP" = (
+/obj/effect/step_trigger/clone_cleaner,
+/obj/structure/machinery/door_control{
+ id = "ARES AIST";
+ name = "Privacy Shutters";
+ pixel_x = 24;
+ pixel_y = 8;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"nGY" = (
/obj/structure/closet/emcloset,
/turf/open/floor/almayer{
@@ -54894,11 +55315,14 @@
name = "ARES Core Lockdown";
pixel_x = -24;
pixel_y = 8;
- req_one_access_txt = "90;91;92"
+ req_one_access_txt = "90;91;92";
+ indestructible = 1
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
dir = 4;
- pixel_y = -8
+ pixel_y = -8;
+ c_tag = "AI Core - Access #1";
+ autoname = 0
},
/obj/effect/step_trigger/clone_cleaner,
/turf/open/floor/almayer/aicore/no_build{
@@ -55624,6 +56048,16 @@
icon_state = "sterile_green_side"
},
/area/almayer/medical/lower_medical_medbay)
+"oYf" = (
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/obj/effect/step_trigger/clone_cleaner,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"oYi" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -56362,14 +56796,14 @@
},
/area/almayer/living/briefing)
"pmV" = (
-/obj/structure/prop/server_equipment/yutani_server/broken{
- density = 0;
- desc = "A powerful server tower housing various AI functions.";
- name = "server tower";
- pixel_y = 16
- },
/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
-/turf/open/floor/almayer/aicore/no_build,
+/obj/structure/machinery/computer/tech_control{
+ pixel_y = 16;
+ density = 0
+ },
+/turf/open/floor/almayer/no_build{
+ icon_state = "ai_floors"
+ },
/area/almayer/command/airoom)
"pnh" = (
/obj/structure/ladder{
@@ -58293,7 +58727,8 @@
},
/area/almayer/hallways/lower/starboard_midship_hallway)
"pYi" = (
-/obj/structure/pipes/vents/pump/no_boom{
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "Access Corridor";
dir = 8
},
/turf/open/floor/almayer/aicore/no_build{
@@ -58458,6 +58893,15 @@
icon_state = "plating"
},
/area/almayer/shipboard/stern_point_defense)
+"qbK" = (
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "AIST Office";
+ dir = 8
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"qbO" = (
/turf/open/floor/almayer{
dir = 6;
@@ -59302,6 +59746,27 @@
icon_state = "green"
},
/area/almayer/living/grunt_rnr)
+"qoZ" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/item/folder/white{
+ pixel_x = -12
+ },
+/obj/item/paper_bin/uscm{
+ pixel_y = 6
+ },
+/obj/item/tool/pen/fountain{
+ pixel_y = 3
+ },
+/obj/item/tool/pen/fountain{
+ pixel_y = 9
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver"
+ },
+/area/almayer/command/aist_office)
+"qpq" = (
+/turf/closed/wall/almayer/aicore/white/reinforced,
+/area/almayer/command/aist_office)
"qpx" = (
/obj/structure/surface/table/almayer,
/obj/structure/pipes/vents/scrubber,
@@ -59861,6 +60326,27 @@
icon_state = "plate"
},
/area/almayer/maint/hull/lower/p_bow)
+"qzE" = (
+/obj/structure/ladder/fragile_almayer{
+ height = 1;
+ id = "aist"
+ },
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Ladder";
+ name = "Privacy Shutters";
+ pixel_x = 24;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/obj/effect/step_trigger/ares_alert/public{
+ alert_id = "AIST";
+ alert_message = "ALERT: Unauthorized movement detected in the AIST Office!";
+ cooldown_duration = 1200
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"qzQ" = (
/obj/structure/machinery/door/airlock/almayer/maint,
/turf/open/floor/almayer{
@@ -60312,6 +60798,11 @@
icon_state = "dark_sterile"
},
/area/almayer/medical/operating_room_two)
+"qGK" = (
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"qGP" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -62686,6 +63177,12 @@
icon_state = "plate"
},
/area/almayer/maint/hull/upper/s_bow)
+"rvQ" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"rvT" = (
/obj/structure/pipes/standard/manifold/hidden/supply,
/turf/open/floor/almayer{
@@ -62830,6 +63327,25 @@
icon_state = "dark_sterile"
},
/area/almayer/medical/containment)
+"rzS" = (
+/obj/effect/step_trigger/clone_cleaner,
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Inner";
+ name = "AIST Office";
+ pixel_x = 8;
+ pixel_y = 24;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/obj/effect/step_trigger/ares_alert/public{
+ alert_id = "AIST";
+ alert_message = "ALERT: Unauthorized movement detected in the AIST Office!";
+ cooldown_duration = 1200
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "ai_floor3"
+ },
+/area/almayer/command/airoom)
"rAb" = (
/turf/open/floor/almayer{
icon_state = "bluecorner"
@@ -62964,7 +63480,9 @@
/area/almayer/maint/hull/lower/l_m_p)
"rCi" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8
+ dir = 8;
+ c_tag = "AI Core - Observation";
+ autoname = 0
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -64026,6 +64544,26 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/almayer/maint/lower/cryo_cells)
+"rTb" = (
+/obj/structure/machinery/door/airlock/almayer/maint/reinforced{
+ req_one_access = null;
+ req_one_access_txt = "31;92";
+ no_panel = 1;
+ unslashable = 1;
+ unacidable = 1;
+ indestructible = 1;
+ not_weldable = 1;
+ damage_cap = 3000
+ },
+/obj/structure/machinery/door/poddoor/shutters/almayer/uniform_vendors/antitheft{
+ id = "ARES AIST Ladder 2";
+ req_level = 3;
+ name = "Secure Access Shutters";
+ desc = "Secure Access shutters, they're reinforced against entry attempts.";
+ dir = 4
+ },
+/turf/open/floor/plating/plating_catwalk,
+/area/almayer/maint/hull/upper/u_m_s)
"rTe" = (
/obj/structure/machinery/light{
dir = 1
@@ -64056,6 +64594,18 @@
icon_state = "plate"
},
/area/almayer/engineering/upper_engineering/port)
+"rTQ" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
+/obj/structure/machinery/door/airlock/almayer/generic{
+ name = "\improper AIST Office";
+ dir = 1;
+ req_one_access_txt = "31;92";
+ masterkey_resist = 1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"rTZ" = (
/obj/structure/sign/safety/maint{
pixel_x = -17
@@ -65290,6 +65840,14 @@
icon_state = "plate"
},
/area/almayer/maint/hull/upper/u_a_p)
+"spk" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/item/device/flash,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"spF" = (
/obj/structure/surface/table/almayer,
/obj/structure/flora/pottedplant{
@@ -67032,6 +67590,14 @@
icon_state = "sterile_green_side"
},
/area/almayer/shipboard/brig/medical)
+"sYp" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
+ dir = 4
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"sYr" = (
/obj/structure/machinery/door/airlock/almayer/maint,
/obj/structure/machinery/door/poddoor/almayer/open{
@@ -68357,6 +68923,14 @@
/obj/structure/largecrate/random/barrel/blue,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/maint/hull/upper/p_bow)
+"tsK" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
+ dir = 6
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"tsM" = (
/obj/effect/decal/warning_stripes{
icon_state = "N";
@@ -68875,6 +69449,16 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hallways/lower/starboard_midship_hallway)
+"tBh" = (
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 8;
+ autoname = 0;
+ c_tag = "AI Core - Core Chamber #2"
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "ai_floor3"
+ },
+/area/almayer/command/airoom)
"tBq" = (
/obj/item/tool/crowbar,
/turf/open/floor/plating/plating_catwalk,
@@ -69409,6 +69993,28 @@
icon_state = "green"
},
/area/almayer/living/grunt_rnr)
+"tLY" = (
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/structure/machinery/computer/cameras/almayer/ares{
+ pixel_x = -2
+ },
+/obj/structure/machinery/computer/cameras/almayer{
+ pixel_x = 32
+ },
+/obj/structure/machinery/computer/view_objectives{
+ pixel_x = 15
+ },
+/obj/structure/machinery/keycard_auth{
+ pixel_y = 25
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"tLZ" = (
/turf/open/floor/almayer{
icon_state = "green"
@@ -70261,6 +70867,9 @@
icon_state = "plate"
},
/area/almayer/command/cic)
+"udd" = (
+/turf/closed/wall/almayer/aicore/white/hull,
+/area/space)
"udf" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 6
@@ -71877,6 +72486,13 @@
icon_state = "green"
},
/area/almayer/hallways/lower/port_midship_hallway)
+"uGA" = (
+/obj/structure/flora/pottedplant/random,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 6
+ },
+/area/almayer/command/aist_office)
"uGN" = (
/obj/structure/pipes/vents/pump,
/turf/open/floor/almayer,
@@ -73565,6 +74181,14 @@
icon_state = "cargo"
},
/area/almayer/engineering/lower/workshop/hangar)
+"vjY" = (
+/obj/structure/surface/table/reinforced/almayer_B,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"vka" = (
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/cic_hallway)
@@ -74839,6 +75463,14 @@
icon_state = "plate"
},
/area/almayer/maint/upper/u_f_s)
+"vDv" = (
+/obj/effect/step_trigger/clone_cleaner,
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "Reception";
+ dir = 1
+ },
+/turf/open/floor/almayer/aicore/no_build,
+/area/almayer/command/airoom)
"vDz" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 9
@@ -74875,6 +75507,19 @@
/obj/effect/landmark/start/synthetic,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/living/synthcloset)
+"vEk" = (
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Ladder";
+ name = "Privacy Shutters";
+ pixel_x = 24;
+ pixel_y = -24;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"vEr" = (
/obj/effect/decal/warning_stripes{
icon_state = "E";
@@ -76744,6 +77389,11 @@
icon_state = "silver"
},
/area/almayer/command/cichallway)
+"whC" = (
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_floor3"
+ },
+/area/almayer/command/aist_office)
"whQ" = (
/obj/structure/closet/secure_closet/personal/cabinet{
req_access = null
@@ -77233,9 +77883,8 @@
/obj/structure/bed/chair/comfy/ares{
dir = 1
},
-/obj/structure/pipes/vents/pump/no_boom{
- desc = "Has a valve and pump attached to it, connected to multiple gas tanks.";
- name = "Security Vent"
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "Core Chamber"
},
/turf/open/floor/almayer/no_build{
icon_state = "plating"
@@ -77293,6 +77942,18 @@
icon_state = "plate"
},
/area/almayer/hallways/hangar)
+"wqm" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/obj/structure/machinery/computer/working_joe{
+ dir = 8;
+ pixel_x = 29
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"wqr" = (
/obj/structure/sign/safety/terminal{
pixel_x = 7;
@@ -77312,6 +77973,15 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hallways/lower/starboard_aft_hallway)
+"wqR" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
+/obj/structure/machinery/camera/autoname/almayer/containment/ares{
+ dir = 8;
+ c_tag = "AI Core - Records";
+ autoname = 0
+ },
+/turf/open/floor/almayer/aicore/no_build,
+/area/almayer/command/airoom)
"wqW" = (
/obj/structure/closet/secure_closet/CMO,
/obj/structure/machinery/light{
@@ -77899,6 +78569,14 @@
icon_state = "red"
},
/area/almayer/shipboard/brig/lobby)
+"wBj" = (
+/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{
+ dir = 1
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"wBw" = (
/obj/structure/pipes/vents/pump,
/obj/structure/machinery/status_display{
@@ -78292,6 +78970,12 @@
icon_state = "kitchen"
},
/area/almayer/living/grunt_rnr)
+"wIO" = (
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 8
+ },
+/area/almayer/command/aist_office)
"wIQ" = (
/turf/open/floor/almayer{
dir = 4;
@@ -78649,6 +79333,12 @@
icon_state = "redcorner"
},
/area/almayer/shipboard/brig/processing)
+"wNv" = (
+/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"wNz" = (
/obj/structure/stairs,
/obj/effect/projector{
@@ -79684,6 +80374,18 @@
icon_state = "plate"
},
/area/almayer/maint/upper/u_m_s)
+"xfZ" = (
+/obj/structure/machinery/power/apc/almayer/hardened{
+ cell_type = /obj/item/cell/hyper;
+ dir = 1
+ },
+/obj/effect/landmark/start/aist,
+/obj/effect/landmark/late_join/aist,
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_silver";
+ dir = 1
+ },
+/area/almayer/command/aist_office)
"xgh" = (
/obj/structure/pipes/vents/scrubber{
dir = 4
@@ -79782,6 +80484,29 @@
icon_state = "mono"
},
/area/almayer/lifeboat_pumps/south1)
+"xhq" = (
+/obj/structure/ladder/fragile_almayer{
+ height = 2;
+ id = "aist"
+ },
+/obj/structure/sign/safety/ladder{
+ pixel_x = 8;
+ pixel_y = 24
+ },
+/obj/structure/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/machinery/door_control{
+ id = "ARES AIST Ladder 2";
+ name = "Access Shutters";
+ req_one_access_txt = "31;92";
+ pixel_y = -24;
+ indestructible = 1
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/almayer/maint/hull/upper/u_m_s)
"xhx" = (
/obj/structure/machinery/disposal,
/obj/structure/disposalpipe/trunk{
@@ -80064,7 +80789,8 @@
name = "Working Joe Cryogenics Lockdown";
pixel_x = -24;
pixel_y = -8;
- req_one_access_txt = "91;92"
+ req_one_access_txt = "91;92";
+ indestructible = 1
},
/obj/effect/landmark/late_join/working_joe,
/obj/effect/landmark/start/working_joe,
@@ -80533,7 +81259,8 @@
name = "ARES Core Lockdown";
pixel_x = 24;
pixel_y = 8;
- req_one_access_txt = "90;91;92"
+ req_one_access_txt = "90;91;92";
+ indestructible = 1
},
/obj/effect/step_trigger/clone_cleaner,
/turf/open/floor/almayer/aicore/no_build{
@@ -81010,6 +81737,9 @@
icon_state = "orangecorner"
},
/area/almayer/hallways/upper/aft_hallway)
+"xCV" = (
+/turf/closed/wall/almayer/reinforced/temphull,
+/area/almayer/living/chapel)
"xDe" = (
/obj/effect/projector{
name = "Almayer_Down4";
@@ -82466,6 +83196,27 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/almayer/squads/delta)
+"ycg" = (
+/obj/structure/stairs{
+ icon_state = "ramptop"
+ },
+/obj/effect/projector{
+ name = "Almayer_AresUp";
+ vector_x = 3;
+ vector_y = 1
+ },
+/obj/structure/machinery/door_control{
+ id = "ARES AIST";
+ name = "Privacy Shutters";
+ pixel_x = 24;
+ pixel_y = -8;
+ req_one_access_txt = "31;92";
+ indestructible = 1
+ },
+/turf/open/floor/almayer/aicore/glowing/no_build{
+ icon_state = "w_ai_plates"
+ },
+/area/almayer/command/aist_office)
"ycj" = (
/obj/structure/machinery/medical_pod/sleeper{
dir = 8
@@ -82690,6 +83441,28 @@
},
/turf/open/floor/almayer,
/area/almayer/hallways/lower/port_fore_hallway)
+"yfB" = (
+/obj/structure/machinery/door/airlock/almayer/maint/reinforced{
+ dir = 1;
+ req_one_access = null;
+ req_one_access_txt = "31;92";
+ no_panel = 1;
+ unslashable = 1;
+ unacidable = 1;
+ indestructible = 1;
+ not_weldable = 1;
+ damage_cap = 3000
+ },
+/obj/structure/machinery/door/poddoor/shutters/almayer/uniform_vendors/antitheft{
+ id = "ARES AIST Ladder";
+ req_level = 3;
+ name = "Secure Access Shutters";
+ desc = "Secure Access shutters, they're reinforced against entry attempts."
+ },
+/turf/open/floor/almayer/aicore/no_build{
+ icon_state = "w_ai_floor1"
+ },
+/area/almayer/command/aist_office)
"yfG" = (
/obj/effect/decal/warning_stripes{
icon_state = "S"
@@ -82845,7 +83618,8 @@
},
/area/almayer/maint/hull/lower/l_m_s)
"yit" = (
-/obj/structure/pipes/vents/pump/no_boom{
+/obj/structure/pipes/vents/pump/no_boom/gas{
+ vent_tag = "Records";
dir = 1
},
/turf/open/floor/almayer/aicore/no_build,
@@ -116585,9 +117359,9 @@ aaa
vHn
cGd
moK
-cGd
-cGd
-aNi
+lNN
+lNN
+xCV
aNi
bWr
aNi
@@ -116788,9 +117562,9 @@ aaf
vHn
ejV
hoT
-hoT
-vyh
-aNi
+lNN
+xhq
+xCV
cYT
aNm
cYT
@@ -116991,9 +117765,9 @@ aag
vHn
dGg
tob
-hoT
-tob
-aNi
+lNN
+rTb
+xCV
aZe
aNm
aNm
@@ -117194,8 +117968,8 @@ aag
vHn
oSG
tob
-tob
-tob
+lso
+kcY
aNi
aZr
aNm
@@ -120674,7 +121448,7 @@ mTo
tCD
tCD
tCD
-mTo
+mPb
wyE
imM
dKD
@@ -121281,7 +122055,7 @@ isC
isC
tFe
xQV
-xQV
+vDv
rNF
aqU
qjF
@@ -136358,21 +137132,21 @@ aKQ
aaa
aaa
aab
-aaa
-aaa
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+aab
+aab
+aab
+aak
+aak
+aak
+aak
+aak
+aak
+aak
+aak
+aak
+aak
+aak
+aak
bdH
bdH
bdH
@@ -136560,7 +137334,7 @@ aaa
aKQ
aaa
aaa
-aab
+aaa
aaa
bdH
bdH
@@ -136575,7 +137349,7 @@ bdH
bdH
bdH
bdH
-bdH
+aak
bdH
bdH
bdH
@@ -136763,7 +137537,7 @@ aaa
aKQ
aaa
aaa
-aab
+aaa
aaa
bdH
bdH
@@ -136778,7 +137552,7 @@ bdH
bdH
bdH
bdH
-bdH
+aak
bdH
aaa
aaa
@@ -136965,23 +137739,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -137168,23 +137942,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -137371,23 +138145,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+isg
+iPx
+dHi
+qpq
+ive
+wIO
+jvI
+dHi
+fFc
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -137574,23 +138348,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+xfZ
+tsK
+wNv
+rTQ
+wNv
+gDB
+whC
+hJR
+fFc
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -137777,23 +138551,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+eEU
+sYp
+ejS
+qpq
+tLY
+wqm
+qGK
+ltf
+fFc
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -137980,23 +138754,23 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aaa
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+spk
+wBj
+fEN
+qpq
+jPi
+kQp
+kQp
+qoZ
+fFc
+udd
+udd
bdH
bdH
bdH
+aak
bdH
aaa
aaa
@@ -138183,22 +138957,22 @@ aaa
aaa
aKQ
aaa
-aaa
-aab
-aab
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
-aak
+udd
+fFc
+vjY
+bjM
+ejS
+qpq
+gvS
+mLd
+mLd
+hJR
+fFc
+udd
+udd
+bdH
+bdH
+bdH
aak
bdH
aaa
@@ -138386,19 +139160,19 @@ bdH
bdH
aKQ
bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+udd
+fFc
+hyx
+eDL
+wNv
+rTQ
+wNv
+rvQ
+fHp
+gXI
+fFc
+fFc
+fFc
bdH
bdH
bdH
@@ -138589,19 +139363,19 @@ bdH
bdH
aKQ
bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+oYf
+whC
+qbK
+vEk
+yfB
+qzE
+fFc
bdH
bdH
bdH
@@ -138792,19 +139566,19 @@ bdH
bdH
aKQ
bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
-bdH
+fFc
+edc
+cbS
+bmy
+ycg
+adb
+nGP
+kRp
+lLM
+uGA
+fFc
+fFc
+fFc
bdH
bdH
bdH
@@ -138995,19 +139769,19 @@ lmz
lmz
lmz
lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+fFc
+udd
+udd
bdH
bdH
bdH
@@ -139196,13 +139970,13 @@ lmz
lmz
lmz
lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
+daz
+daz
+daz
+daz
+daz
+daz
+daz
lmz
lmz
lmz
@@ -139399,13 +140173,13 @@ lmz
lmz
lmz
lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
-lmz
+daz
+rzS
+cnQ
+cnQ
+nEI
+byf
+daz
lmz
lmz
lmz
@@ -139603,10 +140377,10 @@ lmz
lmz
daz
daz
+fXq
daz
-daz
-daz
-daz
+wnh
+wnh
daz
daz
daz
@@ -139806,12 +140580,12 @@ lmz
lmz
daz
vhe
-fEN
+cLs
cqm
gTH
qit
ebN
-cxc
+qQS
gwn
pfT
jYR
@@ -140212,7 +140986,7 @@ tte
hvw
auf
pmV
-xDC
+wqR
xDC
dIn
rby
@@ -140613,7 +141387,7 @@ eKJ
yaZ
ffE
hZj
-clw
+ekg
daz
daz
daz
@@ -140622,8 +141396,8 @@ ebN
ebN
roH
ebN
-ebN
-ebN
+daz
+daz
daz
wnh
wnh
@@ -141425,7 +142199,7 @@ eKJ
yaZ
ffE
hZj
-clw
+tBh
daz
daz
daz
@@ -141434,8 +142208,8 @@ ebN
ebN
gXs
ebN
-ebN
-ebN
+daz
+daz
daz
wnh
wnh
@@ -141636,9 +142410,9 @@ ebN
ebN
gbg
uVv
-yit
+lFq
ebN
-cxc
+qQS
kBy
kBy
gfu
diff --git a/tgui/packages/tgui/interfaces/AresAdmin.js b/tgui/packages/tgui/interfaces/AresAdmin.js
index 4f19cf452b17..adef1fceb2e2 100644
--- a/tgui/packages/tgui/interfaces/AresAdmin.js
+++ b/tgui/packages/tgui/interfaces/AresAdmin.js
@@ -18,11 +18,23 @@ const PAGES = {
'security': () => Security,
'requisitions': () => Requisitions,
'emergency': () => Emergency,
+ 'tech_log': () => TechLogs,
+ 'core_security': () => CoreSec,
'admin_access_log': () => AdminAccessLogs,
'access_management': () => AccessManagement,
'maintenance_management': () => MaintManagement,
};
+const { data } = useBackend();
+const { is_pda } = data;
+let remotelock = !is_pda;
+let remotetip = 'You cannot do this via remote console.';
+let deletetip = remotetip;
+if (!remotelock) {
+ remotetip = '';
+ deletetip = 'Delete Record';
+}
+
export const AresAdmin = (props, context) => {
const { data } = useBackend(context);
const { current_menu, sudo } = data;
@@ -255,6 +267,18 @@ const MainMenu = (props, context) => {
onClick={() => act('page_requisitions')}
/>
+
+
@@ -311,13 +335,14 @@ const MainMenu = (props, context) => {
)}
@@ -325,36 +350,39 @@ const MainMenu = (props, context) => {
)}
-
-
- Remote Admin
-
-
-
-
+ {remotelock && (
+
+
+ Remote Admin
+
+
+
+
+ )}
ARES Actions
@@ -474,8 +502,9 @@ const AnnouncementLogs = (props, context) => {
act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
/>
@@ -571,8 +600,9 @@ const BioscanLogs = (props, context) => {
act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
/>
@@ -672,8 +702,9 @@ const BombardmentLogs = (props, context) => {
act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
/>
@@ -1315,6 +1346,8 @@ const FlightLogs = (props, context) => {
{logged_in}, {access_text}
+
+ Remote Admin: {admin_login}
{
act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
/>
@@ -1459,8 +1492,9 @@ const Security = (props, context) => {
act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
/>
@@ -1473,8 +1507,80 @@ const Security = (props, context) => {
const Emergency = (props, context) => {
const { data, act } = useBackend(context);
- const { logged_in, access_text, last_page, current_menu, admin_login } = data;
+ const {
+ logged_in,
+ access_text,
+ last_page,
+ current_menu,
+ admin_login,
+ alert_level,
+ worldtime,
+ distresstimelock,
+ distresstime,
+ quarterstime,
+ evac_status,
+ mission_failed,
+ nuketimelock,
+ nuke_available,
+ } = data;
+
+ const minimumEvacTime = worldtime > distresstimelock;
+ const distressCooldown = worldtime < distresstime;
+ const quartersCooldown = worldtime < quarterstime;
+ const canQuarters = !quartersCooldown;
+ let quarters_reason = 'Call for General Quarters.';
+ if (quartersCooldown) {
+ quarters_reason =
+ 'It has not been long enough since the last General Quarters call.';
+ }
+ const canDistress =
+ alert_level === 2 && !distressCooldown && minimumEvacTime && !remotelock;
+ let distress_reason = 'Launch a Distress Beacon.';
+ if (remotelock) {
+ distress_reason = remotetip;
+ } else if (alert_level === 3) {
+ distress_reason = 'Self-destruct in progress. Beacon disabled.';
+ } else if (alert_level !== 2) {
+ distress_reason = 'Ship is not under an active emergency.';
+ } else if (distressCooldown) {
+ distress_reason = 'Beacon is currently on cooldown.';
+ } else if (!minimumEvacTime) {
+ distress_reason = "It's too early to launch a distress beacon.";
+ }
+
+ const canEvac = (evac_status === 0, alert_level >= 2) && !remotelock;
+ let evac_reason = 'Begin evacuation procedures. Authorise Lifeboats.';
+ if (remotelock) {
+ evac_reason = remotetip;
+ } else if (alert_level !== 2) {
+ evac_reason = 'Ship is not under an active emergency.';
+ } else if (evac_status === 1) {
+ evac_reason = 'Evacuation initiating.';
+ } else if (evac_status === 2) {
+ evac_reason = 'Evacuation in progress.';
+ } else if (evac_status === 3) {
+ evac_reason = 'Evacuation complete.';
+ }
+ const minimumNukeTime = worldtime > nuketimelock;
+ const canNuke =
+ (nuke_available, !mission_failed, evac_reason === 0, minimumNukeTime) &&
+ !remotelock;
+ let nuke_reason =
+ 'Request a nuclear device to be authorized by USCM High Command.';
+ if (remotelock) {
+ nuke_reason = remotetip;
+ } else if (!nuke_available) {
+ nuke_reason =
+ 'No nuclear ordnance is available during this operation, or one has already been provided.';
+ } else if (mission_failed) {
+ nuke_reason =
+ 'You have already lost the objective, you cannot use a nuclear device aboard the ship!';
+ } else if (evac_status !== 0) {
+ nuke_reason = 'You cannot use a nuclear device while abandoning the ship!';
+ } else if (!minimumNukeTime) {
+ nuke_reason = 'It is too soon to use a nuclear device. Keep fighting!';
+ }
return (
<>
@@ -1518,7 +1624,6 @@ const Emergency = (props, context) => {
{
p="1rem"
mt="5rem"
bold
- disabled={access_text}
+ onClick={() => act('general_quarters')}
+ disabled={!canQuarters}
+ tooltip={quarters_reason}
/>
{
p="1rem"
mt="5rem"
bold
- disabled={access_text}
+ onClick={() => act('evacuation_start')}
+ disabled={!canEvac}
+ tooltip={evac_reason}
/>
{
p="1rem"
mt="5rem"
bold
- disabled={access_text}
+ onClick={() => act('distress')}
+ disabled={!canDistress}
+ tooltip={distress_reason}
/>
{
p="1rem"
mt="5rem"
bold
- disabled={access_text}
+ onClick={() => act('nuclearbomb')}
+ disabled={!canNuke}
+ tooltip={nuke_reason}
/>
>
);
};
+const TechLogs = (props, context) => {
+ const { data, act } = useBackend(context);
+ const {
+ logged_in,
+ access_text,
+ last_page,
+ current_menu,
+ records_tech,
+ admin_login,
+ } = data;
+
+ return (
+ <>
+
+
+
+
+
+
+ {logged_in}, {access_text}
+
+ Remote Admin: {admin_login}
+
+
+ act('logout')}
+ />
+
+
+
+
+ Tech Control Logs
+ {!!records_tech.length && (
+
+
+ Time
+
+
+ Authenticator
+
+
+ Details
+
+
+ )}
+ {records_tech.map((record, i) => {
+ return (
+
+
+ {record.time}
+
+
+ {record.user}
+
+ {!!record.tier_changer && (
+
+ {record.details}
+
+ )}
+ {!record.tier_changer && (
+
+ {record.details}
+
+ )}
+
+
+ act('delete_record', { record: record.ref })}
+ disabled={remotelock}
+ tooltip={deletetip}
+ />
+
+
+ );
+ })}
+
+ >
+ );
+};
+
+const CoreSec = (props) => {
+ const { data, act } = useBackend();
+ const {
+ logged_in,
+ access_text,
+ access_level,
+ last_page,
+ current_menu,
+ security_vents,
+ } = data;
+
+ return (
+ <>
+
+
+
+ act('go_back')}
+ disabled={last_page === current_menu}
+ />
+ act('home')}
+ />
+
+
+
+ {logged_in}, {access_text}
+
+ Remote Admin: {admin_login}
+
+
+ act('logout')}
+ />
+
+
+
+
+ Core Security Protocols
+
+
+ Nerve Gas Release
+ {security_vents.map((vent, i) => {
+ return (
+ act('trigger_vent', { vent: vent.ref })}
+ />
+ );
+ })}
+
+ >
+ );
+};
+
// -------------------------------------------------------------------- //
// Anything below this line is exclusive to the Admin Remote Interface.
// -------------------------------------------------------------------- //
diff --git a/tgui/packages/tgui/interfaces/AresInterface.jsx b/tgui/packages/tgui/interfaces/AresInterface.jsx
index 79ad85044ec1..a338dca8a95e 100644
--- a/tgui/packages/tgui/interfaces/AresInterface.jsx
+++ b/tgui/packages/tgui/interfaces/AresInterface.jsx
@@ -22,6 +22,8 @@ const PAGES = {
'security': () => Security,
'requisitions': () => Requisitions,
'emergency': () => Emergency,
+ 'tech_log': () => TechLogs,
+ 'core_security': () => CoreSec,
};
export const AresInterface = (props) => {
@@ -256,7 +258,7 @@ const MainMenu = (props) => {
{
onClick={() => act('page_requisitions')}
/>
+
+ act('page_tech')}
+ />
+
)}
{access_level >= 6 && (
@@ -283,6 +297,19 @@ const MainMenu = (props) => {
onClick={() => act('page_access')}
/>
+
+ act('page_core_sec')}
+ />
+
)}
{access_level >= 9 && (
@@ -1545,3 +1572,187 @@ const Emergency = (props) => {
>
);
};
+
+const TechLogs = (props, context) => {
+ const { data, act } = useBackend(context);
+ const {
+ logged_in,
+ access_text,
+ last_page,
+ current_menu,
+ records_tech,
+ access_level,
+ } = data;
+
+ return (
+ <>
+
+
+
+ act('go_back')}
+ disabled={last_page === current_menu}
+ />
+ act('home')}
+ />
+
+
+
+ {logged_in}, {access_text}
+
+
+ act('logout')}
+ />
+
+
+
+
+ Tech Control Logs
+ {!!records_tech.length && (
+
+
+ Time
+
+
+ Authenticator
+
+
+ Details
+
+
+ )}
+ {records_tech.map((record, i) => {
+ return (
+
+
+ {record.time}
+
+
+ {record.user}
+
+ {!!record.tier_changer && (
+
+ {record.details}
+
+ )}
+ {!record.tier_changer && (
+
+ {record.details}
+
+ )}
+
+
+ act('delete_record', { record: record.ref })}
+ />
+
+
+ );
+ })}
+
+ >
+ );
+};
+
+const CoreSec = (props) => {
+ const { data, act } = useBackend();
+ const {
+ logged_in,
+ access_text,
+ access_level,
+ last_page,
+ current_menu,
+ security_vents,
+ } = data;
+
+ return (
+ <>
+
+
+
+ act('go_back')}
+ disabled={last_page === current_menu}
+ />
+ act('home')}
+ />
+
+
+
+ {logged_in}, {access_text}
+
+
+ act('logout')}
+ />
+
+
+
+
+ Core Security Protocols
+
+
+ Nerve Gas Release
+ {security_vents.map((vent, i) => {
+ return (
+ act('trigger_vent', { vent: vent.ref })}
+ />
+ );
+ })}
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.jsx b/tgui/packages/tgui/interfaces/WorkingJoe.jsx
index 4864631aa152..0d9e47b1757a 100644
--- a/tgui/packages/tgui/interfaces/WorkingJoe.jsx
+++ b/tgui/packages/tgui/interfaces/WorkingJoe.jsx
@@ -12,6 +12,7 @@ const PAGES = {
'access_requests': () => AccessRequests,
'access_tickets': () => AccessTickets,
'id_access': () => AccessID,
+ 'core_security_gas': () => CoreSecGas,
};
export const WorkingJoe = (props) => {
const { data } = useBackend();
@@ -235,6 +236,26 @@ const MainMenu = (props) => {
)}
+ {access_level >= 5 && (
+
+ Core Security Protocols
+
+
+ act('page_core_gas')}
+ />
+
+
+
+ )}
>
);
};
@@ -963,3 +984,70 @@ const AccessTickets = (props) => {
>
);
};
+
+const CoreSecGas = (props) => {
+ const { data, act } = useBackend();
+ const {
+ logged_in,
+ access_text,
+ access_level,
+ last_page,
+ current_menu,
+ security_vents,
+ } = data;
+
+ return (
+ <>
+
+
+
+ act('go_back')}
+ disabled={last_page === current_menu}
+ />
+ act('home')}
+ />
+
+
+
+ {logged_in}, {access_text}
+
+
+ act('logout')}
+ />
+
+
+
+
+ Nerve Gas Release
+ {security_vents.map((vent, i) => {
+ return (
+ act('trigger_vent', { vent: vent.ref })}
+ />
+ );
+ })}
+
+ >
+ );
+};
|