diff --git a/code/ATMOSPHERICS/atmospherics_helpers.dm b/code/ATMOSPHERICS/atmospherics_helpers.dm
index ee599585c9..146c2bd3e6 100644
--- a/code/ATMOSPHERICS/atmospherics_helpers.dm
+++ b/code/ATMOSPHERICS/atmospherics_helpers.dm
@@ -28,7 +28,7 @@
if (available_power && specific_power > 0)
transfer_moles = min(transfer_moles, available_power / specific_power)
- if (transfer_moles < MINUMUM_MOLES_TO_PUMP) //we check this repeatedly so that we do as little processing as possible
+ if (transfer_moles < MINUMUM_MOLES_TO_PUMP) //if we cant transfer enough gas just stop to avoid further processing
return -1
last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here
@@ -95,7 +95,7 @@
//filter gas in proportion to the mole ratio
transfer_moles = min(transfer_moles, total_transfer_moles*(source.gas[g]/total_filterable_moles))
- //use update=0. All the filtered gasses get added simultaneously, so we update after the for loop.
+ //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop.
source.adjust_gas(g, -transfer_moles, update=0)
sink.adjust_gas_temp(g, transfer_moles, source.temperature, update=0)
@@ -121,7 +121,6 @@
return -1
filtering &= source.gas //only filter gasses that are actually there.
- var/list/not_filtering = source.gas - filtering
var/total_filterable_moles = 0
var/total_unfilterable_moles = 0
@@ -166,18 +165,15 @@
for (var/g in removed.gas)
var/power_used = specific_power_gas[g]*removed.gas[g]
- //use update=0. All the filtered gasses get added simultaneously, so we update after the for loop.
if (g in filtering)
+ //use update=0. All the filtered gasses are supposed to be added simultaneously, so we update after the for loop.
sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0)
filtered_power_used += power_used
else
- sink_clean.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0)
unfiltered_power_used += power_used
sink_filtered.update_values()
- sink_clean.update_values()
-
- del(removed) //removed should have nothing in it now, so we can just get rid of it.
+ sink_clean.merge(removed)
if (filtered_power_used > 0)
sink_filtered.add_thermal_energy(filtered_power_used) //1st law - energy is conserved
@@ -217,7 +213,7 @@
return specific_power
//This proc handles power usages so that we only have to call use_power() when the pump is loaded but not at full load.
-/obj/machinery/atmospherics/proc/handle_pump_power_draw(var/usage_amount)
+/obj/machinery/atmospherics/proc/handle_power_draw(var/usage_amount)
if (usage_amount > active_power_usage - 5)
update_use_power(2)
else
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 5ba80ff0bf..faad82ac06 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -94,10 +94,10 @@ Thus, the two variables affect pump operation are set in New():
last_power_draw = 0
last_flow_rate = 0
else if (power_draw > 0)
- handle_pump_power_draw(power_draw)
+ handle_power_draw(power_draw)
last_power_draw = power_draw
else
- handle_pump_power_draw(idle_power_usage)
+ handle_power_draw(idle_power_usage)
last_power_draw = idle_power_usage
return 1
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index ff27f2becf..18549c01b3 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -5,10 +5,15 @@
level = 1
name = "Gas filter"
+
+ use_power = 1
+ idle_power_usage = 150 //internal circuitry, friction losses and stuff
+ active_power_usage = 7500 //This also doubles as a measure of how powerful the filter is, in Watts. 7500 W ~ 10 HP
var/temp = null // -- TLE
- var/target_pressure = ONE_ATMOSPHERE
+ var/max_flow_rate = 200 //L/s
+ var/set_flow_rate = 200
var/filter_type = 0
/*
@@ -30,12 +35,11 @@ Filter types:
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
-/* I don't know why this is here, but it's ugly, so I'm disabling it
/obj/machinery/atmospherics/trinary/filter/New()
..()
if(radio_controller)
initialize()
-*/
+
/obj/machinery/atmospherics/trinary/filter/update_icon()
if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
icon_state = "m"
@@ -77,72 +81,52 @@ Filter types:
/obj/machinery/atmospherics/trinary/filter/process()
..()
- if(!on)
- return 0
-
- var/output_starting_pressure = air3.return_pressure()
-
- if(output_starting_pressure >= target_pressure || air2.return_pressure() >= target_pressure )
- //No need to mix if target is already full!
- return 1
-
- //Calculate necessary moles to transfer using PV=nRT
-
- var/pressure_delta = target_pressure - output_starting_pressure
- var/transfer_moles
-
- if(air1.temperature > 0)
- transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
-
- //Actually transfer the gas
-
- if(transfer_moles > 0)
- var/datum/gas_mixture/removed = air1.remove(transfer_moles)
-
- if(!removed)
- return
- var/datum/gas_mixture/filtered_out = new
- filtered_out.temperature = removed.temperature
-
+ if((stat & (NOPOWER|BROKEN)) || !on)
+ update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
+ last_flow_rate = 0
+ return
+
+ //Figure out the amount of moles to transfer
+ var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles
+
+ var/power_draw = -1
+ if (transfer_moles > 0)
+
+ var/list/filtered_out
switch(filter_type)
if(0) //removing hydrocarbons
- filtered_out.gas["phoron"] = removed.gas["phoron"]
- removed.gas["phoron"] = 0
-
- filtered_out.gas["oxygen_agent_b"] = removed.gas["oxygen_agent_b"]
- removed.gas["oxygen_agent_b"] = 0
-
+ filtered_out = list("phoron", "oxygen_agent_b")
if(1) //removing O2
- filtered_out.gas["oxygen"] = removed.gas["oxygen"]
- removed.gas["oxygen"] = 0
-
+ filtered_out = list("oxygen")
if(2) //removing N2
- filtered_out.gas["nitrogen"] = removed.gas["nitrogen"]
- removed.gas["nitrogen"] = 0
-
+ filtered_out = list("nitrogen")
if(3) //removing CO2
- filtered_out.gas["carbon_dioxide"] = removed.gas["carbon_dioxide"]
- removed.gas["carbon_dioxide"] = 0
-
+ filtered_out = list("carbon_dioxide")
if(4)//removing N2O
- filtered_out.gas["sleeping_agent"] = removed.gas["sleeping_agent"]
- removed.gas["sleeping_agent"] = 0
-
+ filtered_out = list("sleeping_agent")
else
filtered_out = null
+
+ power_draw = filter_gas(filtered_out, air1, air2, air3, transfer_moles, active_power_usage)
+
+ if(network2)
+ network2.update = 1
- air2.merge(filtered_out)
- air3.merge(removed)
+ if(network3)
+ network3.update = 1
- if(network2)
- network2.update = 1
-
- if(network3)
- network3.update = 1
-
- if(network1)
- network1.update = 1
+ if(network1)
+ network1.update = 1
+ if (power_draw < 0)
+ //update_use_power(0)
+ use_power = 0 //don't force update - easier on CPU
+ last_flow_rate = 0
+ else if (power_draw > 0)
+ handle_power_draw(power_draw)
+ else
+ handle_power_draw(idle_power_usage)
+
return 1
/obj/machinery/atmospherics/trinary/filter/initialize()
@@ -205,8 +189,10 @@ Filter types:
Carbon Dioxide
Nitrous Oxide
Nothing
-