diff --git a/baystation12.dme b/baystation12.dme
index 9b1d2c6c541..7944c72bd7e 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -197,6 +197,13 @@
#include "code\datums\diseases\advance\symptoms\voice_change.dm"
#include "code\datums\diseases\advance\symptoms\vomit.dm"
#include "code\datums\diseases\advance\symptoms\weight.dm"
+#include "code\datums\expansions\expansion.dm"
+#include "code\datums\expansions\multitool\_multitool.dm"
+#include "code\datums\expansions\multitool\cloning.dm"
+#include "code\datums\expansions\multitool\multitool.dm"
+#include "code\datums\expansions\multitool\store.dm"
+#include "code\datums\expansions\multitool\circuitboards\circuitboards.dm"
+#include "code\datums\expansions\multitool\circuitboards\stationalert.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
@@ -689,6 +696,7 @@
#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\holodeckcontrol.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\research.dm"
+#include "code\game\objects\items\weapons\circuitboards\computer\station_alert.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm"
diff --git a/code/_helpers/areas.dm b/code/_helpers/areas.dm
index b5987c0ce16..ccf7ea2f2a3 100644
--- a/code/_helpers/areas.dm
+++ b/code/_helpers/areas.dm
@@ -11,7 +11,7 @@
for(var/areapath in typesof(areatype))
var/area/A = locate(areapath)
for(var/turf/T in A.contents)
- if(!predicates || all_predicates_true(T, predicates))
+ if(!predicates || all_predicates_true(list(T), predicates))
turfs += T
return turfs
diff --git a/code/_helpers/functional.dm b/code/_helpers/functional.dm
index c5ecfb631a6..231b8a4d261 100644
--- a/code/_helpers/functional.dm
+++ b/code/_helpers/functional.dm
@@ -1,14 +1,24 @@
-/proc/all_predicates_true(var/input, var/list/predicates)
+/proc/all_predicates_true(var/list/input, var/list/predicates)
+ functional_sanity(input, predicates)
+
for(var/i = 1 to predicates.len)
- if(!call(predicates[i])(input))
+ if(!call(predicates[i])(arglist(input)))
return FALSE
return TRUE
-/proc/any_predicate_true(var/input, var/list/predicates)
+/proc/any_predicate_true(var/list/input, var/list/predicates)
+ functional_sanity(input, predicates)
+
if(!predicates.len)
return TRUE
for(var/i = 1 to predicates.len)
- if(call(predicates[i])(input))
+ if(call(predicates[i])(arglist(input)))
return TRUE
return FALSE
+
+/proc/functional_sanity(var/list/input, var/list/predicates)
+ if(!istype(input))
+ CRASH("Expected list input. Was [input ? "[input.type]" : "null"]")
+ if(!istype(predicates))
+ CRASH("Expected predicate list. Was [predicates ? "[predicates.type]" : "null"]")
diff --git a/code/_macros.dm b/code/_macros.dm
index 048331f5224..aac6910e9f2 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -25,6 +25,8 @@
#define isnewplayer(A) istype(A, /mob/new_player)
+#define isobj(A) istype(A, /obj)
+
#define isobserver(A) istype(A, /mob/dead/observer)
#define isorgan(A) istype(A, /obj/item/organ/external)
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index c5c48dbbf2c..fb15c7281f5 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -54,6 +54,13 @@
if(control_disabled || !canClick())
return
+ if(multitool_mode && isobj(A))
+ var/obj/O = A
+ var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool]
+ if(MT)
+ MT.interact(aiMulti, src)
+ return
+
if(aiCamera.in_camera_mode)
aiCamera.camera_mode_off()
aiCamera.captureimage(A, usr)
diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm
new file mode 100644
index 00000000000..8e92e53bdc7
--- /dev/null
+++ b/code/datums/expansions/expansion.dm
@@ -0,0 +1,37 @@
+/datum/expansion
+ var/datum/holder = null // The holder
+
+/datum/expansion/New(var/atom/holder)
+ if(!istype(holder))
+ CRASH("Invalid holder.")
+ src.holder = holder
+ ..()
+
+/datum/expansion/Destroy()
+ holder = null
+ return ..()
+
+/datum/expansion/CanUseTopic(var/mob/user)
+ return holder && user ? STATUS_INTERACTIVE : STATUS_CLOSE
+
+/datum/expansion/Topic()
+ if(..())
+ return 1
+ if(CanUseTopic(usr) != STATUS_INTERACTIVE)
+ return 1
+ return 0
+
+/obj
+ var/list/datum/expansion/expansions = list()
+
+/obj/Destroy()
+ if(expansions)
+ for(var/expansion in expansions)
+ qdel(expansions[expansion])
+ expansions.Cut()
+ return ..()
+
+/obj/proc/set_expansion(var/type, var/instance)
+ if(expansions[type])
+ qdel(expansions[type])
+ expansions[type] = instance
diff --git a/code/datums/expansions/multitool/_multitool.dm b/code/datums/expansions/multitool/_multitool.dm
new file mode 100644
index 00000000000..6ec2a8657e7
--- /dev/null
+++ b/code/datums/expansions/multitool/_multitool.dm
@@ -0,0 +1,3 @@
+#define MT_NOACTION 0
+#define MT_REFRESH 1
+#define MT_CLOSE 2
diff --git a/code/datums/expansions/multitool/circuitboards/circuitboards.dm b/code/datums/expansions/multitool/circuitboards/circuitboards.dm
new file mode 100644
index 00000000000..318267a6a11
--- /dev/null
+++ b/code/datums/expansions/multitool/circuitboards/circuitboards.dm
@@ -0,0 +1,5 @@
+/datum/expansion/multitool/circuitboards/CanUseTopic(var/mob/user)
+ if(isAI(user)) // No remote AI access
+ return STATUS_CLOSE
+
+ return ..()
diff --git a/code/datums/expansions/multitool/circuitboards/stationalert.dm b/code/datums/expansions/multitool/circuitboards/stationalert.dm
new file mode 100644
index 00000000000..f46fd6ac5b6
--- /dev/null
+++ b/code/datums/expansions/multitool/circuitboards/stationalert.dm
@@ -0,0 +1,29 @@
+/datum/expansion/multitool/circuitboards/stationalert/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
+ var/obj/item/weapon/circuitboard/stationalert/SA = holder
+ . += "Alarm Sources
"
+ . += "
"
+ for(var/datum/alarm_handler/AH in alarm_manager.all_handlers)
+ . += ""
+ . += "| [AH.category] | "
+ if(AH in SA.alarm_handlers)
+ . += "◼Active | Inactivate | "
+ else
+ . += "◼Inactive | Activate | "
+ . += "
"
+ . += "
"
+
+/datum/expansion/multitool/circuitboards/stationalert/on_topic(href, href_list, usr)
+ var/obj/item/weapon/circuitboard/stationalert/SA = holder
+ if(href_list["add"])
+ var/datum/alarm_handler/AH = locate(href_list["add"]) in alarm_manager.all_handlers
+ if(AH)
+ SA.alarm_handlers |= AH
+ return MT_REFRESH
+
+ if(href_list["remove"])
+ var/datum/alarm_handler/AH = locate(href_list["remove"]) in alarm_manager.all_handlers
+ if(AH)
+ SA.alarm_handlers -= AH
+ return MT_REFRESH
+
+ return ..()
diff --git a/code/datums/expansions/multitool/cloning.dm b/code/datums/expansions/multitool/cloning.dm
new file mode 100644
index 00000000000..aeea22ef1e1
--- /dev/null
+++ b/code/datums/expansions/multitool/cloning.dm
@@ -0,0 +1,28 @@
+/datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
+ . += buffer(M)
+ . += "
Connected Cloning Pods:
"
+ var/obj/machinery/computer/cloning/C = holder
+ for(var/atom/cloning_pod in C.pods)
+ . += "[cloning_pod.name]
"
+
+/datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
+ var/obj/machinery/clonepod/P = buffer
+ var/obj/machinery/computer/cloning/C = holder
+
+ if(!istype(P))
+ user << "No valid connection data in \the [M] buffer."
+ return MT_NOACTION
+
+ var/is_connected = (P in C.pods)
+ if(!is_connected)
+ if(C.connect_pod(P))
+ user << "You connect \the [P] to \the [C]."
+ else
+ user << "You failed to connect \the [P] to \the [C]."
+ return MT_REFRESH
+
+ if(C.release_pod(P))
+ user << "You disconnect \the [P] from \the [C]."
+ else
+ user << "You failed to disconnect \the [P] from \the [C]."
+ return MT_REFRESH
diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm
new file mode 100644
index 00000000000..8a2b8226171
--- /dev/null
+++ b/code/datums/expansions/multitool/multitool.dm
@@ -0,0 +1,89 @@
+/datum/expansion/multitool
+ var/window_x = 370
+ var/window_y = 470
+ var/list/interact_predicates
+
+/datum/expansion/multitool/New(var/atom/holder, var/list/can_interact_predicates)
+ ..()
+ interact_predicates = can_interact_predicates ? can_interact_predicates : list()
+
+/datum/expansion/multitool/Destroy()
+ interact_predicates.Cut()
+ return ..()
+
+/datum/expansion/multitool/proc/interact(var/obj/item/device/multitool/M, var/mob/user)
+ if(CanUseTopic(user) != STATUS_INTERACTIVE)
+ return
+
+ var/html = get_interact_window(M, user)
+ if(html)
+ var/datum/browser/popup = new(usr, "multitool", "Multitool Menu", window_x, window_y)
+ popup.set_content(html)
+ popup.set_title_image(user.browse_rsc_icon(M.icon, M.icon_state))
+ popup.open()
+ else
+ close_window(usr)
+
+/datum/expansion/multitool/proc/get_interact_window(var/obj/item/device/multitool/M, var/mob/user)
+ return
+
+/datum/expansion/multitool/proc/close_window(var/mob/user)
+ user << browse(null, "window=multitool")
+
+/datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool)
+ . += "Buffer Memory:
"
+ var/buffer_name = multitool.get_buffer_name()
+ if(buffer_name)
+ . += "[buffer_name] Send Purge
"
+ else
+ . += "No connection stored in the buffer."
+
+/datum/expansion/multitool/CanUseTopic(var/mob/user)
+ . = ..()
+ if(. == STATUS_CLOSE)
+ return
+
+ if(!user.get_multitool())
+ return STATUS_CLOSE
+
+ if(!all_predicates_true(list(holder, user), interact_predicates))
+ return STATUS_CLOSE
+
+ var/datum/host = holder.nano_host()
+ return user.default_can_use_topic(host)
+
+/datum/expansion/multitool/Topic(href, href_list)
+ if(..())
+ close_window(usr)
+ return 1
+
+ var/mob/user = usr
+ var/obj/item/device/multitool/M = user.get_multitool()
+ if(href_list["send"])
+ var/atom/buffer = locate(href_list["send"])
+ . = send_buffer(M, buffer, user)
+ else if(href_list["purge"])
+ M.set_buffer(null)
+ . = MT_REFRESH
+ else
+ . = on_topic(href, href_list, user)
+
+ switch(.)
+ if(MT_REFRESH)
+ interact(M, user)
+ if(MT_CLOSE)
+ close_window(user)
+ return 1
+
+/datum/expansion/multitool/proc/on_topic(href, href_list, usr)
+ return MT_NOACTION
+
+/datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
+ if(M.get_buffer() == buffer && buffer)
+ receive_buffer(M, buffer, user)
+ else if(!buffer)
+ user << "Unable to acquire data from the buffered object. Purging from memory."
+ return MT_REFRESH
+
+/datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user)
+ return
diff --git a/code/datums/expansions/multitool/store.dm b/code/datums/expansions/multitool/store.dm
new file mode 100644
index 00000000000..e07a39ad919
--- /dev/null
+++ b/code/datums/expansions/multitool/store.dm
@@ -0,0 +1,10 @@
+/datum/expansion/multitool/store/interact(var/obj/item/device/multitool/M, var/mob/user)
+ if(CanUseTopic(user) != STATUS_INTERACTIVE)
+ return
+
+ if(M.get_buffer() == holder)
+ M.set_buffer(null)
+ user << "You purge the connection data of \the [holder] from \the [M]."
+ else
+ M.set_buffer(holder)
+ user << "You load connection data from \the [holder] to \the [M]."
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 953967764e1..10e296a11c5 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -222,7 +222,7 @@ its easier to just keep the beam vertical.
return
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
- return -1
+ return NO_EMAG_ACT
/atom/proc/fire_act()
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index c6ed69a460e..29deac78e16 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -57,6 +57,12 @@
RefreshParts()
update_icon()
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/store(src))
+
+/obj/machinery/clonepod/Destroy()
+ if(connected)
+ connected.release_pod(src)
+ return ..()
/obj/machinery/clonepod/attack_ai(mob/user as mob)
@@ -240,17 +246,12 @@
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
else
user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.")
- else if(istype(W, /obj/item/device/multitool))
- var/obj/item/device/multitool/M = W
- M.connecting = src
- user << "You load connection data from [src] to [M]."
- return
else
..()
/obj/machinery/clonepod/emag_act(var/remaining_charges, var/mob/user)
if(isnull(occupant))
- return
+ return NO_EMAG_ACT
user << "You force an emergency ejection."
locked = 0
go_out()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 857832d2f59..69400c1ffdb 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -18,11 +18,12 @@
/obj/machinery/computer/cloning/initialize()
..()
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/cryo(src, list(/proc/is_operable)))
updatemodules()
/obj/machinery/computer/cloning/Destroy()
releasecloner()
- ..()
+ return ..()
/obj/machinery/computer/cloning/proc/updatemodules()
src.scanner = findscanner()
@@ -52,6 +53,33 @@
P.name = initial(P.name)
pods.Cut()
+/obj/machinery/computer/cloning/proc/connect_pod(var/obj/machinery/clonepod/P)
+ if(P in pods)
+ return 0
+
+ if(P.connected)
+ P.connected.release_pod(P)
+ P.connected = src
+ pods += P
+ rename_pods()
+
+ return 1
+
+/obj/machinery/computer/cloning/proc/release_pod(var/obj/machinery/clonepod/P)
+ if(!(P in pods))
+ return
+
+ P.connected = null
+ P.name = initial(P.name)
+ pods -= P
+ rename_pods()
+ return 1
+
+/obj/machinery/computer/cloning/proc/rename_pods()
+ for(var/i = 1 to pods.len)
+ var/atom/P = pods[i]
+ P.name = "[initial(P.name)] #[i]"
+
/obj/machinery/computer/cloning/proc/findcloner()
var/num = 1
var/area/A = get_area(src)
@@ -70,14 +98,6 @@
user << "You insert [W]."
src.updateUsrDialog()
return
- else if(istype(W, /obj/item/device/multitool))
- var/obj/item/device/multitool/M = W
- var/obj/machinery/clonepod/P = M.connecting
- if(P && !(P in pods))
- pods += P
- P.connected = src
- P.name = "[initial(P.name)] #[pods.len]"
- user << "You connect [P] to [src]."
else
..()
return
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index d1c66b500d0..691214198fb 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -1,31 +1,46 @@
/obj/machinery/computer/station_alert
- name = "Station Alert Console"
+ name = "station alert console"
desc = "Used to access the station's automated alert system."
icon_keyboard = "tech_key"
icon_screen = "alert:0"
light_color = "#e6ffff"
- circuit = /obj/item/weapon/circuitboard/stationalert_engineering
+ circuit = /obj/item/weapon/circuitboard/stationalert
var/datum/nano_module/alarm_monitor/alarm_monitor
- var/monitor_type = /datum/nano_module/alarm_monitor/engineering
+ var/monitor_type = /datum/nano_module/alarm_monitor
+
+/obj/machinery/computer/station_alert/engineering
+ monitor_type = /datum/nano_module/alarm_monitor/engineering
/obj/machinery/computer/station_alert/security
monitor_type = /datum/nano_module/alarm_monitor/security
- circuit = /obj/item/weapon/circuitboard/stationalert_security
/obj/machinery/computer/station_alert/all
monitor_type = /datum/nano_module/alarm_monitor/all
- circuit = /obj/item/weapon/circuitboard/stationalert_all
/obj/machinery/computer/station_alert/initialize()
alarm_monitor = new monitor_type(src)
alarm_monitor.register_alarm(src, /obj/machinery/computer/station_alert/update_icon)
..()
+ if(monitor_type)
+ register(new monitor_type(src))
/obj/machinery/computer/station_alert/Destroy()
- alarm_monitor.unregister_alarm(src)
- qdel(alarm_monitor)
- ..()
+ . = ..()
+ unregister()
+
+/obj/machinery/computer/station_alert/proc/register_monitor(var/datum/nano_module/alarm_monitor/monitor)
+ if(monitor.host != src)
+ return
+
+ alarm_monitor = monitor
+ alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon)
+
+/obj/machinery/computer/station_alert/proc/unregister_monitor()
+ if(alarm_monitor)
+ alarm_monitor.unregister(src)
+ qdel(alarm_monitor)
+ alarm_monitor = null
/obj/machinery/computer/station_alert/attack_ai(mob/user)
add_fingerprint(user)
@@ -42,13 +57,14 @@
return
/obj/machinery/computer/station_alert/interact(mob/user)
- alarm_monitor.ui_interact(user)
+ if(alarm_monitor)
+ alarm_monitor.ui_interact(user)
/obj/machinery/computer/station_alert/update_icon()
+ icon_screen = initial(icon_screen)
if(!(stat & (BROKEN|NOPOWER)))
- var/list/alarms = alarm_monitor ? alarm_monitor.major_alarms() : list()
- if(alarms.len)
- icon_screen = "alert:2"
- else
- icon_screen = initial(icon_screen)
+ if(alarm_monitor)
+ var/list/alarms = alarm_monitor.major_alarms()
+ if(alarms.len)
+ icon_screen = "alert:2"
..()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index a13c57a0dd7..a56e6092950 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -186,6 +186,9 @@ Class Procs:
use_power(active_power_usage,power_channel, 1)
return 1
+/proc/is_operable(var/obj/machinery/M, var/mob/user)
+ return istype(M) && M.operable()
+
/obj/machinery/proc/operable(var/additional_flags = 0)
return !inoperable(additional_flags)
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 2859083c9d6..8b3da2a7566 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -164,8 +164,9 @@
dat += "
"
if(P)
- if(P.buffer)
- dat += "
MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]"
+ var/obj/machinery/telecomms/device = P.get_buffer()
+ if(istype(device))
+ dat += "
MULTITOOL BUFFER: [device] ([device.id]) \[Link\] \[Flush\]"
else
dat += "
MULTITOOL BUFFER: \[Add Machine\]"
@@ -365,28 +366,30 @@
if(href_list["link"])
if(P)
- if(P.buffer && P.buffer != src)
- if(!(src in P.buffer.links))
- P.buffer.links.Add(src)
+ var/obj/machinery/telecomms/device = P.get_buffer()
+ if(istype(device) && device != src)
+ if(!(src in device.links))
+ device.links.Add(src)
- if(!(P.buffer in src.links))
- src.links.Add(P.buffer)
+ if(!(device in src.links))
+ src.links.Add(device)
- temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-"
+ temp = "-% Successfully linked with \ref[device] [device.name] %-"
else
temp = "-% Unable to acquire buffer %-"
if(href_list["buffer"])
- P.buffer = src
- temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-"
+ P.set_buffer(src)
+ var/atom/buffer = P.get_buffer()
+ temp = "-% Successfully stored \ref[buffer] [buffer.name] in buffer %-"
if(href_list["flush"])
temp = "-% Buffer successfully flushed. %-"
- P.buffer = null
+ P.set_buffer(null)
src.Options_Topic(href, href_list)
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index e7cb6f34753..a804041694a 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -19,5 +19,48 @@
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
- var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
- var/obj/machinery/clonepod/connecting //same for cryopod linkage
+
+ var/buffer_name
+ var/atom/buffer_object
+
+/obj/item/device/multitool/proc/get_buffer(var/typepath)
+ // Only allow clearing the buffer name when someone fetches the buffer.
+ // Means you cannot be sure the source hasn't been destroyed until the very moment it's needed.
+ get_buffer_name(TRUE)
+ if(buffer_object && (!typepath || istype(buffer_object, typepath)))
+ return buffer_object
+
+/obj/item/device/multitool/proc/get_buffer_name(var/null_name_if_missing = FALSE)
+ if(buffer_object)
+ buffer_name = buffer_object.name
+ else if(null_name_if_missing)
+ buffer_name = null
+ return buffer_name
+
+/obj/item/device/multitool/proc/set_buffer(var/atom/buffer)
+ if(!buffer || istype(buffer))
+ buffer_name = buffer ? buffer.name : null
+ if(buffer != buffer_object)
+ if(buffer_object)
+ buffer_object.unregister(OBSERVER_EVENT_DESTROY, src)
+ buffer_object = buffer
+ if(buffer_object)
+ buffer_object.register(OBSERVER_EVENT_DESTROY, src, /obj/item/device/multitool/proc/on_buffer_destroyed)
+
+/obj/item/device/multitool/proc/on_buffer_destroyed(var/atom/destroyed_buffer)
+ // Only remove the buffered object, don't reset the name
+ // This means one cannot know if the buffer has been destroyed until one attempts to use it.
+ if(destroyed_buffer == buffer_object)
+ buffer_object = null
+
+/obj/item/device/multitool/resolve_attackby(atom/A, mob/user)
+ if(!isobj(A))
+ return ..(A, user)
+
+ var/obj/O = A
+ var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool]
+ if(!MT)
+ return ..(A, user)
+
+ MT.interact(src, user)
+ return 1
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 53517d91b07..c4692484e20 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -70,14 +70,16 @@
origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
var/uses = 10
+var/const/NO_EMAG_ACT = -50
/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
var/used_uses = A.emag_act(uses, user, src)
- if(used_uses < 0)
+ if(used_uses == NO_EMAG_ACT)
return ..(A, user)
uses -= used_uses
A.add_fingerprint(user)
- log_and_message_admins("emagged \an [A].")
+ if(used_uses)
+ log_and_message_admins("emagged \an [A].")
if(uses<1)
user.visible_message("\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.")
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index 0bc090f9962..d0c5c42bee7 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/message_monitor
@@ -57,18 +57,6 @@
name = T_BOARD("employment records console")
build_path = /obj/machinery/computer/skills
-/obj/item/weapon/circuitboard/stationalert_engineering
- name = T_BOARD("station alert console (engineering)")
- build_path = /obj/machinery/computer/station_alert
-
-/obj/item/weapon/circuitboard/stationalert_security
- name = T_BOARD("station alert console (security)")
- build_path = /obj/machinery/computer/station_alert
-
-/obj/item/weapon/circuitboard/stationalert_all
- name = T_BOARD("station alert console (all)")
- build_path = /obj/machinery/computer/station_alert/all
-
/obj/item/weapon/circuitboard/atmos_alert
name = T_BOARD("atmospheric alert console")
build_path = /obj/machinery/computer/atmos_alert
diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
new file mode 100644
index 00000000000..7eca3b4bf87
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
@@ -0,0 +1,29 @@
+/obj/item/weapon/circuitboard/stationalert
+ name = T_BOARD("station alert console")
+ build_path = /obj/machinery/computer/station_alert
+ var/list/alarm_handlers
+
+/obj/item/weapon/circuitboard/stationalert/New()
+ alarm_handlers = new()
+ set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/circuitboards/stationalert(src))
+ ..()
+
+/obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA)
+ if(..(SA))
+ SA.unregister_monitor()
+
+ var/datum/nano_module/alarm_monitor/monitor = new(SA)
+ monitor.alarm_handlers.Cut()
+ for(var/alarm_handler in alarm_handlers)
+ monitor.alarm_handlers += alarm_handler
+
+ SA.register_monitor(monitor)
+ return 1
+
+/obj/item/weapon/circuitboard/stationalert/deconstruct(var/obj/machinery/computer/station_alert/SA)
+ if(..(SA))
+ alarm_handlers.Cut()
+ if(SA.alarm_monitor)
+ for(var/alarm_handler in SA.alarm_monitor.alarm_handlers)
+ alarm_handlers += alarm_handler
+ return 1
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 7a3a74ba35f..8e67bb27554 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -45,12 +45,11 @@
return 1
/obj/proc/CouldUseTopic(var/mob/user)
- var/atom/host = nano_host()
- if(!isAI(user) && host.Adjacent(user))
+ if(!isAI(user) && src.Adjacent(user))
// We are -probably- in physical contact with the object, better than how Topics() previously did it and always applied fingerprints.
- host.add_fingerprint(user)
+ add_fingerprint(user)
else
- host.add_hiddenprint(user)
+ add_hiddenprint(user)
/obj/proc/CouldNotUseTopic(var/mob/user)
// Nada
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 451afd48743..4a82b68b3e7 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -29,6 +29,8 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
var/image/ghostimage = null //this mobs ghost image, for deleting and stuff
var/ghostvision = 1 //is the ghost able to see things humans can't?
var/seedarkness = 1
+
+ var/obj/item/device/multitool/ghost_multitool
incorporeal_move = 1
/mob/dead/observer/New(mob/body)
@@ -79,9 +81,14 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
if(!name) //To prevent nameless ghosts
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
real_name = name
+
+ ghost_multitool = new(src)
..()
/mob/dead/observer/Destroy()
+ qdel(ghost_multitool)
+ ghost_multitool = null
+
if (ghostimage)
ghost_darkness_images -= ghostimage
qdel(ghostimage)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 72ee2ce2318..430ecd22203 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -24,6 +24,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
/mob/living/silicon/ai/proc/toggle_camera_light,
+ /mob/living/silicon/ai/proc/multitool_mode,
/mob/living/silicon/ai/proc/toggle_hologram_movement
)
@@ -85,6 +86,8 @@ var/list/ai_verbs_default = list(
var/custom_sprite = 0 // Whether the selected icon is custom
var/carded
+ var/multitool_mode = 0
+
/mob/living/silicon/ai/proc/add_ai_verbs()
src.verbs |= ai_verbs_default
src.verbs |= silicon_subsystems
@@ -175,7 +178,6 @@ var/list/ai_verbs_default = list(
ai_list += src
..()
- return
/mob/living/silicon/ai/proc/on_mob_init()
src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)."
@@ -203,10 +205,17 @@ var/list/ai_verbs_default = list(
setup_icon()
/mob/living/silicon/ai/Destroy()
+ qdel(aiPDA)
+ qdel(aiMulti)
+ qdel(aiRadio)
+ aiPDA = null
+ aiMulti = null
+ aiRadio = null
+
ai_list -= src
qdel(eyeobj)
eyeobj = null
- ..()
+ return ..()
/mob/living/silicon/ai/proc/setup_icon()
var/file = file2text("config/custom_sprites.txt")
@@ -682,6 +691,13 @@ var/list/ai_verbs_default = list(
return
..()
+/mob/living/silicon/ai/proc/multitool_mode()
+ set name = "Toggle Multitool Mode"
+ set category = "AI Commands"
+
+ multitool_mode = !multitool_mode
+ src << "Multitool mode: [multitool_mode ? "E" : "Dise"]ngaged"
+
/mob/living/silicon/ai/updateicon()
if(!selected_sprite) selected_sprite = default_ai_icon
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index fe4d6ed56de..4d2fc208cc0 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -570,3 +570,19 @@ proc/is_blind(A)
return threatcount
#undef SAFE_PERP
+
+/mob/proc/get_multitool(var/obj/item/device/multitool/P)
+ if(istype(P))
+ return P
+
+mob/dead/observer/get_multitool()
+ return can_admin_interact() && ..(ghost_multitool)
+
+/mob/living/carbon/human/get_multitool()
+ return ..(get_active_hand())
+
+/mob/living/silicon/robot/get_multitool()
+ return ..(get_active_hand())
+
+/mob/living/silicon/ai/get_multitool()
+ return ..(aiMulti)
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index 82fd32ea3c5..0bda1d97064 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -5,7 +5,7 @@
return src
/datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state)
- var/src_object = nano_host()
+ var/datum/src_object = nano_host()
return state.can_use_topic(src_object, user)
/datum/topic_state/proc/href_list(var/mob/user)
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index 688f394e207..09c425c15a2 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -3,6 +3,10 @@
var/list_cameras = 0 // Whether or not to list camera references. A future goal would be to merge this with the enginering/security camera console. Currently really only for AI-use.
var/list/datum/alarm_handler/alarm_handlers // The particular list of alarm handlers this alarm monitor should present to the user.
+/datum/nano_module/alarm_monitor/New()
+ ..()
+ alarm_handlers = list()
+
/datum/nano_module/alarm_monitor/all/New()
..()
alarm_handlers = alarm_manager.all_handlers
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index d42ac80b7c8..560da8000bf 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -95,6 +95,9 @@ h1.alert, h2.alert {color: #000000;}
.interface {color: #330033;}
+.good {color: #4f7529; font-weight: bold;}
+.bad {color: #ee0000; font-weight: bold;}
+
BIG IMG.icon {width: 32px; height: 32px;}
"}
diff --git a/html/changelogs/PsiOmegaDelta-MultitoolPower.yml b/html/changelogs/PsiOmegaDelta-MultitoolPower.yml
new file mode 100644
index 00000000000..d875108dd80
--- /dev/null
+++ b/html/changelogs/PsiOmegaDelta-MultitoolPower.yml
@@ -0,0 +1,7 @@
+author: PsiOmegaDelta
+delete-after: True
+changes:
+ - experiment: "Adds a system to allow objects to implement custom multitool interactions in a modular manner."
+ - rscadd: "The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool Mode' verb."
+ - rscadd: "Cloning vats can now be connected to a cloning console by using a multitool."
+ - rscadd: "Station alert console circuits can now be altered using a multitool, changing which alarm types are displayed."
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index de1e126df98..c5d97163e08 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -5236,7 +5236,7 @@
"bWJ" = (/turf/simulated/floor/carpet,/area/engineering/break_room)
"bWK" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Miscellaneous Reseach Room"; req_access = list(); req_one_access = list(7,29)},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bWL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/research)
-"bWM" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_engineering{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
+"bWM" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
"bWN" = (/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/rnd/research)
"bWO" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/rnd/research)
"bWP" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/research)
@@ -5711,7 +5711,7 @@
"cfQ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cfR" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cfS" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms)
-"cfT" = (/obj/machinery/computer/station_alert,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room)
+"cfT" = (/obj/machinery/computer/station_alert/engineering,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room)
"cfU" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "toxin_test_outer"; locked = 1; name = "Engineering External Access"; req_access = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cfV" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room)
"cfW" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant{icon_state = "plant-20"; tag = "icon-plant-22"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room)
@@ -5981,7 +5981,7 @@
"cla" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"clb" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 4; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/virology)
"clc" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/engine_eva)
-"cld" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/foyer)
+"cld" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cle" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/foyer)
"clf" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/engineering/foyer)
"clg" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer)
@@ -6167,6 +6167,7 @@
"coE" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Engine Waste")},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring)
"coF" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"coG" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
+"coH" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"coI" = (/obj/machinery/computer/atmos_alert,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"coJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/engineering)
"coK" = (/turf/simulated/floor/tiled,/area/engineering)
@@ -6178,6 +6179,7 @@
"coQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop)
"coR" = (/turf/simulated/floor/tiled,/area/engineering/workshop)
"coS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery)
+"coT" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"coU" = (/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/camera/network/medbay{c_tag = "Medbay Surgery Prep"; dir = 8},/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryprep)
"coV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 2 Storage"; req_access = list(45)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2)
"coW" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "virologyquar"; name = "Virology Emergency Quarantine Blast Doors"; opacity = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/medical/virologyaccess)
@@ -6215,6 +6217,7 @@
"cpC" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos)
"cpD" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpE" = (/obj/machinery/atmospherics/binary/pump{name = "N2 to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"cpF" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station)
"cpG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos)
"cpH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/plating,/area/engineering/atmos)
"cpI" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos)
@@ -6293,7 +6296,6 @@
"cre" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"crf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"crg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology)
-"crh" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"cri" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering)
"crj" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/engineering/workshop)
"crk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/virology)
@@ -7070,7 +7072,6 @@
"cHo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cHp" = (/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cHq" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space)
-"cHr" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cHs" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"cHt" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cHu" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -7256,7 +7257,6 @@
"cKY" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cKZ" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cLa" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room)
-"cLb" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station)
"cLc" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station)
"cLd" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
"cLe" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication/Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
@@ -7484,7 +7484,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnqcnpchfchfcnrcnDcowcovcnycnmcnscnzcnzcnAcnzcnGcnBcoxcnGcnJcnFcnCcnIcnMcnOcnOcnOcnOcnLcnKcnRcnRcnRcgscgscgscgsbSgciGcnQcnScmVcnUcnTciGcmYcnacnWciUcnYcnZcnccoccoaciUclLclMclNcjtcodcofclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcogcojcohcwlcokconcolcomcoocoqcopcdOaapaafaafaafaafaaaaaaaaabSYaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcptcpBcpAcpGcpCcpIcpHcpGcpScpZcpHcqtcqdcqxcqwcnycnycnycnycnycnycnycnycozcotcoBcoAcoCcqycoEcoDcjucnGcjwcoGcoIcnGcoKcoJcoLcnOcoNcoMcoPcoOcoRcoQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccoSciGciGciGcjzcnacoUciUciUciUcoVcphciUciUclLcpiclNcoXcoWcoXclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoYcoZcoYcpdcpacpgcpecomcomcplcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacpmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcjOcpLcpKcfEcpMcpPcpOcpRcpQcpUcpTcpVcqLcpXcpWcpYcqNcqbcqacqccqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcracqLcrccrbcrdcrVcrfcrecrhcsgcoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNckicqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQckscdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcracqLcrccrbcrdcrVcrfcrecoHcsgcoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNckicqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQckscdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqDcpucqYcpucqYcpucqTcpucrTcrXcrWcrXcrZcrXcrXcsbcsacpucpucsdcsccsccsccsfcsecshcshcsicqLcskcsjcsmcnGcsocsncspcnGcsscsrcstcsqcsvcsucszcswcoRcsAcpjcsxcrKcsycrKckucpjbTFcfxciGcsDcsCcsFcsEciGcfYcufcfYciUcsGcsJcsHcsKbTkcsIcrGcrGcqvclbcsLcsNcqvcqvcqvcqvcqvcqvcqvcqvcsOcsQcsPcqvcqvcqvcrHaaaaaacdOcogcojcohcslcsRcqCcrQcrQcrQcnjcrQcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacsTaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqDcpucqYcpucsUcsWcsVcsZcsYctacrWcrXctbcrXcrXctdctcctfctecticthctkctjctjctlcqYcqYctmctgctnctocnzcnGctscnGcnGcnGctucttcstcvnctxcvtctBctycoRctCcpjcvOcrKcsycrKcvRcpjctvctwciGciGctDciGciGciGciBclMbTlciUciUciUctEciUciUcsIcrGaaacqvctHctGctIctFctKctJctMctLctOctNcqvcuVctPcuVcqvctQctRcqvaafaafcdOcoYcoYcoYctScpactUctTctWctVctXcrQctZcdOcdOcdOcdOaaaaaacrPaaacuacuacuacuacuaaafcsTaafcuacuacuacuacuaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacqDcpucsUcsWcsWcsWcsVcsWcsWcsWcsVcsWcsWcsWcsWcsWcuccudcsWcuebTmcugcsWcsWcsWcuicuhcukcujcpuculcuncumcupcuocurcuqcuocuscuucutcuwcuvcuvcuxcuvcuycwObTocuAcuzcuBcuBcpjcuCcuDcwXcuFcuFcuGcuEcuHcuJcuJcuJcuJcwPcuJcuJcuJcuKcrFcrGaaactFcuLcuIcuMctFcuOcuNcuPcuPcuRcuQcltcuPcuXcuPcuVcuYcuPcqvaaaaaacdOcoYcoYcoYcslcuZcvbcvacvdcvccvecrQcrQcvfcvhcvgcdOaafaafcrPaafcvicvjcvjcvjcvjcvkcsTcvmcvlcvlcvlcvlcvoaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7501,7 +7501,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgEcmtcmDcEgcgEcmtcmDcEgcgEcmtcmDcEhcgEaaacgEcEgcmDcEhcgEaaaaafaaacDzcJCcbwcEkcEncEEcEpcEocDkcEFcEHcEGcDJcEIcELcEKcENcEMcDJcEOcEQcEPcDraaaaaacAOcEScbJcFiaaaaaabNUbPxbPxbNUcCacETcETcETcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcEWcEUcEZcEXcuPcuPcuPcFbcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcFccFccFcckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacqJaaaaaaaaacrPcrPcrPcbOcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgEcFdcFfcFecgEcFgcFjcFhcgEcFkcFncFlcgEaafcgEcFocFscFrcgEaaaaafaaacDzcEVcDUcEncEncFtcEYcoecFacFvcFxcFwcFzcFycFDcFBcFFcFEcFpcFmcFGcFqcDraafaaacFJcKGcKFcAOcKHaaabNUbPxcKIcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcGgcFHcEycEycEycFIcGgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFKcFKcFKaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcFLaafcrPaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaafaafcgEcFQcFRcFQcgEcFScFUcFScgEcFVcFZcFVcgEaaacgEcGacGacGbcgEaaaaafaaacDzcDhcGccEkcEncDVcFAcDWcDkcGecGicGfcDJcGkcGncGmcGncGocDJcbKcFTccJcDraapcGvcGucKPcKOcGucGucGBbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGhcGDcGKcGKcGKcGNcGhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFQcGOcFQcgEcFScGPcFScgEcFVcGTcFVcgEaafcgEcGacGYcGacgEaafaafaafcFYcFXcHacGZcHgcHfcGdcDWcDkcHhcHmcHlcDJcHncHpcHocHscHrcDJcorcGrcHAcDraaacHBcKXcHGcHEcLccLbcHHcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcGlcrkcrkcrkcCmcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFQcGOcFQcgEcFScGPcFScgEcFVcGTcFVcgEaafcgEcGacGYcGacgEaafaafaafcFYcFXcHacGZcHgcHfcGdcDWcDkcHhcHmcHlcDJcHncHpcHocHscoTcDJcorcGrcHAcDraaacHBcKXcHGcHEcLccpFcHHcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcGlcrkcrkcrkcCmcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcLecGtcGtcGtcGtcLfcGtcGwcGycGxcGycGzcGtcGtcLgcGtcGtcGtcHBcKXcHQcHIcLkcLjcLlaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScHRcefcGCcGIcHTcHUcGJcHXcfBcIdcIbcIfcIecGVcGUcGXcGWcLpcIgcHbcfCcIgcGtcHBcKXcIicIhcLucLtcIkaafaaacGQcHccGQcHccGQcHcaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcIucIwcIvaaacIucIwcIvaaacIucIwcIvaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScHRcIxcHecIzcLScIBcHicICcHkcIGcIDcINcIJcHucHtcHucHucHucHvcHucHwcHxcGtcIRcGucGucGucGucGucITaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 24384f9b410..8dcdf2e6ddd 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -609,7 +609,7 @@
"lK" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"lL" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"lM" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start)
-"lN" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start)
+"lN" = (/obj/machinery/computer/station_alert/all,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"lO" = (/obj/machinery/button/remote/blast_door{id = "skipjackshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/wall/voxshuttle,/area/skipjack_station/start)
"lP" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start)
"lQ" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
@@ -1785,6 +1785,7 @@
"Iq" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"})
"Ir" = (/obj/item/device/radio/intercom/syndicate{dir = 8; pixel_x = 22},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station)
"Is" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"It" = (/obj/machinery/computer/station_alert/all,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"})
"Iu" = (/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
"Iv" = (/obj/structure/bed,/obj/item/weapon/bedsheet/rd,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
"Iw" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
@@ -1793,6 +1794,7 @@
"Iz" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
"IA" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
"IB" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
+"IC" = (/obj/machinery/computer/station_alert/all,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start)
"ID" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/monocle,/turf/unsimulated/floor{icon_state = "lino"},/area/wizard_station)
"IE" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"IF" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
@@ -1845,7 +1847,6 @@
"JP" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chawanmushi,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"JQ" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c1,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"JR" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"})
-"JS" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"})
"JU" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding)
"JW" = (/obj/structure/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"JY" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"})
@@ -1928,7 +1929,6 @@
"Ng" = (/obj/structure/AIcore/deactivated,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"Nh" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"Ni" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
-"Nj" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"Nk" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"Nl" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
"Nm" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom)
@@ -2106,7 +2106,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvAfAfAhAoAnAqApwDtvAsArwqtvxQyPtvwqArAsvlAFxQxQzFzDtvAGAKAJAGyTzayXzbCNtxwAzdxRtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxtxaMaMaMaMaMyquryNuPuPyOuryqaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt
dCdCdCdCdCdCdCdCdCdCdCAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZdCdCdCdCdCdCdCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvzjzjtvtvtvtvtvBaxQxQzFzDtvAGBbBbAGyTzmyXzbCNzpzozrzqzyCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMyqururzLzLururyqaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumumumumumudCBvBvBvBvBvAZBFBzBGAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzBzNzNzNzNzEzEzNzNzPaMtvBNxQxQzFzDtvAGAJAJAGyTzmyXzbCNzHyXyXyXzKCNaMaMaMaMaMaMaMaMaMaMaMaMzQzMNaNaNazTzRaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-dCmumumumumumumumumudCBvBvBvBvBvAZBRBzBzAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzXzZAaBSAcAcAdjZzNzPtvtvyWyWtvtvtvlqAGAGAGzYzmyXzbCNAjAiAjAkAjCNaMaMaMaMaMaMaMaMaMaMaMzQAlNiNjNkNlNmAtzRaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+dCmumumumumumumumumudCBvBvBvBvBvAZBRBzBzAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUzXzZAaBSAcAcAdjZzNzPtvtvyWyWtvtvtvlqAGAGAGzYzmyXzbCNAjAiAjAkAjCNaMaMaMaMaMaMaMaMaMaMaMzQAlNilNNkNlNmAtzRaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumumuBvBvBvAZAZAZAZBvAZAZAZAZCgAZAZAZAZAZAZAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUAuAmAcAcAcAcAcAcCiChvlxQxQxQxQxQxNAGCjAGCjyTzmyXAwzYyXyXAxyXABCNaMaMaMaMaMaMaMaMaMaMzQAlCoAvADAvADAvCpAtzRaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumuBvBvBvBvCuCvBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzUAuypAyAzjSAzAzAzzNAAvlxQxQxQxQxQyWAGCjAGCjyTzmyXAwzYyXyXALAIAMCNaMaMaMaMaMaMaMaMaMaMACADADADCANcyuADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumuBvBvBzCFCuCFBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZCHCGBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAOzNzNzNzNzNzNzNzNAAaMvlxQxQxQxQxQtvAGCjAGCjyTAQAPARCNAjASAUATAjCNaMaMaMaMaMaMaMaMaMaMAWCRBuNhAXNgAXNfCrCSAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
@@ -2120,14 +2120,14 @@ dCmuHmHAHzCuHBCuCumumuAZHCHIAZAZAZAZAZAZAZAZAZAZCgAZAZAZAZAZAZAZAZAZAZmumuaMaMmt
dCmuIhCuImCuHzCuCumumuBvBvBvAZBzBzBzBzBzBzAZIqIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBkBmBmAHDqDiDrCPCPDgyXCOyXyXyXyXDsAjAjAjyXDxDzDyCNaMaMCCBuADCrCMBuADCrCMBuADCrDAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmuBvCuIXCuIYCuCumumuaMaMmuAZBzBFBzBzBzBzAZIGIGJaIGIGAZBzBzBzBzBFBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHJcJbJbCPCPCNAjAjDByXDCyXCwAjBxDDyXCTuVJrCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmuBvJAJzCuCuJBCumumuaMaMmuAZBzBzBzBzBzBzCgIGIGJCIGIGCgBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJEJDJDJDJFJFCPCPCPCPJHCPCPCPCPCPCPCPCPCPCPNyCPCNBxAjDEyXyXyXCyAjAjAjyXDGzrDHCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZJMJOJNAZIGJSJRIGIGAZJMJOJNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADANAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZJMJOJNAZIGItJRIGIGAZJMJOJNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADANAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmuBvBvBvBvJYJZBvmumBmAaMaMAZBzBzAZaMaMaMAZAZJMJOJNAZAZaMaMaMAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUJUDmDtDuDlCPDmDvDwDlCPCPDKDKDKDKDKDKCNBxAjDSDRyXyXyXCOyXyXyXyXyXCTGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmuBvBvBvBvBvBvmuaMaMaMaMaMKiKjKjKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKjKjKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUJUCPCPCPCPNyCPCPCPCPCPCPDTDTDTDTDTDTCNCNCNCNKvDXDXCNCNCNCNAjAjAjAjAjAjAjDYACNNBezSzTKxzSzTBeNNACDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumumumumumuaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBJUDmDNDODlCPDmDPDQDlCPCPEcEiEiEiEiEiCNEkEkEkEoDVDVEqEpEpCNBxBxBxBxCNaMaMAWNENFAWNHNIEaKDNJAWNLNGAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumumumumuaMaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUJUDmEeEfDlCPDmEgEhDlCPCPEiEiEiEiEiEiCNEtEjEjElDVDVDVEpEpCNCNCNCNCNCNaMaMAWKNKMAWKONVEaEaKPAWKQKRAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumumumumuaMaMaMaMaMlwKjKjlxaMaMaMlwaMaMaMaMaMlxaMaMaMlwKjKjlxaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKUJUJUJUJUKuCPCPCPCPCPCPCPCPCPCPCPEiEiEuEwEvExCNDVDVDVDVEzEyDVDVEACNaMaMaMaMaMaMaMDYEBEBAWKYEaNREbBPAWEBEBDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlylFlGlGlGlHlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkEGEFEFEFEHEHEHEIEIEJEIEIEHEHEHCNCNCNEKDVDVEzEMELEyDVENCNaMaMaMaMaMaMaMEOEVEVDZEPEaEaEaEQDYEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylylNlMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHESFeEIFeFeFeEIFeESEHCNCNCNCNCNCNETEWEUFbDVENCNaMaMaMaMaMaMaMaMaMaMEOBeEBEBEBBeERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylyIClMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHESFeEIFeFeFeEIFeESEHCNCNCNCNCNCNETEWEUFbDVENCNaMaMaMaMaMaMaMaMaMaMEOBeEBEBEBBeERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumuaMaMaMaMaMaMaMaMlylTlSlyaMaMlylylUlWlVlWlXlylyaMaMlylYlZlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMjJULlLWEZEZEZEZEZEZEHFeFdFcFeFeFeFcFfFeEHFgFiFhFkFjCNDVETFbFmDVDVFnaMaMaMaMaMaMaMaMaMaMaMEOEVEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumuaMaMaMaMaMaMaMaMlymalylylylylymcmbmbmbmbmbmdlylylylylymelyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULlLWEZEZEZEZEZEZEZEHEIFeEIFeFeFeEIFeEIEHDVDVDVDVDVMuDVDVDVDVDVDVFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
dCmumumumumuaMaMaMaMaMaMaMaMlymgmfmjmhmllymmmbmbmbmbmbmmlymomnmqmpoTlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNLlLWEZEZEZEZEZEZEZEZEHFoFeFeFeFeFeFeFeFtEHFuDVFEDVFvCNDVDVDVDVDVFwFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm
index 1202213bdb8..544870d8581 100644
--- a/maps/exodus-5.dmm
+++ b/maps/exodus-5.dmm
@@ -901,7 +901,7 @@
"rq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"rr" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"rs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/power)
-"rt" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
+"rt" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"ru" = (/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"rv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/power)
"rw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/floor_decal/corner/yellow/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway)