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
-
Desirable output pressure: - [src.target_pressure]kPa | Change +
+ Desirable input flow rate: + [src.set_flow_rate]L/s | Change
+ Flow rate:[last_flow_rate]L/s "} /* user << browse("[src.name] control[dat]","window=atmo_filter") @@ -231,9 +217,9 @@ Filter types: src.filter_type = text2num(href_list["filterset"]) if (href_list["temp"]) src.temp = null - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) + if(href_list["set_flow_rate"]) + var/new_pressure = input(usr,"Enter new flow rate (0-[max_flow_rate]L/s)","Flow Rate Control",src.set_flow_rate) as num + src.set_flow_rate = max(0, min(max_flow_rate, new_pressure)) if(href_list["power"]) on=!on src.update_icon() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 6312a32f84..3493df4eb0 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -177,13 +177,12 @@ //update_use_power(0) use_power = 0 //don't force update - easier on CPU 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 /obj/machinery/atmospherics/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 268018badd..eb01866f71 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -140,10 +140,10 @@ use_power = 0 //don't force update. Sure, we will continue to use power even though we're not pumping anything, but it is easier on the CPU else if (power_draw > 0) //last_power_draw = power_draw - handle_pump_power_draw(power_draw) + handle_power_draw(power_draw) else //last_power_draw = idle_power_usage - handle_pump_power_draw(idle_power_usage) + handle_power_draw(idle_power_usage) if(network) network.update = 1