From a64b68f76c71d82d87f5fbc65bcb4f6287d9d06d Mon Sep 17 00:00:00 2001 From: duncathan Date: Mon, 28 Dec 2015 13:32:49 -0600 Subject: [PATCH] caches gases in more procs --- code/LINDA/LINDA_system.dm | 15 ++++---- code/LINDA/LINDA_turf_tile.dm | 3 +- code/datums/gas_mixture.dm | 8 ++-- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 7 ++-- code/game/machinery/alarm.dm | 32 ++++++++-------- code/game/machinery/atmo_control.dm | 9 +++-- code/game/machinery/atmoalter/scrubber.dm | 18 +++++---- .../effects/effect_system/effects_smoke.dm | 7 ++-- code/game/objects/items/devices/scanners.dm | 9 +++-- .../objects/items/weapons/flamethrower.dm | 2 +- code/game/turfs/turf.dm | 8 ++-- code/modules/mob/living/carbon/alien/life.dm | 11 +++--- .../mob/living/carbon/human/species.dm | 38 ++++++++++--------- code/modules/mob/living/carbon/life.dm | 22 ++++++----- .../living/simple_animal/guardian/guardian.dm | 8 ++-- .../mob/living/simple_animal/simple_animal.dm | 9 +++-- 16 files changed, 112 insertions(+), 94 deletions(-) diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm index e4d4d3f4cde..6eace742248 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -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) \ No newline at end of file diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm index fd4b203ef1a..d126d58e8b6 100644 --- a/code/LINDA/LINDA_turf_tile.dm +++ b/code/LINDA/LINDA_turf_tile.dm @@ -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() diff --git a/code/datums/gas_mixture.dm b/code/datums/gas_mixture.dm index 4f0b6ea1a3a..4ed5bdcdf47 100644 --- a/code/datums/gas_mixture.dm +++ b/code/datums/gas_mixture.dm @@ -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) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index a3b1aa4bb0a..9b0513817a5 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -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 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index d09b18aea4f..dfc643b8f17 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -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"] diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index fcb0c8d3693..964818f06c6 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -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 diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 62c33f85b93..d850a556c83 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -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) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 8db33729e76..d75a9705556 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -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 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8dbc5731f23..8f68ea886fd 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -268,10 +268,11 @@ MASS SPECTROMETER else user.show_message("Pressure: [round(pressure,0.1)] kPa", 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("Nitrogen: [round(n2_concentration*100)] %", 1) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9b5b7bfa64d..64b9ca2636d 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -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) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 845fb5c2bb1..c900568cbfd 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -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) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index d2fb94df7ca..0d77114d345 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 29533ed6204..202f9b26282 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -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 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index e3fd3fc9c9b..f96fc2c6960 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -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) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 0d8dc6aee35..04315cc6d01 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -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)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index eab36005bf6..d906d58a3ec 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -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