mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Generalizes pumping and filtering
So that people can pump and filter gasses without worrying about the thermodynamics too much.
This commit is contained in:
@@ -28,7 +28,6 @@
|
||||
var/pump_direction = 1 //0 = siphoning, 1 = releasing
|
||||
|
||||
var/last_power_draw = 0
|
||||
var/last_flow_rate = 0
|
||||
|
||||
var/external_pressure_bound = EXTERNAL_PRESSURE_BOUND
|
||||
var/internal_pressure_bound = INTERNAL_PRESSURE_BOUND
|
||||
@@ -158,13 +157,11 @@
|
||||
if(pressure_checks & PRESSURE_CHECK_INTERNAL)
|
||||
pressure_delta = min(pressure_delta, air_contents.return_pressure() - internal_pressure_bound) //decreasing the pressure here
|
||||
|
||||
//Unfortunately there's no good way to get the volume of the room, so assume 10 tiles
|
||||
//We will overshoot in small rooms when dealing with huge pressures but it won't be so bad
|
||||
var/output_volume = environment.volume * environment.group_multiplier
|
||||
var/air_temperature = environment.temperature? environment.volume : air_contents.temperature
|
||||
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
power_draw = transfer_gas(air_contents, environment, transfer_moles)
|
||||
power_draw = pump_gas(air_contents, environment, transfer_moles, active_power_usage)
|
||||
else //external -> internal
|
||||
if(pressure_checks & PRESSURE_CHECK_EXTERNAL)
|
||||
pressure_delta = min(pressure_delta, environment_pressure - external_pressure_bound) //decreasing the pressure here
|
||||
@@ -172,14 +169,13 @@
|
||||
pressure_delta = min(pressure_delta, internal_pressure_bound - air_contents.return_pressure()) //increasing the pressure here
|
||||
|
||||
var/output_volume = air_contents.volume * air_contents.group_multiplier
|
||||
|
||||
var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature
|
||||
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
//limit flow rate from turfs
|
||||
transfer_moles = min(transfer_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
||||
|
||||
power_draw = transfer_gas(environment, air_contents, transfer_moles)
|
||||
power_draw = pump_gas(environment, air_contents, transfer_moles, active_power_usage)
|
||||
|
||||
if(network)
|
||||
network.update = 1
|
||||
|
||||
@@ -126,9 +126,15 @@
|
||||
var/power_draw = -1
|
||||
if (environment.temperature > 0 || air_contents.temperature > 0)
|
||||
if(scrubbing)
|
||||
power_draw = filter_gas(environment)
|
||||
//limit flow rate from turfs
|
||||
var/transfer_moles = min(environment.total_moles, environment.total_moles*MAX_FILTER_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
||||
|
||||
power_draw = filter_gas(scrubbing_gas, environment, air_contents, transfer_moles, active_power_usage)
|
||||
else //Just siphon all air
|
||||
power_draw = siphon_gas(environment)
|
||||
//limit flow rate from turfs
|
||||
var/transfer_moles = min(environment.total_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
||||
|
||||
power_draw = pump_gas(environment, air_contents, transfer_moles, active_power_usage)
|
||||
|
||||
if (power_draw < 0)
|
||||
update_use_power(0)
|
||||
@@ -144,80 +150,6 @@
|
||||
|
||||
return 1
|
||||
|
||||
//filters gas from environment and returns the amount of power used, or -1 if no filtering was done
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/proc/filter_gas(datum/gas_mixture/environment)
|
||||
//Filter it
|
||||
var/total_specific_power = 0 //the power required to remove one mole of filterable gas
|
||||
var/total_filterable_moles = 0
|
||||
var/list/specific_power_gas = list()
|
||||
for (var/g in scrubbing_gas)
|
||||
if (environment.gas[g] < MINUMUM_MOLES_TO_PUMP)
|
||||
continue //don't bother
|
||||
|
||||
var/specific_power = calculate_specific_power_gas(g, environment, air_contents)/ATMOS_FILTER_EFFICIENCY
|
||||
specific_power_gas[g] = specific_power
|
||||
total_specific_power += specific_power
|
||||
total_filterable_moles += environment.gas[g]
|
||||
|
||||
if (total_filterable_moles < MINUMUM_MOLES_TO_PUMP)
|
||||
return -1
|
||||
|
||||
//Figure out how much of each gas to filter
|
||||
var/total_transfer_moles = total_filterable_moles
|
||||
|
||||
//limit flow rate from turfs
|
||||
total_transfer_moles = min(total_transfer_moles, environment.total_moles*MAX_FILTER_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
||||
|
||||
//limit transfer_moles based on available power
|
||||
var/power_draw = 0
|
||||
if (total_specific_power > 0)
|
||||
total_transfer_moles = min(total_transfer_moles, active_power_usage/total_specific_power)
|
||||
|
||||
for (var/g in scrubbing_gas)
|
||||
var/transfer_moles = environment.gas[g]
|
||||
if (specific_power_gas[g] > 0)
|
||||
//if our flow rate is being limited by available power, the proportion of the filtered gas is based on mole ratio
|
||||
transfer_moles = min(transfer_moles, total_transfer_moles*(environment.gas[g]/total_filterable_moles))
|
||||
|
||||
environment.gas[g] -= transfer_moles
|
||||
air_contents.gas[g] += transfer_moles
|
||||
power_draw += specific_power_gas[g]*transfer_moles
|
||||
|
||||
if (power_draw > 0)
|
||||
air_contents.add_thermal_energy(power_draw)
|
||||
|
||||
//Remix the resulting gases
|
||||
air_contents.update_values()
|
||||
environment.update_values()
|
||||
|
||||
return power_draw
|
||||
|
||||
//siphons gas from environment and returns the power used, or -1 if no siphoning was done
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/proc/siphon_gas(datum/gas_mixture/environment)
|
||||
if (environment.total_moles < MINUMUM_MOLES_TO_PUMP)
|
||||
return -1 //no point doing all this processing when source is a vacuum
|
||||
|
||||
var/transfer_moles = environment.total_moles
|
||||
|
||||
//limit flow rate from turfs
|
||||
transfer_moles = min(transfer_moles, environment.total_moles*MAX_SIPHON_FLOWRATE/environment.volume) //group_multiplier gets divided out here
|
||||
|
||||
//Calculate the amount of energy required and limit transfer_moles based on available power
|
||||
var/specific_power = calculate_specific_power(environment, air_contents)/ATMOS_PUMP_EFFICIENCY //this has to be calculated before we modify any gas mixtures
|
||||
if (specific_power > 0)
|
||||
transfer_moles = min(transfer_moles, active_power_usage / specific_power)
|
||||
|
||||
if (transfer_moles < MINUMUM_MOLES_TO_PUMP)
|
||||
return -1 //don't bother
|
||||
|
||||
var/power_draw = specific_power*transfer_moles
|
||||
var/datum/gas_mixture/removed = environment.remove(transfer_moles)
|
||||
if (power_draw > 0)
|
||||
removed.add_thermal_energy(power_draw)
|
||||
air_contents.merge(removed)
|
||||
|
||||
return power_draw
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/hide(var/i) //to make the little pipe section invisible, the icon changes.
|
||||
update_icon()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user