From aba98f6cb2441c63125926f0414f6a3287337b5f Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 20 Mar 2019 17:11:30 -0400 Subject: [PATCH] fake hotspots --- code/LINDA/LINDA_fire.dm | 46 ++++++++++++++----- .../chemistry/reagents/pyrotechnic.dm | 10 ++-- code/modules/reagents/reagent_dispenser.dm | 7 +-- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index dad05f32c99..7c56277e7ab 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -59,11 +59,14 @@ var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST var/just_spawned = 1 var/bypassing = 0 + var/fake = FALSE + var/burn_time = 0 /obj/effect/hotspot/New() ..() - SSair.hotspots += src - perform_exposure() + if(!fake) + SSair.hotspots += src + perform_exposure() dir = pick(cardinal) air_update_turf() @@ -162,7 +165,8 @@ /obj/effect/hotspot/Destroy() set_light(0) SSair.hotspots -= src - DestroyTurf() + if(!fake) + DestroyTurf() if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc if(T.active_hotspot == src) @@ -190,6 +194,15 @@ if(isliving(L)) L.fire_act() +/obj/effect/hotspot/fake // Largely for the fireflash procs below + fake = TRUE + burn_time = 30 + +/obj/effect/hotspot/fake/New() + ..() + if(burn_time) + QDEL_IN(src, burn_time) + /proc/fireflash(atom/center, radius, temp) if(!temp) temp = rand(2800, 3200) @@ -201,14 +214,18 @@ if(!can_line(get_turf(center), T, radius + 1)) continue - var/obj/effect/hotspot/H = new(T) + var/obj/effect/hotspot/fake/H = new(T) H.temperature = temp H.volume = 400 - if(istype(T, /turf/simulated)) - var/turf/simulated/S = T - S.active_hotspot = H + H.color = heat2color(H.temperature) + H.set_light(l_color = H.color) T.hotspot_expose(H.temperature, H.volume) + for(var/atom/A in T) + if(isliving(A)) + continue + if(A != H) + A.fire_act(null, H.temperature, H.volume) if(istype(T, /turf/simulated/floor)) var/turf/simulated/floor/F = T @@ -248,14 +265,13 @@ var/need_expose = 0 var/expose_temp = 0 if(!existing_hotspot) - var/obj/effect/hotspot/H = new(T) + var/obj/effect/hotspot/fake/H = new(T) need_expose = TRUE H.temperature = temp - dist * falloff expose_temp = H.temperature H.volume = 400 - if(istype(T, /turf/simulated)) - var/turf/simulated/S = T - S.active_hotspot = H + H.color = heat2color(H.temperature) + H.set_light(l_color = H.color) existing_hotspot = H else if(existing_hotspot.temperature < temp - dist * falloff) @@ -264,15 +280,23 @@ if(expose_temp > prev_temp * 3) need_expose = TRUE existing_hotspot.temperature = temp - dist * falloff + existing_hotspot.color = heat2color(existing_hotspot.temperature) + existing_hotspot.set_light(l_color = existing_hotspot.color) affected[T] = existing_hotspot.temperature if(need_expose && expose_temp) T.hotspot_expose(expose_temp, existing_hotspot.volume) + for(var/atom/A in T) + if(isliving(A)) + continue + if(A != existing_hotspot) + A.fire_act(null, expose_temp, existing_hotspot.volume) if(istype(T, /turf/simulated/floor)) var/turf/simulated/floor/F = T F.burn_tile() for(var/mob/living/L in T) L.adjust_fire_stacks(3) + L.IgniteMob() L.bodytemperature = (2 * L.bodytemperature + temp) / 3 if(T.density) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index f9c98130549..fb58e351a03 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -198,7 +198,7 @@ S.overlays.Cut() S.overlays = image('icons/effects/effects.dmi', icon_state = "thermite") if(S.active_hotspot) - S.reagents.temperature_reagents(S.active_hotspot.temperature, S.active_hotspot.volume, 10, 300) + S.reagents.temperature_reagents(S.active_hotspot.temperature, 10, 300) /datum/reagent/glycerol name = "Glycerol" @@ -344,8 +344,8 @@ /datum/reagent/cryostylane/on_tick() if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.remove_reagent("cryostylane", 1) + holder.remove_reagent("oxygen", 2) + holder.remove_reagent("cryostylane", 2) holder.temperature_reagents(holder.chem_temp - 200) holder.temperature_reagents(holder.chem_temp - 200) ..() @@ -374,8 +374,8 @@ /datum/reagent/pyrosium/on_tick() if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.remove_reagent("pyrosium", 1) + holder.remove_reagent("oxygen", 2) + holder.remove_reagent("pyrosium", 2) holder.temperature_reagents(holder.chem_temp + 200) holder.temperature_reagents(holder.chem_temp + 200) ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 098708bde57..b3c98f82b54 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -26,7 +26,8 @@ ..() if(reagents) for(var/i in 1 to 8) - reagents.temperature_reagents(exposed_temperature, exposed_volume) + if(reagents) + reagents.temperature_reagents(exposed_temperature) /obj/structure/reagent_dispensers/proc/boom() visible_message("[src] ruptures!") @@ -91,8 +92,8 @@ investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB) boom() -/obj/structure/reagent_dispensers/fueltank/boom(var/rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion - if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder +/obj/structure/reagent_dispensers/fueltank/boom(rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion + if(rigtrigger) // If the explosion is triggered by an assembly holder message_admins("A fueltank, last rigged by [lastrigger], was triggered at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank log_game("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]") investigate_log("A fueltank, last rigged by [lastrigger], triggered at [COORD(loc)]", INVESTIGATE_BOMB)