diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
index b6c5d55e5a9..a0f563669c1 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
@@ -7,29 +7,30 @@
icon_state = "circ1-off"
var/side = CIRC_LEFT
-
+
var/global/const/CIRC_LEFT = WEST
var/global/const/CIRC_RIGHT = EAST
var/last_pressure_delta = 0
-
+
var/obj/machinery/power/generator/generator
layer = 2.45 // Just above wires
-
+
anchored = 1
density = 1
-
+
can_unwrench = 1
-
-// Creating a custom circulator pipe subtype to be delivered through cargo
+ var/side_inverted = 0
+
+// Creating a custom circulator pipe subtype to be delivered through cargo
/obj/item/pipe/circulator
name = "circulator/heat exchanger fitting"
/obj/item/pipe/circulator/New(loc)
var/obj/machinery/atmospherics/binary/circulator/C = new /obj/machinery/atmospherics/binary/circulator(null)
- ..(loc, make_from = C)
-
+ ..(loc, make_from = C)
+
/obj/machinery/atmospherics/binary/circulator/Destroy()
if(generator && generator.cold_circ == src)
generator.cold_circ = null
@@ -38,8 +39,10 @@
return ..()
/obj/machinery/atmospherics/binary/circulator/proc/return_transfer_air()
- var/output_starting_pressure = air1.return_pressure()
- var/input_starting_pressure = air2.return_pressure()
+ var/datum/gas_mixture/inlet = get_inlet_air()
+ var/datum/gas_mixture/outlet = get_outlet_air()
+ var/output_starting_pressure = outlet.return_pressure()
+ var/input_starting_pressure = inlet.return_pressure()
if(output_starting_pressure >= input_starting_pressure - 10)
//Need at least 10 KPa difference to overcome friction in the mechanism
@@ -47,17 +50,17 @@
return null
//Calculate necessary moles to transfer using PV = nRT
- if(air2.temperature > 0)
+ if(inlet.temperature > 0)
var/pressure_delta = (input_starting_pressure - output_starting_pressure) / 2
- var/transfer_moles = pressure_delta * air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
+ var/transfer_moles = pressure_delta * outlet.volume/(inlet.temperature * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
//log_debug("pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];")
//Actually transfer the gas
- var/datum/gas_mixture/removed = air2.remove(transfer_moles)
+ var/datum/gas_mixture/removed = inlet.remove(transfer_moles)
parent1.update = 1
parent2.update = 1
@@ -71,6 +74,43 @@
..()
update_icon()
+/obj/machinery/atmospherics/binary/circulator/proc/get_inlet_air()
+ if(side_inverted==0)
+ return air2
+ else
+ return air1
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_outlet_air()
+ if(side_inverted==0)
+ return air1
+ else
+ return air2
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_inlet_side()
+ if(dir==SOUTH||dir==NORTH)
+ if(side_inverted==0)
+ return "South"
+ else
+ return "North"
+
+/obj/machinery/atmospherics/binary/circulator/proc/get_outlet_side()
+ if(dir==SOUTH||dir==NORTH)
+ if(side_inverted==0)
+ return "North"
+ else
+ return "South"
+
+/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(ismultitool(W))
+ if(side_inverted == 0)
+ side_inverted = 1
+ else
+ side_inverted = 0
+ to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.")
+ desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."
+ else
+ ..()
+
/obj/machinery/atmospherics/binary/circulator/update_icon()
if(stat & (BROKEN|NOPOWER))
icon_state = "circ[side]-p"
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 0ff6289ea66..a61aca5661c 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -10,23 +10,23 @@
var/obj/machinery/atmospherics/binary/circulator/hot_circ
var/cold_dir = WEST
- var/hot_dir = EAST
-
+ var/hot_dir = EAST
+
var/lastgen = 0
var/lastgenlev = -1
var/lastcirc = "00"
-
+
/obj/machinery/power/generator/New()
..()
update_desc()
-
+
/obj/machinery/power/generator/proc/update_desc()
desc = initial(desc) + " Its cold circulator is located on the [dir2text(cold_dir)] side, and its heat circulator is located on the [dir2text(hot_dir)] side."
-
+
/obj/machinery/power/generator/Destroy()
disconnect()
return ..()
-
+
/obj/machinery/power/generator/proc/disconnect()
if(cold_circ)
cold_circ.generator = null
@@ -38,10 +38,10 @@
/obj/machinery/power/generator/initialize()
..()
connect()
-
+
/obj/machinery/power/generator/proc/connect()
connect_to_network()
-
+
var/obj/machinery/atmospherics/binary/circulator/circpath = /obj/machinery/atmospherics/binary/circulator
cold_circ = locate(circpath) in get_step(src, cold_dir)
hot_circ = locate(circpath) in get_step(src, hot_dir)
@@ -61,13 +61,13 @@
power_change()
update_icon()
updateDialog()
-
+
/obj/machinery/power/generator/power_change()
if(!anchored)
stat |= NOPOWER
else
..()
-
+
/obj/machinery/power/generator/update_icon()
if(stat & (NOPOWER|BROKEN))
overlays.Cut()
@@ -79,7 +79,7 @@
overlays += image('icons/obj/power.dmi', "teg-oc[lastcirc]")
-/obj/machinery/power/generator/process()
+/obj/machinery/power/generator/process()
if(stat & (NOPOWER|BROKEN))
return
@@ -128,11 +128,11 @@
// update icon overlays only if displayed level has changed
if(hot_air)
- var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.get_outlet_air()
hot_circ_air1.merge(hot_air)
if(cold_air)
- var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.get_outlet_air()
cold_circ_air1.merge(cold_air)
var/genlev = max(0, min( round(11 * lastgen / 100000), 11))
@@ -146,12 +146,12 @@
/obj/machinery/power/generator/attack_ai(mob/user)
return attack_hand(user)
-
+
/obj/machinery/power/generator/attack_ghost(mob/user)
if(stat & (NOPOWER|BROKEN))
return
- interact(user)
-
+ interact(user)
+
/obj/machinery/power/generator/attack_hand(mob/user)
if(..())
user << browse(null, "window=teg")
@@ -168,29 +168,35 @@
connect()
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
- else if(istype(W, /obj/item/device/multitool))
+ else if(ismultitool(W))
if(cold_dir == WEST)
cold_dir = EAST
hot_dir = WEST
- else
+ else if(cold_dir == NORTH)
+ cold_dir = SOUTH
+ hot_dir = NORTH
+ else if(cold_dir == EAST)
cold_dir = WEST
hot_dir = EAST
+ else
+ cold_dir = NORTH
+ hot_dir = SOUTH
connect()
to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.")
update_desc()
else
- ..()
-
+ ..()
+
/obj/machinery/power/generator/proc/get_menu(include_link = 1)
var/t = ""
if(!powernet)
t += "Unable to connect to the power network!"
t += "
Retry"
else if(cold_circ && hot_circ)
- var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
- var/datum/gas_mixture/cold_circ_air2 = cold_circ.air2
- var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
- var/datum/gas_mixture/hot_circ_air2 = hot_circ.air2
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.get_outlet_air()
+ var/datum/gas_mixture/cold_circ_air2 = cold_circ.get_inlet_air()
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.get_outlet_air()
+ var/datum/gas_mixture/hot_circ_air2 = hot_circ.get_inlet_air()
t += "