diff --git a/code/__DEFINES/ARES.dm b/code/__DEFINES/ARES.dm new file mode 100644 index 000000000000..05a42738c499 --- /dev/null +++ b/code/__DEFINES/ARES.dm @@ -0,0 +1,54 @@ +/// Generic access for 1:1 conversations with ARES and unrestricted commands. +#define ARES_ACCESS_BASIC 0 +/// Secure Access, can read ARES Announcements and Bioscans. +#define ARES_ACCESS_COMMAND 1 +#define ARES_ACCESS_JOE 2 +/// CL, can read Apollo Log and also Delete Announcements. +#define ARES_ACCESS_CORPORATE 3 +/// Senior Command, can Delete Bioscans. +#define ARES_ACCESS_SENIOR 4 +/// Synth, CE & Commanding Officer, can read the access log. +#define ARES_ACCESS_CE 5 +#define ARES_ACCESS_SYNTH 6 +#define ARES_ACCESS_CO 7 +/// High Command, can read the deletion log. +#define ARES_ACCESS_HIGH 8 +#define ARES_ACCESS_WY_COMMAND 9 +/// Debugging. Allows me to view everything without using a high command rank. Unlikely to stay in a full merge. +#define ARES_ACCESS_DEBUG 10 + +#define ARES_RECORD_ANNOUNCE "Announcement Record" +#define ARES_RECORD_ANTIAIR "AntiAir Control Log" +#define ARES_RECORD_ASRS "Requisition Record" +#define ARES_RECORD_BIOSCAN "Bioscan Record" +#define ARES_RECORD_BOMB "Orbital Bombardment Record" +#define ARES_RECORD_DELETED "Deleted Record" +#define ARES_RECORD_SECURITY "Security Update" +#define ARES_RECORD_MAINTENANCE "Maintenance Ticket" +#define ARES_RECORD_ACCESS "Access Ticket" + +/// Not by ARES logged through marine_announcement() +#define ARES_LOG_NONE 0 +/// Logged with all announcements +#define ARES_LOG_MAIN 1 +/// Logged in the security updates +#define ARES_LOG_SECURITY 2 + +/// Access levels specifically for Working Joe management console +#define APOLLO_ACCESS_REQUEST 0 +#define APOLLO_ACCESS_REPORTER 1 +#define APOLLO_ACCESS_TEMP 2 +#define APOLLO_ACCESS_AUTHED 3 +#define APOLLO_ACCESS_JOE 4 +#define APOLLO_ACCESS_DEBUG 5 + +/// Ticket statuses, both for Access and Maintenance +#define TICKET_PENDING "pending" +#define TICKET_ASSIGNED "assigned" +#define TICKET_REJECTED "rejected" +#define TICKET_CANCELLED "cancelled" +#define TICKET_COMPLETED "complete" + +/// Cooldowns +#define COOLDOWN_ARES_SENSOR 60 SECONDS +#define COOLDOWN_ARES_ACCESS_CONTROL 20 SECONDS diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 100a45ff6a94..3116d7f19555 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -106,6 +106,7 @@ block( \ #define SOUND_REBOOT (1<<5) #define SOUND_ADMIN_MEME (1<<6) #define SOUND_ADMIN_ATMOSPHERIC (1<<7) +#define SOUND_ARES_MESSAGE (1<<8) //toggles_chat #define CHAT_OOC (1<<0) diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 8b9fe898c72c..a40675e0560e 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -43,6 +43,14 @@ most of them are tied into map-placed objects. This should be reworked in the fu #define ACCESS_MARINE_SYNTH 36 +// AI Core Accesses +/// Used in temporary passes +#define ACCESS_MARINE_AI_TEMP 90 +/// Used as dedicated access to ARES Core. +#define ACCESS_MARINE_AI 91 +/// Used to access Maintenance Protocols on ARES Interface. +#define ACCESS_ARES_DEBUG 92 + //Surface access levels #define ACCESS_CIVILIAN_PUBLIC 100 #define ACCESS_CIVILIAN_LOGISTICS 101 diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 95b98646c616..9702d51004ad 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -48,6 +48,8 @@ var/global/list/note_categories = list("Admin", "Merit", "Commanding Officer", " #define CC_MARK(user) "(MARK)" #define CC_REPLY(user) "(RPLY)" #define OBSERVER_JMP(observer, atom) atom ? "(JMP)" : "" +#define ARES_MARK(user) "(MARK)" +#define ARES_REPLY(user, ref) "(RPLY)" /atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref) var/turf/T = get_turf(src) diff --git a/code/__DEFINES/camera.dm b/code/__DEFINES/camera.dm index 58b1b8acbd84..9d797b964d61 100644 --- a/code/__DEFINES/camera.dm +++ b/code/__DEFINES/camera.dm @@ -6,6 +6,7 @@ #define CAMERA_NET_ALAMO "Alamo" #define CAMERA_NET_NORMANDY "Normandy" #define CAMERA_NET_COLONY "Colony" +#define CAMERA_NET_ARES "ARES" #define CAMERA_NET_MILITARY "Military" #define CAMERA_NET_OVERWATCH "Overwatch" diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index 8cac90defb26..557f8e6a3f68 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -12,7 +12,7 @@ #define LANGUAGE_XENOMORPH "Xenomorph" #define LANGUAGE_HIVEMIND "Hivemind" -#define LANGUAGE_APOLLO "Apollo Link" +#define LANGUAGE_APOLLO "APOLLO Link" #define LANGUAGE_TELEPATH "Telepath Implant" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b2936248c3ba..bed2ceeced7d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -44,6 +44,8 @@ #define AREA_ALLOW_XENO_JOIN (1<<2) /// Flags the area as a containment area #define AREA_CONTAINMENT (1<<3) +/// Flags the area as permanently unweedable. Still requires is_resin_allowed = FALSE +#define AREA_UNWEEDABLE (1<<4) /// Default number of ticks for do_after #define DA_DEFAULT_NUM_TICKS 5 diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index 1f3c4ad22bf1..ab58df78abcc 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -14,6 +14,7 @@ #define EVACUATION_STATUS_IN_PROGRESS 2 #define EVACUATION_STATUS_COMPLETE 3 +#define NUCLEAR_TIME_LOCK 90 MINUTES #define NUKE_EXPLOSION_INACTIVE 0 #define NUKE_EXPLOSION_ACTIVE 1 #define NUKE_EXPLOSION_IN_PROGRESS 2 diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 7d16e437087b..121d1e305e43 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -328,6 +328,7 @@ DEFINE_BITFIELD(flags_area, list( "AREA_NOTUNNEL" = AREA_NOTUNNEL, "AREA_ALLOW_XENO_JOIN" = AREA_ALLOW_XENO_JOIN, "AREA_CONTAINMENT" = AREA_CONTAINMENT, + "ARES_UNWEEDABLE" = AREA_UNWEEDABLE, )) DEFINE_BITFIELD(disabilities, list( diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index c4b1000bb07b..2a305dcc4342 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -191,7 +191,7 @@ message_admins("Distress beacon: '[name]' activated [src.hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.") if(announce) - marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg') + marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY) addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS) @@ -207,7 +207,7 @@ candidates = list() if(announce) - marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon") + marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon", logging = ARES_LOG_SECURITY) return //We've got enough! @@ -236,8 +236,8 @@ if(I.current) to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!")) - if(announce_dispatch_message) - marine_announcement(dispatch_message, "Distress Beacon", 'sound/AI/distressreceived.ogg') //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT + if(announce) + marine_announcement(dispatch_message, "Distress Beacon", 'sound/AI/distressreceived.ogg', logging = ARES_LOG_SECURITY) //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT message_admins("Distress beacon: [src.name] finalized, setting up candidates.") diff --git a/code/datums/paygrades/paygrade.dm b/code/datums/paygrades/paygrade.dm index b15071c882b7..bb0a3aa84bfa 100644 --- a/code/datums/paygrades/paygrade.dm +++ b/code/datums/paygrades/paygrade.dm @@ -25,6 +25,7 @@ GLOBAL_LIST_INIT_TYPED(paygrades, /datum/paygrade, setup_paygrades()) .[pg_id] = new PG GLOBAL_LIST_INIT(highcom_paygrades, list( + "PvI", "NO7", "MO7", "NO8", @@ -52,3 +53,9 @@ GLOBAL_LIST_INIT(co_paygrades, list( "MO5", "MO4" )) + +GLOBAL_LIST_INIT(wy_paygrades, list( + "WYC8", + "WYC9", + "WYC10" +)) diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index 5ee8c573d0e3..323fb526d527 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -30,7 +30,7 @@ //general marine announcement -/proc/marine_announcement(message, title = COMMAND_ANNOUNCE, sound_to_play = sound('sound/misc/notice2.ogg'), faction_to_display = FACTION_MARINE, add_PMCs = TRUE, signature) +/proc/marine_announcement(message, title = COMMAND_ANNOUNCE, sound_to_play = sound('sound/misc/notice2.ogg'), faction_to_display = FACTION_MARINE, add_PMCs = TRUE, signature, logging = ARES_LOG_MAIN) var/list/targets = GLOB.human_mob_list + GLOB.dead_mob_list if(faction_to_display == FACTION_MARINE) for(var/mob/M in targets) @@ -45,6 +45,14 @@ if((H.faction != faction_to_display && !add_PMCs) || (H.faction != faction_to_display && add_PMCs && !(H.faction in FACTION_LIST_WY)) && !(faction_to_display in H.faction_group)) //faction checks targets.Remove(H) + var/datum/ares_link/link = GLOB.ares_link + if(link.interface && !(link.interface.inoperable())) + switch(logging) + if(ARES_LOG_MAIN) + link.log_ares_announcement(title, message) + if(ARES_LOG_SECURITY) + link.log_ares_security(title, message) + else if(faction_to_display == "Everyone (-Yautja)") for(var/mob/M in targets) if(isobserver(M)) //observers see everything @@ -82,7 +90,7 @@ announcement_helper(message, title, targets, sound_to_play) //AI announcement that uses talking into comms -/proc/ai_announcement(message, sound_to_play = sound('sound/misc/interference.ogg')) +/proc/ai_announcement(message, sound_to_play = sound('sound/misc/interference.ogg'), logging = ARES_LOG_MAIN) for(var/mob/M in (GLOB.human_mob_list + GLOB.dead_mob_list)) if(isobserver(M) || ishuman(M) && is_mainship_level(M.z)) playsound_client(M.client, sound_to_play, M, vol = 45) @@ -90,6 +98,14 @@ for(var/mob/living/silicon/decoy/ship_ai/AI in ai_mob_list) INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon/decoy/ship_ai, say), message) + var/datum/ares_link/link = GLOB.ares_link + if(link.interface && !(link.interface.inoperable())) + switch(logging) + if(ARES_LOG_MAIN) + link.log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) + if(ARES_LOG_SECURITY) + link.log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) + /proc/ai_silent_announcement(message, channel_prefix, bypass_cooldown = FALSE) if(!message) return @@ -119,10 +135,14 @@ if(!isnull(signature)) message += "

