diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index d78605c9151..13852cdb7b5 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -9,7 +9,7 @@ #define META_GAS_OVERLAY 4 #define META_GAS_DANGER 5 #define META_GAS_ID 6 - +#define META_GAS_FUSION_POWER 7 //ATMOS //stuff you should probably leave well alone! #define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 0817e4a7ada..f533efeb70a 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -241,9 +241,9 @@ message_admins("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].") log_game("Explosive tank rupture! Last key to touch the tank was [src.fingerprintslast].") //Give the gas a chance to build up more pressure through reacting - air_contents.react() - air_contents.react() - air_contents.react() + air_contents.react(src) + air_contents.react(src) + air_contents.react(src) pressure = air_contents.return_pressure() var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE var/turf/epicenter = get_turf(loc) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 2a24e5fa282..c58d14f4d48 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -87,7 +87,7 @@ else var/datum/gas_mixture/affected = location.air.remove_ratio(volume/location.air.volume) affected.temperature = temperature - affected.react() + affected.react(src) temperature = affected.temperature volume = affected.reaction_results["fire"]*FIRE_GROWTH_RATE location.assume_air(affected) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index a358c3e29c2..75b744e5973 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -410,7 +410,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g return "" -/datum/gas_mixture/react(turf/open/dump_location) +/datum/gas_mixture/react(datum/holder) . = NO_REACTION var/list/cached_gases = gases if(!cached_gases.len) @@ -459,7 +459,7 @@ GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/g //at this point, all requirements for the reaction are satisfied. we can now react() */ - . |= reaction.react(src, dump_location) + . |= reaction.react(src, holder) if (. & STOP_REACTIONS) break if(.) diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 940584dfa5d..00ab77882ec 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -3,7 +3,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / /proc/meta_gas_list() . = subtypesof(/datum/gas) for(var/gas_path in .) - var/list/gas_info = new(6) + var/list/gas_info = new(7) var/datum/gas/gas = gas_path gas_info[META_GAS_SPECIFIC_HEAT] = initial(gas.specific_heat) @@ -11,6 +11,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / gas_info[META_GAS_MOLES_VISIBLE] = initial(gas.moles_visible) if(initial(gas.moles_visible) != null) gas_info[META_GAS_OVERLAY] = new /obj/effect/overlay/gas(initial(gas.gas_overlay)) + gas_info[META_GAS_FUSION_POWER] = initial(gas.dangerous) gas_info[META_GAS_DANGER] = initial(gas.dangerous) gas_info[META_GAS_ID] = initial(gas.id) .[gas_path] = gas_info @@ -40,7 +41,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / var/gas_overlay = "" //icon_state in icons/effects/tile_effects.dmi var/moles_visible = null var/dangerous = FALSE //currently used by canisters - + var/fusion_power = 0 //How much the gas accelerates a fusion reaction /datum/gas/oxygen id = "o2" specific_heat = 20 @@ -55,6 +56,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / id = "co2" specific_heat = 30 name = "Carbon Dioxide" + fusion_power = 2 /datum/gas/plasma id = "plasma" @@ -86,6 +88,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / gas_overlay = "nitrous_oxide" moles_visible = 1 dangerous = TRUE + fusion_power = 2 /datum/gas/nitryl id = "no2" @@ -94,6 +97,7 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / gas_overlay = "nitryl" moles_visible = MOLES_GAS_VISIBLE dangerous = TRUE + fusion_power = 1.5 /datum/gas/tritium id = "tritium" @@ -102,23 +106,24 @@ GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, / gas_overlay = "tritium" moles_visible = MOLES_GAS_VISIBLE dangerous = TRUE - + fusion_power = 2 /datum/gas/bz id = "bz" specific_heat = 20 name = "BZ" dangerous = TRUE - + fusion_power = 2 /datum/gas/stimulum id = "stim" specific_heat = 5 name = "Stimulum" + fusion_power = 7 /datum/gas/pluoxium id = "pluox" specific_heat = 80 name = "Pluoxium" - + fusion_power = 10 /obj/effect/overlay/gas icon = 'icons/effects/tile_effects.dmi' mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 4cd2a30976d..c0617ba1a2b 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -66,6 +66,7 @@ priority = INFINITY name = "Hyper-Noblium Reaction Supression" id = "nobstop" + /datum/gas_reaction/nobliumsupression/init_reqs() min_requirements = list(/datum/gas/hypernoblium = REACTION_OPPRESSION_THRESHOLD) @@ -81,7 +82,8 @@ /datum/gas_reaction/water_vapor/init_reqs() min_requirements = list(/datum/gas/water_vapor = MOLES_GAS_VISIBLE) -/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, turf/open/location) +/datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder) + var/turf/open/location = isturf(holder) ? holder : null . = NO_REACTION if (air.temperature <= WATER_VAPOR_FREEZE) if(location && location.freon_gas_act()) @@ -99,13 +101,14 @@ /datum/gas_reaction/fire/init_reqs() min_requirements = list("TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST) //doesn't include plasma reqs b/c of other, rarer, burning gases. -/datum/gas_reaction/fire/react(datum/gas_mixture/air, turf/open/location) +/datum/gas_reaction/fire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() var/list/cached_gases = air.gases //this speeds things up because accessing datum vars is slow var/temperature = air.temperature var/list/cached_results = air.reaction_results cached_results[id] = 0 + var/turf/open/location = isturf(holder) ? holder : null //General volatile gas burn if(cached_gases[/datum/gas/tritium] && cached_gases[/datum/gas/tritium][MOLES]) @@ -184,55 +187,76 @@ return cached_results[id] ? REACTING : NO_REACTION -//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. +//fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again. /datum/gas_reaction/fusion - exclude = TRUE + exclude = FALSE priority = 2 name = "Plasmic Fusion" id = "fusion" + /datum/gas_reaction/fusion/init_reqs() min_requirements = list( - "ENER" = PLASMA_BINDING_ENERGY * 10, - /datum/gas/plasma = MINIMUM_HEAT_CAPACITY, - /datum/gas/tritium = MINIMUM_HEAT_CAPACITY + "ENER" = PLASMA_BINDING_ENERGY * 1000, + /datum/gas/plasma = 50, + /datum/gas/carbon_dioxide = 1 ) -/datum/gas_reaction/fusion/react(datum/gas_mixture/air, turf/open/location) +/datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder) var/list/cached_gases = air.gases var/temperature = air.temperature - - if(((cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES])/air.total_moles() < FUSION_PURITY_THRESHOLD) || air.return_pressure() < 10*ONE_ATMOSPHERE) - //Fusion wont occur if the level of impurities is too high or if there is too little pressure. - return NO_REACTION + var/turf/open/location + if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. + var/datum/pipeline/fusion_pipenet = holder + location = get_turf(pick(fusion_pipenet.members)) + else + location = get_turf(holder) var/old_heat_capacity = air.heat_capacity() - var/catalyst_efficency = max(min(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],MAX_CATALYST_EFFICENCY)-(temperature/FUSION_HEAT_DROPOFF),1) - var/reaction_energy = THERMAL_ENERGY(air) - var/moles_impurities = max(air.total_moles()-(cached_gases[/datum/gas/plasma][MOLES]+cached_gases[/datum/gas/tritium][MOLES]),1) //This makes it assume a minimum of 1 mol impurities so the reaction energy doesn't divide by 0 + var/reaction_energy + var/mediation = 100*(air.heat_capacity()-(cached_gases[/datum/gas/plasma][MOLES]*cached_gases[/datum/gas/plasma][GAS_META][META_GAS_SPECIFIC_HEAT]))/(air.total_moles()-cached_gases[/datum/gas/plasma][MOLES]) //This is the average heat capacity of the mixture,not including plasma. + var/gas_power = 0 + for (var/id in cached_gases) + gas_power += cached_gases[id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[id][MOLES] + var/plasma_fused = 0 + var/power_ratio = min(gas_power/mediation,100)//100 is a lot, we really don't want to go over this. + if (power_ratio > 10) //Super-fusion. Fuses everything into one big atom which then turns to tritium instantly. Very dangerous, but super cool. + var/gases_fused = air.total_moles() + reaction_energy += gases_fused*PLASMA_BINDING_ENERGY*(gas_power/(mediation*100)) + for (var/id in cached_gases) + cached_gases[id][MOLES] = 0 + air.assert_gas(/datum/gas/tritium) + cached_gases[/datum/gas/tritium][MOLES] += gases_fused + if (prob(power_ratio)) //You really don't want this to happen + empulse(location, power_ratio*0.5, power_ratio) + radiation_pulse(location, power_ratio*2000) + explosion(location,0,1,power_ratio*0.5,power_ratio,TRUE,TRUE)//Bypasses cap. Doesn't blow large hole in station, but produces moderate devestation for long ranges. Be careful with this. - var/plasma_fused = min((PLASMA_FUSED_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/10,cached_gases[/datum/gas/plasma][MOLES]) //Preserve matter - var/tritium_catalyzed = min((CATALYST_COEFFICENT*catalyst_efficency)*(temperature/PLASMA_BINDING_ENERGY)/40,cached_gases[/datum/gas/tritium][MOLES]) //Ditto - var/oxygen_added = tritium_catalyzed - var/waste_added = max((plasma_fused-oxygen_added)-((air.total_moles()*air.heat_capacity())/PLASMA_BINDING_ENERGY),0) - reaction_energy = max(reaction_energy+((catalyst_efficency*cached_gases[/datum/gas/plasma][MOLES])/((moles_impurities/catalyst_efficency)+2)*10)+((plasma_fused/(moles_impurities/catalyst_efficency))*PLASMA_BINDING_ENERGY),0) - - air.assert_gases(/datum/gas/oxygen, /datum/gas/carbon_dioxide, /datum/gas/water_vapor, /datum/gas/nitrous_oxide, /datum/gas/nitryl) - //Fusion produces an absurd amount of waste products now, requiring active filtration. - cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES] - plasma_fused,0) - cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES] - tritium_catalyzed,0) - cached_gases[/datum/gas/oxygen][MOLES] += oxygen_added - cached_gases[/datum/gas/water_vapor][MOLES] += waste_added - cached_gases[/datum/gas/nitrous_oxide][MOLES] += waste_added - cached_gases[/datum/gas/nitryl][MOLES] += waste_added - cached_gases[/datum/gas/carbon_dioxide][MOLES] += waste_added - if (location) - radiation_pulse(location, reaction_energy/(PLASMA_BINDING_ENERGY*MAX_CATALYST_EFFICENCY)) + else if (power_ratio > 1) //Mediation is overpowered, fusion reaction starts to break down. + plasma_fused = cached_gases[/datum/gas/plasma][MOLES] + reaction_energy += plasma_fused*PLASMA_BINDING_ENERGY + cached_gases[/datum/gas/plasma][MOLES] -= plasma_fused + cached_gases[/datum/gas/carbon_dioxide][MOLES] = 0 + air.assert_gases(/datum/gas/bz,/datum/gas/nitrous_oxide) + cached_gases[/datum/gas/bz][MOLES] += gas_power*0.05 + cached_gases[/datum/gas/nitrous_oxide][MOLES] += gas_power*0.05 + if (location) + empulse(location, mediation*0.002, mediation*0.004) + radiation_pulse(location, power_ratio*(reaction_energy)/(0.3*PLASMA_BINDING_ENERGY)) + else + reaction_energy += cached_gases[/datum/gas/plasma][MOLES]*PLASMA_BINDING_ENERGY*(gas_power/mediation) + air.assert_gas(/datum/gas/oxygen) + cached_gases[/datum/gas/oxygen][MOLES] += gas_power + cached_gases[/datum/gas/plasma][MOLES] + cached_gases[/datum/gas/plasma][MOLES] = 0 + for (var/gas in cached_gases) + if (cached_gases[gas][GAS_META][META_GAS_FUSION_POWER]) + cached_gases[gas][MOLES] = 0 + if (location) + radiation_pulse(location, (reaction_energy)/(0.3*PLASMA_BINDING_ENERGY)) if(reaction_energy > 0) var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.temperature = max(((temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB) - //Prevents whatever mechanism is causing it to hit negative temperatures. return REACTING /datum/gas_reaction/nitrylformation //The formation of nitryl. Endothermic. Requires N2O as a catalyst. @@ -256,7 +280,8 @@ var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),cached_gases[/datum/gas/oxygen][MOLES],cached_gases[/datum/gas/nitrogen][MOLES]) var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY ASSERT_GAS(/datum/gas/nitryl,air) - + if ((cached_gases[/datum/gas/oxygen][MOLES] - heat_efficency < 0 )|| (cached_gases[/datum/gas/nitrogen][MOLES] - heat_efficency < 0)) //Shouldn't produce gas from nothing. + return NO_REACTION cached_gases[/datum/gas/oxygen][MOLES] -= heat_efficency cached_gases[/datum/gas/nitrogen][MOLES] -= heat_efficency cached_gases[/datum/gas/nitryl][MOLES] += heat_efficency*2 @@ -287,11 +312,12 @@ var/old_heat_capacity = air.heat_capacity() var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma][MOLES]/cached_gases[/datum/gas/tritium][MOLES],1))),cached_gases[/datum/gas/tritium][MOLES],cached_gases[/datum/gas/plasma][MOLES]/2) var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - + if ((cached_gases[/datum/gas/tritium][MOLES] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing. + return NO_REACTION ASSERT_GAS(/datum/gas/bz,air) - cached_gases[/datum/gas/bz][MOLES]+= reaction_efficency - cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- reaction_efficency,0) - cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES] - (2*reaction_efficency),0) + cached_gases[/datum/gas/bz][MOLES] += reaction_efficency + cached_gases[/datum/gas/tritium][MOLES] -= reaction_efficency + cached_gases[/datum/gas/plasma][MOLES] -= 2*reaction_efficency if(energy_released > 0) @@ -320,10 +346,12 @@ var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5) ASSERT_GAS(/datum/gas/stimulum,air) + if ((cached_gases[/datum/gas/tritium][MOLES] - heat_scale < 0 )|| (cached_gases[/datum/gas/plasma][MOLES] - heat_scale < 0) || (cached_gases[/datum/gas/nitryl][MOLES] - heat_scale < 0)) //Shouldn't produce gas from nothing. + return NO_REACTION cached_gases[/datum/gas/stimulum][MOLES]+= heat_scale/10 - cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- heat_scale,0) - cached_gases[/datum/gas/plasma][MOLES] = max(cached_gases[/datum/gas/plasma][MOLES]- heat_scale,0) - cached_gases[/datum/gas/nitryl][MOLES] = max(cached_gases[/datum/gas/nitryl][MOLES]- heat_scale,0) + cached_gases[/datum/gas/tritium][MOLES] -= heat_scale + cached_gases[/datum/gas/plasma][MOLES] -= heat_scale + cached_gases[/datum/gas/nitryl][MOLES] -= heat_scale if(stim_energy_change) var/new_heat_capacity = air.heat_capacity() @@ -348,6 +376,8 @@ var/old_heat_capacity = air.heat_capacity() var/nob_formed = min((cached_gases[/datum/gas/nitrogen][MOLES]+cached_gases[/datum/gas/tritium][MOLES])/100,cached_gases[/datum/gas/tritium][MOLES]/10,cached_gases[/datum/gas/nitrogen][MOLES]/20) var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(cached_gases[/datum/gas/bz][MOLES],1))) + if ((cached_gases[/datum/gas/tritium][MOLES] - 10*nob_formed < 0) || (cached_gases[/datum/gas/nitrogen][MOLES] - 20*nob_formed < 0)) + return NO_REACTION cached_gases[/datum/gas/tritium][MOLES] = max(cached_gases[/datum/gas/tritium][MOLES]- 10*nob_formed,0) cached_gases[/datum/gas/nitrogen][MOLES] = max(cached_gases[/datum/gas/nitrogen][MOLES]- 20*nob_formed,0) cached_gases[/datum/gas/hypernoblium][MOLES]+= nob_formed diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 0b848968d13..a4cc2eb3377 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -27,7 +27,7 @@ if(update) update = FALSE reconcile_air() - update = air.react() + update = air.react(src) /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base) var/volume = 0 diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index abbc2dc2728..5bf9f5b8c05 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -35,7 +35,7 @@ /obj/machinery/portable_atmospherics/process_atmos() if(!connected_port) // Pipe network handles reactions if connected. - air_contents.react() + air_contents.react(src) else update_icon() diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 9d601d09b84..1bd7d02609d 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -65,7 +65,7 @@ temp.merge(bomb.tank_one.air_contents.remove_ratio(1)) temp.merge(bomb.tank_two.air_contents.remove_ratio(2)) for(var/i in 1 to 6) - temp.react() + temp.react(src) var/pressure = temp.return_pressure() qdel(temp) if(pressure < TANK_FRAGMENT_PRESSURE) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b9b0fd41364..b98f3c0760b 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -438,7 +438,7 @@ if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react() + lowertemp.react(src) T.assume_air(lowertemp) qdel(hotspot) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 38813114902..6a57ff0c188 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -146,7 +146,7 @@ if(T.air) var/datum/gas_mixture/G = T.air G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0) - G.react() + G.react(src) qdel(hotspot) var/obj/effect/acid/A = (locate(/obj/effect/acid) in T) if(A) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 6438a82276b..30117d4ce3f 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -273,7 +273,7 @@ var/datum/gas_mixture/G = T.air if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) - G.react() + G.react(src) qdel(hotspot) /datum/reagent/firefighting_foam/reaction_obj(obj/O, reac_volume)