From c35261f0fdf9c14afc4aecd19d1230e2815da68f Mon Sep 17 00:00:00 2001 From: Mloc Date: Thu, 10 Oct 2013 10:25:20 +0100 Subject: [PATCH] Much better solution to the zone geometry bug. Adds a unsim_check_directions var to simulated turfs, which is similar in use to air_check_directions but points to unsimulated or space tiles instead of open air tiles. Signed-off-by: Mloc --- code/ZAS/ZAS_Turfs.dm | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/code/ZAS/ZAS_Turfs.dm b/code/ZAS/ZAS_Turfs.dm index b023d33001..7ba40ef715 100644 --- a/code/ZAS/ZAS_Turfs.dm +++ b/code/ZAS/ZAS_Turfs.dm @@ -43,6 +43,8 @@ /turf/simulated/var/tmp/air_check_directions = 0 //Do not modify this, just add turf to air_master.tiles_to_update +/turf/simulated/var/tmp/unsim_check_directions = 0 //See above. + /turf/simulated/var/tmp/obj/fire/active_hotspot /turf/simulated/proc/update_visuals() @@ -125,11 +127,19 @@ return ..() /turf/simulated/proc/update_air_properties() + var/air_directions_archived = air_check_directions air_check_directions = 0 + var/unsim_directions_archived = unsim_check_directions + unsim_check_directions = 0 + for(var/direction in cardinal) - if(ZAirPass(get_step(src,direction))) - air_check_directions |= direction + var/turf/check_turf = get_step(src, direction) + if(ZAirPass(check_turf)) + if(istype(check_turf, /turf/simulated)) + air_check_directions |= direction + else if(istype(check_turf, /turf/space) || istype(check_turf, /turf/unsimulated)) + unsim_check_directions |= direction if(!zone && !blocks_air) //No zone, but not a wall. for(var/direction in DoorDirections) //Check door directions first. @@ -164,12 +174,15 @@ var/turf/T = get_step(src,direction) if(!istype(T)) continue - //I can connect to air in this direction - if(air_check_directions & direction) + + //I can connect to air or space in this direction + if((air_check_directions & direction && !(air_directions_archived & direction)) || \ + (unsim_check_directions & direction && !(unsim_directions_archived & direction))) ZConnect(src,T) //Something like a wall was built, changing the geometry. - else if(!(air_check_directions & direction)) + else if((!(air_check_directions & direction) && air_directions_archived & direction) || \ + (!(unsim_check_directions & direction) && unsim_directions_archived & direction)) var/turf/NT = get_step(T, direction) //If the tile is in our own zone, and we cannot connect to it, better rebuild.