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')} /> + +