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/defenses.dm b/code/__DEFINES/defenses.dm index 57eb0c86f939..db615c2a0c78 100644 --- a/code/__DEFINES/defenses.dm +++ b/code/__DEFINES/defenses.dm @@ -8,7 +8,7 @@ // Defines for barricade upgrades #define BARRICADE_UPGRADE_BURN "Biohazard Upgrade (+Burn)" #define BARRICADE_UPGRADE_BRUTE "Reinforced Upgrade (+Brute)" -#define BARRICADE_UPGRADE_EXPLOSIVE "Explosive Upgrade (+Explosive)" +#define BARRICADE_UPGRADE_ANTIFF "Composite Upgrade (++Explosive, ++Projectile, ++Fire)" // Defines for defense stats #define DEFENSE_FUNCTIONAL 0 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/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index ce5e9a743bc5..a25293aebbd3 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -60,7 +60,7 @@ return TRUE return FALSE -/obj/structure/machinery/telecomms/relay/preset/tower/tcomms_startup() +/obj/structure/machinery/telecomms/relay/preset/tower/update_state() . = ..() if(on) playsound(src, 'sound/machines/tcomms_on.ogg', vol = 80, vary = FALSE, sound_range = 16, falloff = 0.5) 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/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 6905a734b915..eac5f154e26e 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -30,6 +30,8 @@ var/brute_multiplier = 1 var/burn_multiplier = 1 var/explosive_multiplier = 1 + var/brute_projectile_multiplier = 1 + var/burn_flame_multiplier = 1 var/repair_materials = list() var/metallic = TRUE @@ -42,12 +44,12 @@ addtimer(CALLBACK(src, PROC_REF(update_icon)), 0) starting_maxhealth = maxhealth -/obj/structure/barricade/initialize_pass_flags(datum/pass_flags_container/PF) +/obj/structure/barricade/initialize_pass_flags(datum/pass_flags_container/pass_flags) ..() - if (PF) - PF.flags_can_pass_all = NONE - PF.flags_can_pass_front = NONE - PF.flags_can_pass_behind = PASS_OVER^(PASS_OVER_ACID_SPRAY|PASS_OVER_THROW_MOB) + if (pass_flags) + pass_flags.flags_can_pass_all = NONE + pass_flags.flags_can_pass_front = NONE + pass_flags.flags_can_pass_behind = PASS_OVER^(PASS_OVER_ACID_SPRAY|PASS_OVER_THROW_MOB) flags_can_pass_front_temp = PASS_OVER_THROW_MOB flags_can_pass_behind_temp = PASS_OVER_THROW_MOB @@ -95,7 +97,7 @@ overlays += image('icons/obj/structures/barricades.dmi', icon_state = "+burn_upgrade_[damage_state]") if(BARRICADE_UPGRADE_BRUTE) overlays += image('icons/obj/structures/barricades.dmi', icon_state = "+brute_upgrade_[damage_state]") - if(BARRICADE_UPGRADE_EXPLOSIVE) + if(BARRICADE_UPGRADE_ANTIFF) overlays += image('icons/obj/structures/barricades.dmi', icon_state = "+explosive_upgrade_[damage_state]") if(is_wired) @@ -106,34 +108,34 @@ ..() -/obj/structure/barricade/hitby(atom/movable/AM) - if(AM.throwing && is_wired) - if(iscarbon(AM)) - var/mob/living/carbon/C = AM - if(C.mob_size <= MOB_SIZE_XENO) - C.visible_message(SPAN_DANGER("The barbed wire slices into [C]!"), +/obj/structure/barricade/hitby(atom/movable/atom_movable) + if(atom_movable.throwing && is_wired) + if(iscarbon(atom_movable)) + var/mob/living/carbon/living_carbon = atom_movable + if(living_carbon.mob_size <= MOB_SIZE_XENO) + living_carbon.visible_message(SPAN_DANGER("The barbed wire slices into [living_carbon]!"), SPAN_DANGER("The barbed wire slices into you!")) - C.apply_damage(10) - C.apply_effect(2, WEAKEN) //Leaping into barbed wire is VERY bad - playsound(C, "bonk", 75, FALSE) + living_carbon.apply_damage(10) + living_carbon.apply_effect(2, WEAKEN) //Leaping into barbed wire is VERY bad + playsound(living_carbon, "bonk", 75, FALSE) ..() -/obj/structure/barricade/Collided(atom/movable/AM) +/obj/structure/barricade/Collided(atom/movable/atom_movable) ..() - if(istype(AM, /mob/living/carbon/xenomorph/crusher)) - var/mob/living/carbon/xenomorph/crusher/C = AM + if(istype(atom_movable, /mob/living/carbon/xenomorph/crusher)) + var/mob/living/carbon/xenomorph/crusher/living_carbon = atom_movable - if (!C.throwing) + if (!living_carbon.throwing) return if(crusher_resistant) - visible_message(SPAN_DANGER("[C] smashes into [src]!")) + visible_message(SPAN_DANGER("[living_carbon] smashes into [src]!")) take_damage(150) playsound(src, barricade_hitsound, 25, TRUE) - else if(!C.stat) - visible_message(SPAN_DANGER("[C] smashes through [src]!")) + else if(!living_carbon.stat) + visible_message(SPAN_DANGER("[living_carbon] smashes through [src]!")) deconstruct(FALSE) playsound(src, barricade_hitsound, 25, TRUE) @@ -163,8 +165,8 @@ if(closed) return NO_BLOCKED_MOVEMENT - var/obj/structure/S = locate(/obj/structure) in get_turf(mover) - if(S && S.climbable && !(S.flags_atom & ON_BORDER) && climbable && isliving(mover)) //Climbable objects allow you to universally climb over others + var/obj/structure/structure = locate(/obj/structure) in get_turf(mover) + if(structure && structure.climbable && !(structure.flags_atom & ON_BORDER) && climbable && isliving(mover)) //Climbable objects allow you to universally climb over others return NO_BLOCKED_MOVEMENT return ..() @@ -180,33 +182,33 @@ /obj/structure/barricade/attack_animal(mob/user as mob) return attack_alien(user) -/obj/structure/barricade/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/zombie_claws)) +/obj/structure/barricade/attackby(obj/item/item, mob/user) + if(istype(item, /obj/item/weapon/zombie_claws)) user.visible_message(SPAN_DANGER("The zombie smashed at the [src.barricade_type] barricade!"), SPAN_DANGER("You smack the [src.barricade_type] barricade!")) if(barricade_hitsound) playsound(src, barricade_hitsound, 35, 1) - hit_barricade(W) + hit_barricade(item) return - for(var/obj/effect/xenomorph/acid/A in src.loc) - if(A.acid_t == src) + for(var/obj/effect/xenomorph/acid/acid in src.loc) + if(acid.acid_t == src) to_chat(user, "You can't get near that, it's melting!") return - if(istype(W, /obj/item/stack/barbed_wire)) - var/obj/item/stack/barbed_wire/B = W + if(istype(item, /obj/item/stack/barbed_wire)) + var/obj/item/stack/barbed_wire/barbed_wire = item if(can_wire) - user.visible_message(SPAN_NOTICE("[user] starts setting up [W.name] on [src]."), - SPAN_NOTICE("You start setting up [W.name] on [src].")) + user.visible_message(SPAN_NOTICE("[user] starts setting up [item.name] on [src]."), + SPAN_NOTICE("You start setting up [item.name] on [src].")) if(do_after(user, 20, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD, src) && can_wire) // Make sure there's still enough wire in the stack - if(!B.use(1)) + if(!barbed_wire.use(1)) return playsound(src.loc, 'sound/effects/barbed_wire_movement.ogg', 25, 1) - user.visible_message(SPAN_NOTICE("[user] sets up [W.name] on [src]."), - SPAN_NOTICE("You set up [W.name] on [src].")) + user.visible_message(SPAN_NOTICE("[user] sets up [item.name] on [src]."), + SPAN_NOTICE("You set up [item.name] on [src].")) maxhealth += 50 update_health(-50) @@ -218,7 +220,7 @@ update_icon() return - if(HAS_TRAIT(W, TRAIT_TOOL_WIRECUTTERS)) + if(HAS_TRAIT(item, TRAIT_TOOL_WIRECUTTERS)) if(is_wired) user.visible_message(SPAN_NOTICE("[user] begin removing the barbed wire on [src]."), SPAN_NOTICE("You begin removing the barbed wire on [src].")) @@ -240,27 +242,27 @@ new/obj/item/stack/barbed_wire( src.loc ) return - if(W.force > force_level_absorption) + if(item.force > force_level_absorption) ..() if(barricade_hitsound) playsound(src, barricade_hitsound, 35, 1) - hit_barricade(W) + hit_barricade(item) -/obj/structure/barricade/bullet_act(obj/item/projectile/P) - bullet_ping(P) +/obj/structure/barricade/bullet_act(obj/item/projectile/bullet) + bullet_ping(bullet) - if(P.ammo.damage_type == BURN) - P.damage = P.damage * burn_multiplier + if(bullet.ammo.damage_type == BURN) + bullet.damage = bullet.damage * burn_multiplier else - P.damage = P.damage * brute_multiplier + bullet.damage = bullet.damage * brute_projectile_multiplier - if(istype(P.ammo, /datum/ammo/xeno/boiler_gas)) + if(istype(bullet.ammo, /datum/ammo/xeno/boiler_gas)) take_damage(round(50 * burn_multiplier)) - else if(P.ammo.flags_ammo_behavior & AMMO_ANTISTRUCT) - take_damage(P.damage * ANTISTRUCT_DMG_MULT_BARRICADES) + else if(bullet.ammo.flags_ammo_behavior & AMMO_ANTISTRUCT) + take_damage(bullet.damage * ANTISTRUCT_DMG_MULT_BARRICADES) - take_damage(P.damage) + take_damage(bullet.damage) return TRUE @@ -282,11 +284,11 @@ /obj/structure/barricade/ex_act(severity, direction, cause_data) - for(var/obj/structure/barricade/B in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade - if(B.dir == reverse_direction(dir)) + for(var/obj/structure/barricade/barricade in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade + if(barricade.dir == reverse_direction(dir)) spawn(1) - if(B) - B.ex_act(severity, direction) + if(barricade) + barricade.ex_act(severity, direction) if(health <= 0) var/location = get_turf(src) handle_debris(severity, direction) @@ -321,15 +323,15 @@ new /datum/effects/acid(src, null, null) /obj/structure/barricade/flamer_fire_act(dam = BURN_LEVEL_TIER_1) - take_damage(dam * burn_multiplier) + take_damage(dam * burn_flame_multiplier) -/obj/structure/barricade/proc/hit_barricade(obj/item/I) - take_damage(I.force * 0.5 * brute_multiplier) +/obj/structure/barricade/proc/hit_barricade(obj/item/item) + take_damage(item.force * 0.5 * brute_multiplier) /obj/structure/barricade/proc/take_damage(damage) - for(var/obj/structure/barricade/B in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade - if(B.dir == reverse_direction(dir)) - B.update_health(damage) + for(var/obj/structure/barricade/barricade in get_step(src,dir)) //discourage double-stacking barricades by removing health from opposing barricade + if(barricade.dir == reverse_direction(dir)) + barricade.update_health(damage) update_health(damage) @@ -357,12 +359,12 @@ if(50 to 75) damage_state = BARRICADE_DMG_SLIGHT if(75 to INFINITY) damage_state = BARRICADE_DMG_NONE -/obj/structure/barricade/proc/weld_cade(obj/item/tool/weldingtool/WT, mob/user) +/obj/structure/barricade/proc/weld_cade(obj/item/tool/weldingtool/welder, mob/user) if(!metallic) user.visible_message(SPAN_WARNING("You can't weld \the [src]!")) return FALSE - if(!(WT.remove_fuel(2, user))) + if(!(welder.remove_fuel(2, user))) return FALSE user.visible_message(SPAN_NOTICE("[user] begins repairing damage to [src]."), @@ -413,20 +415,20 @@ return ..() -/obj/structure/barricade/proc/try_nailgun_usage(obj/item/W, mob/user) - if(length(repair_materials) == 0 || health >= maxhealth || !istype(W, /obj/item/weapon/gun/smg/nailgun)) +/obj/structure/barricade/proc/try_nailgun_usage(obj/item/item, mob/user) + if(length(repair_materials) == 0 || health >= maxhealth || !istype(item, /obj/item/weapon/gun/smg/nailgun)) return FALSE - var/obj/item/weapon/gun/smg/nailgun/NG = W + var/obj/item/weapon/gun/smg/nailgun/nailgun = item - if(!NG.in_chamber || !NG.current_mag || NG.current_mag.current_rounds < 3) + if(!nailgun.in_chamber || !nailgun.current_mag || nailgun.current_mag.current_rounds < 3) to_chat(user, SPAN_WARNING("You require at least 4 nails to complete this task!")) return FALSE // Check if either hand has a metal stack by checking the weapon offhand // Presume the material is a sheet until proven otherwise. var/obj/item/stack/sheet/material = null - if(user.l_hand == NG) + if(user.l_hand == nailgun) material = user.r_hand else material = user.l_hand @@ -445,8 +447,8 @@ to_chat(user, SPAN_WARNING("You'll need some adequate repair material in your other hand to patch up [src]!")) return FALSE - var/soundchannel = playsound(src, NG.repair_sound, 25, 1) - if(!do_after(user, NG.nailing_speed, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, src)) + var/soundchannel = playsound(src, nailgun.repair_sound, 25, 1) + if(!do_after(user, nailgun.nailing_speed, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, src)) playsound(src, null, channel = soundchannel) return FALSE @@ -454,7 +456,7 @@ to_chat(user, SPAN_WARNING("You seems to have misplaced the repair material!")) return FALSE - if(!NG.in_chamber || !NG.current_mag || NG.current_mag.current_rounds < 3) + if(!nailgun.in_chamber || !nailgun.current_mag || nailgun.current_mag.current_rounds < 3) to_chat(user, SPAN_WARNING("You require at least 4 nails to complete this task!")) return FALSE @@ -462,7 +464,7 @@ to_chat(user, SPAN_WARNING("You nail [material] to [src], restoring some of its integrity!")) update_damage_state() material.use(1) - NG.current_mag.current_rounds -= 3 - NG.in_chamber = null - NG.load_into_chamber() + nailgun.current_mag.current_rounds -= 3 + nailgun.in_chamber = null + nailgun.load_into_chamber() return TRUE diff --git a/code/game/objects/structures/barricade/metal.dm b/code/game/objects/structures/barricade/metal.dm index 40f784b064e4..4056ac9021f8 100644 --- a/code/game/objects/structures/barricade/metal.dm +++ b/code/game/objects/structures/barricade/metal.dm @@ -39,12 +39,12 @@ . += SPAN_NOTICE("The cade is protected by a biohazardous upgrade.") if(BARRICADE_UPGRADE_BRUTE) . += SPAN_NOTICE("The cade is protected by a reinforced upgrade.") - if(BARRICADE_UPGRADE_EXPLOSIVE) - . += SPAN_NOTICE("The cade is protected by an explosive upgrade.") + if(BARRICADE_UPGRADE_ANTIFF) + . += SPAN_NOTICE("The cade is protected by a composite upgrade.") -/obj/structure/barricade/metal/attackby(obj/item/W, mob/user) - if(iswelder(W)) - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) +/obj/structure/barricade/metal/attackby(obj/item/item, mob/user) + if(iswelder(item)) + if(!HAS_TRAIT(item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return if(user.action_busy) @@ -52,7 +52,7 @@ if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)) to_chat(user, SPAN_WARNING("You're not trained to repair [src]...")) return - var/obj/item/tool/weldingtool/WT = W + var/obj/item/tool/weldingtool/welder = item if(damage_state == BARRICADE_DMG_HEAVY) to_chat(user, SPAN_WARNING("[src] has sustained too much structural damage to be repaired.")) return @@ -61,10 +61,10 @@ to_chat(user, SPAN_WARNING("[src] doesn't need repairs.")) return - weld_cade(WT, user) + weld_cade(welder, user) return - if(try_nailgun_usage(W, user)) + if(try_nailgun_usage(item, user)) return for(var/obj/effect/xenomorph/acid/A in src.loc) @@ -74,7 +74,7 @@ switch(build_state) if(BARRICADE_BSTATE_SECURED) //Fully constructed step. Use screwdriver to remove the protection panels to reveal the bolts - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(item, TRAIT_TOOL_SCREWDRIVER)) if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to touch [src]...")) return @@ -88,16 +88,16 @@ build_state = BARRICADE_BSTATE_UNSECURED return - if(istype(W, /obj/item/stack/sheet/metal)) + if(istype(item, /obj/item/stack/sheet/metal)) if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to touch [src]...")) return if(upgraded) to_chat(user, SPAN_NOTICE("This barricade is already upgraded.")) return - var/obj/item/stack/sheet/metal/M = W + var/obj/item/stack/sheet/metal/metal = item if(user.client?.prefs?.no_radials_preference) - var/choice = tgui_input_list(user, "Choose an upgrade to apply to the barricade", "Apply Upgrade", list(BARRICADE_UPGRADE_BURN, BARRICADE_UPGRADE_BRUTE, BARRICADE_UPGRADE_EXPLOSIVE)) + var/choice = tgui_input_list(user, "Choose an upgrade to apply to the barricade", "Apply Upgrade", list(BARRICADE_UPGRADE_BURN, BARRICADE_UPGRADE_BRUTE, BARRICADE_UPGRADE_ANTIFF)) if(!choice) return if(!user.Adjacent(src)) @@ -106,33 +106,37 @@ if(upgraded) to_chat(user, SPAN_NOTICE("This barricade is already upgraded.")) return - if(M.get_amount() < 2) + if(metal.get_amount() < 2) to_chat(user, SPAN_NOTICE("You lack the required metal.")) return - if((usr.get_active_hand()) != M) - to_chat(user, SPAN_WARNING("You must be holding the [M] to upgrade \the [src]!")) + if((usr.get_active_hand()) != metal) + to_chat(user, SPAN_WARNING("You must be holding the [metal] to upgrade \the [src]!")) return switch(choice) if(BARRICADE_UPGRADE_BURN) burn_multiplier = 0.75 + burn_flame_multiplier = 0.75 upgraded = BARRICADE_UPGRADE_BURN to_chat(user, SPAN_NOTICE("You applied a biohazardous upgrade.")) if(BARRICADE_UPGRADE_BRUTE) brute_multiplier = 0.75 + brute_projectile_multiplier = 0.75 upgraded = BARRICADE_UPGRADE_BRUTE to_chat(user, SPAN_NOTICE("You applied a reinforced upgrade.")) - if(BARRICADE_UPGRADE_EXPLOSIVE) - explosive_multiplier = 0.75 - upgraded = BARRICADE_UPGRADE_EXPLOSIVE - to_chat(user, SPAN_NOTICE("You applied an explosive upgrade.")) + if(BARRICADE_UPGRADE_ANTIFF) + explosive_multiplier = 0.5 + brute_projectile_multiplier = 0.5 + burn_flame_multiplier = 0.5 + upgraded = BARRICADE_UPGRADE_ANTIFF + to_chat(user, SPAN_NOTICE("You applied a composite upgrade.")) - M.use(2) + metal.use(2) user.count_niche_stat(STATISTICS_NICHE_UPGRADE_CADES) update_icon() return else - var/static/list/cade_types = list(BARRICADE_UPGRADE_EXPLOSIVE = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "explosive_obj"), BARRICADE_UPGRADE_BRUTE = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "brute_obj"), BARRICADE_UPGRADE_BURN = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "burn_obj")) + var/static/list/cade_types = list(BARRICADE_UPGRADE_ANTIFF = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "explosive_obj"), BARRICADE_UPGRADE_BRUTE = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "brute_obj"), BARRICADE_UPGRADE_BURN = image(icon = 'icons/obj/structures/barricades.dmi', icon_state = "burn_obj")) var/choice = show_radial_menu(user, src, cade_types, require_near = TRUE) if(!choice) return @@ -142,33 +146,37 @@ if(upgraded) to_chat(user, SPAN_NOTICE("This barricade is already upgraded.")) return - if(M.get_amount() < 2) + if(metal.get_amount() < 2) to_chat(user, SPAN_NOTICE("You lack the required metal.")) return - if((usr.get_active_hand()) != M) - to_chat(user, SPAN_WARNING("You must be holding the [M] to upgrade \the [src]!")) + if((usr.get_active_hand()) != metal) + to_chat(user, SPAN_WARNING("You must be holding the [metal] to upgrade \the [src]!")) return switch(choice) if(BARRICADE_UPGRADE_BURN) burn_multiplier = 0.75 + burn_flame_multiplier = 0.75 upgraded = BARRICADE_UPGRADE_BURN to_chat(user, SPAN_NOTICE("You applied a biohazardous upgrade.")) if(BARRICADE_UPGRADE_BRUTE) brute_multiplier = 0.75 + brute_projectile_multiplier = 0.75 upgraded = BARRICADE_UPGRADE_BRUTE to_chat(user, SPAN_NOTICE("You applied a reinforced upgrade.")) - if(BARRICADE_UPGRADE_EXPLOSIVE) - explosive_multiplier = 0.75 - upgraded = BARRICADE_UPGRADE_EXPLOSIVE - to_chat(user, SPAN_NOTICE("You applied an explosive upgrade.")) + if(BARRICADE_UPGRADE_ANTIFF) + explosive_multiplier = 0.5 + brute_projectile_multiplier = 0.5 + burn_flame_multiplier = 0.5 + upgraded = BARRICADE_UPGRADE_ANTIFF + to_chat(user, SPAN_NOTICE("You applied a composite upgrade.")) - M.use(2) + metal.use(2) user.count_niche_stat(STATISTICS_NICHE_UPGRADE_CADES) update_icon() return - if(HAS_TRAIT(W, TRAIT_TOOL_MULTITOOL)) + if(HAS_TRAIT(item, TRAIT_TOOL_MULTITOOL)) if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) to_chat(user, SPAN_WARNING("You are not trained to touch [src]...")) return @@ -181,13 +189,15 @@ upgraded = null explosive_multiplier = initial(explosive_multiplier) brute_multiplier = initial(brute_multiplier) + brute_projectile_multiplier = initial(brute_projectile_multiplier) burn_multiplier = initial(burn_multiplier) + burn_flame_multiplier = initial(burn_flame_multiplier) new stack_type (loc, 1) update_icon() return if(BARRICADE_BSTATE_UNSECURED) //Protection panel removed step. Screwdriver to put the panel back, wrench to unsecure the anchor bolts - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(item, TRAIT_TOOL_SCREWDRIVER)) if(user.action_busy) return if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) @@ -199,7 +209,7 @@ SPAN_NOTICE("You set [src]'s protection panel back.")) build_state = BARRICADE_BSTATE_SECURED return - if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(user.action_busy) return if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) @@ -214,7 +224,7 @@ update_icon() //unanchored changes layer return if(BARRICADE_BSTATE_MOVABLE) //Anchor bolts loosened step. Apply crowbar to unseat the panel and take apart the whole thing. Apply wrench to resecure anchor bolts - if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(HAS_TRAIT(item, TRAIT_TOOL_WRENCH)) if(user.action_busy) return if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) @@ -224,8 +234,8 @@ if(B != src && B.dir == dir) to_chat(user, SPAN_WARNING("There's already a barricade here.")) return - var/turf/open/T = loc - if(!(istype(T) && T.allow_construction)) + var/turf/open/turf = loc + if(!(istype(turf) && turf.allow_construction)) to_chat(user, SPAN_WARNING("[src] must be secured on a proper surface!")) return playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1) @@ -236,7 +246,7 @@ anchored = TRUE update_icon() //unanchored changes layer return - if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + if(HAS_TRAIT(item, TRAIT_TOOL_CROWBAR)) if(user.action_busy) return if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_TRAINED)) 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/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 1c74080a928f..278ffb666bfd 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -221,7 +221,6 @@ /obj/item/explosive/grenade, /obj/item/device/binoculars, /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, /obj/item/storage/large_holster/machete, /obj/item/weapon/baseballbat, /obj/item/weapon/baseballbat/metal, @@ -289,7 +288,6 @@ /obj/item/explosive/grenade, /obj/item/device/binoculars, /obj/item/attachable/bayonet, - /obj/item/storage/backpack/general_belt, /obj/item/storage/large_holster/machete, /obj/item/weapon/baseballbat, /obj/item/weapon/baseballbat/metal, @@ -297,3 +295,7 @@ /obj/item/device/walkman, ) +/obj/item/clothing/suit/storage/snow_suit/liaison + name = "liaison's winter coat" + desc = "A Weyland-Yutani winter coat. Only the best comfort for the liaison in a cold environment." + icon_state = "snowsuit_liaison" diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index 17b98d9b9326..540c311f9221 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -777,12 +777,22 @@ icon_state = "liaison_regular" worn_state = "liaison_regular" +/obj/item/clothing/under/liaison_suit/charcoal + name = "liaison's charcoal suit" + desc = "A stiff, stylish charcoal suit commonly worn by businessmen from the Weyland-Yutani corporation. Expertly crafted to make you look like a prick." + icon_state = "liaison_charcoal" + worn_state = "liaison_charcoal" + /obj/item/clothing/under/liaison_suit/outing name = "liaison's outfit" desc = "A casual outfit consisting of a collared shirt and a vest. Looks like something you might wear on the weekends, or on a visit to a derelict colony." icon_state = "liaison_outing" worn_state = "liaison_outing" +/obj/item/clothing/under/liaison_suit/outing/red + icon_state = "liaison_outing_red" + worn_state = "liaison_outing_red" + /obj/item/clothing/under/liaison_suit/formal name = "liaison's white suit" desc = "A formal, white suit. Looks like something you'd wear to a funeral, a Weyland-Yutani corporate dinner, or both. Stiff as a board, but makes you feel like rolling out of a Rolls-Royce." @@ -795,6 +805,12 @@ icon_state = "liaison_suspenders" worn_state = "liaison_suspenders" +/obj/item/clothing/under/liaison_suit/blazer + name = "liaison's blue blazer" + desc = "A stiff but casual blue blazer. Similar can be found in any Weyland-Yutani office. Only the finest wear for the galaxy's most cunning." + icon_state = "liaison_blue_blazer" + worn_state = "liaison_blue_blazer" + /obj/item/clothing/under/marine/reporter name = "combat correspondent uniform" desc = "A relaxed and robust uniform fit for any potential reporting needs." diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 11a0b0de597f..c38e540efb30 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -162,9 +162,14 @@ if(linked_hive.hijack_burrowed_surge && (last_surge_time + surge_cooldown) < world.time) last_surge_time = world.time linked_hive.stored_larva++ + linked_hive.hijack_burrowed_left-- announce_dchat("The hive has gained another burrowed larva! Use the Join As Xeno verb to take it.", src) if(surge_cooldown > 30 SECONDS) //mostly for sanity purposes surge_cooldown = surge_cooldown - surge_incremental_reduction //ramps up over time + if(linked_hive.hijack_burrowed_left < 1) + linked_hive.hijack_burrowed_surge = FALSE + xeno_message(SPAN_XENOANNOUNCE("The hive's power wanes. You will no longer gain pooled larva over time."), 3, linked_hive.hivenumber) + // Hive core can repair itself over time if(health < maxhealth && last_healed <= world.time) 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/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 431b03fb31d3..14e990809f4f 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -484,14 +484,13 @@ var/list/ob_type_fuel_requirements var/list/turf_list = list() for(var/turf/T in range(range_num, target)) - if(protected_by_pylon(TURF_PROTECTION_OB, T)) - continue - turf_list += T for(var/i = 1 to total_amount) for(var/k = 1 to instant_amount) var/turf/U = pick(turf_list) + if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing + continue fire_in_a_hole(U) sleep(delay_between_clusters) 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/survivors.dm b/code/modules/gear_presets/survivors.dm index 42d5ec0915bb..97b974b8a5ec 100644 --- a/code/modules/gear_presets/survivors.dm +++ b/code/modules/gear_presets/survivors.dm @@ -346,6 +346,20 @@ ..() +/datum/equipment_preset/survivor/corporate/solaris + name = "Survivor - Solaris Ridge Corporate Liaison" + assignment = "Solaris Ridge Corporate Liaison" + +/datum/equipment_preset/survivor/corporate/solaris/load_gear(mob/living/carbon/human/new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/outing/red(new_human), WEAR_BODY) + if(new_human.disabilities & NEARSIGHTED) + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/prescription(new_human), WEAR_EYES) + else + new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(new_human), WEAR_EYES) + new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/knife(new_human), WEAR_FEET) + + ..() + // ----- Security Survivor /datum/equipment_preset/survivor/security 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/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 8413b6d118e6..84dacf4f8bfb 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -108,28 +108,28 @@ sound_to(recipient, 'sound/effects/mhelp.ogg') to_chat(recipient, wrap_message(msg, sender)) - for(var/client/C in GLOB.admins) + for(var/client/admin_client in GLOB.admins) var/formatted = msg var/soundfile - if(!C || C == recipient) + if(!admin_client || admin_client == recipient) continue // Initial broadcast - else if(!staff_only && !recipient && CLIENT_HAS_RIGHTS(C, R_MENTOR)) + else if(!staff_only && !recipient && CLIENT_HAS_RIGHTS(admin_client, R_MENTOR)) formatted = wrap_message(formatted, sender) soundfile = 'sound/effects/mhelp.ogg' - // Staff eavesdrop - else if(CLIENT_HAS_RIGHTS(C, R_MENTOR) && CLIENT_IS_STAFF(C)) + // Eavesdrop + else if(CLIENT_HAS_RIGHTS(admin_client, R_MENTOR) && (!staff_only || CLIENT_IS_STAFF(admin_client)) && admin_client != sender) if(include_keys) formatted = SPAN_MENTORHELP(key_name(sender, TRUE) + " -> " + key_name(recipient, TRUE) + ": ") + msg else continue - if(soundfile && with_sound && (C.prefs?.toggles_sound & SOUND_ADMINHELP)) - sound_to(C, soundfile) - to_chat(C, formatted) + if(soundfile && with_sound && (admin_client.prefs?.toggles_sound & SOUND_ADMINHELP)) + sound_to(admin_client, soundfile) + to_chat(admin_client, formatted) return // Makes the sender input a message and sends it 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/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm index 29779480f143..d3c2b725d7ef 100644 --- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm +++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm @@ -22,8 +22,8 @@ affected_mob.status_flags |= XENO_HOST START_PROCESSING(SSobj, src) if(iscarbon(affected_mob)) - var/mob/living/carbon/C = affected_mob - C.med_hud_set_status() + var/mob/living/carbon/affected_carbon = affected_mob + affected_carbon.med_hud_set_status() else return INITIALIZE_HINT_QDEL @@ -31,8 +31,8 @@ if(affected_mob) affected_mob.status_flags &= ~(XENO_HOST) if(iscarbon(affected_mob)) - var/mob/living/carbon/C = affected_mob - C.med_hud_set_status() + var/mob/living/carbon/affected_carbon = affected_mob + affected_carbon.med_hud_set_status() STOP_PROCESSING(SSobj, src) affected_mob = null GLOB.player_embryo_list -= src @@ -48,24 +48,24 @@ affected_mob.status_flags &= ~(XENO_HOST) STOP_PROCESSING(SSobj, src) if(iscarbon(affected_mob)) - var/mob/living/carbon/C = affected_mob - C.med_hud_set_status() + var/mob/living/carbon/affected_carbon = affected_mob + affected_carbon.med_hud_set_status() affected_mob = null return FALSE if(affected_mob.stat == DEAD) if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(world.time > H.timeofdeath + H.revive_grace_period) //Can't be defibbed. - var/mob/living/carbon/xenomorph/larva/L = locate() in affected_mob - if(L) - L.chest_burst(affected_mob) + var/mob/living/carbon/human/affected_human = affected_mob + if(world.time > affected_human.timeofdeath + affected_human.revive_grace_period) //Can't be defibbed. + var/mob/living/carbon/xenomorph/larva/larva_embryo = locate() in affected_mob + if(larva_embryo) + larva_embryo.chest_burst(affected_mob) qdel(src) return FALSE else - var/mob/living/carbon/xenomorph/larva/L = locate() in affected_mob - if(L) - L.chest_burst(affected_mob) + var/mob/living/carbon/xenomorph/larva/larva_embryo = locate() in affected_mob + if(larva_embryo) + larva_embryo.chest_burst(affected_mob) STOP_PROCESSING(SSobj, src) return FALSE @@ -89,12 +89,12 @@ if(stage < 5) counter += 1 * hive.larva_gestation_multiplier - if(stage < 5 && counter >= 120) + if(stage < 5 && counter >= 90) counter = 0 stage++ if(iscarbon(affected_mob)) - var/mob/living/carbon/C = affected_mob - C.med_hud_set_status() + var/mob/living/carbon/affected_carbon = affected_mob + affected_carbon.med_hud_set_status() switch(stage) if(2) @@ -132,9 +132,9 @@ if(6) larva_autoburst_countdown-- if(!larva_autoburst_countdown) - var/mob/living/carbon/xenomorph/larva/L = locate() in affected_mob - if(L) - L.chest_burst(affected_mob) + var/mob/living/carbon/xenomorph/larva/larva_embryo = locate() in affected_mob + if(larva_embryo) + larva_embryo.chest_burst(affected_mob) //We look for a candidate. If found, we spawn the candidate as a larva //Order of priority is bursted individual (if xeno is enabled), then random candidate, and then it's up for grabs and spawns braindead @@ -256,36 +256,36 @@ victim.spawn_gibs() - for(var/mob/living/carbon/xenomorph/larva/L in victim) - var/datum/hive_status/hive = GLOB.hive_datum[L.hivenumber] - L.forceMove(get_turf(victim)) //moved to the turf directly so we don't get stuck inside a cryopod or another mob container. - playsound(L, pick('sound/voice/alien_chestburst.ogg','sound/voice/alien_chestburst2.ogg'), 25) + for(var/mob/living/carbon/xenomorph/larva/larva_embryo in victim) + var/datum/hive_status/hive = GLOB.hive_datum[larva_embryo.hivenumber] + larva_embryo.forceMove(get_turf(victim)) //moved to the turf directly so we don't get stuck inside a cryopod or another mob container. + playsound(larva_embryo, pick('sound/voice/alien_chestburst.ogg','sound/voice/alien_chestburst2.ogg'), 25) - if(L.client) - L.set_lighting_alpha_from_prefs(L.client) + if(larva_embryo.client) + larva_embryo.set_lighting_alpha_from_prefs(larva_embryo.client) - L.attack_log += "\[[time_stamp()]\] chestbursted from [key_name(victim)]" - victim.attack_log += "\[[time_stamp()]\] Was chestbursted, larva was [key_name(L)]" + larva_embryo.attack_log += "\[[time_stamp()]\] chestbursted from [key_name(victim)]" + victim.attack_log += "\[[time_stamp()]\] Was chestbursted, larva was [key_name(larva_embryo)]" if(burstcount) - step(L, pick(cardinal)) + step(larva_embryo, pick(cardinal)) if(round_statistics) round_statistics.total_larva_burst++ burstcount++ - if(!L.ckey && L.burrowable && loc && is_ground_level(loc.z) && (locate(/obj/structure/bed/nest) in loc) && hive.living_xeno_queen && hive.living_xeno_queen.z == loc.z) - L.visible_message(SPAN_XENODANGER("[L] quickly burrows into the ground.")) - if(round_statistics && !L.statistic_exempt) + if(!larva_embryo.ckey && larva_embryo.burrowable && loc && is_ground_level(loc.z) && (locate(/obj/structure/bed/nest) in loc) && hive.living_xeno_queen && hive.living_xeno_queen.z == loc.z) + larva_embryo.visible_message(SPAN_XENODANGER("[larva_embryo] quickly burrows into the ground.")) + if(round_statistics && !larva_embryo.statistic_exempt) round_statistics.track_new_participant(faction, -1) // keep stats sane hive.stored_larva++ hive.hive_ui.update_burrowed_larva() - qdel(L) + qdel(larva_embryo) if(!victim.first_xeno) - to_chat(L, SPAN_XENOHIGHDANGER("The Queen's will overwhelms your instincts...")) - to_chat(L, SPAN_XENOHIGHDANGER("\"[hive.hive_orders]\"")) - log_attack("[key_name(victim)] chestbursted, the larva was [key_name(L)].") //this is so that admins are not spammed with los logs + to_chat(larva_embryo, SPAN_XENOHIGHDANGER("The Queen's will overwhelms your instincts...")) + to_chat(larva_embryo, SPAN_XENOHIGHDANGER("\"[hive.hive_orders]\"")) + log_attack("[key_name(victim)] chestbursted, the larva was [key_name(larva_embryo)].") //this is so that admins are not spammed with los logs for(var/obj/item/alien_embryo/AE in victim) qdel(AE) @@ -295,31 +295,31 @@ victim.gib(cause) else if(ishuman(victim)) - var/mob/living/carbon/human/H = victim - H.last_damage_data = cause + var/mob/living/carbon/human/victim_human = victim + victim_human.last_damage_data = cause var/datum/internal_organ/O var/i for(i in list("heart","lungs")) //This removes (and later garbage collects) both organs. No heart means instant death. - O = H.internal_organs_by_name[i] - H.internal_organs_by_name -= i - H.internal_organs -= O + O = victim_human.internal_organs_by_name[i] + victim_human.internal_organs_by_name -= i + victim_human.internal_organs -= O victim.death(cause) // Certain species were still surviving bursting (predators), DEFINITELY kill them this time. victim.chestburst = 2 victim.update_burst() // Squeeze thru dense objects as a larva, as airlocks -/mob/living/carbon/xenomorph/larva/proc/scuttle(obj/structure/S) +/mob/living/carbon/xenomorph/larva/proc/scuttle(obj/structure/target) var/move_dir = get_dir(src, loc) - for(var/atom/movable/AM in get_turf(S)) - if(AM != S && AM.density && AM.BlockedPassDirs(src, move_dir)) - to_chat(src, SPAN_WARNING("\The [AM] prevents you from squeezing under \the [S]!")) + for(var/atom/movable/AM in get_turf(target)) + if(AM != target && AM.density && AM.BlockedPassDirs(src, move_dir)) + to_chat(src, SPAN_WARNING("\The [AM] prevents you from squeezing under \the [target]!")) return // Is it an airlock? - if(istype(S, /obj/structure/machinery/door/airlock)) - var/obj/structure/machinery/door/airlock/A = S - if(A.locked || A.welded) //Can't pass through airlocks that have been bolted down or welded - to_chat(src, SPAN_WARNING("\The [A] is locked down tight. You can't squeeze underneath!")) + if(istype(target, /obj/structure/machinery/door/airlock)) + var/obj/structure/machinery/door/airlock/selected_airlock = target + if(selected_airlock.locked || selected_airlock.welded) //Can't pass through airlocks that have been bolted down or welded + to_chat(src, SPAN_WARNING("\The [selected_airlock] is locked down tight. You can't squeeze underneath!")) return - visible_message(SPAN_WARNING("\The [src] scuttles underneath \the [S]!"), \ - SPAN_WARNING("You squeeze and scuttle underneath \the [S]."), null, 5) - forceMove(S.loc) + visible_message(SPAN_WARNING("\The [src] scuttles underneath \the [target]!"), \ + SPAN_WARNING("You squeeze and scuttle underneath \the [target]."), null, 5) + forceMove(target.loc) diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index 212688c8c98f..8b3b1d54f26d 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -209,6 +209,11 @@ if(stat == UNCONSCIOUS) return + // Force reset throw now because [/atom/movable/proc/launch_impact] only does that later on + // If we DON'T, step()'s move below can collide, rebound, trigger this proc again, into infinite recursion + throwing = FALSE + rebounding = FALSE + if(leaping && can_hug(L, hivenumber)) attach(L) else if(L.density) 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 20bd029f5c94..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 @@ -472,22 +472,6 @@ user_xeno.hive.banished_ckeys.Remove(banished_name) return ..() -/datum/action/xeno_action/activable/secrete_resin/remote/queen/use_ability(atom/A) - . = ..() - if(!.) - return - - if(!boosted) - return - var/mob/living/carbon/xenomorph/X = owner - var/datum/hive_status/HS = X.hive - if(!HS || !HS.hive_location) - return - // 5 screen radius - if(get_dist(A, HS.hive_location) > 35) - // Apply the normal cooldown if not building near the hive - apply_cooldown_override(initial(xeno_cooldown)) - /datum/action/xeno_action/onclick/eye name = "Enter Eye Form" action_icon_state = "queen_eye" @@ -528,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/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 9eb8601bb6dc..246e2d2809db 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -287,6 +287,9 @@ SPAN_DANGER("You nudge your head against [src]."), null, 5, CHAT_TYPE_XENO_FLUFF) /mob/living/proc/is_xeno_grabbable() + if(stat == DEAD) + return FALSE + return TRUE /mob/living/carbon/human/is_xeno_grabbable() diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm index 04b7e04c2da5..4cf0ff113615 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm @@ -170,3 +170,5 @@ /mob/living/carbon/xenomorph/larva/emote(act, m_type, message, intentional, force_silence) playsound(loc, "alien_roar_larva", 15) +/mob/living/carbon/xenomorph/larva/is_xeno_grabbable() + return TRUE 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/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index b5431720e14a..5d3ee0b04ba7 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -285,6 +285,8 @@ var/larva_gestation_multiplier = 1 var/bonus_larva_spawn_chance = 1 var/hijack_burrowed_surge = FALSE //at hijack, start spawning lots of burrowed + /// how many burrowed is going to spawn during larva surge + var/hijack_burrowed_left = 0 var/ignore_slots = FALSE var/dynamic_evolution = TRUE @@ -877,6 +879,8 @@ /datum/hive_status/proc/abandon_on_hijack() var/area/hijacked_dropship = get_area(living_xeno_queen) + var/shipside_humans_weighted_count = 0 + var/xenos_count = 0 for(var/name_ref in hive_structures) for(var/obj/effect/alien/resin/special/S in hive_structures[name_ref]) if(get_area(S) == hijacked_dropship) @@ -885,6 +889,10 @@ qdel(S) for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) if(get_area(xeno) != hijacked_dropship && xeno.loc && is_ground_level(xeno.loc.z)) + if(isfacehugger(xeno)) + to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, you quickly find a hiding place to enter hibernation as you lose touch with the hive mind.")) + qdel(xeno) + continue if(xeno.hunter_data.hunted && !isqueen(xeno)) to_chat(xeno, SPAN_XENOANNOUNCE("The Queen has left without you, seperating you from her hive! You must defend yourself from the headhunter before you can enter hibernation...")) xeno.set_hive_and_update(XENO_HIVE_FORSAKEN) @@ -895,6 +903,9 @@ xeno.handle_stomach_contents() qdel(xeno) stored_larva++ + continue + if(!isfacehugger(xeno)) + xenos_count++ for(var/i in GLOB.alive_mob_list) var/mob/living/potential_host = i if(!(potential_host.status_flags & XENO_HOST)) @@ -907,7 +918,13 @@ for(var/obj/item/alien_embryo/embryo in potential_host) embryo.hivenumber = XENO_HIVE_FORSAKEN potential_host.update_med_icon() + for(var/mob/living/carbon/human/current_human as anything in GLOB.alive_human_list) + if((isspecieshuman(current_human) || isspeciessynth(current_human)) && current_human.job) + var/turf/turf = get_turf(current_human) + if(is_mainship_level(turf?.z)) + shipside_humans_weighted_count += RoleAuthority.calculate_role_weight(current_human.job) hijack_burrowed_surge = TRUE + hijack_burrowed_left = max(n_ceil(shipside_humans_weighted_count * 0.5) - xenos_count, 5) hivecore_cooldown = FALSE xeno_message(SPAN_XENOBOLDNOTICE("The weeds have recovered! A new hive core can be built!"),3,hivenumber) 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 e664d0165c78..ce151c14324c 100644 --- a/code/modules/shuttle/dropship_hijack.dm +++ b/code/modules/shuttle/dropship_hijack.dm @@ -1,3 +1,5 @@ +#define HIJACK_CRASH_SITE_OFFSET_X -5 +#define HIJACK_CRASH_SITE_OFFSET_Y -11 /datum/dropship_hijack var/obj/docking_port/mobile/shuttle @@ -90,9 +92,10 @@ var/obj/docking_port/stationary/marine_dropship/crash_site/target_site = new() crash_site = target_site - crash_site.x = target.x - 5 - crash_site.y = target.y - 11 - crash_site.z = target.z + var/turf/offset_target = locate(target.x + HIJACK_CRASH_SITE_OFFSET_X, target.y + HIJACK_CRASH_SITE_OFFSET_Y, target.z) + if(!offset_target) + offset_target = target // Welp the offsetting failed so... + target_site.forceMove(offset_target) target_site.name = "[shuttle] crash site" target_site.id = "crash_site_[shuttle.id]" @@ -116,8 +119,11 @@ remaining_crash_sites -= target_ship_section var/new_target_ship_section = pick(remaining_crash_sites) var/turf/target = get_crashsite_turf(new_target_ship_section) - crash_site.Move(target) - marine_announcement("A hostile aircraft on course for the [target_ship_section] has been successfully deterred.", "IX-50 MGAD System") + var/turf/offset_target = locate(target.x + HIJACK_CRASH_SITE_OFFSET_X, target.y + HIJACK_CRASH_SITE_OFFSET_Y, target.z) + 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", logging = ARES_LOG_SECURITY) target_ship_section = new_target_ship_section // TODO mobs not alerted for(var/area/internal_area in shuttle.shuttle_areas) @@ -143,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 @@ -196,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) @@ -218,3 +223,6 @@ else CRASH("Crash site [ship_section] unknown.") return pick(turfs) + +#undef HIJACK_CRASH_SITE_OFFSET_X +#undef HIJACK_CRASH_SITE_OFFSET_Y 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/html/changelogs/AutoChangeLog-pr-3298.yml b/html/changelogs/AutoChangeLog-pr-3298.yml new file mode 100644 index 000000000000..0a75d2215043 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3298.yml @@ -0,0 +1,15 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Added an admin button for an ARES bioscan. Slightly refactored how Bioscans trigger for marines, relying on an ARES processor." + - rscadd: "Added individual proccessors for ARES systems. These are WIP and will eventually have damage and repair interactions." + - rscadd: "Added an ARES interaction console in the AI Core room, which holds logs for most ARES functions." + - rscadd: "Added the ability for ARES console to call ERT or Distress." + - rscadd: "Added motion triggers in ARES core and shipside comms that send alerts over Apollo." + - rscadd: "Added a 1to1 conversation feature between ARES and users of the interface console." + - rscadd: "Added preset open versions of blended poddoors." + - rscadd: "Added a console for directing Working Joes. This is largely WIP for future PR(s)." + - rscadd: "Added subtypes of air pipes that don't explode on hijack, used these in ARES core." + - maptweak: "Remodelled ARES Core onto a fake-z, and added the new processors." + - bugfix: "door_control buttons now respect being indestructable when processing explosions." + - maptweak: "Fixed the M39s overflowing in brig armory due to use of landmarks." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3577.yml b/html/changelogs/AutoChangeLog-pr-3577.yml deleted file mode 100644 index 759df8eb0357..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3577.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "TeDGamer Drathek" -delete-after: True -changes: - - bugfix: "Boilers from other hives generate proper colored IFFed gas" - - bugfix: "Fixes some death causes with boiler acid gas (for bombard, shroud, and gibbing), neurotoxin gas/stabs, acid shotgun, and xeno spits" - - balance: "Neurotoxin stops processing only in dead mobs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3666.yml b/html/changelogs/AutoChangeLog-pr-3666.yml new file mode 100644 index 000000000000..d7d8860c237e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3666.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - balance: "Xenos no longer can pull dead xenos" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3688.yml b/html/changelogs/AutoChangeLog-pr-3688.yml deleted file mode 100644 index 0fa45242846e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3688.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Changed min and max Predator ages from 20 - 10000 to 175 - 3000" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3717.yml b/html/changelogs/AutoChangeLog-pr-3717.yml new file mode 100644 index 000000000000..6d6327ea63a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3717.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed the crashsite offset for a hijack shuttle that gets deterred by the MGAD System" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3718.yml b/html/changelogs/AutoChangeLog-pr-3718.yml new file mode 100644 index 000000000000..41f5322a2493 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3718.yml @@ -0,0 +1,4 @@ +author: "TheGamerdk" +delete-after: True +changes: + - balance: "Queen boosted building no longer has 2 second cooldown when far from hive" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3722.yml b/html/changelogs/AutoChangeLog-pr-3722.yml deleted file mode 100644 index f915061d5db7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3722.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheGamerdk" -delete-after: True -changes: - - bugfix: "The game will no longer falsely claim there is no CO" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3723.yml b/html/changelogs/AutoChangeLog-pr-3723.yml new file mode 100644 index 000000000000..987b7eeec708 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3723.yml @@ -0,0 +1,4 @@ +author: "TheGamerdk" +delete-after: True +changes: + - bugfix: "Communications intel objective now actually works" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3730.yml b/html/changelogs/AutoChangeLog-pr-3730.yml new file mode 100644 index 000000000000..9ae18e6bc788 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3730.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed a MC crash related to NPC huggers rebounding logic." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3731.yml b/html/changelogs/AutoChangeLog-pr-3731.yml new file mode 100644 index 000000000000..21fd76664d2b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3731.yml @@ -0,0 +1,4 @@ +author: "blackdragonTOW" +delete-after: True +changes: + - maptweak: "Added a small light to unlit rooms." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3736.yml b/html/changelogs/AutoChangeLog-pr-3736.yml new file mode 100644 index 000000000000..c1eba0beabfd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3736.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscdel: "Removed toxin mags on shivas" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3742.yml b/html/changelogs/AutoChangeLog-pr-3742.yml new file mode 100644 index 000000000000..7319ac52f8d9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3742.yml @@ -0,0 +1,6 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "Minor decal changes to LV522" + - maptweak: "Buffed sec armory on LV522" + - maptweak: "LV522 Breaching charge moved to the PROP APC made UNACIDABLE" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3743.yml b/html/changelogs/AutoChangeLog-pr-3743.yml new file mode 100644 index 000000000000..084e74fc2c2e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3743.yml @@ -0,0 +1,4 @@ +author: "Katskan" +delete-after: True +changes: + - balance: "Removed G8A storage from various snow suits and parkas" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3746.yml b/html/changelogs/AutoChangeLog-pr-3746.yml new file mode 100644 index 000000000000..48b25b9efb1a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3746.yml @@ -0,0 +1,4 @@ +author: "IowaPotatoFarmer" +delete-after: True +changes: + - rscadd: "Solaris Ridge now has a Corporate Liaison survivor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3748.yml b/html/changelogs/AutoChangeLog-pr-3748.yml new file mode 100644 index 000000000000..74c02e602003 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3748.yml @@ -0,0 +1,5 @@ +author: "Diegoflores31" +delete-after: True +changes: + - balance: "reduced Larva Burst time from 10 minutes to 7.5 minutes" + - refactor: "changed 1 letter vars." \ No newline at end of file diff --git a/html/changelogs/archive/2023-06.yml b/html/changelogs/archive/2023-06.yml index df1b3b34b455..71aeb035f4b8 100644 --- a/html/changelogs/archive/2023-06.yml +++ b/html/changelogs/archive/2023-06.yml @@ -356,3 +356,30 @@ - bugfix: Fix a possibility of banished larva refunding double the larva blackdragonTOW: - spellcheck: multiple typos and grammar changes in the round start tooltips. +2023-06-27: + TeDGamer Drathek: + - bugfix: Boilers from other hives generate proper colored IFFed gas + - bugfix: Fixes some death causes with boiler acid gas (for bombard, shroud, and + gibbing), neurotoxin gas/stabs, acid shotgun, and xeno spits + - balance: Neurotoxin stops processing only in dead mobs + TheGamerdk: + - bugfix: The game will no longer falsely claim there is no CO + realforest2001: + - rscadd: Changed min and max Predator ages from 20 - 10000 to 175 - 3000 +2023-06-28: + Drathek: + - admin: Mentors can now eavesdrop on mentor messages, and the responder to a mhelp + doesn't get double logging from eavesdropping. + Morrow, Thwomper: + - rscadd: Added three new uniforms and a snow jacket for the CL. + TheGamerdk: + - balance: Cluster OBs will now no longer hit turfs that have gotten OB protection + after the initial OB was fired. + ihatethisengine: + - balance: larva surge is limited by marines/xenos ratio + - bugfix: xenos no longer get free larva from abandoned facehuggers during hijack + - balance: explosive barricade upgrade provides better protection against explosions + (25% to 50%) + - balance: explosive barricade upgrade provides strong protection against brute-based + projectiles (50%) + - balance: explosive barricade upgrade provides strong protection against fire (50%) diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index 4d63b7abd7f1..5cccc4c2e0e0 100644 Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi index 4973a59a69c4..cac9869c9034 100644 Binary files a/icons/mob/humans/onmob/uniform_0.dmi and b/icons/mob/humans/onmob/uniform_0.dmi differ diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi index 47d06bc2cc10..cff4b5d48c17 100644 Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ diff --git a/icons/obj/items/clothing/uniforms.dmi b/icons/obj/items/clothing/uniforms.dmi index 132f193fbf40..254c9e8b67c9 100644 Binary files a/icons/obj/items/clothing/uniforms.dmi and b/icons/obj/items/clothing/uniforms.dmi differ 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/bigredv2.json b/maps/bigredv2.json index ecb2e1472c57..0a6db01cd498 100644 --- a/maps/bigredv2.json +++ b/maps/bigredv2.json @@ -12,6 +12,7 @@ "/datum/equipment_preset/survivor/trucker/solaris", "/datum/equipment_preset/survivor/security/solaris", "/datum/equipment_preset/survivor/colonial_marshal/solaris", + "/datum/equipment_preset/survivor/corporate/solaris", "/datum/equipment_preset/survivor/clf", "/datum/equipment_preset/survivor/civilian" ], diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm index 2ca8c7083cfa..a431aa368702 100644 --- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm +++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm @@ -8762,8 +8762,6 @@ "cSn" = ( /obj/structure/closet/secure_closet/guncabinet, /obj/item/weapon/gun/rifle/m41aMK1, -/obj/item/ammo_magazine/rifle/m41aMK1/toxin, -/obj/item/ammo_magazine/rifle/m41aMK1/toxin, /obj/item/ammo_magazine/rifle/m41aMK1, /obj/item/ammo_magazine/rifle/m41aMK1, /obj/item/ammo_magazine/rifle/m41aMK1, @@ -19747,7 +19745,6 @@ pixel_x = -10; pixel_y = 13 }, -/obj/item/ammo_magazine/rifle/toxin, /turf/open/asphalt/cement, /area/shiva/interior/warehouse) "oYw" = ( @@ -21979,7 +21976,6 @@ /area/shiva/interior/colony/research_hab) "ril" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/item/ammo_magazine/rifle/m41aMK1/toxin, /turf/open/floor/shiva{ icon_state = "multi_tiles" }, @@ -24859,7 +24855,6 @@ }, /area/shiva/interior/colony/medseceng) "ukJ" = ( -/obj/item/ammo_magazine/rifle/m41aMK1/toxin, /turf/open/floor/shiva, /area/shiva/interior/colony/research_hab) "ukU" = ( diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index 01df2b7e136e..34eecc574c9c 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -998,8 +998,8 @@ /obj/structure/closet/crate/weapon, /obj/item/weapon/gun/rifle/l42a, /obj/item/weapon/gun/rifle/l42a, -/obj/item/ammo_magazine/rifle/l42a, -/obj/item/ammo_magazine/rifle/l42a, +/obj/item/weapon/gun/rifle/l42a, +/obj/item/weapon/gun/rifle/l42a, /turf/open/floor/prison, /area/lv522/indoors/a_block/security) "aIp" = ( @@ -4661,12 +4661,11 @@ /turf/open/floor/corsat, /area/lv522/atmos/east_reactor/west) "cKF" = ( -/obj/structure/cargo_container/kelland/left, /obj/item/explosive/plastic/breaching_charge{ - layer = 5 + unacidable = 1 }, /turf/open/auto_turf/shale/layer0, -/area/lv522/outdoors/colony_streets/east_central_street) +/area/lv522/outdoors/n_rockies) "cKG" = ( /turf/closed/wall/strata_ice/dirty, /area/lv522/outdoors/nw_rockies) @@ -9745,6 +9744,21 @@ icon_state = "plate" }, /area/lv522/atmos/east_reactor/east) +"eWF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/firstaid/adv{ + layer = 3.1; + pixel_x = 3; + pixel_y = -2 + }, +/obj/structure/surface/rack, +/obj/item/storage/firstaid/adv{ + pixel_y = 14 + }, +/turf/open/floor/prison{ + icon_state = "darkredfull2" + }, +/area/lv522/indoors/a_block/security) "eWK" = ( /obj/structure/pipes/standard/manifold/hidden/green{ dir = 4 @@ -10683,6 +10697,12 @@ /obj/item/prop/colony/used_flare, /turf/open/floor/prison, /area/lv522/indoors/a_block/dorms) +"fuw" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "fuQ" = ( /obj/structure/pipes/standard/manifold/hidden/green{ dir = 1 @@ -13641,6 +13661,7 @@ "gLV" = ( /obj/structure/prop/server_equipment/yutani_server/broken{ density = 0; + layer = 3.5; pixel_y = 16 }, /obj/effect/decal/cleanable/dirt, @@ -13746,10 +13767,9 @@ /area/lv522/atmos/east_reactor) "gOC" = ( /obj/structure/pipes/vents/pump, -/obj/structure/surface/rack, -/obj/item/weapon/shield/riot, -/obj/item/weapon/classic_baton, /obj/effect/decal/cleanable/dirt, +/obj/structure/surface/table/almayer, +/obj/item/ammo_box/magazine/shotgun/beanbag/empty, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -19773,10 +19793,10 @@ }, /area/lv522/indoors/c_block/cargo) "jmd" = ( -/obj/item/weapon/shield/riot, -/obj/item/weapon/classic_baton, -/obj/structure/surface/rack, /obj/effect/decal/cleanable/dirt, +/obj/structure/surface/rack, +/obj/item/weapon/gun/revolver/cmb, +/obj/item/ammo_magazine/revolver/cmb, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -20728,13 +20748,13 @@ /turf/open/auto_turf/shale/layer1, /area/lv522/outdoors/colony_streets/north_west_street) "jGj" = ( -/obj/structure/surface/rack, -/obj/item/weapon/gun/revolver/cmb, -/obj/item/ammo_magazine/revolver/cmb, -/turf/open/floor/prison{ - icon_state = "darkredfull2" +/obj/effect/decal/cleanable/dirt, +/obj/item/maintenance_jack, +/turf/open/floor/strata{ + dir = 4; + icon_state = "white_cyan1" }, -/area/lv522/indoors/a_block/security) +/area/lv522/indoors/a_block/corpo) "jGm" = ( /obj/structure/barricade/handrail{ dir = 4 @@ -21364,6 +21384,10 @@ }, /turf/closed/wall/mineral/bone_resin, /area/lv522/oob) +"jUg" = ( +/obj/item/ammo_box/magazine/l42a/ap/empty, +/turf/open/floor/prison, +/area/lv522/indoors/a_block/security) "jUk" = ( /turf/open/floor/prison{ dir = 10; @@ -22373,6 +22397,13 @@ /obj/structure/platform_decoration{ dir = 4 }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -25126,6 +25157,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/prison, /area/lv522/indoors/a_block/dorms) +"lsG" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "lsR" = ( /obj/structure/fence{ layer = 2.9 @@ -26235,6 +26273,13 @@ icon_state = "floor_marked" }, /area/lv522/indoors/lone_buildings/outdoor_bot) +"lUh" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/auto_turf/shale/layer1, +/area/lv522/outdoors/colony_streets/north_west_street) "lUi" = ( /obj/structure/bed/chair/comfy{ dir = 1 @@ -27097,6 +27142,12 @@ /obj/structure/platform_decoration{ dir = 8 }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -27108,6 +27159,13 @@ icon_state = "darkpurplefull2" }, /area/lv522/indoors/a_block/dorms) +"mnU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/ammo_magazine/rifle/l42a/extended{ + current_rounds = 0 + }, +/turf/open/floor/prison, +/area/lv522/indoors/a_block/security/glass) "mnX" = ( /obj/item/weapon/gun/rifle/m41a{ current_mag = null @@ -28488,6 +28546,13 @@ /area/lv522/outdoors/colony_streets/south_east_street) "mUG" = ( /obj/structure/platform_decoration, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -28507,6 +28572,10 @@ /area/lv522/indoors/a_block/kitchen) "mVi" = ( /obj/structure/platform, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -29045,6 +29114,9 @@ /obj/structure/platform{ dir = 4 }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -30273,21 +30345,14 @@ /turf/open/asphalt/cement, /area/lv522/outdoors/colony_streets/north_street) "nKo" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/door_control/brbutton/alt{ - id = "Secure_Master_Armoury"; - name = "remote door-control" - }, -/obj/item/limb/hand/l_hand{ - dir = 1; - pixel_x = 9; - pixel_y = 3 +/obj/structure/pipes/standard/simple/hidden/green{ + dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/prison{ - icon_state = "darkredfull2" +/obj/item/weapon/gun/rifle/l42a{ + current_mag = null }, -/area/lv522/indoors/a_block/security) +/turf/open/floor/plating/plating_catwalk/prison, +/area/lv522/indoors/a_block/security/glass) "nKK" = ( /obj/structure/platform{ dir = 8 @@ -30376,6 +30441,7 @@ "nMt" = ( /obj/structure/surface/table/almayer, /obj/effect/decal/cleanable/dirt, +/obj/item/ammo_box/magazine/l42a, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -34987,6 +35053,14 @@ /obj/structure/platform_decoration{ dir = 1 }, +/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/prison{ icon_state = "floor_plate" }, @@ -36438,6 +36512,13 @@ }, /turf/open/floor/plating, /area/lv522/outdoors/colony_streets/central_streets) +"qma" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/auto_turf/shale/layer1, +/area/lv522/outdoors/colony_streets/north_west_street) "qml" = ( /obj/structure/pipes/standard/simple/hidden/green{ dir = 4 @@ -36686,9 +36767,17 @@ /turf/open/floor/plating/plating_catwalk/prison, /area/lv522/indoors/a_block/bridges/op_centre) "qqD" = ( -/obj/item/ammo_box/magazine/shotgun/buckshot/empty, /obj/structure/surface/table/almayer, /obj/effect/decal/cleanable/dirt, +/obj/structure/machinery/door_control/brbutton/alt{ + id = "Sec-Armoury-Lockdown"; + name = "remote door-control" + }, +/obj/item/limb/hand/l_hand{ + dir = 1; + pixel_x = 9; + pixel_y = 3 + }, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -36816,6 +36905,10 @@ /obj/structure/platform{ dir = 8 }, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -37353,6 +37446,14 @@ icon_state = "blue_plate" }, /area/lv522/indoors/a_block/hallway) +"qDl" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_x = 1; + pixel_y = 1 + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "qDr" = ( /obj/item/ammo_magazine/rifle/heap{ current_rounds = 0 @@ -39297,6 +39398,12 @@ icon_state = "floor_plate" }, /area/lv522/indoors/a_block/hallway) +"rmX" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "rng" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/machinery/camera/autoname{ @@ -39624,12 +39731,8 @@ /turf/open/floor/prison, /area/lv522/indoors/a_block/dorms) "ruj" = ( -/obj/structure/machinery/door_control{ - id = "UD6"; - name = "Cargo Shutter Control" - }, /turf/closed/shuttle/dropship2/tornado/typhoon{ - icon_state = "53" + icon_state = "59" }, /area/lv522/landing_zone_forecon/UD6_Typhoon) "rus" = ( @@ -40104,18 +40207,12 @@ }, /area/lv522/landing_zone_forecon/UD6_Typhoon) "rDu" = ( -/obj/structure/closet/crate/ammo, -/obj/item/ammo_magazine/m56d, -/obj/item/ammo_magazine/m56d, -/obj/item/device/m56d_gun, -/obj/structure/barricade/handrail{ - dir = 4 - }, -/obj/structure/barricade/handrail{ - dir = 8 +/obj/structure/machinery/door_control{ + id = "UD6"; + name = "Cargo Shutter Control" }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" +/turf/closed/shuttle/dropship2/tornado/typhoon{ + icon_state = "53" }, /area/lv522/landing_zone_forecon/UD6_Typhoon) "rDz" = ( @@ -41363,6 +41460,9 @@ /obj/structure/machinery/light{ dir = 8 }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, /turf/open/auto_turf/shale/layer0, /area/lv522/outdoors/colony_streets/north_west_street) "seA" = ( @@ -44799,6 +44899,9 @@ /obj/structure/platform{ dir = 1 }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, /turf/open/floor/prison{ icon_state = "floor_plate" }, @@ -47329,6 +47432,13 @@ "uAa" = ( /turf/open/floor/prison, /area/lv522/outdoors/colony_streets/north_street) +"uAb" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_x = 1 + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "uAd" = ( /turf/open/floor/corsat{ dir = 1; @@ -47394,7 +47504,7 @@ /turf/open/floor/prison, /area/lv522/indoors/a_block/security) "uDs" = ( -/obj/item/clothing/head/beret/sec/hos, +/obj/item/clothing/head/CMB, /obj/effect/decal/cleanable/blood, /turf/open/floor/plating/plating_catwalk/prison, /area/lv522/indoors/a_block/security) @@ -47602,6 +47712,12 @@ icon_state = "blue_plate" }, /area/lv522/indoors/a_block/hallway) +"uGd" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out" + }, +/turf/open/auto_turf/shale/layer0, +/area/lv522/outdoors/colony_streets/north_west_street) "uGl" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/prison{ @@ -54463,7 +54579,7 @@ }, /area/lv522/indoors/b_block/hydro) "xwO" = ( -/obj/structure/cargo_container/watatsumi/leftmid, +/obj/structure/cargo_container/seegson/left, /turf/open/floor/prison, /area/lv522/outdoors/colony_streets/north_west_street) "xwZ" = ( @@ -54514,7 +54630,7 @@ /turf/open/floor/plating, /area/lv522/indoors/c_block/mining) "xxJ" = ( -/obj/structure/cargo_container/watatsumi/rightmid, +/obj/structure/cargo_container/seegson/mid, /obj/effect/decal/warning_stripes{ icon_state = "E"; pixel_x = 1 @@ -54530,7 +54646,7 @@ /turf/open/floor/prison, /area/lv522/indoors/a_block/admin) "xxV" = ( -/obj/structure/cargo_container/watatsumi/right, +/obj/structure/cargo_container/seegson/right, /turf/open/asphalt/cement{ icon_state = "cement1" }, @@ -55007,13 +55123,16 @@ /turf/open/floor/plating, /area/lv522/indoors/lone_buildings/engineering) "xKc" = ( -/obj/structure/largecrate/supply/supplies/mre, /obj/structure/barricade/handrail{ - dir = 4 + dir = 8 }, /obj/structure/barricade/handrail{ - dir = 8 + dir = 4 }, +/obj/structure/closet/crate/ammo, +/obj/item/ammo_magazine/m56d, +/obj/item/ammo_magazine/m56d, +/obj/item/device/m56d_gun, /turf/open/shuttle/dropship{ icon_state = "rasputin15" }, @@ -55994,9 +56113,8 @@ }, /area/lv522/outdoors/colony_streets/north_west_street) "ydD" = ( -/obj/item/weapon/shield/riot, -/obj/item/weapon/classic_baton, -/obj/structure/surface/rack, +/obj/structure/surface/table/almayer, +/obj/item/ammo_box/magazine/shotgun/buckshot/empty, /turf/open/floor/prison{ icon_state = "darkredfull2" }, @@ -64934,11 +65052,11 @@ slO hJZ hJZ hJZ -hJZ -hJZ -hJZ -hJZ -hJZ +uAb +lsG +lsG +lsG +qDl clY vjG kCJ @@ -65161,11 +65279,11 @@ slO hJZ clY hJZ -hJZ +rmX xkO xkO xkO -clY +lUh clY clY oTd @@ -65388,11 +65506,11 @@ slO hJZ clY clY -hJZ +rmX xkO sKj xkO -clY +lUh clY clY srQ @@ -65615,11 +65733,11 @@ eUt hJZ hJZ clY -hJZ +rmX xkO xWx xkO -clY +lUh clY clY oNQ @@ -65842,11 +65960,11 @@ eUt clY hJZ hJZ -hJZ +uGd sek -hJZ +fuw sek -clY +qma clY hJZ oNQ @@ -68540,7 +68658,7 @@ cpy cpy fgf cpy -yim +cKF hzA ihy yim @@ -75861,8 +75979,8 @@ kRb kBk iJu uDs -uDb -nKo +jUg +uVj sjy ogK oud @@ -76085,10 +76203,10 @@ wdi sjy sjy jmd -jmd +eWF oLW mbF -jGj +jft xbj sjy mNR @@ -77214,7 +77332,7 @@ sjy sjy sjy lhK -azl +nKo mqH ybt sjy @@ -77442,7 +77560,7 @@ sjy sjy lhK azl -mqH +mnU xhu sjy vHU @@ -78108,7 +78226,7 @@ iPZ uSv jyx uQF -jyx +jGj wwy jPw qgr @@ -79450,7 +79568,7 @@ saC saC saC saC -cpy +saC saC ien ien @@ -79675,9 +79793,9 @@ saC saC saC saC -cpy -cpy -cpy +saC +saC +saC saC saC ien @@ -79901,11 +80019,11 @@ saC saC saC saC -cpy -cpy -cpy -cpy -cpy +saC +saC +saC +saC +saC saC ien rxI @@ -80127,11 +80245,11 @@ saC saC saC saC -cpy -cpy -cpy -cpy -cpy +saC +saC +saC +saC +saC saC ien ien @@ -80355,10 +80473,10 @@ saC saC saC saC -cpy -cpy saC -cpy +saC +saC +saC saC saC ien @@ -80585,7 +80703,7 @@ saC saC saC saC -cpy +saC saC ien ien @@ -85353,7 +85471,7 @@ saC saC saC saC -cpy +saC saC saC saC @@ -85579,9 +85697,9 @@ saC saC saC saC -cpy -cpy -cpy +saC +saC +saC saC saC saC @@ -85806,11 +85924,11 @@ saC saC saC saC -cpy -cpy -cpy -cpy -cpy +saC +saC +saC +saC +saC saC saC bUN @@ -86034,11 +86152,11 @@ saC saC saC saC -cpy -cpy -cpy -cpy -cpy +saC +saC +saC +saC +saC ien cGd rtI @@ -86262,10 +86380,10 @@ saC saC saC saC -cpy -cpy -cpy -cpy +saC +saC +saC +saC ien rhh rtX @@ -86489,9 +86607,9 @@ saC saC saC saC -cpy -cpy -cpy +saC +saC +saC ien ien ien @@ -86717,9 +86835,9 @@ saC saC saC saC -cpy -cpy -cpy +saC +saC +saC ien qSH qSH @@ -86945,8 +87063,8 @@ saC saC saC saC -cpy -cpy +saC +saC ien qSH qSH @@ -94500,7 +94618,7 @@ tTD tTD tSm rnB -cKF +oXZ uKR rnB rnB diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index a6a5befca4ee..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 @@ -993,6 +1007,9 @@ /obj/structure/closet, /obj/item/clothing/suit/armor/riot/marine/vintage_riot, /obj/item/clothing/head/helmet/riot/vintage_riot, +/obj/structure/machinery/light/small{ + dir = 1 + }, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -2445,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) @@ -3305,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" @@ -4859,16 +4889,6 @@ icon_state = "orange" }, /area/almayer/engineering/engineering_workshop/hangar) -"apQ" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door/window/southleft{ - desc = "A window, that is also a door. A windoor if you will. This one is stronger."; - health = 500; - name = "Reinforced Glass door"; - req_one_access_txt = "2;35" - }, -/turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) "apR" = ( /obj/structure/surface/rack, /obj/item/storage/box/beakers{ @@ -5256,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{ @@ -5792,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) @@ -5810,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) @@ -5967,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 @@ -6373,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) @@ -6401,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) @@ -6507,6 +6533,9 @@ pixel_x = 8; pixel_y = -32 }, +/obj/structure/machinery/light/small{ + dir = 4 + }, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -7047,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) @@ -7277,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{ @@ -7800,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" }, @@ -9092,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, @@ -10908,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 @@ -13343,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" @@ -14168,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) @@ -19281,6 +19411,39 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_hallway) +"bBi" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/liaison_suit/formal, +/obj/item/clothing/under/liaison_suit, +/obj/item/clothing/under/liaison_suit/outing, +/obj/item/clothing/under/liaison_suit/suspenders, +/obj/item/clothing/under/blackskirt{ + desc = "A stylish skirt, in a business-black and red colour scheme."; + name = "liaison's skirt" + }, +/obj/item/clothing/under/suit_jacket/charcoal{ + desc = "A professional black suit and blue tie. A combination popular among government agents and corporate Yes-Men alike."; + name = "liaison's black suit" + }, +/obj/item/clothing/under/suit_jacket/navy{ + desc = "A navy suit and red tie, intended for the Almayer's finest. And accountants."; + name = "liaison's navy suit" + }, +/obj/item/clothing/under/suit_jacket/trainee, +/obj/item/clothing/under/liaison_suit/charcoal, +/obj/item/clothing/under/liaison_suit/outing/red, +/obj/item/clothing/under/liaison_suit/blazer, +/obj/item/clothing/suit/storage/snow_suit/liaison, +/obj/item/clothing/gloves/black, +/obj/item/clothing/gloves/marine/dress, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/clothing/accessory/blue, +/obj/item/clothing/accessory/red, +/obj/structure/machinery/status_display{ + pixel_x = -32 + }, +/turf/open/floor/wood/ship, +/area/almayer/command/corporateliason) "bBl" = ( /obj/structure/machinery/light{ dir = 4 @@ -19906,22 +20069,6 @@ icon_state = "orange" }, /area/almayer/engineering/lower_engineering) -"bEk" = ( -/obj/structure/machinery/door/airlock/almayer/marine/requisitions{ - dir = 1; - name = "\improper Requisitions Storage" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/obj/structure/disposalpipe/up/almayer{ - dir = 4; - id = "almayerlink_OT1_req" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/squads/req) "bEl" = ( /obj/structure/machinery/computer/supply_drop_console/limited, /turf/closed/wall/almayer, @@ -20916,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{ @@ -21697,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{ @@ -23074,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{ @@ -23769,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, @@ -25529,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{ @@ -27174,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{ @@ -27565,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) @@ -27910,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{ @@ -28199,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; @@ -28206,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 @@ -28322,6 +28589,9 @@ "cBd" = ( /obj/structure/surface/rack, /obj/item/reagent_container/food/snacks/wrapped/chunk, +/obj/structure/machinery/light/small{ + dir = 4 + }, /turf/open/floor/almayer{ icon_state = "cargo" }, @@ -28360,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{ @@ -28810,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 @@ -29446,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{ @@ -30585,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; @@ -30800,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 @@ -30938,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 @@ -31076,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{ @@ -31083,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{ @@ -31259,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 @@ -31721,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{ @@ -32653,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, @@ -32782,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{ @@ -33467,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; @@ -33609,6 +34016,9 @@ dir = 8 }, /obj/effect/decal/cleanable/blood, +/obj/structure/machinery/light/small{ + dir = 4 + }, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -34023,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, @@ -34270,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, @@ -34364,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 @@ -34566,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 @@ -34781,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" @@ -35324,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{ @@ -35615,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, @@ -35704,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" @@ -35840,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, @@ -36208,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 @@ -36413,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 @@ -36579,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) @@ -36628,14 +37232,6 @@ icon_state = "redfull" }, /area/almayer/hull/lower_hull/l_f_s) -"gkg" = ( -/obj/structure/disposalpipe/sortjunction{ - dir = 4; - negdir = 4; - posdir = 1 - }, -/turf/closed/wall/almayer, -/area/almayer/squads/req) "gks" = ( /obj/structure/largecrate/random/secure, /turf/open/floor/plating, @@ -37040,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; @@ -37226,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 @@ -37311,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 @@ -37834,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 @@ -37868,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 @@ -37877,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{ @@ -38003,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{ @@ -38050,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" @@ -38059,6 +38792,13 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) +"gVA" = ( +/obj/structure/disposalpipe/down/almayer{ + dir = 8; + id = "almayerlink_OT1_req" + }, +/turf/open/floor/almayer, +/area/almayer/lifeboat_pumps/south1) "gVF" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -38088,6 +38828,12 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) +"gXh" = ( +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_m_s) "gXl" = ( /obj/structure/closet/secure_closet/personal/cabinet{ req_access_txt = "5" @@ -38109,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 @@ -38352,6 +39112,12 @@ icon_state = "plate" }, /area/almayer/living/cryo_cells) +"hcC" = ( +/obj/structure/disposalpipe/up/almayer{ + id = "almayerlink_OT_req" + }, +/turf/closed/wall/almayer, +/area/almayer/engineering/engineering_workshop/hangar) "hcI" = ( /obj/structure/machinery/cryopod{ pixel_y = 6 @@ -38416,12 +39182,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"hdV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer, -/area/almayer/lifeboat_pumps/south1) "hee" = ( /turf/open/floor/almayer{ dir = 4; @@ -39083,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) @@ -39230,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) @@ -40016,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) @@ -40077,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; @@ -40320,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{ @@ -40540,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; @@ -40595,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 @@ -41063,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" = ( @@ -41110,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 @@ -41339,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; @@ -41745,13 +42625,6 @@ icon_state = "silver" }, /area/almayer/command/cichallway) -"iJH" = ( -/obj/structure/disposalpipe/down/almayer{ - dir = 4; - id = "almayerlink_OT_req" - }, -/turf/open/floor/almayer, -/area/almayer/lifeboat_pumps/south1) "iJS" = ( /obj/structure/machinery/cm_vending/gear/tl{ density = 0; @@ -42064,13 +42937,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) -"iRh" = ( -/obj/structure/disposalpipe/down/almayer{ - dir = 8; - id = "almayerlink_OT1_req" - }, -/turf/open/floor/almayer, -/area/almayer/lifeboat_pumps/south1) "iRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -42409,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, @@ -42474,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{ @@ -43251,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, @@ -43286,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"; @@ -43375,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{ @@ -43578,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{ @@ -44067,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{ @@ -44196,6 +45159,16 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) +"jUn" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door/window/southleft{ + desc = "A window, that is also a door. A windoor if you will. This one is stronger."; + health = 500; + name = "Reinforced Glass door"; + req_one_access_txt = "2;35" + }, +/turf/open/floor/almayer, +/area/almayer/engineering/engineering_workshop/hangar) "jUs" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -44345,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; @@ -44543,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" = ( @@ -44676,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"; @@ -44749,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 @@ -45019,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"; @@ -45548,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 @@ -45580,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; @@ -45928,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 @@ -46273,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; @@ -46481,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; @@ -46681,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 @@ -46791,6 +47877,12 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/shipboard/navigation) +"ley" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/lifeboat_pumps/south1) "leY" = ( /obj/structure/bed/sofa/south/white/left, /turf/open/floor/almayer{ @@ -46920,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" = ( @@ -47064,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{ @@ -47123,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{ @@ -47972,6 +49092,10 @@ }, /turf/open/floor/almayer, /area/almayer/squads/alpha_bravo_shared) +"lEW" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/almayer, +/area/almayer/engineering/engineering_workshop/hangar) "lFb" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -48897,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 @@ -49182,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) @@ -49889,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 @@ -49964,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, @@ -50200,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 @@ -50333,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, @@ -50449,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) @@ -50576,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{ @@ -50712,6 +51935,14 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"mYv" = ( +/obj/structure/disposalpipe/sortjunction{ + dir = 4; + negdir = 4; + posdir = 1 + }, +/turf/closed/wall/almayer, +/area/almayer/squads/req) "mYw" = ( /obj/structure/sign/safety/escapepod{ pixel_x = -17; @@ -51996,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{ @@ -52007,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" }, @@ -52339,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; @@ -52423,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; @@ -52838,6 +54092,22 @@ "nXP" = ( /turf/closed/wall/almayer/outer, /area/almayer/hull/lower_hull/l_f_s) +"nXU" = ( +/obj/structure/machinery/door/airlock/almayer/marine/requisitions{ + dir = 1; + name = "\improper Requisitions Storage" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/obj/structure/disposalpipe/up/almayer{ + dir = 4; + id = "almayerlink_OT1_req" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/squads/req) "nYc" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -53010,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{ @@ -53708,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{ @@ -53802,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, @@ -54372,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" = ( @@ -54428,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; @@ -54721,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 @@ -55215,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 @@ -55228,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" = ( @@ -55429,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 @@ -56400,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{ @@ -57026,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" = ( @@ -57475,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 @@ -58014,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{ @@ -58639,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, @@ -58838,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; @@ -59112,6 +60558,13 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"qYC" = ( +/obj/structure/disposalpipe/down/almayer{ + dir = 4; + id = "almayerlink_OT_req" + }, +/turf/open/floor/almayer, +/area/almayer/lifeboat_pumps/south1) "qYG" = ( /turf/open/floor/almayer{ icon_state = "mono" @@ -59244,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" @@ -59427,10 +60892,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_s) -"rfi" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop/hangar) "rfI" = ( /obj/structure/sign/safety/airlock{ pixel_y = -32 @@ -59755,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{ @@ -59797,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; @@ -60330,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{ @@ -60340,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" = ( @@ -60844,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) @@ -61406,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 @@ -61480,16 +62984,30 @@ }, /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{ dir = 4; @@ -61920,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" }, @@ -62521,36 +64043,6 @@ icon_state = "silvercorner" }, /area/almayer/hallways/aft_hallway) -"sDL" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/under/liaison_suit/formal, -/obj/item/clothing/under/liaison_suit, -/obj/item/clothing/under/liaison_suit/outing, -/obj/item/clothing/under/liaison_suit/suspenders, -/obj/item/clothing/under/blackskirt{ - desc = "A stylish skirt, in a business-black and red colour scheme."; - name = "liaison's skirt" - }, -/obj/item/clothing/under/suit_jacket/charcoal{ - desc = "A professional black suit and blue tie. A combination popular among government agents and corporate Yes-Men alike."; - name = "liaison's black suit" - }, -/obj/item/clothing/under/suit_jacket/navy{ - desc = "A navy suit and red tie, intended for the Almayer's finest. And accountants."; - name = "liaison's navy suit" - }, -/obj/item/clothing/under/suit_jacket/trainee, -/obj/item/clothing/gloves/black, -/obj/item/clothing/gloves/marine/dress, -/obj/item/clothing/glasses/sunglasses/big, -/obj/item/clothing/accessory/blue, -/obj/item/clothing/accessory/red, -/obj/item/clothing/shoes/dress, -/obj/structure/machinery/status_display{ - pixel_x = -32 - }, -/turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) "sDM" = ( /turf/open/floor/almayer{ dir = 9; @@ -62633,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{ @@ -62723,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{ @@ -62782,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" = ( @@ -62884,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; @@ -63196,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{ @@ -63419,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, @@ -63428,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" = ( @@ -64027,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{ @@ -64345,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; @@ -64805,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) @@ -64956,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; @@ -65804,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, @@ -65814,12 +67377,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) -"uda" = ( -/obj/structure/disposalpipe/up/almayer{ - id = "almayerlink_OT_req" - }, -/turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop/hangar) "udi" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -67898,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; @@ -68326,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, @@ -68432,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) @@ -68551,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{ @@ -68840,6 +70421,14 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) +"vqO" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_a_p) "vqW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -69306,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) @@ -69494,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{ @@ -70286,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 @@ -70916,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 @@ -71058,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 @@ -71135,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; @@ -71538,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{ @@ -71627,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" = ( @@ -71969,6 +73652,9 @@ desc = "A small coin, bearing the falling falcons insignia."; name = "falling falcons challenge coin" }, +/obj/structure/machinery/light/small{ + dir = 8 + }, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -72458,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" = ( @@ -72844,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{ @@ -73648,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{ @@ -74045,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; @@ -74591,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) @@ -74870,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{ @@ -75091,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{ @@ -75214,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 @@ -75381,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{ @@ -101491,8 +103250,8 @@ gfW bUe cbR ccr -uda -rfi +hcC +lEW aqd bWM bWM @@ -101695,7 +103454,7 @@ iRx iEb bHa apm -apQ +jUn avT bWM bWM @@ -105059,7 +106818,7 @@ yfv bit baw baw -iJH +qYC kwo trb aag @@ -105262,7 +107021,7 @@ abg ajC baw vbB -hdV +ley kwo trb aag @@ -105465,7 +107224,7 @@ avn aim baw dBp -iRh +gVA tQV tQV aah @@ -109116,7 +110875,7 @@ awE vGk xCX vGk -csz +hoX qVM csz qVM @@ -109314,7 +111073,7 @@ fAo awE bhM wQv -sDL +bBi awE ieH qVM @@ -109928,7 +111687,7 @@ awE csz iid csz -csz +hoX qVM noV csz @@ -113149,10 +114908,10 @@ anf apK arf auG -awu azb azb -auG +azb +nMq aDp apK cbr @@ -113346,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 @@ -113549,16 +115308,16 @@ ajJ aEX ajt ali -aqU -hvw +mOi +rCw rCw lin oJR -aqU +tFe asD xQV avK -cck +aqU aCZ dgg xRk @@ -113752,16 +115511,16 @@ ael isW ajt abg -aqU +mOi wCT sIf isC isC tFe -lmz +xQV xQV rNF -cck +aqU qjF oqv iqd @@ -113955,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 @@ -114158,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 @@ -114363,14 +116122,14 @@ aii abg aqU sdl -isC -xbN -aqU -mOi -gjw +mLE +bUx +mLE +tmK +avK aug avL -cck +aqU lyE rsO aGN @@ -114567,13 +116326,13 @@ abg aqU xbN gfE -xbN +gfE +kpc aqU -mOi gjw cnp avM -cck +aqU wmK liJ pTj @@ -115354,7 +117113,7 @@ aag lYA aao aap -aap +gXh aao aap aap @@ -116300,7 +118059,7 @@ bNQ bNQ bNQ bNQ -bEk +nXU bKA jac bCA @@ -116503,7 +118262,7 @@ bNP bmD bNP bmD -gkg +mYv doP jac isS @@ -122920,7 +124679,7 @@ vuv vuv cxo cxo -cxo +vqO sXK tbD qMu @@ -127824,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 @@ -128027,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 @@ -128230,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 @@ -128433,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 @@ -128636,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 @@ -128839,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 @@ -129040,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 @@ -129243,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 @@ -129446,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 @@ -129649,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 @@ -129852,21 +131611,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 @@ -130055,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 @@ -130258,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 @@ -130461,21 +132220,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 @@ -130652,10 +132411,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +aab +aab +aab +aab aab aaa aaa @@ -130663,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 @@ -130853,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 @@ -131049,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 @@ -131252,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 @@ -131455,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 @@ -131658,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 @@ -131861,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 @@ -132064,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 @@ -132267,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 @@ -132470,53 +134229,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 +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 @@ -132673,53 +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 +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 @@ -132876,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 @@ -132888,69 +134693,23 @@ 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 +wVb +bhD +bdo +bdo +bdo +bdo +bdo +bdo +bdo +ovn +ovn +ovn +ovn +ovn +ovn +bCR +vTK aaa aaa aaa @@ -133079,60 +134838,60 @@ 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 +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 @@ -133282,60 +135041,60 @@ 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 +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 @@ -133485,60 +135244,60 @@ 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 +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 @@ -133599,335 +135358,14 @@ aaa aaa aaa aaa -aab -aaa -aaa -"} -(287,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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -wVb -bdo -jbB -bdo -bne -bdo -jbB -bdo -bne -ovn -gXv -ovn -grX -ovn -gXv -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 -"} -(288,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 +aab aaa aaa +"} +(287,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -133949,24 +135387,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 @@ -134005,14 +135425,9 @@ aaa aaa aaa aaa -aab -aaa aaa -"} -(289,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -134032,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 @@ -134076,10 +135561,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(288,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134107,13 +135596,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -134164,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 @@ -134212,7 +135768,7 @@ aab aaa aaa "} -(290,1,1) = {" +(289,1,1) = {" aaa aaa aab @@ -134297,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 @@ -134310,13 +135919,8 @@ aaa aaa aaa aaa -aab -aaa -aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -134363,10 +135967,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(290,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134411,14 +136019,10 @@ aaa aaa aaa aaa -aab aaa aaa -"} -(291,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -134452,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 @@ -134516,7 +136173,8 @@ aaa aab aaa aaa -aKQ +"} +(291,1,1) = {" aaa aaa aab @@ -134601,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 @@ -134719,7 +136376,8 @@ aaa aab aaa aaa -aKQ +"} +(292,1,1) = {" aaa aaa aab @@ -134804,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 @@ -134895,10 +136576,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(293,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -134919,13 +136604,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -134983,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 @@ -135020,14 +136742,10 @@ aaa aaa aaa aaa -aab aaa aaa -"} -(294,1,1) = {" aaa aaa -aab aaa aaa aaa @@ -135061,10 +136779,14 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(294,1,1) = {" aaa aaa +aab aaa aaa aaa @@ -135122,13 +136844,10 @@ aaa aaa aaa aaa -aab aaa aaa -aKQ aaa aaa -aab aaa aaa aaa @@ -135149,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 @@ -135312,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 @@ -135518,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 @@ -135720,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 @@ -135923,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 @@ -136126,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 @@ -136358,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. + +