From f604e14933f199e155bf63f1fda33426813c05f6 Mon Sep 17 00:00:00 2001 From: LordFowl Date: Thu, 22 Jun 2017 06:16:06 -0400 Subject: [PATCH] Refactors baseturf (#2778) Modifies baseturf to be used instead of not used. Now all functions that used to call "get_base_turf_by_area(T)" will now call "T.baseturf". Turfs that do not have a baseturf defined will set their baseturf to be the result of "get_base_turf_by_area()", which will descend into "get_base_turf_by_z" and ultimately into "turf/space", if none of the previous stages catch. ChangeTurf will now only keep baseturf persistent from father to child if the child has no baseturf set by code. This allows for special turfs, such as ceilings, to have their own base turf, such as open space, to be used instead of the area/z baseturf. Fixes #2763 --- code/_helpers/area_movement.dm | 12 ++++++------ code/game/gamemodes/cult/narsie.dm | 20 ++++++++++---------- code/game/gamemodes/events/black_hole.dm | 3 ++- code/game/mecha/equipment/tools/tools.dm | 9 +++++---- code/game/objects/items/weapons/RCD.dm | 4 ++-- code/game/turfs/flooring/flooring_premade.dm | 3 +++ code/game/turfs/simulated/floor_acts.dm | 4 ++-- code/game/turfs/simulated/walls.dm | 4 ++-- code/game/turfs/turf.dm | 5 ++++- code/game/turfs/turf_changing.dm | 5 +++-- 10 files changed, 39 insertions(+), 30 deletions(-) diff --git a/code/_helpers/area_movement.dm b/code/_helpers/area_movement.dm index b903acb93cc..25c21e512a4 100644 --- a/code/_helpers/area_movement.dm +++ b/code/_helpers/area_movement.dm @@ -17,10 +17,10 @@ if (T.x > xmax) xmax = T.x - + if (T.x < xmin) xmin = T.x - + if (T.y > ymax) ymax = T.y @@ -62,12 +62,12 @@ continue var/turf/TT = ST.copy_turf(target_turfs[i]) - + for (var/thing in ST) var/atom/movable/AM = thing AM.shuttle_move(TT) - ST.ChangeTurf(get_base_turf_by_area(ST)) + ST.ChangeTurf(ST.baseturf) if (istype(TT, /turf/simulated)) simulated_turfs += TT @@ -106,7 +106,7 @@ T = target_turfs[idex] - baseturf = get_base_turf(T.z) + baseturf = T.baseturf for (var/i = 1; i <= source_turfs.len; i++) var/turf/ST = source_turfs[i] @@ -115,7 +115,7 @@ continue var/turf/TT = ST.copy_turf(TTi, ignore_air = TRUE) - + for (var/thing in ST) var/atom/movable/AM = thing var/atom/movable/copy = DuplicateObject(AM, 1) diff --git a/code/game/gamemodes/cult/narsie.dm b/code/game/gamemodes/cult/narsie.dm index a916129d8cf..dc4fa58e568 100644 --- a/code/game/gamemodes/cult/narsie.dm +++ b/code/game/gamemodes/cult/narsie.dm @@ -236,9 +236,10 @@ var/global/list/narsie_list = list() if (A) qdel(A) else if (isturf(A)) - var/dist = get_dist(A, src) + var/turf/T2 = A + var/dist = get_dist(T2, src) - for (var/atom/movable/AM2 in A.contents) + for (var/atom/movable/AM2 in T2.contents) if (AM2 == src) // This is the snowflake. continue @@ -246,9 +247,8 @@ var/global/list/narsie_list = list() consume(AM2) continue - if (dist <= consume_range && !istype(A, get_base_turf_by_area(A))) - var/turf/T2 = A - T2.ChangeTurf(get_base_turf_by_area(A)) + if (dist <= consume_range && !istype(T2, T2.baseturf)) + T2.ChangeTurf(T2.baseturf) /obj/singularity/narsie/consume(const/atom/A) //This one is for the small ones. if(!(A.singuloCanEat())) @@ -270,9 +270,10 @@ var/global/list/narsie_list = list() if (A) qdel(A) else if (isturf(A)) - var/dist = get_dist(A, src) + var/turf/T2 = A + var/dist = get_dist(T2, src) - for (var/atom/movable/AM2 in A.contents) + for (var/atom/movable/AM2 in T2.contents) if (AM2 == src) // This is the snowflake. continue @@ -290,9 +291,8 @@ var/global/list/narsie_list = list() spawn (0) AM2.singularity_pull(src, src.current_size) - if (dist <= consume_range && !istype(A, get_base_turf_by_area(A))) - var/turf/T2 = A - T2.ChangeTurf(get_base_turf_by_area(A)) + if (dist <= consume_range && !istype(T2, T2.baseturf)) + T2.ChangeTurf(T2.baseturf) /obj/singularity/narsie/ex_act(severity) //No throwing bombs at it either. --NEO return diff --git a/code/game/gamemodes/events/black_hole.dm b/code/game/gamemodes/events/black_hole.dm index a8b0071f657..1ff7a338c9e 100644 --- a/code/game/gamemodes/events/black_hole.dm +++ b/code/game/gamemodes/events/black_hole.dm @@ -24,7 +24,8 @@ qdel(M) for(var/obj/O in orange(1,src)) qdel(O) - var/base_turf = get_base_turf_by_area(src) + var/turf/T = loc + var/base_turf = T.baseturf for(var/turf/simulated/ST in orange(1,src)) if(ST.type == base_turf) continue diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 4c4cee7b915..dff97b271d6 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -279,13 +279,14 @@ playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) else if (istype(target, /turf/simulated/floor)) - occupant_message("Deconstructing [target]...") + var/turf/T = target + occupant_message("Deconstructing [T]...") set_ready_state(0) - if(do_after_cooldown(target)) + if(do_after_cooldown(T)) if(disabled) return chassis.spark_system.queue() - target:ChangeTurf(get_base_turf_by_area(target)) - playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) + T.ChangeTurf(T.baseturf) + playsound(T, 'sound/items/Deconstruct.ogg', 50, 1) chassis.use_power(energy_drain) else if (istype(target, /obj/machinery/door/airlock)) occupant_message("Deconstructing [target]...") diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index c0773fdd389..5022dbdf1d1 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -98,7 +98,7 @@ build_delay = 50 build_type = "airlock" build_other = /obj/machinery/door/airlock - else if(!deconstruct && (istype(T,/turf/space) || istype(T,get_base_turf_by_area(T)))) + else if(!deconstruct && (istype(T,/turf/space) || istype(T,T.baseturf))) build_cost = 1 build_type = "floor" build_turf = /turf/simulated/floor/airless @@ -112,7 +112,7 @@ build_delay = deconstruct ? 50 : 20 build_cost = deconstruct ? 10 : 3 build_type = deconstruct ? "floor" : "wall" - build_turf = deconstruct ? get_base_turf(T.z) : /turf/simulated/wall + build_turf = deconstruct ? T.baseturf : /turf/simulated/wall else return 0 diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index e076430fd90..07142289dfa 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -202,7 +202,10 @@ footstep_sound = "gravelstep" /turf/simulated/floor/plating/snow footstep_sound = "gravelstep" + /turf/simulated/floor/airless/ceiling + icon_state = "asteroidplating" + baseturf = /turf/space /turf/simulated/floor/beach name = "beach" diff --git a/code/game/turfs/simulated/floor_acts.dm b/code/game/turfs/simulated/floor_acts.dm index ee42c625fe5..a1b9785616d 100644 --- a/code/game/turfs/simulated/floor_acts.dm +++ b/code/game/turfs/simulated/floor_acts.dm @@ -2,14 +2,14 @@ //set src in oview(1) switch(severity) if(1.0) - src.ChangeTurf(get_base_turf_by_area(src)) + src.ChangeTurf(baseturf) if(2.0) switch(pick(40;1,40;2,3)) if (1) if(prob(33)) new /obj/item/stack/material/steel(src) src.ReplaceWithLattice() if(2) - src.ChangeTurf(get_base_turf_by_area(src)) + src.ChangeTurf(baseturf) if(3) if(prob(33)) new /obj/item/stack/material/steel(src) if(prob(80)) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 159865778a8..e8b3fb10e34 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -160,7 +160,7 @@ /turf/simulated/wall/proc/dismantle_wall(var/devastated, var/explode, var/no_product, var/no_change = FALSE) if (!no_change) // No change is TRUE when this is called by destroy. playsound(src, 'sound/items/Welder.ogg', 100, 1) - + if(!no_product) if(reinf_material) reinf_material.place_dismantled_girder(src, reinf_material) @@ -186,7 +186,7 @@ /turf/simulated/wall/ex_act(severity) switch(severity) if(1.0) - src.ChangeTurf(get_base_turf(src.z)) + src.ChangeTurf(baseturf) return if(2.0) if(prob(75)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b0a5ae9d411..95d1ae7dff2 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -27,7 +27,7 @@ var/list/decals var/is_hole // If true, turf will be treated as space or a hole - var/turf/baseturf = /turf/space + var/tmp/turf/baseturf var/roof_type = null // The turf type we spawn as a roof. var/tmp/roof_flags = 0 @@ -58,6 +58,9 @@ if (opacity) has_opaque_atom = TRUE + if(!baseturf) + baseturf = get_base_turf_by_area(src) + spawn_roof() return INITIALIZE_HINT_NORMAL diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 438400ed516..27fbcf8956e 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -2,7 +2,7 @@ var/tmp/changing_turf /turf/proc/ReplaceWithLattice() - src.ChangeTurf(get_base_turf_by_area(src)) + src.ChangeTurf(baseturf) spawn() new /obj/structure/lattice( locate(src.x, src.y, src.z) ) @@ -61,7 +61,8 @@ SSair.mark_for_update(src) //handle the addition of the new turf. - W.baseturf = old_baseturf + if(!W.baseturf) + W.baseturf = old_baseturf W.post_change()