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)