From 7d32eba2a17e15f65743a716b0f33c9a24e47a4b Mon Sep 17 00:00:00 2001 From: as334 Date: Sat, 28 Apr 2018 02:01:39 -0400 Subject: [PATCH] Re-adds and reworks fusion. (#37384) add: Fusion is back add: Fusion now happens with large quantities of hot plasma and CO2, consuming all the plasma rapidly and producing large amounts of energy. Other gases can also effect the performance of the reaction. add: Fusion now produces radiation. Be careful around reactors. fix: fixes fusion dividing by zero and destroying everything code: Gas reactions now have access to where they are occurring fix: Prevents some other reactions from producing matter from nothing --- code/__DEFINES/atmospherics.dm | 2 +- code/game/objects/items/tanks/tanks.dm | 6 +- .../atmospherics/environmental/LINDA_fire.dm | 2 +- .../atmospherics/gasmixtures/gas_mixture.dm | 4 +- .../atmospherics/gasmixtures/gas_types.dm | 15 ++- .../atmospherics/gasmixtures/reactions.dm | 112 +++++++++++------- .../atmospherics/machinery/datum_pipeline.dm | 2 +- .../portable/portable_atmospherics.dm | 2 +- .../projectiles/guns/misc/blastcannon.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../reagents/pyrotechnic_reagents.dm | 2 +- 12 files changed, 94 insertions(+), 59 deletions(-) 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)