diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index 8528d636be2..080c7a24993 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -1,4 +1,4 @@
-obj/machinery/atmospherics/binary
+/obj/machinery/atmospherics/binary
dir = SOUTH
initialize_directions = SOUTH|NORTH
use_power = 1
@@ -9,126 +9,132 @@ obj/machinery/atmospherics/binary
var/datum/pipe_network/network1
var/datum/pipe_network/network2
- Initialize()
- switch(dir)
- if(NORTH)
- initialize_directions = NORTH|SOUTH
- if(SOUTH)
- initialize_directions = NORTH|SOUTH
- if(EAST)
- initialize_directions = EAST|WEST
- if(WEST)
- initialize_directions = EAST|WEST
- air1 = new
- air2 = new
+/obj/machinery/atmospherics/binary/Initialize()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = NORTH|SOUTH
+ if(EAST)
+ initialize_directions = EAST|WEST
+ if(WEST)
+ initialize_directions = EAST|WEST
+ air1 = new
+ air2 = new
- air1.volume = 200
- air2.volume = 200
- . = ..()
+ air1.volume = 200
+ air2.volume = 200
+ . = ..()
// Housekeeping and pipe network stuff below
- network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
- if(reference == node1)
- network1 = new_network
+/obj/machinery/atmospherics/binary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
+ if(reference == node1)
+ network1 = new_network
- else if(reference == node2)
- network2 = new_network
+ else if(reference == node2)
+ network2 = new_network
- if(new_network.normal_members.Find(src))
- return 0
+ if(new_network.normal_members.Find(src))
+ return 0
- new_network.normal_members += src
+ new_network.normal_members += src
- return null
+ return null
- Destroy()
- QDEL_NULL(air1)
- QDEL_NULL(air2)
+/obj/machinery/atmospherics/binary/Destroy()
+ QDEL_NULL(air1)
+ QDEL_NULL(air2)
- if(node1)
- node1.disconnect(src)
- QDEL_NULL(network1)
- if(node2)
- node2.disconnect(src)
- QDEL_NULL(network2)
+ if(node1)
+ node1.disconnect(src)
+ QDEL_NULL(network1)
+ if(node2)
+ node2.disconnect(src)
+ QDEL_NULL(network2)
+ node1 = null
+ node2 = null
+
+ return ..()
+
+/obj/machinery/atmospherics/binary/atmos_init()
+ if(node1 && node2) return
+
+ var/node2_connect = dir
+ var/node1_connect = turn(dir, 180)
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ if (check_connect_types(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ if (check_connect_types(target,src))
+ node2 = target
+ break
+
+ update_icon()
+ update_underlays()
+
+/obj/machinery/atmospherics/binary/build_network()
+ if(!network1 && node1)
+ network1 = new /datum/pipe_network()
+ network1.normal_members += src
+ network1.build_network(node1, src)
+
+ if(!network2 && node2)
+ network2 = new /datum/pipe_network()
+ network2.normal_members += src
+ network2.build_network(node2, src)
+
+
+/obj/machinery/atmospherics/binary/return_network(obj/machinery/atmospherics/reference)
+ build_network()
+
+ if(reference==node1)
+ return network1
+
+ if(reference==node2)
+ return network2
+
+ return null
+
+/obj/machinery/atmospherics/binary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
+ if(network1 == old_network)
+ network1 = new_network
+ if(network2 == old_network)
+ network2 = new_network
+
+ return 1
+
+/obj/machinery/atmospherics/binary/return_network_air(datum/pipe_network/reference)
+ var/list/results = list()
+
+ if(network1 == reference)
+ results += air1
+ if(network2 == reference)
+ results += air2
+
+ return results
+
+/obj/machinery/atmospherics/binary/disconnect(obj/machinery/atmospherics/reference)
+ if(reference==node1)
+ qdel(network1)
node1 = null
+
+ else if(reference==node2)
+ qdel(network2)
node2 = null
- return ..()
+ update_icon()
+ update_underlays()
- atmos_init()
- if(node1 && node2) return
+ return null
- var/node2_connect = dir
- var/node1_connect = turn(dir, 180)
-
- for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
- if(target.initialize_directions & get_dir(target,src))
- if (check_connect_types(target,src))
- node1 = target
- break
-
- for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
- if(target.initialize_directions & get_dir(target,src))
- if (check_connect_types(target,src))
- node2 = target
- break
-
- update_icon()
- update_underlays()
-
- build_network()
- if(!network1 && node1)
- network1 = new /datum/pipe_network()
- network1.normal_members += src
- network1.build_network(node1, src)
-
- if(!network2 && node2)
- network2 = new /datum/pipe_network()
- network2.normal_members += src
- network2.build_network(node2, src)
-
-
- return_network(obj/machinery/atmospherics/reference)
- build_network()
-
- if(reference==node1)
- return network1
-
- if(reference==node2)
- return network2
-
- return null
-
- reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
- if(network1 == old_network)
- network1 = new_network
- if(network2 == old_network)
- network2 = new_network
-
- return 1
-
- return_network_air(datum/pipe_network/reference)
- var/list/results = list()
-
- if(network1 == reference)
- results += air1
- if(network2 == reference)
- results += air2
-
- return results
-
- disconnect(obj/machinery/atmospherics/reference)
- if(reference==node1)
- qdel(network1)
- node1 = null
-
- else if(reference==node2)
- qdel(network2)
- node2 = null
-
- update_icon()
- update_underlays()
-
- return null
+/obj/machinery/atmospherics/binary/AltClick(var/mob/user)
+ if(!allowed(user))
+ to_chat(user, SPAN_WARNING("Access denied."))
+ return
+ Topic(src, list("power" = "1"))
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index 12972a9bced..663205a616e 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -278,3 +278,9 @@
update_ports()
return null
+
+/obj/machinery/atmospherics/omni/AltClick(var/mob/user)
+ if(!allowed(user))
+ to_chat(user, SPAN_WARNING("Access denied."))
+ return
+ Topic(src, list("power" = "1"))
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index d3a3d93ed6d..4acb13e90fb 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -1,4 +1,4 @@
-obj/machinery/atmospherics/trinary
+/obj/machinery/atmospherics/trinary
dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
use_power = 0
@@ -13,157 +13,163 @@ obj/machinery/atmospherics/trinary
var/datum/pipe_network/network2
var/datum/pipe_network/network3
- Initialize()
- switch(dir)
- if(NORTH)
- initialize_directions = EAST|NORTH|SOUTH
- if(SOUTH)
- initialize_directions = SOUTH|WEST|NORTH
- if(EAST)
- initialize_directions = EAST|WEST|SOUTH
- if(WEST)
- initialize_directions = WEST|NORTH|EAST
- air1 = new
- air2 = new
- air3 = new
+/obj/machinery/atmospherics/trinary/Initialize()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = EAST|NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = SOUTH|WEST|NORTH
+ if(EAST)
+ initialize_directions = EAST|WEST|SOUTH
+ if(WEST)
+ initialize_directions = WEST|NORTH|EAST
+ air1 = new
+ air2 = new
+ air3 = new
- air1.volume = 200
- air2.volume = 200
- air3.volume = 200
- . = ..()
+ air1.volume = 200
+ air2.volume = 200
+ air3.volume = 200
+ . = ..()
// Housekeeping and pipe network stuff below
- network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
- if(reference == node1)
- network1 = new_network
+/obj/machinery/atmospherics/trinary/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference)
+ if(reference == node1)
+ network1 = new_network
- else if(reference == node2)
- network2 = new_network
+ else if(reference == node2)
+ network2 = new_network
- else if (reference == node3)
- network3 = new_network
+ else if (reference == node3)
+ network3 = new_network
- if(new_network.normal_members.Find(src))
- return 0
+ if(new_network.normal_members.Find(src))
+ return 0
- new_network.normal_members += src
+ new_network.normal_members += src
- return null
+ return null
- Destroy()
- QDEL_NULL(air1)
- QDEL_NULL(air2)
- QDEL_NULL(air3)
+/obj/machinery/atmospherics/trinary/Destroy()
+ QDEL_NULL(air1)
+ QDEL_NULL(air2)
+ QDEL_NULL(air3)
- if(node1)
- node1.disconnect(src)
- QDEL_NULL(network1)
- if(node2)
- node2.disconnect(src)
- QDEL_NULL(network2)
- if(node3)
- node3.disconnect(src)
- QDEL_NULL(network3)
+ if(node1)
+ node1.disconnect(src)
+ QDEL_NULL(network1)
+ if(node2)
+ node2.disconnect(src)
+ QDEL_NULL(network2)
+ if(node3)
+ node3.disconnect(src)
+ QDEL_NULL(network3)
+ node1 = null
+ node2 = null
+ node3 = null
+
+ return ..()
+
+/obj/machinery/atmospherics/trinary/atmos_init()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -180)
+ var/node2_connect = turn(dir, -90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ if (check_connect_types(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ if (check_connect_types(target,src))
+ node2 = target
+ break
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ if (check_connect_types(target,src))
+ node3 = target
+ break
+
+ update_icon()
+ update_underlays()
+
+/obj/machinery/atmospherics/trinary/build_network()
+ if(!network1 && node1)
+ network1 = new /datum/pipe_network()
+ network1.normal_members += src
+ network1.build_network(node1, src)
+
+ if(!network2 && node2)
+ network2 = new /datum/pipe_network()
+ network2.normal_members += src
+ network2.build_network(node2, src)
+
+ if(!network3 && node3)
+ network3 = new /datum/pipe_network()
+ network3.normal_members += src
+ network3.build_network(node3, src)
+
+
+/obj/machinery/atmospherics/trinary/return_network(obj/machinery/atmospherics/reference)
+ build_network()
+
+ if(reference==node1)
+ return network1
+
+ if(reference==node2)
+ return network2
+
+ if(reference==node3)
+ return network3
+
+ return null
+
+/obj/machinery/atmospherics/trinary/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
+ if(network1 == old_network)
+ network1 = new_network
+ if(network2 == old_network)
+ network2 = new_network
+ if(network3 == old_network)
+ network3 = new_network
+
+ return 1
+
+/obj/machinery/atmospherics/trinary/return_network_air(datum/pipe_network/reference)
+ var/list/results = list()
+
+ if(network1 == reference)
+ results += air1
+ if(network2 == reference)
+ results += air2
+ if(network3 == reference)
+ results += air3
+
+ return results
+
+/obj/machinery/atmospherics/trinary/disconnect(obj/machinery/atmospherics/reference)
+ if(reference==node1)
+ qdel(network1)
node1 = null
+
+ else if(reference==node2)
+ qdel(network2)
node2 = null
+
+ else if(reference==node3)
+ qdel(network3)
node3 = null
- return ..()
+ update_underlays()
- atmos_init()
- if(node1 && node2 && node3) return
+ return null
- var/node1_connect = turn(dir, -180)
- var/node2_connect = turn(dir, -90)
- var/node3_connect = dir
-
- for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
- if(target.initialize_directions & get_dir(target,src))
- if (check_connect_types(target,src))
- node1 = target
- break
-
- for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
- if(target.initialize_directions & get_dir(target,src))
- if (check_connect_types(target,src))
- node2 = target
- break
- for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
- if(target.initialize_directions & get_dir(target,src))
- if (check_connect_types(target,src))
- node3 = target
- break
-
- update_icon()
- update_underlays()
-
- build_network()
- if(!network1 && node1)
- network1 = new /datum/pipe_network()
- network1.normal_members += src
- network1.build_network(node1, src)
-
- if(!network2 && node2)
- network2 = new /datum/pipe_network()
- network2.normal_members += src
- network2.build_network(node2, src)
-
- if(!network3 && node3)
- network3 = new /datum/pipe_network()
- network3.normal_members += src
- network3.build_network(node3, src)
-
-
- return_network(obj/machinery/atmospherics/reference)
- build_network()
-
- if(reference==node1)
- return network1
-
- if(reference==node2)
- return network2
-
- if(reference==node3)
- return network3
-
- return null
-
- reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network)
- if(network1 == old_network)
- network1 = new_network
- if(network2 == old_network)
- network2 = new_network
- if(network3 == old_network)
- network3 = new_network
-
- return 1
-
- return_network_air(datum/pipe_network/reference)
- var/list/results = list()
-
- if(network1 == reference)
- results += air1
- if(network2 == reference)
- results += air2
- if(network3 == reference)
- results += air3
-
- return results
-
- disconnect(obj/machinery/atmospherics/reference)
- if(reference==node1)
- qdel(network1)
- node1 = null
-
- else if(reference==node2)
- qdel(network2)
- node2 = null
-
- else if(reference==node3)
- qdel(network3)
- node3 = null
-
- update_underlays()
-
- return null
+/obj/machinery/atmospherics/trinary/AltClick(var/mob/user)
+ if(!allowed(user))
+ to_chat(user, SPAN_WARNING("Access denied."))
+ return
+ Topic(src, list("power" = "1"))
diff --git a/code/modules/nano/modules/rcon.dm b/code/modules/nano/modules/rcon.dm
index f60f87f7979..b4f6837ed44 100644
--- a/code/modules/nano/modules/rcon.dm
+++ b/code/modules/nano/modules/rcon.dm
@@ -69,6 +69,14 @@
if(SMES)
var/outputset = input(usr, "Enter new output level (0-[SMES.output_level_max])", "SMES Input Power Control") as num
SMES.set_output(outputset)
+ if(href_list["smes_in_max"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_in_max"])
+ if(SMES)
+ SMES.set_input(SMES.input_level_max)
+ if(href_list["smes_out_max"])
+ var/obj/machinery/power/smes/buildable/SMES = GetSMESByTag(href_list["smes_out_max"])
+ if(SMES)
+ SMES.set_output(SMES.output_level_max)
if(href_list["toggle_breaker"])
var/obj/machinery/power/breakerbox/toggle = SSpower.rcon_breaker_units_by_tag[href_list["toggle_breaker"]]
diff --git a/html/changelogs/engineering-qol-1.yml b/html/changelogs/engineering-qol-1.yml
new file mode 100644
index 00000000000..d9a0e1bf5d8
--- /dev/null
+++ b/html/changelogs/engineering-qol-1.yml
@@ -0,0 +1,7 @@
+author: mikomyazaki
+
+delete-after: True
+
+changes:
+ - tweak: "Can now toggle atmospherics pumps & filters with AltClick."
+ - tweak: "RCON SMES control now includes a button to max SMES input/output without having to type in the number."
diff --git a/nano/templates/rcon.tmpl b/nano/templates/rcon.tmpl
index c4337a07316..4f99126100b 100644
--- a/nano/templates/rcon.tmpl
+++ b/nano/templates/rcon.tmpl
@@ -9,7 +9,7 @@
Detected SMES units with RCON support:
{{for data.smes_info}}