mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 11:34:19 +01:00
Adds Hydrogen - The Framework for more Atmos Gases (#30742)
* IMPORTANT MILESTONE, AIR IS BREATHABLE * the vibrations of the SM in my headphones are pleasing (no stupid hotspots) * sanity check, it all works * SM is fine * this will work first try * linter * "thank you, warriorstar" everyone says in unison * Build Rust library * finishing touches (hopefully) * Build Rust library * update gas_mixture.dm to include hydrogen burning * Build Rust library * hydrogen should be the right color on gas analyzers * i JUST rebuilt it * adds agent B and Hydrogen floors * update the h2 canister * caniser bad speling * in aa we trust * Build Rust library * Build Rust library --------- Co-authored-by: paradisess13[bot] <165046124+paradisess13[bot]@users.noreply.github.com>
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
if(T.active_hotspot)
|
||||
burning = 1
|
||||
|
||||
to_chat(usr, "<span class='notice'>@[target.x],[target.y]: O:[GM.oxygen()] T:[GM.toxins()] N:[GM.nitrogen()] C:[GM.carbon_dioxide()] N2O: [GM.sleeping_agent()] Agent B: [GM.agent_b()] w [GM.temperature()] Kelvin, [GM.return_pressure()] kPa [(burning)?("<span class='warning'>BURNING</span>"):(null)]</span>")
|
||||
to_chat(usr, "<span class='notice'>@[target.x],[target.y]: O:[GM.oxygen()] T:[GM.toxins()] N:[GM.nitrogen()] C:[GM.carbon_dioxide()] N2O: [GM.sleeping_agent()] Agent B: [GM.agent_b()] Hydrogen: [GM.hydrogen()] w [GM.temperature()] Kelvin, [GM.return_pressure()] kPa [(burning)?("<span class='warning'>BURNING</span>"):(null)]</span>")
|
||||
|
||||
message_admins("[key_name_admin(usr)] has checked the air status of [target]")
|
||||
log_admin("[key_name(usr)] has checked the air status of [target]")
|
||||
|
||||
@@ -144,4 +144,7 @@
|
||||
G.set_oxygen(G.oxygen() + MOLES_O2STANDARD * amount)
|
||||
G.set_nitrogen(G.nitrogen() + MOLES_N2STANDARD * amount)
|
||||
|
||||
if(flag & LINDA_SPAWN_HYDROGEN)
|
||||
G.set_hydrogen(G.hydrogen() + amount)
|
||||
|
||||
blind_release_air(G)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
air.set_toxins(toxins)
|
||||
air.set_sleeping_agent(sleeping_agent)
|
||||
air.set_agent_b(agent_b)
|
||||
air.set_hydrogen(hydrogen)
|
||||
air.set_temperature(temperature)
|
||||
else
|
||||
air.set_oxygen(0)
|
||||
@@ -20,6 +21,7 @@
|
||||
air.set_toxins(0)
|
||||
air.set_sleeping_agent(0)
|
||||
air.set_agent_b(0)
|
||||
air.set_hydrogen(0)
|
||||
air.set_temperature(0)
|
||||
return air
|
||||
|
||||
@@ -178,7 +180,7 @@
|
||||
/turf/proc/Initialize_Atmos(milla_tick)
|
||||
// This is one of two places expected to call this otherwise-unsafe method.
|
||||
var/list/connectivity = private_unsafe_recalculate_atmos_connectivity()
|
||||
var/list/air = list(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature)
|
||||
var/list/air = list(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, hydrogen, temperature)
|
||||
milla_data = connectivity[1] + list(atmos_mode, SSmapping.environments[atmos_environment]) + air + connectivity[2]
|
||||
|
||||
/turf/simulated/Initialize_Atmos(milla_tick)
|
||||
|
||||
@@ -8,9 +8,16 @@ What are the archived variables for?
|
||||
#define SPECIFIC_HEAT_CDO 30
|
||||
#define SPECIFIC_HEAT_N2O 40
|
||||
#define SPECIFIC_HEAT_AGENT_B 300
|
||||
#define SPECIFIC_HEAT_HYDROGEN 15
|
||||
|
||||
#define HEAT_CAPACITY_CALCULATION(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, innate_heat_capacity) \
|
||||
(carbon_dioxide * SPECIFIC_HEAT_CDO + (oxygen + nitrogen) * SPECIFIC_HEAT_AIR + toxins * SPECIFIC_HEAT_TOXIN + sleeping_agent * SPECIFIC_HEAT_N2O + agent_b * SPECIFIC_HEAT_AGENT_B + innate_heat_capacity)
|
||||
#define HEAT_CAPACITY_CALCULATION(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, hydrogen, innate_heat_capacity) \
|
||||
(carbon_dioxide * SPECIFIC_HEAT_CDO + \
|
||||
(oxygen + nitrogen) * SPECIFIC_HEAT_AIR + \
|
||||
toxins * SPECIFIC_HEAT_TOXIN + \
|
||||
sleeping_agent * SPECIFIC_HEAT_N2O + \
|
||||
agent_b * SPECIFIC_HEAT_AGENT_B + \
|
||||
hydrogen * SPECIFIC_HEAT_HYDROGEN + \
|
||||
innate_heat_capacity)
|
||||
|
||||
#define MINIMUM_HEAT_CAPACITY 0.0003
|
||||
#define MINIMUM_MOLE_COUNT 0.01
|
||||
@@ -32,6 +39,7 @@ What are the archived variables for?
|
||||
var/private_toxins = 0
|
||||
var/private_sleeping_agent = 0
|
||||
var/private_agent_b = 0
|
||||
var/private_hydrogen = 0
|
||||
var/private_temperature = 0 //in Kelvin
|
||||
var/private_hotspot_temperature = 0
|
||||
var/private_hotspot_volume = 0
|
||||
@@ -45,6 +53,7 @@ What are the archived variables for?
|
||||
var/private_toxins_archived = 0
|
||||
var/private_sleeping_agent_archived = 0
|
||||
var/private_agent_b_archived = 0
|
||||
var/private_hydrogen_archived = 0
|
||||
var/private_temperature_archived = 0
|
||||
|
||||
/// Is this mixture currently synchronized with MILLA? Always true for non-bound mixtures.
|
||||
@@ -120,6 +129,18 @@ What are the archived variables for?
|
||||
stack_trace("Out-of-bounds value [value] clamped to [clamped].")
|
||||
private_agent_b = clamped
|
||||
|
||||
/datum/gas_mixture/proc/hydrogen()
|
||||
return private_hydrogen
|
||||
|
||||
/datum/gas_mixture/proc/set_hydrogen(value)
|
||||
if(isnan(value) || !isnum(value))
|
||||
CRASH("Bad value: [value]")
|
||||
var/clamped = clamp(value, 0, 1e10)
|
||||
if(value != clamped)
|
||||
stack_trace("Out-of-bounds value [value] clamped to [clamped].")
|
||||
private_hydrogen = clamped
|
||||
|
||||
|
||||
/datum/gas_mixture/proc/temperature()
|
||||
return private_temperature
|
||||
|
||||
@@ -142,14 +163,14 @@ What are the archived variables for?
|
||||
|
||||
///joules per kelvin
|
||||
/datum/gas_mixture/proc/heat_capacity()
|
||||
return HEAT_CAPACITY_CALCULATION(private_oxygen, private_carbon_dioxide, private_nitrogen, private_toxins, private_sleeping_agent, private_agent_b, innate_heat_capacity)
|
||||
return HEAT_CAPACITY_CALCULATION(private_oxygen, private_carbon_dioxide, private_nitrogen, private_toxins, private_sleeping_agent, private_agent_b, private_hydrogen, innate_heat_capacity)
|
||||
|
||||
/datum/gas_mixture/proc/heat_capacity_archived()
|
||||
return HEAT_CAPACITY_CALCULATION(private_oxygen_archived, private_carbon_dioxide_archived, private_nitrogen_archived, private_toxins_archived, private_sleeping_agent_archived, private_agent_b_archived, innate_heat_capacity)
|
||||
return HEAT_CAPACITY_CALCULATION(private_oxygen_archived, private_carbon_dioxide_archived, private_nitrogen_archived, private_toxins_archived, private_sleeping_agent_archived, private_agent_b_archived, private_hydrogen_archived, innate_heat_capacity)
|
||||
|
||||
/// Calculate moles
|
||||
/datum/gas_mixture/proc/total_moles()
|
||||
return private_oxygen + private_carbon_dioxide + private_nitrogen + private_toxins + private_sleeping_agent + private_agent_b
|
||||
return private_oxygen + private_carbon_dioxide + private_nitrogen + private_toxins + private_sleeping_agent + private_agent_b + private_hydrogen
|
||||
|
||||
/datum/gas_mixture/proc/total_trace_moles()
|
||||
return private_agent_b
|
||||
@@ -176,6 +197,7 @@ What are the archived variables for?
|
||||
private_toxins_archived = private_toxins
|
||||
private_sleeping_agent_archived = private_sleeping_agent
|
||||
private_agent_b_archived = private_agent_b
|
||||
private_hydrogen_archived = private_hydrogen
|
||||
|
||||
private_temperature_archived = private_temperature
|
||||
|
||||
@@ -200,6 +222,7 @@ What are the archived variables for?
|
||||
private_toxins += giver.private_toxins
|
||||
private_sleeping_agent += giver.private_sleeping_agent
|
||||
private_agent_b += giver.private_agent_b
|
||||
private_hydrogen += giver.private_hydrogen
|
||||
|
||||
set_dirty()
|
||||
return TRUE
|
||||
@@ -228,6 +251,7 @@ What are the archived variables for?
|
||||
removed.private_toxins = QUANTIZE((private_toxins / sum) * amount)
|
||||
removed.private_sleeping_agent = QUANTIZE((private_sleeping_agent / sum) * amount)
|
||||
removed.private_agent_b = QUANTIZE((private_agent_b / sum) * amount)
|
||||
removed.private_hydrogen = QUANTIZE((private_hydrogen / sum) * amount)
|
||||
|
||||
private_oxygen = max(private_oxygen - removed.private_oxygen, 0)
|
||||
private_nitrogen = max(private_nitrogen - removed.private_nitrogen, 0)
|
||||
@@ -235,6 +259,7 @@ What are the archived variables for?
|
||||
private_toxins = max(private_toxins - removed.private_toxins, 0)
|
||||
private_sleeping_agent = max(private_sleeping_agent - removed.private_sleeping_agent, 0)
|
||||
private_agent_b = max(private_agent_b - removed.private_agent_b, 0)
|
||||
private_hydrogen = max(private_hydrogen - removed.private_hydrogen, 0)
|
||||
|
||||
removed.private_temperature = private_temperature
|
||||
|
||||
@@ -258,6 +283,7 @@ What are the archived variables for?
|
||||
removed.private_toxins = QUANTIZE(private_toxins * ratio)
|
||||
removed.private_sleeping_agent = QUANTIZE(private_sleeping_agent * ratio)
|
||||
removed.private_agent_b = QUANTIZE(private_agent_b * ratio)
|
||||
removed.private_hydrogen = QUANTIZE(private_hydrogen * ratio)
|
||||
|
||||
private_oxygen = max(private_oxygen - removed.private_oxygen, 0)
|
||||
private_nitrogen = max(private_nitrogen - removed.private_nitrogen, 0)
|
||||
@@ -265,6 +291,7 @@ What are the archived variables for?
|
||||
private_toxins = max(private_toxins - removed.private_toxins, 0)
|
||||
private_sleeping_agent = max(private_sleeping_agent - removed.private_sleeping_agent, 0)
|
||||
private_agent_b = max(private_agent_b - removed.private_agent_b, 0)
|
||||
private_hydrogen = max(private_hydrogen - removed.private_hydrogen, 0)
|
||||
|
||||
removed.private_temperature = private_temperature
|
||||
set_dirty()
|
||||
@@ -279,6 +306,7 @@ What are the archived variables for?
|
||||
private_toxins = sample.private_toxins
|
||||
private_sleeping_agent = sample.private_sleeping_agent
|
||||
private_agent_b = sample.private_agent_b
|
||||
private_hydrogen = sample.private_hydrogen
|
||||
|
||||
private_temperature = sample.private_temperature
|
||||
set_dirty()
|
||||
@@ -294,6 +322,7 @@ What are the archived variables for?
|
||||
private_toxins = model.toxins
|
||||
private_sleeping_agent = model.sleeping_agent
|
||||
private_agent_b = model.agent_b
|
||||
private_hydrogen = model.hydrogen
|
||||
|
||||
//acounts for changes in temperature
|
||||
var/turf/model_parent = model.parent_type
|
||||
@@ -318,6 +347,7 @@ What are the archived variables for?
|
||||
var/delta_toxins = QUANTIZE(private_toxins_archived - sharer.private_toxins_archived) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_sleeping_agent = QUANTIZE(private_sleeping_agent_archived - sharer.private_sleeping_agent_archived) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_agent_b = QUANTIZE(private_agent_b_archived - sharer.private_agent_b_archived) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_hydrogen = QUANTIZE(private_hydrogen_archived - sharer.private_hydrogen_archived) / (atmos_adjacent_turfs + 1)
|
||||
|
||||
var/delta_temperature = (private_temperature_archived - sharer.private_temperature_archived)
|
||||
|
||||
@@ -365,6 +395,13 @@ What are the archived variables for?
|
||||
else
|
||||
heat_capacity_sharer_to_self -= agent_b_heat_capacity
|
||||
|
||||
if(delta_hydrogen)
|
||||
var/hydrogen_heat_capacity = SPECIFIC_HEAT_HYDROGEN * delta_hydrogen
|
||||
if(delta_hydrogen > 0)
|
||||
heat_capacity_self_to_sharer += hydrogen_heat_capacity
|
||||
else
|
||||
heat_capacity_sharer_to_self -= hydrogen_heat_capacity
|
||||
|
||||
old_self_heat_capacity = heat_capacity()
|
||||
old_sharer_heat_capacity = sharer.heat_capacity()
|
||||
|
||||
@@ -386,7 +423,10 @@ What are the archived variables for?
|
||||
private_agent_b -= delta_agent_b
|
||||
sharer.private_agent_b += delta_agent_b
|
||||
|
||||
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b)
|
||||
private_hydrogen -= delta_hydrogen
|
||||
sharer.private_hydrogen += delta_hydrogen
|
||||
|
||||
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b + delta_hydrogen)
|
||||
|
||||
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
|
||||
var/new_self_heat_capacity = old_self_heat_capacity + heat_capacity_sharer_to_self - heat_capacity_self_to_sharer
|
||||
@@ -416,6 +456,7 @@ What are the archived variables for?
|
||||
var/delta_toxins = QUANTIZE(private_toxins_archived - model.toxins) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_sleeping_agent = QUANTIZE(private_sleeping_agent_archived - model.sleeping_agent) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_agent_b = QUANTIZE(private_agent_b_archived - model.agent_b) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_hydrogen = QUANTIZE(private_hydrogen_archived - model.hydrogen) / (atmos_adjacent_turfs + 1)
|
||||
|
||||
var/delta_temperature = (private_temperature_archived - model.temperature)
|
||||
|
||||
@@ -451,6 +492,11 @@ What are the archived variables for?
|
||||
heat_transferred -= agent_b_heat_capacity * model.temperature
|
||||
heat_capacity_transferred -= agent_b_heat_capacity
|
||||
|
||||
if(delta_hydrogen)
|
||||
var/hydrogen_heat_capacity = SPECIFIC_HEAT_HYDROGEN * delta_hydrogen
|
||||
heat_transferred -= hydrogen_heat_capacity * model.temperature
|
||||
heat_capacity_transferred -= hydrogen_heat_capacity
|
||||
|
||||
old_self_heat_capacity = heat_capacity()
|
||||
|
||||
private_oxygen -= delta_oxygen
|
||||
@@ -459,8 +505,9 @@ What are the archived variables for?
|
||||
private_toxins -= delta_toxins
|
||||
private_sleeping_agent -= delta_sleeping_agent
|
||||
private_agent_b -= delta_agent_b
|
||||
private_hydrogen -= delta_hydrogen
|
||||
|
||||
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b)
|
||||
var/moved_moles = (delta_oxygen + delta_carbon_dioxide + delta_nitrogen + delta_toxins + delta_sleeping_agent + delta_agent_b + delta_hydrogen)
|
||||
|
||||
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
|
||||
var/new_self_heat_capacity = old_self_heat_capacity - heat_capacity_transferred
|
||||
@@ -471,7 +518,7 @@ What are the archived variables for?
|
||||
|
||||
set_dirty()
|
||||
if((delta_temperature > MINIMUM_TEMPERATURE_TO_MOVE) || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE)
|
||||
var/delta_pressure = private_temperature_archived * (total_moles() + moved_moles) - model.temperature * (model.oxygen + model.carbon_dioxide + model.nitrogen + model.toxins + model.sleeping_agent + model.agent_b)
|
||||
var/delta_pressure = private_temperature_archived * (total_moles() + moved_moles) - model.temperature * (model.oxygen + model.carbon_dioxide + model.nitrogen + model.toxins + model.sleeping_agent + model.agent_b + model.hydrogen)
|
||||
return delta_pressure * R_IDEAL_GAS_EQUATION / volume
|
||||
else
|
||||
return 0
|
||||
@@ -484,6 +531,7 @@ What are the archived variables for?
|
||||
var/delta_toxins = (private_toxins_archived - model.toxins) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_sleeping_agent = (private_sleeping_agent_archived - model.sleeping_agent) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_agent_b = (private_agent_b_archived - model.agent_b) / (atmos_adjacent_turfs + 1)
|
||||
var/delta_hydrogen = (private_hydrogen_archived - model.hydrogen) / (atmos_adjacent_turfs + 1)
|
||||
|
||||
var/delta_temperature = (private_temperature_archived - model.temperature)
|
||||
|
||||
@@ -492,7 +540,8 @@ What are the archived variables for?
|
||||
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= private_nitrogen_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= private_toxins_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_sleeping_agent) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_sleeping_agent) >= private_sleeping_agent_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= private_agent_b_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)))
|
||||
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= private_agent_b_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_hydrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_hydrogen) >= private_hydrogen_archived * MINIMUM_AIR_RATIO_TO_SUSPEND)))
|
||||
return FALSE
|
||||
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
|
||||
return FALSE
|
||||
@@ -561,6 +610,9 @@ What are the archived variables for?
|
||||
if((abs(private_agent_b - sample.private_agent_b) > MINIMUM_AIR_TO_SUSPEND) && \
|
||||
((private_agent_b < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.private_agent_b) || (private_agent_b > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.private_agent_b)))
|
||||
return FALSE
|
||||
if((abs(private_hydrogen - sample.private_hydrogen) > MINIMUM_AIR_TO_SUSPEND) && \
|
||||
((private_hydrogen < (1 - MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.private_hydrogen) || (private_hydrogen > (1 + MINIMUM_AIR_RATIO_TO_SUSPEND) * sample.private_hydrogen)))
|
||||
return FALSE
|
||||
|
||||
if(total_moles() > MINIMUM_AIR_TO_SUSPEND)
|
||||
if((abs(private_temperature - sample.private_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND) && \
|
||||
@@ -575,6 +627,7 @@ What are the archived variables for?
|
||||
var/delta_toxins = (private_toxins - model.toxins)
|
||||
var/delta_sleeping_agent = (private_sleeping_agent - model.sleeping_agent)
|
||||
var/delta_agent_b = (private_agent_b - model.agent_b)
|
||||
var/delta_hydrogen = (private_hydrogen - model.hydrogen)
|
||||
|
||||
var/delta_temperature = (private_temperature - model.temperature)
|
||||
|
||||
@@ -583,7 +636,8 @@ What are the archived variables for?
|
||||
|| ((abs(delta_nitrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_nitrogen) >= private_nitrogen * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_toxins) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_toxins) >= private_toxins * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_sleeping_agent) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_sleeping_agent) >= private_sleeping_agent * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= private_agent_b * MINIMUM_AIR_RATIO_TO_SUSPEND)))
|
||||
|| ((abs(delta_agent_b) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_agent_b) >= private_agent_b * MINIMUM_AIR_RATIO_TO_SUSPEND)) \
|
||||
|| ((abs(delta_hydrogen) > MINIMUM_AIR_TO_SUSPEND) && (abs(delta_hydrogen) >= private_hydrogen * MINIMUM_AIR_RATIO_TO_SUSPEND)))
|
||||
return FALSE
|
||||
if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND)
|
||||
return FALSE
|
||||
@@ -668,6 +722,34 @@ What are the archived variables for?
|
||||
if(fuel_burnt)
|
||||
reacting = TRUE
|
||||
|
||||
// handles hydrogen burning
|
||||
if((private_hydrogen >= 0) && (private_oxygen >= 0) && private_temperature > HYDROGEN_MIN_IGNITE_TEMP)
|
||||
// Calculate the reaction rate based on temperature and pressure
|
||||
var/reaction_rate = (private_temperature / (private_temperature + 2000)) * (return_pressure() / (return_pressure() + 100))
|
||||
// Burn a portion of our hydrogen equal to reaction_rate, but no more than we have or have oxygen for.
|
||||
var/burned_hydrogen = min(reaction_rate * private_hydrogen, private_hydrogen, private_oxygen * 2)
|
||||
var/burned_oxygen = min(burned_hydrogen / 2, private_oxygen)
|
||||
// var/produced_water_vapor = (burned_hydrogen / H2_NEEDED_FOR_H2O)
|
||||
|
||||
|
||||
var/old_heat_capacity = heat_capacity()
|
||||
|
||||
// Burn gasses
|
||||
private_hydrogen -= burned_hydrogen
|
||||
private_oxygen -= burned_oxygen
|
||||
// private_water_vapor += produced_water_vapor
|
||||
|
||||
// Calculate gained energy
|
||||
var/energy_released = HYDROGEN_BURN_ENERGY * burned_hydrogen
|
||||
// Calculate post-burn heat capacity
|
||||
var/new_heat_capacity = heat_capacity()
|
||||
// Calculate new temperature
|
||||
if(new_heat_capacity > MINIMUM_HEAT_CAPACITY)
|
||||
private_temperature = (private_temperature * old_heat_capacity + energy_released) / new_heat_capacity
|
||||
|
||||
if(fuel_burnt)
|
||||
reacting = TRUE
|
||||
|
||||
set_dirty()
|
||||
return reacting
|
||||
|
||||
@@ -691,6 +773,7 @@ What are the archived variables for?
|
||||
private_toxins = milla[MILLA_INDEX_TOXINS]
|
||||
private_sleeping_agent = milla[MILLA_INDEX_SLEEPING_AGENT]
|
||||
private_agent_b = milla[MILLA_INDEX_AGENT_B]
|
||||
private_hydrogen = milla[MILLA_INDEX_HYDROGEN]
|
||||
innate_heat_capacity = milla[MILLA_INDEX_INNATE_HEAT_CAPACITY]
|
||||
private_temperature = milla[MILLA_INDEX_TEMPERATURE]
|
||||
private_hotspot_temperature = milla[MILLA_INDEX_HOTSPOT_TEMPERATURE]
|
||||
@@ -705,6 +788,7 @@ What are the archived variables for?
|
||||
var/total_carbon_dioxide = 0
|
||||
var/total_sleeping_agent = 0
|
||||
var/total_agent_b = 0
|
||||
var/total_hydrogen = 0
|
||||
var/must_share = FALSE
|
||||
|
||||
// Collect all the cheap data and check if there's a significant temperature difference.
|
||||
@@ -725,11 +809,12 @@ What are the archived variables for?
|
||||
total_carbon_dioxide += G.private_carbon_dioxide
|
||||
total_sleeping_agent += G.private_sleeping_agent
|
||||
total_agent_b += G.private_agent_b
|
||||
total_hydrogen += G.private_hydrogen
|
||||
|
||||
if(total_volume == 0)
|
||||
return
|
||||
|
||||
if(total_volume < 0 || isnan(total_volume) || !isnum(total_volume) || total_oxygen < 0 || isnan(total_oxygen) || !isnum(total_oxygen) || total_nitrogen < 0 || isnan(total_nitrogen) || !isnum(total_nitrogen) || total_toxins < 0 || isnan(total_toxins) || !isnum(total_toxins) || total_carbon_dioxide < 0 || isnan(total_carbon_dioxide) || !isnum(total_carbon_dioxide) || total_sleeping_agent < 0 || isnan(total_sleeping_agent) || !isnum(total_sleeping_agent) || total_agent_b < 0 || isnan(total_agent_b) || !isnum(total_agent_b))
|
||||
if(total_volume < 0 || isnan(total_volume) || !isnum(total_volume) || total_oxygen < 0 || isnan(total_oxygen) || !isnum(total_oxygen) || total_nitrogen < 0 || isnan(total_nitrogen) || !isnum(total_nitrogen) || total_toxins < 0 || isnan(total_toxins) || !isnum(total_toxins) || total_carbon_dioxide < 0 || isnan(total_carbon_dioxide) || !isnum(total_carbon_dioxide) || total_sleeping_agent < 0 || isnan(total_sleeping_agent) || !isnum(total_sleeping_agent) || total_agent_b < 0 || isnan(total_agent_b) || !isnum(total_agent_b) || total_hydrogen < 0 || isnan(total_hydrogen) || !isnum(total_hydrogen))
|
||||
CRASH("A pipenet with [length(mixtures)] connected airs is corrupt and cannot flow safely. Pipenet root is [root] at ([root.x], [root.y], [root.z]).")
|
||||
|
||||
// If we don't have a significant temperature difference, check for a significant gas amount difference.
|
||||
@@ -755,6 +840,9 @@ What are the archived variables for?
|
||||
if(abs(G.private_agent_b - total_agent_b * G.volume / total_volume) > 0.1)
|
||||
must_share = TRUE
|
||||
break
|
||||
if(abs(G.private_hydrogen - total_hydrogen * G.volume / total_volume) > 0.1)
|
||||
must_share = TRUE
|
||||
break
|
||||
|
||||
if(!must_share)
|
||||
// Nothing significant, don't do any more work.
|
||||
@@ -788,6 +876,7 @@ What are the archived variables for?
|
||||
G.private_carbon_dioxide = total_carbon_dioxide * G.volume / total_volume
|
||||
G.private_sleeping_agent = total_sleeping_agent * G.volume / total_volume
|
||||
G.private_agent_b = total_agent_b * G.volume / total_volume
|
||||
G.private_hydrogen = total_hydrogen * G.volume / total_volume
|
||||
|
||||
G.private_temperature = temperature
|
||||
// In theory, we should G.set_dirty() here, but that's only useful for bound mixtures, and these can't be.
|
||||
@@ -800,6 +889,7 @@ What are the archived variables for?
|
||||
#undef SPECIFIC_HEAT_CDO
|
||||
#undef SPECIFIC_HEAT_N2O
|
||||
#undef SPECIFIC_HEAT_AGENT_B
|
||||
#undef SPECIFIC_HEAT_HYDROGEN
|
||||
#undef HEAT_CAPACITY_CALCULATION
|
||||
#undef MINIMUM_HEAT_CAPACITY
|
||||
#undef MINIMUM_MOLE_COUNT
|
||||
@@ -826,6 +916,7 @@ What are the archived variables for?
|
||||
readonly.private_toxins = private_toxins
|
||||
readonly.private_sleeping_agent = private_sleeping_agent
|
||||
readonly.private_agent_b = private_agent_b
|
||||
readonly.private_hydrogen = private_hydrogen
|
||||
readonly.private_temperature = private_temperature
|
||||
readonly.private_hotspot_temperature = private_hotspot_temperature
|
||||
readonly.private_hotspot_volume = private_hotspot_volume
|
||||
@@ -860,6 +951,10 @@ What are the archived variables for?
|
||||
private_agent_b = value
|
||||
set_dirty()
|
||||
|
||||
/datum/gas_mixture/bound_to_turf/set_hydrogen(value)
|
||||
private_hydrogen = value
|
||||
set_dirty()
|
||||
|
||||
/datum/gas_mixture/bound_to_turf/set_temperature(value)
|
||||
private_temperature = value
|
||||
set_dirty()
|
||||
@@ -871,8 +966,17 @@ What are the archived variables for?
|
||||
private_hotspot_volume = max(private_hotspot_volume, (volume / CELL_VOLUME))
|
||||
|
||||
/datum/gas_mixture/bound_to_turf/proc/private_unsafe_write()
|
||||
set_tile_atmos(bound_turf, oxygen = private_oxygen, carbon_dioxide = private_carbon_dioxide, nitrogen = private_nitrogen, toxins = private_toxins, sleeping_agent = private_sleeping_agent, agent_b = private_agent_b, temperature = private_temperature)
|
||||
|
||||
set_tile_atmos(
|
||||
bound_turf,
|
||||
oxygen = private_oxygen,
|
||||
carbon_dioxide = private_carbon_dioxide,
|
||||
nitrogen = private_nitrogen,
|
||||
toxins = private_toxins,
|
||||
sleeping_agent = private_sleeping_agent,
|
||||
agent_b = private_agent_b,
|
||||
hydrogen = private_hydrogen,
|
||||
temperature = private_temperature
|
||||
)
|
||||
/datum/gas_mixture/bound_to_turf/proc/get_readonly()
|
||||
if(isnull(readonly))
|
||||
readonly = new(src)
|
||||
@@ -888,6 +992,7 @@ What are the archived variables for?
|
||||
private_toxins = parent.private_toxins
|
||||
private_sleeping_agent = parent.private_sleeping_agent
|
||||
private_agent_b = parent.private_agent_b
|
||||
private_hydrogen = parent.private_hydrogen
|
||||
|
||||
private_temperature = parent.private_temperature
|
||||
private_hotspot_temperature = parent.private_hotspot_temperature
|
||||
@@ -915,5 +1020,8 @@ What are the archived variables for?
|
||||
/datum/gas_mixture/readonly/set_agent_b(value)
|
||||
CRASH("Attempted to modify a readonly gas_mixture.")
|
||||
|
||||
/datum/gas_mixture/readonly/set_hydrogen(value)
|
||||
CRASH("Attempted to modify a readonly gas_mixture.")
|
||||
|
||||
/datum/gas_mixture/readonly/set_temperature(value)
|
||||
CRASH("Attempted to modify a readonly gas_mixture.")
|
||||
|
||||
@@ -151,6 +151,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"nitrous oxide" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"hydrogen" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20), /* kpa */
|
||||
"temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K
|
||||
@@ -163,6 +164,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"nitrous oxide" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"hydrogen" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20), /* kpa */
|
||||
"temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), // K
|
||||
@@ -174,6 +176,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"nitrous oxide" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"hydrogen" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.50,ONE_ATMOSPHERE*1.60), /* kpa */
|
||||
"temperature" = new/datum/tlv(T0C-50, T0C-20, T0C, T20C), // K
|
||||
@@ -185,6 +188,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"nitrous oxide" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"hydrogen" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), /* kpa */
|
||||
"temperature" = new/datum/tlv(0, 0, T20C + 5, T20C + 15), // K
|
||||
@@ -197,6 +201,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"nitrous oxide" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"hydrogen" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), /* kpa */
|
||||
"temperature" = new/datum/tlv(-1.0, -1.0, -1.0, -1.0), // K
|
||||
@@ -294,6 +299,9 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
cur_tlv = TLV["nitrous oxide"]
|
||||
var/sleeping_agent_dangerlevel = cur_tlv.get_danger_level(environment.sleeping_agent() * GET_PP)
|
||||
|
||||
cur_tlv = TLV["hydrogen"]
|
||||
var/hydrogen_dangerlevel = cur_tlv.get_danger_level(environment.hydrogen() * GET_PP)
|
||||
|
||||
cur_tlv = TLV["other"]
|
||||
var/other_dangerlevel = cur_tlv.get_danger_level(environment.total_trace_moles() * GET_PP)
|
||||
|
||||
@@ -308,6 +316,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
co2_dangerlevel,
|
||||
plasma_dangerlevel,
|
||||
sleeping_agent_dangerlevel,
|
||||
hydrogen_dangerlevel,
|
||||
other_dangerlevel,
|
||||
temperature_dangerlevel
|
||||
)
|
||||
@@ -410,6 +419,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
S.scrub_CO2 = TRUE
|
||||
S.scrub_Toxins = FALSE
|
||||
S.scrub_N2O = FALSE
|
||||
S.scrub_H2 = FALSE
|
||||
S.scrubbing = TRUE
|
||||
S.widenet = FALSE
|
||||
S.update_icon(UPDATE_ICON_STATE)
|
||||
@@ -431,6 +441,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
S.scrub_CO2 = TRUE
|
||||
S.scrub_Toxins = TRUE
|
||||
S.scrub_N2O = TRUE
|
||||
S.scrub_H2 = TRUE
|
||||
S.scrubbing = TRUE
|
||||
S.widenet = TRUE
|
||||
S.update_icon(UPDATE_ICON_STATE)
|
||||
@@ -470,6 +481,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
S.scrub_CO2 = TRUE
|
||||
S.scrub_Toxins = FALSE
|
||||
S.scrub_N2O = FALSE
|
||||
S.scrub_H2 = FALSE
|
||||
S.scrubbing = TRUE
|
||||
S.widenet = FALSE
|
||||
S.update_icon(UPDATE_ICON_STATE)
|
||||
@@ -619,6 +631,10 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
var/sleeping_agent_dangerlevel = cur_tlv.get_danger_level(environment.sleeping_agent() * GET_PP)
|
||||
var/sleeping_agent_percent = total ? environment.sleeping_agent() / total * 100 : 0
|
||||
|
||||
cur_tlv = TLV["hydrogen"]
|
||||
var/hydrogen_dangerlevel = cur_tlv.get_danger_level(environment.hydrogen() * GET_PP)
|
||||
var/hydrogen_percent = total ? environment.hydrogen() / total * 100 : 0
|
||||
|
||||
cur_tlv = TLV["other"]
|
||||
var/other_moles = total - known_total
|
||||
var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP)
|
||||
@@ -639,6 +655,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
percentages["co2"] = co2_percent
|
||||
percentages["plasma"] = plasma_percent
|
||||
percentages["n2o"] = sleeping_agent_percent
|
||||
percentages["hydrogen"] = hydrogen_percent
|
||||
percentages["other"] = other_percent
|
||||
data["contents"] = percentages
|
||||
|
||||
@@ -650,8 +667,9 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
danger["co2"] = co2_dangerlevel
|
||||
danger["plasma"] = plasma_dangerlevel
|
||||
danger["n2o"] = sleeping_agent_dangerlevel
|
||||
danger["hydrogen"] = hydrogen_dangerlevel
|
||||
danger["other"] = other_dangerlevel
|
||||
danger["overall"] = max(pressure_dangerlevel,oxygen_dangerlevel,nitrogen_dangerlevel,co2_dangerlevel,plasma_dangerlevel,other_dangerlevel,temperature_dangerlevel)
|
||||
danger["overall"] = max(pressure_dangerlevel,oxygen_dangerlevel,nitrogen_dangerlevel,co2_dangerlevel,plasma_dangerlevel,hydrogen_dangerlevel,other_dangerlevel,temperature_dangerlevel)
|
||||
data["danger"] = danger
|
||||
return data
|
||||
|
||||
@@ -725,6 +743,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
scrubber_info["filter_co2"] = S.scrub_CO2
|
||||
scrubber_info["filter_toxins"] = S.scrub_Toxins
|
||||
scrubber_info["filter_n2o"] = S.scrub_N2O
|
||||
scrubber_info["filter_h2"] = S.scrub_H2
|
||||
scrubbers += list(scrubber_info)
|
||||
data["scrubbers"] = scrubbers
|
||||
return data
|
||||
@@ -752,6 +771,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"carbon dioxide" = "CO2",
|
||||
"plasma" = "Toxin",
|
||||
"nitrous oxide" = "N2O",
|
||||
"hydrogen" = "H2",
|
||||
"other" = "Other")
|
||||
for(var/g in gas_names)
|
||||
thresholds += list(list("name" = gas_names[g], "settings" = list()))
|
||||
@@ -865,6 +885,7 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
"n2o_scrub",
|
||||
"n2_scrub",
|
||||
"o2_scrub",
|
||||
"h2_scrub",
|
||||
"widenet",
|
||||
"scrubbing",
|
||||
"direction")
|
||||
@@ -927,6 +948,8 @@ GLOBAL_LIST_INIT(aalarm_modes, list(
|
||||
S.scrub_N2 = val
|
||||
if("o2_scrub")
|
||||
S.scrub_O2 = val
|
||||
if("h2_scrub")
|
||||
S.scrub_H2 = val
|
||||
if("widenet")
|
||||
S.widenet = val
|
||||
if("scrubbing")
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#define FILTER_CO2 3
|
||||
/// Nitrous oxide only.
|
||||
#define FILTER_N2O 4
|
||||
/// Hydrogen only.
|
||||
#define FILTER_H2 5
|
||||
|
||||
/obj/machinery/atmospherics/trinary/filter
|
||||
name = "gas filter"
|
||||
@@ -28,7 +30,8 @@
|
||||
"O2" = FILTER_OXYGEN,
|
||||
"N2" = FILTER_NITROGEN,
|
||||
"CO2" = FILTER_CO2,
|
||||
"N2O" = FILTER_N2O
|
||||
"N2O" = FILTER_N2O,
|
||||
"H2" = FILTER_H2,
|
||||
)
|
||||
|
||||
// So we can CtrlClick without triggering the anchored message.
|
||||
@@ -144,6 +147,10 @@
|
||||
if(FILTER_N2O)
|
||||
filtered_out.set_sleeping_agent(removed.sleeping_agent())
|
||||
removed.set_sleeping_agent(0)
|
||||
|
||||
if(FILTER_H2)
|
||||
filtered_out.set_hydrogen(removed.hydrogen())
|
||||
removed.set_hydrogen(0)
|
||||
else
|
||||
filtered_out = null
|
||||
|
||||
@@ -240,3 +247,4 @@
|
||||
#undef FILTER_NITROGEN
|
||||
#undef FILTER_CO2
|
||||
#undef FILTER_N2O
|
||||
#undef FILTER_H2
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
var/scrub_CO2 = TRUE
|
||||
var/scrub_Toxins = FALSE
|
||||
var/scrub_N2O = FALSE
|
||||
var/scrub_H2 = FALSE
|
||||
|
||||
var/volume_rate = 200
|
||||
var/widenet = FALSE //is this scrubber acting on the 3x3 area around it.
|
||||
@@ -165,6 +166,8 @@
|
||||
return TRUE
|
||||
if(environment.agent_b() > 0.001)
|
||||
return TRUE
|
||||
if(environment.hydrogen() > 0.001)
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
@@ -209,6 +212,10 @@
|
||||
filtered_out.set_sleeping_agent(removed.sleeping_agent())
|
||||
removed.set_sleeping_agent(0)
|
||||
|
||||
if(scrubber.scrub_H2)
|
||||
filtered_out.set_hydrogen(removed.hydrogen())
|
||||
removed.set_hydrogen(0)
|
||||
|
||||
//Remix the resulting gases
|
||||
scrubber.air_contents.merge(filtered_out)
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
list("name" = "\[O2\]", "icon" = "blue"),
|
||||
list("name" = "\[Toxin (Bio)\]", "icon" = "orange"),
|
||||
list("name" = "\[CO2\]", "icon" = "black"),
|
||||
list("name" = "\[H2\]", "icon" = "white"),
|
||||
list("name" = "\[Air\]", "icon" = "grey"),
|
||||
list("name" = "\[CAUTION\]", "icon" = "yellow"),
|
||||
list("name" = "\[SPECIAL\]", "icon" = "whiters")
|
||||
@@ -114,7 +115,7 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new())
|
||||
|
||||
/obj/machinery/atmospherics/portable/canister/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Connect a canister to a connector port using a wrench. To fill a tank, attach it to the caniser, increase the \
|
||||
. += "<span class='notice'>Connect a canister to a connector port using a wrench. To fill a tank, attach it to the canister, increase the \
|
||||
release pressure, and open the valve. Alt-click to eject the tank, or use another to hot-swap. A gas analyzer can be used to check \
|
||||
the contents of the canister.</span>"
|
||||
if(isAntag(user))
|
||||
@@ -373,6 +374,11 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new())
|
||||
log_admin("[key_name(ui.user)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]")
|
||||
ui.user.create_log(MISC_LOG, "has opened a canister of N2O")
|
||||
|
||||
if(air_contents.hydrogen() > 0)
|
||||
message_admins("[key_name_admin(ui.user)] opened a canister that contains Hydrogen in [get_area(src)]! (<A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(ui.user)] opened a canister that contains Hydrogen at [get_area(src)]: [x], [y], [z]")
|
||||
ui.user.create_log(MISC_LOG, "has opened a canister of Hydrogen")
|
||||
|
||||
else
|
||||
logmsg = "Valve was <b>closed</b> by [key_name(ui.user)], stopping the transfer into the [holding_tank || "air"].<br>"
|
||||
|
||||
@@ -435,6 +441,10 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new())
|
||||
name = "Canister \[CO2\]"
|
||||
icon_state = "black" //See Initialize()
|
||||
can_label = FALSE
|
||||
/obj/machinery/atmospherics/portable/canister/hydrogen
|
||||
name = "Canister \[H2\]"
|
||||
icon_state = "white" //See Initialize()
|
||||
can_label = FALSE
|
||||
/obj/machinery/atmospherics/portable/canister/air
|
||||
name = "Canister \[Air\]"
|
||||
icon_state = "grey" //See Initialize()
|
||||
@@ -486,6 +496,14 @@ GLOBAL_DATUM_INIT(canister_icon_container, /datum/canister_icons, new())
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/portable/canister/hydrogen/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
canister_color["prim"] = "white"
|
||||
air_contents.set_hydrogen((maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature()))
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/atmospherics/portable/canister/air/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -90,6 +90,9 @@
|
||||
filtered_out.set_agent_b(removed.agent_b())
|
||||
removed.set_agent_b(0)
|
||||
|
||||
filtered_out.set_hydrogen(removed.hydrogen())
|
||||
removed.set_hydrogen(0)
|
||||
|
||||
//Remix the resulting gases
|
||||
air_contents.merge(filtered_out)
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/cdiox = 0
|
||||
var/nitrox = 0
|
||||
var/agentbx = 0
|
||||
var/hydrogen = 0
|
||||
|
||||
|
||||
/datum/buildmode_mode/atmos/show_help(mob/user)
|
||||
@@ -31,6 +32,7 @@
|
||||
cdiox = tgui_input_number(user, "CO2 ratio", "Input", 0, 100000, 0, round_value = FALSE)
|
||||
nitrox = tgui_input_number(user, "N2O ratio", "Input", 0, 100000, 0, round_value = FALSE)
|
||||
agentbx = tgui_input_number(user, "Agent B ratio", "Input", 0, 100000, 0, round_value = FALSE)
|
||||
hydrogen = tgui_input_number(user, "Hydrogen ratio", "Input", 0, 100000, 0, round_value = FALSE)
|
||||
|
||||
/datum/buildmode_mode/atmos/proc/ppratio_to_moles(ppratio)
|
||||
// ideal gas equation: Pressure * Volume = Moles * r * Temperature
|
||||
@@ -51,6 +53,7 @@
|
||||
air.set_carbon_dioxide(ppratio_to_moles(cdiox))
|
||||
air.set_sleeping_agent(ppratio_to_moles(nitrox))
|
||||
air.set_agent_b(ppratio_to_moles(agentbx))
|
||||
air.set_hydrogen(ppratio_to_moles(hydrogen))
|
||||
|
||||
for(var/turf/T in block(cornerA,cornerB))
|
||||
if(issimulatedturf(T))
|
||||
@@ -66,6 +69,7 @@
|
||||
T.carbon_dioxide = air.carbon_dioxide()
|
||||
T.sleeping_agent = air.sleeping_agent()
|
||||
T.agent_b = air.agent_b()
|
||||
T.hydrogen = air.hydrogen()
|
||||
|
||||
// admin log
|
||||
log_admin("Build Mode: [key_name(user)] changed the atmos of region [COORD(cornerA)] to [COORD(cornerB)]. T: [temperature], P: [pressure], Ox: [oxygen]%, N2: [nitrogen]%, Plsma: [plasma]%, CO2: [cdiox]%, N2O: [nitrox]%. [ctrl_click ? "Overwrote base space turf gases." : ""]")
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
t+= "<span class='notice'>Carbon Dioxide: [environment.carbon_dioxide()] \n</span>"
|
||||
t+= "<span class='notice'>N2O: [environment.sleeping_agent()] \n</span>"
|
||||
t+= "<span class='notice'>Agent B: [environment.agent_b()] \n</span>"
|
||||
t+= "<span class='notice'>Hydrogen: [environment.hydrogen()] \n</span>"
|
||||
|
||||
usr.show_message(t, EMOTE_VISIBLE)
|
||||
|
||||
|
||||
@@ -114,7 +114,8 @@
|
||||
var/co2_level = environment.carbon_dioxide() / total_moles
|
||||
var/plasma_level = environment.toxins() / total_moles
|
||||
var/n2o_level = environment.sleeping_agent() / total_moles
|
||||
var/unknown_level = 1 - (o2_level + n2_level + co2_level + plasma_level + n2o_level)
|
||||
var/h2_level = environment.hydrogen() / total_moles
|
||||
var/unknown_level = 1 - (o2_level + n2_level + co2_level + plasma_level + n2o_level + h2_level)
|
||||
results = list(
|
||||
list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "units" = "C", "val" = "[round(environment.temperature()-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
@@ -123,6 +124,7 @@
|
||||
list("entry" = "Carbon Dioxide", "units" = "%", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Plasma", "units" = "%", "val" = "[round(plasma_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Nitrous Oxide", "units" = "%", "val" = "[round(n2o_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Hydrogen", "units" = "%", "val" = "[round(h2_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "units" = "%", "val" = "[round(unknown_level*100,0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
)
|
||||
|
||||
|
||||
@@ -15,9 +15,11 @@
|
||||
#define OXYGEN_HEAT_PENALTY 1
|
||||
#define CO2_HEAT_PENALTY 0.1
|
||||
#define NITROGEN_HEAT_PENALTY -1.5
|
||||
#define HYDROGEN_HEAT_PENALTY 20
|
||||
|
||||
#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation.
|
||||
#define PLASMA_TRANSMIT_MODIFIER 4
|
||||
#define HYDROGEN_TRANSMIT_MODIFIER 3
|
||||
|
||||
#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage.
|
||||
|
||||
@@ -30,6 +32,7 @@
|
||||
#define N2_CRUNCH 0.55
|
||||
#define N2O_CRUNCH 0.55
|
||||
#define PLASMA_CRUNCH 4
|
||||
#define HYDROGEN_CRUNCH 2
|
||||
|
||||
#define MOLE_CRUNCH_THRESHOLD 1700 //Above this value we can get lord singulo and
|
||||
#define MOLE_PENALTY_THRESHOLD 1800 //Above this value we can get lord singulo and independent mol damage, below it we can heal damage
|
||||
@@ -152,6 +155,7 @@
|
||||
var/o2comp = 0
|
||||
var/co2comp = 0
|
||||
var/n2ocomp = 0
|
||||
var/h2comp = 0
|
||||
|
||||
///The last air sample's total molar count, will always be above or equal to 0
|
||||
var/combined_gas = 0
|
||||
@@ -517,10 +521,11 @@
|
||||
co2comp = max(removed.carbon_dioxide() / combined_gas, 0)
|
||||
n2ocomp = max(removed.sleeping_agent() / combined_gas, 0)
|
||||
n2comp = max(removed.nitrogen() / combined_gas, 0)
|
||||
h2comp = max(removed.hydrogen() / combined_gas, 0)
|
||||
|
||||
gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1)
|
||||
gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + h2comp - n2comp, 0), 1)
|
||||
|
||||
dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (n2comp * NITROGEN_HEAT_PENALTY), 0.5)
|
||||
dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (n2comp * NITROGEN_HEAT_PENALTY) + (h2comp * HYDROGEN_HEAT_PENALTY), 0.5)
|
||||
dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1)
|
||||
|
||||
power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0)
|
||||
@@ -563,7 +568,7 @@
|
||||
|
||||
var/crush_ratio = combined_gas / MOLE_CRUNCH_THRESHOLD
|
||||
|
||||
gas_coefficient = 1 + (crush_ratio ** 2 * (crush_ratio <= 1) + (crush_ratio > 1) * 2 * crush_ratio / (crush_ratio + 1)) * (plasmacomp * PLASMA_CRUNCH + o2comp * O2_CRUNCH + co2comp * CO2_CRUNCH + n2comp * N2_CRUNCH + n2ocomp * N2O_CRUNCH)
|
||||
gas_coefficient = 1 + (crush_ratio ** 2 * (crush_ratio <= 1) + (crush_ratio > 1) * 2 * crush_ratio / (crush_ratio + 1)) * (plasmacomp * PLASMA_CRUNCH + o2comp * O2_CRUNCH + co2comp * CO2_CRUNCH + n2comp * N2_CRUNCH + n2ocomp * N2O_CRUNCH + h2comp * HYDROGEN_CRUNCH)
|
||||
|
||||
radiation_pulse(src, 6 * power * (gas_coefficient + max(0, ((power_transmission_bonus / 10)))), GAMMA_RAD)
|
||||
|
||||
@@ -1276,8 +1281,10 @@
|
||||
#undef OXYGEN_HEAT_PENALTY
|
||||
#undef CO2_HEAT_PENALTY
|
||||
#undef NITROGEN_HEAT_PENALTY
|
||||
#undef HYDROGEN_HEAT_PENALTY
|
||||
#undef OXYGEN_TRANSMIT_MODIFIER
|
||||
#undef PLASMA_TRANSMIT_MODIFIER
|
||||
#undef HYDROGEN_TRANSMIT_MODIFIER
|
||||
#undef N2O_HEAT_RESISTANCE
|
||||
#undef POWERLOSS_INHIBITION_GAS_THRESHOLD
|
||||
#undef POWERLOSS_INHIBITION_MOLE_THRESHOLD
|
||||
@@ -1320,3 +1327,4 @@
|
||||
#undef N2_CRUNCH
|
||||
#undef N2O_CRUNCH
|
||||
#undef PLASMA_CRUNCH
|
||||
#undef HYDROGEN_CRUNCH
|
||||
|
||||
@@ -111,6 +111,15 @@
|
||||
/datum/engi_event/supermatter_event/charlie_tier/heat_penalty_threshold/on_start()
|
||||
supermatter.heat_penalty_threshold -= 173
|
||||
|
||||
// hydrogen
|
||||
/datum/engi_event/supermatter_event/charlie_tier/hydrogen
|
||||
name = "C-4"
|
||||
|
||||
/datum/engi_event/supermatter_event/charlie_tier/hydrogen/on_start()
|
||||
var/datum/gas_mixture/air = new()
|
||||
air.set_hydrogen(2000)
|
||||
supermatter_turf.blind_release_air(air)
|
||||
|
||||
//Class B events
|
||||
/datum/engi_event/supermatter_event/bravo_tier
|
||||
threat_level = SM_EVENT_THREAT_B
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
air.set_toxins(T.toxins)
|
||||
air.set_sleeping_agent(T.sleeping_agent)
|
||||
air.set_agent_b(T.agent_b)
|
||||
air.set_hydrogen(T.hydrogen)
|
||||
air.set_temperature(T.temperature)
|
||||
T.blind_set_air(air)
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/datum/engi_event/bluespace_tap_event/gas/on_start()
|
||||
var/datum/gas_mixture/air = new()
|
||||
var/picked_gas = pick("N2O", "N2", "O2", "CO2", "Plasma", "Unknown")
|
||||
var/picked_gas = pick("N2O", "N2", "O2", "CO2", "Plasma", "Unknown", "H2")
|
||||
switch(picked_gas)
|
||||
if("N2")
|
||||
name = "G-1"
|
||||
@@ -50,6 +50,9 @@
|
||||
if("Unknown")
|
||||
name = "G-6"
|
||||
air.set_agent_b(250)
|
||||
if("Hydrogen")
|
||||
name = "G-7"
|
||||
air.set_hydrogen(250)
|
||||
|
||||
air.set_temperature(T20C)
|
||||
var/turf/tap_turf = get_turf(tap)
|
||||
|
||||
Reference in New Issue
Block a user