diff --git a/baystation12.dme b/baystation12.dme
index bcc2959d8f..a0c36c62e3 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -982,6 +982,7 @@
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\mapload\dmm_suite.dm"
#include "code\WorkInProgress\mapload\reader.dm"
+#include "code\WorkInProgress\Mini\atmos_control.dm"
#include "code\WorkInProgress\Mini\customitems.dm"
#include "code\WorkInProgress\SkyMarshal\coatrack.dm"
#include "code\WorkInProgress\SkyMarshal\eraser.dm"
diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
new file mode 100644
index 0000000000..018b8d76df
--- /dev/null
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -0,0 +1,315 @@
+/obj/item/weapon/circuitboard/atmoscontrol
+ name = "Central Atmospherics Computer Circuitboard"
+ build_path = "/obj/machinery/computer/security/atmoscontrol"
+
+/obj/machinery/computer/atmoscontrol
+ name = "Central Atmospherics Computer"
+ density = 1
+ anchored = 1.0
+ icon_state = "operating"
+ circuit = "/obj/item/weapon/circuitboard/atmoscontrol"
+ var/obj/machinery/alarm/current = ""
+
+/obj/machinery/computer/atmoscontrol/attack_hand(mob/user)
+ if(..())
+ return
+ user.machine = src
+ var/dat = "Main Menu
"
+ if(current)
+ dat += src.specific()
+ else
+ for(var/obj/machinery/alarm/alarm in world)
+ dat += "[alarm]
"
+ user << browse(dat, "window=atmoscontrol")
+
+/obj/machinery/computer/atmoscontrol/proc/specific()
+ if(!current)
+ return ""
+ var/dat = current.return_status()
+ if(current.remote_control)
+ dat += "
[src.return_controls()]"
+ return dat
+
+//a bunch of this is copied from atmos alarms
+/obj/machinery/computer/atmoscontrol/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["reset"])
+ current = null
+ src.updateUsrDialog()
+ if(href_list["alarm"])
+ current = locate(href_list["alarm"])
+ if(href_list["command"])
+ var/device_id = href_list["id_tag"]
+ switch(href_list["command"])
+ if(
+ "power",
+ "adjust_external_pressure",
+ "checks",
+ "co2_scrub",
+ "tox_scrub",
+ "n2o_scrub",
+ "panic_siphon",
+ "scrubbing"
+ )
+ current.send_signal(device_id, list (href_list["command"] = text2num(href_list["val"])))
+ spawn(3)
+ src.updateUsrDialog()
+ //if("adjust_threshold") //was a good idea but required very wide window
+ if("set_threshold")
+ var/env = href_list["env"]
+ var/varname = href_list["var"]
+ var/datum/tlv/tlv = current.TLV[env]
+ var/newval = input("Enter [varname] for env", "Alarm triggers", tlv.vars[varname]) as num|null
+ if (isnull(newval) || ..() || (current.locked && issilicon(usr)))
+ return
+ if (newval<0)
+ tlv.vars[varname] = -1.0
+ else if (env=="temperature" && newval>5000)
+ tlv.vars[varname] = 5000
+ else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
+ tlv.vars[varname] = 50*ONE_ATMOSPHERE
+ else if (env!="temperature" && env!="pressure" && newval>200)
+ tlv.vars[varname] = 200
+ else
+ newval = round(newval,0.01)
+ tlv.vars[varname] = newval
+ spawn(1)
+ src.updateUsrDialog()
+ return
+
+ if(href_list["screen"])
+ current.screen = text2num(href_list["screen"])
+ spawn(1)
+ src.updateUsrDialog()
+ return
+
+
+ if(href_list["atmos_alarm"])
+ if (current.alarm_area.atmosalert(2))
+ current.post_alert(2)
+ spawn(1)
+ src.updateUsrDialog()
+ current.update_icon()
+ return
+ if(href_list["atmos_reset"])
+ if (current.alarm_area.atmosalert(0))
+ current.post_alert(0)
+ spawn(1)
+ src.updateUsrDialog()
+ current.update_icon()
+ return
+
+ if(href_list["mode"])
+ current.mode = text2num(href_list["mode"])
+ current.apply_mode()
+ spawn(5)
+ src.updateUsrDialog()
+ return
+ src.updateUsrDialog()
+
+//copypasta from alarm code, changed to work with this without derping hard
+//---START COPYPASTA----
+#define AALARM_MODE_SCRUBBING 1
+#define AALARM_MODE_VENTING 2 //makes draught
+#define AALARM_MODE_PANIC 3 //constantly sucks all air
+#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing
+#define AALARM_MODE_OFF 5
+
+#define AALARM_SCREEN_MAIN 1
+#define AALARM_SCREEN_VENT 2
+#define AALARM_SCREEN_SCRUB 3
+#define AALARM_SCREEN_MODE 4
+#define AALARM_SCREEN_SENSORS 5
+
+/obj/machinery/computer/atmoscontrol/proc/return_controls()
+ var/output = ""//"[alarm_zone] Air [name]
"
+
+ switch(current.screen)
+ if (AALARM_SCREEN_MAIN)
+ if(current.alarm_area.atmosalm)
+ output += {"Reset - Atmospheric Alarm
"}
+ else
+ output += {"Activate - Atmospheric Alarm
"}
+
+ output += {"
+Scrubbers Control
+Vents Control
+Set envirenomentals mode
+Sensor Control
+
+"}
+ if (current.mode==AALARM_MODE_PANIC)
+ output += "PANIC SYPHON ACTIVE
turn syphoning off"
+ else
+ output += "ACTIVATE PANIC SYPHON IN AREA"
+ if (AALARM_SCREEN_VENT)
+ var/sensor_data = ""
+ if(current.alarm_area.air_vent_names.len)
+ for(var/id_tag in current.alarm_area.air_vent_names)
+ var/long_name = current.alarm_area.air_vent_names[id_tag]
+ var/list/data = current.alarm_area.air_vent_info[id_tag]
+ var/state = ""
+ if(!data)
+ state = " can not be found!"
+ data = list("external" = 0) //for "0" instead of empty string
+ else if (data["timestamp"]+AALARM_REPORT_TIMEOUT < world.time)
+ state = " not responding!"
+ sensor_data += {"
+[long_name][state]
+Operating:
+[data["power"]?"on":"off"]
+
+Pressure checks:
+external
+internal
+
+External pressure bound:
+-
+-
+-
+-
+[data["external"]]
++
++
++
++
+
+"}
+ if (data["direction"] == "siphon")
+ sensor_data += {"
+Direction:
+siphoning
+
+"}
+ sensor_data += {"
"}
+ else
+ sensor_data = "No vents connected.
"
+ output = {"Main menu
[sensor_data]"}
+ if (AALARM_SCREEN_SCRUB)
+ var/sensor_data = ""
+ if(current.alarm_area.air_scrub_names.len)
+ for(var/id_tag in current.alarm_area.air_scrub_names)
+ var/long_name = current.alarm_area.air_scrub_names[id_tag]
+ var/list/data = current.alarm_area.air_scrub_info[id_tag]
+ var/state = ""
+ if(!data)
+ state = " can not be found!"
+ data = list("external" = 0) //for "0" instead of empty string
+ else if (data["timestamp"]+AALARM_REPORT_TIMEOUT < world.time)
+ state = " not responding!"
+
+ sensor_data += {"
+[long_name][state]
+Operating:
+[data["power"]?"on":"off"]
+Type:
+[data["scrubbing"]?"scrubbing":"syphoning"]
+"}
+
+ if(data["scrubbing"])
+ sensor_data += {"
+Filtering:
+Carbon Dioxide
+[data["filter_co2"]?"on":"off"];
+Toxins
+[data["filter_toxins"]?"on":"off"];
+Nitrous Oxide
+[data["filter_n2o"]?"on":"off"]
+
+"}
+ sensor_data += {"
+Panic syphon: [data["panic"]?"PANIC SYPHON ACTIVATED":""]
+Dea":"red'>A")]ctivate
+
+"}
+ else
+ sensor_data = "No scrubbers connected.
"
+ output = {"Main menu
[sensor_data]"}
+
+ if (AALARM_SCREEN_MODE)
+ output += {"
+Main menu
+Air machinery mode for the area:"}
+ var/list/modes = list(
+ AALARM_MODE_SCRUBBING = "Filtering",
+ AALARM_MODE_VENTING = "Draught",
+ AALARM_MODE_PANIC = "PANIC",
+ AALARM_MODE_REPLACEMENT = "REPLACE AIR",
+ AALARM_MODE_OFF = "Off",
+ )
+ for (var/m=1,m<=modes.len,m++)
+ if (current.mode==m)
+ output += {"- [modes[m]] (selected)
"}
+ else
+ output += {"- [modes[m]]
"}
+ output += "
"
+ if (AALARM_SCREEN_SENSORS)
+ output += {"
+Main menu
+Alarm thresholds:
+Partial pressure for gases
+
+
+ | min2 | min1 | max1 | max2 |
+"}
+ var/list/gases = list(
+ "oxygen" = "O2",
+ "carbon dioxide" = "CO2",
+ "plasma" = "Toxin",
+ "other" = "Other",
+ )
+ var/list/thresholds = list("min2", "min1", "max1", "max2")
+ var/datum/tlv/tlv
+ for (var/g in gases)
+ output += {"
+| [gases[g]] |
+"}
+ tlv = current.TLV[g]
+ for (var/v in thresholds)
+ output += {"
+
+[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
+ |
+"}
+ output += {"
+
+"}
+ tlv = current.TLV["pressure"]
+ output += {"
+| Pressure |
+"}
+ for (var/v in thresholds)
+ output += {"
+
+[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
+ |
+"}
+ output += {"
+
+"}
+ tlv = current.TLV["temperature"]
+ output += {"
+| Temperature |
+"}
+ for (var/v in thresholds)
+ output += {"
+
+[tlv.vars[v]>=0?tlv.vars[v]:"OFF"]
+ |
+"}
+ output += {"
+
+"}
+ output += {"
"}
+
+ return output
+//---END COPYPASTA----
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 54b0d88ce5..f022e1ec89 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -40,6 +40,7 @@
var/frequency = 1439
//var/skipprocess = 0 //Experimenting
var/alarm_frequency = 1437
+ var/remote_control = 0
#define AALARM_REPORT_TIMEOUT 100
var/datum/radio_frequency/radio_connection
var/locked = 1
@@ -211,9 +212,9 @@
/obj/machinery/alarm/proc/return_text()
if(!(istype(usr, /mob/living/silicon)) && locked)
- return "[src][return_status()]
(Swipe ID card to unlock interface)"
+ return "[src][return_status()]
[remote_control ? "Disable" : "Enable"] Remote Control
(Swipe ID card to unlock interface)"
else
- return "[src][return_status()]
[return_controls()]"
+ return "[src][return_status()]
[remote_control ? "Disable" : "Enable"] Remote Control
[return_controls()]"
/obj/machinery/alarm/proc/return_status()
var/turf/location = src.loc
@@ -491,7 +492,9 @@ table tr:first-child th:first-child { border: none;}
/obj/machinery/alarm/Topic(href, href_list)
if(..())
return
-
+ if(href_list["ctrl"])
+ remote_control = !remote_control
+ src.updateUsrDialog()
if(href_list["command"])
var/device_id = href_list["id_tag"]
switch(href_list["command"])
@@ -554,7 +557,6 @@ table tr:first-child th:first-child { border: none;}
apply_mode()
spawn(5)
src.updateUsrDialog()
-
return
/obj/machinery/alarm/proc/apply_mode()