removes add_gas() and assert_gas(). next up: do further testing with garbage_collect() present and not present

This commit is contained in:
deathride58
2019-04-14 10:33:39 -04:00
parent b1467b4ec4
commit 2c9deab42e
32 changed files with 7 additions and 95 deletions
-8
View File
@@ -240,14 +240,6 @@
//HELPERS //HELPERS
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity()) #define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
//REMOVE REMOVE REMOVE REMOVE
#define ADD_GAS(gas_id, out_list) out_list[gas_id] = 0
//REMOVEREMOVEREMOVE
#define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) };
//prefer this to gas_mixture/total_moles in performance critical areas //prefer this to gas_mixture/total_moles in performance critical areas
#define TOTAL_MOLES(cached_gases, out_var)\ #define TOTAL_MOLES(cached_gases, out_var)\
out_var = 0;\ out_var = 0;\
@@ -421,7 +421,6 @@
if(!istype(T)) if(!istype(T))
return return
var/datum/gas_mixture/GM = new var/datum/gas_mixture/GM = new
GM.add_gas(/datum/gas/plasma)
if(prob(10)) if(prob(10))
GM.gases[/datum/gas/plasma] += 100 GM.gases[/datum/gas/plasma] += 100
GM.temperature = 1500+T0C //should be enough to start a fire GM.temperature = 1500+T0C //should be enough to start a fire
-1
View File
@@ -237,7 +237,6 @@
cabin_air = new cabin_air = new
cabin_air.temperature = T20C cabin_air.temperature = T20C
cabin_air.volume = 200 cabin_air.volume = 200
cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
cabin_air.gases[/datum/gas/oxygen] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) cabin_air.gases[/datum/gas/oxygen] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases[/datum/gas/nitrogen] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) cabin_air.gases[/datum/gas/nitrogen] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
return cabin_air return cabin_air
@@ -172,7 +172,6 @@
qdel(H) qdel(H)
var/list/G_gases = G.gases var/list/G_gases = G.gases
if(G_gases[/datum/gas/plasma]) if(G_gases[/datum/gas/plasma])
G.assert_gas(/datum/gas/nitrogen)
G_gases[/datum/gas/nitrogen] += (G_gases[/datum/gas/plasma]) G_gases[/datum/gas/nitrogen] += (G_gases[/datum/gas/plasma])
G_gases[/datum/gas/plasma] = 0 G_gases[/datum/gas/plasma] = 0
G.garbage_collect() G.garbage_collect()
@@ -19,11 +19,9 @@
var/obj/item/tank/internals/plasma/PT = new(V) var/obj/item/tank/internals/plasma/PT = new(V)
var/obj/item/tank/internals/oxygen/OT = new(V) var/obj/item/tank/internals/oxygen/OT = new(V)
PT.air_contents.assert_gas(/datum/gas/plasma)
PT.air_contents.gases[/datum/gas/plasma] = pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p)) PT.air_contents.gases[/datum/gas/plasma] = pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))
PT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_p) PT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_p)
OT.air_contents.assert_gas(/datum/gas/oxygen)
OT.air_contents.gases[/datum/gas/oxygen] = pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o)) OT.air_contents.gases[/datum/gas/oxygen] = pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))
OT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_o) OT.air_contents.temperature = CELSIUS_TO_KELVIN(temp_o)
-1
View File
@@ -248,7 +248,6 @@
/obj/effect/chrono_field/return_air() //we always have nominal air and temperature /obj/effect/chrono_field/return_air() //we always have nominal air and temperature
var/datum/gas_mixture/GM = new var/datum/gas_mixture/GM = new
GM.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
GM.gases[/datum/gas/oxygen] = MOLES_O2STANDARD GM.gases[/datum/gas/oxygen] = MOLES_O2STANDARD
GM.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD GM.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD
GM.temperature = T20C GM.temperature = T20C
@@ -419,7 +419,6 @@ SLIME SCANNER
if(total_moles) if(total_moles)
var/list/env_gases = environment.gases var/list/env_gases = environment.gases
environment.assert_gases(arglist(GLOB.hardcoded_gases))
var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles
var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles
var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles
-1
View File
@@ -17,7 +17,6 @@
/obj/item/tank/jetpack/New() /obj/item/tank/jetpack/New()
..() ..()
if(gas_type) if(gas_type)
air_contents.assert_gas(gas_type)
air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C) air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
ion_trail = new ion_trail = new
@@ -21,7 +21,6 @@
/obj/item/tank/internals/oxygen/New() /obj/item/tank/internals/oxygen/New()
..() ..()
air_contents.assert_gas(/datum/gas/oxygen)
air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return return
@@ -49,7 +48,6 @@
/obj/item/tank/internals/anesthetic/New() /obj/item/tank/internals/anesthetic/New()
..() ..()
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide)
air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return return
@@ -67,7 +65,6 @@
/obj/item/tank/internals/air/New() /obj/item/tank/internals/air/New()
..() ..()
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
return return
@@ -87,7 +84,6 @@
/obj/item/tank/internals/plasma/New() /obj/item/tank/internals/plasma/New()
..() ..()
air_contents.assert_gas(/datum/gas/plasma)
air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return return
@@ -124,7 +120,6 @@
/obj/item/tank/internals/plasmaman/New() /obj/item/tank/internals/plasmaman/New()
..() ..()
air_contents.assert_gas(/datum/gas/plasma)
air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return return
@@ -166,7 +161,6 @@
/obj/item/tank/internals/emergency_oxygen/New() /obj/item/tank/internals/emergency_oxygen/New()
..() ..()
air_contents.assert_gas(/datum/gas/oxygen)
air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return return
@@ -11,7 +11,6 @@
/obj/structure/transit_tube_pod/Initialize() /obj/structure/transit_tube_pod/Initialize()
. = ..() . = ..()
air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen] = MOLES_O2STANDARD air_contents.gases[/datum/gas/oxygen] = MOLES_O2STANDARD
air_contents.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD air_contents.gases[/datum/gas/nitrogen] = MOLES_N2STANDARD
air_contents.temperature = T20C air_contents.temperature = T20C
-1
View File
@@ -297,7 +297,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list(
continue continue
var/list/S_gases = S.air.gases var/list/S_gases = S.air.gases
for(var/id in S_gases) for(var/id in S_gases)
ASSERT_GAS(id, total)
total_gases[id] += S_gases[id] total_gases[id] += S_gases[id]
total.temperature += S.air.temperature total.temperature += S.air.temperature
-1
View File
@@ -292,6 +292,5 @@
pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide]*1000,air.gases[/datum/gas/oxygen]*2000) //Ensures matter is conserved properly pulse_strength = min(pulse_strength,air.gases[/datum/gas/carbon_dioxide]*1000,air.gases[/datum/gas/oxygen]*2000) //Ensures matter is conserved properly
air.gases[/datum/gas/carbon_dioxide]=max(air.gases[/datum/gas/carbon_dioxide]-(pulse_strength/1000),0) air.gases[/datum/gas/carbon_dioxide]=max(air.gases[/datum/gas/carbon_dioxide]-(pulse_strength/1000),0)
air.gases[/datum/gas/oxygen]=max(air.gases[/datum/gas/oxygen]-(pulse_strength/2000),0) air.gases[/datum/gas/oxygen]=max(air.gases[/datum/gas/oxygen]-(pulse_strength/2000),0)
air.assert_gas(/datum/gas/pluoxium)
air.gases[/datum/gas/pluoxium]+=(pulse_strength/4000) air.gases[/datum/gas/pluoxium]+=(pulse_strength/4000)
air.garbage_collect() air.garbage_collect()
-1
View File
@@ -841,7 +841,6 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if(Rad.anchored) if(Rad.anchored)
if(!Rad.loaded_tank) if(!Rad.loaded_tank)
var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad) var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad)
Plasma.air_contents.assert_gas(/datum/gas/plasma)
Plasma.air_contents.gases[/datum/gas/plasma] = 70 Plasma.air_contents.gases[/datum/gas/plasma] = 70
Rad.drainratio = 0 Rad.drainratio = 0
Rad.loaded_tank = Plasma Rad.loaded_tank = Plasma
-1
View File
@@ -143,7 +143,6 @@
return return
/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode /obj/item/tank/proc/ignite() //This happens when a bomb is told to explode
air_contents.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
var/fuel_moles = air_contents.gases[/datum/gas/plasma] + air_contents.gases[/datum/gas/oxygen]/6 var/fuel_moles = air_contents.gases[/datum/gas/plasma] + air_contents.gases[/datum/gas/oxygen]/6
air_contents.garbage_collect() air_contents.garbage_collect()
var/datum/gas_mixture/bomb_mixture = air_contents.copy() var/datum/gas_mixture/bomb_mixture = air_contents.copy()
@@ -27,34 +27,12 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
//UNOMOS - whoever originally wrote this is a sadist that just wants to see byond suffer. //UNOMOS - whoever originally wrote this is a sadist that just wants to see byond suffer.
//assert_gas(gas_id) - used to guarantee that the gas list for this id exists in gas_mixture.gases.
//Must be used before adding to a gas. May be used before reading from a gas.
/datum/gas_mixture/proc/assert_gas(gas_id)
ASSERT_GAS(gas_id, src)
//assert_gases(args) - shorthand for calling ASSERT_GAS() once for each gas type.
/datum/gas_mixture/proc/assert_gases()
for(var/id in args)
ASSERT_GAS(id, src)
//add_gas(gas_id) - similar to assert_gas(), but does not check for an existing
//gas list for this id. This can clobber existing gases.
//Used instead of assert_gas() when you know the gas does not exist. Faster than assert_gas().
/datum/gas_mixture/proc/add_gas(gas_id)
ADD_GAS(gas_id, gases)
//add_gases(args) - shorthand for calling add_gas() once for each gas_type.
/datum/gas_mixture/proc/add_gases()
var/cached_gases = gases
for(var/id in args)
ADD_GAS(id, cached_gases)
//garbage_collect() - removes any gas list which is empty. //garbage_collect() - removes any gas list which is empty.
//If called with a list as an argument, only removes gas lists with IDs from that list. //If called with a list as an argument, only removes gas lists with IDs from that list.
//Must be used after subtracting from a gas. Must be used after assert_gas() //Must be used after subtracting from a gas. Must be used after assert_gas()
//if assert_gas() was called only to read from the gas. //if assert_gas() was called only to read from the gas.
//By removing empty gases, processing speed is increased. //By removing empty gases, processing speed is increased.
//UNOMOS - above comment right above this line is now fairly inaccurate, as the system no longer makes gracious abuse of lists for storing gasses moles. //UNOMOS - i have no idea exactly what the fuck or how the fuck it's the case, but removing this proc can and will completely nullify all of the performance gain from removing add_gas and assert_gas. so uh, dont remove it i guess. Why this shit isn't a define is beyond me.
/datum/gas_mixture/proc/garbage_collect(list/tocheck) /datum/gas_mixture/proc/garbage_collect(list/tocheck)
var/list/cached_gases = gases var/list/cached_gases = gases
for(var/id in (tocheck || cached_gases)) for(var/id in (tocheck || cached_gases))
@@ -156,7 +134,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
var/list/giver_gases = giver.gases var/list/giver_gases = giver.gases
//gas transfer //gas transfer
for(var/giver_id in giver_gases) for(var/giver_id in giver_gases)
ASSERT_GAS(giver_id, src)
cached_gases[giver_id] += giver_gases[giver_id] cached_gases[giver_id] += giver_gases[giver_id]
return 1 return 1
@@ -173,7 +150,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
removed.temperature = temperature removed.temperature = temperature
for(var/id in cached_gases) for(var/id in cached_gases)
ADD_GAS(id, removed.gases)
removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount) removed_gases[id] = QUANTIZE((cached_gases[id] / sum) * amount)
cached_gases[id] -= removed_gases[id] cached_gases[id] -= removed_gases[id]
garbage_collect() garbage_collect()
@@ -191,7 +167,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
removed.temperature = temperature removed.temperature = temperature
for(var/id in cached_gases) for(var/id in cached_gases)
ADD_GAS(id, removed.gases)
removed_gases[id] = QUANTIZE(cached_gases[id] * ratio) removed_gases[id] = QUANTIZE(cached_gases[id] * ratio)
cached_gases[id] -= removed_gases[id] cached_gases[id] -= removed_gases[id]
@@ -206,7 +181,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
copy.temperature = temperature copy.temperature = temperature
for(var/id in cached_gases) for(var/id in cached_gases)
ADD_GAS(id, copy.gases)
copy_gases[id] = cached_gases[id] copy_gases[id] = cached_gases[id]
return copy return copy
@@ -218,7 +192,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
temperature = sample.temperature temperature = sample.temperature
for(var/id in sample_gases) for(var/id in sample_gases)
ASSERT_GAS(id,src)
cached_gases[id] = sample_gases[id] cached_gases[id] = sample_gases[id]
//remove all gases not in the sample //remove all gases not in the sample
@@ -247,7 +220,6 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
var/path = id var/path = id
if(!ispath(path)) if(!ispath(path))
path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around
ADD_GAS(path, gases)
gases[path] = text2num(gas[id]) gases[path] = text2num(gas[id])
return 1 return 1
@@ -271,16 +243,16 @@ GLOBAL_LIST_INIT(meta_gas_info, meta_gas_list()) //see ATMOSPHERICS/gas_types.dm
var/moved_moles = 0 var/moved_moles = 0
var/abs_moved_moles = 0 var/abs_moved_moles = 0
//we're gonna define these vars outside of this for loop because as it turns out, var declaration is pricy
var/delta
var/gas_heat_capacity
//GAS TRANSFER //GAS TRANSFER
for(var/id in sharer_gases - cached_gases) // create gases not in our cache for(var/id in cached_gases | sharer_gases) // transfer gases
ADD_GAS(id, gases)
for(var/id in cached_gases) // transfer gases
ASSERT_GAS(id, sharer)
var/delta = QUANTIZE(cached_gases[id] - sharer_gases[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures delta = QUANTIZE(cached_gases[id] - sharer_gases[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER) if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
var/gas_heat_capacity = delta * GLOB.meta_gas_info[id][META_GAS_SPECIFIC_HEAT] gas_heat_capacity = delta * GLOB.meta_gas_info[id][META_GAS_SPECIFIC_HEAT]
if(delta > 0) if(delta > 0)
heat_capacity_self_to_sharer += gas_heat_capacity heat_capacity_self_to_sharer += gas_heat_capacity
else else
@@ -61,7 +61,6 @@
/datum/gas_mixture/immutable/cloner/garbage_collect() /datum/gas_mixture/immutable/cloner/garbage_collect()
..() ..()
ADD_GAS(/datum/gas/nitrogen, gases)
gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD gases[/datum/gas/nitrogen] = MOLES_O2STANDARD + MOLES_N2STANDARD
/datum/gas_mixture/immutable/cloner/heat_capacity() /datum/gas_mixture/immutable/cloner/heat_capacity()
@@ -99,7 +99,6 @@
if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server
radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR)
ASSERT_GAS(/datum/gas/water_vapor, air) //oxygen+more-or-less hydrogen=H2O
cached_gases[/datum/gas/water_vapor] += burned_fuel/TRITIUM_BURN_OXY_FACTOR cached_gases[/datum/gas/water_vapor] += burned_fuel/TRITIUM_BURN_OXY_FACTOR
cached_results["fire"] += burned_fuel cached_results["fire"] += burned_fuel
@@ -169,10 +168,8 @@
cached_gases[/datum/gas/plasma] = QUANTIZE(cached_gases[/datum/gas/plasma] - plasma_burn_rate) cached_gases[/datum/gas/plasma] = QUANTIZE(cached_gases[/datum/gas/plasma] - plasma_burn_rate)
cached_gases[/datum/gas/oxygen] = QUANTIZE(cached_gases[/datum/gas/oxygen] - (plasma_burn_rate * oxygen_burn_rate)) cached_gases[/datum/gas/oxygen] = QUANTIZE(cached_gases[/datum/gas/oxygen] - (plasma_burn_rate * oxygen_burn_rate))
if (super_saturation) if (super_saturation)
ASSERT_GAS(/datum/gas/tritium,air)
cached_gases[/datum/gas/tritium] += plasma_burn_rate cached_gases[/datum/gas/tritium] += plasma_burn_rate
else else
ASSERT_GAS(/datum/gas/carbon_dioxide,air)
cached_gases[/datum/gas/carbon_dioxide] += plasma_burn_rate cached_gases[/datum/gas/carbon_dioxide] += plasma_burn_rate
energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate)
@@ -262,7 +259,6 @@
else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful. else if (power_ratio > FUSION_HIGH_TIER_THRESHOLD) //power ratio 20-50; High tier. The reaction is so energized that it fuses into a small amount of stimulum, and some pluoxium. Very dangerous, but super cool and super useful.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH) reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_HIGH * (power_ratio / FUSION_ENERGY_DIVISOR_HIGH)
air.assert_gases(/datum/gas/stimulum, /datum/gas/pluoxium)
cached_gases[/datum/gas/stimulum] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox cached_gases[/datum/gas/stimulum] += gases_fused * FUSION_GAS_CREATION_FACTOR_STIM //40% of the gas is converted to energy, 60% to stim and pluox
cached_gases[/datum/gas/pluoxium] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX cached_gases[/datum/gas/pluoxium] += gases_fused * FUSION_GAS_CREATION_FACTOR_PLUOX
fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory fusion_prepare_to_die_edition_rng = power_ratio //Now we're getting into dangerous territory
@@ -271,7 +267,6 @@
else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down. else if (power_ratio > FUSION_MID_TIER_THRESHOLD) //power_ratio 5 to 20; Mediation is overpowered, fusion reaction starts to break down.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID) reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_MID * (power_ratio / FUSION_ENERGY_DIVISOR_MID)
air.assert_gases(/datum/gas/nitryl,/datum/gas/nitrous_oxide)
cached_gases[/datum/gas/nitryl] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O cached_gases[/datum/gas/nitryl] += gases_fused * FUSION_GAS_CREATION_FACTOR_NITRYL //20% of the gas is converted to energy, 80% to nitryl and N2O
cached_gases[/datum/gas/nitrous_oxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O cached_gases[/datum/gas/nitrous_oxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_N2O
fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected fusion_prepare_to_die_edition_rng = power_ratio * FUSION_MID_TIER_RAD_PROB_FACTOR //Still unlikely, but don't stand next to the reaction unprotected
@@ -279,7 +274,6 @@
else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful. else //power ratio 0 to 5; Gas power is overpowered. Fusion isn't nearly as powerful.
reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW) reaction_energy += gases_fused * FUSION_RELEASE_ENERGY_LOW * (power_ratio / FUSION_ENERGY_DIVISOR_LOW)
air.assert_gases(/datum/gas/bz, /datum/gas/carbon_dioxide)
cached_gases[/datum/gas/bz] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2 cached_gases[/datum/gas/bz] += gases_fused * FUSION_GAS_CREATION_FACTOR_BZ //10% of the gas is converted to energy, 90% to BZ and CO2
cached_gases[/datum/gas/carbon_dioxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2 cached_gases[/datum/gas/carbon_dioxide] += gases_fused * FUSION_GAS_CREATION_FACTOR_CO2
fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for fusion_prepare_to_die_edition_rng = power_ratio * FUSION_LOW_TIER_RAD_PROB_FACTOR //Low, but still something to look out for
@@ -324,7 +318,6 @@
var/old_heat_capacity = air.heat_capacity() var/old_heat_capacity = air.heat_capacity()
var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen],cached_gases[/datum/gas/nitrogen]) var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen],cached_gases[/datum/gas/nitrogen])
var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY
ASSERT_GAS(/datum/gas/nitryl,air)
if ((cached_gases[/datum/gas/oxygen] - heat_efficency < 0 )|| (cached_gases[/datum/gas/nitrogen] - heat_efficency < 0)) //Shouldn't produce gas from nothing. if ((cached_gases[/datum/gas/oxygen] - heat_efficency < 0 )|| (cached_gases[/datum/gas/nitrogen] - heat_efficency < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION return NO_REACTION
cached_gases[/datum/gas/oxygen] -= heat_efficency cached_gases[/datum/gas/oxygen] -= heat_efficency
@@ -359,7 +352,6 @@
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION return NO_REACTION
ASSERT_GAS(/datum/gas/bz,air)
cached_gases[/datum/gas/bz] += reaction_efficency cached_gases[/datum/gas/bz] += reaction_efficency
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
@@ -391,7 +383,6 @@
var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE,cached_gases[/datum/gas/tritium],cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/nitryl]) var/heat_scale = min(air.temperature/STIMULUM_HEAT_SCALE,cached_gases[/datum/gas/tritium],cached_gases[/datum/gas/plasma],cached_gases[/datum/gas/nitryl])
var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5) var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5)
ASSERT_GAS(/datum/gas/stimulum,air)
if ((cached_gases[/datum/gas/tritium] - heat_scale < 0 )|| (cached_gases[/datum/gas/plasma] - heat_scale < 0) || (cached_gases[/datum/gas/nitryl] - heat_scale < 0)) //Shouldn't produce gas from nothing. if ((cached_gases[/datum/gas/tritium] - heat_scale < 0 )|| (cached_gases[/datum/gas/plasma] - heat_scale < 0) || (cached_gases[/datum/gas/nitryl] - heat_scale < 0)) //Shouldn't produce gas from nothing.
return NO_REACTION return NO_REACTION
cached_gases[/datum/gas/stimulum]+= heat_scale/10 cached_gases[/datum/gas/stimulum]+= heat_scale/10
@@ -418,7 +409,6 @@
/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) /datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air)
var/list/cached_gases = air.gases var/list/cached_gases = air.gases
air.assert_gases(/datum/gas/hypernoblium,/datum/gas/bz)
var/old_heat_capacity = air.heat_capacity() var/old_heat_capacity = air.heat_capacity()
var/nob_formed = min((cached_gases[/datum/gas/nitrogen]+cached_gases[/datum/gas/tritium])/100,cached_gases[/datum/gas/tritium]/10,cached_gases[/datum/gas/nitrogen]/20) var/nob_formed = min((cached_gases[/datum/gas/nitrogen]+cached_gases[/datum/gas/tritium])/100,cached_gases[/datum/gas/tritium]/10,cached_gases[/datum/gas/nitrogen]/20)
var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz],1))) var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz],1)))
@@ -455,7 +445,6 @@
//Replace miasma with oxygen //Replace miasma with oxygen
var/cleaned_air = min(cached_gases[/datum/gas/miasma], 20 + (air.temperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) var/cleaned_air = min(cached_gases[/datum/gas/miasma], 20 + (air.temperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20)
cached_gases[/datum/gas/miasma] -= cleaned_air cached_gases[/datum/gas/miasma] -= cleaned_air
ASSERT_GAS(/datum/gas/oxygen,air)
cached_gases[/datum/gas/oxygen] += cleaned_air cached_gases[/datum/gas/oxygen] += cleaned_air
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
@@ -159,7 +159,6 @@
var/datum/gas_mixture/filtered_out = new var/datum/gas_mixture/filtered_out = new
filtered_out.temperature = removed.temperature filtered_out.temperature = removed.temperature
filtered_out.add_gas(filter_type)
filtered_out.gases[filter_type] = removed.gases[filter_type] filtered_out.gases[filter_type] = removed.gases[filter_type]
removed.gases[filter_type] = 0 removed.gases[filter_type] = 0
@@ -17,7 +17,6 @@
air_contents.volume = volume air_contents.volume = volume
air_contents.temperature = T20C air_contents.temperature = T20C
if(gas_type) if(gas_type)
air_contents.assert_gas(gas_type)
air_contents.gases[gas_type] = AIR_CONTENTS air_contents.gases[gas_type] = AIR_CONTENTS
name = "[name] ([GLOB.meta_gas_info[gas_type][META_GAS_NAME]])" name = "[name] ([GLOB.meta_gas_info[gas_type][META_GAS_NAME]])"
@@ -44,6 +43,5 @@
/obj/machinery/atmospherics/components/unary/tank/air/New() /obj/machinery/atmospherics/components/unary/tank/air/New()
..() ..()
var/datum/gas_mixture/air_contents = airs[1] var/datum/gas_mixture/air_contents = airs[1]
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen] = AIR_CONTENTS * 0.2 air_contents.gases[/datum/gas/oxygen] = AIR_CONTENTS * 0.2
air_contents.gases[/datum/gas/nitrogen] = AIR_CONTENTS * 0.8 air_contents.gases[/datum/gas/nitrogen] = AIR_CONTENTS * 0.8
@@ -197,7 +197,6 @@
filtered_out.temperature = removed.temperature filtered_out.temperature = removed.temperature
for(var/gas in filter_types & removed_gases) for(var/gas in filter_types & removed_gases)
filtered_out.add_gas(gas)
filtered_gases[gas] = removed_gases[gas] filtered_gases[gas] = removed_gases[gas]
removed_gases[gas] = 0 removed_gases[gas] = 0
@@ -131,7 +131,6 @@
if(!isopenturf(O)) if(!isopenturf(O))
return FALSE return FALSE
var/datum/gas_mixture/merger = new var/datum/gas_mixture/merger = new
merger.assert_gas(spawn_id)
merger.gases[spawn_id] = (spawn_mol) merger.gases[spawn_id] = (spawn_mol)
merger.temperature = spawn_temp merger.temperature = spawn_temp
O.assume_air(merger) O.assume_air(merger)
@@ -204,14 +204,12 @@
/obj/machinery/portable_atmospherics/canister/proc/create_gas() /obj/machinery/portable_atmospherics/canister/proc/create_gas()
if(gas_type) if(gas_type)
air_contents.add_gas(gas_type)
if(starter_temp) if(starter_temp)
air_contents.temperature = starter_temp air_contents.temperature = starter_temp
air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) air_contents.gases[gas_type] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
if(starter_temp) if(starter_temp)
air_contents.temperature = starter_temp air_contents.temperature = starter_temp
/obj/machinery/portable_atmospherics/canister/air/create_gas() /obj/machinery/portable_atmospherics/canister/air/create_gas()
air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) air_contents.gases[/datum/gas/oxygen] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) air_contents.gases[/datum/gas/nitrogen] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
@@ -45,7 +45,6 @@
filtered.temperature = filtering.temperature filtered.temperature = filtering.temperature
for(var/gas in filtering.gases & scrubbing) for(var/gas in filtering.gases & scrubbing)
filtered.add_gas(gas)
filtered.gases[gas] = filtering.gases[gas] // Shuffle the "bad" gasses to the filtered mixture. filtered.gases[gas] = filtering.gases[gas] // Shuffle the "bad" gasses to the filtered mixture.
filtering.gases[gas] = 0 filtering.gases[gas] = 0
filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture.
@@ -374,7 +374,6 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
if(GLOB.meta_gas_info[filtered_gas][META_GAS_NAME] in wanted) if(GLOB.meta_gas_info[filtered_gas][META_GAS_NAME] in wanted)
//The gas that is put in all the filtered out gases //The gas that is put in all the filtered out gases
filtered_out.temperature = removed.temperature filtered_out.temperature = removed.temperature
filtered_out.add_gas(filtered_gas)
filtered_out.gases[filtered_gas] = removed.gases[filtered_gas] filtered_out.gases[filtered_gas] = removed.gases[filtered_gas]
//The filtered out gas is entirely removed from the currently filtered gases //The filtered out gas is entirely removed from the currently filtered gases
@@ -15,8 +15,6 @@
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases var/list/breath_gases = breath.gases
breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
//Partial pressure of the toxins in our breath //Partial pressure of the toxins in our breath
var/Toxins_pp = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure var/Toxins_pp = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
-2
View File
@@ -150,7 +150,6 @@
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases var/list/breath_gases = breath.gases
breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz)
var/O2_partialpressure = (breath_gases[/datum/gas/oxygen]/breath.total_moles())*breath_pressure var/O2_partialpressure = (breath_gases[/datum/gas/oxygen]/breath.total_moles())*breath_pressure
var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide]/breath.total_moles())*breath_pressure var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide]/breath.total_moles())*breath_pressure
@@ -345,7 +344,6 @@
var/list/cached_gases = miasma_turf.air.gases var/list/cached_gases = miasma_turf.air.gases
ASSERT_GAS(/datum/gas/miasma, miasma_turf.air)
cached_gases[/datum/gas/miasma] += 0.02 cached_gases[/datum/gas/miasma] += 0.02
/mob/living/carbon/proc/handle_blood() /mob/living/carbon/proc/handle_blood()
@@ -207,7 +207,6 @@
var/turf/open/ST = src.loc var/turf/open/ST = src.loc
if(ST.air) if(ST.air)
var/ST_gases = ST.air.gases var/ST_gases = ST.air.gases
ST.air.assert_gases(arglist(GLOB.hardcoded_gases))
var/tox = ST_gases[/datum/gas/plasma] var/tox = ST_gases[/datum/gas/plasma]
var/oxy = ST_gases[/datum/gas/oxygen] var/oxy = ST_gases[/datum/gas/oxygen]
@@ -45,7 +45,6 @@
else else
var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma]) var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma])
loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained
loaded_tank.air_contents.assert_gas(/datum/gas/tritium)
loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained
loaded_tank.air_contents.garbage_collect() loaded_tank.air_contents.garbage_collect()
@@ -60,7 +59,6 @@
var/gasdrained = bitcoinproduction_drain*drainratio var/gasdrained = bitcoinproduction_drain*drainratio
loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained
loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained
loaded_tank.air_contents.assert_gas(/datum/gas/carbon_dioxide)
loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2 loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2
loaded_tank.air_contents.garbage_collect() loaded_tank.air_contents.garbage_collect()
var/bitcoins_mined = RAD_COLLECTOR_OUTPUT var/bitcoins_mined = RAD_COLLECTOR_OUTPUT
@@ -339,7 +339,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(damage > damage_archived && prob(10)) if(damage > damage_archived && prob(10))
playsound(get_turf(src), 'sound/effects/empulse.ogg', 50, 1) playsound(get_turf(src), 'sound/effects/empulse.ogg', 50, 1)
removed.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/nitrogen)
//calculating gas related values //calculating gas related values
combined_gas = max(removed.total_moles(), 0) combined_gas = max(removed.total_moles(), 0)
@@ -101,7 +101,6 @@ Chilling extracts:
for(var/turf/open/T in A) for(var/turf/open/T in A)
var/datum/gas_mixture/G = T.air var/datum/gas_mixture/G = T.air
if(istype(G)) if(istype(G))
G.assert_gas(/datum/gas/plasma)
G.gases[/datum/gas/plasma] = 0 G.gases[/datum/gas/plasma] = 0
filtered = TRUE filtered = TRUE
G.garbage_collect() G.garbage_collect()
-2
View File
@@ -84,8 +84,6 @@
var/list/breath_gases = breath.gases var/list/breath_gases = breath.gases
breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitrogen, /datum/gas/tritium, /datum/gas/nitryl, /datum/gas/pluoxium, /datum/gas/stimulum)
//Partial pressures in our breath //Partial pressures in our breath
var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium])) var/O2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/oxygen])+(8*breath.get_breath_partial_pressure(breath_gases[/datum/gas/pluoxium]))
var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen]) var/N2_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/nitrogen])
@@ -89,7 +89,6 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
if(total_moles) if(total_moles)
var/list/env_gases = environment.gases var/list/env_gases = environment.gases
environment.assert_gases(arglist(GLOB.hardcoded_gases))
var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles var/o2_concentration = env_gases[/datum/gas/oxygen]/total_moles
var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles var/n2_concentration = env_gases[/datum/gas/nitrogen]/total_moles
var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles var/co2_concentration = env_gases[/datum/gas/carbon_dioxide]/total_moles