diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 48787430a0..aab766f9e4 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -491,17 +491,26 @@ Turf and target are separate in case you want to teleport some distance from a t var/y=arcsin(x/sqrt(1+x*x)) return y -/atom/proc/GetAllContents() +/atom/proc/GetAllContents(list/ignore_typecache) var/list/processing_list = list(src) var/list/assembled = list() + if(ignore_typecache) //If there's a typecache, use it. + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list -= A + if(ignore_typecache[A.type]) + continue + processing_list |= (A.contents - assembled) + assembled |= A - while(processing_list.len) - var/atom/A = processing_list[1] - processing_list -= A + else //If there's none, only make this check once for performance. + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list -= A - processing_list |= (A.contents - assembled) + processing_list |= (A.contents - assembled) - assembled |= A + assembled |= A return assembled diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a75823701a..b204406d05 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -77,6 +77,7 @@ return SSair.remove_from_active(src) visibilityChanged() + QDEL_LIST(blueprint_data) initialized = FALSE requires_activation = FALSE ..() @@ -224,9 +225,15 @@ var/old_affecting_lights = affecting_lights var/old_lighting_object = lighting_object var/old_corners = corners + + var/old_exl = explosion_level + var/old_exi = explosion_id + var/old_bp = blueprint_data + blueprint_data = null var/old_baseturf = baseturf changing_turf = TRUE + qdel(src) //Just get the side effects and call Destroy var/turf/W = new path(src) @@ -235,9 +242,14 @@ else W.baseturf = old_baseturf + W.explosion_id = old_exi + W.explosion_level = old_exl + if(!defer_change) W.AfterChange(ignore_air) + W.blueprint_data = old_bp + if(SSlighting.initialized) recalc_atom_opacity() lighting_object = old_lighting_object @@ -432,27 +444,24 @@ I.setDir(AM.dir) I.alpha = 128 - if(!blueprint_data) - blueprint_data = list() - blueprint_data += I + LAZYADD(blueprint_data, I) /turf/proc/add_blueprints_preround(atom/movable/AM) if(!SSticker.HasRoundStarted()) add_blueprints(AM) -/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, delmobs = TRUE, forceop = FALSE) +/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE) // Remove all atoms except observers, landmarks, docking ports var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object)) - var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(),delmobs? ignored_atoms : ignored_atoms + typecacheof(list(/mob))) + var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms) allowed_contents -= src for(var/i in 1 to allowed_contents.len) var/thing = allowed_contents[i] qdel(thing, force=TRUE) - var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop = forceop) - + SSair.remove_from_active(newT) newT.CalculateAdjacentTurfs() SSair.add_to_active(newT,1) @@ -537,4 +546,4 @@ limit-- else return I - return I \ No newline at end of file + return I diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index b93b3630e9..24b75a3a9a 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -20,26 +20,34 @@ /datum/mapGeneratorModule/bottomLayer/massdelete spawnableAtoms = list() spawnableTurfs = list() - var/deletemobs = TRUE - var/deleteturfs = TRUE + var/deleteturfs = TRUE //separate var for the empty type. + var/list/ignore_typecache /datum/mapGeneratorModule/bottomLayer/massdelete/generate() if(!mother) return for(var/V in mother.map) var/turf/T = V - T.empty(deleteturfs? null : T.type, delmobs = deletemobs, forceop = TRUE) + T.empty(deleteturfs? null : T.type, ignore_typecache = ignore_typecache, forceop = TRUE) -/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs - deletemobs = FALSE +/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs/New() + ..() + ignore_typecache = typecacheof(list(/mob)) /datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs deleteturfs = FALSE +/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs/New() + ..() + ignore_typecache = typecacheof(list(/turf)) + /datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete - deletemobs = FALSE deleteturfs = FALSE +/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete/New() + ..() + ignore_typecache = typecacheof(list(/mob, /turf)) + //Only places atoms/turfs on area borders /datum/mapGeneratorModule/border clusterCheckFlags = CLUSTER_CHECK_NONE