diff --git a/code/datums/diseases/floor_diseases/gastritium.dm b/code/datums/diseases/floor_diseases/gastritium.dm index 228cfa7496a..e8755511147 100644 --- a/code/datums/diseases/floor_diseases/gastritium.dm +++ b/code/datums/diseases/floor_diseases/gastritium.dm @@ -44,11 +44,10 @@ /datum/disease/gastritium/proc/tritium_burp(hot_chance = FALSE) var/datum/gas_mixture/burp = new - ADD_GAS(/datum/gas/tritium, burp.gases) - burp.gases[/datum/gas/tritium][MOLES] = MOLES_GAS_VISIBLE + burp.set_gas(/datum/gas/tritium, MOLES_GAS_VISIBLE) burp.temperature = affected_mob.bodytemperature if(hot_chance && prob(tritium_burp_hot_chance)) - burp.temperature = TRITIUM_MINIMUM_BURN_TEMPERATURE + burp.set_temperature(TRITIUM_MINIMUM_BURN_TEMPERATURE) if(affected_mob.stat == CONSCIOUS) to_chat(affected_mob, span_warning("Your throat feels hot!")) affected_mob.visible_message("burps out green gas.", visible_message_flags = EMOTE_MESSAGE) diff --git a/code/datums/elements/death_gases.dm b/code/datums/elements/death_gases.dm index b93c870f817..7589e719415 100644 --- a/code/datums/elements/death_gases.dm +++ b/code/datums/elements/death_gases.dm @@ -30,7 +30,7 @@ SIGNAL_HANDLER var/datum/gas_mixture/mix_to_spawn = new() mix_to_spawn.add_gas(gas_type) - mix_to_spawn.gases[gas_type][MOLES] = amount_of_gas - mix_to_spawn.temperature = T20C + mix_to_spawn.set_gas(gas_type, amount_of_gas) + mix_to_spawn.set_temperature(T20C) var/turf/open/our_turf = get_turf(target) our_turf.assume_air(mix_to_spawn) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 736be058ee4..468654f4d5a 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -291,10 +291,9 @@ QDEL_NULL(hotspot) var/datum/gas_mixture/air = location.air - var/list/gases = air.gases - if (gases[/datum/gas/plasma]) - var/scrub_amt = min(30, gases[/datum/gas/plasma][MOLES]) //Absorb some plasma - gases[/datum/gas/plasma][MOLES] -= scrub_amt + if (air.gases[/datum/gas/plasma]) + var/scrub_amt = min(30, air.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma + air.adjust_gas(/datum/gas/plasma, -scrub_amt) absorbed_plasma += scrub_amt if (air.temperature > T20C) air.temperature = max(air.temperature / 2, T20C) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index b6d3d892896..cca69643fb3 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -297,11 +297,10 @@ if(!distcheck || get_dist(location, chilly) < blast) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air air.temperature = temperature - var/list/gases = air.gases - if(gases[/datum/gas/plasma]) - air.assert_gas(/datum/gas/nitrogen) - gases[/datum/gas/nitrogen][MOLES] += gases[/datum/gas/plasma][MOLES] - gases[/datum/gas/plasma][MOLES] = 0 + if(air.gases[/datum/gas/plasma]) + var/mole_count = air.gases[/datum/gas/plasma][MOLES] + air.adjust_gas(/datum/gas/nitrogen, mole_count) + air.adjust_gas(/datum/gas/plasma, -mole_count) air.garbage_collect() for(var/obj/effect/hotspot/fire in chilly) diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 9d1da48cd29..c5c82b485e0 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -44,14 +44,11 @@ if(!first_gasmix || !second_gasmix) return - first_gasmix.temperature = 1413 - second_gasmix.temperature = 141.3 + first_gasmix.set_temperature(1413) + second_gasmix.set_temperature(141.3) - first_gasmix.assert_gas(/datum/gas/plasma) - second_gasmix.assert_gas(/datum/gas/oxygen) - - first_gasmix.gases[/datum/gas/plasma][MOLES] = calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/oxygen][MOLES] = calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1) + first_gasmix.set_gas(/datum/gas/plasma, calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1)) + second_gasmix.set_gas(/datum/gas/oxygen, calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1)) /obj/effect/spawner/newbomb/tritium @@ -60,16 +57,13 @@ if(!first_gasmix || !second_gasmix) return - first_gasmix.temperature = 8000 - second_gasmix.temperature = 43 + first_gasmix.set_temperature(8000) + second_gasmix.set_temperature(43) - first_gasmix.assert_gas(/datum/gas/plasma) - second_gasmix.assert_gas(/datum/gas/oxygen) - second_gasmix.assert_gas(/datum/gas/tritium) + first_gasmix.set_gas(/datum/gas/plasma, calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1)) - first_gasmix.gases[/datum/gas/plasma][MOLES] = calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/oxygen][MOLES] = 0.67 * calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/tritium][MOLES] = 0.33 * calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1) + second_gasmix.set_gas(/datum/gas/oxygen, 0.67 * calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1)) + second_gasmix.set_gas(/datum/gas/tritium, 0.33 * calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1)) /obj/effect/spawner/newbomb/isolated_tritium @@ -78,16 +72,13 @@ if(!first_gasmix || !second_gasmix) return - first_gasmix.temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 1 - second_gasmix.temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 1 + first_gasmix.set_temperature(FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 1) + second_gasmix.set_temperature(FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 1) - first_gasmix.assert_gas(/datum/gas/hypernoblium) - first_gasmix.assert_gas(/datum/gas/tritium) - second_gasmix.assert_gas(/datum/gas/oxygen) + first_gasmix.set_gas(/datum/gas/hypernoblium, REACTION_OPPRESSION_THRESHOLD - 0.01,) + first_gasmix.set_gas( /datum/gas/tritium, 0.5 * calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1)) - first_gasmix.gases[/datum/gas/hypernoblium][MOLES] = REACTION_OPPRESSION_THRESHOLD - 0.01 - first_gasmix.gases[/datum/gas/tritium][MOLES] = 0.5 * calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/oxygen][MOLES] = calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE-1) + second_gasmix.set_gas(/datum/gas/oxygen, calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE-1)) /obj/effect/spawner/newbomb/noblium @@ -96,14 +87,11 @@ if(!first_gasmix || !second_gasmix) return - first_gasmix.temperature = 2.7 - second_gasmix.temperature = 2.7 + first_gasmix.set_temperature(2.7) + second_gasmix.set_temperature(2.7) - first_gasmix.assert_gas(/datum/gas/nitrogen) - second_gasmix.assert_gas(/datum/gas/tritium) - - first_gasmix.gases[/datum/gas/nitrogen][MOLES] = calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/tritium][MOLES] = calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1) + first_gasmix.set_gas(/datum/gas/nitrogen, calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1)) + second_gasmix.set_gas(/datum/gas/tritium, calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1)) /obj/effect/spawner/newbomb/pressure @@ -112,11 +100,8 @@ if(!first_gasmix || !second_gasmix) return - first_gasmix.temperature = 20000 - second_gasmix.temperature = 2.7 + first_gasmix.set_temperature(20000) + second_gasmix.set_temperature(2.7) - first_gasmix.assert_gas(/datum/gas/hypernoblium) - second_gasmix.assert_gas(/datum/gas/tritium) - - first_gasmix.gases[/datum/gas/hypernoblium][MOLES] = calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1) - second_gasmix.gases[/datum/gas/tritium][MOLES] = calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1) + first_gasmix.set_gas(/datum/gas/hypernoblium, calculate_pressure(first_gasmix, TANK_LEAK_PRESSURE - 1)) + second_gasmix.set_gas(/datum/gas/tritium, calculate_pressure(second_gasmix, TANK_LEAK_PRESSURE - 1)) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 3a665d903a6..74557295dac 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -73,8 +73,7 @@ /obj/item/tank/jetpack/populate_gas() if(gas_type) var/datum/gas_mixture/our_mix = return_air() - our_mix.assert_gas(gas_type) - our_mix.gases[gas_type][MOLES] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)) + our_mix.set_gas(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) /obj/item/tank/jetpack/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/toggle_jetpack)) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 0d8734a799b..11ce2b69479 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -35,8 +35,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.assert_gas(/datum/gas/oxygen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/oxygen/yellow @@ -68,9 +67,9 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + air_contents.set_gas(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.set_gas(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + /obj/item/tank/internals/anesthetic/examine(mob/user) . = ..() @@ -82,8 +81,7 @@ icon_state = "anesthetic_warning" /obj/item/tank/internals/anesthetic/pure/populate_gas() - air_contents.assert_gases(/datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.adjust_gas(/datum/gas/nitrous_oxide, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /* * Plasma @@ -101,8 +99,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers) if(istype(W, /obj/item/flamethrower)) @@ -118,8 +115,7 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasma/empty/populate_gas() return @@ -138,12 +134,10 @@ distribute_pressure = TANK_PLASMAMAN_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt @@ -158,8 +152,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.assert_gas(/datum/gas/plasma) - air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/plasmaman/belt/empty/populate_gas() return @@ -186,8 +179,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.assert_gas(/datum/gas/oxygen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + air_contents.set_gas(/datum/gas/oxygen, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() @@ -246,21 +238,18 @@ /obj/item/tank/internals/emergency_oxygen/engi/clown/n2o /obj/item/tank/internals/emergency_oxygen/engi/clown/n2o/populate_gas() - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.95 - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.05 + air_contents.set_gas(/datum/gas/oxygen, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.95) + air_contents.set_gas(/datum/gas/nitrous_oxide, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.05) /obj/item/tank/internals/emergency_oxygen/engi/clown/bz /obj/item/tank/internals/emergency_oxygen/engi/clown/bz/populate_gas() - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/bz) - air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.9 - air_contents.gases[/datum/gas/bz][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.1 + air_contents.set_gas(/datum/gas/oxygen,(10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.9) + air_contents.set_gas(/datum/gas/bz,(10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.1) /obj/item/tank/internals/emergency_oxygen/engi/clown/helium distribute_pressure = TANK_CLOWN_RELEASE_PRESSURE + 2 /obj/item/tank/internals/emergency_oxygen/engi/clown/helium/populate_gas() - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/helium) - air_contents.gases[/datum/gas/oxygen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.75 - air_contents.gases[/datum/gas/helium][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.25 + air_contents.set_gas(/datum/gas/oxygen, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.75) + air_contents.set_gas(/datum/gas/helium, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * 0.25) diff --git a/code/game/objects/items/weaponry/ranged/flamethrower.dm b/code/game/objects/items/weaponry/ranged/flamethrower.dm index 29a410dcb10..c8421c9fe80 100644 --- a/code/game/objects/items/weaponry/ranged/flamethrower.dm +++ b/code/game/objects/items/weaponry/ranged/flamethrower.dm @@ -231,7 +231,8 @@ var/datum/gas_mixture/air_transfer = tank_mix.remove_ratio(release_amount) if(air_transfer.gases[/datum/gas/plasma]) - air_transfer.gases[/datum/gas/plasma][MOLES] *= 5 //Suffering + var/moles = air_transfer.gases[/datum/gas/plasma][MOLES] * 5 //Suffering + air_transfer.set_gas(/datum/gas/plasma, moles) target.assume_air(air_transfer) //Burn it based on transferred gas target.hotspot_expose((tank_mix.temperature*2) + 380,500) @@ -286,8 +287,7 @@ SIGNAL_HANDLER if(ptank) var/datum/gas_mixture/tank_mix = ptank.return_air() - tank_mix.assert_gas(/datum/gas/plasma) - tank_mix.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C) + tank_mix.set_gas(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C)) else ptank = new /obj/item/tank/internals/plasma/full(src) update_appearance() diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 28c2b6030b3..4a4830a960f 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -297,8 +297,8 @@ air_contents.temperature = T20C air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases[/datum/gas/nitrogen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + air_contents.adjust_gas(/datum/gas/oxygen, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjust_gas(/datum/gas/nitrogen, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /obj/structure/closet/body_bag/environmental/nanotrasen name = "elite environmental protection bag" @@ -428,8 +428,8 @@ air_contents.temperature = T20C air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + air_contents.adjust_gas(/datum/gas/oxygen, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.adjust_gas(/datum/gas/nitrous_oxide, (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) /obj/structure/closet/body_bag/environmental/hardlight name = "hardlight bodybag" @@ -509,11 +509,10 @@ var/inner_temp = T0C - 60 air_contents = null air_contents = new(mol_count) - air_contents.temperature = inner_temp + air_contents.set_temperature(inner_temp) - air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE * mol_count) / (R_IDEAL_GAS_EQUATION * inner_temp) * O2STANDARD - air_contents.gases[/datum/gas/nitrogen][MOLES] = (ONE_ATMOSPHERE * mol_count) / (R_IDEAL_GAS_EQUATION * inner_temp) * N2STANDARD + air_contents.set_gas(/datum/gas/oxygen, ((ONE_ATMOSPHERE * mol_count) / (R_IDEAL_GAS_EQUATION * inner_temp) * O2STANDARD)) + air_contents.set_gas(/datum/gas/nitrogen, ((ONE_ATMOSPHERE * mol_count) / (R_IDEAL_GAS_EQUATION * inner_temp) * N2STANDARD)) /obj/structure/closet/body_bag/environmental/stasis/examine_status(mob/user) switch(100 * get_integrity_percentage()) diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index 72549bdbcc7..93e54886e6e 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -95,7 +95,7 @@ return FALSE new /obj/item/flamethrower(get_turf(src)) var/obj/item/tank/internals/plasma/ptank = new /obj/item/tank/internals/plasma(get_turf(src)) - ptank.air_contents.gases[/datum/gas/plasma][MOLES] = (0) + ptank.air_contents.set_gas(/datum/gas/plasma, 0) drop_custom_materials() qdel(src) return TRUE diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index fe806662dac..30ea69ff0d4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -14,9 +14,8 @@ /obj/structure/transit_tube_pod/Initialize(mapload) . = ..() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD - air_contents.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD + var/list/new_gases = list(/datum/gas/oxygen = MOLES_O2STANDARD, /datum/gas/nitrogen = MOLES_N2STANDARD) + air_contents.adjust_multiple_gases(new_gases) air_contents.temperature = T20C /obj/structure/transit_tube_pod/Destroy() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 49ebdb577a9..fa55c13fe40 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -281,7 +281,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/list/giver_gases = mix.gases for(var/giver_id in giver_gases) ASSERT_GAS_IN_LIST(giver_id, total_gases) - total_gases[giver_id][MOLES] += giver_gases[giver_id][MOLES] + total.adjust_gas(giver_id, giver_gases[giver_id][MOLES]) total.temperature = energy / heat_cap for(var/id in total_gases) diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm index a6494591910..0c96652436c 100644 --- a/code/modules/antagonists/heretic/items/corrupted_organs.dm +++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm @@ -251,8 +251,7 @@ breather.emote("cough"); var/chosen_gas = pick_weight(gas_types) var/datum/gas_mixture/mix_to_spawn = new() - mix_to_spawn.add_gas(pick(chosen_gas)) - mix_to_spawn.gases[chosen_gas][MOLES] = gas_amount + mix_to_spawn.adjust_gas(pick(chosen_gas), gas_amount) mix_to_spawn.temperature = breather.bodytemperature log_atmos("[owner] coughed some gas into the air due to their corrupted lungs.", mix_to_spawn) var/turf/open/our_turf = get_turf(breather) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index b9f59c3208d..2324824426a 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -172,6 +172,40 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) SEND_SIGNAL(src, COMSIG_GASMIX_MERGED) return TRUE +// Set the gas specie within the gas mix to a set amount, if there is none it will be created at the target temp +/datum/gas_mixture/proc/set_gas(gas_specie, amount) + ASSERT_GAS(gas_specie, src) + gases[gas_specie][MOLES] = amount + garbage_collect() + +/datum/gas_mixture/proc/set_temperature(target_temp) + temperature = target_temp + +/// Add a specific amount of moles to specified gas or add a new gas to the mix +/// amount is added so make it negative to remove +/datum/gas_mixture/proc/adjust_gas(gas, amount) + ASSERT_GAS(gas, src) + gases[gas][MOLES] += QUANTIZE(amount) + garbage_collect() + +/// Add a specific amount of moles to all the gasses present or add a new gas to the mix +///gases_moles is an associative list of gas species to their amount to be added +/datum/gas_mixture/proc/adjust_multiple_gases(list/gases_moles) + for(var/gas_specie in gases_moles) + ASSERT_GAS(gas_specie, src) + gases[gas_specie][MOLES] += gases_moles[gas_specie] + garbage_collect() + + +/// Modify the gas list as to convert moles of gas species A to gas species B +/// reactant and product are the gas species to convert and conversion_amount is the amount to be converted +/datum/gas_mixture/proc/convert_gas(datum/gas/reactant, datum/gas/product, conversion_amount) + var/list/cached_gases = gases + assert_gases(reactant, product) + cached_gases[reactant][MOLES] -= QUANTIZE(conversion_amount) + cached_gases[product][MOLES] += QUANTIZE(conversion_amount) + garbage_collect() + ///Proportionally removes amount of gas from the gas_mixture. ///Returns: gas_mixture with the gases removed /datum/gas_mixture/proc/remove(amount) @@ -764,3 +798,4 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) atmos_contents += temperature_str return atmos_contents.Join(";") + diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index d215c1c6803..4f5c643d05c 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -220,7 +220,7 @@ plasma_burn_rate = min(plasma_burn_rate, plasma[MOLES], oxygen[MOLES] * INVERSE(oxygen_burn_ratio)) //Ensures matter is conserved properly plasma[MOLES] = QUANTIZE(plasma[MOLES] - plasma_burn_rate) oxygen[MOLES] = QUANTIZE(oxygen[MOLES] - (plasma_burn_rate * oxygen_burn_ratio)) - if (super_saturation) + if(super_saturation) ASSERT_GAS(/datum/gas/tritium, air) cached_gases[/datum/gas/tritium][MOLES] += plasma_burn_rate else @@ -229,6 +229,7 @@ cached_gases[/datum/gas/carbon_dioxide][MOLES] += plasma_burn_rate * 0.75 cached_gases[/datum/gas/water_vapor][MOLES] += plasma_burn_rate * 0.25 + SET_REACTION_RESULTS((plasma_burn_rate) * (1 + oxygen_burn_ratio)) var/energy_released = FIRE_PLASMA_ENERGY_RELEASED * plasma_burn_rate var/new_heat_capacity = air.heat_capacity() @@ -583,6 +584,8 @@ nitrous_oxide[MOLES] -= 0.4 * bz_formed plasma[MOLES] -= 0.8 * bz_formed * (1-nitrous_oxide_decomposed_factor) + + SET_REACTION_RESULTS(bz_formed) var/energy_released = bz_formed * (BZ_FORMATION_ENERGY + nitrous_oxide_decomposed_factor * (N2O_DECOMPOSITION_ENERGY - BZ_FORMATION_ENERGY)) var/new_heat_capacity = air.heat_capacity() @@ -681,6 +684,7 @@ bz[MOLES] -= heat_efficiency * 0.05 //bz gets consumed to balance the nitrium production and not make it too common and/or easy cached_gases[/datum/gas/nitrium][MOLES] += heat_efficiency + SET_REACTION_RESULTS(heat_efficiency) var/energy_used = heat_efficiency * NITRIUM_FORMATION_ENERGY var/new_heat_capacity = air.heat_capacity() @@ -829,6 +833,7 @@ tritium[MOLES] -= 5 * nob_formed * reduction_factor nitrogen[MOLES] -= 10 * nob_formed cached_gases[/datum/gas/hypernoblium][MOLES] += nob_formed // I'm not going to nitpick, but N20H10 feels like it should be an explosive more than anything. + SET_REACTION_RESULTS(nob_formed) var/energy_released = nob_formed * NOBLIUM_FORMATION_ENERGY / max(bz[MOLES], 1) var/new_heat_capacity = air.heat_capacity() @@ -1254,6 +1259,7 @@ continue gas[MOLES] -= reaction_rate * gas[MOLES] / total_not_antinoblium_moles antinoblium[MOLES] += reaction_rate + SET_REACTION_RESULTS(reaction_rate) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm index 21fd7eb018a..6ff94177190 100644 --- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm +++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer_reactions.dm @@ -64,11 +64,11 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list()) /datum/electrolyzer_reaction/h2o_conversion/react(datum/gas_mixture/air_mixture, working_power, list/electrolyzer_args = list()) var/old_heat_capacity = air_mixture.heat_capacity() - air_mixture.assert_gases(/datum/gas/water_vapor, /datum/gas/oxygen, /datum/gas/hydrogen) + var/proportion = min(air_mixture.gases[/datum/gas/water_vapor][MOLES] * INVERSE(2), (2.5 * (working_power ** 2))) - air_mixture.gases[/datum/gas/water_vapor][MOLES] -= proportion * 2 - air_mixture.gases[/datum/gas/oxygen][MOLES] += proportion - air_mixture.gases[/datum/gas/hydrogen][MOLES] += proportion * 2 + air_mixture.adjust_gas(/datum/gas/water_vapor, -proportion * 2) + air_mixture.adjust_gas(/datum/gas/oxygen, proportion) + air_mixture.adjust_gas(/datum/gas/hydrogen, proportion * 2) var/new_heat_capacity = air_mixture.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air_mixture.temperature = max(air_mixture.temperature * old_heat_capacity / new_heat_capacity, TCMB) @@ -100,8 +100,10 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list()) var/list/hypernoblium = cached_gases[/datum/gas/hypernoblium] var/list/antinoblium = cached_gases[/datum/gas/antinoblium] var/electrolysed = hypernoblium[MOLES] * clamp(supermatter_power - POWER_PENALTY_THRESHOLD, 0, CRITICAL_POWER_PENALTY_THRESHOLD - POWER_PENALTY_THRESHOLD) / (CRITICAL_POWER_PENALTY_THRESHOLD - POWER_PENALTY_THRESHOLD) - hypernoblium[MOLES] -= electrolysed - antinoblium[MOLES] += electrolysed + + air_mixture.adjust_gas(/datum/gas/hypernoblium, -electrolysed) + air_mixture.adjust_gas(/datum/gas/antinoblium, electrolysed) + var/new_heat_capacity = old_heat_capacity + electrolysed * (antinoblium[GAS_META][META_GAS_SPECIFIC_HEAT] - hypernoblium[GAS_META][META_GAS_SPECIFIC_HEAT]) if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air_mixture.temperature = max(air_mixture.temperature * old_heat_capacity / new_heat_capacity, TCMB) @@ -126,9 +128,11 @@ GLOBAL_LIST_INIT(electrolyzer_reactions, electrolyzer_reactions_list()) var/old_heat_capacity = air_mixture.heat_capacity() air_mixture.assert_gases(/datum/gas/bz, /datum/gas/oxygen, /datum/gas/halon) var/reaction_efficency = min(air_mixture.gases[/datum/gas/bz][MOLES] * (1 - NUM_E ** (-0.5 * air_mixture.temperature * working_power / FIRE_MINIMUM_TEMPERATURE_TO_EXIST)), air_mixture.gases[/datum/gas/bz][MOLES]) - air_mixture.gases[/datum/gas/bz][MOLES] -= reaction_efficency - air_mixture.gases[/datum/gas/oxygen][MOLES] += reaction_efficency * 0.2 - air_mixture.gases[/datum/gas/halon][MOLES] += reaction_efficency * 2 + + air_mixture.adjust_gas(/datum/gas/bz, -reaction_efficency) + air_mixture.adjust_gas(/datum/gas/oxygen, reaction_efficency * 0.2) + air_mixture.adjust_gas(/datum/gas/halon, reaction_efficency * 2) + var/energy_used = reaction_efficency * HALON_FORMATION_ENERGY var/new_heat_capacity = air_mixture.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 06fcda77b44..0dbf0cfaa54 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -250,37 +250,37 @@ var/scaled_production = production_amount * selected_fuel.gas_production_multiplier for(var/gas_id in fuel.requirements) - internal_fusion.gases[gas_id][MOLES] -= min(fuel_list[gas_id], fuel_consumption) + internal_fusion.adjust_gas(gas_id, -min(fuel_list[gas_id], fuel_consumption)) for(var/gas_id in fuel.primary_products) - internal_fusion.gases[gas_id][MOLES] += fuel_consumption * 0.5 + internal_fusion.adjust_gas(gas_id, fuel_consumption * 0.5) // Each recipe provides a tier list of six output gases. // Which gases are produced depend on what the fusion level is. var/list/tier = fuel.secondary_products switch(power_level) if(1) - moderator_internal.gases[tier[1]][MOLES] += scaled_production * 0.95 - moderator_internal.gases[tier[2]][MOLES] += scaled_production * 0.75 + moderator_internal.adjust_gas(tier[1], scaled_production * 0.95) + moderator_internal.adjust_gas(tier[2], scaled_production * 0.75) if(2) - moderator_internal.gases[tier[1]][MOLES] += scaled_production * 1.65 - moderator_internal.gases[tier[2]][MOLES] += scaled_production + moderator_internal.adjust_gas(tier[1], scaled_production * 1.65) + moderator_internal.adjust_gas(tier[2], scaled_production) if(moderator_list[/datum/gas/plasma] > 50) - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 1.15 + moderator_internal.adjust_gas(tier[3], scaled_production * 1.15) if(3) - moderator_internal.gases[tier[2]][MOLES] += scaled_production * 0.5 - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 0.45 + moderator_internal.adjust_gas(tier[2], scaled_production * 0.5) + moderator_internal.adjust_gas(tier[3], scaled_production * 0.45) if(4) - moderator_internal.gases[tier[3]][MOLES] += scaled_production * 1.65 - moderator_internal.gases[tier[4]][MOLES] += scaled_production * 1.25 + moderator_internal.adjust_gas(tier[3], scaled_production * 1.65) + moderator_internal.adjust_gas(tier[4], scaled_production * 1.25) if(moderator_list[/datum/gas/plasma] > 50) - moderator_internal.gases[tier[5]][MOLES] += scaled_production * 1.15 + moderator_internal.adjust_gas(tier[5], scaled_production * 1.15) if(5) - moderator_internal.gases[tier[4]][MOLES] += scaled_production * 0.65 - moderator_internal.gases[tier[5]][MOLES] += scaled_production - moderator_internal.gases[tier[6]][MOLES] += scaled_production * 0.75 + moderator_internal.adjust_gas(tier[4], scaled_production * 0.65) + moderator_internal.adjust_gas(tier[5], scaled_production) + moderator_internal.adjust_gas(tier[6], scaled_production * 0.75) if(6) - moderator_internal.gases[tier[5]][MOLES] += scaled_production * 0.35 - moderator_internal.gases[tier[6]][MOLES] += scaled_production + moderator_internal.adjust_gas(tier[5], scaled_production * 0.35) + moderator_internal.adjust_gas(tier[6], scaled_production) /** * Perform common fusion actions: @@ -293,94 +293,81 @@ switch(power_level) if(1) if(moderator_list[/datum/gas/plasma] > 100) - internal_output.assert_gases(/datum/gas/nitrous_oxide) - internal_output.gases[/datum/gas/nitrous_oxide] += scaled_production * 0.5 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.85) + internal_output.adjust_gas(/datum/gas/nitrous_oxide, scaled_production * 0.5) + moderator_internal.adjust_gas(/datum/gas/plasma, min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.85)) if(moderator_list[/datum/gas/bz] > 150) - internal_output.assert_gases(/datum/gas/halon) - internal_output.gases[/datum/gas/halon][MOLES] += scaled_production * 0.55 - moderator_internal.gases[/datum/gas/bz][MOLES] -= min(moderator_internal.gases[/datum/gas/bz][MOLES], scaled_production * 0.95) + internal_output.adjust_gas(/datum/gas/halon, scaled_production * 0.55) + moderator_internal.adjust_gas(/datum/gas/bz, min(moderator_internal.gases[/datum/gas/bz][MOLES], scaled_production * 0.95)) if(2) if(moderator_list[/datum/gas/plasma] > 50) - internal_output.assert_gases(/datum/gas/bz) - internal_output.gases[/datum/gas/bz][MOLES] += scaled_production * 1.8 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.75) + internal_output.adjust_gas(/datum/gas/bz, scaled_production * 1.8) + moderator_internal.adjust_gas(/datum/gas/plasma, min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.75)) if(moderator_list[/datum/gas/proto_nitrate] > 20) radiation *= 1.55 heat_output *= 1.025 - internal_output.assert_gases(/datum/gas/nitrium) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.05 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35) + internal_output.adjust_gas(/datum/gas/nitrium, scaled_production * 1.05) + moderator_internal.adjust_gas(/datum/gas/proto_nitrate, min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35)) if(3, 4) if(moderator_list[/datum/gas/plasma] > 10) - internal_output.assert_gases(/datum/gas/freon, /datum/gas/nitrium) - internal_output.gases[/datum/gas/freon][MOLES] += scaled_production * 0.15 - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.05 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.45) + var/list/new_gases = list(/datum/gas/freon = scaled_production * 0.15, /datum/gas/nitrium = scaled_production * 1.05) + internal_output.adjust_multiple_gases(new_gases) + moderator_internal.adjust_gas(/datum/gas/plasma, min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 0.45)) if(moderator_list[/datum/gas/freon] > 50) heat_output *= 0.9 radiation *= 0.8 if(moderator_list[/datum/gas/proto_nitrate]> 15) - internal_output.assert_gases(/datum/gas/nitrium, /datum/gas/halon) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.25 - internal_output.gases[/datum/gas/halon][MOLES] += scaled_production * 1.15 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.55) + var/list/new_gases = list(/datum/gas/nitrium = scaled_production * 1.25, /datum/gas/halon = scaled_production * 1.15) + internal_output.adjust_multiple_gases(new_gases) + moderator_internal.adjust_gas(/datum/gas/proto_nitrate, min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.55)) radiation *= 1.95 heat_output *= 1.25 if(moderator_list[/datum/gas/bz] > 100) - internal_output.assert_gases(/datum/gas/healium, /datum/gas/proto_nitrate) - internal_output.gases[/datum/gas/proto_nitrate][MOLES] += scaled_production * 1.5 - internal_output.gases[/datum/gas/healium][MOLES] += scaled_production * 1.5 + var/list/new_gases = list(/datum/gas/healium = scaled_production * 1.5, /datum/gas/proto_nitrate = scaled_production * 1.5) + internal_output.adjust_multiple_gases(new_gases) visible_hallucination_pulse(src, HALLUCINATION_HFR(heat_output), 100 SECONDS * power_level * seconds_per_tick) if(5) if(moderator_list[/datum/gas/plasma] > 15) - internal_output.assert_gases(/datum/gas/freon) - internal_output.gases[/datum/gas/freon][MOLES] += scaled_production *0.25 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45) + internal_output.adjust_gas(/datum/gas/freon, scaled_production *0.25) + moderator_internal.adjust_gas(/datum/gas/plasma,min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45)) if(moderator_list[/datum/gas/freon] > 500) heat_output *= 0.5 radiation *= 0.2 if(moderator_list[/datum/gas/proto_nitrate] > 50) - internal_output.assert_gases(/datum/gas/nitrium, /datum/gas/pluoxium) - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 1.95 - internal_output.gases[/datum/gas/pluoxium][MOLES] += scaled_production - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35) + var/list/new_gases = list(/datum/gas/nitrium = scaled_production * 1.95, /datum/gas/pluoxium = scaled_production) + internal_output.adjust_multiple_gases(new_gases) + moderator_internal.adjust_gas(/datum/gas/proto_nitrate, min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 1.35)) radiation *= 1.95 heat_output *= 1.25 if(moderator_list[/datum/gas/bz] > 100) - internal_output.assert_gases(/datum/gas/healium, /datum/gas/freon) - internal_output.gases[/datum/gas/healium][MOLES] += scaled_production + var/list/new_gases = list(/datum/gas/healium = scaled_production, /datum/gas/freon = scaled_production * 1.15) + internal_output.adjust_multiple_gases(new_gases) visible_hallucination_pulse(src, HALLUCINATION_HFR(heat_output), 100 SECONDS * power_level * seconds_per_tick) - internal_output.gases[/datum/gas/freon][MOLES] += scaled_production * 1.15 if(moderator_list[/datum/gas/healium] > 100) if(critical_threshold_proximity > 400) critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[/datum/gas/healium] / 100 * seconds_per_tick ), 0) - moderator_internal.gases[/datum/gas/healium][MOLES] -= min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20) + moderator_internal.adjust_gas(/datum/gas/healium, -min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20)) if(moderator_internal.temperature < 1e7 || (moderator_list[/datum/gas/plasma] > 100 && moderator_list[/datum/gas/bz] > 50)) - internal_output.assert_gases(/datum/gas/antinoblium) - internal_output.gases[/datum/gas/antinoblium][MOLES] += dirty_production_rate * 0.9 / 0.065 * seconds_per_tick + internal_output.adjust_gas(/datum/gas/antinoblium, dirty_production_rate * 0.9 / 0.065 * seconds_per_tick) if(6) internal_output.assert_gases(/datum/gas/antinoblium) if(moderator_list[/datum/gas/plasma] > 30) - internal_output.assert_gases(/datum/gas/bz) - internal_output.gases[/datum/gas/bz][MOLES] += scaled_production * 1.15 - moderator_internal.gases[/datum/gas/plasma][MOLES] -= min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45) + internal_output.adjust_gas(/datum/gas/bz, scaled_production * 1.15) + moderator_internal.adjust_gas(/datum/gas/plasma, -min(moderator_internal.gases[/datum/gas/plasma][MOLES], scaled_production * 1.45)) if(moderator_list[/datum/gas/proto_nitrate]) - internal_output.assert_gases(/datum/gas/zauker, /datum/gas/nitrium) - internal_output.gases[/datum/gas/zauker][MOLES] += scaled_production * 5.35 - internal_output.gases[/datum/gas/nitrium][MOLES] += scaled_production * 2.15 - moderator_internal.gases[/datum/gas/proto_nitrate][MOLES] -= min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 3.35) + var/list/new_gases = list(/datum/gas/zauker = scaled_production * 5.35, /datum/gas/nitrium = scaled_production * 2.15) + internal_output.adjust_multiple_gases(new_gases) + moderator_internal.adjust_gas(/datum/gas/proto_nitrate, -min(moderator_internal.gases[/datum/gas/proto_nitrate][MOLES], scaled_production * 3.35)) radiation *= 2 heat_output *= 2.25 if(moderator_list[/datum/gas/bz]) visible_hallucination_pulse(src, HALLUCINATION_HFR(heat_output), 100 SECONDS * power_level * seconds_per_tick) - internal_output.gases[/datum/gas/antinoblium][MOLES] += clamp(dirty_production_rate / 0.045, 0, 10) * seconds_per_tick + internal_output.adjust_gas(/datum/gas/antinoblium, clamp(dirty_production_rate / 0.045, 0, 10) * seconds_per_tick) if(moderator_list[/datum/gas/healium] > 100) if(critical_threshold_proximity > 400) critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[/datum/gas/healium] / 100 * seconds_per_tick ), 0) - moderator_internal.gases[/datum/gas/healium][MOLES] -= min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20) - internal_fusion.gases[/datum/gas/antinoblium][MOLES] += dirty_production_rate * 0.01 / 0.095 * seconds_per_tick + moderator_internal.adjust_gas(/datum/gas/healium, -min(moderator_internal.gases[/datum/gas/healium][MOLES], scaled_production * 20)) + internal_fusion.adjust_gas(/datum/gas/antinoblium, dirty_production_rate * 0.01 / 0.095 * seconds_per_tick) //Modifies the internal_fusion temperature with the amount of heat output var/temperature_modifier = selected_fuel.temperature_change_multiplier @@ -413,7 +400,7 @@ var/max_iron_removable = IRON_OXYGEN_HEAL_PER_SECOND var/iron_removed = min(max_iron_removable * seconds_per_tick, iron_content) iron_content -= iron_removed - moderator_internal.gases[/datum/gas/oxygen][MOLES] -= iron_removed * OXYGEN_MOLES_CONSUMED_PER_IRON_HEAL + moderator_internal.adjust_gas(/datum/gas/oxygen, -iron_removed * OXYGEN_MOLES_CONSUMED_PER_IRON_HEAL) check_gravity_pulse(seconds_per_tick) diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 1bfb9c1d5b2..8d9381df273 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -143,8 +143,8 @@ var/pressure_limit = max_pressure * safety_margin var/moles_to_add = (pressure_limit * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.assert_gas(gastype) - air_contents.gases[gastype][MOLES] += moles_to_add + + air_contents.adjust_gas(gastype, moles_to_add) air_contents.archive() /obj/machinery/atmospherics/components/tank/process_atmos() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 0ca5fbff785..3a76be7b184 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -308,9 +308,8 @@ pressure_limit = 1e14 /obj/machinery/portable_atmospherics/canister/fusion_test/create_gas() - air_contents.add_gases(/datum/gas/hydrogen, /datum/gas/tritium) - air_contents.gases[/datum/gas/hydrogen][MOLES] = 300 - air_contents.gases[/datum/gas/tritium][MOLES] = 300 + air_contents.adjust_gas(/datum/gas/hydrogen, 300) + air_contents.adjust_gas(/datum/gas/tritium, 300) air_contents.temperature = 10000 SSair.start_processing_machine(src) @@ -323,9 +322,8 @@ greyscale_colors = "#9fba6c#3d4680" /obj/machinery/portable_atmospherics/canister/anesthetic_mix/create_gas() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide) - air_contents.gases[/datum/gas/oxygen][MOLES] = (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + air_contents.adjust_gas(/datum/gas/oxygen, (O2_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/datum/gas/nitrous_oxide, (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSair.start_processing_machine(src) /** @@ -335,14 +333,12 @@ /obj/machinery/portable_atmospherics/canister/proc/create_gas() if(!gas_type) return - air_contents.add_gas(gas_type) - air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + air_contents.adjust_gas(gas_type, (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSair.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - air_contents.gases[/datum/gas/oxygen][MOLES] = (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) - air_contents.gases[/datum/gas/nitrogen][MOLES] = (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) + air_contents.adjust_gas(/datum/gas/oxygen, (O2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) + air_contents.adjust_gas(/datum/gas/nitrogen, (N2STANDARD * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature)) SSair.start_processing_machine(src) /obj/machinery/portable_atmospherics/canister/update_icon_state() diff --git a/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm b/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm index 60f3ac82bb8..6ab73e5b2e1 100644 --- a/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm @@ -93,6 +93,7 @@ filtered.temperature = filtering.temperature for(var/gas in filtering.gases & scrubbing) filtered.add_gas(gas) + filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. filtering.gases[gas][MOLES] = 0 filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index b1b094c9db0..4fd3392c32b 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -84,7 +84,7 @@ //contains all of the gas we're sucking out of the tile, gets put into our parent pipenet var/datum/gas_mixture/filtered_out = new - var/list/filtered_gases = filtered_out.gases + filtered_out.temperature = environment.temperature //maximum percentage of the turfs gas we can filter @@ -102,8 +102,8 @@ filtered_out.add_gas(gas) var/transferred_moles = max(QUANTIZE(env_gases[gas][MOLES] * removal_ratio * (env_gases[gas][MOLES] / total_moles_to_remove)), min(MOLAR_ACCURACY*1000, env_gases[gas][MOLES])) - filtered_gases[gas][MOLES] = transferred_moles - env_gases[gas][MOLES] -= transferred_moles + filtered_out.adjust_gas(gas, transferred_moles) + environment.adjust_gas(gas, -transferred_moles) environment.garbage_collect() diff --git a/code/modules/clothing/masks/gas_filter.dm b/code/modules/clothing/masks/gas_filter.dm index 1399a1a07d4..98abaf220dd 100644 --- a/code/modules/clothing/masks/gas_filter.dm +++ b/code/modules/clothing/masks/gas_filter.dm @@ -70,26 +70,26 @@ for(var/gas_id in breath.gases) if(gas_id in high_filtering_gases) if(breath.gases[gas_id][MOLES] > HIGH_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * HIGH_FILTERING_RATIO, 0)) danger_points += 1 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_high * filter_efficiency * LOW_FILTERING_RATIO, 0)) danger_points += 0.2 continue if(gas_id in mid_filtering_gases) if(breath.gases[gas_id][MOLES] > MID_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * HIGH_FILTERING_RATIO, 0)) danger_points += 1.25 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_mid * filter_efficiency * LOW_FILTERING_RATIO, 0)) danger_points += 0.25 continue if(gas_id in low_filtering_gases) if(breath.gases[gas_id][MOLES] > LOW_FILTERING_MOLES) - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * HIGH_FILTERING_RATIO, 0)) danger_points += 1.5 continue - breath.gases[gas_id][MOLES] = max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0) + breath.set_gas(gas_id, max(breath.gases[gas_id][MOLES] - filter_strength_low * filter_efficiency * LOW_FILTERING_RATIO, 0)) danger_points += 0.5 continue diff --git a/code/modules/events/space_vines/vine_mutations.dm b/code/modules/events/space_vines/vine_mutations.dm index ab6a3a2d394..a0308fb317d 100644 --- a/code/modules/events/space_vines/vine_mutations.dm +++ b/code/modules/events/space_vines/vine_mutations.dm @@ -287,7 +287,7 @@ if(!gas_mix.gases[gas_type]) return - gas_mix.gases[gas_type][MOLES] = max(gas_mix.gases[gas_type][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0) + gas_mix.set_gas(gas_type, max(gas_mix.gases[gas_type][MOLES] - GAS_MUTATION_REMOVAL_MULTIPLIER * holder.growth_stage, 0)) gas_mix.garbage_collect() /datum/spacevine_mutation/gas_eater/oxy_eater diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index 342bfc981fd..ae97235cfe5 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -340,8 +340,8 @@ GLOBAL_LIST_INIT(spontaneous_fish_traits, populate_spontaneous_fish_traits()) return var/datum/gas_mixture/stench = new - ADD_GAS(/datum/gas/miasma, stench.gases) - stench.gases[/datum/gas/miasma][MOLES] = MIASMA_CORPSE_MOLES * 2 * seconds_per_tick + + stench.set_gas(/datum/gas/miasma, MIASMA_CORPSE_MOLES * 2 * seconds_per_tick) stench.temperature = mob.bodytemperature our_turf.assume_air(stench) diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 7b273834a86..ad65e5f3a8e 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -681,8 +681,8 @@ return var/datum/gas_mixture/stank = new - ADD_GAS(/datum/gas/miasma, stank.gases) - stank.gases[/datum/gas/miasma][MOLES] = (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * seconds_per_tick // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + + stank.set_gas(/datum/gas/miasma, (seed.yield + 6) * 3.5 * MIASMA_CORPSE_MOLES * seconds_per_tick) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses stank.temperature = T20C // without this the room would eventually freeze and miasma mining would be easier tray_turf.assume_air(stank) diff --git a/code/modules/mob/living/basic/tree.dm b/code/modules/mob/living/basic/tree.dm index bae229fddd8..5d370cf7cfb 100644 --- a/code/modules/mob/living/basic/tree.dm +++ b/code/modules/mob/living/basic/tree.dm @@ -68,11 +68,11 @@ var/turf/open/our_turf = src.loc if(!our_turf.air || !our_turf.air.gases[/datum/gas/carbon_dioxide]) return - - var/co2 = our_turf.air.gases[/datum/gas/carbon_dioxide][MOLES] + var/datum/gas_mixture/our_air = our_turf.air + var/co2 = our_air.gases[/datum/gas/carbon_dioxide][MOLES] if(co2 > 0 && SPT_PROB(13, seconds_per_tick)) var/amt = min(co2, 9) - our_turf.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt + our_air.adjust_gas(/datum/gas/carbon_dioxide, -amt) our_turf.atmos_spawn_air("[GAS_O2]=[amt]") /mob/living/basic/tree/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index a544e0963e0..0573d23e7b1 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -418,9 +418,8 @@ /obj/structure/chrono_field/return_air() //we always have nominal air and temperature var/datum/gas_mixture/fresh_air = new - fresh_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - fresh_air.gases[/datum/gas/oxygen][MOLES] = MOLES_O2STANDARD - fresh_air.gases[/datum/gas/nitrogen][MOLES] = MOLES_N2STANDARD + fresh_air.set_gas(/datum/gas/oxygen, MOLES_O2STANDARD) + fresh_air.set_gas(/datum/gas/nitrogen, MOLES_N2STANDARD) fresh_air.temperature = T20C return fresh_air diff --git a/code/modules/power/supermatter/supermatter_gas.dm b/code/modules/power/supermatter/supermatter_gas.dm index b6eb2804c28..01eb977325e 100644 --- a/code/modules/power/supermatter/supermatter_gas.dm +++ b/code/modules/power/supermatter/supermatter_gas.dm @@ -113,10 +113,10 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) ) if(!consumed_co2) return - sm.absorbed_gasmix.gases[/datum/gas/carbon_dioxide][MOLES] -= consumed_co2 - sm.absorbed_gasmix.gases[/datum/gas/oxygen][MOLES] -= consumed_co2 - ASSERT_GAS(/datum/gas/pluoxium, sm.absorbed_gasmix) - sm.absorbed_gasmix.gases[/datum/gas/pluoxium][MOLES] += consumed_co2 + sm.absorbed_gasmix.adjust_gas(/datum/gas/carbon_dioxide, -consumed_co2) + sm.absorbed_gasmix.adjust_gas(/datum/gas/oxygen, -consumed_co2) + + sm.absorbed_gasmix.adjust_gas(/datum/gas/pluoxium, consumed_co2) /datum/sm_gas/plasma gas_path = /datum/gas/plasma @@ -178,7 +178,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) var/consumed_miasma = sm.absorbed_gasmix.gases[/datum/gas/miasma][MOLES] * miasma_ratio if(!consumed_miasma) return - sm.absorbed_gasmix.gases[/datum/gas/miasma][MOLES] -= consumed_miasma + sm.absorbed_gasmix.adjust_gas(/datum/gas/miasma, -consumed_miasma) sm.external_power_trickle += consumed_miasma * MIASMA_POWER_GAIN sm.log_activation("miasma absorption") diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 38364f30391..6ccd4a85a8d 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -1133,10 +1133,9 @@ /// H2O electrolysis /obj/item/organ/lungs/ethereal/proc/consume_water(mob/living/carbon/breather, datum/gas_mixture/breath, h2o_pp, old_h2o_pp) var/gas_breathed = breath.gases[/datum/gas/water_vapor][MOLES] - breath.gases[/datum/gas/water_vapor][MOLES] -= gas_breathed - breath_out.assert_gases(/datum/gas/oxygen, /datum/gas/hydrogen) - breath_out.gases[/datum/gas/oxygen][MOLES] += gas_breathed - breath_out.gases[/datum/gas/hydrogen][MOLES] += gas_breathed * 2 + breath.adjust_gas(/datum/gas/water_vapor, -gas_breathed) + var/list/new_gases = list(/datum/gas/oxygen = gas_breathed, /datum/gas/hydrogen = gas_breathed * 2) + breath_out.adjust_multiple_gases(new_gases) /obj/item/organ/lungs/pod diff --git a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm index 6d9765e6b05..eae27f5a183 100644 --- a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm +++ b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm @@ -31,9 +31,8 @@ internal_tank.air_contents.volume = volume internal_tank.maximum_pressure = maximum_pressure if(start_full) - internal_tank.air_contents.temperature = T20C - internal_tank.air_contents.add_gases(/datum/gas/oxygen) - internal_tank.air_contents.gases[/datum/gas/oxygen][MOLES] = maximum_pressure * volume / (R_IDEAL_GAS_EQUATION * internal_tank.air_contents.temperature) + internal_tank.air_contents.set_temperature(T20C) + internal_tank.air_contents.set_gas(/datum/gas/oxygen, maximum_pressure * volume / (R_IDEAL_GAS_EQUATION * internal_tank.air_contents.temperature)) /obj/item/mecha_parts/mecha_equipment/air_tank/Destroy() if(chassis)