diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 3a19bc34edf..ccd774cdaa8 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -21,8 +21,8 @@ rust_g.dll @AffectedArc07
### Fox-McCloud
-/code/ATMOSPHERICS/ @Fox-McCloud
/code/controllers/subsystem/air.dm @Fox-McCloud
/code/controllers/subsystem/garbage.dm @Fox-McCloud
+/code/modules/atmospherics/ @Fox-McCloud
/code/modules/reagents/chemistry/holder.dm @Fox-McCloud
/code/modules/reagents/chemistry/reagents.dm @Fox-McCloud
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
deleted file mode 100644
index 93ecea71fa8..00000000000
--- a/code/game/machinery/atmo_control.dm
+++ /dev/null
@@ -1,741 +0,0 @@
-/obj/machinery/air_sensor
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "gsensor1"
- resistance_flags = FIRE_PROOF
- name = "gas sensor"
- req_one_access_txt = "24;10"
-
- anchored = 1
- var/state = 0
- var/bolts = 1
-
- var/id_tag
- frequency = ATMOS_VENTSCRUB
- Mtoollink = 1
- settagwhitelist = list("id_tag")
-
- var/on = 1
- var/output = 3
- //Flags:
- // 1 for pressure
- // 2 for temperature
- // Output >= 4 includes gas composition
- // 4 for oxygen concentration
- // 8 for toxins concentration
- // 16 for nitrogen concentration
- // 32 for carbon dioxide concentration
-
-/obj/machinery/air_sensor/update_icon()
- icon_state = "gsensor[on]"
-
-/obj/machinery/air_sensor/multitool_menu(var/mob/user, var/obj/item/multitool/P)
- return {"
- Main
-
"}
-
-/obj/machinery/air_sensor/multitool_topic(var/mob/user, var/list/href_list, var/obj/O)
- . = ..()
- if(.)
- return .
-
- if("toggle_out_flag" in href_list)
- var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally
- if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits
- return 0
- if(output&bitflag_value)//the bitflag is on ATM
- output &= ~bitflag_value
- else//can't not be off
- output |= bitflag_value
- return TRUE
- if("toggle_bolts" in href_list)
- bolts = !bolts
- if(bolts)
- visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click")
- else
- visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click")
- return TRUE
-
-/obj/machinery/air_sensor/attackby(var/obj/item/W as obj, var/mob/user as mob)
- if(istype(W, /obj/item/multitool))
- update_multitool_menu(user)
- return 1
- if(istype(W, /obj/item/wrench))
- if(bolts)
- to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.")
- return 1
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You begin to unfasten \the [src]...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- user.visible_message("[user] unfastens \the [src].", "You have unfastened \the [src].", "You hear ratchet.")
- new /obj/item/pipe_gsensor(src.loc)
- qdel(src)
- return 1
- return
- return ..()
-
-/obj/machinery/air_sensor/process_atmos()
- if(on)
- if(!radio_connection)
- return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.data["tag"] = id_tag
- signal.data["timestamp"] = world.time
-
- var/datum/gas_mixture/air_sample = return_air()
-
- if(output&1)
- signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),)
- if(output&2)
- signal.data["temperature"] = round(air_sample.temperature,0.1)
-
- if(output>4)
- var/total_moles = air_sample.total_moles()
- if(total_moles > 0)
- if(output&4)
- signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1)
- if(output&8)
- signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1)
- if(output&16)
- signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1)
- if(output&32)
- signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1)
- else
- signal.data["oxygen"] = 0
- signal.data["toxins"] = 0
- signal.data["nitrogen"] = 0
- signal.data["carbon_dioxide"] = 0
- signal.data["sigtype"]="status"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
-/obj/machinery/air_sensor/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
-
-/obj/machinery/air_sensor/Initialize()
- ..()
- SSair.atmos_machinery += src
- set_frequency(frequency)
-
-/obj/machinery/air_sensor/Destroy()
- SSair.atmos_machinery -= src
- if(SSradio)
- SSradio.remove_object(src, frequency)
- radio_connection = null
- return ..()
-
-
-/obj/machinery/computer/general_air_control
- icon = 'icons/obj/computer.dmi'
- icon_screen = "tank"
- icon_keyboard = "atmos_key"
- circuit = /obj/item/circuitboard/air_management
- req_one_access_txt = "24;10"
-
- name = "Computer"
-
- frequency = ATMOS_VENTSCRUB
- var/show_sensors=1
- var/list/sensors = list()
- Mtoollink = 1
-
- var/list/sensor_information = list()
-
-/obj/machinery/computer/general_air_control/Destroy()
- if(SSradio)
- SSradio.remove_object(src, frequency)
- radio_connection = null
- return ..()
-
-/obj/machinery/computer/general_air_control/attack_hand(mob/user)
- if(..(user))
- return
- var/html=return_text()
- var/datum/browser/popup = new(user, "gac", name, 400, 400)
- popup.set_content(html)
- popup.open(0)
- user.set_machine(src)
- onclose(user, "gac")
-
-/obj/machinery/computer/general_air_control/process()
- ..()
- if(!sensors)
- //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC
- sensors = list()
- src.updateUsrDialog()
-
-/obj/machinery/computer/general_air_control/attackby(I as obj, user as mob, params)
- if(istype(I, /obj/item/multitool))
- update_multitool_menu(user)
- return 1
- return ..()
-
-
-/obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
- if(!id_tag || !sensors || !sensors.Find(id_tag)) return
-
- sensor_information[id_tag] = signal.data
-
-/obj/machinery/computer/general_air_control/proc/return_text()
- var/sensor_data
- if(show_sensors)
- if(sensors.len)
- for(var/id_tag in sensors)
- var/long_name = sensors[id_tag]
- var/list/data = sensor_information[id_tag]
- var/sensor_part = ""
- sensor_data += sensor_part
-
- else
- sensor_data = "No sensors connected."
-
- var/output = {"
-
- [show_sensors ? "Sensor Data:
" + sensor_data : ""]
- "}
-
- return output
-
-/obj/machinery/computer/general_air_control/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
-
-/obj/machinery/computer/general_air_control/Initialize()
- ..()
- set_frequency(frequency)
-
-/obj/machinery/computer/general_air_control/multitool_menu(mob/user, obj/item/multitool/P)
- var/dat= {"
- Main
-
- Sensors:
- "}
- return dat
-
-/obj/machinery/computer/general_air_control/multitool_topic(mob/user,list/href_list,obj/O)
- . = ..()
- if(.) return .
- if("add_sensor" in href_list)
-
- // Make a list of all available sensors on the same frequency
- var/list/sensor_list = list()
- for(var/obj/machinery/air_sensor/G in GLOB.machines)
- if(!isnull(G.id_tag) && G.frequency == frequency)
- sensor_list|=G.id_tag
- if(!sensor_list.len)
- to_chat(user, "No sensors on this frequency.")
- return FALSE
-
- // Have the user pick one of them and name its label
- var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list
- if(!sensor)
- return FALSE
- var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1)
- if(!label)
- return FALSE
-
- // Add the sensor's information to general_air_controler
- sensors[sensor] = label
- return TRUE
-
- if("edit_sensor" in href_list)
- var/list/sensor_list = list()
- for(var/obj/machinery/air_sensor/G in GLOB.machines)
- if(!isnull(G.id_tag) && G.frequency == frequency)
- sensor_list|=G.id_tag
- if(!sensor_list.len)
- to_chat(user, "No sensors on this frequency.")
- return FALSE
- var/label = sensors[href_list["edit_sensor"]]
- var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list
- if(!sensor)
- return FALSE
- sensors.Remove(href_list["edit_sensor"])
- sensors[sensor] = label
- return TRUE
-
-/obj/machinery/computer/general_air_control/unlinkFrom(mob/user, obj/O)
- ..()
- if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)))
- sensors.Remove(O:id_tag)
- return 1
- return 0
-
-/obj/machinery/computer/general_air_control/linkMenu(obj/O)
- if(isLinkedWith(O))
- return
-
- var/dat=""
-
- if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
- dat += " \[New Sensor\] "
- return dat
-
-/obj/machinery/computer/general_air_control/canLink(obj/O, list/context)
- if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
- return O:id_tag
-
-/obj/machinery/computer/general_air_control/isLinkedWith(obj/O)
- if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
- return O:id_tag in sensors
-
-/obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, context)
- sensors[O:id_tag] = reject_bad_name(clean_input(user, "Choose a sensor label:", "Sensor Label"), allow_numbers=1)
- return 1
-
-/obj/machinery/computer/general_air_control/large_tank_control
- circuit = /obj/item/circuitboard/large_tank_control
- req_one_access_txt = "24;10"
- settagwhitelist = list("input_tag", "output_tag")
-
- var/input_tag
- var/output_tag
-
- var/list/input_info
- var/list/output_info
-
- var/list/input_linkable=list(
- /obj/machinery/atmospherics/unary/outlet_injector,
- /obj/machinery/atmospherics/unary/vent_pump
- )
-
- var/list/output_linkable=list(
- /obj/machinery/atmospherics/unary/vent_pump
- )
-
- var/pressure_setting = ONE_ATMOSPHERE * 45
-
-/obj/machinery/computer/general_air_control/large_tank_control/attackby(I as obj, user as mob)
- if(istype(I, /obj/item/multitool))
- update_multitool_menu(user)
- return 1
- return ..()
-
-
-/obj/machinery/computer/general_air_control/large_tank_control/multitool_menu(mob/user, obj/item/multitool/P)
- var/dat= {"
-
- Sensors:
- "}
- return dat
-
-
-/obj/machinery/computer/general_air_control/large_tank_control/linkWith(mob/user, obj/machinery/atmospherics/unary/O, list/context)
- if(!is_type_in_list(O, input_linkable))
- return FALSE
-
- if(context["slot"] == "input")
- input_tag = O.id_tag
- input_info = null
- if(istype(O, /obj/machinery/atmospherics/unary/vent_pump))
- send_signal(list("tag" = input_tag,
- "direction" = 1, // Release
- "checks" = 0 // No pressure checks.
- ))
- return TRUE
-
- if(context["slot"] == "output")
- output_tag = O.id_tag
- output_info = null
- if(istype(O, /obj/machinery/atmospherics/unary/vent_pump))
- send_signal(list("tag" = output_tag,
- "direction" = 0, // Siphon
- "checks" = 2 // Internal pressure checks.
- ))
- return TRUE
-
-/obj/machinery/computer/general_air_control/large_tank_control/unlinkFrom(mob/user, obj/O)
- if("id_tag" in O.vars)
- if(O:id_tag == input_tag)
- input_tag=null
- input_info=null
- return 1
- if(O:id_tag == output_tag)
- output_tag=null
- output_info=null
- return 1
- return 0
-
-/obj/machinery/computer/general_air_control/large_tank_control/linkMenu(obj/O)
- var/dat=""
- if(canLink(O,list("slot"="input")))
- dat += " \[Link @ Input\] "
- if(canLink(O,list("slot"="output")))
- dat += " \[Link @ Output\] "
- return dat
-
-/obj/machinery/computer/general_air_control/large_tank_control/canLink(obj/O, list/context)
- return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable))
-
-/obj/machinery/computer/general_air_control/large_tank_control/isLinkedWith(obj/O)
- if(O:id_tag == input_tag)
- return 1
- if(O:id_tag == output_tag)
- return 1
- return 0
-
-/obj/machinery/computer/general_air_control/large_tank_control/process()
- ..()
- if(!input_info && input_tag)
- request_device_refresh(input_tag)
- if(!output_info && output_tag)
- request_device_refresh(output_tag)
-
-/obj/machinery/computer/general_air_control/large_tank_control/return_text()
- var/output = ..()
- //if(signal.data)
- // input_info = signal.data // Attempting to fix intake control -- TLE
-
- output += "Tank Control System
"
- if(input_tag)
- if(input_info)
- var/power = (input_info["power"])
- var/volume_rate = input_info["volume_rate"]
- output += {"
-
-"}
- else
- output += "ERROR: Can not find input port Search
"
- if(output_tag)
- if(output_info)
- var/power = (output_info["power"])
- var/output_pressure = output_info["internal"]
- output += {"
-
-"}
- else
- output += "ERROR: Can not find output port Search
"
-
- return output
-
-/obj/machinery/computer/general_air_control/large_tank_control/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
-
- if(input_tag == id_tag)
- input_info = signal.data
- updateUsrDialog()
- else if(output_tag == id_tag)
- output_info = signal.data
- updateUsrDialog()
- else
- ..(signal)
-
-/obj/machinery/computer/general_air_control/large_tank_control/proc/request_device_refresh(device)
- send_signal(list("tag"=device, "status"))
-
-/obj/machinery/computer/general_air_control/large_tank_control/proc/send_signal(list/data)
- if(!radio_connection)
- return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data=data
- signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
-/obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_list)
- if(..())
- return 1
-
- add_fingerprint(usr)
-
- if(href_list["out_set_pressure"])
- var/response=input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num
- pressure_setting = text2num(response)
- pressure_setting = between(0, pressure_setting, 50*ONE_ATMOSPHERE)
-
- if(!radio_connection)
- return 0
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- if(href_list["in_refresh_status"])
- input_info = null
- signal.data = list ("tag" = input_tag, "status" = 1)
-
- else if(href_list["in_toggle_injector"])
- input_info = null
- signal.data = list ("tag" = input_tag, "power_toggle" = 1)
-
- else if(href_list["out_refresh_status"])
- output_info = null
- signal.data = list ("tag" = output_tag, "status" = 1)
-
- else if(href_list["out_toggle_power"])
- output_info = null
- signal.data = list ("tag" = output_tag, "power_toggle" = 1)
-
- else if(href_list["out_set_pressure"])
- output_info = null
- signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]")
- /*else
- testing("Bad Topic() to GAC \"[src.name]\": [href]")
- return*/ // NOPE. // disabling because it spams when multitool menus are used
-
- signal.data["sigtype"] = "command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
- src.updateUsrDialog()
-
-/obj/machinery/computer/general_air_control/fuel_injection
- icon = 'icons/obj/computer.dmi'
- icon_screen = "atmos"
- circuit = /obj/item/circuitboard/injector_control
-
- var/device_tag
- var/list/device_info
-
- var/automation = 0
-
- var/cutoff_temperature = 2000
- var/on_temperature = 1200
-
-/obj/machinery/computer/general_air_control/fuel_injection/attackby(I as obj, user as mob, params)
- if(istype(I, /obj/item/multitool))
- update_multitool_menu(user)
- return 1
- return ..()
-
-/obj/machinery/computer/general_air_control/fuel_injection/process()
- if(automation)
- if(!radio_connection)
- return 0
-
- var/injecting = 0
- for(var/id_tag in sensor_information)
- var/list/data = sensor_information[id_tag]
- if(data["temperature"])
- if(data["temperature"] >= cutoff_temperature)
- injecting = 0
- break
- if(data["temperature"] <= on_temperature)
- injecting = 1
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
- "tag" = device_tag,
- "power" = injecting,
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- ..()
-
-/obj/machinery/computer/general_air_control/fuel_injection/return_text()
- var/output = ..()
- output += ""
-
- return output
-
-/obj/machinery/computer/general_air_control/fuel_injection/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
-
- if(device_tag == id_tag)
- device_info = signal.data
- else
- ..(signal)
-
-/obj/machinery/computer/general_air_control/fuel_injection/Topic(href, href_list)
- if(..())
- return
-
- if(href_list["refresh_status"])
- device_info = null
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "status",
- "sigtype"="command"
- )
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- if(href_list["toggle_automation"])
- automation = !automation
-
- if(href_list["toggle_injector"])
- device_info = null
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "power_toggle",
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- if(href_list["injection"])
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "inject",
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm
deleted file mode 100644
index 773432133e8..00000000000
--- a/code/game/machinery/atmoalter/zvent.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/obj/machinery/zvent
- name = "Interfloor Air Transfer System"
-
- icon = 'icons/obj/pipes.dmi'
- icon_state = "vent-db"
- density = 0
- anchored=1
-
- var/on = 0
- var/volume_rate = 800
-
-/obj/machinery/zvent/New()
- ..()
- SSair.atmos_machinery += src
-
-/obj/machinery/zvent/Destroy()
- SSair.atmos_machinery -= src
- return ..()
-
-/obj/machinery/zvent/process_atmos()
-
- //all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
- if(istype(loc,/turf/simulated)) //if we're not on a valid turf, forget it
- for(var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented
- var/turf/simulated/zturf_conn = locate(x,y,z+new_z)
- if(istype(zturf_conn))
- var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn
- if(istype(zvent_conn))
- //both floors have simulated turfs, share()
- var/turf/simulated/myturf = loc
- var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference
- var/datum/gas_mixture/my_air = myturf.air
- if(istype(conn_air) && istype(my_air))
- my_air.share(conn_air)
- air_update_turf()
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 7083986242f..a5898d87a4c 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -1,3 +1,745 @@
+/obj/machinery/air_sensor
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "gsensor1"
+ resistance_flags = FIRE_PROOF
+ name = "gas sensor"
+ req_one_access_txt = "24;10"
+
+ anchored = 1
+ var/state = 0
+ var/bolts = 1
+
+ var/id_tag
+ frequency = ATMOS_VENTSCRUB
+ Mtoollink = 1
+ settagwhitelist = list("id_tag")
+
+ var/on = 1
+ var/output = 3
+ //Flags:
+ // 1 for pressure
+ // 2 for temperature
+ // Output >= 4 includes gas composition
+ // 4 for oxygen concentration
+ // 8 for toxins concentration
+ // 16 for nitrogen concentration
+ // 32 for carbon dioxide concentration
+
+/obj/machinery/air_sensor/update_icon()
+ icon_state = "gsensor[on]"
+
+/obj/machinery/air_sensor/multitool_menu(var/mob/user, var/obj/item/multitool/P)
+ return {"
+ Main
+ "}
+
+/obj/machinery/air_sensor/multitool_topic(var/mob/user, var/list/href_list, var/obj/O)
+ . = ..()
+ if(.)
+ return .
+
+ if("toggle_out_flag" in href_list)
+ var/bitflag_value = text2num(href_list["toggle_out_flag"])//this is a string normally
+ if(!(bitflag_value in list(1, 2, 4, 8, 16, 32))) //Here to prevent breaking the sensors with HREF exploits
+ return 0
+ if(output&bitflag_value)//the bitflag is on ATM
+ output &= ~bitflag_value
+ else//can't not be off
+ output |= bitflag_value
+ return TRUE
+ if("toggle_bolts" in href_list)
+ bolts = !bolts
+ if(bolts)
+ visible_message("You hear a quite click as the [src] bolts to the floor", "You hear a quite click")
+ else
+ visible_message("You hear a quite click as the [src]'s floor bolts raise", "You hear a quite click")
+ return TRUE
+
+/obj/machinery/air_sensor/attackby(var/obj/item/W as obj, var/mob/user as mob)
+ if(istype(W, /obj/item/multitool))
+ update_multitool_menu(user)
+ return 1
+ if(istype(W, /obj/item/wrench))
+ if(bolts)
+ to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.")
+ return 1
+ playsound(loc, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]...")
+ if(do_after(user, 40 * W.toolspeed, target = src))
+ user.visible_message("[user] unfastens \the [src].", "You have unfastened \the [src].", "You hear ratchet.")
+ new /obj/item/pipe_gsensor(src.loc)
+ qdel(src)
+ return 1
+ return
+ return ..()
+
+/obj/machinery/air_sensor/process_atmos()
+ if(on)
+ if(!radio_connection)
+ return
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = id_tag
+ signal.data["timestamp"] = world.time
+
+ var/datum/gas_mixture/air_sample = return_air()
+
+ if(output&1)
+ signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),)
+ if(output&2)
+ signal.data["temperature"] = round(air_sample.temperature,0.1)
+
+ if(output>4)
+ var/total_moles = air_sample.total_moles()
+ if(total_moles > 0)
+ if(output&4)
+ signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1)
+ if(output&8)
+ signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1)
+ if(output&16)
+ signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1)
+ if(output&32)
+ signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1)
+ else
+ signal.data["oxygen"] = 0
+ signal.data["toxins"] = 0
+ signal.data["nitrogen"] = 0
+ signal.data["carbon_dioxide"] = 0
+ signal.data["sigtype"]="status"
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+/obj/machinery/air_sensor/set_frequency(new_frequency)
+ SSradio.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
+
+/obj/machinery/air_sensor/Initialize()
+ ..()
+ SSair.atmos_machinery += src
+ set_frequency(frequency)
+
+/obj/machinery/air_sensor/Destroy()
+ SSair.atmos_machinery -= src
+ if(SSradio)
+ SSradio.remove_object(src, frequency)
+ radio_connection = null
+ return ..()
+
+
+/obj/machinery/computer/general_air_control
+ icon = 'icons/obj/computer.dmi'
+ icon_screen = "tank"
+ icon_keyboard = "atmos_key"
+ circuit = /obj/item/circuitboard/air_management
+ req_one_access_txt = "24;10"
+
+ name = "Computer"
+
+ frequency = ATMOS_VENTSCRUB
+ var/show_sensors=1
+ var/list/sensors = list()
+ Mtoollink = 1
+
+ var/list/sensor_information = list()
+
+/obj/machinery/computer/general_air_control/Destroy()
+ if(SSradio)
+ SSradio.remove_object(src, frequency)
+ radio_connection = null
+ return ..()
+
+/obj/machinery/computer/general_air_control/attack_hand(mob/user)
+ if(..(user))
+ return
+ var/html=return_text()
+ var/datum/browser/popup = new(user, "gac", name, 400, 400)
+ popup.set_content(html)
+ popup.open(0)
+ user.set_machine(src)
+ onclose(user, "gac")
+
+/obj/machinery/computer/general_air_control/process()
+ ..()
+ if(!sensors)
+ //warning("[src.type] at [x],[y],[z] has null sensors. Please fix.")//commenting this line out because the admins will get a warning like this every time somebody builds another GAC
+ sensors = list()
+ src.updateUsrDialog()
+
+/obj/machinery/computer/general_air_control/attackby(I as obj, user as mob, params)
+ if(istype(I, /obj/item/multitool))
+ update_multitool_menu(user)
+ return 1
+ return ..()
+
+
+/obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+ if(!id_tag || !sensors || !sensors.Find(id_tag)) return
+
+ sensor_information[id_tag] = signal.data
+
+/obj/machinery/computer/general_air_control/proc/return_text()
+ var/sensor_data
+ if(show_sensors)
+ if(sensors.len)
+ for(var/id_tag in sensors)
+ var/long_name = sensors[id_tag]
+ var/list/data = sensor_information[id_tag]
+ var/sensor_part = ""
+ sensor_data += sensor_part
+
+ else
+ sensor_data = "No sensors connected."
+
+ var/output = {"
+
+ [show_sensors ? "Sensor Data:
" + sensor_data : ""]
+ "}
+
+ return output
+
+/obj/machinery/computer/general_air_control/set_frequency(new_frequency)
+ SSradio.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
+
+/obj/machinery/computer/general_air_control/Initialize()
+ ..()
+ set_frequency(frequency)
+
+/obj/machinery/computer/general_air_control/multitool_menu(mob/user, obj/item/multitool/P)
+ var/dat= {"
+ Main
+
+ Sensors:
+ "}
+ return dat
+
+/obj/machinery/computer/general_air_control/multitool_topic(mob/user,list/href_list,obj/O)
+ . = ..()
+ if(.) return .
+ if("add_sensor" in href_list)
+
+ // Make a list of all available sensors on the same frequency
+ var/list/sensor_list = list()
+ for(var/obj/machinery/air_sensor/G in GLOB.machines)
+ if(!isnull(G.id_tag) && G.frequency == frequency)
+ sensor_list|=G.id_tag
+ if(!sensor_list.len)
+ to_chat(user, "No sensors on this frequency.")
+ return FALSE
+
+ // Have the user pick one of them and name its label
+ var/sensor = input(user, "Select a sensor:", "Sensor Data") as null|anything in sensor_list
+ if(!sensor)
+ return FALSE
+ var/label = reject_bad_name( input(user, "Choose a sensor label:", "Sensor Label") as text|null, allow_numbers=1)
+ if(!label)
+ return FALSE
+
+ // Add the sensor's information to general_air_controler
+ sensors[sensor] = label
+ return TRUE
+
+ if("edit_sensor" in href_list)
+ var/list/sensor_list = list()
+ for(var/obj/machinery/air_sensor/G in GLOB.machines)
+ if(!isnull(G.id_tag) && G.frequency == frequency)
+ sensor_list|=G.id_tag
+ if(!sensor_list.len)
+ to_chat(user, "No sensors on this frequency.")
+ return FALSE
+ var/label = sensors[href_list["edit_sensor"]]
+ var/sensor = input(user, "Select a sensor:", "Sensor Data", href_list["edit_sensor"]) as null|anything in sensor_list
+ if(!sensor)
+ return FALSE
+ sensors.Remove(href_list["edit_sensor"])
+ sensors[sensor] = label
+ return TRUE
+
+/obj/machinery/computer/general_air_control/unlinkFrom(mob/user, obj/O)
+ ..()
+ if("id_tag" in O.vars && (istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter)))
+ sensors.Remove(O:id_tag)
+ return 1
+ return 0
+
+/obj/machinery/computer/general_air_control/linkMenu(obj/O)
+ if(isLinkedWith(O))
+ return
+
+ var/dat=""
+
+ if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
+ dat += " \[New Sensor\] "
+ return dat
+
+/obj/machinery/computer/general_air_control/canLink(obj/O, list/context)
+ if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
+ return O:id_tag
+
+/obj/machinery/computer/general_air_control/isLinkedWith(obj/O)
+ if(istype(O,/obj/machinery/air_sensor) || istype(O, /obj/machinery/meter))
+ return O:id_tag in sensors
+
+/obj/machinery/computer/general_air_control/linkWith(mob/user, obj/O, context)
+ sensors[O:id_tag] = reject_bad_name(clean_input(user, "Choose a sensor label:", "Sensor Label"), allow_numbers=1)
+ return 1
+
+/obj/machinery/computer/general_air_control/large_tank_control
+ circuit = /obj/item/circuitboard/large_tank_control
+ req_one_access_txt = "24;10"
+ settagwhitelist = list("input_tag", "output_tag")
+
+ var/input_tag
+ var/output_tag
+
+ var/list/input_info
+ var/list/output_info
+
+ var/list/input_linkable=list(
+ /obj/machinery/atmospherics/unary/outlet_injector,
+ /obj/machinery/atmospherics/unary/vent_pump
+ )
+
+ var/list/output_linkable=list(
+ /obj/machinery/atmospherics/unary/vent_pump
+ )
+
+ var/pressure_setting = ONE_ATMOSPHERE * 45
+
+/obj/machinery/computer/general_air_control/large_tank_control/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/multitool))
+ update_multitool_menu(user)
+ return 1
+ return ..()
+
+
+/obj/machinery/computer/general_air_control/large_tank_control/multitool_menu(mob/user, obj/item/multitool/P)
+ var/dat= {"
+
+ Sensors:
+ "}
+ return dat
+
+
+/obj/machinery/computer/general_air_control/large_tank_control/linkWith(mob/user, obj/machinery/atmospherics/unary/O, list/context)
+ if(!is_type_in_list(O, input_linkable))
+ return FALSE
+
+ if(context["slot"] == "input")
+ input_tag = O.id_tag
+ input_info = null
+ if(istype(O, /obj/machinery/atmospherics/unary/vent_pump))
+ send_signal(list("tag" = input_tag,
+ "direction" = 1, // Release
+ "checks" = 0 // No pressure checks.
+ ))
+ return TRUE
+
+ if(context["slot"] == "output")
+ output_tag = O.id_tag
+ output_info = null
+ if(istype(O, /obj/machinery/atmospherics/unary/vent_pump))
+ send_signal(list("tag" = output_tag,
+ "direction" = 0, // Siphon
+ "checks" = 2 // Internal pressure checks.
+ ))
+ return TRUE
+
+/obj/machinery/computer/general_air_control/large_tank_control/unlinkFrom(mob/user, obj/O)
+ if("id_tag" in O.vars)
+ if(O:id_tag == input_tag)
+ input_tag=null
+ input_info=null
+ return 1
+ if(O:id_tag == output_tag)
+ output_tag=null
+ output_info=null
+ return 1
+ return 0
+
+/obj/machinery/computer/general_air_control/large_tank_control/linkMenu(obj/O)
+ var/dat=""
+ if(canLink(O,list("slot"="input")))
+ dat += " \[Link @ Input\] "
+ if(canLink(O,list("slot"="output")))
+ dat += " \[Link @ Output\] "
+ return dat
+
+/obj/machinery/computer/general_air_control/large_tank_control/canLink(obj/O, list/context)
+ return (context["slot"]=="input" && is_type_in_list(O,input_linkable)) || (context["slot"]=="output" && is_type_in_list(O,output_linkable))
+
+/obj/machinery/computer/general_air_control/large_tank_control/isLinkedWith(obj/O)
+ if(O:id_tag == input_tag)
+ return 1
+ if(O:id_tag == output_tag)
+ return 1
+ return 0
+
+/obj/machinery/computer/general_air_control/large_tank_control/process()
+ ..()
+ if(!input_info && input_tag)
+ request_device_refresh(input_tag)
+ if(!output_info && output_tag)
+ request_device_refresh(output_tag)
+
+/obj/machinery/computer/general_air_control/large_tank_control/return_text()
+ var/output = ..()
+ //if(signal.data)
+ // input_info = signal.data // Attempting to fix intake control -- TLE
+
+ output += "Tank Control System
"
+ if(input_tag)
+ if(input_info)
+ var/power = (input_info["power"])
+ var/volume_rate = input_info["volume_rate"]
+ output += {"
+
+"}
+ else
+ output += "ERROR: Can not find input port Search
"
+ if(output_tag)
+ if(output_info)
+ var/power = (output_info["power"])
+ var/output_pressure = output_info["internal"]
+ output += {"
+
+"}
+ else
+ output += "ERROR: Can not find output port Search
"
+
+ return output
+
+/obj/machinery/computer/general_air_control/large_tank_control/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+
+ if(input_tag == id_tag)
+ input_info = signal.data
+ updateUsrDialog()
+ else if(output_tag == id_tag)
+ output_info = signal.data
+ updateUsrDialog()
+ else
+ ..(signal)
+
+/obj/machinery/computer/general_air_control/large_tank_control/proc/request_device_refresh(device)
+ send_signal(list("tag"=device, "status"))
+
+/obj/machinery/computer/general_air_control/large_tank_control/proc/send_signal(list/data)
+ if(!radio_connection)
+ return
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data=data
+ signal.data["sigtype"]="command"
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+/obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_list)
+ if(..())
+ return 1
+
+ add_fingerprint(usr)
+
+ if(href_list["out_set_pressure"])
+ var/response=input(usr,"Set new pressure, in kPa. \[0-[50*ONE_ATMOSPHERE]\]") as num
+ pressure_setting = text2num(response)
+ pressure_setting = between(0, pressure_setting, 50*ONE_ATMOSPHERE)
+
+ if(!radio_connection)
+ return 0
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ if(href_list["in_refresh_status"])
+ input_info = null
+ signal.data = list ("tag" = input_tag, "status" = 1)
+
+ else if(href_list["in_toggle_injector"])
+ input_info = null
+ signal.data = list ("tag" = input_tag, "power_toggle" = 1)
+
+ else if(href_list["out_refresh_status"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "status" = 1)
+
+ else if(href_list["out_toggle_power"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "power_toggle" = 1)
+
+ else if(href_list["out_set_pressure"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]")
+ /*else
+ testing("Bad Topic() to GAC \"[src.name]\": [href]")
+ return*/ // NOPE. // disabling because it spams when multitool menus are used
+
+ signal.data["sigtype"] = "command"
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ src.updateUsrDialog()
+
+/obj/machinery/computer/general_air_control/fuel_injection
+ icon = 'icons/obj/computer.dmi'
+ icon_screen = "atmos"
+ circuit = /obj/item/circuitboard/injector_control
+
+ var/device_tag
+ var/list/device_info
+
+ var/automation = 0
+
+ var/cutoff_temperature = 2000
+ var/on_temperature = 1200
+
+/obj/machinery/computer/general_air_control/fuel_injection/attackby(I as obj, user as mob, params)
+ if(istype(I, /obj/item/multitool))
+ update_multitool_menu(user)
+ return 1
+ return ..()
+
+/obj/machinery/computer/general_air_control/fuel_injection/process()
+ if(automation)
+ if(!radio_connection)
+ return 0
+
+ var/injecting = 0
+ for(var/id_tag in sensor_information)
+ var/list/data = sensor_information[id_tag]
+ if(data["temperature"])
+ if(data["temperature"] >= cutoff_temperature)
+ injecting = 0
+ break
+ if(data["temperature"] <= on_temperature)
+ injecting = 1
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+
+ signal.data = list(
+ "tag" = device_tag,
+ "power" = injecting,
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ ..()
+
+/obj/machinery/computer/general_air_control/fuel_injection/return_text()
+ var/output = ..()
+ output += ""
+
+ return output
+
+/obj/machinery/computer/general_air_control/fuel_injection/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+
+ if(device_tag == id_tag)
+ device_info = signal.data
+ else
+ ..(signal)
+
+/obj/machinery/computer/general_air_control/fuel_injection/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["refresh_status"])
+ device_info = null
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "status",
+ "sigtype"="command"
+ )
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ if(href_list["toggle_automation"])
+ automation = !automation
+
+ if(href_list["toggle_injector"])
+ device_info = null
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "power_toggle",
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ if(href_list["injection"])
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "inject",
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
/obj/machinery/computer/atmoscontrol
name = "\improper central atmospherics computer"
icon = 'icons/obj/computer.dmi'
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index a8c9710ff6c..d434dbff73c 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -1,3 +1,6 @@
+#define CIRC_LEFT WEST
+#define CIRC_RIGHT EAST
+
/obj/item/pipe
name = "pipe"
desc = "A pipe"
diff --git a/code/LINDA/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
similarity index 100%
rename from code/LINDA/LINDA_fire.dm
rename to code/modules/atmospherics/environmental/LINDA_fire.dm
diff --git a/code/LINDA/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm
similarity index 100%
rename from code/LINDA/LINDA_system.dm
rename to code/modules/atmospherics/environmental/LINDA_system.dm
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
similarity index 100%
rename from code/LINDA/LINDA_turf_tile.dm
rename to code/modules/atmospherics/environmental/LINDA_turf_tile.dm
diff --git a/code/datums/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
similarity index 100%
rename from code/datums/gas_mixture.dm
rename to code/modules/atmospherics/gasmixtures/gas_mixture.dm
diff --git a/code/game/machinery/alarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
similarity index 100%
rename from code/game/machinery/alarm.dm
rename to code/modules/atmospherics/machinery/airalarm.dm
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm
similarity index 100%
rename from code/ATMOSPHERICS/atmospherics.dm
rename to code/modules/atmospherics/machinery/atmospherics.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
similarity index 96%
rename from code/ATMOSPHERICS/components/binary_devices/circulator.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index b45dd8929b4..ae45d15a6e1 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -1,8 +1,3 @@
-//node1, air1, network1 correspond to input
-//node2, air2, network2 correspond to output
-#define CIRC_LEFT WEST
-#define CIRC_RIGHT EAST
-
/obj/machinery/atmospherics/binary/circulator
name = "circulator/heat exchanger"
desc = "A gas circulator pump and heat exchanger. Its input port is on the south side, and its output port is on the north side."
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/pump.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/pump.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/valve.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/valve.dm
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
rename to code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/trinary_devices/filter.dm
rename to code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/trinary_devices/mixer.dm
rename to code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
rename to code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm
diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/trinary_devices/tvalve.dm
rename to code/modules/atmospherics/machinery/components/trinary_devices/tvalve.dm
diff --git a/code/game/machinery/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
similarity index 100%
rename from code/game/machinery/cryo.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/generator_input.dm b/code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/generator_input.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/generator_input.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/heat_exchanger.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm b/code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/oxygen_generator.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/oxygen_generator.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/passive_vent.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/portables_connector.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/tank.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/tank.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermal_plate.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/thermal_plate.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/thermomachine.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/unary_base.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/unary_base.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
similarity index 100%
rename from code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
rename to code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
diff --git a/code/ATMOSPHERICS/datum_icon_manager.dm b/code/modules/atmospherics/machinery/datum_icon_manager.dm
similarity index 100%
rename from code/ATMOSPHERICS/datum_icon_manager.dm
rename to code/modules/atmospherics/machinery/datum_icon_manager.dm
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm
similarity index 100%
rename from code/ATMOSPHERICS/datum_pipeline.dm
rename to code/modules/atmospherics/machinery/datum_pipeline.dm
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/modules/atmospherics/machinery/other/area_atmos_computer.dm
similarity index 100%
rename from code/game/machinery/atmoalter/area_atmos_computer.dm
rename to code/modules/atmospherics/machinery/other/area_atmos_computer.dm
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
similarity index 100%
rename from code/game/machinery/atmoalter/meter.dm
rename to code/modules/atmospherics/machinery/other/meter.dm
diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/modules/atmospherics/machinery/pipes/cap.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/cap.dm
rename to code/modules/atmospherics/machinery/pipes/cap.dm
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/modules/atmospherics/machinery/pipes/manifold.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/manifold.dm
rename to code/modules/atmospherics/machinery/pipes/manifold.dm
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/modules/atmospherics/machinery/pipes/manifold4w.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/manifold4w.dm
rename to code/modules/atmospherics/machinery/pipes/manifold4w.dm
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/modules/atmospherics/machinery/pipes/pipe.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/pipe.dm
rename to code/modules/atmospherics/machinery/pipes/pipe.dm
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
rename to code/modules/atmospherics/machinery/pipes/simple/pipe_simple.dm
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple_he.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
rename to code/modules/atmospherics/machinery/pipes/simple/pipe_simple_he.dm
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple_hidden.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm
rename to code/modules/atmospherics/machinery/pipes/simple/pipe_simple_hidden.dm
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_insulated.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple_insulated.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/simple/pipe_simple_insulated.dm
rename to code/modules/atmospherics/machinery/pipes/simple/pipe_simple_insulated.dm
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/modules/atmospherics/machinery/pipes/simple/pipe_simple_visible.dm
similarity index 100%
rename from code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm
rename to code/modules/atmospherics/machinery/pipes/simple/pipe_simple_visible.dm
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
similarity index 100%
rename from code/game/machinery/atmoalter/canister.dm
rename to code/modules/atmospherics/machinery/portable/canister.dm
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
similarity index 100%
rename from code/game/machinery/atmoalter/portable_atmospherics.dm
rename to code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm
similarity index 100%
rename from code/game/machinery/atmoalter/pump.dm
rename to code/modules/atmospherics/machinery/portable/pump.dm
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm
similarity index 100%
rename from code/game/machinery/atmoalter/scrubber.dm
rename to code/modules/atmospherics/machinery/portable/scrubber.dm
diff --git a/paradise.dme b/paradise.dme
index 8b2dffd29f6..1c4b94cbb2e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -178,41 +178,6 @@
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\slime.dm"
#include "code\_onclick\hud\swarmer.dm"
-#include "code\ATMOSPHERICS\atmospherics.dm"
-#include "code\ATMOSPHERICS\datum_icon_manager.dm"
-#include "code\ATMOSPHERICS\datum_pipeline.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\pump.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\valve.dm"
-#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm"
-#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm"
-#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm"
-#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm"
-#include "code\ATMOSPHERICS\components\trinary_devices\tvalve.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\generator_input.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\heat_exchanger.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\outlet_injector.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\oxygen_generator.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\passive_vent.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\portables_connector.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\tank.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\thermal_plate.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\thermomachine.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\unary_base.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\vent_pump.dm"
-#include "code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm"
-#include "code\ATMOSPHERICS\pipes\cap.dm"
-#include "code\ATMOSPHERICS\pipes\manifold.dm"
-#include "code\ATMOSPHERICS\pipes\manifold4w.dm"
-#include "code\ATMOSPHERICS\pipes\pipe.dm"
-#include "code\ATMOSPHERICS\pipes\simple\pipe_simple.dm"
-#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_he.dm"
-#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_hidden.dm"
-#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_insulated.dm"
-#include "code\ATMOSPHERICS\pipes\simple\pipe_simple_visible.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\controller.dm"
#include "code\controllers\failsafe.dm"
@@ -291,7 +256,6 @@
#include "code\datums\datumvars.dm"
#include "code\datums\discord.dm"
#include "code\datums\dog_fashion.dm"
-#include "code\datums\gas_mixture.dm"
#include "code\datums\holocall.dm"
#include "code\datums\http.dm"
#include "code\datums\hud.dm"
@@ -659,15 +623,12 @@
#include "code\game\jobs\job_objectives\science.dm"
#include "code\game\machinery\adv_med.dm"
#include "code\game\machinery\ai_slipper.dm"
-#include "code\game\machinery\alarm.dm"
-#include "code\game\machinery\atmo_control.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
#include "code\game\machinery\constructable_frame.dm"
-#include "code\game\machinery\cryo.dm"
#include "code\game\machinery\cryopod.dm"
#include "code\game\machinery\dance_machine.dm"
#include "code\game\machinery\defib_mount.dm"
@@ -716,13 +677,6 @@
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
-#include "code\game\machinery\atmoalter\area_atmos_computer.dm"
-#include "code\game\machinery\atmoalter\canister.dm"
-#include "code\game\machinery\atmoalter\meter.dm"
-#include "code\game\machinery\atmoalter\portable_atmospherics.dm"
-#include "code\game\machinery\atmoalter\pump.dm"
-#include "code\game\machinery\atmoalter\scrubber.dm"
-#include "code\game\machinery\atmoalter\zvent.dm"
#include "code\game\machinery\camera\camera.dm"
#include "code\game\machinery\camera\camera_assembly.dm"
#include "code\game\machinery\camera\motion.dm"
@@ -1194,9 +1148,6 @@
#include "code\game\verbs\randomtip.dm"
#include "code\game\verbs\suicide.dm"
#include "code\game\verbs\who.dm"
-#include "code\LINDA\LINDA_fire.dm"
-#include "code\LINDA\LINDA_system.dm"
-#include "code\LINDA\LINDA_turf_tile.dm"
#include "code\modules\admin\admin.dm"
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
@@ -1316,6 +1267,53 @@
#include "code\modules\assembly\signaler.dm"
#include "code\modules\assembly\timer.dm"
#include "code\modules\assembly\voice.dm"
+#include "code\modules\atmospherics\environmental\LINDA_fire.dm"
+#include "code\modules\atmospherics\environmental\LINDA_system.dm"
+#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm"
+#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm"
+#include "code\modules\atmospherics\machinery\airalarm.dm"
+#include "code\modules\atmospherics\machinery\atmospherics.dm"
+#include "code\modules\atmospherics\machinery\datum_icon_manager.dm"
+#include "code\modules\atmospherics\machinery\datum_pipeline.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\binary_atmos_base.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_base.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\tvalve.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\generator_input.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\oxygen_generator.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\thermal_plate.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\unary_base.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm"
+#include "code\modules\atmospherics\machinery\other\area_atmos_computer.dm"
+#include "code\modules\atmospherics\machinery\other\meter.dm"
+#include "code\modules\atmospherics\machinery\pipes\cap.dm"
+#include "code\modules\atmospherics\machinery\pipes\manifold.dm"
+#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm"
+#include "code\modules\atmospherics\machinery\pipes\pipe.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple\pipe_simple.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple\pipe_simple_he.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple\pipe_simple_hidden.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple\pipe_simple_insulated.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple\pipe_simple_visible.dm"
+#include "code\modules\atmospherics\machinery\portable\canister.dm"
+#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm"
+#include "code\modules\atmospherics\machinery\portable\pump.dm"
+#include "code\modules\atmospherics\machinery\portable\scrubber.dm"
#include "code\modules\awaymissions\corpse.dm"
#include "code\modules\awaymissions\exile.dm"
#include "code\modules\awaymissions\gateway.dm"