From 9d16d6643c9fe0aabdc07c8bbbc859885d00c7ba Mon Sep 17 00:00:00 2001 From: TemporalOroboros Date: Sun, 22 May 2022 00:30:44 -0700 Subject: [PATCH] Makes smoke react to opening airlocks. (#66963) Makes smoke spread through newly opened airlocks if the cloud has spread past the airlock, but has not completely finished spreading. More intuitive smoke behavior. As funny as it is to open an airlock and see nothing but a wall of smoke it's even funnier to open an airlock and suddenly be inside a wall of smoke. --- code/game/machinery/doors/firedoor.dm | 10 ++++++++-- .../fluid_spread/effects_smoke.dm | 20 +++++++++++++++++++ .../environmental/LINDA_system.dm | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index f0acbcc6f93..9023d66a9b9 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -218,6 +218,10 @@ process_results(checked_turf) /obj/machinery/door/firedoor/proc/register_adjacent_turfs(atom/loc) + if(!loc) + return + + RegisterSignal(loc, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS, .proc/process_results) for(var/dir in GLOB.cardinals) var/turf/checked_turf = get_step(get_turf(loc), dir) @@ -225,10 +229,13 @@ continue process_results(checked_turf) RegisterSignal(checked_turf, COMSIG_TURF_EXPOSE, .proc/process_results) - RegisterSignal(checked_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS, .proc/process_results) /obj/machinery/door/firedoor/proc/unregister_adjacent_turfs(atom/loc) + if(!loc) + return + + UnregisterSignal(loc, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) for(var/dir in GLOB.cardinals) var/turf/checked_turf = get_step(get_turf(loc), dir) @@ -236,7 +243,6 @@ continue UnregisterSignal(checked_turf, COMSIG_TURF_EXPOSE) - UnregisterSignal(checked_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) /obj/machinery/door/firedoor/proc/check_atmos(turf/checked_turf) var/datum/gas_mixture/environment = checked_turf.return_air() 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 320c2b5add1..f25d99d295c 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 @@ -15,11 +15,16 @@ animate_movement = FALSE /// How long the smoke sticks around before it dissipates. var/lifetime = 10 SECONDS + /// Makes the smoke react to changes on/of its turf. + var/static/loc_connections = list( + COMSIG_TURF_CALCULATED_ADJACENT_ATMOS = .proc/react_to_atmos_adjacency_changes + ) /obj/effect/particle_effect/fluid/smoke/Initialize(mapload, datum/fluid_group/group, ...) . = ..() create_reagents(1000) setDir(pick(GLOB.cardinals)) + AddElement(/datum/element/connect_loc, loc_connections) SSsmoke.start_processing(src) /obj/effect/particle_effect/fluid/smoke/Destroy() @@ -121,6 +126,21 @@ addtimer(VARSET_CALLBACK(smoker, smoke_delay, FALSE), 1 SECONDS) return TRUE +/** + * Makes the smoke react to nearby opening/closing airlocks and the like. + * Makes it possible for smoke to spread through airlocks that open after the edge of the smoke cloud has already spread past them. + * + * Arguments: + * - [source][/turf]: The turf that has been touched by an atmos adjacency change. + */ +/obj/effect/particle_effect/fluid/smoke/proc/react_to_atmos_adjacency_changes(turf/source) + SIGNAL_HANDLER + if(!group) + return NONE + if (spread_bucket) + return NONE + SSsmoke.queue_spread(src) + /// A factory which produces clouds of smoke. /datum/effect_system/fluid_spread/smoke effect_type = /obj/effect/particle_effect/fluid/smoke diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 28743a43c47..9fa29217a80 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -73,6 +73,7 @@ if (current_turf.atmos_adjacent_turfs) current_turf.atmos_adjacent_turfs -= src UNSETEMPTY(current_turf.atmos_adjacent_turfs) + SEND_SIGNAL(current_turf, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS) UNSETEMPTY(atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs SEND_SIGNAL(src, COMSIG_TURF_CALCULATED_ADJACENT_ATMOS)