mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Updates gas filter
This commit is contained in:
@@ -28,7 +28,7 @@
|
|||||||
if (available_power && specific_power > 0)
|
if (available_power && specific_power > 0)
|
||||||
transfer_moles = min(transfer_moles, available_power / specific_power)
|
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
|
return -1
|
||||||
|
|
||||||
last_flow_rate = (transfer_moles/source.total_moles)*source.volume //group_multiplier gets divided out here
|
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
|
//filter gas in proportion to the mole ratio
|
||||||
transfer_moles = min(transfer_moles, total_transfer_moles*(source.gas[g]/total_filterable_moles))
|
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)
|
source.adjust_gas(g, -transfer_moles, update=0)
|
||||||
sink.adjust_gas_temp(g, transfer_moles, source.temperature, update=0)
|
sink.adjust_gas_temp(g, transfer_moles, source.temperature, update=0)
|
||||||
|
|
||||||
@@ -121,7 +121,6 @@
|
|||||||
return -1
|
return -1
|
||||||
|
|
||||||
filtering &= source.gas //only filter gasses that are actually there.
|
filtering &= source.gas //only filter gasses that are actually there.
|
||||||
var/list/not_filtering = source.gas - filtering
|
|
||||||
|
|
||||||
var/total_filterable_moles = 0
|
var/total_filterable_moles = 0
|
||||||
var/total_unfilterable_moles = 0
|
var/total_unfilterable_moles = 0
|
||||||
@@ -166,18 +165,15 @@
|
|||||||
for (var/g in removed.gas)
|
for (var/g in removed.gas)
|
||||||
var/power_used = specific_power_gas[g]*removed.gas[g]
|
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)
|
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)
|
sink_filtered.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0)
|
||||||
filtered_power_used += power_used
|
filtered_power_used += power_used
|
||||||
else
|
else
|
||||||
sink_clean.adjust_gas_temp(g, removed.gas[g], removed.temperature, update=0)
|
|
||||||
unfiltered_power_used += power_used
|
unfiltered_power_used += power_used
|
||||||
|
|
||||||
sink_filtered.update_values()
|
sink_filtered.update_values()
|
||||||
sink_clean.update_values()
|
sink_clean.merge(removed)
|
||||||
|
|
||||||
del(removed) //removed should have nothing in it now, so we can just get rid of it.
|
|
||||||
|
|
||||||
if (filtered_power_used > 0)
|
if (filtered_power_used > 0)
|
||||||
sink_filtered.add_thermal_energy(filtered_power_used) //1st law - energy is conserved
|
sink_filtered.add_thermal_energy(filtered_power_used) //1st law - energy is conserved
|
||||||
@@ -217,7 +213,7 @@
|
|||||||
return specific_power
|
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.
|
//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)
|
if (usage_amount > active_power_usage - 5)
|
||||||
update_use_power(2)
|
update_use_power(2)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -94,10 +94,10 @@ Thus, the two variables affect pump operation are set in New():
|
|||||||
last_power_draw = 0
|
last_power_draw = 0
|
||||||
last_flow_rate = 0
|
last_flow_rate = 0
|
||||||
else if (power_draw > 0)
|
else if (power_draw > 0)
|
||||||
handle_pump_power_draw(power_draw)
|
handle_power_draw(power_draw)
|
||||||
last_power_draw = power_draw
|
last_power_draw = power_draw
|
||||||
else
|
else
|
||||||
handle_pump_power_draw(idle_power_usage)
|
handle_power_draw(idle_power_usage)
|
||||||
last_power_draw = idle_power_usage
|
last_power_draw = idle_power_usage
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -5,10 +5,15 @@
|
|||||||
level = 1
|
level = 1
|
||||||
|
|
||||||
name = "Gas filter"
|
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/temp = null // -- TLE
|
||||||
|
|
||||||
var/target_pressure = ONE_ATMOSPHERE
|
var/max_flow_rate = 200 //L/s
|
||||||
|
var/set_flow_rate = 200
|
||||||
|
|
||||||
var/filter_type = 0
|
var/filter_type = 0
|
||||||
/*
|
/*
|
||||||
@@ -30,12 +35,11 @@ Filter types:
|
|||||||
if(frequency)
|
if(frequency)
|
||||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
|
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()
|
/obj/machinery/atmospherics/trinary/filter/New()
|
||||||
..()
|
..()
|
||||||
if(radio_controller)
|
if(radio_controller)
|
||||||
initialize()
|
initialize()
|
||||||
*/
|
|
||||||
/obj/machinery/atmospherics/trinary/filter/update_icon()
|
/obj/machinery/atmospherics/trinary/filter/update_icon()
|
||||||
if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
|
if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
|
||||||
icon_state = "m"
|
icon_state = "m"
|
||||||
@@ -77,72 +81,52 @@ Filter types:
|
|||||||
|
|
||||||
/obj/machinery/atmospherics/trinary/filter/process()
|
/obj/machinery/atmospherics/trinary/filter/process()
|
||||||
..()
|
..()
|
||||||
if(!on)
|
if((stat & (NOPOWER|BROKEN)) || !on)
|
||||||
return 0
|
update_use_power(0) //usually we get here because a player turned a pump off - definitely want to update.
|
||||||
|
last_flow_rate = 0
|
||||||
var/output_starting_pressure = air3.return_pressure()
|
return
|
||||||
|
|
||||||
if(output_starting_pressure >= target_pressure || air2.return_pressure() >= target_pressure )
|
//Figure out the amount of moles to transfer
|
||||||
//No need to mix if target is already full!
|
var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles
|
||||||
return 1
|
|
||||||
|
var/power_draw = -1
|
||||||
//Calculate necessary moles to transfer using PV=nRT
|
if (transfer_moles > 0)
|
||||||
|
|
||||||
var/pressure_delta = target_pressure - output_starting_pressure
|
var/list/filtered_out
|
||||||
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
|
|
||||||
|
|
||||||
switch(filter_type)
|
switch(filter_type)
|
||||||
if(0) //removing hydrocarbons
|
if(0) //removing hydrocarbons
|
||||||
filtered_out.gas["phoron"] = removed.gas["phoron"]
|
filtered_out = list("phoron", "oxygen_agent_b")
|
||||||
removed.gas["phoron"] = 0
|
|
||||||
|
|
||||||
filtered_out.gas["oxygen_agent_b"] = removed.gas["oxygen_agent_b"]
|
|
||||||
removed.gas["oxygen_agent_b"] = 0
|
|
||||||
|
|
||||||
if(1) //removing O2
|
if(1) //removing O2
|
||||||
filtered_out.gas["oxygen"] = removed.gas["oxygen"]
|
filtered_out = list("oxygen")
|
||||||
removed.gas["oxygen"] = 0
|
|
||||||
|
|
||||||
if(2) //removing N2
|
if(2) //removing N2
|
||||||
filtered_out.gas["nitrogen"] = removed.gas["nitrogen"]
|
filtered_out = list("nitrogen")
|
||||||
removed.gas["nitrogen"] = 0
|
|
||||||
|
|
||||||
if(3) //removing CO2
|
if(3) //removing CO2
|
||||||
filtered_out.gas["carbon_dioxide"] = removed.gas["carbon_dioxide"]
|
filtered_out = list("carbon_dioxide")
|
||||||
removed.gas["carbon_dioxide"] = 0
|
|
||||||
|
|
||||||
if(4)//removing N2O
|
if(4)//removing N2O
|
||||||
filtered_out.gas["sleeping_agent"] = removed.gas["sleeping_agent"]
|
filtered_out = list("sleeping_agent")
|
||||||
removed.gas["sleeping_agent"] = 0
|
|
||||||
|
|
||||||
else
|
else
|
||||||
filtered_out = null
|
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)
|
if(network3)
|
||||||
air3.merge(removed)
|
network3.update = 1
|
||||||
|
|
||||||
if(network2)
|
if(network1)
|
||||||
network2.update = 1
|
network1.update = 1
|
||||||
|
|
||||||
if(network3)
|
|
||||||
network3.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
|
return 1
|
||||||
|
|
||||||
/obj/machinery/atmospherics/trinary/filter/initialize()
|
/obj/machinery/atmospherics/trinary/filter/initialize()
|
||||||
@@ -205,8 +189,10 @@ Filter types:
|
|||||||
<A href='?src=\ref[src];filterset=3'>Carbon Dioxide</A><BR>
|
<A href='?src=\ref[src];filterset=3'>Carbon Dioxide</A><BR>
|
||||||
<A href='?src=\ref[src];filterset=4'>Nitrous Oxide</A><BR>
|
<A href='?src=\ref[src];filterset=4'>Nitrous Oxide</A><BR>
|
||||||
<A href='?src=\ref[src];filterset=-1'>Nothing</A><BR>
|
<A href='?src=\ref[src];filterset=-1'>Nothing</A><BR>
|
||||||
<HR><B>Desirable output pressure:</B>
|
<HR>
|
||||||
[src.target_pressure]kPa | <a href='?src=\ref[src];set_press=1'>Change</a>
|
<B>Desirable input flow rate:</B>
|
||||||
|
[src.set_flow_rate]L/s | <a href='?src=\ref[src];set_flow_rate=1'>Change</a><BR>
|
||||||
|
<B>Flow rate:</B>[last_flow_rate]L/s
|
||||||
"}
|
"}
|
||||||
/*
|
/*
|
||||||
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD>[dat]","window=atmo_filter")
|
user << browse("<HEAD><TITLE>[src.name] control</TITLE></HEAD>[dat]","window=atmo_filter")
|
||||||
@@ -231,9 +217,9 @@ Filter types:
|
|||||||
src.filter_type = text2num(href_list["filterset"])
|
src.filter_type = text2num(href_list["filterset"])
|
||||||
if (href_list["temp"])
|
if (href_list["temp"])
|
||||||
src.temp = null
|
src.temp = null
|
||||||
if(href_list["set_press"])
|
if(href_list["set_flow_rate"])
|
||||||
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
|
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.target_pressure = max(0, min(4500, new_pressure))
|
src.set_flow_rate = max(0, min(max_flow_rate, new_pressure))
|
||||||
if(href_list["power"])
|
if(href_list["power"])
|
||||||
on=!on
|
on=!on
|
||||||
src.update_icon()
|
src.update_icon()
|
||||||
|
|||||||
@@ -177,13 +177,12 @@
|
|||||||
//update_use_power(0)
|
//update_use_power(0)
|
||||||
use_power = 0 //don't force update - easier on CPU
|
use_power = 0 //don't force update - easier on CPU
|
||||||
if (power_draw > 0)
|
if (power_draw > 0)
|
||||||
handle_pump_power_draw(power_draw)
|
handle_power_draw(power_draw)
|
||||||
last_power_draw = power_draw
|
last_power_draw = power_draw
|
||||||
else
|
else
|
||||||
handle_pump_power_draw(idle_power_usage)
|
handle_power_draw(idle_power_usage)
|
||||||
last_power_draw = idle_power_usage
|
last_power_draw = idle_power_usage
|
||||||
|
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/machinery/atmospherics/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment)
|
/obj/machinery/atmospherics/unary/vent_pump/proc/get_pressure_delta(datum/gas_mixture/environment)
|
||||||
|
|||||||
@@ -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
|
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)
|
else if (power_draw > 0)
|
||||||
//last_power_draw = power_draw
|
//last_power_draw = power_draw
|
||||||
handle_pump_power_draw(power_draw)
|
handle_power_draw(power_draw)
|
||||||
else
|
else
|
||||||
//last_power_draw = idle_power_usage
|
//last_power_draw = idle_power_usage
|
||||||
handle_pump_power_draw(idle_power_usage)
|
handle_power_draw(idle_power_usage)
|
||||||
|
|
||||||
if(network)
|
if(network)
|
||||||
network.update = 1
|
network.update = 1
|
||||||
|
|||||||
Reference in New Issue
Block a user