diff --git a/auxmos.dll b/auxmos.dll index b1320fa1dc..4e0687fa2b 100644 Binary files a/auxmos.dll and b/auxmos.dll differ diff --git a/auxmos.pdb b/auxmos.pdb index 0aa8e9379a..da06980179 100644 Binary files a/auxmos.pdb and b/auxmos.pdb differ diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index c585a822ea..6266dcc6d3 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -152,10 +152,6 @@ #define ATMOS_PASS_PROC -1 //ask CanAtmosPass() #define ATMOS_PASS_DENSITY -2 //just check density -// Adjacency flags -#define ATMOS_ADJACENT_ANY (1<<0) -#define ATMOS_ADJACENT_FIRELOCK (1<<1) - #define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) #define CANVERTICALATMOSPASS(A, O) ( A.CanAtmosPassVertical == ATMOS_PASS_PROC ? A.CanAtmosPass(O, TRUE) : ( A.CanAtmosPassVertical == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPassVertical ) ) @@ -327,6 +323,14 @@ #define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */ + +#ifdef TESTING +GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) +#define CALCULATE_ADJACENT_TURFS(T) if (SSadjacent_air.queue[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSadjacent_air.queue[T] = 1 } +#else +#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1 +#endif + //If you're doing spreading things related to atmos, DO NOT USE CANATMOSPASS, IT IS NOT CHEAP. use this instead, the info is cached after all. it's tweaked just a bit to allow for circular checks #define TURFS_CAN_SHARE(T1, T2) (LAZYACCESS(T2.atmos_adjacent_turfs, T1) || LAZYLEN(T1.atmos_adjacent_turfs & T2.atmos_adjacent_turfs)) diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm new file mode 100644 index 0000000000..99ee587826 --- /dev/null +++ b/code/controllers/subsystem/adjacent_air.dm @@ -0,0 +1,39 @@ +SUBSYSTEM_DEF(adjacent_air) + name = "Atmos Adjacency" + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 10 + priority = FIRE_PRIORITY_ATMOS_ADJACENCY + var/list/queue = list() + +/datum/controller/subsystem/adjacent_air/stat_entry(msg) +#ifdef TESTING + msg = "P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]" +#else + msg = "P:[length(queue)]" +#endif + return ..() + +/datum/controller/subsystem/adjacent_air/Initialize() + while(length(queue)) + fire(mc_check = FALSE) + return ..() + +/datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + if(SSair.thread_running()) + pause() + return + + var/list/queue = src.queue + + while (length(queue)) + var/turf/currT = queue[1] + queue.Cut(1,2) + + currT.ImmediateCalculateAdjacentTurfs() + + if(mc_check) + if(MC_TICK_CHECK) + break + else + CHECK_TICK diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 2a0dbd316a..c0866ce165 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -34,8 +34,6 @@ /obj/machinery/door/firedoor/Initialize(mapload) . = ..() CalculateAffectingAreas() - UpdateAdjacencyFlags() - /obj/machinery/door/firedoor/examine(mob/user) . = ..() @@ -55,20 +53,6 @@ var/area/A = I LAZYADD(A.firedoors, src) -/obj/machinery/door/firedoor/proc/UpdateAdjacencyFlags() - var/turf/T = get_turf(src) - if(flags_1 & ON_BORDER_1) - for(var/t in T.atmos_adjacent_turfs) - if(get_dir(loc, t) == dir) - var/turf/open/T2 = t - T.atmos_adjacent_turfs[T2] |= ATMOS_ADJACENT_FIRELOCK - T2.atmos_adjacent_turfs[T] |= ATMOS_ADJACENT_FIRELOCK - else - for(var/t in T.atmos_adjacent_turfs) - var/turf/open/T2 = t - T.atmos_adjacent_turfs[T2] |= ATMOS_ADJACENT_FIRELOCK - T2.atmos_adjacent_turfs[T] |= ATMOS_ADJACENT_FIRELOCK - /obj/machinery/door/firedoor/closed icon_state = "door_closed" opacity = TRUE diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 7502d4b2f0..a62fc70917 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - newT.ImmediateCalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(newT) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -285,7 +285,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() levelupdate() - ImmediateCalculateAdjacentTurfs() + if(flags & CHANGETURF_RECALC_ADJACENT) + ImmediateCalculateAdjacentTurfs() + else + CALCULATE_ADJACENT_TURFS(src) //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 549e244669..dc44ac728f 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(station_turfs) add_overlay(/obj/effect/fullbright) if(requires_activation) - ImmediateCalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) if (light_power && light_range) update_light() @@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/set_temperature() /turf/proc/Initalize_Atmos(times_fired) - ImmediateCalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) /turf/Destroy(force) . = QDEL_HINT_IWILLGC diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 033ea6d871..8d063825f1 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -40,19 +40,21 @@ return FALSE /turf/proc/ImmediateCalculateAdjacentTurfs() + if(SSair.thread_running()) + CALCULATE_ADJACENT_TURFS(src) + return var/canpass = CANATMOSPASS(src, src) var/canvpass = CANVERTICALATMOSPASS(src, src) for(var/direction in GLOB.cardinals_multiz) var/turf/T = get_step_multiz(src, direction) if(!istype(T)) continue + var/opp_dir = REVERSE_DIR(direction) if(isopenturf(T) && !(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) - atmos_adjacent_turfs[T] = ATMOS_ADJACENT_ANY - T.atmos_adjacent_turfs[src] = ATMOS_ADJACENT_ANY - for(var/obj/machinery/door/firedoor/FD in T) - FD.UpdateAdjacencyFlags() + atmos_adjacent_turfs[T] = direction + T.atmos_adjacent_turfs[src] = opp_dir else if (atmos_adjacent_turfs) atmos_adjacent_turfs -= T @@ -63,8 +65,7 @@ T.__update_auxtools_turf_adjacency_info(isspaceturf(T.get_z_base_turf()), -1) UNSETEMPTY(atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs - for(var/obj/machinery/door/firedoor/FD in src) - FD.UpdateAdjacencyFlags() + set_sleeping(blocks_air) __update_auxtools_turf_adjacency_info(isspaceturf(get_z_base_turf())) /turf/proc/set_sleeping(should_sleep) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index d7fb2e8b5a..56820d2836 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -280,11 +280,7 @@ we use a hook instead parse_gas_string(model.initial_gas_mix) return 1 -/datum/gas_mixture/proc/__auxtools_parse_gas_string(gas_string) - /datum/gas_mixture/parse_gas_string(gas_string) - return __auxtools_parse_gas_string(gas_string) - /* gas_string = SSair.preprocess_gas_string(gas_string) var/list/gas = params2list(gas_string) @@ -299,7 +295,6 @@ we use a hook instead set_moles(id, text2num(gas[id])) archive() return 1 - */ /* /datum/gas_mixture/react(datum/holder) . = NO_REACTION diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index d69b9da768..738d10665a 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( if(toupdate.len) for(var/turf/T1 in toupdate) - T1.ImmediateCalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T1) return copiedobjs diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index cb02a440b8..f7f5b335c5 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -952,7 +952,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) playsound(T, 'sound/effects/supermatter.ogg', 50, 1) T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\ "You hear a loud crack as you are washed with a wave of heat.") - T.ImmediateCalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T) //Do not blow up our internal radio /obj/machinery/power/supermatter_crystal/contents_explosion(severity, target, origin) diff --git a/dependencies.sh b/dependencies.sh index e0df827a2a..7943782996 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -21,7 +21,7 @@ export SPACEMAN_DMM_VERSION=suite-1.7 export PYTHON_VERSION=3.7.9 # Auxmos git tag -export AUXMOS_VERSION=v2.1.0 +export AUXMOS_VERSION=v1.1.1 # Extools git tag export EXTOOLS_VERSION=v0.0.7 diff --git a/tgstation.dme b/tgstation.dme index e2248b9704..028b5926f7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -355,6 +355,7 @@ #include "code\controllers\configuration\entries\vote.dm" #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\activity.dm" +#include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm"