From ddd774890376f6d6402e5ac8844af3f47c3fc9a0 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sat, 6 Jan 2018 03:53:18 -0600 Subject: [PATCH] ChangeTurf tweaks (#4036) changes: Lighting's ChangeTurf() override has been merged into the base ChangeTurf() proc. Turfs can now set an alternate openturf type to be used instead of the default one when ChangeTurf(/turf/space) or ChangeToOpenturf() is used. Added ChangeToOpenturf() helper. Added a missing dig icon state to the rocky ash DMI. Fixed an issue where the above var was not properly carried over on ChangeTurf(). Fixed an issue where Z-mimicing turfs would not be notified of their below turf ChangeTurf()ing unless they were an openspace. --- code/game/turfs/space/space.dm | 3 +- code/game/turfs/turf.dm | 4 +- code/game/turfs/turf_changing.dm | 57 ++++++++++++++++++++----- code/modules/lighting/lighting_turf.dm | 38 ----------------- code/modules/mining/mine_turf_types.dm | 2 + code/modules/multiz/structures.dm | 2 +- icons/turf/smooth/rocky_ash.dmi | Bin 3004 -> 9772 bytes 7 files changed, 54 insertions(+), 52 deletions(-) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 3ebc54cc4a2..16dd8580a47 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -19,7 +19,8 @@ // Copypaste of parent for performance. /turf/space/Initialize() appearance = SSicon_cache.space_cache["[((x + y) ^ ~(x * y) + z) % 25]"] - update_starlight() + if (config.starlight) + update_starlight() if (initialized) crash_with("Warning: [src]([type]) initialized multiple times!") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 74fc80fb430..16c808b8a62 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -350,7 +350,7 @@ var/const/enterloopsanity = 100 if (!above || isopenturf(above)) return - above.ChangeTurf(/turf/simulated/open) + above.ChangeToOpenturf() /turf/proc/AdjacentTurfsRanged() var/static/list/allowed = typecacheof(list( @@ -388,4 +388,4 @@ var/const/enterloopsanity = 100 break if(add) L.Add(t) - return L \ No newline at end of file + return L diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 9d68b1503c6..afce2070743 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -1,10 +1,10 @@ /turf var/tmp/changing_turf + var/openspace_override_type // If defined, this type is spawned instead of openturfs. /turf/proc/ReplaceWithLattice() - src.ChangeTurf(baseturf) - spawn() - new /obj/structure/lattice( locate(src.x, src.y, src.z) ) + ChangeTurf(baseturf) + new /obj/structure/lattice(src) // Removes all signs of lattice on the pos of the turf -Donkieyo /turf/proc/RemoveLattice() @@ -15,12 +15,15 @@ // Called after turf replaces old one /turf/proc/post_change() levelupdate() - var/turf/simulated/open/T = GetAbove(src) - if(istype(T)) - T.update_icon() + if (above) + above.update_mimic() queue_smooth_neighbors(src) +// Helper to change this turf into an appropriate openturf type, generally you should use this instead of ChangeTurf(/turf/simulated/open). +/turf/proc/ChangeToOpenturf() + . = ChangeTurf(/turf/space) + //Creates a new turf. // N is the type of the turf. /turf/proc/ChangeTurf(N, tell_universe = TRUE, force_lighting_update = FALSE) @@ -31,12 +34,16 @@ // This makes sure that turfs are not changed to space when there's a multi-z turf below if(N == /turf/space && HasBelow(z)) - N = /turf/simulated/open + N = openspace_override_type || /turf/simulated/open/airless var/obj/fire/old_fire = fire var/old_baseturf = baseturf - -// log_debug("Replacing [src.type] with [N]") + var/old_above = above + var/old_opacity = opacity + var/old_dynamic_lighting = dynamic_lighting + var/list/old_affecting_lights = affecting_lights + var/old_lighting_overlay = lighting_overlay + var/list/old_corners = corners changing_turf = TRUE @@ -46,7 +53,37 @@ // So we call destroy. qdel(src) - var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) + var/turf/simulated/W = new N(src) + +#ifndef AO_USE_LIGHTING_OPACITY + // If we're using opacity-based AO, this is done in recalc_atom_opacity(). + if (permit_ao) + regenerate_ao() +#endif + + recalc_atom_opacity() + lighting_overlay = old_lighting_overlay + if (lighting_overlay && lighting_overlay.loc != src) + // This is a hack, but I can't figure out why the fuck they're not on the correct turf in the first place. + lighting_overlay.forceMove(src, harderforce = TRUE) + + affecting_lights = old_affecting_lights + corners = old_corners + + if ((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting) || force_lighting_update) + reconsider_lights() + + if (dynamic_lighting != old_dynamic_lighting) + if (dynamic_lighting) + lighting_build_overlay() + else + lighting_clear_overlay() + + if (config.starlight) + for (var/turf/space/S in RANGE_TURFS(1, src)) + S.update_starlight() + + W.above = old_above if(ispath(N, /turf/simulated)) if(old_fire) diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 1b0468b078f..c9881becaa5 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -195,41 +195,3 @@ continue corners[i] = new/datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i]) - -/turf/ChangeTurf(turf/N, tell_universe = TRUE, force_lighting_update = FALSE) - if (!SSlighting) - return ..() - - var/old_opacity = opacity - var/old_dynamic_lighting = dynamic_lighting - var/list/old_affecting_lights = affecting_lights - var/old_lighting_overlay = lighting_overlay - var/list/old_corners = corners - - . = ..() - -#ifndef AO_USE_LIGHTING_OPACITY - if (permit_ao) - regenerate_ao() -#endif - - recalc_atom_opacity() - lighting_overlay = old_lighting_overlay - if (lighting_overlay && lighting_overlay.loc != src) - // This is a hack, but I can't figure out why the fuck they're not on the correct turf in the first place. - lighting_overlay.forceMove(src, harderforce = TRUE) - - affecting_lights = old_affecting_lights - corners = old_corners - - if ((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting) || force_lighting_update) - reconsider_lights() - - if (dynamic_lighting != old_dynamic_lighting) - if (dynamic_lighting) - lighting_build_overlay() - else - lighting_clear_overlay() - - for (var/turf/space/S in RANGE_TURFS(1, src)) - S.update_starlight() diff --git a/code/modules/mining/mine_turf_types.dm b/code/modules/mining/mine_turf_types.dm index 864c76868b7..527cb1f98e0 100644 --- a/code/modules/mining/mine_turf_types.dm +++ b/code/modules/mining/mine_turf_types.dm @@ -12,6 +12,7 @@ /turf/simulated/lava, /turf/simulated/mineral ) + openspace_override_type = /turf/simulated/open/chasm/airless // Custom behavior here - we want smoothed turfs to show basalt underneath, not lava. /turf/simulated/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) @@ -34,6 +35,7 @@ light_color = LIGHT_COLOR_LAVA smooth = SMOOTH_FALSE canSmoothWith = null + openspace_override_type = /turf/simulated/open/chasm/airless footstep_sound = "concretestep" diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index d3d51ed32f2..68a5bca1057 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -175,7 +175,7 @@ warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") return qdel(src) if(!istype(above)) - above.ChangeTurf(/turf/simulated/open) + above.ChangeToOpenturf() /obj/structure/stairs/Uncross(atom/movable/A) if(A.dir == dir && A.loc == loc) diff --git a/icons/turf/smooth/rocky_ash.dmi b/icons/turf/smooth/rocky_ash.dmi index 2a57edfc53a404cb9986043ce3d1642f67aee273..3e2f72bc358cc6f4b1d49c0d60c116db72db80c8 100644 GIT binary patch literal 9772 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 aSBpyW+-BH05UcvBLj>#y@+