//node2, air2, network2 correspond to input //node1, air1, network1 correspond to output /obj/machinery/atmospherics/components/binary/circulator name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." icon_state = "circ1-off" var/side = CIRC_LEFT var/status = 0 var/last_pressure_delta = 0 pipe_flags = PIPING_ONE_PER_TURF anchored = TRUE density = TRUE var/global/const/CIRC_LEFT = 1 var/global/const/CIRC_RIGHT = 2 /obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() var/datum/gas_mixture/air1 = airs[1] var/datum/gas_mixture/air2 = airs[2] var/output_starting_pressure = air1.return_pressure() var/input_starting_pressure = air2.return_pressure() if(output_starting_pressure >= input_starting_pressure-10) //Need at least 10 KPa difference to overcome friction in the mechanism last_pressure_delta = 0 return null //Calculate necessary moles to transfer using PV = nRT if(air2.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) last_pressure_delta = pressure_delta var/datum/gas_mixture/removed = air2.remove(transfer_moles) update_parents() return removed else last_pressure_delta = 0 /obj/machinery/atmospherics/components/binary/circulator/process_atmos() ..() update_icon() /obj/machinery/atmospherics/components/binary/circulator/update_icon() if(!is_operational()) icon_state = "circ[side]-p" else if(last_pressure_delta > 0) if(last_pressure_delta > ONE_ATMOSPHERE) icon_state = "circ[side]-run" else icon_state = "circ[side]-slow" else icon_state = "circ[side]-off"