From de4f5eb9447a8bbaf6a2fd32e656efc6624548fc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 30 Oct 2022 19:03:20 -0700 Subject: [PATCH] various fixes, improvements, etc (#4649) Co-authored-by: VM_USER --- code/___compile_options.dm | 8 +++- code/controllers/subsystem/air.dm | 4 +- code/game/machinery/doors/door.dm | 7 +--- code/game/objects/structures/inflatable.dm | 2 +- code/game/objects/structures/simple_doors.dm | 2 +- .../objects/structures/windoor_assembly.dm | 6 +-- code/game/objects/structures/window.dm | 6 +-- code/modules/admin/verbs/mapping.dm | 6 ++- .../atmospherics/environmental/turf.dm | 4 ++ .../atmospherics/environmental/zas/atom.dm | 7 +--- .../atmospherics/environmental/zas/turf.dm | 30 +++++++++----- code/modules/mapping/spawner/_spawner.dm | 2 + code/modules/mapping/spawner/window.dm | 37 +++++++++++++++++- code/modules/mob/freelook/update_triggers.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 2 + .../simple_mob/subtypes/animal/space/worm.dm | 2 +- .../overmap/ships/engines/gas_thruster.dm | 2 +- code/modules/shieldgen/emergency_shield.dm | 2 +- icons/mapping/spawners/windows.dmi | Bin 6884 -> 10514 bytes 19 files changed, 94 insertions(+), 39 deletions(-) diff --git a/code/___compile_options.dm b/code/___compile_options.dm index d6cb6bb4233..4349437410b 100644 --- a/code/___compile_options.dm +++ b/code/___compile_options.dm @@ -90,11 +90,17 @@ /// Uncomment to turn on Multi-Z ZAS Support! #define MULTIZAS /// uncomment to enable laggy as sin ZAS debugging systems coded in for when doing bugfixes or major systems overhaulling. -#define ZAS_ASSERTIONS +// #define ZAS_ASSERTIONS /// uncomment to enable *actually* laggy as sin ZAS debugging, like "list in contents". don't do this without a major reason. // #define ZAS_ASSERTIONS_EXPENSIVE /// uncomment to enable debugging graphics. you probably want to keep this off in live! // #define ZAS_DEBUG_GRAPHICS +/// uncomment to enable some otherwise useless hook points for zas debugging +// #define ZAS_BREAKPOINT_HOOKS + +#ifdef ZAS_DEBUG_GRAPHICS + #define ZAS_BREAKPOINT_HOOKS +#endif //! Overlays diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index c2bc6b4a106..20ac3f7f1b3 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -127,9 +127,9 @@ SUBSYSTEM_DEF(air) return else continue + T.turf_flags &= ~TURF_ZONE_REBUILD_QUEUED T.update_air_properties() T.post_update_air_properties() - T.turf_flags &= ~TURF_ZONE_REBUILD_QUEUED #ifdef ZAS_DEBUG_GRAPHICS T.overlays -= mark #endif @@ -144,9 +144,9 @@ SUBSYSTEM_DEF(air) while(selfblock_deferred.len) var/turf/T = selfblock_deferred[selfblock_deferred.len] selfblock_deferred.len-- + T.turf_flags &= ~TURF_ZONE_REBUILD_QUEUED T.update_air_properties() T.post_update_air_properties() - T.turf_flags &= ~TURF_ZONE_REBUILD_QUEUED #ifdef ZAS_DEBUG_GRAPHICS T.overlays -= mark #endif diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7c693b89240..9b814d4ac5b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -70,7 +70,7 @@ health = maxhealth update_icon() - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/machinery/door/Destroy() density = FALSE @@ -477,15 +477,10 @@ return ..(M) /obj/machinery/door/update_nearby_tiles(need_rebuild) - if(!air_master) - return 0 - for(var/turf/simulated/turf in locs) update_heat_protection(turf) turf.queue_zone_update() - return 1 - /obj/machinery/door/proc/update_heat_protection(var/turf/simulated/source) if(istype(source)) if(src.density && (src.opacity || src.heat_proof)) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 75f7f3a20c4..f03b6709009 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -37,7 +37,7 @@ /obj/structure/inflatable/Initialize(mapload) . = ..() - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/structure/inflatable/Destroy() update_nearby_tiles() diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index cabcd295b13..fa69704002d 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -38,7 +38,7 @@ set_opacity(1) if(material.products_need_process()) START_PROCESSING(SSobj, src) - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/structure/simple_door/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index efceab2b58f..e010009834d 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -45,7 +45,7 @@ setDir(NORTH) update_state() - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/structure/windoor_assembly/Destroy() density = 0 @@ -280,12 +280,12 @@ to_chat(usr,"It is fastened to the floor; therefore, you can't rotate it!") return 0 if(src.state != "01") - update_nearby_tiles(need_rebuild=1) //Compel updates before + update_nearby_tiles() //Compel updates before src.setDir(turn(src.dir, 270)) if(src.state != "01") - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() update_icon() return diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 989d37b8c5a..60cf8b5820c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -184,7 +184,7 @@ /obj/structure/window/setDir(newdir) . = ..() - update_nearby_tiles(need_rebuild = TRUE) + update_nearby_tiles() /obj/structure/window/throw_impacted(atom/movable/AM, datum/thrownthing/TT) . = ..() @@ -398,7 +398,7 @@ health = maxhealth - update_nearby_tiles(need_rebuild = TRUE) + update_nearby_tiles() update_nearby_icons() /obj/structure/window/Destroy() @@ -417,7 +417,7 @@ /obj/structure/window/Moved() . = ..() - update_nearby_tiles(need_rebuild = TRUE) + update_nearby_tiles() //checks if this window is full-tile one /obj/structure/window/proc/is_fulltile() diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 69dab3ae198..8520a4c58d0 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -218,7 +218,8 @@ var/list/debug_verbs = list ( set category = "ZAS" set name = "Check ZAS connections" - if(!check_rights(R_DEBUG)) return + if(!check_rights(R_DEBUG)) + return testZAScolors_remove() var/turf/simulated/location = get_turf(usr) @@ -240,6 +241,9 @@ var/list/debug_verbs = list ( usedZAScolors = 1 testZAScolors_zones += location.zone + if(!location.zone) + to_chat(usr, "No zone in location!") + return for(var/turf/T in location.zone.contents) images += image(green, T,"zasdebug", TURF_LAYER) testZAScolors_turfs += T diff --git a/code/modules/atmospherics/environmental/turf.dm b/code/modules/atmospherics/environmental/turf.dm index 5d2fadbe385..dc61d80aa3c 100644 --- a/code/modules/atmospherics/environmental/turf.dm +++ b/code/modules/atmospherics/environmental/turf.dm @@ -4,6 +4,10 @@ CanAtmosPassVertical = ATMOS_PASS_PROC /// our air mixture, if any - this refers **just** to ours, not our zone. var/datum/gas_mixture/air +#ifdef ZAS_BREAKPOINT_HOOKS + /// verbosity for zas debugging + var/zas_verbose = FALSE +#endif /** * semantically means "we can pass to them", not "they can pass to us" diff --git a/code/modules/atmospherics/environmental/zas/atom.dm b/code/modules/atmospherics/environmental/zas/atom.dm index 85178b393f6..8eb4ae15b16 100644 --- a/code/modules/atmospherics/environmental/zas/atom.dm +++ b/code/modules/atmospherics/environmental/zas/atom.dm @@ -1,12 +1,7 @@ /atom/var/pressure_resistance = ONE_ATMOSPHERE //Convenience function for atoms to update turfs they occupy -/atom/movable/proc/update_nearby_tiles(need_rebuild) - if(!air_master) - return 0 - +/atom/movable/proc/update_nearby_tiles() for(var/turf/simulated/turf in locs) turf.queue_zone_update() - return 1 - diff --git a/code/modules/atmospherics/environmental/zas/turf.dm b/code/modules/atmospherics/environmental/zas/turf.dm index c7fcecc1e12..ac7c4c245f1 100644 --- a/code/modules/atmospherics/environmental/zas/turf.dm +++ b/code/modules/atmospherics/environmental/zas/turf.dm @@ -55,6 +55,12 @@ var/check_dirs = get_zone_neighbours(src) var/unconnected_dirs = check_dirs + //? from: kapu1178 + //src is only connected to the zone by a single direction, this is a safe removal. + if (!(. & (. - 1))) + return TRUE + //? end + #ifdef MULTIZAS var/to_check = GLOB.cornerdirsz #else @@ -87,6 +93,10 @@ . |= dir /turf/simulated/update_air_properties() + #ifdef ZAS_BREAKPOINT_HOOKS + if(zas_verbose) + pass() + #endif if(zone?.invalid) c_copy_air() zone = null //Easier than iterating through the list at the zone. @@ -94,7 +104,7 @@ var/self_block = CanAtmosPass(src, NONE) if(self_block == ATMOS_PASS_AIR_BLOCKED) #ifdef ZAS_DEBUG_GRAPHICS - if(verbose) + if(zas_verbose) to_chat(world, "Self-blocked.") //dbg(blocked) #endif @@ -123,7 +133,7 @@ if(them_to_us == ATMOS_PASS_AIR_BLOCKED) #ifdef ZAS_DEBUG_GRAPHICS - if(verbose) to_chat(world, "[d] is blocked.") + if(zas_verbose) to_chat(world, "[d] is blocked.") //unsim.dbg(air_blocked, turn(180,d)) #endif @@ -133,7 +143,7 @@ if(us_to_them == ATMOS_PASS_AIR_BLOCKED) #ifdef ZAS_DEBUG_GRAPHICS - if(verbose) to_chat(world, "[d] is blocked.") + if(zas_verbose) to_chat(world, "[d] is blocked.") //dbg(air_blocked, d) #endif @@ -142,8 +152,10 @@ if((previously_open & d) && istype(potential, /turf/simulated)) var/turf/simulated/S = potential if(zone && S.zone == zone) + // todo: safely remove? for now the hueristic doesn't seem to work zone.rebuild() - return + // todo: don't do this, just keep going, zone rebuilds shouldn't need this return + return // handle it next cycle, we're done here continue @@ -161,7 +173,7 @@ // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. if(((them_to_us == ATMOS_PASS_ZONE_BLOCKED) && (us_to_them != ATMOS_PASS_ZONE_BLOCKED)) || ((us_to_them == ATMOS_PASS_ZONE_BLOCKED) && (self_block != ATMOS_PASS_ZONE_BLOCKED))) #ifdef ZAS_DEBUG_GRAPHICS - if(verbose) + if(zas_verbose) to_chat(world, "[d] is zone blocked.") //dbg(zone_blocked, d) #endif @@ -174,23 +186,23 @@ #ifdef ZAS_DEBUG_GRAPHICS dbg(assigned) - if(verbose) to_chat(world, "Added to [zone]") + if(zas_verbose) to_chat(world, "Added to [zone]") #endif else if(S.zone != zone) #ifdef ZAS_DEBUG_GRAPHICS - if(verbose) + if(zas_verbose) to_chat(world, "Connecting to [sim.zone]") #endif air_master.connect(src, potential, min(them_to_us, us_to_them), d) #ifdef ZAS_DEBUG_GRAPHICS - else if(verbose) + else if(zas_verbose) to_chat(world, "[d] has same zone.") - else if(verbose) + else if(zas_verbose) to_chat(world, "[d] has invalid zone.") #endif diff --git a/code/modules/mapping/spawner/_spawner.dm b/code/modules/mapping/spawner/_spawner.dm index ae96caa3d1a..cb5b97af06c 100644 --- a/code/modules/mapping/spawner/_spawner.dm +++ b/code/modules/mapping/spawner/_spawner.dm @@ -1,4 +1,5 @@ /** + * * our only job is to spawn something and then self-delete */ /obj/spawner @@ -22,6 +23,7 @@ /obj/spawner/LateInitialize() Spawn() + qdel(src) /obj/spawner/proc/Spawn() return diff --git a/code/modules/mapping/spawner/window.dm b/code/modules/mapping/spawner/window.dm index fa1bbe7f210..227bd242812 100644 --- a/code/modules/mapping/spawner/window.dm +++ b/code/modules/mapping/spawner/window.dm @@ -13,6 +13,8 @@ var/window_pane_path = /obj/structure/window/basic /// found dirs var/found_dirs = NONE + /// spawn firedoors? fulltile and non-hidden only for now + var/firelocks = FALSE /obj/spawner/window/Initialize(mapload) if(!full_window) @@ -28,7 +30,7 @@ /obj/spawner/window/Spawn() if(spawn_grille) new /obj/structure/grille(loc) - if(!full_window) + if(full_window) new window_full_path(loc) else // spawn in dirs not in found dirs @@ -38,34 +40,67 @@ continue W = new window_pane_path(loc) W.setDir(d) + if(firelocks) + new /obj/machinery/door/firedoor(loc) + +/obj/spawner/window/firelocks + icon_state = "window_grille_pane_fire" /obj/spawner/window/full full_window = TRUE icon_state = "window_grille_full" +/obj/spawner/window/full/firelocks + icon_state = "window_grille_full_fire" + firelocks = TRUE + /obj/spawner/window/reinforced icon_state = "rwindow_grille_pane" window_pane_path = /obj/structure/window/reinforced window_full_path = /obj/structure/window/reinforced/full +/obj/spawner/window/reinforced/firelocks + icon_state = "rwindow_grille_pane_fire" + firelocks = TRUE + /obj/spawner/window/reinforced/full icon_state = "rwindow_grille_full" full_window = TRUE +/obj/spawner/window/reinforced/full/firelocks + icon_state = "rwindow_grille_full_fire" + firelocks = TRUE + /obj/spawner/window/borosillicate icon_state = "phoron_grille_pane" window_pane_path = /obj/structure/window/phoronbasic window_full_path = /obj/structure/window/phoronbasic/full +/obj/spawner/window/borosillicate/firelocks + icon_state = "phoron_grille_pane_fire" + firelocks = TRUE + /obj/spawner/window/borosillicate/full icon_state = "phoron_grille_full" full_window = TRUE +/obj/spawner/window/borosillicate/full/firelocks + icon_state = "phoron_grille_full" + firelocks = TRUE + /obj/spawner/window/borosillicate/reinforced icon_state = "rphoron_grille_pane" window_pane_path = /obj/structure/window/phoronreinforced window_full_path = /obj/structure/window/phoronreinforced/full +/obj/spawner/window/borosillicate/reinforced/firelocks + icon_state = "rphoron_grille_pane_fire" + firelocks = TRUE + /obj/spawner/window/borosillicate/reinforced/full icon_state = "rphoron_grille_full" full_window = TRUE + +/obj/spawner/window/borosillicate/reinforced/full/firelocks + icon_state = "rphoron_grille_full_fire" + firelocks = TRUE diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index d7a82d973c9..0142f6c6e53 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -33,8 +33,8 @@ // DOORS // Simply updates the visibility of the area when it opens/closes/destroyed. -/obj/machinery/door/update_nearby_tiles(need_rebuild) - . = ..(need_rebuild) +/obj/machinery/door/update_nearby_tiles() + . = ..() // Glass door glass = 1 // don't check then? if(!glass) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 392cd681e79..0f4b8bcfd54 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1112,6 +1112,7 @@ // set species = S + . = TRUE // apply new species, create organs, do post spawn stuff even though we're presumably not spawning half the time // i seriously hate vorecode @@ -1136,6 +1137,7 @@ species.create_blood(src) species.handle_post_spawn(src) species.update_attack_types() // Required for any trait that updates unarmed_types in setup. + updatehealth() // uh oh stinky - some species just have more/less maxhealth, this is a shit fix imo but deal with it for now ~silicons // Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them. update_hud() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index c2c89130031..afb5cab84a7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -309,7 +309,7 @@ EF.visible_message("\The [EF] reverberates as it returns to normal.") if(objectOrMob) - objectOrMob.update_nearby_tiles(need_rebuild=1) + objectOrMob.update_nearby_tiles() objectOrMob.forceMove(src) return 1 diff --git a/code/modules/overmap/ships/engines/gas_thruster.dm b/code/modules/overmap/ships/engines/gas_thruster.dm index f4635219c98..6978121b358 100644 --- a/code/modules/overmap/ships/engines/gas_thruster.dm +++ b/code/modules/overmap/ships/engines/gas_thruster.dm @@ -82,7 +82,7 @@ /obj/machinery/atmospherics/component/unary/engine/Initialize(mapload) . = ..() controller = new(src) - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() if(SSshuttle.initialized) link_to_ship() diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 083cd070d5d..3d2ed5b9dca 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -31,7 +31,7 @@ /obj/machinery/shield/Initialize(mapload) . = ..() setDir(pick(1,2,3,4)) - update_nearby_tiles(need_rebuild=1) + update_nearby_tiles() /obj/machinery/shield/Destroy() opacity = 0 diff --git a/icons/mapping/spawners/windows.dmi b/icons/mapping/spawners/windows.dmi index 07a9731a7edd0e280296e45fabf071f654e10119..ab1dbf45809e37ddd8c6faf4943d5f08fcd390e9 100644 GIT binary patch literal 10514 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 TZpQq{5$mmzhGL~WFy#LLCZJ>> literal 6884 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 BZ>|6U