diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 663f5af8c89..7cef43274db 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -133,13 +133,21 @@ mob/living/carbon/human/airflow_hit(atom/A) Stun(round(airflow_speed * vsc.airflow_stun/2)) . = ..() -zone/proc/movables() +zone/proc/movables(list/origins) . = list() - for(var/turf/T in contents) - CHECK_TICK + if (!origins || !origins.len) + return - for(var/aa in T) - var/atom/movable/A = aa - if(!A.simulated || A.anchored || istype(A, /obj/effect) || istype(A, /mob/abstract/eye)) - continue - . += A + var/static/list/movables_tcache = typecacheof(list(/obj/effect, /mob/abstract)) + + var/atom/movable/AM + for (var/testing_turf in contents) + for (var/am in testing_turf) + AM = am + if (AM.simulated && !AM.anchored && !movables_tcache[AM.type]) + for (var/source_turf in origins) + if (get_dist(testing_turf, source_turf) <= EDGE_KNOCKDOWN_MAX_DISTANCE) + .[AM] = TRUE + break + + CHECK_TICK diff --git a/code/ZAS/ConnectionGroup.dm b/code/ZAS/ConnectionGroup.dm index 27efb6ced96..78a1d43b8f4 100644 --- a/code/ZAS/ConnectionGroup.dm +++ b/code/ZAS/ConnectionGroup.dm @@ -169,11 +169,11 @@ Class Procs: var/list/attracted var/list/repelled if(differential > 0) - attracted = A.movables() - repelled = B.movables() + attracted = A.movables(connecting_turfs) + repelled = B.movables(connecting_turfs) else - attracted = B.movables() - repelled = A.movables() + attracted = B.movables(connecting_turfs) + repelled = A.movables(connecting_turfs) // These are async, with waitfor = FALSE flow(attracted, abs(differential), 0) @@ -239,7 +239,7 @@ Class Procs: var/differential = A.air.return_pressure() - air.return_pressure() if(abs(differential) >= vsc.airflow_lightest_pressure) - var/list/attracted = A.movables() + var/list/attracted = A.movables(connecting_turfs) // This call is async, with waitfor = FALSE flow(attracted, abs(differential), differential < 0) diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm index e19de00e7a4..9c58cb7d314 100644 --- a/code/__defines/ZAS.dm +++ b/code/__defines/ZAS.dm @@ -7,6 +7,7 @@ #define BLOCKED 3 #define ZONE_MIN_SIZE 14 //zones with less than this many turfs will always merge, even if the connection is not direct +#define EDGE_KNOCKDOWN_MAX_DISTANCE 16 // Maximum distance between an airflow origin and a movable before knockdown no longer applies. #define CANPASS_ALWAYS 1 #define CANPASS_DENSITY 2 diff --git a/html/changelogs/lohikar-spacewind.yml b/html/changelogs/lohikar-spacewind.yml new file mode 100644 index 00000000000..eee1da79483 --- /dev/null +++ b/html/changelogs/lohikar-spacewind.yml @@ -0,0 +1,5 @@ +author: Lohikar + +delete-after: True +changes: + - bugfix: "ZAS Knockdown now has a distance cap. (Fixes 'space wind')"