diff --git a/beestation.dme b/beestation.dme index e2e970ee39cbb..784fb6a0563b4 100644 --- a/beestation.dme +++ b/beestation.dme @@ -489,6 +489,7 @@ #include "code\controllers\subsystem\processing\ai_controllers.dm" #include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\digital_clock.dm" +#include "code\controllers\subsystem\processing\effects.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.dm" @@ -1223,6 +1224,7 @@ #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\portals.dm" #include "code\game\objects\effects\proximity.dm" +#include "code\game\objects\effects\simple_fire.dm" #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\wanted_poster.dm" diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index c860b2013ca78..0d3d7bcb97090 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -23,7 +23,7 @@ /datum/heap/proc/insert(atom/A) L.Add(A) - swim(length(L)) + return swim(length(L)) //removes and returns the first element of the heap //(i.e the max or the min dependant on the comparison function) @@ -37,6 +37,19 @@ if(length(L)) sink(1) +/datum/heap/proc/delete_at(index) + if (index <= 0) + CRASH("Attempted to delete from heap where index is less than 0. This is an error.") + if (index > length(L)) + CRASH("Attempted to delete from a heap outside of the bounds of the heap.") + var/deleted = L[index] + L.Swap(index, length(L)) + L.len-- + // Edge case where we remove the sole element of the heap + if (index <= L.len) + swim(index) + return deleted + //Get a node up to its right position in the heap /datum/heap/proc/swim(index) var/parent = round(index * 0.5) @@ -45,6 +58,7 @@ L.Swap(index,parent) index = parent parent = round(index * 0.5) + return index //Get a node down to its right position in the heap /datum/heap/proc/sink(index) @@ -55,19 +69,25 @@ index = g_child g_child = get_greater_child(index) +#define parent_index(index) (index == 1 ? index : index / 2) + +#define left_child_index(index) (index * 2) + +#define right_child_index(index) (index * 2 + 1) + //Returns the greater (relative to the comparison proc) of a node children //or 0 if there's no child /datum/heap/proc/get_greater_child(index) - if(index * 2 > length(L)) + if(left_child_index(index) > length(L)) return 0 - if(index * 2 + 1 > length(L)) - return index * 2 + if(right_child_index(index) > length(L)) + return left_child_index(index) if(call(cmp)(L[index * 2],L[index * 2 + 1]) < 0) - return index * 2 + 1 + return left_child_index(index) else - return index * 2 + return right_child_index(index) //Replaces a given node so it verify the heap condition /datum/heap/proc/resort(atom/A) @@ -78,3 +98,9 @@ /datum/heap/proc/List() . = L.Copy() + +#undef parent_index + +#undef left_child_index + +#undef right_child_index diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm index 3c6eae7e2b012..22de777928c9d 100644 --- a/code/__HELPERS/path.dm +++ b/code/__HELPERS/path.dm @@ -124,7 +124,7 @@ /datum/pathfind/New(atom/movable/caller, atom/goal, id, max_distance, mintargetdist, simulated_only, avoid, avoid_mobs) src.caller = caller end = get_turf(goal) - open = new /datum/heap(/proc/HeapPathWeightCompare) + open = new /datum/heap(GLOBAL_PROC_REF(HeapPathWeightCompare)) sources = new() src.id = id src.max_distance = max_distance diff --git a/code/controllers/subsystem/async_map_generator.dm b/code/controllers/subsystem/async_map_generator.dm index b080a226c92b5..5ec0f50cbef65 100644 --- a/code/controllers/subsystem/async_map_generator.dm +++ b/code/controllers/subsystem/async_map_generator.dm @@ -28,6 +28,7 @@ SUBSYSTEM_DEF(async_map_generator) current_run_length = length(executing_generators) //Split the tick MC_SPLIT_TICK_INIT(current_run_length) + MC_SPLIT_TICK //Start processing while (current_run_index <= current_run_length) //Get current action diff --git a/code/controllers/subsystem/enumeration.dm b/code/controllers/subsystem/enumeration.dm index f4088c4e17246..5a6383f3bdd69 100644 --- a/code/controllers/subsystem/enumeration.dm +++ b/code/controllers/subsystem/enumeration.dm @@ -15,6 +15,7 @@ SUBSYSTEM_DEF(enumeration) /datum/controller/subsystem/enumeration/fire() MC_SPLIT_TICK_INIT(length(tick_enumerations)) + MC_SPLIT_TICK //No need to copy the list, so use indexing enumeration isntead //Go backwards to prevent concurrent modification issues for (var/i in length(tick_enumerations) to 1 step -1) diff --git a/code/controllers/subsystem/explosion.dm b/code/controllers/subsystem/explosion.dm index b3aefebebff7e..5f192ed55997e 100644 --- a/code/controllers/subsystem/explosion.dm +++ b/code/controllers/subsystem/explosion.dm @@ -555,7 +555,7 @@ SUBSYSTEM_DEF(explosions) for(var/thing in flame_turf) if(thing) var/turf/T = thing - new /obj/effect/hotspot(T) //Mostly for ambience! + new /obj/effect/simple_fire(T) //Mostly for ambience! cost_flameturf = MC_AVERAGE(cost_flameturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if (low_turf.len || med_turf.len || high_turf.len) diff --git a/code/controllers/subsystem/processing/effects.dm b/code/controllers/subsystem/processing/effects.dm new file mode 100644 index 0000000000000..02dadda056451 --- /dev/null +++ b/code/controllers/subsystem/processing/effects.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(effects) + name = "Effects" + wait = 0.2 SECONDS + stat_tag = "EFFECTS" diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 2838e70c19450..8dc686cf2f41c 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -17,6 +17,7 @@ /obj/effect/portal, /obj/effect/abstract, /obj/effect/hotspot, + /obj/effect/simple_fire, /obj/effect/landmark, /obj/effect/temp_visual, /obj/effect/light_emitter/tendril, diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 690e0f17ca0f9..73765c8b8cdfe 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -521,7 +521,7 @@ var/curse_flags = NONE var/effect_last_activation = 0 var/effect_cooldown = 100 - var/obj/effect/temp_visual/curse/wasting_effect = new + var/obj/effect/curse/wasting_effect = new /datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse) . = ..() @@ -585,13 +585,9 @@ C.preparePixelProjectile(ownerloc, spawn_turf) C.fire() -/obj/effect/temp_visual/curse +/obj/effect/curse icon_state = "curse" -/obj/effect/temp_visual/curse/Initialize(mapload) - . = ..() - deltimer(timerid) - /datum/status_effect/gonbolaPacify id = "gonbolaPacify" status_type = STATUS_EFFECT_MULTIPLE diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 8ec6a6bef4f8d..35ba1ec7ad68a 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -98,7 +98,7 @@ visible_message("[src] catches fire!") var/turf/T = get_turf(src) qdel(src) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) /obj/effect/decal/cleanable/oil/streak icon_state = "streak1" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 5ea702d1d52d5..7e07eadb5aa7a 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -46,6 +46,9 @@ if(G.return_temperature() > T20C) G.set_temperature(max(G.return_temperature()/2,T20C)) T.air_update_turf() + var/obj/effect/simple_fire/simple_fire = locate() in T + if (simple_fire) + qdel(simple_fire) /obj/effect/particle_effect/foam/firefighting/kill_foam() STOP_PROCESSING(SSfastprocess, src) @@ -336,6 +339,8 @@ G.set_temperature(293.15) for(var/obj/effect/hotspot/H in O) qdel(H) + for(var/obj/effect/simple_fire/H in O) + qdel(H) for(var/I in G.get_gases()) if(I == GAS_O2 || I == GAS_N2) continue diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 62922d034df1b..c1940579a67f4 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -179,6 +179,8 @@ T.air_update_turf() for(var/obj/effect/hotspot/H in T) qdel(H) + for(var/obj/effect/simple_fire/H in T) + qdel(H) if(G.get_moles(GAS_PLASMA)) G.adjust_moles(GAS_N2, G.get_moles(GAS_PLASMA)) G.set_moles(GAS_PLASMA, 0) diff --git a/code/game/objects/effects/simple_fire.dm b/code/game/objects/effects/simple_fire.dm new file mode 100644 index 0000000000000..01a8f8210828a --- /dev/null +++ b/code/game/objects/effects/simple_fire.dm @@ -0,0 +1,105 @@ +#define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5) +#define SPREAD_FIRE_POWER 5 SECONDS +#define DEFAULT_FIRE_POWER 3 SECONDS + +/** + * Simple atmospheric fire that requires oxygen, but doesn't consume it. + * Will die out after a set amount of time. + * Intended for non-atmospheric fires which shouldn't be tied to atmospherics. + */ +/obj/effect/simple_fire + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/effects/fire.dmi' + icon_state = "2" + layer = GASFIRE_LAYER + blend_mode = BLEND_ADD + light_system = MOVABLE_LIGHT + light_range = LIGHT_RANGE_FIRE + // increase power for more bloom + light_power = 4 + light_color = LIGHT_COLOR_FIRE + // Fire loses 1 power per second as it dies down + var/fire_power = DEFAULT_FIRE_POWER + var/last_fire = 0 + +/obj/effect/simple_fire/Initialize(mapload, power) + if (!isnull(power)) + fire_power = power + // Try a proper ignition + var/turf/location = loc + if (istype(location)) + location.hotspot_expose(FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + // Can't set on fire if something is already there + if (locate(/obj/effect/hotspot) in loc) + return INITIALIZE_HINT_QDEL + // Merge with other fires + for (var/obj/effect/simple_fire/other_fire in loc) + if (other_fire == src) + continue + other_fire.fire_power = fire_power + other_fire.fire_power + return INITIALIZE_HINT_QDEL + . = ..() + setDir(pick(GLOB.cardinals)) + // Process to die out + START_PROCESSING(SSeffects, src) + // When someone enters, they burn + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/simple_fire/process(delta_time) + var/turf/open/location = loc + if(!istype(location)) + qdel(src) + return + // Fire dires out + if(fire_power <= 0) + qdel(src) + return + // These can exist without any actual gas, although will ignite gas + if(!location.air || location.air.get_oxidation_power() < 0.5) + qdel(src) + return + fire_power -= delta_time * 1 SECONDS + switch (fire_power) + if (3 SECONDS to INFINITY) + icon_state = "3" + if (1 SECONDS to 3 SECONDS) + icon_state = "2" + else + icon_state = "1" + // Fire at a rate of 1 per-second + if (last_fire + 1 SECONDS > world.time) + return + last_fire = world.time + // Spread the fire, so that it burns out quicker but makes a bigger effect + if (fire_power > SPREAD_FIRE_POWER) + var/turf/adjacent = get_step(src, pick(GLOB.cardinals)) + if (isopenturf(adjacent)) + new /obj/effect/simple_fire(adjacent, fire_power * 0.5) + fire_power *= 0.5 + location.hotspot_expose(FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + location.burn_tile() + // Burn things in this place + for(var/A in location) + var/atom/AT = A + // Stop if another fire starts here + if (istype(AT, /obj/effect/hotspot)) + qdel(src) + return + if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose + AT.fire_act(FIRE_MINIMUM_TEMPERATURE_TO_EXIST, 125) + +/obj/effect/simple_fire/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + + if(isliving(arrived)) + var/mob/living/immolated = arrived + immolated.fire_act(FIRE_MINIMUM_TEMPERATURE_TO_EXIST, 125) + +/obj/effect/simple_fire/singularity_pull(S, current_size) + return + +#undef INSUFFICIENT diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 529d541797a49..c749073dadcfb 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -192,7 +192,7 @@ /obj/structure/trap/fire/flare() ..() - new /obj/effect/hotspot(get_turf(src)) + new /obj/effect/simple_fire(get_turf(src)) /obj/structure/trap/chill diff --git a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm index 42fb6feb1a791..3d7247d57a963 100644 --- a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm +++ b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm @@ -21,7 +21,7 @@ for(var/turf/open/T in RANGE_TURFS(1, B)) var/obj/structure/blob/C = locate() in T if(!(C?.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) && prob(80)) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) if(damage_flag == FIRE) return 0 return ..() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index b5f983fb2db9e..5204973ff7b7c 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -847,7 +847,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(QDELETED(src)) return do_area_burn(T, 1.5) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) qdel(src) /obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier) diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 4b4d2ef267ed8..3f445b2b08881 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -39,7 +39,7 @@ return for(var/turf/nearby_turf as anything in RANGE_TURFS(1, current_user)) - new /obj/effect/hotspot(nearby_turf) + new /obj/effect/simple_fire(nearby_turf) nearby_turf.hotspot_expose(750, 25 * delta_time, 1) for(var/mob/living/fried_living in nearby_turf.contents - current_user) fried_living.adjustFireLoss(2.5 * delta_time) @@ -65,7 +65,7 @@ var/current_range = 1 for(var/i in 0 to max_range) for(var/turf/nearby_turf as anything in spiral_range_turfs(current_range, centre)) - new /obj/effect/hotspot(nearby_turf) + new /obj/effect/simple_fire(nearby_turf) nearby_turf.hotspot_expose(750, 50, 1) for(var/mob/living/fried_living in nearby_turf.contents - centre) fried_living.adjustFireLoss(5) @@ -133,7 +133,7 @@ L.adjustFireLoss(20) to_chat(L, "You're hit by [source]'s eldritch flames!") - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) T.hotspot_expose(700,50,1) // deals damage to mechs for(var/obj/vehicle/sealed/mecha/M in T.contents) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 6cd70bf1f8356..3b4cd160b2249 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -539,7 +539,7 @@ break if(firestarter && active) hit_atom.fire_act() - new /obj/effect/hotspot(get_turf(hit_atom)) + new /obj/effect/simple_fire(get_turf(hit_atom), 400) ..() /obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index ebceb4d1aafc0..7c37e1998f5a3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -266,7 +266,7 @@ Difficulty: Medium for(var/turf/T in turfs) if(istype(T, /turf/closed)) break - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) T.hotspot_expose(700,50,1) for(var/mob/living/L in T.contents) if(L in hit_list || L == source) @@ -541,7 +541,7 @@ Difficulty: Medium var/turf/closed/mineral/M = T M.gets_drilled() playsound(T, "explosion", 80, 1) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) T.hotspot_expose(700, 50, 1) for(var/mob/living/L in T.contents) if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index e59213910dd7b..916da1486add9 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -309,7 +309,7 @@ /mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T) var/list/hit_list = list() hit_list += src - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) T.hotspot_expose(700,50,1) for(var/mob/living/L in T.contents) if(L.faction_check_mob(src) && L != src) diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 790dec3188be6..92d3d465309fd 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -442,7 +442,7 @@ to_chat(L, "\The [src] sears you!") for(var/turf/T in RANGE_TURFS(aoe_fire_range, epicenter)) //handle aoe fire if(prob(aoe_fire_chance)) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) for(var/obj/O in range(aoe_structure_range, epicenter)) if(!isitem(O)) O.take_damage(aoe_structure_damage * get_damage_coeff(O), BURN, LASER, FALSE) diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 59baefa6ba741..650fcb1f8f294 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -13,5 +13,5 @@ . = ..() var/turf/location = get_turf(src) if(location) - new /obj/effect/hotspot(location) + new /obj/effect/simple_fire(location) location.hotspot_expose(700, 50, 1) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 4dbd49cc71059..f78237072d44f 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -475,6 +475,8 @@ if (!istype(T)) return T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) + if (locate(/obj/effect/simple_fire) in T) + new /obj/effect/hotspot(T) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.return_air() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 79482f58bea95..3722c8345790f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -183,6 +183,8 @@ for(var/mob/living/simple_animal/slime/M in T) M.apply_water() + for (var/obj/effect/simple_fire/simple_fire in T) + qdel(simple_fire) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot && !isspaceturf(T)) if(T.air) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 3d8aa24424613..28300d7747cd0 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -62,8 +62,7 @@ F.burn_tile() if(isfloorturf(F)) for(var/turf/open/turf in RANGE_TURFS(1,F)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(F) + new /obj/effect/simple_fire(F, max(reac_volume / 9, 3)) if(iswallturf(T)) var/turf/closed/wall/W = T if(prob(reac_volume)) @@ -74,8 +73,7 @@ if(method != INGEST && method != INJECT) M.adjust_fire_stacks(min(reac_volume/5, 10)) M.IgniteMob() - if(!locate(/obj/effect/hotspot) in M.loc) - new /obj/effect/hotspot(M.loc) + new /obj/effect/simple_fire(M.loc, max(reac_volume / 9, 3)) /datum/reagent/sorium name = "Sorium" @@ -317,6 +315,8 @@ else if(istype(F)) F.lifetime = initial(F.lifetime) //reduce object churn a little bit when using smoke by keeping existing foam alive a bit longer + for (var/obj/effect/simple_fire/fire in T) + qdel(fire) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot && !isspaceturf(T)) if(T.air) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index c881dd1653ea5..f48ffe233550b 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -176,8 +176,7 @@ /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/open/turf in RANGE_TURFS(1,T)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) + new /obj/effect/simple_fire(turf, max(created_volume / 9, 30)) holder.chem_temp = 1000 // hot as shit /datum/chemical_reaction/reagent_explosion/methsplosion @@ -192,8 +191,7 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/open/turf in RANGE_TURFS(1,T)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) + new /obj/effect/simple_fire(turf, max(created_volume / 9, 30)) holder.chem_temp = 1000 // hot as shit ..() diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index e8181b449e407..6c030f7656e39 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -43,8 +43,7 @@ Charged extracts: /obj/item/slimecross/charged/orange/do_effect(mob/user) for(var/turf/open/turf in RANGE_TURFS(5, user)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) + new /obj/effect/simple_fire(turf) ..() /obj/item/slimecross/charged/purple diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 9a1e4d432f6ce..f637b05e53698 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -44,8 +44,7 @@ Chilling extracts: /obj/item/slimecross/chilling/orange/do_effect(mob/user) user.visible_message("[src] shatters, and lets out a jet of heat!") for(var/turf/open/T in (RANGE_TURFS(2, user)-RANGE_TURFS(1, user))) - if(!locate(/obj/effect/hotspot) in T) - new /obj/effect/hotspot(T) + new /obj/effect/simple_fire(T) ..() /obj/item/slimecross/chilling/purple diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 643514632acb8..1b38eac2e9ea1 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -49,8 +49,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) target.visible_message("The [src] boils over!") for(var/turf/open/turf in RANGE_TURFS(1,target)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) + new /obj/effect/simple_fire(turf) /obj/item/slimecross/regenerative/purple colour = "purple"