mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-14 09:35:30 +01:00
caches gases in more procs
This commit is contained in:
@@ -155,6 +155,7 @@ var/const/SPAWN_AIR = 256
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/G = new
|
||||
var/list/new_gases = G.gases
|
||||
|
||||
if(flag & SPAWN_20C)
|
||||
G.temperature = T20C
|
||||
@@ -163,20 +164,20 @@ var/const/SPAWN_AIR = 256
|
||||
G.temperature += 1000
|
||||
|
||||
if(flag & SPAWN_TOXINS)
|
||||
G.gases[GAS_PL][MOLES] += amount
|
||||
new_gases[GAS_PL][MOLES] += amount
|
||||
if(flag & SPAWN_OXYGEN)
|
||||
G.gases[GAS_O2][MOLES] += amount
|
||||
new_gases[GAS_O2][MOLES] += amount
|
||||
if(flag & SPAWN_CO2)
|
||||
G.gases[GAS_CO2][MOLES] += amount
|
||||
new_gases[GAS_CO2][MOLES] += amount
|
||||
if(flag & SPAWN_NITROGEN)
|
||||
G.gases[GAS_N2][MOLES] += amount
|
||||
new_gases[GAS_N2][MOLES] += amount
|
||||
|
||||
if(flag & SPAWN_N2O)
|
||||
G.gases[GAS_N2O][MOLES] += amount
|
||||
new_gases[GAS_N2O][MOLES] += amount
|
||||
|
||||
if(flag & SPAWN_AIR)
|
||||
G.gases[GAS_O2][MOLES] += MOLES_O2STANDARD * amount
|
||||
G.gases[GAS_N2][MOLES] += MOLES_N2STANDARD * amount
|
||||
new_gases[GAS_O2][MOLES] += MOLES_O2STANDARD * amount
|
||||
new_gases[GAS_N2][MOLES] += MOLES_N2STANDARD * amount
|
||||
|
||||
air.merge(G)
|
||||
SSair.add_to_active(src, 0)
|
||||
@@ -314,12 +314,13 @@
|
||||
|
||||
/datum/excited_group/proc/self_breakdown()
|
||||
var/datum/gas_mixture/A = new
|
||||
var/list/A_gases = A.gases
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
A.merge(T.air)
|
||||
|
||||
for(var/turf/simulated/T in turf_list)
|
||||
for(var/gas in T.air.gases)
|
||||
gas[MOLES] = A.gases[gas[GAS_INDEX]][MOLES]/turf_list.len
|
||||
gas[MOLES] = A_gases[gas[GAS_INDEX]][MOLES]/turf_list.len
|
||||
|
||||
T.update_visuals()
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ var/list/cached_gases_list
|
||||
src.volume = volume
|
||||
if(!cached_gases_list)
|
||||
cached_gases_list = gaseslist()
|
||||
gases = cached_gases_list
|
||||
gases = cached_gases_list.Copy()
|
||||
|
||||
//PV=nRT - related procedures
|
||||
/datum/gas_mixture/proc/heat_capacity()
|
||||
@@ -120,7 +120,7 @@ var/list/cached_gases_list
|
||||
|
||||
|
||||
/datum/gas_mixture/proc/react(atom/dump_location)
|
||||
var/procgases = gases //this speeds things up because >byond
|
||||
var/list/procgases = gases //this speeds things up because >byond
|
||||
var/reacting = 0 //set to 1 if a notable reaction occured (used by pipe_network)
|
||||
if(temperature < TCMB)
|
||||
temperature = TCMB
|
||||
@@ -253,12 +253,10 @@ var/list/cached_gases_list
|
||||
/datum/gas_mixture/proc/check_turf(turf/model)
|
||||
//Returns: 0 if self-check failed or 1 if check passes
|
||||
|
||||
//datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) //I want this proc to die a painful death
|
||||
/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient) //I want this proc to die a painful death
|
||||
|
||||
/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient)
|
||||
|
||||
/datum/gas_mixture/proc/temperature_mimic(turf/model, conduction_coefficient)
|
||||
|
||||
/datum/gas_mixture/proc/temperature_turf_share(turf/simulated/sharer, conduction_coefficient)
|
||||
|
||||
/datum/gas_mixture/proc/compare(datum/gas_mixture/sample)
|
||||
|
||||
@@ -290,12 +290,13 @@
|
||||
var/turf/simulated/floor/F = random_location
|
||||
if(F.air)
|
||||
var/datum/gas_mixture/A = F.air
|
||||
var/list/A_gases = A.gases
|
||||
var/trace_gases
|
||||
for(var/i in 5 to A.gases.len)
|
||||
if(A.gases[i][MOLES])
|
||||
for(var/i in 5 to A_gases.len)
|
||||
if(A_gases[i][MOLES])
|
||||
trace_gases = TRUE
|
||||
break
|
||||
if(A.gases[GAS_O2][MOLES] >= 16 && !A.gases[GAS_PL][MOLES] && A.gases[GAS_CO2][MOLES] < 10 && !trace_gases)//Can most things breathe in this location?
|
||||
if(A_gases[GAS_O2][MOLES] >= 16 && !A_gases[GAS_PL][MOLES] && A_gases[GAS_CO2][MOLES] < 10 && !trace_gases)//Can most things breathe in this location?
|
||||
if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold
|
||||
var/pressure = A.return_pressure()
|
||||
if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums
|
||||
|
||||
@@ -257,6 +257,7 @@
|
||||
if(!location)
|
||||
return
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
var/list/env_gases = environment.gases
|
||||
var/total = environment.total_moles()
|
||||
|
||||
var/list/environment_data = list()
|
||||
@@ -273,25 +274,25 @@
|
||||
environment_data += list(list("name" = "Pressure", "value" = pressure, "unit" = "kPa", "danger_level" = pressure_danger))
|
||||
|
||||
cur_tlv = TLV["oxygen"]
|
||||
var/oxygen_danger = cur_tlv.get_danger_level(environment.gases[GAS_O2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Oxygen", "value" = environment.gases[GAS_O2][MOLES] / total * 100, "unit" = "%", "danger_level" = oxygen_danger))
|
||||
var/oxygen_danger = cur_tlv.get_danger_level(env_gases[GAS_O2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Oxygen", "value" = env_gases[GAS_O2][MOLES] / total * 100, "unit" = "%", "danger_level" = oxygen_danger))
|
||||
|
||||
cur_tlv = TLV["nitrogen"]
|
||||
var/nitrogen_danger = cur_tlv.get_danger_level(environment.gases[GAS_N2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Nitrogen", "value" = environment.gases[GAS_N2][MOLES] / total * 100, "unit" = "%", "danger_level" = nitrogen_danger))
|
||||
var/nitrogen_danger = cur_tlv.get_danger_level(env_gases[GAS_N2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Nitrogen", "value" = env_gases[GAS_N2][MOLES] / total * 100, "unit" = "%", "danger_level" = nitrogen_danger))
|
||||
|
||||
cur_tlv = TLV["carbon dioxide"]
|
||||
var/carbon_dioxide_danger = cur_tlv.get_danger_level(environment.gases[GAS_CO2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Carbon Dioxide", "value" = environment.gases[GAS_CO2][MOLES] / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger))
|
||||
var/carbon_dioxide_danger = cur_tlv.get_danger_level(env_gases[GAS_CO2][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Carbon Dioxide", "value" = env_gases[GAS_CO2][MOLES] / total * 100, "unit" = "%", "danger_level" = carbon_dioxide_danger))
|
||||
|
||||
cur_tlv = TLV["plasma"]
|
||||
var/plasma_danger = cur_tlv.get_danger_level(environment.gases[GAS_PL][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Toxins", "value" = environment.gases[GAS_PL][MOLES] / total * 100, "unit" = "%", "danger_level" = plasma_danger))
|
||||
var/plasma_danger = cur_tlv.get_danger_level(env_gases[GAS_PL][MOLES]*partial_pressure)
|
||||
environment_data += list(list("name" = "Toxins", "value" = env_gases[GAS_PL][MOLES] / total * 100, "unit" = "%", "danger_level" = plasma_danger))
|
||||
|
||||
cur_tlv = TLV["other"]
|
||||
var/other_moles = 0
|
||||
for(var/i in 5 to environment.gases.len)
|
||||
other_moles+=environment.gases[i][MOLES]
|
||||
for(var/i in 5 to env_gases.len)
|
||||
other_moles+=env_gases[i][MOLES]
|
||||
var/other_danger = cur_tlv.get_danger_level(other_moles*partial_pressure)
|
||||
environment_data += list(list("name" = "Other", "value" = other_moles / total * 100, "unit" = "%", "danger_level" = other_danger))
|
||||
|
||||
@@ -603,6 +604,7 @@
|
||||
return 0
|
||||
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
var/list/env_gases = environment.gases
|
||||
|
||||
var/datum/tlv/cur_tlv
|
||||
var/GET_PP = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume
|
||||
@@ -612,18 +614,18 @@
|
||||
var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure)
|
||||
|
||||
cur_tlv = TLV["oxygen"]
|
||||
var/oxygen_dangerlevel = cur_tlv.get_danger_level(environment.gases[GAS_O2][MOLES]*GET_PP)
|
||||
var/oxygen_dangerlevel = cur_tlv.get_danger_level(env_gases[GAS_O2][MOLES]*GET_PP)
|
||||
|
||||
cur_tlv = TLV["carbon dioxide"]
|
||||
var/co2_dangerlevel = cur_tlv.get_danger_level(environment.gases[GAS_CO2][MOLES]*GET_PP)
|
||||
var/co2_dangerlevel = cur_tlv.get_danger_level(env_gases[GAS_CO2][MOLES]*GET_PP)
|
||||
|
||||
cur_tlv = TLV["plasma"]
|
||||
var/plasma_dangerlevel = cur_tlv.get_danger_level(environment.gases[GAS_PL][MOLES]*GET_PP)
|
||||
var/plasma_dangerlevel = cur_tlv.get_danger_level(env_gases[GAS_PL][MOLES]*GET_PP)
|
||||
|
||||
cur_tlv = TLV["other"]
|
||||
var/other_moles = 0
|
||||
for(var/i in 5 to environment.gases.len)
|
||||
other_moles+=environment.gases[i][MOLES]
|
||||
for(var/i in 5 to env_gases.len)
|
||||
other_moles+=env_gases[i][MOLES]
|
||||
var/other_dangerlevel = cur_tlv.get_danger_level(other_moles*GET_PP)
|
||||
|
||||
cur_tlv = TLV["temperature"]
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
var/list/sample_gases = air_sample.gases
|
||||
|
||||
if(output&1)
|
||||
signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1))
|
||||
@@ -47,13 +48,13 @@
|
||||
var/total_moles = air_sample.total_moles()
|
||||
if(total_moles > 0)
|
||||
if(output&4)
|
||||
signal.data["oxygen"] = round(100*air_sample.gases[GAS_O2][MOLES]/total_moles,0.1)
|
||||
signal.data["oxygen"] = round(100*sample_gases[GAS_O2][MOLES]/total_moles,0.1)
|
||||
if(output&8)
|
||||
signal.data["toxins"] = round(100*air_sample.gases[GAS_PL][MOLES]/total_moles,0.1)
|
||||
signal.data["toxins"] = round(100*sample_gases[GAS_PL][MOLES]/total_moles,0.1)
|
||||
if(output&16)
|
||||
signal.data["nitrogen"] = round(100*air_sample.gases[GAS_N2][MOLES]/total_moles,0.1)
|
||||
signal.data["nitrogen"] = round(100*sample_gases[GAS_N2][MOLES]/total_moles,0.1)
|
||||
if(output&32)
|
||||
signal.data["carbon_dioxide"] = round(100*air_sample.gases[GAS_CO2][MOLES]/total_moles,0.1)
|
||||
signal.data["carbon_dioxide"] = round(100*sample_gases[GAS_CO2][MOLES]/total_moles,0.1)
|
||||
else
|
||||
signal.data["oxygen"] = 0
|
||||
signal.data["toxins"] = 0
|
||||
|
||||
@@ -72,21 +72,23 @@
|
||||
//Filter it
|
||||
if (removed)
|
||||
var/datum/gas_mixture/filtered_out = new
|
||||
var/list/filtered_gases = filtered_out.gases
|
||||
var/list/removed_gases = removed.gases
|
||||
|
||||
filtered_out.temperature = removed.temperature
|
||||
|
||||
|
||||
filtered_out.gases[GAS_PL][MOLES] = removed.gases[GAS_PL][MOLES]
|
||||
removed.gases[GAS_PL][MOLES] = 0
|
||||
filtered_gases[GAS_PL][MOLES] = removed_gases[GAS_PL][MOLES]
|
||||
removed_gases[GAS_PL][MOLES] = 0
|
||||
|
||||
filtered_out.gases[GAS_CO2][MOLES] = removed.gases[GAS_CO2][MOLES]
|
||||
removed.gases[GAS_CO2][MOLES] = 0
|
||||
filtered_gases[GAS_CO2][MOLES] = removed_gases[GAS_CO2][MOLES]
|
||||
removed_gases[GAS_CO2][MOLES] = 0
|
||||
|
||||
filtered_out.gases[GAS_AGENT_B][MOLES] = removed.gases[GAS_AGENT_B][MOLES]
|
||||
removed.gases[GAS_AGENT_B][MOLES] = 0
|
||||
filtered_gases[GAS_AGENT_B][MOLES] = removed_gases[GAS_AGENT_B][MOLES]
|
||||
removed_gases[GAS_AGENT_B][MOLES] = 0
|
||||
|
||||
filtered_out.gases[GAS_N2O][MOLES] = removed.gases[GAS_N2O][MOLES]
|
||||
removed.gases[GAS_AGENT_B][MOLES] = 0
|
||||
filtered_gases[GAS_N2O][MOLES] = removed_gases[GAS_N2O][MOLES]
|
||||
removed_gases[GAS_AGENT_B][MOLES] = 0
|
||||
|
||||
//Remix the resulting gases
|
||||
air_contents.merge(filtered_out)
|
||||
|
||||
@@ -163,9 +163,10 @@
|
||||
T.air_update_turf()
|
||||
for(var/obj/effect/hotspot/H in T)
|
||||
qdel(H)
|
||||
if(G.gases[GAS_PL][MOLES])
|
||||
G.gases[GAS_N2][MOLES] += (G.gases[GAS_PL][MOLES])
|
||||
G.gases[GAS_PL][MOLES] = 0
|
||||
var/list/G_gases = G.gases
|
||||
if(G_gases[GAS_PL][MOLES])
|
||||
G_gases[GAS_N2][MOLES] += (G_gases[GAS_PL][MOLES])
|
||||
G_gases[GAS_PL][MOLES] = 0
|
||||
for(var/obj/machinery/atmospherics/components/unary/U in T)
|
||||
if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber.
|
||||
U.welded = 1
|
||||
|
||||
@@ -268,10 +268,11 @@ MASS SPECTROMETER
|
||||
else
|
||||
user.show_message("<span class='alert'>Pressure: [round(pressure,0.1)] kPa</span>", 1)
|
||||
if(total_moles)
|
||||
var/o2_concentration = environment.gases[GAS_O2][MOLES]/total_moles
|
||||
var/n2_concentration = environment.gases[GAS_N2][MOLES]/total_moles
|
||||
var/co2_concentration = environment.gases[GAS_CO2][MOLES]/total_moles
|
||||
var/plasma_concentration = environment.gases[GAS_PL][MOLES]/total_moles
|
||||
var/list/env_gases = environment.gases
|
||||
var/o2_concentration = env_gases[GAS_O2][MOLES]/total_moles
|
||||
var/n2_concentration = env_gases[GAS_N2][MOLES]/total_moles
|
||||
var/co2_concentration = env_gases[GAS_CO2][MOLES]/total_moles
|
||||
var/plasma_concentration = env_gases[GAS_PL][MOLES]/total_moles
|
||||
|
||||
if(abs(n2_concentration - N2STANDARD) < 20)
|
||||
user.show_message("<span class='info'>Nitrogen: [round(n2_concentration*100)] %</span>", 1)
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
//TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this...
|
||||
//Transfer 5% of current tank air contents to turf
|
||||
var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount)
|
||||
air_transfer.gases[GAS_PL][MOLES] = air_transfer.gases[GAS_PL][MOLES] * 5
|
||||
air_transfer.gases[GAS_PL][MOLES] *= 5
|
||||
target.assume_air(air_transfer)
|
||||
//Burn it based on transfered gas
|
||||
target.hotspot_expose((ptank.air_contents.temperature*2) + 380,500)
|
||||
|
||||
@@ -142,6 +142,7 @@
|
||||
/turf/simulated/proc/Assimilate_Air()
|
||||
if(air)
|
||||
var/datum/gas_mixture/a_gas_mixture = new//Holders to assimilate air from nearby turfs
|
||||
var/list/a_gases = a_gas_mixture.gases
|
||||
var/turf_count = 0
|
||||
|
||||
for(var/direction in cardinal)//Only use cardinals to cut down on lag
|
||||
@@ -152,12 +153,13 @@
|
||||
else if(istype(T,/turf/simulated/floor))
|
||||
var/turf/simulated/S = T
|
||||
if(S.air)//Add the air's contents to the holders
|
||||
for(var/gas in a_gas_mixture.gases)
|
||||
gas[MOLES] += S.air.gases[gas[GAS_INDEX]][MOLES]
|
||||
var/list/S_gases = S.air.gases
|
||||
for(var/gas in a_gases)
|
||||
gas[MOLES] += S_gases[gas[GAS_INDEX]][MOLES]
|
||||
a_gas_mixture.temperature += S.air.temperature
|
||||
turf_count ++
|
||||
for(var/gas in air.gases)
|
||||
gas[MOLES] = (a_gas_mixture.gases[gas[GAS_INDEX]][MOLES]/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like
|
||||
gas[MOLES] = (a_gases[gas[GAS_INDEX]][MOLES]/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like
|
||||
air.temperature = (a_gas_mixture.temperature/max(turf_count,1))//Trace gases can get bant
|
||||
SSair.add_to_active(src)
|
||||
|
||||
|
||||
@@ -9,22 +9,23 @@
|
||||
|
||||
var/toxins_used = 0
|
||||
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
|
||||
var/list/breath_gases = breath.gases
|
||||
|
||||
//Partial pressure of the toxins in our breath
|
||||
var/Toxins_pp = (breath.gases[GAS_PL][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_pp = (breath_gases[GAS_PL][MOLES]/breath.total_moles())*breath_pressure
|
||||
|
||||
if(Toxins_pp) // Detect toxins in air
|
||||
adjustPlasma(breath.gases[GAS_PL][MOLES]*250)
|
||||
adjustPlasma(breath_gases[GAS_PL][MOLES]*250)
|
||||
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
|
||||
|
||||
toxins_used = breath.gases[GAS_PL][MOLES]
|
||||
toxins_used = breath_gases[GAS_PL][MOLES]
|
||||
|
||||
else
|
||||
clear_alert("alien_tox")
|
||||
|
||||
//Breathe in toxins and out oxygen
|
||||
breath.gases[GAS_PL][MOLES] -= toxins_used
|
||||
breath.gases[GAS_O2][MOLES] += toxins_used
|
||||
breath_gases[GAS_PL][MOLES] -= toxins_used
|
||||
breath_gases[GAS_O2][MOLES] += toxins_used
|
||||
|
||||
//BREATH TEMPERATURE
|
||||
handle_breath_temperature(breath)
|
||||
|
||||
@@ -1167,10 +1167,12 @@
|
||||
|
||||
var/gas_breathed = 0
|
||||
|
||||
var/list/breath_gases = breath.gases
|
||||
|
||||
//Partial pressures in our breath
|
||||
var/O2_pp = breath.get_breath_partial_pressure(breath.gases[GAS_O2][MOLES])
|
||||
var/Toxins_pp = breath.get_breath_partial_pressure(breath.gases[GAS_PL][MOLES])
|
||||
var/CO2_pp = breath.get_breath_partial_pressure(breath.gases[GAS_CO2][MOLES])
|
||||
var/O2_pp = breath.get_breath_partial_pressure(breath_gases[GAS_O2][MOLES])
|
||||
var/Toxins_pp = breath.get_breath_partial_pressure(breath_gases[GAS_PL][MOLES])
|
||||
var/CO2_pp = breath.get_breath_partial_pressure(breath_gases[GAS_CO2][MOLES])
|
||||
|
||||
|
||||
//-- OXY --//
|
||||
@@ -1178,7 +1180,7 @@
|
||||
//Too much oxygen! //Yes, some species may not like it.
|
||||
if(safe_oxygen_max)
|
||||
if(O2_pp > safe_oxygen_max && !(NOBREATH in specflags))
|
||||
var/ratio = (breath.gases[GAS_O2][MOLES]/safe_oxygen_max) * 10
|
||||
var/ratio = (breath_gases[GAS_O2][MOLES]/safe_oxygen_max) * 10
|
||||
H.adjustOxyLoss(Clamp(ratio,oxy_breath_dam_min,oxy_breath_dam_max))
|
||||
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
|
||||
else
|
||||
@@ -1187,17 +1189,17 @@
|
||||
//Too little oxygen!
|
||||
if(safe_oxygen_min)
|
||||
if(O2_pp < safe_oxygen_min)
|
||||
gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath.gases[GAS_O2][MOLES])
|
||||
gas_breathed = handle_too_little_breath(H,O2_pp,safe_oxygen_min,breath_gases[GAS_O2][MOLES])
|
||||
H.throw_alert("oxy", /obj/screen/alert/oxy)
|
||||
else
|
||||
H.failed_last_breath = 0
|
||||
H.adjustOxyLoss(-5)
|
||||
gas_breathed = breath.gases[GAS_O2][MOLES]/6
|
||||
gas_breathed = breath_gases[GAS_O2][MOLES]/6
|
||||
H.clear_alert("oxy")
|
||||
|
||||
//Exhale
|
||||
breath.gases[GAS_O2][MOLES] -= gas_breathed
|
||||
breath.gases[GAS_CO2][MOLES] += gas_breathed
|
||||
breath_gases[GAS_O2][MOLES] -= gas_breathed
|
||||
breath_gases[GAS_CO2][MOLES] += gas_breathed
|
||||
gas_breathed = 0
|
||||
|
||||
|
||||
@@ -1224,17 +1226,17 @@
|
||||
//Too little CO2!
|
||||
if(safe_co2_min)
|
||||
if(CO2_pp < safe_co2_min)
|
||||
gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath.gases[GAS_CO2][MOLES])
|
||||
gas_breathed = handle_too_little_breath(H,CO2_pp, safe_co2_min,breath_gases[GAS_CO2][MOLES])
|
||||
H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
|
||||
else
|
||||
H.failed_last_breath = 0
|
||||
H.adjustOxyLoss(-5)
|
||||
gas_breathed = breath.gases[GAS_CO2][MOLES]/6
|
||||
gas_breathed = breath_gases[GAS_CO2][MOLES]/6
|
||||
H.clear_alert("not_enough_co2")
|
||||
|
||||
//Exhale
|
||||
breath.gases[GAS_CO2][MOLES] -= gas_breathed
|
||||
breath.gases[GAS_O2][MOLES] += gas_breathed
|
||||
breath_gases[GAS_CO2][MOLES] -= gas_breathed
|
||||
breath_gases[GAS_O2][MOLES] += gas_breathed
|
||||
gas_breathed = 0
|
||||
|
||||
|
||||
@@ -1243,7 +1245,7 @@
|
||||
//Too much toxins!
|
||||
if(safe_toxins_max)
|
||||
if(Toxins_pp > safe_toxins_max && !(NOBREATH in specflags))
|
||||
var/ratio = (breath.gases[GAS_PL][MOLES]/safe_toxins_max) * 10
|
||||
var/ratio = (breath_gases[GAS_PL][MOLES]/safe_toxins_max) * 10
|
||||
if(H.reagents)
|
||||
H.reagents.add_reagent("plasma", Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max))
|
||||
H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
|
||||
@@ -1254,24 +1256,24 @@
|
||||
//Too little toxins!
|
||||
if(safe_toxins_min)
|
||||
if(Toxins_pp < safe_toxins_min && !(NOBREATH in specflags))
|
||||
gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath.gases[GAS_PL][MOLES])
|
||||
gas_breathed = handle_too_little_breath(H,Toxins_pp, safe_toxins_min, breath_gases[GAS_PL][MOLES])
|
||||
H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
|
||||
else
|
||||
H.failed_last_breath = 0
|
||||
H.adjustOxyLoss(-5)
|
||||
gas_breathed = breath.gases[GAS_PL][MOLES]/6
|
||||
gas_breathed = breath_gases[GAS_PL][MOLES]/6
|
||||
H.clear_alert("not_enough_tox")
|
||||
|
||||
//Exhale
|
||||
breath.gases[GAS_PL][MOLES] -= gas_breathed
|
||||
breath.gases[GAS_CO2][MOLES] += gas_breathed
|
||||
breath_gases[GAS_PL][MOLES] -= gas_breathed
|
||||
breath_gases[GAS_CO2][MOLES] += gas_breathed
|
||||
gas_breathed = 0
|
||||
|
||||
|
||||
//-- TRACES --//
|
||||
|
||||
if(breath && !(NOBREATH in specflags)) // If there's some other shit in the air lets deal with it here.
|
||||
var/SA_pp = breath.get_breath_partial_pressure(breath.gases[GAS_N2O][MOLES])
|
||||
var/SA_pp = breath.get_breath_partial_pressure(breath_gases[GAS_N2O][MOLES])
|
||||
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
|
||||
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
|
||||
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
|
||||
|
||||
@@ -105,9 +105,11 @@
|
||||
var/oxygen_used = 0
|
||||
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
|
||||
|
||||
var/O2_partialpressure = (breath.gases[GAS_O2][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_partialpressure = (breath.gases[GAS_PL][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/CO2_partialpressure = (breath.gases[GAS_CO2][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/list/breath_gases = breath.gases
|
||||
|
||||
var/O2_partialpressure = (breath_gases[GAS_O2][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_partialpressure = (breath_gases[GAS_PL][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/CO2_partialpressure = (breath_gases[GAS_CO2][MOLES]/breath.total_moles())*breath_pressure
|
||||
|
||||
|
||||
//OXYGEN
|
||||
@@ -119,7 +121,7 @@
|
||||
var/ratio = safe_oxy_min/O2_partialpressure
|
||||
adjustOxyLoss(min(5*ratio, 3))
|
||||
failed_last_breath = 1
|
||||
oxygen_used = breath.gases[GAS_O2][MOLES]*ratio/6
|
||||
oxygen_used = breath_gases[GAS_O2][MOLES]*ratio/6
|
||||
else
|
||||
adjustOxyLoss(3)
|
||||
failed_last_breath = 1
|
||||
@@ -128,11 +130,11 @@
|
||||
else //Enough oxygen
|
||||
failed_last_breath = 0
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_used = breath.gases[GAS_O2][MOLES]/6
|
||||
oxygen_used = breath_gases[GAS_O2][MOLES]/6
|
||||
clear_alert("oxy")
|
||||
|
||||
breath.gases[GAS_O2][MOLES] -= oxygen_used
|
||||
breath.gases[GAS_CO2][MOLES] += oxygen_used
|
||||
breath_gases[GAS_O2][MOLES] -= oxygen_used
|
||||
breath_gases[GAS_CO2][MOLES] += oxygen_used
|
||||
|
||||
//CARBON DIOXIDE
|
||||
if(CO2_partialpressure > safe_co2_max)
|
||||
@@ -151,7 +153,7 @@
|
||||
|
||||
//TOXINS/PLASMA
|
||||
if(Toxins_partialpressure > safe_tox_max)
|
||||
var/ratio = (breath.gases[GAS_PL][MOLES]/safe_tox_max) * 10
|
||||
var/ratio = (breath_gases[GAS_PL][MOLES]/safe_tox_max) * 10
|
||||
if(reagents)
|
||||
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
|
||||
throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
|
||||
@@ -159,8 +161,8 @@
|
||||
clear_alert("tox_in_air")
|
||||
|
||||
//NITROUS OXIDE
|
||||
if(breath.gases[GAS_N2O][MOLES])
|
||||
var/SA_partialpressure = (breath.gases[GAS_N2O][MOLES]/breath.total_moles())*breath_pressure
|
||||
if(breath_gases[GAS_N2O][MOLES])
|
||||
var/SA_partialpressure = (breath_gases[GAS_N2O][MOLES]/breath.total_moles())*breath_pressure
|
||||
if(SA_partialpressure > SA_para_min)
|
||||
Paralyse(3)
|
||||
if(SA_partialpressure > SA_sleep_min)
|
||||
|
||||
@@ -386,12 +386,14 @@
|
||||
if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills.
|
||||
if(beacon.air)
|
||||
var/datum/gas_mixture/Z = beacon.air
|
||||
var/trace_gases
|
||||
var/list/Z_gases = Z.gases
|
||||
var/trace_gases = FALSE
|
||||
|
||||
for(var/i in 5 to Z.gases.len)
|
||||
if(Z.gases[i][MOLES])
|
||||
if(Z_gases[i][MOLES])
|
||||
trace_gases = TRUE
|
||||
break
|
||||
if(Z.gases[GAS_O2][MOLES] >= 16 && !Z.gases[GAS_PL][MOLES] && Z.gases[GAS_CO2][MOLES] < 10 && !trace_gases)
|
||||
if(Z_gases[GAS_O2][MOLES] >= 16 && !Z_gases[GAS_PL][MOLES] && Z_gases[GAS_CO2][MOLES] < 10 && !trace_gases)
|
||||
if((Z.temperature > 270) && (Z.temperature < 360))
|
||||
var/pressure = Z.return_pressure()
|
||||
if((pressure > 20) && (pressure < 550))
|
||||
|
||||
@@ -196,10 +196,11 @@
|
||||
if(istype(T,/turf/simulated))
|
||||
var/turf/simulated/ST = T
|
||||
if(ST.air)
|
||||
var/tox = ST.air.gases[GAS_PL][MOLES]
|
||||
var/oxy = ST.air.gases[GAS_O2][MOLES]
|
||||
var/n2 = ST.air.gases[GAS_N2][MOLES]
|
||||
var/co2 = ST.air.gases[GAS_CO2][MOLES]
|
||||
var/ST_gases = ST.air.gases
|
||||
var/tox = ST_gases[GAS_PL][MOLES]
|
||||
var/oxy = ST_gases[GAS_O2][MOLES]
|
||||
var/n2 = ST_gases[GAS_N2][MOLES]
|
||||
var/co2 = ST_gases[GAS_CO2][MOLES]
|
||||
|
||||
if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
|
||||
atmos_suitable = 0
|
||||
|
||||
Reference in New Issue
Block a user