Signed by,
[signature]
" + var/datum/ares_link/link = GLOB.ares_link + if(link.interface && !(link.interface.inoperable())) + link.log_ares_announcement(title, message) announcement_helper(message, title, targets, sound_to_play) + //Subtype of AI shipside announcement for "All Hands On Deck" alerts (COs and SEAs joining the game) -/proc/all_hands_on_deck(message, title = MAIN_AI_SYSTEM, sound_to_play = sound('sound/misc/sound_misc_boatswain.ogg'), signature) +/proc/all_hands_on_deck(message, title = MAIN_AI_SYSTEM, sound_to_play = sound('sound/misc/sound_misc_boatswain.ogg')) var/list/targets = GLOB.human_mob_list + GLOB.dead_mob_list for(var/mob/T in targets) if(isobserver(T)) @@ -130,6 +150,10 @@ if(!ishuman(T) || isyautja(T) || !is_mainship_level(T.z)) targets.Remove(T) + var/datum/ares_link/link = GLOB.ares_link + if(link.interface && !(link.interface.inoperable())) + link.log_ares_announcement("[title] Shipwide Update", message) + announcement_helper(message, title, targets, sound_to_play) //the announcement proc that handles announcing for each mob in targets list diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index a23f84323301..d19cbd3a6dec 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -77,17 +77,20 @@ fake_zlevel = 1 // upperdeck soundscape_playlist = SCAPE_PL_ARES soundscape_interval = 120 - flags_area = AREA_NOTUNNEL + flags_area = AREA_NOTUNNEL|AREA_UNWEEDABLE + can_build_special = FALSE + is_resin_allowed = FALSE + resin_construction_allowed = FALSE /area/almayer/command/securestorage name = "\improper Secure Storage" icon_state = "corporatespace" - fake_zlevel = 1 // upperdeck + fake_zlevel = 2 // lowerdeck /area/almayer/command/computerlab name = "\improper Computer Lab" icon_state = "ceroom" - fake_zlevel = 1 // upperdeck + fake_zlevel = 2 // lowerdeck /area/almayer/command/telecomms name = "\improper Telecommunications" @@ -181,6 +184,11 @@ icon_state = "astronavigation" fake_zlevel = 2 // lowerdeck +/area/almayer/shipboard/panic + name = "\improper Hangar Panic Room" + icon_state = "brig" + fake_zlevel = 2 // lowerdeck + /area/almayer/shipboard/starboard_missiles name = "\improper Missile Tubes Starboard" icon_state = "starboardmissile" diff --git a/code/game/bioscans.dm b/code/game/bioscans.dm index 474786e1ffae..55422ad3b878 100644 --- a/code/game/bioscans.dm +++ b/code/game/bioscans.dm @@ -107,7 +107,12 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) /// This will do something after Project ARES. /datum/bioscan_data/proc/can_ares_bioscan() - return TRUE + var/datum/ares_link/link = GLOB.ares_link + if(!istype(link)) + return FALSE + if(link.p_bioscan && !link.p_bioscan.inoperable()) + return TRUE + return FALSE /// The announcement to all Humans. Slightly off for the planet and elsewhere, accurate for the ship. /datum/bioscan_data/proc/ares_bioscan(forced = FALSE, variance = 2) @@ -120,7 +125,11 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan complete.\n\nSensors indicate [xenos_on_ship_uncontained ? "[xenos_on_ship_uncontained]" : "no"] unknown lifeform signature[!xenos_on_ship_uncontained || xenos_on_ship_uncontained > 1 ? "s":""] present on the ship[xenos_on_ship_uncontained && xenos_ship_location ? ", including one in [xenos_ship_location]," : ""] and [fake_xenos_on_planet ? "approximately [fake_xenos_on_planet]" : "no"] signature[!fake_xenos_on_planet || fake_xenos_on_planet > 1 ? "s":""] located elsewhere[fake_xenos_on_planet && xenos_planet_location ? ", including one in [xenos_planet_location]":""]." - marine_announcement(input, name, 'sound/AI/bioscan.ogg') + + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_bioscan(name, input) + if(forced || (link.p_interface && !link.p_interface.inoperable())) + marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) /// The announcement to all Xenos. Slightly off for the human ship, accurate otherwise. /datum/bioscan_data/proc/qm_bioscan(variance = 2) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index c4a3070dea2d..55eee2e521bf 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -102,7 +102,11 @@ ///Includes restricted accesses /proc/get_all_marine_access() - return list(ACCESS_MARINE_CO) + get_main_marine_access() + return list( + ACCESS_MARINE_CO, + ACCESS_MARINE_AI, + ACCESS_MARINE_AI_TEMP, + ) + get_main_marine_access() ///All Almayer accesses other than the highly restricted ones, such as CO's office. /proc/get_main_marine_access() @@ -256,6 +260,7 @@ if(ACCESS_MARINE_SEA) return "SEA's Office" if(ACCESS_MARINE_KITCHEN) return "Kitchen" if(ACCESS_MARINE_SYNTH) return "Synthetic Storage" + if(ACCESS_MARINE_AI) return "AI Core" /proc/get_weyland_access_desc(A) switch(A) diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm new file mode 100644 index 000000000000..f8a7351d123e --- /dev/null +++ b/code/game/machinery/ARES/ARES.dm @@ -0,0 +1,236 @@ +/obj/structure/machinery/ares + name = "ARES Machinery" + density = TRUE + anchored = TRUE + use_power = USE_POWER_IDLE + idle_power_usage = 600 + icon = 'icons/obj/structures/machinery/ares.dmi' + unslashable = TRUE + unacidable = TRUE + + var/link_id = MAIN_SHIP_DEFAULT_NAME + var/datum/ares_link/link + +/obj/structure/machinery/ares/ex_act(severity) + return + +/obj/structure/machinery/ares/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/ares/Destroy() + delink() + return ..() + +/obj/structure/machinery/ares/update_icon() + ..() + icon_state = initial(icon_state) + // Broken + if(stat & BROKEN) + icon_state += "_broken" + + // Powered + else if(stat & NOPOWER) + icon_state = initial(icon_state) + icon_state += "_off" + +/// Handles linking and de-linking the ARES systems. +/obj/structure/machinery/ares/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(!new_link) + log_debug("Error: link_systems called without a link datum") + if(link && !override) + return FALSE + if(new_link.link_id == link_id) + link = new_link + log_debug("[name] linked to Ares Link [link_id]") + new_link.linked_systems += src + return TRUE + +/obj/structure/machinery/ares/proc/delink() + log_debug("[name] delinked from Ares Link [link.link_id]") + link.linked_systems -= src + link = null + +/obj/structure/machinery/ares/processor + name = "ARES Processor" + desc = "An external processor for ARES, used to process vast amounts of information." + icon_state = "processor" + +/obj/structure/machinery/ares/processor/apollo + name = "ARES Processor (APOLLO)" + desc = "The external component of ARES' APOLLO processor. Primarily responsible for coordinating Working Joes and Maintenance Drones. It definitely wasn't stolen from Seegson." + icon_state = "apollo_processor" + +/obj/structure/machinery/ares/processor/apollo/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + ..() + new_link.p_apollo = src + +/obj/structure/machinery/ares/processor/apollo/delink() + if(link && link.p_apollo == src) + link.p_apollo = null + ..() + +/obj/structure/machinery/ares/processor/interface + name = "ARES Processor (Interface)" + desc = "An external processor for ARES; this one handles core processes for interfacing with the crew, including radio transmissions and broadcasts." + icon_state = "int_processor" + +/obj/structure/machinery/ares/processor/interface/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + ..() + new_link.p_interface = src + +/obj/structure/machinery/ares/processor/interface/delink() + if(link && link.p_interface == src) + link.p_interface = null + ..() + +/obj/structure/machinery/ares/processor/bioscan + name = "ARES Processor (Bioscan)" + desc = "The external component of ARES' Bioscan systems. Without this, the USS Almayer would be incapable of running bioscans!" + icon_state = "bio_processor" + +/obj/structure/machinery/ares/processor/bioscan/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + ..() + new_link.p_bioscan = src + +/obj/structure/machinery/ares/processor/bioscan/delink() + if(link && link.p_bioscan == src) + link.p_bioscan = null + ..() + +/// Central Core +/obj/structure/machinery/ares/cpu + name = "ARES CPU" + desc = "This is ARES' central processor. Made of a casing designed to withstand nuclear blasts, the CPU also contains ARES' blackbox recorder." + icon_state = "CPU" + +/// Memory Substrate, +/obj/structure/machinery/ares/substrate + name = "ARES Substrate" + desc = "The memory substrate of ARES, containing complex protocols and information. Limited capabilities can operate on substrate alone, without the main ARES Unit operational." + icon_state = "substrate" + +// #################### ARES Interface Console ##################### +/obj/structure/machinery/computer/ares_console + name = "ARES Interface" + desc = "A console built to interface with ARES, allowing for 1:1 communication." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + + /// The last person to login. + var/last_login + /// The person pretending to be last_login + var/sudo_holder + /// A record of who logged in and when. + var/list/access_list = list() + + /// The ID used to link all devices. + var/link_id = MAIN_SHIP_DEFAULT_NAME + var/datum/ares_link/link + + /// The current deleted chat log of 1:1 conversations being read. + var/list/deleted_1to1 = list() + + /// Holds all (/datum/ares_record/announcement)s and (/datum/ares_record/security/security_alert)s + var/list/records_announcement = list() + /// Holds all (/datum/ares_record/bioscan)s + var/list/records_bioscan = list() + /// Holds all (/datum/ares_record/bombardment)s + var/list/records_bombardment = list() + /// Holds all (/datum/ares_record/deletion)s + var/list/records_deletion = list() + /// Holds all (/datum/ares_record/talk_log)s + var/list/records_talking = list() + /// Holds all (/datum/ares_record/requisition_log)s + var/list/records_asrs = list() + /// Holds all (/datum/ares_record/security)s and (/datum/ares_record/antiair)s + var/list/records_security = list() + /// Is nuke request usable or not? (Nuke request is not currently coded to work.) + var/nuke_available = FALSE + + + COOLDOWN_DECLARE(ares_distress_cooldown) + COOLDOWN_DECLARE(ares_nuclear_cooldown) + +/obj/structure/machinery/computer/ares_console/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link.link_id == link_id) + new_link.interface = src + link = new_link + log_debug("[name] linked to Ares Link [link_id]") + new_link.linked_systems += src + return TRUE + +/obj/structure/machinery/computer/ares_console/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/ares_console/proc/delink() + if(link && link.interface == src) + link.interface = null + link.linked_systems -= src + link = null + +/obj/structure/machinery/computer/ares_console/Destroy() + delink() + return ..() + +// #################### Working Joe Ticket Console ##################### +/obj/structure/machinery/computer/working_joe + name = "APOLLO Maintenance Controller" + desc = "A console built to facilitate Working Joes and their operation, allowing for simple allocation of resources." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + /// The ID used to link all devices. + var/link_id = MAIN_SHIP_DEFAULT_NAME + var/datum/ares_link/link + var/obj/structure/machinery/ares/processor/interface/processor + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + /// The last person to login. + var/last_login + /// A record of who logged in and when. + var/list/login_list = list() + + + /// If this is used to create AI Core access tickets + var/ticket_console = FALSE + var/obj/item/card/id/authenticator_id + var/ticket_authenticated = FALSE + var/obj/item/card/id/target_id + +/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link.link_id == link_id) + new_link.ticket_computers += src + link = new_link + log_debug("[name] linked to Ares Link [link_id]") + new_link.linked_systems += src + return TRUE + +/obj/structure/machinery/computer/working_joe/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/working_joe/proc/delink() + if(link) + link.ticket_computers -= src + link.linked_systems -= src + link = null + +/obj/structure/machinery/computer/working_joe/Destroy() + delink() + return ..() diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm new file mode 100644 index 000000000000..79c49818595c --- /dev/null +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -0,0 +1,815 @@ +GLOBAL_DATUM_INIT(ares_link, /datum/ares_link, new) + +/datum/ares_link + var/link_id = MAIN_SHIP_DEFAULT_NAME + /// All motion triggers for the link + var/list/linked_alerts = list() + /// All machinery for the link + var/list/linked_systems = list() + var/obj/structure/machinery/ares/processor/interface/p_interface + var/obj/structure/machinery/ares/processor/apollo/p_apollo + var/obj/structure/machinery/ares/processor/bioscan/p_bioscan + var/obj/structure/machinery/computer/ares_console/interface + var/list/obj/structure/machinery/computer/working_joe/ticket_computers = list() + + /// The chat log of the apollo link. Timestamped. + var/list/apollo_log = list() + + /// Working Joe stuff + var/list/tickets_maintenance = list() + var/list/tickets_access = list() + +/datum/ares_link/Destroy() + for(var/obj/structure/machinery/ares/link in linked_systems) + link.delink() + for(var/obj/structure/machinery/computer/ares_console/interface in linked_systems) + interface.delink() + for(var/obj/effect/step_trigger/ares_alert/alert in linked_alerts) + alert.delink() + ..() + + +// ------ ARES Logging Procs ------ // +/proc/log_ares_apollo(speaker, message) + if(!speaker) + speaker = "Unknown" + var/datum/ares_link/link = GLOB.ares_link + if(!link.p_apollo || link.p_apollo.inoperable()) + return + if(!link.p_interface || link.p_interface.inoperable()) + return + link.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") + +/datum/ares_link/proc/log_ares_bioscan(title, input) + if(!p_bioscan || p_bioscan.inoperable() || !interface) + return FALSE + interface.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) + +/datum/ares_link/proc/log_ares_bombardment(mob/living/user, ob_name, coordinates) + interface.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user)) + +/datum/ares_link/proc/log_ares_announcement(title, message) + interface.records_announcement.Add(new /datum/ares_record/announcement(title, message)) + +/datum/ares_link/proc/log_ares_antiair(mob/living/user, details) + interface.records_security.Add(new /datum/ares_record/antiair(details, user)) + +/datum/ares_link/proc/log_ares_requisition(source, details, mob/living/user) + interface.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user)) + +/datum/ares_link/proc/log_ares_security(title, details) + interface.records_security.Add(new /datum/ares_record/security(title, details)) +// ------ End ARES Logging Procs ------ // + +// ------ ARES Interface Procs ------ // +/obj/structure/machinery/computer/proc/get_ares_access(obj/item/card/id/card) + if(ACCESS_ARES_DEBUG in card.access) + return ARES_ACCESS_DEBUG + switch(card.assignment) + if(JOB_WORKING_JOE) + return ARES_ACCESS_JOE + if(JOB_CHIEF_ENGINEER) + return ARES_ACCESS_CE + if(JOB_SYNTH) + return ARES_ACCESS_SYNTH + if(card.paygrade in GLOB.wy_paygrades) + return ARES_ACCESS_WY_COMMAND + if(card.paygrade in GLOB.highcom_paygrades) + return ARES_ACCESS_HIGH + if(card.paygrade in GLOB.co_paygrades) + return ARES_ACCESS_CO + if(ACCESS_MARINE_SENIOR in card.access) + return ARES_ACCESS_SENIOR + if(ACCESS_WY_CORPORATE in card.access) + return ARES_ACCESS_CORPORATE + if(ACCESS_MARINE_COMMAND in card.access) + return ARES_ACCESS_COMMAND + else + return ARES_ACCESS_BASIC + +/obj/structure/machinery/computer/proc/ares_auth_to_text(access_level) + switch(access_level) + if(ARES_ACCESS_BASIC)//0 + return "Authorized" + if(ARES_ACCESS_COMMAND)//1 + return "[MAIN_SHIP_NAME] Command" + if(ARES_ACCESS_JOE)//2 + return "Working Joe" + if(ARES_ACCESS_CORPORATE)//3 + return "Weyland-Yutani" + if(ARES_ACCESS_SENIOR)//4 + return "[MAIN_SHIP_NAME] Senior Command" + if(ARES_ACCESS_CE)//5 + return "Chief Engineer" + if(ARES_ACCESS_SYNTH)//6 + return "USCM Synthetic" + if(ARES_ACCESS_CO)//7 + return "[MAIN_SHIP_NAME] Commanding Officer" + if(ARES_ACCESS_HIGH)//8 + return "USCM High Command" + if(ARES_ACCESS_WY_COMMAND)//9 + return "Weyland-Yutani Directorate" + if(ARES_ACCESS_DEBUG)//10 + return "AI Service Technician" + + +/obj/structure/machinery/computer/ares_console/proc/message_ares(text, mob/Sender, ref) + var/msg = SPAN_STAFF_IC("ARES: [key_name(Sender, 1)] [ARES_MARK(Sender)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] [ADMIN_JMP_USER(Sender)] [ARES_REPLY(Sender, ref)]: [text]") + var/datum/ares_record/talk_log/conversation = locate(ref) + conversation.conversation += "[last_login] at [worldtime2text()], '[text]'" + for(var/client/admin in GLOB.admins) + if((R_ADMIN|R_MOD) & admin.admin_holder.rights) + to_chat(admin, msg) + if(admin.prefs.toggles_sound & SOUND_ARES_MESSAGE) + playsound_client(admin, 'sound/machines/chime.ogg', vol = 25) + log_say("[key_name(Sender)] sent '[text]' to ARES 1:1.") + +/obj/structure/machinery/computer/ares_console/proc/response_from_ares(text, ref) + var/datum/ares_record/talk_log/conversation = locate(ref) + conversation.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], '[text]'" +// ------ End ARES Interface Procs ------ // + +// ------ ARES Interface UI ------ // + +/obj/structure/machinery/computer/ares_console/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/ares_console/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AresInterface", name) + ui.open() + +/obj/structure/machinery/computer/ares_console/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + data["sudo"] = sudo_holder ? TRUE : FALSE + + data["access_text"] = "[sudo_holder ? "(SUDO)," : ""] access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["evac_status"] = EvacuationAuthority.evac_status + data["worldtime"] = world.time + + data["access_log"] = list() + data["access_log"] += access_list + data["apollo_log"] = list() + data["apollo_log"] += link.apollo_log + + data["deleted_conversation"] = list() + data["deleted_conversation"] += deleted_1to1 + + data["distresstime"] = ares_distress_cooldown + data["distresstimelock"] = DISTRESS_TIME_LOCK + data["mission_failed"] = SSticker.mode.is_in_endgame + data["nuketimelock"] = NUCLEAR_TIME_LOCK + data["nuke_available"] = nuke_available + + var/list/logged_announcements = list() + for(var/datum/ares_record/announcement/broadcast as anything in 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 records_announcement) + if(!istype(security_alert)) + continue + 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_bioscans = list() + for(var/datum/ares_record/bioscan/scan as anything in 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 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 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 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_adjustments = list() + for(var/datum/ares_record/antiair/aa_adjustment as anything in records_security) + if(!istype(aa_adjustment)) + continue + var/list/current_adjustment = list() + current_adjustment["time"] = aa_adjustment.time + current_adjustment["details"] = aa_adjustment.details + current_adjustment["user"] = aa_adjustment.user + current_adjustment["ref"] = "\ref[aa_adjustment]" + logged_adjustments += list(current_adjustment) + data["aa_adjustments"] = logged_adjustments + + var/list/logged_orders = list() + for(var/datum/ares_record/requisition_log/req_order as anything in 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 records_talking) + if(!istype(log)) + continue + if(log.user == 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 + + return data + +/obj/structure/machinery/computer/ares_console/ui_static_data(mob/user) + var/list/data = list() + + data["link_id"] = link_id + + return data + +/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/ares_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + playsound(src, "keyboard_alt", 15, 1) + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, 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 = usr + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + access_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("sudo") + var/new_user = tgui_input_text(usr, "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(usr, SPAN_WARNING("Already remote logged in as this user.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + sudo_holder = last_login + last_login = new_user + access_list += "[last_login] at [worldtime2text()], Sudo Access." + return TRUE + if("sudo_logout") + access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + return + // -- Page Changers -- // + if("logout") + last_menu = current_menu + current_menu = "login" + if(sudo_holder) + access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + access_list += "[last_login] logged out at [worldtime2text()]." + + 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_security") + last_menu = current_menu + current_menu = "security" + if("page_requisitions") + last_menu = current_menu + current_menu = "requisitions" + if("page_antiair") + last_menu = current_menu + current_menu = "antiair" + 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" + + // -- Delete Button -- // + if("delete_record") + 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 + records_announcement -= record + if(ARES_RECORD_BIOSCAN) + new_title = "[record.title] at [record.time]" + new_details = record.details + records_bioscan -= record + if(ARES_RECORD_BOMB) + new_title = "[record.title] at [record.time]" + new_details = "[record.details] Launched by [record.user]." + records_bombardment -= record + + new_delete.details = new_details + new_delete.user = last_login + new_delete.title = new_title + + records_deletion += new_delete + + // -- 1:1 Conversation -- // + if("new_conversation") + var/datum/ares_record/talk_log/convo = new(last_login) + convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [last_login].'" + 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 = conversation.user + records_deletion += deleted + records_talking -= conversation + + if("message_ares") + var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) + if(message) + message_ares(message, usr, params["active_convo"]) + + 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" + + // -- Emergency Buttons -- // + if("evacuation_start") + if(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(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) + 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(!EvacuationAuthority.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.") + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Initiate Evacuation", "[last_login] 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(src, 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(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 + else if(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) + message_admins("[key_name(usr)] has requested a Distress Beacon (via ARES)! [CC_MARK(usr)] (SEND) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) + COOLDOWN_START(src, 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(src, 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(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 + + 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)! [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.")) + COOLDOWN_START(src, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT) + return TRUE +// ------ End ARES Interface UI ------ // + + +/obj/structure/machinery/computer/working_joe/get_ares_access(obj/item/card/id/card) + if(ACCESS_ARES_DEBUG in card.access) + return APOLLO_ACCESS_DEBUG + switch(card.assignment) + if(JOB_WORKING_JOE) + return APOLLO_ACCESS_JOE + if(JOB_CHIEF_ENGINEER, JOB_SYNTH, JOB_CO) + return APOLLO_ACCESS_AUTHED + if(ACCESS_MARINE_AI in card.access) + return APOLLO_ACCESS_AUTHED + if(ACCESS_MARINE_AI_TEMP in card.access) + return APOLLO_ACCESS_TEMP + if((ACCESS_MARINE_COMMAND in card.access ) || (ACCESS_MARINE_ENGINEERING in card.access) || (ACCESS_WY_CORPORATE in card.access)) + return APOLLO_ACCESS_REPORTER + else + return APOLLO_ACCESS_REQUEST + +/obj/structure/machinery/computer/working_joe/ares_auth_to_text(access_level) + switch(access_level) + if(APOLLO_ACCESS_REQUEST)//0 + return "Unauthorized Personnel" + if(APOLLO_ACCESS_REPORTER)//1 + return "Validated Incident Reporter" + if(APOLLO_ACCESS_TEMP)//2 + return "Authorized Visitor" + if(APOLLO_ACCESS_AUTHED)//3 + return "Certified Personnel" + if(APOLLO_ACCESS_JOE)//4 + return "Working Joe" + if(APOLLO_ACCESS_DEBUG)//5 + return "AI Service Technician" + +// ------ Maintenance Controller UI ------ // +/obj/structure/machinery/computer/working_joe/verb/eject_id() + set category = "Object" + set name = "Eject ID Card" + set src in oview(1) + + if(!usr || usr.stat || usr.lying) return + + if(authenticator_id) + authenticator_id.loc = get_turf(src) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) + usr.put_in_hands(authenticator_id) + if(operable()) // Powered. Console can response. + visible_message("[SPAN_BOLD("[src]")] states, \"AUTH LOGOUT: Session end confirmed.\"") + else + to_chat(usr, "You remove [authenticator_id] from [src].") + ticket_authenticated = FALSE // No card - no access + authenticator_id = null + + else if(target_id) + target_id.loc = get_turf(src) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) + usr.put_in_hands(target_id) + else + to_chat(usr, "You remove [target_id] from [src].") + target_id = null + + else + to_chat(usr, "There is nothing to remove from the console.") + return + +/obj/structure/machinery/computer/working_joe/attackby(obj/object, mob/user) + if(istype(object, /obj/item/card/id)) + if(!operable()) + to_chat(user, SPAN_NOTICE("You try to insert [object] but [src] remains silent.")) + return + var/obj/item/card/id/idcard = object + if((ACCESS_MARINE_AI in idcard.access) || (ACCESS_ARES_DEBUG in idcard.access)) + if(!authenticator_id) + if(user.drop_held_item()) + object.forceMove(src) + authenticator_id = object + authenticate(authenticator_id) + else if(!target_id) + if(user.drop_held_item()) + object.forceMove(src) + target_id = object + else + to_chat(user, "Both slots are full already. Remove a card first.") + return + else + if(!target_id) + if(user.drop_held_item()) + object.forceMove(src) + target_id = object + else + to_chat(user, "Both slots are full already. Remove a card first.") + return + else + ..() + +/obj/structure/machinery/computer/working_joe/proc/authenticate(obj/item/card/id/id_card) + if(!id_card) + visible_message("[SPAN_BOLD("[src]")] states, \"AUTH ERROR: Authenticator card is missing!\"") + return FALSE + + if((ACCESS_MARINE_AI in id_card.access) || (ACCESS_ARES_DEBUG in id_card.access)) + ticket_authenticated = TRUE + visible_message("[SPAN_BOLD("[src]")] states, \"AUTH LOGIN: Welcome, [id_card.registered_name]. Access granted.\"") + return TRUE + + visible_message("[SPAN_BOLD("[src]")] states, \"AUTH ERROR: Access denied.\"") + return FALSE + + + + +/obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/working_joe/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "WorkingJoe", name) + ui.open() + +/obj/structure/machinery/computer/working_joe/ui_data(mob/user) + var/list/data = list() + + data["ticket_console"] = ticket_console + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + + data["access_text"] = "access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["worldtime"] = world.time + + data["access_log"] = list() + data["access_log"] += login_list + + data["apollo_log"] = list() + data["apollo_log"] += link.apollo_log + + data["authenticated"] = ticket_authenticated + + + 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/list/current_maint = list() + current_maint["time"] = maint_ticket.ticket_time + current_maint["title"] = 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["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_ticket/access_ticket as anything in link.tickets_access) + var/list/current_ticket = list() + current_ticket["time"] = access_ticket.ticket_time + 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["ref"] = "\ref[access_ticket]" + logged_access += list(current_ticket) + data["access_tickets"] = logged_access + + + return data + +/obj/structure/machinery/computer/working_joe/ui_static_data(mob/user) + var/list/data = list() + + data["link_id"] = link_id + + return data + +/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/working_joe/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/playsound = TRUE + var/mob/living/carbon/human/operator = usr + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + login_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("logout") + last_menu = current_menu + current_menu = "login" + login_list += "[last_login] logged out at [worldtime2text()]." + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_logins") + last_menu = current_menu + current_menu = "login_records" + if("page_apollo") + last_menu = current_menu + current_menu = "apollo" + if("page_request") + last_menu = current_menu + current_menu = "access_requests" + if("page_returns") + last_menu = current_menu + current_menu = "access_returns" + if("page_report") + last_menu = current_menu + current_menu = "maint_reports" + if("page_tickets") + last_menu = current_menu + current_menu = "access_tickets" + if("page_maintenance") + last_menu = current_menu + current_menu = "maint_claim" + + if("new_report") + var/name = tgui_input_text(usr, "What is the type of maintenance item you wish to report?\n\nExample:\n 'Broken light in Aft Hallway.'", "Ticket Name", encode = FALSE) + if(!name) + return FALSE + var/details = tgui_input_text(usr, "What are the details for this report?", "Ticket Details", encode = FALSE) + if(!details) + return FALSE + var/confirm = tgui_alert(usr, "Please confirm the submission of your maintenance report. \n\n [name] \n\n [details] \n\n Is this correct?", "Confirmation", list("Yes", "No")) + if(confirm == "Yes") + if(link) + var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, name, details) + link.tickets_maintenance += maint_ticket + log_game("ARES: Maintenance Ticket created by [key_name(operator)] as [last_login] with Header '[name]' and Details of '[details]'.") + return TRUE + return FALSE + + if(playsound) + playsound(src, "keyboard_alt", 15, 1) diff --git a/code/game/machinery/ARES/ARES_records.dm b/code/game/machinery/ARES/ARES_records.dm new file mode 100644 index 000000000000..9cb8574e58f7 --- /dev/null +++ b/code/game/machinery/ARES/ARES_records.dm @@ -0,0 +1,99 @@ +/datum/ares_record + var/record_name = "ARES Data Core" + /// World time in text format. + var/time + /// The title of the record, usually announcement title. + var/title + /// The content of the record, announcement text/bioscan info etc. + var/details + /// The name of the initiator of certain records. Who fired an OB, or who deleted something etc. + var/user + +/datum/ares_record/New(title, details) + time = worldtime2text() + src.title = title + src.details = details + +/datum/ares_record/announcement + record_name = ARES_RECORD_ANNOUNCE + +/datum/ares_record/bioscan + record_name = ARES_RECORD_BIOSCAN + +/datum/ares_record/requisition_log + record_name = ARES_RECORD_ASRS + +/datum/ares_record/requisition_log/New(title, details, user) + time = worldtime2text() + src.title = title + src.details = details + src.user = user + +/datum/ares_record/security + record_name = ARES_RECORD_SECURITY + +/datum/ares_record/antiair + record_name = ARES_RECORD_ANTIAIR + +/datum/ares_record/antiair/New(details, user) + time = worldtime2text() + src.title = "AntiAir Adjustment" + src.details = details + src.user = user + +/datum/ares_record/bombardment + record_name = ARES_RECORD_BOMB + +/datum/ares_record/bombardment/New(title, details, user) + time = worldtime2text() + src.title = title + src.details = details + src.user = user + +/datum/ares_record/deletion + record_name = ARES_RECORD_DELETED + +/datum/ares_record/deletion/New() + time = worldtime2text() + +/datum/ares_record/talk_log + record_name = "1:1 Data Log" + var/conversation = list() + +/datum/ares_record/talk_log/New(user) + src.user = user + src.title = "1:1 Log ([user])" + +/datum/ares_record/deleted_talk + record_name = ARES_RECORD_DELETED + var/conversation = list() + +/datum/ares_record/deleted_talk/New() + time = worldtime2text() + + +/datum/ares_ticket + var/ticket_type = "Root Ticket" + var/ticket_status = TICKET_PENDING + /// Name of who is handling the ticket. Derived from last login. + var/ticket_assignee + /// World time in text format. + var/ticket_time + /// Who submitted the ticket. Derived from last login. + var/ticket_submitter + /// The name of the ticket. + var/ticket_name + /// The content of the ticket, usually an explanation of what it is for. + var/ticket_details + +/datum/ares_ticket/New(user, name, details) + ticket_time = worldtime2text() + ticket_submitter = user + ticket_details = details + ticket_name = name + +/datum/ares_ticket/maintenance + ticket_type = ARES_RECORD_MAINTENANCE + +/datum/ares_ticket/access_ticket + ticket_type = ARES_RECORD_ACCESS diff --git a/code/game/machinery/ARES/ARES_step_triggers.dm b/code/game/machinery/ARES/ARES_step_triggers.dm new file mode 100644 index 000000000000..1562f1badaab --- /dev/null +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -0,0 +1,197 @@ +/obj/effect/step_trigger/ares_alert + name = "ARES Apollo Sensor" + layer = 5 + /// Link alerts to ARES Link + var/datum/ares_link/link + var/link_id = MAIN_SHIP_DEFAULT_NAME + /// Alert message to report unless area based. + var/alert_message = "ALERT: Unauthorized movement detected in ARES Core!" + /// Connect alerts to use same cooldowns + var/alert_id + /// Set to true if it should report area name and not specific alert. + var/area_based = FALSE + /// Cooldown duration and next time. + var/cooldown_duration = COOLDOWN_ARES_SENSOR + COOLDOWN_DECLARE(sensor_cooldown) + /// The job on a mob to enter + var/list/pass_jobs = list(JOB_WORKING_JOE, JOB_CHIEF_ENGINEER, JOB_CO) + /// The accesses on an ID card to enter + var/pass_accesses = list(ACCESS_MARINE_AI, ACCESS_ARES_DEBUG) + +/obj/effect/step_trigger/ares_alert/Crossed(mob/living/passer) + if(!COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. + return FALSE + if(!passer) + return FALSE + if(!(ishuman(passer) || isxeno(passer))) + return FALSE + if(passer.alpha <= 100)//Can't be seen/detected to trigger alert. + return FALSE + if(pass_jobs) + if(passer.job in pass_jobs) + return FALSE + if(isxeno(passer) && (JOB_XENOMORPH in pass_jobs)) + return FALSE + if(ishuman(passer)) + var/mob/living/carbon/human/trespasser = passer + if(pass_accesses && (trespasser.wear_id)) + for(var/tag in pass_accesses) + if(tag in trespasser.wear_id.access) + return FALSE + Trigger(passer) + return TRUE + + +/obj/effect/step_trigger/ares_alert/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/effect/step_trigger/ares_alert/Destroy() + delink() + return ..() + +/obj/effect/step_trigger/ares_alert/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link.link_id == link_id) + link = new_link + new_link.linked_alerts += src + return TRUE +/obj/effect/step_trigger/ares_alert/proc/delink() + if(link) + link.linked_alerts -= src + link = null + + +/obj/effect/step_trigger/ares_alert/Trigger(mob/living/passer) + var/broadcast_message = alert_message + if(area_based) + var/area_name = get_area_name(src, TRUE) + broadcast_message = "ALERT: Unauthorized movement detected in [area_name]!" + + var/datum/ares_link/link = GLOB.ares_link + if(link.p_apollo.inoperable()) + return FALSE + + to_chat(passer, SPAN_BOLDWARNING("You hear a soft beeping sound as you cross the threshold.")) + var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] + for(var/mob/living/silicon/decoy/ship_ai/ai in ai_mob_list) + apollo.broadcast(ai, broadcast_message) + for(var/mob/listener as anything in (GLOB.human_mob_list + GLOB.dead_mob_list)) + if(listener.hear_apollo())//Only plays sound to mobs and not observers, to reduce spam. + playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) + COOLDOWN_START(src, sensor_cooldown, cooldown_duration) + if(alert_id && link) + for(var/obj/effect/step_trigger/ares_alert/sensor in link.linked_alerts) + if(sensor.alert_id == src.alert_id) + COOLDOWN_START(sensor, sensor_cooldown, cooldown_duration) + return TRUE + +/obj/effect/step_trigger/ares_alert/public + pass_accesses = list(ACCESS_MARINE_AI_TEMP, ACCESS_MARINE_AI, ACCESS_ARES_DEBUG) +/obj/effect/step_trigger/ares_alert/core + alert_id = "AresCore" + pass_accesses = list(ACCESS_MARINE_AI_TEMP, ACCESS_MARINE_AI, ACCESS_ARES_DEBUG) + +/obj/effect/step_trigger/ares_alert/mainframe + alert_id = "AresMainframe" + alert_message = "ALERT: Unauthorized movement detected in ARES Mainframe!" + +/obj/effect/step_trigger/ares_alert/terminals + alert_id = "AresTerminals" + alert_message = "ALERT: Unauthorized movement detected in ARES' Operations Center!" + +/obj/effect/step_trigger/ares_alert/comms + area_based = TRUE + alert_id = "TComms" + pass_accesses = list(ACCESS_MARINE_CE) + + +/// Trigger will remove ACCESS_MARINE_AI_TEMP unless ACCESS_MARINE_AI is also present. +/obj/effect/step_trigger/ares_alert/access_control + name = "ARES Access Control Sensor" + alert_message = "HARDCODED" + alert_id = "ARES Access" + cooldown_duration = COOLDOWN_ARES_ACCESS_CONTROL + + +/obj/effect/step_trigger/ares_alert/access_control/Crossed(atom/passer as mob|obj) + if(isobserver(passer) || isxeno(passer)) + return FALSE + if(!COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. + return FALSE + if(!passer) + return FALSE + if(passer.alpha <= 100)//Can't be seen/detected to trigger alert. + return FALSE + var/area/pass_area = get_area(get_step(passer, passer.dir)) + if(istype(pass_area, /area/almayer/command/airoom))//Don't want it to freak out over someone /entering/ the area. Only leaving. + return FALSE + var/obj/item/card/id/idcard + var/check_contents = TRUE + if(ishuman(passer)) + var/mob/living/carbon/human/human_passer = passer + idcard = human_passer.wear_id + if(istype(idcard)) + check_contents = FALSE + else + idcard = null + + if(istype(passer, /obj/item/card/id)) + idcard = passer + check_contents = FALSE + + if(check_contents) + idcard = locate(/obj/item/card/id) in passer + if(!idcard) + for(var/obj/item/holder in passer.contents) + idcard = locate(/obj/item/card/id) in holder.contents + if(idcard) + break + if(!istype(idcard) && ismob(passer)) + Trigger(passer, failure = TRUE) + return FALSE + if(!(ACCESS_MARINE_AI_TEMP in idcard.access))//No temp access, don't care + return FALSE + if((ACCESS_MARINE_AI in idcard.access) || (ACCESS_ARES_DEBUG in idcard.access))//Permanent access prevents loss of temporary + return FALSE + Trigger(passer, idcard) + return TRUE + +/obj/effect/step_trigger/ares_alert/access_control/Trigger(atom/passer, obj/item/card/id/idcard, failure = FALSE) + var/broadcast_message = get_broadcast(passer, idcard, failure) + + var/datum/ares_link/link = GLOB.ares_link + if(link.p_apollo.inoperable()) + return FALSE + + to_chat(passer, SPAN_BOLDWARNING("You hear a harsh buzzing sound as you cross the threshold!")) + var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] + for(var/mob/living/silicon/decoy/ship_ai/ai in ai_mob_list) + apollo.broadcast(ai, broadcast_message) + for(var/mob/listener in (GLOB.human_mob_list + GLOB.dead_mob_list)) + if(listener.hear_apollo())//Only plays sound to mobs and not observers, to reduce spam. + playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) + if(idcard) + idcard.access -= ACCESS_MARINE_AI_TEMP + COOLDOWN_START(src, sensor_cooldown, COOLDOWN_ARES_ACCESS_CONTROL) + if(alert_id && link) + for(var/obj/effect/step_trigger/ares_alert/sensor in link.linked_alerts) + if(sensor.alert_id == src.alert_id) + COOLDOWN_START(sensor, sensor_cooldown, COOLDOWN_ARES_ACCESS_CONTROL) + return TRUE + +/obj/effect/step_trigger/ares_alert/access_control/proc/get_broadcast(atom/passer, obj/item/card/id/idcard, failure = FALSE) + if(isxeno(passer)) + return "Unidentified lifeform detected departing AI Chamber." + if(ishuman(passer)) + var/mob/living/carbon/human/human_passer = passer + if(failure) + return "CAUTION: [human_passer.name] left the AI Chamber without a locatable ID card." + return "ALERT: [human_passer.name] left the AI Chamber with a temporary access ticket. Removing access." + + if(idcard) + return "ALERT: ID Card assigned to [idcard.registered_name] left the AI Chamber with a temporary access ticket. Removing access." + + log_debug("ARES ERROR 337: Passer: '[passer]', ID: '[idcard]', F Status: '[failure]'") + return "Warning: Error 337 - Access Control Anomaly." diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 1a15d40eba9c..a8735cbc06a8 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -110,6 +110,10 @@ /obj/structure/machinery/camera/autoname/almayer/containment/hidden network = list(CAMERA_NET_CONTAINMENT_HIDDEN) +/obj/structure/machinery/camera/autoname/almayer/containment/ares + name = "ares core camera" + network = list(CAMERA_NET_ALMAYER, 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. /obj/structure/machinery/camera/autoname/lz_camera diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index ec4abc68511b..b2a931224464 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -118,7 +118,7 @@ return FALSE usr.set_interaction(src) - + var/datum/ares_link/link = GLOB.ares_link switch(href_list["operation"]) if("main") state = STATE_DEFAULT @@ -163,6 +163,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") + link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") return TRUE state = STATE_EVACUATION @@ -182,6 +183,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") + link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") return TRUE state = STATE_EVACUATION_CANCEL diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index d7fe2ed83e02..d4feca457f4a 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -318,6 +318,10 @@ name = "Containment Cameras" network = list(CAMERA_NET_CONTAINMENT) +/obj/structure/machinery/computer/cameras/almayer/ares + name = "ARES Core Cameras" + network = list(CAMERA_NET_ARES) + /obj/structure/machinery/computer/cameras/almayer/vehicle name = "Ship Security Cameras" network = list(CAMERA_NET_ALMAYER, CAMERA_NET_VEHICLE) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 2a7b5017d1ed..edc39faf3ddc 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -65,6 +65,7 @@ if(..()) return FALSE usr.set_interaction(src) + var/datum/ares_link/link = GLOB.ares_link switch(href_list["operation"]) if("mapview") tacmap.tgui_interact(usr) @@ -148,6 +149,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") + link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") return TRUE state = STATE_EVACUATION @@ -167,6 +169,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") + link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") return TRUE state = STATE_EVACUATION_CANCEL diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 40bdd68b3b34..8be8609d6008 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -52,6 +52,11 @@ /obj/structure/machinery/door_control/attackby(obj/item/W, mob/user as mob) return src.attack_hand(user) +/obj/structure/machinery/door_control/ex_act(severity) + if(indestructible) + return FALSE + ..() + /obj/structure/machinery/door_control/proc/handle_dropship(ship_id) var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(ship_id) if (!istype(shuttle)) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 972ce6b7570e..da6137e5e8cb 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -287,10 +287,13 @@ /obj/structure/machinery/door/poddoor/almayer/blended icon_state = "almayer_pdoor1" base_icon_state = "almayer_pdoor" - +/obj/structure/machinery/door/poddoor/almayer/blended/open + density = FALSE /obj/structure/machinery/door/poddoor/almayer/blended/white icon_state = "w_almayer_pdoor1" base_icon_state = "w_almayer_pdoor" +/obj/structure/machinery/door/poddoor/almayer/blended/white/open + density = FALSE /obj/structure/machinery/door/poddoor/almayer/Initialize() . = ..() diff --git a/code/game/machinery/doors/railing.dm b/code/game/machinery/doors/railing.dm index 145a5d8191dc..8449d5d52256 100644 --- a/code/game/machinery/doors/railing.dm +++ b/code/game/machinery/doors/railing.dm @@ -19,7 +19,8 @@ . = ..() if(dir == SOUTH) closed_layer = ABOVE_MOB_LAYER - layer = closed_layer + if(density)//Allows preset-open to work + layer = closed_layer SetOpacity(initial(opacity)) @@ -63,3 +64,6 @@ addtimer(VARSET_CALLBACK(src, operating, FALSE), 1.2 SECONDS) return TRUE + +/obj/structure/machinery/door/poddoor/railing/open + density = FALSE diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index 2650a3057503..1a4aebe813cc 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -145,6 +145,8 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") . = TRUE if("distress") diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index 60f29c8b40e4..9323bca2877e 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -143,7 +143,7 @@ unslashable = TRUE unacidable = TRUE health = null - layer = TURF_LAYER + layer = ABOVE_TURF_LAYER//Being on turf layer was causing issues with cameras. This SHOULDN'T cause any problems. plane = FLOOR_PLANE density = FALSE opacity = FALSE diff --git a/code/game/objects/structures/pipes/pipes.dm b/code/game/objects/structures/pipes/pipes.dm index aa5f56fb5d8c..9f2b70c70661 100644 --- a/code/game/objects/structures/pipes/pipes.dm +++ b/code/game/objects/structures/pipes/pipes.dm @@ -14,6 +14,8 @@ var/ventcrawl_message_busy = FALSE //Prevent spamming + /// Whether or not the pipe will explode (when on the Almayer) during hijack + var/explodey = TRUE /// The grenade subtypes that pipes will use when they explode var/static/list/exploding_types = list(/obj/item/explosive/grenade/high_explosive/bursting_pipe, /obj/item/explosive/grenade/incendiary/bursting_pipe) @@ -40,7 +42,8 @@ if(!is_mainship_level(z)) return - GLOB.mainship_pipes += src + if(explodey) + GLOB.mainship_pipes += src /obj/structure/pipes/Destroy() for(var/mob/living/M in src) diff --git a/code/game/objects/structures/pipes/standard/manifolds.dm b/code/game/objects/structures/pipes/standard/manifolds.dm index f7bd04ee3fb7..dfbc027455b6 100644 --- a/code/game/objects/structures/pipes/standard/manifolds.dm +++ b/code/game/objects/structures/pipes/standard/manifolds.dm @@ -104,6 +104,10 @@ layer = ATMOS_PIPE_SUPPLY_LAYER color = PIPE_COLOR_BLUE +/obj/structure/pipes/standard/manifold/hidden/supply/no_boom + name = "Reinforced Air supply pipe manifold" + explodey = FALSE + /obj/structure/pipes/standard/manifold/hidden/yellow color = PIPE_COLOR_YELLOW @@ -182,6 +186,10 @@ layer = ATMOS_PIPE_SUPPLY_LAYER color = PIPE_COLOR_BLUE +/obj/structure/pipes/standard/manifold/fourway/hidden/supply/no_boom + name = "reinforced 4-way air supply pipe manifold" + explodey = FALSE + /obj/structure/pipes/standard/manifold/fourway/hidden/yellow color = PIPE_COLOR_YELLOW diff --git a/code/game/objects/structures/pipes/standard/simple.dm b/code/game/objects/structures/pipes/standard/simple.dm index 7101bb3dd95f..93a92e51f71b 100644 --- a/code/game/objects/structures/pipes/standard/simple.dm +++ b/code/game/objects/structures/pipes/standard/simple.dm @@ -104,6 +104,10 @@ layer = ATMOS_PIPE_SUPPLY_LAYER color = PIPE_COLOR_BLUE +/obj/structure/pipes/standard/simple/hidden/supply/no_boom + name = "Reinforced Air supply pipe" + explodey = FALSE + /obj/structure/pipes/standard/simple/hidden/yellow color = PIPE_COLOR_YELLOW diff --git a/code/game/objects/structures/pipes/standard/standard_misc.dm b/code/game/objects/structures/pipes/standard/standard_misc.dm index a50774552b03..dc52da57c750 100644 --- a/code/game/objects/structures/pipes/standard/standard_misc.dm +++ b/code/game/objects/structures/pipes/standard/standard_misc.dm @@ -107,6 +107,10 @@ layer = ATMOS_PIPE_SUPPLY_LAYER color = PIPE_COLOR_BLUE +/obj/structure/pipes/standard/cap/hidden/supply/no_boom + name = "reinforced supply pipe endcap" + explodey = FALSE + /obj/structure/pipes/standard/tank icon = 'icons/obj/pipes/tank.dmi' diff --git a/code/game/objects/structures/pipes/vents/pump_scrubber.dm b/code/game/objects/structures/pipes/vents/pump_scrubber.dm index d0dd3f8301a7..a4565c610ad5 100644 --- a/code/game/objects/structures/pipes/vents/pump_scrubber.dm +++ b/code/game/objects/structures/pipes/vents/pump_scrubber.dm @@ -4,6 +4,10 @@ name = "Air Scrubber" vent_icon = "scrubber" +/obj/structure/pipes/vents/scrubber/no_boom + name = "Reinforced Air Scrubber" + explodey = FALSE + /obj/structure/pipes/vents/scrubber/on icon_state = "on" @@ -13,6 +17,10 @@ icon_state = "map_vent" name = "Air Vent" +/obj/structure/pipes/vents/pump/no_boom + name = "Reinforced Air Vent" + explodey = FALSE + /obj/structure/pipes/vents/pump/on icon_state = "on" diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index cacb8232fd60..fbd6920875ad 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -70,7 +70,7 @@ /obj/structure/sign/kiddieplaque name = "AI developers plaque" - desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"" + desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. Beneath the image, someone has scratched the word \"PACKETS\"" icon_state = "kiddieplaque" /obj/structure/sign/arcturianstopsign diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 7537d47c941f..4186ae8608a9 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -295,6 +295,11 @@ name = "Delta squad chair" desc = "A simple chair permanently attached to the floor. Covered with a squeaky and way too hard faux-leather, unevenly painted in Delta squad blue. This chair is most likely to be the first to fight and first to die." +/obj/structure/bed/chair/comfy/ares + icon_state = "comfychair_ares" + name = "AI core chair" + desc = "A functional chair designed for comfortably sitting a single person with intent to facilitate interactions with the ship AI." + /obj/structure/bed/chair/office anchored = FALSE drag_delay = 1 //Pulling something on wheels is easy diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index dcc854bfa71d..b760340004f5 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1015,6 +1015,7 @@ var/datum/controller/supply/supply_controller = new() to_chat(usr, SPAN_DANGER("Current retrieval load has reached maximum capacity.")) return + var/datum/ares_link/link = GLOB.ares_link for(var/i=1, i<=supply_controller.requestlist.len, i++) var/datum/supply_order/SO = supply_controller.requestlist[i] if(SO.ordernum == ordernum) @@ -1030,6 +1031,12 @@ var/datum/controller/supply/supply_controller = new() temp += "
Back Main Menu" supply_order.approvedby = usr.name msg_admin_niche("[usr] confirmed supply order of [supply_pack.name].") + var/pack_source = "Cargo Hold" + var/pack_name = supply_pack.name + if(supply_pack.dollar_cost) + pack_source = "Unknown" + pack_name = "Unknown" + link.log_ares_requisition(pack_source, pack_name, usr) else temp = "Not enough money left.
" temp += "
Back Main Menu" diff --git a/code/game/turfs/floor_types.dm b/code/game/turfs/floor_types.dm index 25682f00df29..4e47fd004f74 100644 --- a/code/game/turfs/floor_types.dm +++ b/code/game/turfs/floor_types.dm @@ -272,7 +272,9 @@ /turf/open/floor/almayer/uscm/directional icon_state = "logo_directional" - +/turf/open/floor/almayer/no_build + allow_construction = FALSE + hull_floor = TRUE // RESEARCH STUFF /turf/open/floor/almayer/research/containment/entrance diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index debffa9b25b0..ba5d52a23f97 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -67,6 +67,7 @@ var/list/admin_verbs_default = list( /datum/admins/proc/subtlemessageall, /datum/admins/proc/alertall, /datum/admins/proc/imaginary_friend, + /client/proc/toggle_ares_ping, ) var/list/admin_verbs_admin = list( @@ -577,6 +578,16 @@ var/list/roundstart_mod_verbs = list( message_admins("[key_name(usr)] announced a random fact.") SSticker.mode?.declare_fun_facts() +/client/proc/toggle_ares_ping() + set name = "Toggle ARES notification sound" + set category = "Preferences.Logs" + + prefs.toggles_sound ^= SOUND_ARES_MESSAGE + if (prefs.toggles_sound & SOUND_ARES_MESSAGE) + to_chat(usr, SPAN_BOLDNOTICE("You will now hear a ping for ARES messages.")) + else + to_chat(usr, SPAN_BOLDNOTICE("You will no longer hear a ping for ARES messages.")) + #undef MAX_WARNS #undef AUTOBANTIME diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index 11ee49b65e61..c0ffeada9883 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -680,10 +680,14 @@ /proc/set_lz_resin_allowed(allowed = TRUE) if(allowed) for(var/area/A in all_areas) + if(A.flags_area & AREA_UNWEEDABLE) + continue A.is_resin_allowed = TRUE msg_admin_niche("Areas close to landing zones are now weedable.") else for(var/area/A in all_areas) + if(A.flags_area & AREA_UNWEEDABLE) + continue A.is_resin_allowed = initial(A.is_resin_allowed) msg_admin_niche("Areas close to landing zones cannot be weeded now.") GLOB.resin_lz_allowed = allowed diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 8fca782ecd63..20d98776c5ab 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -440,7 +440,7 @@ return var/confirm = tgui_alert(usr, "Are you sure you want to hijack [dropship]?", "Force hijack", list("Yes", "No")) == "Yes" - if(!confirm) + if(!confirm) return var/obj/structure/machinery/computer/shuttle/dropship/flight/computer = dropship.getControlConsole() @@ -535,19 +535,15 @@ if(!input) return FALSE - for(var/obj/structure/machinery/computer/almayer_control/C in machines) - if(!(C.inoperable())) -// var/obj/item/paper/P = new /obj/item/paper(C.loc)//Don't need a printed copy currently. -// P.name = "'[MAIN_AI_SYSTEM] Update.'" -// P.info = input -// P.update_icon() - C.messagetitle.Add("[MAIN_AI_SYSTEM] Update") - C.messagetext.Add(input) - ai_announcement(input) - message_admins("[key_name_admin(src)] has created an AI comms report") - log_admin("AI comms report: [input]") - else - to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It may be offline or destroyed.")) + var/datum/ares_link/link = GLOB.ares_link + if(link.p_interface.inoperable()) + to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It may be offline or destroyed.")) + return + + ai_announcement(input) + message_admins("[key_name_admin(src)] has created an AI comms report") + log_admin("AI comms report: [input]") + /client/proc/cmd_admin_create_AI_apollo_report() set name = "Report: ARES Apollo" @@ -560,19 +556,19 @@ if(!input) return FALSE - for(var/obj/structure/machinery/computer/almayer_control/console in machines) - if(console.inoperable()) - to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It may be offline or destroyed.")) - return - else - var/datum/language/apollo = GLOB.all_languages[LANGUAGE_APOLLO] - for(var/mob/living/silicon/decoy/ship_ai/AI in ai_mob_list) - apollo.broadcast(AI, input) - for(var/mob/listener in (GLOB.human_mob_list + GLOB.dead_mob_list)) - if(listener.hear_apollo())//Only plays sound to mobs and not observers, to reduce spam. - playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) - message_admins("[key_name_admin(src)] has created an AI Apollo report") - log_admin("AI Apollo report: [input]") + var/datum/ares_link/link = GLOB.ares_link + if(link.p_apollo.inoperable()) + to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It may be offline or destroyed.")) + return FALSE + + var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] + for(var/mob/living/silicon/decoy/ship_ai/AI in ai_mob_list) + apollo.broadcast(AI, input) + for(var/mob/listener as anything in (GLOB.human_mob_list + GLOB.dead_mob_list)) + if(listener.hear_apollo())//Only plays sound to mobs and not observers, to reduce spam. + playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) + message_admins("[key_name_admin(src)] has created an AI APOLLO report") + log_admin("AI APOLLO report: [input]") /client/proc/cmd_admin_create_AI_shipwide_report() set name = "Report: ARES Shipwide" @@ -584,19 +580,14 @@ var/input = input(usr, "This is an announcement type message from the ship's AI. This will be announced to every conscious human on Almayer z-level. Be aware, this will work even if ARES unpowered/destroyed. Check with online staff before you send this.", "What?", "") as message|null if(!input) return FALSE + for(var/obj/structure/machinery/ares/processor/interface/processor in machines) + if(processor.inoperable()) + to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It may be offline or destroyed.")) + return - for(var/obj/structure/machinery/computer/almayer_control/C in machines) - if(!(C.inoperable())) -// var/obj/item/paper/P = new /obj/item/paper(C.loc)//Don't need a printed copy currently. -// P.name = "'[MAIN_AI_SYSTEM] Update.'" -// P.info = input -// P.update_icon() - C.messagetitle.Add("[MAIN_AI_SYSTEM] Shipwide Update") - C.messagetext.Add(input) - - shipwide_ai_announcement(input) - message_admins("[key_name_admin(src)] has created an AI shipwide report") - log_admin("[key_name_admin(src)] AI shipwide report: [input]") + shipwide_ai_announcement(input) + message_admins("[key_name_admin(src)] has created an AI shipwide report") + log_admin("[key_name_admin(src)] AI shipwide report: [input]") /client/proc/cmd_admin_create_predator_report() set name = "Report: Yautja AI" @@ -972,7 +963,11 @@ if("Xeno") GLOB.bioscan_data.qm_bioscan(variance) if("Marine") - GLOB.bioscan_data.ares_bioscan(FALSE, variance) + var/force_check = tgui_alert(usr, "Do you wish to force ARES to display the bioscan?", "Display force", list("Yes", "No"), 20 SECONDS) + var/force_status = FALSE + if(force_check == "Yes") + force_status = TRUE + GLOB.bioscan_data.ares_bioscan(force_status, variance) if("Yautja") GLOB.bioscan_data.yautja_bioscan() diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 96c9312db7d1..b371db087be6 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -1882,7 +1882,7 @@ if(href_list["ccdeny"]) // CentComm-deny. The distress call is denied, without any further conditions var/mob/ref_person = locate(href_list["ccdeny"]) - marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon") + marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon", logging = ARES_LOG_SECURITY) log_game("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]", 1) @@ -1927,7 +1927,7 @@ if(href_list["sddeny"]) // CentComm-deny. The self-destruct is denied, without any further conditions var/mob/ref_person = locate(href_list["sddeny"]) - marine_announcement("The self-destruct request has not received a response, ARES is now recalculating statistics.", "Self-Destruct System") + marine_announcement("The self-destruct request has not received a response, ARES is now recalculating statistics.", "Self-Destruct System", logging = ARES_LOG_SECURITY) log_game("[key_name_admin(usr)] has denied self-destruct, requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(usr)] has denied self-destruct, requested by [key_name_admin(ref_person)]", 1) @@ -2006,6 +2006,45 @@ player_notes_all(checking.key) + if(href_list["AresReply"]) + var/mob/living/carbon/human/speaker = locate(href_list["AresReply"]) + + if(!istype(speaker)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return FALSE + + if((!GLOB.ares_link.interface) || (GLOB.ares_link.interface.inoperable())) + to_chat(usr, "ARES Interface offline.") + return FALSE + + var/input = input(src.owner, "Please enter a message from ARES to reply to [key_name(speaker)].","Outgoing message from ARES", "") + if(!input) + return FALSE + + to_chat(src.owner, "You sent [input] to [speaker] via ARES Interface.") + log_admin("[src.owner] replied to [key_name(speaker)]'s ARES message with the message [input].") + for(var/client/staff in GLOB.admins) + if((R_ADMIN|R_MOD) & staff.admin_holder.rights) + to_chat(staff, SPAN_STAFF_IC("ADMINS/MODS: [SPAN_RED("[src.owner] replied to [key_name(speaker)]'s ARES message")] with: [SPAN_BLUE(input)] ")) + GLOB.ares_link.interface.response_from_ares(input, href_list["AresRef"]) + + if(href_list["AresMark"]) + var/mob/living/carbon/human/speaker = locate(href_list["AresMark"]) + + if(!istype(speaker)) + to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") + return FALSE + + if((!GLOB.ares_link.interface) || (GLOB.ares_link.interface.inoperable())) + to_chat(usr, "ARES Interface offline.") + return FALSE + + to_chat(src.owner, "You marked [speaker]'s ARES message for response.") + log_admin("[src.owner] marked [key_name(speaker)]'s ARES message. [src.owner] will be responding.") + for(var/client/staff in GLOB.admins) + if((R_ADMIN|R_MOD) & staff.admin_holder.rights) + to_chat(staff, SPAN_STAFF_IC("ADMINS/MODS: [SPAN_RED("[src.owner] marked [key_name(speaker)]'s ARES message for response.")]")) + return /datum/admins/proc/accept_ert(mob/approver, mob/ref_person) diff --git a/code/modules/cm_marines/anti_air.dm b/code/modules/cm_marines/anti_air.dm index 22d43456437b..fc67f9a2018d 100644 --- a/code/modules/cm_marines/anti_air.dm +++ b/code/modules/cm_marines/anti_air.dm @@ -102,6 +102,7 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon if(!almayer_aa_cannon) return + var/datum/ares_link/link = GLOB.ares_link switch(action) if("protect") almayer_aa_cannon.protecting_section = params["section_id"] @@ -109,10 +110,12 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon almayer_aa_cannon.protecting_section = "" return message_admins("[key_name(usr)] has set the AA to [html_encode(almayer_aa_cannon.protecting_section)].") + link.log_ares_antiair(usr, "Set AA to cover [html_encode(almayer_aa_cannon.protecting_section)].") . = TRUE if("deactivate") almayer_aa_cannon.protecting_section = "" message_admins("[key_name(usr)] has deactivated the AA cannon.") + link.log_ares_antiair(usr, "Deactivated Anti Air systems.") . = TRUE add_fingerprint(usr) diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index 401d8fd9784a..070cf1f6c1cf 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -866,6 +866,9 @@ message_admins(FONT_SIZE_HUGE("ALERT: [key_name(user)] fired an orbital bombardment in [A.name] for squad '[current_squad]' [ADMIN_JMP(T)]")) log_attack("[key_name(user)] fired an orbital bombardment in [A.name] for squad '[current_squad]'") + /// Project ARES interface log. + GLOB.ares_link.log_ares_bombardment(user, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") + busy = FALSE var/turf/target = locate(T.x + rand(-3, 3), T.y + rand(-3, 3), T.z) if(target && istype(target)) diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index ec79a2f7f3fd..2db33c10ed46 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -111,6 +111,11 @@ to_chat(usr, SPAN_WARNING("It's too cramped in here to deploy \a [src].")) return var/turf/T = get_turf(usr) + if(istype(T, /turf/open)) + var/turf/open/floor = T + if(!floor.allow_construction) + to_chat(user, SPAN_WARNING("You cannot install \the [src] here, find a more secure surface!")) + return FALSE var/fail = FALSE if(T.density) fail = TRUE @@ -195,6 +200,11 @@ to_chat(usr, SPAN_WARNING("It's too cramped in here to deploy \a [src].")) return var/turf/T = get_turf(user) + if(istype(T, /turf/open)) + var/turf/open/floor = T + if(!floor.allow_construction) + to_chat(user, SPAN_WARNING("You cannot install \the [src] here, find a more secure surface!")) + return FALSE var/fail = FALSE if(T.density) fail = TRUE @@ -370,6 +380,11 @@ if(fail) to_chat(user, SPAN_WARNING("You can't install \the [src] here, something is in the way.")) return + if(istype(T, /turf/open)) + var/turf/open/floor = T + if(!floor.allow_construction) + to_chat(user, SPAN_WARNING("You cannot install \the [src] here, find a more secure surface!")) + return FALSE if(gun_mounted) to_chat(user, "You're securing the M56D into place...") @@ -1061,7 +1076,7 @@ if(SSinterior.in_interior(user)) to_chat(usr, SPAN_WARNING("It's too cramped in here to deploy \a [src].")) return FALSE - if(OT.density || !isturf(OT)) + if(OT.density || !isturf(OT) || !OT.allow_construction) to_chat(user, SPAN_WARNING("You can't set up \the [src] here.")) return FALSE if(rotate_check.density) diff --git a/code/modules/defenses/defenses.dm b/code/modules/defenses/defenses.dm index ee6db2b10455..f47ae3e4d77b 100644 --- a/code/modules/defenses/defenses.dm +++ b/code/modules/defenses/defenses.dm @@ -303,6 +303,10 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) return else + var/turf/open/floor = get_turf(src) + if(!floor.allow_construction) + to_chat(user, SPAN_WARNING("You cannot secure \the [src] here, find a more secure surface!")) + return FALSE user.visible_message(SPAN_NOTICE("[user] begins securing [src] to the ground."), SPAN_NOTICE("You begin securing [src] to the ground.")) diff --git a/code/modules/defenses/handheld.dm b/code/modules/defenses/handheld.dm index e68522871561..233dad313d25 100644 --- a/code/modules/defenses/handheld.dm +++ b/code/modules/defenses/handheld.dm @@ -66,7 +66,12 @@ blocked = TRUE break - if(istype(T, /turf/closed)) + if(istype(T, /turf/open)) + var/turf/open/floor = T + if(!floor.allow_construction) + to_chat(user, SPAN_WARNING("You cannot deploy \a [src] here, find a more secure surface!")) + return FALSE + else blocked = TRUE if(blocked) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 688a55d0f0f6..7aa9eabb3042 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -198,6 +198,7 @@ ACCESS_MARINE_MAINT, ACCESS_MARINE_OT, ACCESS_MARINE_SYNTH, + ACCESS_MARINE_AI, ) assignment = JOB_CHIEF_ENGINEER rank = JOB_CHIEF_ENGINEER diff --git a/code/modules/mob/language/languages.dm b/code/modules/mob/language/languages.dm index 546c2bf7714f..e5b693e02b80 100644 --- a/code/modules/mob/language/languages.dm +++ b/code/modules/mob/language/languages.dm @@ -147,7 +147,7 @@ /datum/language/apollo name = LANGUAGE_APOLLO - desc = "The Apollo Link is an AI subprocessor designed by SEEGSON, allowing for coordination of maintenance drones and Working Joes. WY denies claims the processor was stolen for ARES." + desc = "The APOLLO Link is an AI subprocessor designed by SEEGSON, allowing for coordination of maintenance drones and Working Joes. WY denies claims the processor was stolen for ARES." color = "skrell" speech_verb = "states" ask_verb = "queries" @@ -166,6 +166,8 @@ var/message_body = "broadcasts, \"[message]\"" GLOB.STUI.game.Add("\[[time_stamp()]]APOLLO: [key_name(speaker)] : [message]
") GLOB.STUI.processing |= STUI_LOG_GAME_CHAT + log_say("[speaker.name != "Unknown" ? speaker.name : "([speaker.real_name])"] \[APOLLO\]: [message] (CKEY: [speaker.key]) (JOB: [speaker.job])") + log_ares_apollo(speaker.real_name, message) for (var/mob/dead in GLOB.dead_mob_list) if(!istype(dead,/mob/new_player) && !istype(dead,/mob/living/brain)) //No meta-evesdropping dead.show_message("[message_start] [message_body]", SHOW_MESSAGE_VISIBLE) diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm index dbadadf8ef23..eb5a629760ee 100644 --- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm @@ -55,6 +55,9 @@ var/area/AR = get_area(T) if(isnull(AR) || !(AR.is_resin_allowed)) + if(AR.flags_area & AREA_UNWEEDABLE) + to_chat(X, SPAN_XENOWARNING("This area is unsuited to host the hive!")) + return to_chat(X, SPAN_XENOWARNING("It's too early to spread the hive this far.")) return diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index 692fa31c72e7..921b61a23bc9 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -47,6 +47,9 @@ var/area/AR = get_area(T) if(isnull(AR) || !(AR.is_resin_allowed)) + if(AR.flags_area & AREA_UNWEEDABLE) + to_chat(X, SPAN_XENOWARNING("This area is unsuited to host the hive!")) + return to_chat(X, SPAN_XENOWARNING("It's too early to spread the hive this far.")) return @@ -597,6 +600,9 @@ var/area/AR = get_area(T) if(isnull(AR) || !(AR.is_resin_allowed)) + if(AR.flags_area & AREA_UNWEEDABLE) + to_chat(X, SPAN_XENOWARNING("This area is unsuited to host the hive!")) + return to_chat(X, SPAN_XENOWARNING("It's too early to spread the hive this far.")) return FALSE diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm index 944192530b0d..65ea443c133c 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/queen/queen_powers.dm @@ -512,6 +512,9 @@ var/area/AR = get_area(T) if(!AR.is_resin_allowed) + if(AR.flags_area & AREA_UNWEEDABLE) + to_chat(X, SPAN_XENOWARNING("This area is unsuited to host the hive!")) + return to_chat(X, SPAN_XENOWARNING("It's too early to spread the hive this far.")) return diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index 182d3d965832..fe4b4cca2fb1 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -117,7 +117,9 @@ // Tell the marines where the last one is. var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan complete.\n\nSensors indicate one remaining unknown lifeform signature in [get_area(X)]." - marine_announcement(input, name, 'sound/AI/bioscan.ogg') + var/datum/ares_link/link = GLOB.ares_link + link.log_ares_bioscan(name, input) + marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) // Tell the xeno she is the last one. if(X.client) to_chat(X, SPAN_XENOANNOUNCE("Your carapace rattles with dread. You are all that remains of the hive!")) diff --git a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm index 4f3852a6a055..3bfb4e355416 100644 --- a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm +++ b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm @@ -31,6 +31,9 @@ GLOBAL_VAR_INIT(resin_lz_allowed, FALSE) var/area/AR = get_area(T) if(isnull(AR) || !(AR.is_resin_allowed)) + if(AR.flags_area & AREA_UNWEEDABLE) + to_chat(X, SPAN_XENOWARNING("This area is unsuited to host the hive!")) + return to_chat(X, SPAN_XENOWARNING("It's too early to spread the hive this far.")) return FALSE diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index abd07e056be7..b625b19b172d 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -10,6 +10,8 @@ bound_width = 96 custom_slashed_sound = "alien_claw_metal" var/obj/item/device/radio/headset/almayer/mcom/ai/ai_headset //The thing it speaks into. + maxHealth = 1000 + health = 1000 /mob/living/silicon/decoy/ship_ai //For the moment, pending better pathing. var/silent_announcement_cooldown = 0 @@ -20,6 +22,7 @@ desc = "This is the artificial intelligence system for the [MAIN_SHIP_NAME]. Like many other military-grade AI systems, this one was manufactured by Weyland-Yutani." ai_headset = new(src) ai_mob_list += src + real_name = MAIN_AI_SYSTEM /mob/living/silicon/decoy/ship_ai/Destroy() QDEL_NULL(ai_headset) diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index d8f61c11a3e6..be087444c99e 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -16,32 +16,32 @@ switch(level) if(SEC_LEVEL_GREEN) if(announce) - ai_announcement("Attention: Security level lowered to GREEN - all clear.", no_sound ? null : 'sound/AI/code_green.ogg') + ai_announcement("Attention: Security level lowered to GREEN - all clear.", no_sound ? null : 'sound/AI/code_green.ogg', ARES_LOG_SECURITY) security_level = SEC_LEVEL_GREEN if(SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE) if(announce) - ai_announcement("Attention: Security level elevated to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_elevated.ogg') + ai_announcement("Attention: Security level elevated to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_elevated.ogg', ARES_LOG_SECURITY) else if(announce) - ai_announcement("Attention: Security level lowered to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_lowered.ogg') + ai_announcement("Attention: Security level lowered to BLUE - potentially hostile activity on board.", no_sound ? null : 'sound/AI/code_blue_lowered.ogg', ARES_LOG_SECURITY) security_level = SEC_LEVEL_BLUE if(SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED) if(announce) - ai_announcement("Attention: Security level elevated to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_elevated.ogg') + ai_announcement("Attention: Security level elevated to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_elevated.ogg', ARES_LOG_SECURITY) else if(announce) - ai_announcement("Attention: Security level lowered to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_lowered.ogg') + ai_announcement("Attention: Security level lowered to RED - there is an immediate threat to the ship.", no_sound ? null : 'sound/AI/code_red_lowered.ogg', ARES_LOG_SECURITY) security_level = SEC_LEVEL_RED if(SEC_LEVEL_DELTA) if(announce) var/name = "SELF-DESTRUCT SYSTEMS ACTIVE" var/input = "DANGER, THE EMERGENCY DESTRUCT SYSTEM IS NOW ACTIVATED. PROCEED TO THE SELF-DESTRUCT CHAMBER FOR CONTROL ROD INSERTION." - marine_announcement(input, name, 'sound/AI/selfdestruct_short.ogg') + marine_announcement(input, name, 'sound/AI/selfdestruct_short.ogg', logging = ARES_LOG_SECURITY) security_level = SEC_LEVEL_DELTA EvacuationAuthority.enable_self_destruct() diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 19d9abfd81b4..ea4a7fdbc79d 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -267,7 +267,7 @@ hijack.fire() GLOB.alt_ctrl_disabled = TRUE - marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg') + marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) var/mob/living/carbon/xenomorph/xeno = user var/hivenumber = XENO_HIVE_NORMAL diff --git a/code/modules/shuttle/dropship_hijack.dm b/code/modules/shuttle/dropship_hijack.dm index 35009ad42485..ce151c14324c 100644 --- a/code/modules/shuttle/dropship_hijack.dm +++ b/code/modules/shuttle/dropship_hijack.dm @@ -123,7 +123,7 @@ if(!offset_target) offset_target = target // Welp the offsetting failed so... crash_site.forceMove(offset_target) - marine_announcement("A hostile aircraft on course for the [target_ship_section] has been successfully deterred.", "IX-50 MGAD System") + marine_announcement("A hostile aircraft on course for the [target_ship_section] has been successfully deterred.", "IX-50 MGAD System", logging = ARES_LOG_SECURITY) target_ship_section = new_target_ship_section // TODO mobs not alerted for(var/area/internal_area in shuttle.shuttle_areas) @@ -149,7 +149,7 @@ shuttle.crashing = TRUE - marine_announcement("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT." , "EMERGENCY", 'sound/AI/dropship_emergency.ogg') + marine_announcement("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT." , "EMERGENCY", 'sound/AI/dropship_emergency.ogg', logging = ARES_LOG_SECURITY) announce_dchat("The dropship is about to impact [get_area_name(crash_site)]", crash_site) final_announcement = TRUE @@ -202,7 +202,6 @@ turfs += get_area_turfs(/area/almayer/medical/hydroponics) if("Upper deck Aftship") turfs += get_area_turfs(/area/almayer/engineering/upper_engineering) - turfs += get_area_turfs(/area/almayer/command/computerlab) turfs += get_area_turfs(/area/almayer/engineering/laundry) if("Lower deck Foreship") turfs += get_area_turfs(/area/almayer/hallways/hangar) diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm index 48a6c176293e..17caccde207e 100644 --- a/code/modules/shuttles/marine_ferry.dm +++ b/code/modules/shuttles/marine_ferry.dm @@ -414,7 +414,7 @@ // At halftime, we announce whether or not the AA forced the dropship to divert // The rounding is because transit time is decreased by 10 each loop. Travel time, however, might not be a multiple of 10 if(in_transit_time_left == round(travel_time / 2, 10) && true_crash_target_section != crash_target_section) - marine_announcement("A hostile aircraft on course for the [true_crash_target_section] has been successfully deterred.", "IX-50 MGAD System") + marine_announcement("A hostile aircraft on course for the [true_crash_target_section] has been successfully deterred.", "IX-50 MGAD System", logging = ARES_LOG_SECURITY) var/area/shuttle_area for(var/turf/T in turfs_int) @@ -438,7 +438,7 @@ //This is where things change and shit gets real - marine_announcement("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT." , "EMERGENCY", 'sound/AI/dropship_emergency.ogg') + marine_announcement("DROPSHIP ON COLLISION COURSE. CRASH IMMINENT." , "EMERGENCY", 'sound/AI/dropship_emergency.ogg', logging = ARES_LOG_SECURITY) for(var/mob/dead/observer/observer as anything in GLOB.observer_list) to_chat(observer, SPAN_DEADSAY(FONT_SIZE_LARGE("The dropship is about to impact [get_area_name(T_trg)]" + " [OBSERVER_JMP(observer, T_trg)]"))) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index e765851c3b29..ecf1bacf080b 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -291,7 +291,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) if(round_statistics) round_statistics.track_hijack() - marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg') + marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) shuttle.alerts_allowed-- to_chat(Q, SPAN_DANGER("A loud alarm erupts from [src]! The fleshy hosts must know that you can access it!")) diff --git a/colonialmarines.dme b/colonialmarines.dme index 991c23d53bbe..ebd73b3544dd 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -31,6 +31,7 @@ #include "code\__DEFINES\_tick.dm" #include "code\__DEFINES\access.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\ARES.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\autolathe.dm" #include "code\__DEFINES\blood.dm" @@ -774,6 +775,10 @@ #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\weather_siren.dm" +#include "code\game\machinery\ARES\ARES.dm" +#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\atmoalter\canister.dm" #include "code\game\machinery\atmoalter\meter.dm" #include "code\game\machinery\atmoalter\portable_atmospherics.dm" diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 08a5c5fa8ef1..b62860559b16 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/structures/machinery/ares.dmi b/icons/obj/structures/machinery/ares.dmi new file mode 100644 index 000000000000..77dd304310f6 Binary files /dev/null and b/icons/obj/structures/machinery/ares.dmi differ diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 7043cc4cccee..63562239f4dc 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -835,6 +835,20 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/basketball) +"acJ" = ( +/mob/living/silicon/decoy/ship_ai{ + pixel_y = -16; + layer = 2.98 + }, +/obj/structure/blocker/invisible_wall, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "acK" = ( /obj/structure/desertdam/decals/road_edge{ pixel_x = 2 @@ -2448,18 +2462,24 @@ /obj/item/paper_bin/uscm, /obj/item/tool/pen, /obj/structure/machinery/door_control{ - id = "bot_uniforms"; - name = "Uniform Vendor Lockdown"; - pixel_x = -8; - pixel_y = 10; - req_access_txt = "1" + id = "ARES StairsLock"; + name = "ARES Exterior Lockdown Override"; + req_one_access_txt = "90;91;92"; + pixel_y = -24; + pixel_x = 8 + }, +/obj/structure/machinery/door_control{ + id = "ARES Emergency"; + name = "ARES Emergency Lockdown Override"; + req_one_access_txt = "91;92"; + pixel_y = -24 }, /obj/structure/machinery/door_control{ id = "Brig Lockdown Shutters"; - name = "Brig Lockdown"; - pixel_x = 10; - pixel_y = 10; - req_access_txt = "1;3" + name = "Brig Lockdown Override"; + req_access_txt = "1;3"; + pixel_x = -8; + pixel_y = -24 }, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -3308,6 +3328,13 @@ /obj/structure/machinery/light{ dir = 1 }, +/obj/structure/machinery/door_control{ + id = "bot_uniforms"; + name = "Uniform Vendor Lockdown"; + pixel_x = 8; + pixel_y = 24; + req_access_txt = "31" + }, /turf/open/floor/almayer{ dir = 1; icon_state = "silver" @@ -5249,7 +5276,7 @@ }, /area/almayer/engineering/engineering_workshop/hangar) "aqU" = ( -/turf/closed/wall/almayer, +/turf/closed/wall/almayer/reinforced, /area/almayer/command/airoom) "aqV" = ( /obj/structure/machinery/light{ @@ -5785,17 +5812,15 @@ }, /area/almayer/engineering/engineering_workshop/hangar) "asD" = ( -/obj/structure/machinery/light{ - dir = 1 - }, +/obj/effect/step_trigger/clone_cleaner, /obj/structure/machinery/door_control{ - id = "areslockdownexterior"; - name = "ARES Lockdown"; - pixel_x = -25; - req_one_access_txt = "19" + id = "ARES StairsUpper"; + name = "ARES Core Access"; + req_one_access_txt = "1;200;90;91;92"; + pixel_y = 24; + pixel_x = -24 }, -/obj/effect/landmark/start/working_joe, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -5803,20 +5828,23 @@ /turf/closed/wall/almayer/reinforced, /area/almayer/engineering/engineering_workshop/hangar) "asF" = ( -/obj/structure/machinery/door_control{ - id = "areslockdowninterior"; - name = "ARES Lockdown"; - pixel_x = -25; - req_one_access_txt = "19" +/obj/structure/machinery/door/airlock/almayer/secure/reinforced{ + name = "\improper AI Reception"; + req_access = null; + req_one_access_txt = "91;92" }, -/mob/living/silicon/decoy/ship_ai, -/obj/structure/blocker/invisible_wall, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) "asG" = ( -/turf/open/floor/almayer{ +/obj/structure/surface/table/reinforced/almayer_B{ + climbable = 0; + unacidable = 1; + unslashable = 1; + indestructible = 1 + }, +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -5960,6 +5988,15 @@ }, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/north2) +"asZ" = ( +/obj/structure/machinery/computer/cameras/almayer/ares{ + dir = 4; + pixel_x = -17 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "ata" = ( /obj/structure/machinery/light{ dir = 8 @@ -6366,12 +6403,14 @@ }, /area/almayer/lifeboat_pumps/south1) "auc" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; - id = "areslockdownexterior"; - name = "\improper ARES Core Shutters" + id = "ARES StairsLock"; + name = "ARES Exterior Lockdown" }, -/turf/open/floor/almayer{ +/obj/effect/step_trigger/ares_alert/access_control, +/turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, /area/almayer/command/airoom) @@ -6394,20 +6433,14 @@ }, /area/almayer/hallways/port_hallway) "auf" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "areslockdowninterior"; - name = "\improper ARES Core Shutters" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/closed/wall/almayer/white/hull, /area/almayer/command/airoom) "aug" = ( /obj/structure/bed/chair/office/dark{ - dir = 1 + dir = 8 }, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -7043,29 +7076,64 @@ }, /area/almayer/living/starboard_garden) "avK" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 4; - name = "ship-grade camera" - }, -/obj/effect/landmark/start/working_joe, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) "avL" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/station_alert{ - dir = 1 +/obj/structure/machinery/door_control{ + id = "ARES StairsUpper"; + name = "ARES Core Access"; + req_one_access_txt = "91;92"; + pixel_y = -24; + pixel_x = -10 }, -/turf/open/floor/almayer{ +/obj/structure/machinery/door_control{ + id = "ARES StairsLock"; + name = "ARES Exterior Lockdown"; + req_one_access_txt = "91;92"; + pixel_y = -24 + }, +/obj/structure/surface/table/reinforced/almayer_B{ + climbable = 0; + unacidable = 1; + unslashable = 1; + indestructible = 1 + }, +/obj/structure/transmitter/rotary{ + phone_color = "blue"; + phone_id = "AI Reception"; + phone_category = "ARES"; + name = "AI Reception Telephone" + }, +/obj/structure/machinery/door_control{ + id = "ARES Emergency"; + name = "ARES Emergency Lockdown"; + req_one_access_txt = "91;92"; + pixel_y = -24; + pixel_x = 10 + }, +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) "avM" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/item/paper_bin/uscm, +/obj/structure/machinery/computer/cameras/almayer/ares{ + dir = 8; + pixel_x = 17; + pixel_y = 6 + }, +/obj/structure/surface/table/reinforced/almayer_B{ + climbable = 0; + unacidable = 1; + unslashable = 1; + indestructible = 1 + }, +/obj/item/paper_bin/uscm{ + pixel_y = 6 + }, /obj/item/tool/pen, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -7273,21 +7341,18 @@ }, /area/almayer/command/cic) "awu" = ( -/obj/structure/machinery/door_control{ - id = "areslockdownexterior"; - name = "ARES Lockdown"; - pixel_x = 25; - req_one_access_txt = "19" +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 }, /obj/effect/decal/warning_stripes{ - icon_state = "E"; - pixel_x = 1 + icon_state = "W"; + pixel_x = -1 }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "cargo_arrow" +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/command/airoom) "awv" = ( /obj/structure/machinery/computer/telecomms/monitor, /turf/open/floor/almayer{ @@ -7796,6 +7861,10 @@ /obj/item/storage/belt/medical/full, /obj/item/storage/belt/medical/full, /obj/item/storage/belt/medical/full, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 17 + }, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -9088,6 +9157,14 @@ icon_state = "plate" }, /area/almayer/command/cic) +"aCd" = ( +/obj/structure/bed/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "aCf" = ( /obj/structure/window/framed/almayer/hull/hijack_bustable, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -10904,6 +10981,47 @@ }, /turf/open/floor/almayer, /area/almayer/command/cichallway) +"aKs" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/door_control{ + id = "ARES Interior"; + name = "ARES Chamber Lockdown"; + req_one_access_txt = "1;200;90;91;92"; + pixel_x = 24; + pixel_y = -8; + indestructible = 1 + }, +/obj/structure/machinery/door_control{ + id = "ARES Railing"; + name = "ARES Chamber Railings"; + req_one_access_txt = "91;92"; + pixel_x = 24; + needs_power = 0; + indestructible = 1 + }, +/obj/structure/machinery/door/poddoor/railing{ + dir = 2; + id = "ARES Railing"; + unslashable = 0; + unacidable = 0; + pixel_y = -1; + pixel_x = -1; + open_layer = 2.1; + closed_layer = 4.1; + density = 0; + layer = 2.1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "aKu" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -13339,6 +13457,10 @@ }, /area/almayer/hallways/stern_hallway) "aWb" = ( +/obj/structure/machinery/computer/working_joe{ + dir = 4; + pixel_x = -17 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "orangecorner" @@ -14164,6 +14286,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) +"bat" = ( +/obj/structure/machinery/door_control{ + id = "ARES Mainframe Right"; + name = "ARES Mainframe Lockdown"; + req_one_access_txt = "200;91;92"; + pixel_x = -24; + pixel_y = -24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "baw" = ( /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) @@ -20929,6 +21063,26 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"bIp" = ( +/obj/effect/step_trigger/ares_alert/mainframe, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Mainframe Left"; + name = "\improper ARES Mainframe Shutters"; + plane = -7 + }, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "bIs" = ( /obj/structure/largecrate/supply/supplies/mre, /obj/structure/machinery/light/small{ @@ -21710,6 +21864,23 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/vehiclehangar) +"bLv" = ( +/obj/structure/machinery/door_control{ + id = "ARES StairsLower"; + name = "ARES Core Lockdown"; + req_one_access_txt = "19;200;90;91;92"; + pixel_x = 24; + pixel_y = -8 + }, +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 8; + pixel_y = 2 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "bLw" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/light{ @@ -23087,6 +23258,35 @@ icon_state = "red" }, /area/almayer/shipboard/brig/lobby) +"bRo" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES StairsLower"; + name = "\improper ARES Core Shutters"; + plane = -7 + }, +/obj/effect/step_trigger/ares_alert/public{ + alert_message = "Caution: Movement detected in ARES Core."; + cooldown_duration = 1200; + alert_id = "AresStairs" + }, +/obj/effect/step_trigger/ares_alert/public{ + alert_message = "Caution: Movement detected in ARES Core."; + cooldown_duration = 1200; + alert_id = "AresStairs" + }, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "bRr" = ( /obj/structure/machinery/fuelcell_recycler, /turf/open/floor/almayer{ @@ -23782,6 +23982,13 @@ icon_state = "blue" }, /area/almayer/squads/delta) +"bUx" = ( +/obj/effect/landmark/start/working_joe, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/almayer/command/airoom) "bUy" = ( /obj/structure/closet/crate/ammo, /obj/structure/machinery/light/small, @@ -25542,11 +25749,18 @@ }, /area/almayer/command/cichallway) "cck" = ( -/obj/structure/window/framed/almayer/hull/hijack_bustable, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 +/obj/structure/surface/table/reinforced/almayer_B, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, -/turf/open/floor/plating, /area/almayer/command/airoom) "ccq" = ( /obj/effect/decal/warning_stripes{ @@ -27187,6 +27401,17 @@ "cls" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/port_point_defense) +"clw" = ( +/obj/structure/machinery/light{ + dir = 8; + unacidable = 1; + unslashable = 1; + invisibility = 101 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "cly" = ( /obj/structure/disposalpipe/segment, /obj/structure/sign/safety/maint{ @@ -27578,12 +27803,10 @@ }, /area/almayer/hallways/starboard_hallway) "cnp" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/item/folder/yellow, /obj/structure/machinery/light{ dir = 4 }, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -27923,6 +28146,19 @@ icon_state = "green" }, /area/almayer/hallways/starboard_hallway) +"cqm" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/item/folder/white{ + pixel_y = 6 + }, +/obj/item/folder/white{ + pixel_y = 6; + pixel_x = 5 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "cqn" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -28212,6 +28448,12 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"cwS" = ( +/obj/structure/blocker/invisible_wall, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "cwX" = ( /obj/structure/ladder{ height = 1; @@ -28219,6 +28461,18 @@ }, /turf/open/floor/plating/almayer, /area/almayer/living/briefing) +"cxc" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "cxe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28376,6 +28630,24 @@ icon_state = "plate" }, /area/almayer/hallways/vehiclehangar) +"cBm" = ( +/obj/effect/projector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "cBs" = ( /obj/structure/bed/chair, /obj/effect/decal/warning_stripes{ @@ -28826,6 +29098,16 @@ /obj/item/tool/lighter/zippo, /turf/open/floor/wood/ship, /area/almayer/shipboard/sea_office) +"cLo" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer/no_build{ + dir = 2; + icon_state = "cargo_arrow" + }, +/area/almayer/command/airoom) "cLp" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -29462,6 +29744,9 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south1) +"daz" = ( +/turf/closed/wall/almayer/white/hull, +/area/almayer/command/airoom) "dbe" = ( /obj/structure/largecrate/random/case/double, /obj/structure/machinery/camera/autoname/almayer{ @@ -30601,6 +30886,12 @@ icon_state = "plate" }, /area/almayer/living/briefing) +"dyp" = ( +/obj/structure/machinery/ares/cpu, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "dyx" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 2; @@ -30816,6 +31107,15 @@ icon_state = "orange" }, /area/almayer/engineering/engine_core) +"dDp" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + layer = 3.3 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "dDt" = ( /obj/structure/toilet{ dir = 1 @@ -30954,6 +31254,23 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) +"dGl" = ( +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "dGr" = ( /obj/structure/pipes/vents/scrubber{ dir = 8 @@ -31092,6 +31409,12 @@ }, /turf/open/floor/plating, /area/almayer/living/bridgebunks) +"dIi" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/open/floor/plating/plating_catwalk{ + allow_construction = 0 + }, +/area/almayer/command/airoom) "dIl" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -31099,6 +31422,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) +"dIn" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 5 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "dII" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/alpha_bravo, /obj/effect/decal/warning_stripes{ @@ -31275,6 +31606,23 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) +"dQl" = ( +/obj/structure/platform{ + dir = 4 + }, +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "dQv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -31737,6 +32085,9 @@ icon_state = "orange" }, /area/almayer/engineering/engine_core) +"ebN" = ( +/turf/closed/wall/almayer/white/reinforced, +/area/almayer/command/airoom) "ebO" = ( /obj/structure/machinery/light/small, /turf/open/floor/almayer{ @@ -32669,6 +33020,17 @@ /obj/effect/landmark/late_join/delta, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) +"erN" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/pipes/vents/pump/no_boom{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "erS" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -32798,6 +33160,21 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/testlab) +"euN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out" + }, +/obj/structure/machinery/door_control{ + id = "ARES Mainframe Left"; + name = "ARES Mainframe Lockdown"; + req_one_access_txt = "200;91;92"; + pixel_x = 24; + pixel_y = 24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "euO" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ @@ -33483,6 +33860,20 @@ icon_state = "test_floor5" }, /area/almayer/squads/req) +"eKJ" = ( +/obj/structure/machinery/status_display{ + pixel_y = 30 + }, +/obj/structure/machinery/light{ + dir = 4; + unacidable = 1; + unslashable = 1; + invisibility = 101 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "eKK" = ( /obj/structure/sink{ dir = 4; @@ -34042,6 +34433,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) +"eYz" = ( +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "eYC" = ( /obj/structure/machinery/vending/cigarette, /turf/open/floor/wood/ship, @@ -34289,6 +34688,19 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"fcX" = ( +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/platform_decoration{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "fdj" = ( /obj/structure/surface/table/almayer, /obj/item/storage/pouch/tools/full, @@ -34383,6 +34795,11 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_two) +"ffE" = ( +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "fgh" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -34585,6 +35002,19 @@ icon_state = "plate" }, /area/almayer/squads/req) +"fmv" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "fmB" = ( /obj/structure/bed/chair/comfy{ dir = 8 @@ -34800,6 +35230,19 @@ }, /turf/open/floor/plating/almayer, /area/almayer/shipboard/brig/armory) +"frM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "fsd" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -35343,6 +35786,14 @@ icon_state = "test_floor4" }, /area/almayer/living/grunt_rnr) +"fEN" = ( +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "fER" = ( /obj/structure/machinery/autolathe, /turf/open/floor/almayer{ @@ -35634,6 +36085,23 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_s) +"fJY" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + dir = 8; + icon_state = "cargo_arrow" + }, +/area/almayer/command/airoom) +"fKe" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "fKg" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating/plating_catwalk, @@ -35723,6 +36191,47 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/lower_engineering) +"fMl" = ( +/obj/structure/machinery/door_control{ + id = "ARES Operations Right"; + name = "ARES Operations Shutter"; + req_one_access_txt = "1;200;91;92"; + pixel_x = 24; + pixel_y = -8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) +"fMt" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Interior"; + name = "\improper ARES Inner Chamber Shutters"; + plane = -7 + }, +/obj/effect/step_trigger/ares_alert/core, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/obj/structure/sign/safety/laser{ + pixel_x = 32; + pixel_y = -8 + }, +/obj/structure/sign/safety/rewire{ + pixel_y = 6; + pixel_x = 32 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "fMA" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out" @@ -35859,6 +36368,12 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"fPB" = ( +/obj/structure/machinery/ares/processor/apollo, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "fQk" = ( /obj/structure/largecrate/random, /turf/open/floor/plating/plating_catwalk, @@ -36227,6 +36742,50 @@ icon_state = "silver" }, /area/almayer/command/cichallway) +"gba" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/faxmachine/uscm/command{ + department = "AI Core"; + pixel_y = 8 + }, +/obj/structure/transmitter/rotary{ + pixel_x = 8; + pixel_y = -8; + phone_color = "blue"; + phone_id = "AI Core"; + phone_category = "ARES"; + name = "AI Core Telephone" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) +"gbg" = ( +/obj/structure/sign/safety/terminal{ + pixel_y = 24; + pixel_x = 14 + }, +/obj/structure/sign/safety/laser{ + pixel_y = 24 + }, +/obj/structure/sign/safety/fibre_optics{ + pixel_x = 14; + pixel_y = 38 + }, +/obj/structure/sign/safety/rewire{ + pixel_y = 38 + }, +/obj/structure/machinery/door_control{ + id = "ARES Operations Right"; + name = "ARES Operations Shutter"; + req_one_access_txt = "1;200;91;92"; + pixel_x = -24; + pixel_y = -8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "gbQ" = ( /obj/structure/toilet{ dir = 8 @@ -36432,14 +36991,23 @@ }, /turf/open/floor/almayer, /area/almayer/squads/delta) -"gfE" = ( -/obj/structure/machinery/light{ - dir = 4 +"gfu" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 }, -/turf/open/floor/almayer{ +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/turf/open/floor/almayer/no_build{ icon_state = "tcomms" }, /area/almayer/command/airoom) +"gfE" = ( +/obj/structure/machinery/recharge_station, +/turf/open/floor/plating, +/area/almayer/command/airoom) "gfS" = ( /obj/structure/sign/safety/cryo{ pixel_y = -26 @@ -36598,8 +37166,25 @@ }, /area/almayer/hull/lower_hull/l_f_s) "gjw" = ( -/obj/structure/blocker/invisible_wall, -/turf/open/floor/almayer{ +/obj/structure/machinery/faxmachine/uscm/command{ + department = "AI Core"; + pixel_y = 32; + density = 0 + }, +/obj/structure/surface/rack{ + pixel_y = 16; + density = 0 + }, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 17; + pixel_y = -6; + ticket_console = 1 + }, +/obj/item/storage/box/ids{ + pixel_x = -4 + }, +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -37051,6 +37636,12 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) +"gwn" = ( +/obj/structure/machinery/ares/processor/bioscan, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "gwo" = ( /turf/open/floor/almayer{ dir = 4; @@ -37237,6 +37828,16 @@ icon_state = "orange" }, /area/almayer/hallways/starboard_hallway) +"gyN" = ( +/obj/structure/machinery/prop{ + icon_state = "comm_server"; + name = "server box"; + desc = "It's a server box..." + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "gyO" = ( /obj/structure/pipes/vents/pump{ dir = 8 @@ -37322,6 +37923,24 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"gAe" = ( +/obj/structure/filingcabinet{ + density = 0; + pixel_x = -8; + pixel_y = 18 + }, +/obj/structure/filingcabinet{ + density = 0; + pixel_x = 8; + pixel_y = 18 + }, +/obj/item/folder/white, +/obj/item/folder/white, +/obj/item/folder/white, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "gAj" = ( /obj/structure/bed/chair/comfy/charlie{ dir = 1 @@ -37845,6 +38464,39 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_p) +"gMN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/door_control{ + id = "ARES Interior"; + name = "ARES Chamber Lockdown"; + req_one_access_txt = "1;200;90;91;92"; + pixel_x = -24; + pixel_y = -8; + indestructible = 1 + }, +/obj/structure/machinery/door/poddoor/railing{ + dir = 2; + id = "ARES Railing"; + unslashable = 0; + unacidable = 0; + pixel_y = -1; + pixel_x = -1; + open_layer = 2.1; + density = 0; + closed_layer = 4.1; + layer = 2.1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "gMU" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -37879,6 +38531,33 @@ /obj/effect/spawner/random/tool, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_p) +"gOs" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/machinery/door_control{ + id = "ARES Interior"; + name = "ARES Chamber Lockdown"; + req_one_access_txt = "1;200;90;91;92"; + pixel_x = 24; + pixel_y = 8; + indestructible = 1 + }, +/obj/structure/machinery/door/poddoor/railing{ + id = "ARES Railing"; + unslashable = 0; + unacidable = 0; + open_layer = 2.1; + density = 0; + layer = 2.1; + closed_layer = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "gPc" = ( /obj/structure/machinery/power/terminal{ dir = 1 @@ -37888,6 +38567,23 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"gPr" = ( +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/machinery/light{ + unacidable = 1; + unslashable = 1 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "gPF" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ @@ -38014,6 +38710,23 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) +"gTH" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/skills{ + dir = 4; + pixel_y = 18 + }, +/obj/structure/machinery/computer/secure_data{ + dir = 4 + }, +/obj/structure/machinery/computer/med_data/laptop{ + dir = 4; + pixel_y = -18 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "gUf" = ( /obj/structure/machinery/portable_atmospherics/hydroponics, /turf/open/floor/almayer{ @@ -38061,6 +38774,15 @@ }, /turf/open/floor/almayer, /area/almayer/living/bridgebunks) +"gUN" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + dir = 4; + icon_state = "cargo_arrow" + }, +/area/almayer/command/airoom) "gUV" = ( /turf/open/floor/almayer{ icon_state = "redcorner" @@ -38133,6 +38855,20 @@ icon_state = "plate" }, /area/almayer/engineering/engineering_workshop) +"gXs" = ( +/obj/effect/step_trigger/ares_alert/terminals, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Operations Right"; + name = "\improper ARES Operations Shutters"; + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "gXv" = ( /obj/structure/sign/safety/nonpress_0g{ pixel_x = 32 @@ -39107,18 +39843,9 @@ /turf/open/floor/almayer, /area/almayer/command/cic) "hvw" = ( -/obj/structure/machinery/r_n_d/server/core{ - unacidable = 1; - unslashable = 1 - }, -/obj/structure/sign/safety/rewire{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "tcomms" - }, -/area/almayer/command/airoom) +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/open/floor/plating, +/area/almayer/powered/agent) "hvH" = ( /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) @@ -39254,6 +39981,17 @@ allow_construction = 0 }, /area/almayer/shipboard/brig/processing) +"hyE" = ( +/obj/structure/machinery/door/poddoor/almayer/open{ + dir = 4; + id = "ARES StairsLock"; + name = "ARES Exterior Lockdown" + }, +/obj/effect/step_trigger/ares_alert/access_control, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "hyQ" = ( /turf/closed/wall/almayer, /area/almayer/living/synthcloset) @@ -40040,6 +40778,33 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/execution) +"hRW" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/sign/safety/rewire{ + pixel_y = 38 + }, +/obj/structure/sign/safety/laser{ + pixel_y = 24 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_x = -17; + dir = 4 + }, +/obj/structure/sign/safety/terminal{ + pixel_y = 24; + pixel_x = 14 + }, +/obj/structure/sign/safety/fibre_optics{ + pixel_x = 14; + pixel_y = 38 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "hSk" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/engineering/upper_engineering/port) @@ -40101,6 +40866,18 @@ }, /turf/closed/wall/almayer/outer, /area/almayer/hull/lower_hull/l_a_p) +"hTl" = ( +/obj/structure/prop/server_equipment/yutani_server{ + pixel_y = 16; + name = "server tower"; + desc = "A powerful server tower housing various AI functions."; + density = 0 + }, +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "hTt" = ( /obj/structure/machinery/brig_cell/cell_1{ pixel_x = 32; @@ -40344,6 +41121,15 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/hangar) +"hZj" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "hZN" = ( /obj/structure/machinery/medical_pod/bodyscanner, /obj/structure/disposalpipe/segment{ @@ -40564,6 +41350,20 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/lower_medical_lobby) +"ieF" = ( +/obj/effect/projector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "ieH" = ( /obj/structure/sign/safety/storage{ pixel_x = 8; @@ -40619,6 +41419,14 @@ }, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) +"igr" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "igt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41087,8 +41895,17 @@ /turf/open/floor/plating, /area/almayer/living/port_emb) "isC" = ( -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/effect/projector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "isH" = ( @@ -41134,6 +41951,33 @@ icon_state = "bluecorner" }, /area/almayer/hallways/aft_hallway) +"itf" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/machinery/door_control{ + id = "ARES Interior"; + name = "ARES Chamber Lockdown"; + req_one_access_txt = "1;200;90;91;92"; + pixel_x = -24; + pixel_y = 8; + indestructible = 1 + }, +/obj/structure/machinery/door/poddoor/railing{ + id = "ARES Railing"; + unslashable = 0; + unacidable = 0; + open_layer = 2.1; + density = 0; + layer = 2.1; + closed_layer = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "itR" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -41363,6 +42207,18 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) +"iyH" = ( +/obj/structure/surface/table/reinforced/almayer_B{ + climbable = 0; + unacidable = 1; + unslashable = 1; + indestructible = 1; + desc = "A square metal surface resting on its fat metal bottom. You can't flip something that doesn't have legs. This one has a metal rail running above it, preventing something large passing over. Like you." + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "iyQ" = ( /turf/open/floor/almayer{ dir = 5; @@ -42419,6 +43275,23 @@ icon_state = "red" }, /area/almayer/command/lifeboat) +"iZw" = ( +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "iZG" = ( /obj/structure/window/framed/almayer/hull, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -42484,6 +43357,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_p) +"jaH" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/item/paper_bin/uscm{ + pixel_y = 6 + }, +/obj/item/tool/pen, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "jaP" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/cameras/almayer_network{ @@ -43261,6 +44144,26 @@ allow_construction = 0 }, /area/almayer/shipboard/brig/lobby) +"jqP" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Interior"; + name = "\improper ARES Inner Chamber Shutters"; + plane = -7 + }, +/obj/effect/step_trigger/ares_alert/core, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "jre" = ( /obj/structure/closet/secure_closet/cargotech, /obj/item/clothing/accessory/storage/webbing, @@ -43296,6 +44199,14 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/hydroponics) +"jtj" = ( +/obj/structure/machinery/status_display{ + pixel_y = 30 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "jtJ" = ( /obj/structure/machinery/door_control{ id = "laddernorthwest"; @@ -43385,6 +44296,12 @@ icon_state = "test_floor4" }, /area/almayer/squads/alpha) +"jvB" = ( +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "jvI" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/almayer{ @@ -43588,6 +44505,29 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_lobby) +"jDV" = ( +/obj/effect/projector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/obj/structure/machinery/door_control{ + id = "ARES StairsUpper"; + name = "ARES Core Access"; + req_one_access_txt = "19;200;90;91;92"; + pixel_x = 24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "jEs" = ( /obj/structure/surface/table/almayer, /obj/item/tool/screwdriver{ @@ -44077,6 +45017,19 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_p) +"jRz" = ( +/obj/effect/step_trigger/teleporter/random{ + affect_ghosts = 1; + name = "tele_ground1"; + teleport_x = 180; + teleport_x_offset = 200; + teleport_y = 50; + teleport_y_offset = 80; + teleport_z = 1; + teleport_z_offset = 1 + }, +/turf/closed/wall/almayer/outer, +/area/space) "jRK" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -44365,6 +45318,22 @@ icon_state = "mono" }, /area/almayer/hallways/vehiclehangar) +"jYR" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "jZd" = ( /obj/structure/pipes/vents/pump{ dir = 8; @@ -44563,9 +45532,19 @@ }, /area/almayer/engineering/upper_engineering) "kbH" = ( -/obj/structure/window/reinforced, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "kbV" = ( @@ -44696,6 +45675,9 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) +"kfU" = ( +/turf/open/floor/plating, +/area/almayer/powered/agent) "kfX" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -44769,6 +45751,22 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"khJ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "khS" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -45039,6 +46037,10 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_p) +"kpc" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/almayer/command/airoom) "kpl" = ( /obj/structure/machinery/door_control{ id = "cl_shutters"; @@ -45568,6 +46570,19 @@ icon_state = "red" }, /area/almayer/hallways/port_hallway) +"kzT" = ( +/obj/structure/machinery/door_control{ + id = "ARES StairsLower"; + name = "ARES Core Lockdown"; + req_one_access_txt = "19;200;90;91;92"; + pixel_x = -24; + pixel_y = -8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "kAh" = ( /obj/structure/sign/safety/restrictedarea{ pixel_x = -17 @@ -45600,6 +46615,12 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south2) +"kBy" = ( +/obj/structure/machinery/ares/processor, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "kBP" = ( /turf/open/floor/almayer{ dir = 9; @@ -45948,6 +46969,24 @@ icon_state = "test_floor4" }, /area/almayer/living/grunt_rnr) +"kKv" = ( +/obj/effect/projector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "kKG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46293,6 +47332,21 @@ icon_state = "orange" }, /area/almayer/hallways/hangar) +"kSy" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out" + }, +/obj/structure/machinery/door_control{ + id = "ARES Mainframe Right"; + name = "ARES Mainframe Lockdown"; + req_one_access_txt = "200;91;92"; + pixel_x = -24; + pixel_y = 24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "kSJ" = ( /obj/structure/disposalpipe/junction{ dir = 4; @@ -46501,6 +47555,12 @@ icon_state = "silver" }, /area/almayer/command/computerlab) +"kXj" = ( +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "kXu" = ( /turf/open/floor/almayer{ dir = 8; @@ -46701,6 +47761,12 @@ icon_state = "plate" }, /area/almayer/squads/charlie) +"lcg" = ( +/obj/structure/machinery/ares/substrate, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "lcy" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -46946,9 +48012,20 @@ /turf/open/floor/wood/ship, /area/almayer/living/basketball) "lin" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/effect/projector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "liJ" = ( @@ -47090,17 +48167,8 @@ }, /area/almayer/medical/medical_science) "lmz" = ( -/obj/structure/machinery/door_control{ - id = "areslockdowninterior"; - name = "ARES Lockdown"; - pixel_x = 25; - req_one_access_txt = "19" - }, -/obj/effect/landmark/start/working_joe, -/turf/open/floor/almayer{ - icon_state = "ai_floors" - }, -/area/almayer/command/airoom) +/turf/closed/wall/almayer/white/hull, +/area/space) "lmE" = ( /obj/structure/reagent_dispensers/fueltank/custom, /turf/open/floor/almayer{ @@ -47149,6 +48217,32 @@ icon_state = "kitchen" }, /area/almayer/engineering/upper_engineering) +"lnS" = ( +/obj/structure/sign/safety/rewire{ + pixel_y = 38 + }, +/obj/structure/sign/safety/fibre_optics{ + pixel_x = 14; + pixel_y = 38 + }, +/obj/structure/sign/safety/laser{ + pixel_y = 24 + }, +/obj/structure/sign/safety/terminal{ + pixel_y = 24; + pixel_x = 14 + }, +/obj/structure/machinery/door_control{ + id = "ARES Operations Left"; + name = "ARES Operations Shutter"; + req_one_access_txt = "1;200;91;92"; + pixel_x = 24; + pixel_y = -8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "lok" = ( /obj/structure/machinery/cm_vending/clothing/marine/charlie, /obj/structure/sign/safety/cryo{ @@ -48927,6 +50021,22 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) +"mdW" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/item/folder/white, +/obj/item/folder/white, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "meu" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -49212,10 +50322,15 @@ }, /area/almayer/engineering/port_atmos) "mlb" = ( -/obj/structure/machinery/status_display{ - pixel_y = 30 +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 }, -/turf/open/floor/almayer{ +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer/no_build{ icon_state = "tcomms" }, /area/almayer/command/airoom) @@ -49919,6 +51034,26 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) +"mFN" = ( +/obj/effect/step_trigger/ares_alert/mainframe, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Mainframe Right"; + name = "\improper ARES Mainframe Shutters"; + plane = -7 + }, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "mFO" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -49994,6 +51129,12 @@ }, /turf/open/floor/wood/ship, /area/almayer/medical/medical_science) +"mHE" = ( +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "mHO" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -50230,6 +51371,10 @@ icon_state = "plate" }, /area/almayer/living/pilotbunks) +"mLE" = ( +/obj/effect/landmark/start/working_joe, +/turf/open/floor/plating, +/area/almayer/command/airoom) "mLF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -50363,8 +51508,7 @@ }, /area/almayer/engineering/laundry) "mOi" = ( -/obj/structure/blocker/invisible_wall, -/turf/closed/wall/almayer, +/turf/closed/wall/almayer/outer, /area/almayer/command/airoom) "mOr" = ( /obj/structure/surface/table/almayer, @@ -50479,6 +51623,34 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"mRn" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Interior"; + name = "\improper ARES Inner Chamber Shutters"; + plane = -7 + }, +/obj/effect/step_trigger/ares_alert/core, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/obj/structure/sign/safety/terminal{ + pixel_y = -8; + pixel_x = -18 + }, +/obj/structure/sign/safety/fibre_optics{ + pixel_x = -18; + pixel_y = 6 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "mRW" = ( /turf/open/floor/almayer/research/containment/corner1, /area/almayer/medical/containment/cell/cl) @@ -50606,6 +51778,27 @@ icon_state = "test_floor4" }, /area/almayer/squads/bravo) +"mUz" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/cameras/almayer/ares{ + dir = 8; + pixel_x = 17 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) +"mUC" = ( +/obj/structure/machinery/light{ + dir = 4; + unacidable = 1; + unslashable = 1; + invisibility = 101 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "mUQ" = ( /obj/structure/largecrate/random/barrel/red, /turf/open/floor/almayer{ @@ -52034,8 +53227,6 @@ /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, -/obj/effect/landmark/wo_supplies/guns/common/m39, -/obj/effect/landmark/wo_supplies/guns/common/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, /obj/structure/sign/safety/ammunition{ @@ -52045,6 +53236,8 @@ /obj/structure/sign/safety/hazard{ pixel_y = 32 }, +/obj/item/weapon/gun/smg/m39, +/obj/item/weapon/gun/smg/m39, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -52377,6 +53570,15 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"nJH" = ( +/obj/structure/machinery/computer/cameras/almayer/ares{ + dir = 8; + pixel_x = 17 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "nKq" = ( /obj/structure/machinery/status_display{ pixel_x = 16; @@ -52461,6 +53663,20 @@ icon_state = "bluefull" }, /area/almayer/living/briefing) +"nMq" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 17 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "silver" + }, +/area/almayer/hallways/aft_hallway) "nMu" = ( /turf/open/floor/almayer{ dir = 9; @@ -53064,6 +54280,34 @@ }, /turf/open/floor/carpet, /area/almayer/living/commandbunks) +"ocB" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/sign/safety/terminal{ + pixel_y = 24; + pixel_x = 14 + }, +/obj/structure/sign/safety/fibre_optics{ + pixel_x = 14; + pixel_y = 38 + }, +/obj/structure/machinery/computer/working_joe{ + dir = 8; + pixel_x = 17; + ticket_console = 1 + }, +/obj/structure/sign/safety/laser{ + pixel_y = 24 + }, +/obj/structure/sign/safety/rewire{ + pixel_y = 38 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "oda" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/device/radio{ @@ -53762,6 +55006,17 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"osy" = ( +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/platform_decoration, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "osz" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -53856,6 +55111,19 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) +"our" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/item/paper_bin/uscm{ + pixel_y = 6 + }, +/obj/item/tool/pen, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "ouB" = ( /obj/structure/bed/sofa/vert/grey/bot, /turf/open/floor/almayer, @@ -54426,13 +55694,26 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) "oJR" = ( -/obj/structure/closet/toolcloset, -/obj/structure/machinery/firealarm{ - dir = 8; +/obj/effect/projector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/platform{ + dir = 8 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/obj/structure/machinery/door_control{ + id = "ARES StairsUpper"; + name = "ARES Core Access"; + req_one_access_txt = "19;200;90;91;92"; pixel_x = -24 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "oKb" = ( @@ -54482,6 +55763,24 @@ /obj/effect/landmark/late_join/bravo, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) +"oLm" = ( +/obj/structure/machinery/door_control{ + id = "ARES StairsLower"; + name = "ARES Core Lockdown"; + req_one_access_txt = "19;200;90;91;92"; + pixel_x = -24; + pixel_y = 8 + }, +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 4; + pixel_y = -8 + }, +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "oLv" = ( /obj/structure/sign/safety/medical{ pixel_x = 8; @@ -54775,6 +56074,16 @@ icon_state = "plate" }, /area/almayer/living/gym) +"oRV" = ( +/obj/structure/blocker/invisible_wall, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "oRZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55269,6 +56578,12 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"pfT" = ( +/obj/structure/machinery/ares/processor/interface, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "pgo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55282,12 +56597,20 @@ /turf/closed/wall/almayer, /area/almayer/lifeboat_pumps/south1) "pgH" = ( -/obj/structure/window/reinforced{ - dir = 4; - health = 80 +/obj/effect/projector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/platform{ + dir = 4 + }, +/obj/structure/stairs{ + dir = 1; + icon_state = "ramptop" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "pha" = ( @@ -55483,6 +56806,18 @@ icon_state = "plate" }, /area/almayer/living/briefing) +"pmV" = ( +/obj/structure/prop/server_equipment/yutani_server/broken{ + pixel_y = 16; + name = "server tower"; + desc = "A powerful server tower housing various AI functions."; + density = 0 + }, +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "pno" = ( /obj/structure/sign/safety/escapepod{ pixel_y = 32 @@ -56454,6 +57789,19 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"pJR" = ( +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresUp"; + vector_x = -97; + vector_y = 65 + }, +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "pJW" = ( /obj/structure/disposalpipe/segment, /obj/structure/machinery/door/airlock/almayer/maint{ @@ -57080,13 +58428,15 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/charlie) "pYi" = ( -/obj/structure/machinery/telecomms/processor/preset_four, -/obj/structure/sign/safety/laser{ - pixel_x = 8; - pixel_y = 32 +/obj/structure/machinery/light{ + dir = 4 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/pipes/vents/pump/no_boom{ + dir = 8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 }, /area/almayer/command/airoom) "pYo" = ( @@ -57529,6 +58879,17 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) +"qit" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/item/paper_bin/uscm, +/obj/item/tool/pen, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "qiy" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -58068,6 +59429,19 @@ icon_state = "plate" }, /area/almayer/living/offices) +"qwJ" = ( +/obj/structure/machinery/door_control{ + id = "ARES Operations Left"; + name = "ARES Operations Shutter"; + req_one_access_txt = "1;200;91;92"; + pixel_x = -24; + pixel_y = -8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "qxA" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -58693,6 +60067,12 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"qLS" = ( +/obj/structure/pipes/standard/manifold/hidden/supply/no_boom, +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "qLV" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/disk_reader, @@ -58892,6 +60272,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_p) +"qQS" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "qRj" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -59305,6 +60697,18 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"rby" = ( +/obj/structure/machinery/door_control{ + id = "ARES Mainframe Left"; + name = "ARES Mainframe Lockdown"; + req_one_access_txt = "200;91;92"; + pixel_x = 24; + pixel_y = -24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "rbB" = ( /turf/open/floor/almayer{ icon_state = "silvercorner" @@ -59812,9 +61216,25 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"rna" = ( +/turf/closed/wall/almayer/white, +/area/almayer/command/airoom) "rne" = ( /turf/open/floor/carpet, /area/almayer/command/corporateliason) +"rnH" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/machinery/computer/crew/alt{ + pixel_x = 17; + dir = 8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "rnM" = ( /obj/structure/machinery/vending/cigarette, /turf/open/floor/almayer{ @@ -59854,6 +61274,20 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) +"roH" = ( +/obj/effect/step_trigger/ares_alert/terminals, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES Operations Left"; + name = "\improper ARES Operations Shutters"; + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "roU" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -60387,6 +61821,14 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) +"rCi" = ( +/obj/structure/machinery/camera/autoname/almayer/containment/ares{ + dir = 8 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "rCp" = ( /obj/structure/largecrate/random/case/small, /obj/structure/machinery/light/small{ @@ -60397,12 +61839,19 @@ }, /area/almayer/hull/upper_hull/u_a_p) "rCw" = ( -/obj/structure/window/reinforced, -/obj/structure/machinery/light{ +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/platform{ dir = 8 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "rCK" = ( @@ -60901,16 +62350,11 @@ }, /area/almayer/medical/containment/cell/cl) "rNF" = ( -/obj/structure/sign/safety/fibre_optics{ - pixel_x = 32; - pixel_y = 7 - }, -/obj/structure/sign/safety/terminal{ - pixel_x = 32; - pixel_y = -8 +/obj/structure/machinery/light{ + unacidable = 1; + unslashable = 1 }, -/obj/effect/landmark/start/working_joe, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -61463,6 +62907,9 @@ icon_state = "test_floor4" }, /area/almayer/engineering/upper_engineering/notunnel) +"sbJ" = ( +/turf/closed/wall/almayer/white/hull, +/area/almayer/powered/agent) "sbM" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -61537,15 +62984,29 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_p) -"sdl" = ( -/obj/structure/machinery/telecomms/processor/preset_four, -/obj/structure/sign/safety/fibre_optics{ - pixel_x = 8; - pixel_y = 32 +"scS" = ( +/obj/structure/machinery/status_display{ + pixel_y = 30 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/machinery/light{ + dir = 8; + unacidable = 1; + unslashable = 1; + invisibility = 101 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) +"sdl" = ( +/obj/structure/surface/rack{ + pixel_y = 16; + density = 0 }, +/obj/item/tool/wet_sign, +/obj/item/tool/wet_sign, +/obj/item/tool/wet_sign, +/turf/open/floor/plating, /area/almayer/command/airoom) "sdn" = ( /obj/structure/sink{ @@ -61977,6 +63438,10 @@ }, /area/almayer/shipboard/brig/cells) "soq" = ( +/obj/structure/machinery/computer/working_joe{ + dir = 4; + pixel_x = -17 + }, /turf/open/floor/almayer{ icon_state = "cargo" }, @@ -62660,6 +64125,14 @@ icon_state = "orange" }, /area/almayer/hallways/hangar) +"sEK" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E" + }, +/turf/open/floor/almayer/no_build{ + icon_state = "tcomms" + }, +/area/almayer/command/airoom) "sEM" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/device/radio/intercom{ @@ -62750,6 +64223,12 @@ /obj/structure/mirror, /turf/closed/wall/almayer, /area/almayer/living/gym) +"sGZ" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/almayer{ + icon_state = "silverfull" + }, +/area/almayer/command/airoom) "sHg" = ( /obj/structure/surface/rack, /obj/item/storage/backpack/marine/satchel{ @@ -62809,11 +64288,16 @@ }, /area/almayer/squads/alpha) "sIf" = ( -/obj/structure/machinery/door/window/southleft{ - req_access_txt = "19" +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "sIk" = ( @@ -62911,6 +64395,15 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/morgue) +"sKY" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8; + layer = 3.25 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "sLo" = ( /obj/structure/stairs/perspective{ dir = 1; @@ -63223,6 +64716,12 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"sTV" = ( +/obj/structure/machinery/power/apc/almayer/hardened{ + dir = 1 + }, +/turf/open/floor/plating, +/area/almayer/command/airoom) "sUg" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -63446,8 +64945,6 @@ /obj/effect/decal/warning_stripes{ icon_state = "N" }, -/obj/effect/landmark/wo_supplies/guns/common/m39, -/obj/effect/landmark/wo_supplies/guns/common/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, @@ -63455,6 +64952,8 @@ /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, +/obj/item/weapon/gun/smg/m39, +/obj/item/weapon/gun/smg/m39, /turf/open/floor/plating/almayer, /area/almayer/shipboard/brig/armory) "sYC" = ( @@ -64054,6 +65553,16 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"tmK" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + req_one_access_txt = "91;92"; + req_one_access = null + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "tnb" = ( /obj/structure/bed/chair/comfy/black, /turf/open/floor/almayer{ @@ -64372,6 +65881,12 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"tte" = ( +/obj/structure/pipes/vents/pump/no_boom{ + welded = 1 + }, +/turf/open/floor/plating, +/area/almayer/powered/agent) "ttM" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -64832,13 +66347,19 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/charlie) "tFe" = ( -/obj/structure/machinery/door/airlock/almayer/secure/reinforced{ - dir = 1; - name = "\improper ARES Mainframe"; - req_access = null; - req_one_access_txt = "2;7" +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES StairsUpper"; + name = "\improper ARES Core Shutters"; + plane = -7 }, -/turf/open/floor/almayer{ +/obj/structure/machinery/door/poddoor/almayer/blended/open{ + id = "ARES Emergency"; + name = "ARES Emergency Lockdown"; + open_layer = 1.9; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ icon_state = "test_floor4" }, /area/almayer/command/airoom) @@ -64983,6 +66504,12 @@ icon_state = "silver" }, /area/almayer/shipboard/brig/cic_hallway) +"tHu" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/almayer{ + icon_state = "silverfull" + }, +/area/almayer/command/airoom) "tHv" = ( /turf/open/floor/almayer{ dir = 8; @@ -65831,6 +67358,15 @@ /obj/item/frame/table, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_p) +"ubA" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "ucp" = ( /obj/structure/window/framed/almayer, /turf/open/floor/plating, @@ -67919,6 +69455,14 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/containment) +"uVv" = ( +/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "uVA" = ( /turf/open/floor/almayer{ dir = 4; @@ -68347,6 +69891,11 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"vfB" = ( +/turf/open/floor/almayer/no_build{ + dir = 4 + }, +/area/almayer/command/airoom) "vfJ" = ( /obj/structure/surface/rack, /obj/item/frame/table, @@ -68453,10 +70002,13 @@ }, /area/almayer/hull/lower_hull/l_m_p) "vhe" = ( -/obj/structure/sign/kiddieplaque{ - pixel_x = -32 +/obj/structure/prop/server_equipment/yutani_server{ + pixel_y = 16; + name = "server tower"; + desc = "A powerful server tower housing various AI functions."; + density = 0 }, -/turf/open/floor/almayer{ +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -68572,6 +70124,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) +"viB" = ( +/obj/structure/pipes/standard/manifold/hidden/supply/no_boom{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk{ + allow_construction = 0 + }, +/area/almayer/command/airoom) "viJ" = ( /obj/structure/machinery/door/airlock/almayer/maint, /turf/open/floor/almayer{ @@ -69335,6 +70895,18 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/containment) +"vAU" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/pipes/vents/scrubber/no_boom{ + dir = 4 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 8 + }, +/area/almayer/command/airoom) "vBm" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/main_office) @@ -69523,6 +71095,18 @@ icon_state = "orangefull" }, /area/almayer/living/briefing) +"vHa" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/ares_console{ + pixel_x = 9 + }, +/obj/structure/machinery/computer/view_objectives{ + pixel_x = -9 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "vHh" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/item/tool/warning_cone{ @@ -70315,6 +71899,20 @@ }, /turf/open/floor/plating, /area/almayer/engineering/upper_engineering/port) +"vXh" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/machinery/computer/working_joe{ + dir = 4; + pixel_x = -17; + ticket_console = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "vXQ" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -70945,6 +72543,30 @@ icon_state = "bluefull" }, /area/almayer/command/cichallway) +"wkM" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "ARES StairsLower"; + name = "\improper ARES Core Shutters"; + plane = -7 + }, +/obj/effect/step_trigger/ares_alert/public{ + alert_message = "Caution: Movement detected in ARES Core."; + cooldown_duration = 1200; + alert_id = "AresStairs" + }, +/obj/structure/machinery/door/poddoor/almayer/blended/white/open{ + open_layer = 1.9; + id = "ARES Emergency"; + needs_power = 0; + name = "ARES Emergency Lockdown"; + layer = 3.2; + closed_layer = 3.2; + plane = -7 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "test_floor4" + }, +/area/almayer/command/airoom) "wkX" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -71087,6 +72709,10 @@ icon_state = "cargo" }, /area/almayer/living/bridgebunks) +"wnh" = ( +/obj/structure/window/framed/almayer/white/hull, +/turf/open/floor/plating, +/area/almayer/command/airoom) "wnL" = ( /obj/item/stack/tile/carpet{ amount = 12 @@ -71164,6 +72790,14 @@ icon_state = "rasputin3" }, /area/almayer/powered/agent) +"wpw" = ( +/obj/structure/bed/chair/comfy/ares{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "wpz" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -71567,6 +73201,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"wyQ" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door_control{ + id = "ARES Emergency"; + name = "ARES Emergency Lockdown"; + req_one_access_txt = "91;92"; + indestructible = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "plating" + }, +/area/almayer/command/airoom) "wza" = ( /obj/structure/machinery/cm_vending/clothing/vehicle_crew, /turf/open/floor/almayer{ @@ -71656,11 +73302,19 @@ }, /area/almayer/shipboard/brig/processing) "wCT" = ( -/obj/structure/machinery/power/apc/almayer/hardened{ +/obj/effect/step_trigger/teleporter_vector{ + name = "Almayer_AresDown"; + vector_x = 97; + vector_y = -65 + }, +/obj/structure/machinery/light{ dir = 1 }, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" }, /area/almayer/command/airoom) "wDl" = ( @@ -72490,11 +74144,11 @@ /obj/effect/decal/warning_stripes{ icon_state = "N" }, -/obj/effect/landmark/wo_supplies/guns/common/m39, -/obj/effect/landmark/wo_supplies/guns/common/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, /obj/item/ammo_magazine/smg/m39, +/obj/item/weapon/gun/smg/m39, +/obj/item/weapon/gun/smg/m39, /turf/open/floor/plating/almayer, /area/almayer/shipboard/brig/armory) "wVy" = ( @@ -72876,10 +74530,13 @@ }, /area/almayer/living/gym) "xbN" = ( -/obj/structure/machinery/telecomms/processor/preset_four, -/turf/open/floor/almayer{ - icon_state = "tcomms" +/obj/structure/surface/rack{ + pixel_y = 16; + density = 0 }, +/obj/structure/janitorialcart, +/obj/item/tool/mop, +/turf/open/floor/plating, /area/almayer/command/airoom) "xcp" = ( /obj/structure/stairs/perspective{ @@ -73680,6 +75337,20 @@ icon_state = "test_floor4" }, /area/almayer/squads/charlie) +"xvM" = ( +/obj/structure/machinery/door_control{ + id = "ARES StairsLower"; + name = "ARES Core Lockdown"; + req_one_access_txt = "19;200;90;91;92"; + pixel_x = 24; + pixel_y = 8 + }, +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer/no_build{ + icon_state = "silver"; + dir = 4 + }, +/area/almayer/command/airoom) "xvX" = ( /obj/structure/machinery/cm_vending/gear/leader, /turf/open/floor/almayer{ @@ -74077,6 +75748,12 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) +"xDC" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "xEc" = ( /turf/open/floor/almayer{ dir = 9; @@ -74623,8 +76300,8 @@ }, /area/almayer/shipboard/brig/perma) "xQV" = ( -/obj/effect/landmark/start/working_joe, -/turf/open/floor/almayer{ +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer/no_build{ icon_state = "ai_floors" }, /area/almayer/command/airoom) @@ -74902,6 +76579,19 @@ icon_state = "plate" }, /area/almayer/command/combat_correspondent) +"xVc" = ( +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/machinery/door_control{ + id = "ARES StairsUpper"; + name = "ARES Core Access"; + req_one_access_txt = "1;200;90;91;92"; + pixel_y = 24; + pixel_x = 24 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "xVj" = ( /obj/structure/surface/table/almayer, /obj/item/tool/weldingtool{ @@ -75123,6 +76813,23 @@ /obj/structure/largecrate/random/case/double, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"yaQ" = ( +/obj/structure/pipes/standard/simple/hidden/supply/no_boom{ + dir = 9 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) +"yaZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + layer = 3.3 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "ybb" = ( /obj/structure/surface/table/almayer, /obj/item/storage/box/ids{ @@ -75246,6 +76953,15 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/north2) +"ydI" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "ydM" = ( /obj/structure/window{ dir = 8 @@ -75413,6 +77129,17 @@ icon_state = "red" }, /area/almayer/hallways/starboard_hallway) +"yit" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/pipes/vents/pump/no_boom{ + dir = 1 + }, +/turf/open/floor/almayer/no_build{ + icon_state = "ai_floors" + }, +/area/almayer/command/airoom) "yiC" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -113181,10 +114908,10 @@ anf apK arf auG -awu azb azb -auG +azb +nMq aDp apK cbr @@ -113378,15 +115105,15 @@ xfm als ani aow -aqU -aqU -aqU -aqU -aqU -aqU -aqU +mOi +mOi +mOi +mOi +mOi +mOi auc -aqU +auc +hyE aqU aHq aHq @@ -113581,16 +115308,16 @@ ajJ aEX ajt ali -aqU -hvw +mOi +rCw rCw lin oJR -aqU +tFe asD xQV avK -cck +aqU aCZ dgg xRk @@ -113784,16 +115511,16 @@ ael isW ajt abg -aqU +mOi wCT sIf isC isC tFe -lmz +xQV xQV rNF -cck +aqU qjF oqv iqd @@ -113987,15 +115714,15 @@ ael abg akU abg -aqU -mlb +mOi +kbH kbH pgH -aqU -aqU -aqU -auf -aqU +jDV +tFe +xVc +xQV +eYz aqU gjB wDy @@ -114190,16 +115917,16 @@ adO lwm akU nQx -aqU -pYi -isC -xbN -aqU +mOi +mOi +mOi +mOi +mOi mOi asF asG -vhe -cck +iyH +aqU jVE nTs pje @@ -114395,14 +116122,14 @@ aii abg aqU sdl -isC -xbN -aqU -mOi -gjw +mLE +bUx +mLE +tmK +avK aug avL -cck +aqU lyE rsO aGN @@ -114599,13 +116326,13 @@ abg aqU xbN gfE -xbN +gfE +kpc aqU -mOi gjw cnp avM -cck +aqU wmK liJ pTj @@ -127856,23 +129583,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -128059,23 +129786,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -128262,23 +129989,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -128465,23 +130192,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -128668,23 +130395,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -128871,23 +130598,23 @@ aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -129072,25 +130799,25 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -129275,21 +131002,21 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -129478,21 +131205,21 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -129681,21 +131408,21 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -129884,107 +131611,107 @@ aaa aaa aab aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdH +aad +aag +aag +aag +wVb +hlz +hlz +bhB +bJP +mzO +bMN +bMN +fcI +bSy +bSy +bSy +dNx +bMN +bMN +tdx +bYW +bhB +vuR +ydx +vTK +aag +aag +aag +ajZ +aaa +aaa +aaa aaa aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad -aag -aag -aag -wVb -hlz -hlz -bhB -bJP -mzO -bMN -bMN -fcI -bSy -bSy -bSy -dNx -bMN -bMN -tdx -bYW -bhB -vuR -ydx -vTK -aag -aag -aag -ajZ -aaa -aaa -aaa -aaa -aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(269,1,1) = {" -aaa -aaa -aab +aab +aaa +aaa +"} +(269,1,1) = {" +aaa +aaa +aab aaa aaa aaa @@ -130087,21 +131814,21 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -130290,21 +132017,21 @@ aaa aaa aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -130489,108 +132216,108 @@ aab aaa aaa aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad -aag -aag -aag -wVb -eFH -eFH -bhB -svd -bLf -dCS -bMM -bhB -bQk -xfi -bSG -bhB -bMM -dCS -tLy -svd -bhB -cAH -cAH -vTK -aag -aag -aag -ajZ -aaa -aaa -aaa -aaa -aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(272,1,1) = {" +aaa +aaa +aab +aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bdH +aad +aag +aag +aag +wVb +eFH +eFH +bhB +svd +bLf +dCS +bMM +bhB +bQk +xfi +bSG +bhB +bMM +dCS +tLy +svd +bhB +cAH +cAH +vTK +aag +aag +aag +ajZ +aaa +aaa +aaa +aaa +aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +aaa +aab +aaa +aaa +"} +(272,1,1) = {" aaa aaa aab @@ -130684,10 +132411,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +aab +aab +aab +aab aab aaa aaa @@ -130695,22 +132422,22 @@ aKQ aaa aaa aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aab +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +bdH aaa aaa aaa @@ -130885,35 +132612,35 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa aab -aaa -aaa -aKQ -aaa -aaa aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aab +bdH +bdH +bdH +bdH +bdH +bdH +aKQ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aak +bdH aaa aaa aaa @@ -131081,42 +132808,42 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab -aaa -aaa -aKQ -aaa -aaa +aab +aab +aab +aab +aab +aab aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +aKQ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aak +bdH aaa aaa aaa @@ -131284,53 +133011,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aKQ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -131487,53 +133214,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -131690,53 +133417,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa aab aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -131893,53 +133620,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -132096,53 +133823,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -132299,53 +134026,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +daz +vhe +fEN +cqm +gTH +qit +rna +qQS +gwn +pfT +jYR +dyp +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -132502,8 +134229,53 @@ aaa aaa aaa aaa +aab aaa aaa +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +sbJ +sbJ +sbJ +daz +jtj +avK +avK +sKY +avK +bIp +fKe +dDp +dDp +frM +lcg +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -132515,68 +134287,23 @@ aaa aaa aaa aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo -ovn -ovn -ovn -ovn -ovn -ovn -ovn -vTK +wVb +bdo +bdo +bdo +bdo +bdo +bdo +bdo +bdo +ovn +ovn +ovn +ovn +ovn +ovn +ovn +vTK aaa aaa aaa @@ -132705,662 +134432,53 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo -ovn -ovn -ovn -ovn -ovn -ovn -ovn -vTK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa -aaa -"} -(283,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xVk -xVk -xVk -xVk -xVk -xVk -xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xVk -xVk -xVk -xVk -xVk -xVk -xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -wVb -bhD -bdo -bdo -bdo -bdo -bdo -bdo -bdo -ovn -ovn -ovn -ovn -ovn -ovn -bCR -vTK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(284,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xVk -xVk -xVk -xVk -xVk -xVk -xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xVk -xVk -xVk -xVk -xVk -xVk -xVk -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo -ovn -ovn -ovn -ovn -ovn -ovn -ovn -vTK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(285,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +lmz +lmz +lmz +lmz +lmz +daz +daz +daz +daz +daz +tte +hvw +auf +pmV +xDC +xDC +dIn +rby +bIp +euN +sEK +sEK +mlb +lcg +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -133432,7 +134550,7 @@ aab aaa aaa "} -(286,1,1) = {" +(283,1,1) = {" aaa aaa aab @@ -133468,6 +134586,13 @@ aaa aaa aaa aaa +xVk +xVk +xVk +xVk +xVk +xVk +xVk aaa aaa aaa @@ -133483,6 +134608,13 @@ aaa aaa aaa aaa +xVk +xVk +xVk +xVk +xVk +xVk +xVk aaa aaa aaa @@ -133503,7 +134635,53 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +lmz +daz +daz +hRW +asZ +vXh +daz +daz +kfU +daz +rna +rna +lnS +uVv +yit +rna +cxc +kBy +kBy +gfu +fPB +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -133515,6 +134693,23 @@ aaa aaa aaa aaa +wVb +bhD +bdo +bdo +bdo +bdo +bdo +bdo +bdo +ovn +ovn +ovn +ovn +ovn +ovn +bCR +vTK aaa aaa aaa @@ -133530,13 +134725,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -133557,10 +134749,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(284,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -133575,23 +134771,6 @@ aaa aaa aaa aaa -wVb -qsF -bdo -bdo -bdo -bdo -bdo -bdo -bdo -ovn -ovn -ovn -ovn -ovn -ovn -aXQ -vTK aaa aaa aaa @@ -133610,6 +134789,13 @@ aaa aaa aaa aaa +xVk +xVk +xVk +xVk +xVk +xVk +xVk aaa aaa aaa @@ -133625,20 +134811,23 @@ aaa aaa aaa aaa +xVk +xVk +xVk +xVk +xVk +xVk +xVk aaa aaa aaa aaa aaa aaa -aab aaa aaa -"} -(287,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -133649,11 +134838,81 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +daz +daz +scS +yaZ +ffE +hZj +clw +daz +daz +daz +sGZ +rna +rna +roH +ebN +ebN +ebN +daz +wnh +wnh +daz +daz +daz +lmz +lmz +lmz +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa aaa +wVb +bdo +bdo +bdo +bdo +bdo +bdo +bdo +bdo +ovn +ovn +ovn +ovn +ovn +ovn +ovn +vTK aaa aaa aaa @@ -133693,6 +134952,14 @@ aaa aaa aaa aaa +aab +aaa +aaa +"} +(285,1,1) = {" +aaa +aaa +aab aaa aaa aaa @@ -133733,13 +135000,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -133777,22 +135041,79 @@ aaa aaa aaa aaa +aab +aaa +bdH +lmz +lmz +lmz +daz +acJ +ubA +cck +wyQ +fmv +ubA +gMN +mRn +itf +mHE +vAU +qwJ +fJY +kzT +wkM +oLm +fcX +kKv +kKv +dGl +dGl +daz +lmz +lmz +lmz +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa aaa wVb bdo -jbB bdo -bne bdo -jbB bdo -bne +bdo +bdo +bdo +bdo +ovn +ovn +ovn ovn -gXv ovn -grX ovn -gXv ovn vTK aaa @@ -133838,7 +135159,7 @@ aab aaa aaa "} -(288,1,1) = {" +(286,1,1) = {" aaa aaa aab @@ -133923,6 +135244,91 @@ aaa aaa aaa aaa +aab +aaa +bdH +lmz +lmz +lmz +daz +cwS +ffE +vHa +wpw +ffE +ffE +ffE +jqP +cLo +vfB +viB +dIi +qLS +vfB +wkM +jvB +jvB +ieF +ieF +pJR +gPr +daz +lmz +lmz +lmz +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aaa +aaa +aaa +aaa +wVb +qsF +bdo +bdo +bdo +bdo +bdo +bdo +bdo +ovn +ovn +ovn +ovn +ovn +ovn +aXQ +vTK +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -133936,13 +135342,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -133955,10 +135358,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(287,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -133981,24 +135388,6 @@ aaa aaa aaa aaa -wVb -wVb -wVb -wVb -wVb -wVb -wVb -wVb -wVb -vTK -vTK -vTK -vTK -vTK -vTK -vTK -vTK -aaa aaa aaa aaa @@ -134037,14 +135426,8 @@ aaa aaa aaa aaa -aab -aaa -aaa -"} -(289,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -134064,11 +135447,81 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +daz +oRV +ydI +mdW +jaH +awu +ydI +aKs +fMt +gOs +kXj +pYi +fMl +gUN +bLv +bRo +xvM +osy +cBm +cBm +iZw +dQl +daz +lmz +lmz +lmz +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa aaa +wVb +bdo +jbB +bdo +bne +bdo +jbB +bdo +bne +ovn +gXv +ovn +grX +ovn +gXv +ovn +vTK aaa aaa aaa @@ -134108,10 +135561,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(288,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134139,13 +135596,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -134196,11 +135650,81 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +daz +daz +eKJ +yaZ +ffE +hZj +mUC +daz +daz +daz +tHu +rna +rna +gXs +ebN +ebN +ebN +daz +wnh +wnh +daz +daz +daz +lmz +lmz +lmz +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa aaa +wVb +wVb +wVb +wVb +wVb +wVb +wVb +wVb +wVb +vTK +vTK +vTK +vTK +vTK +vTK +vTK +vTK aaa aaa aaa @@ -134244,7 +135768,7 @@ aab aaa aaa "} -(290,1,1) = {" +(289,1,1) = {" aaa aaa aab @@ -134329,7 +135853,60 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +lmz +daz +daz +ocB +nJH +rnH +daz +daz +sTV +daz +rna +rna +gbg +uVv +erN +rna +qQS +kBy +kBy +gfu +kBy +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134342,13 +135919,8 @@ aaa aaa aaa aaa -aab -aaa -aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -134395,10 +135967,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(290,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134443,14 +136019,10 @@ aaa aaa aaa aaa -aab aaa aaa -"} -(291,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -134484,7 +136056,60 @@ aaa aaa aaa aaa +aab aaa +bdH +lmz +lmz +lmz +lmz +lmz +daz +daz +daz +daz +daz +tte +hvw +auf +hTl +xDC +xDC +yaQ +bat +mFN +kSy +dDp +dDp +frM +lcg +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134548,7 +136173,8 @@ aaa aab aaa aaa -aKQ +"} +(291,1,1) = {" aaa aaa aab @@ -134633,61 +136259,60 @@ aaa aaa aaa aaa +aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aab -aaa -aaa -"} -(292,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +sbJ +sbJ +sbJ +daz +jtj +avK +avK +aCd +avK +mFN +igr +sEK +sEK +mlb +lcg +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134751,7 +136376,8 @@ aaa aab aaa aaa -aKQ +"} +(292,1,1) = {" aaa aaa aab @@ -134836,37 +136462,60 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa aaa -"} -(293,1,1) = {" -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +daz +gAe +rCi +gba +mUz +our +rna +cxc +kBy +kBy +khJ +gyN +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa aaa aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -134927,10 +136576,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(293,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134951,13 +136604,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -135015,8 +136665,48 @@ aaa aaa aaa aaa +aab aaa aaa +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +daz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135052,14 +136742,10 @@ aaa aaa aaa aaa -aab aaa aaa -"} -(294,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -135093,10 +136779,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(294,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -135154,13 +136844,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -135181,8 +136868,48 @@ aaa aaa aaa aaa +aab aaa aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135344,48 +137071,48 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aab aaa aaa -aKQ -aaa -aaa -aab -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH +aak +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -135550,37 +137277,37 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aaa -aaa -aKQ aaa -aaa -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aab +bdH +bdH +bdH +bdH +bdH +bdH +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +lmz +bdH +bdH +bdH aab aab aab @@ -135752,39 +137479,39 @@ aaa aaa aaa aaa +aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aKQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aab aaa aaa aaa @@ -135955,39 +137682,39 @@ aaa aaa aaa aaa +aab aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aKQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +aab aaa aaa aaa @@ -136158,39 +137885,39 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aKQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aab +aab +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +jRz +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aak +aab aaa aaa aaa @@ -136390,7 +138117,7 @@ aaa aaa aaa aaa -aaa +bdH aaa aaa aaa diff --git a/tgui/packages/tgui/interfaces/AresInterface.js b/tgui/packages/tgui/interfaces/AresInterface.js new file mode 100644 index 000000000000..6bf85e96522f --- /dev/null +++ b/tgui/packages/tgui/interfaces/AresInterface.js @@ -0,0 +1,1493 @@ +import { useBackend } from '../backend'; +import { Flex, Box, Section, Button, Stack } from '../components'; +import { Window } from '../layouts'; + +const PAGES = { + 'login': () => Login, + 'main': () => MainMenu, + 'announcements': () => AnnouncementLogs, + 'bioscans': () => BioscanLogs, + 'bombardments': () => BombardmentLogs, + 'apollo': () => ApolloLog, + 'access_log': () => AccessLogs, + 'delete_log': () => DeletionLogs, + 'talking': () => ARESTalk, + 'deleted_talks': () => DeletedTalks, + 'read_deleted': () => ReadingTalks, + 'security': () => Security, + 'requisitions': () => Requisitions, + 'antiair': () => AntiAir, + 'emergency': () => Emergency, +}; + +export const AresInterface = (props, context) => { + const { data } = useBackend(context); + const { current_menu } = data; + const PageComponent = PAGES[current_menu](); + + return ( + + + + + + ); +}; + +const Login = (props, context) => { + const { act } = useBackend(context); + + return ( + + ARES v3.2 Interface + + WY-DOS Executive + + Version 8.2.3 + Copyright © 2182, Weyland Yutani Corp. + +