From 92f9be0898a3043a9f2f1d929b8d2aa4cc53a470 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sun, 22 May 2022 13:14:23 +0200 Subject: [PATCH] [MIRROR] Makes smoke react to opening airlocks. [MDB IGNORE] (#13804) * 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. * Makes smoke react to opening airlocks. Co-authored-by: TemporalOroboros --- 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 95450087e8f..949271e447d 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 31d62a616fb..556eb048e34 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)