mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-24 09:02:27 +00:00
Z-Lights Mk 2 (#4383)
changes: Bidirectional source Z-lights have been reverted to single-direction in favor of corner z-bleed. Z-mimic turfs will now average their light level with their mimiced turf to better approximate Z-lighting. Openspaces have been made significantly less dark. Corners no longer incorrectly always take the instant update pathway. MultiZ helpers are now macros. More things now properly respect area dynamic lighting settings.
This commit is contained in:
@@ -3,13 +3,16 @@
|
||||
#define PLANE_SPACE_DUST (PLANE_SPACE_PARALLAX + 1) // -96
|
||||
#define PLANE_ABOVE_PARALLAX (PLANE_SPACE_BACKGROUND + 3) // -95
|
||||
|
||||
// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc.
|
||||
|
||||
#define LOWER_ON_TURF_LAYER (TURF_LAYER + 0.05) // under the below
|
||||
#define ON_TURF_LAYER (TURF_LAYER + 0.1) // sitting on the turf - should be preferred over direct use of TURF_LAYER
|
||||
#define AO_LAYER (ON_TURF_LAYER + 0.1)
|
||||
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||
#define UNDERDOOR 3.09 //Just barely under a closed door.
|
||||
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
|
||||
#define BELOW_MOB_LAYER 3.7
|
||||
#define ABOVE_MOB_LAYER 4.1
|
||||
#define LIGHTING_LAYER 11
|
||||
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
|
||||
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
|
||||
#define SCREEN_LAYER 22 //Mob HUD/effects layer
|
||||
|
||||
@@ -16,6 +16,13 @@
|
||||
// If defined, instant updates will be used whenever server load permits. Otherwise queued updates are always used.
|
||||
#define USE_INTELLIGENT_LIGHTING_UPDATES
|
||||
|
||||
// If defined, lighting corners will 'bleed' luminosity to corners above them to simulate cross-Z lighting upwards. Downwards Z-lighting will continue to work with this disabled.
|
||||
#define USE_CORNER_ZBLEED
|
||||
|
||||
#define TURF_IS_DYNAMICALLY_LIT(T) (isturf(T) && T:dynamic_lighting && T:loc:dynamic_lighting)
|
||||
// mostly identical to above, but doesn't make sure T is valid first. Should only be used by lighting code.
|
||||
#define TURF_IS_DYNAMICALLY_LIT_UNSAFE(T) (T:dynamic_lighting && T:loc:dynamic_lighting)
|
||||
|
||||
// If I were you I'd leave this alone.
|
||||
#define LIGHTING_BASE_MATRIX \
|
||||
list \
|
||||
|
||||
@@ -456,3 +456,13 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
|
||||
#define MAX_SOUND_Z_TRAVERSAL 2
|
||||
|
||||
#define Z_ALL_TURFS(Z) block(locate(1, 1, Z), locate(world.maxx, world.maxy, Z))
|
||||
|
||||
|
||||
// Z-controller stuff - see basic.dm to see why the fuck this is the way it is.
|
||||
#define IS_VALID_ZINDEX(z) !((z) > world.maxz || z > 17 || z < 2)
|
||||
|
||||
#define HAS_ABOVE(z) (IS_VALID_ZINDEX(z) && z_levels & (1 << (z - 1)))
|
||||
#define HAS_BELOW(z) (IS_VALID_ZINDEX(z) && z_levels & (1 << (z - 2)))
|
||||
|
||||
#define GET_ABOVE(A) (HAS_ABOVE(A:z) ? get_step(A, UP) : null)
|
||||
#define GET_BELOW(A) (HAS_BELOW(A:z) ? get_step(A, DOWN) : null)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#define OPENTURF_MAX_PLANE -71
|
||||
#define OPENTURF_CAP_PLANE -70 // The multiplier goes here so it'll be on top of every other overlay.
|
||||
#define OPENTURF_MAX_DEPTH 10 // The maxiumum number of planes deep we'll go before we just dump everything on the same plane.
|
||||
#define SHADOWER_DARKENING_FACTOR 0.4 // The multiplication factor for openturf shadower darkness. Lighting will be multiplied by this.
|
||||
#define SHADOWER_DARKENING_FACTOR 0.85 // The multiplication factor for openturf shadower darkness. Lighting will be multiplied by this.
|
||||
|
||||
/var/datum/controller/subsystem/zcopy/SSzcopy
|
||||
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
to_chat(src, "<span class='warning'>Your powers are not capable of taking you that far.</span>")
|
||||
return
|
||||
|
||||
if (!T.dynamic_lighting || T.get_lumcount() > 0.1)
|
||||
if (T.get_lumcount() > 0.1)
|
||||
// Too bright, cannot jump into.
|
||||
to_chat(src, "<span class='warning'>The destination is too bright.</span>")
|
||||
return
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map")
|
||||
floor_markings.dir = src.dir
|
||||
floor_markings.layer = ON_TURF_LAYER
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/station_map/attack_hand(var/mob/user)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#ifdef AO_USE_LIGHTING_OPACITY
|
||||
#define AO_TURF_CHECK(T) (!T.has_opaque_atom || !T.permit_ao)
|
||||
#define AO_SELF_CHECK(T) (!T.has_opaque_atom)
|
||||
#else
|
||||
#define AO_TURF_CHECK(T) (!T.density || !T.opacity || !T.permit_ao)
|
||||
#define AO_SELF_CHECK(T) (!T.density && !T.opacity)
|
||||
#endif
|
||||
|
||||
/turf
|
||||
@@ -29,7 +31,7 @@
|
||||
var/turf/T
|
||||
if (flags & MIMIC_BELOW)
|
||||
CALCULATE_NEIGHBORS(src, ao_neighbors_mimic, T, (T.flags & MIMIC_BELOW))
|
||||
if (!has_opaque_atom && !(flags & MIMIC_NO_AO))
|
||||
if (AO_SELF_CHECK(src) && !(flags & MIMIC_NO_AO))
|
||||
CALCULATE_NEIGHBORS(src, ao_neighbors, T, AO_TURF_CHECK(T))
|
||||
|
||||
/proc/make_ao_image(corner, i, px = 0, py = 0, pz = 0, pw = 0)
|
||||
@@ -41,6 +43,7 @@
|
||||
I.alpha = WALL_AO_ALPHA
|
||||
I.blend_mode = BLEND_OVERLAY
|
||||
I.appearance_flags = RESET_ALPHA|RESET_COLOR|TILE_BOUND
|
||||
I.layer = AO_LAYER
|
||||
// If there's an offset, counteract it.
|
||||
if (px || py || pz || pw)
|
||||
I.pixel_x = -px
|
||||
@@ -109,3 +112,5 @@
|
||||
|
||||
#undef REGEN_AO
|
||||
#undef PROCESS_AO_CORNER
|
||||
#undef AO_TURF_CHECK
|
||||
#undef AO_SELF_CHECK
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
|
||||
// Handle light requirements.
|
||||
if(!light_supplied)
|
||||
if (current_turf.dynamic_lighting)
|
||||
if (TURF_IS_DYNAMICALLY_LIT(current_turf))
|
||||
light_supplied = current_turf.get_lumcount(0, 3) * 10
|
||||
else
|
||||
light_supplied = 5
|
||||
|
||||
@@ -647,10 +647,11 @@
|
||||
light_string = "that the internal lights are set to [tray_light] lumens"
|
||||
else
|
||||
var/light_available
|
||||
if(T.dynamic_lighting)
|
||||
if(TURF_IS_DYNAMICALLY_LIT(T))
|
||||
light_available = T.get_lumcount(0, 3) * 10
|
||||
else
|
||||
light_available = 5
|
||||
|
||||
light_string = "a light level of [light_available] lumens"
|
||||
|
||||
usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K."
|
||||
|
||||
@@ -11,9 +11,13 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
|
||||
/datum/lighting_corner
|
||||
var/turf/t1 // These are in no particular order.
|
||||
var/t1i // Our index in this turf's corners list.
|
||||
var/turf/t2
|
||||
var/t2i
|
||||
var/turf/t3
|
||||
var/t3i
|
||||
var/turf/t4
|
||||
var/t4i
|
||||
|
||||
var/list/datum/light_source/affecting // Light sources affecting us.
|
||||
var/active = FALSE // TRUE if one of our masters has dynamic lighting.
|
||||
@@ -34,11 +38,12 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
var/cache_b = LIGHTING_SOFT_THRESHOLD
|
||||
var/cache_mx = 0
|
||||
|
||||
/datum/lighting_corner/New(var/turf/new_turf, var/diagonal)
|
||||
/datum/lighting_corner/New(turf/new_turf, diagonal)
|
||||
SSlighting.lighting_corners += src
|
||||
|
||||
t1 = new_turf
|
||||
z = new_turf.z
|
||||
t1i = REVERSE_LIGHTING_CORNER_DIAGONAL[diagonal]
|
||||
|
||||
var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction.
|
||||
var/horizontal = diagonal & ~vertical // Now that we know the horizontal one we can get the vertical one.
|
||||
@@ -60,6 +65,7 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
|
||||
t2 = T
|
||||
i = REVERSE_LIGHTING_CORNER_DIAGONAL[diagonal]
|
||||
t2i = i
|
||||
T.corners[i] = src
|
||||
|
||||
// Now the horizontal one.
|
||||
@@ -70,6 +76,7 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
|
||||
t3 = T
|
||||
i = REVERSE_LIGHTING_CORNER_DIAGONAL[((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH)] // Get the dir based on coordinates.
|
||||
t3i = i
|
||||
T.corners[i] = src
|
||||
|
||||
// And finally the vertical one.
|
||||
@@ -80,6 +87,7 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
|
||||
t4 = T
|
||||
i = REVERSE_LIGHTING_CORNER_DIAGONAL[((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH)] // Get the dir based on coordinates.
|
||||
t4i = i
|
||||
T.corners[i] = src
|
||||
|
||||
update_active()
|
||||
@@ -95,18 +103,21 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
#undef OVERLAY_PRESENT
|
||||
|
||||
// God that was a mess, now to do the rest of the corner code! Hooray!
|
||||
/datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b, var/delta_u, var/now = FALSE)
|
||||
/datum/lighting_corner/proc/update_lumcount(delta_r, delta_g, delta_b, delta_u, now = FALSE)
|
||||
if (!(delta_r + delta_g + delta_b)) // Don't check u since the overlay doesn't care about it.
|
||||
return
|
||||
|
||||
lum_r += delta_r
|
||||
lum_g += delta_g
|
||||
lum_b += delta_b
|
||||
lum_u += delta_u
|
||||
|
||||
if (needs_update || !(delta_r + delta_g + delta_b)) // Don't check u since the overlay doesn't care about it.
|
||||
// This needs to be down here instead of the above if so the lum values are properly updated.
|
||||
if (needs_update)
|
||||
return
|
||||
|
||||
if (!now)
|
||||
needs_update = TRUE
|
||||
update_overlays(FALSE)
|
||||
SSlighting.corner_queue += src
|
||||
else
|
||||
update_overlays(TRUE)
|
||||
@@ -122,9 +133,60 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
} \
|
||||
}
|
||||
|
||||
/datum/lighting_corner/proc/update_overlays(var/now = FALSE)
|
||||
|
||||
#define AVERAGE_BELOW_CORNER(Tt, Ti) \
|
||||
if (TURF_IS_MIMICING(Tt)) { \
|
||||
T = GET_BELOW(Tt); \
|
||||
if (T && T.corners && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) { \
|
||||
C = T.corners[Ti]; \
|
||||
if (C) { \
|
||||
divisor += 1; \
|
||||
lr += C.lum_r; \
|
||||
lg += C.lum_g; \
|
||||
lb += C.lum_b; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define UPDATE_ABOVE_CORNER(Tt, Ti) \
|
||||
if (Tt) { \
|
||||
T = GET_ABOVE(Tt); \
|
||||
if (TURF_IS_MIMICING(T) && TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) { \
|
||||
if (!T.corners) { \
|
||||
T.generate_missing_corners(); \
|
||||
} \
|
||||
C = T.corners[Ti]; \
|
||||
if (C && !C.needs_update) { \
|
||||
C.update_overlays(FALSE); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
/datum/lighting_corner/proc/update_overlays(now = FALSE)
|
||||
var/lr = lum_r
|
||||
var/lg = lum_g
|
||||
var/lb = lum_b
|
||||
|
||||
#ifdef USE_CORNER_ZBLEED
|
||||
|
||||
var/divisor = 1
|
||||
var/datum/lighting_corner/C
|
||||
var/turf/T
|
||||
|
||||
AVERAGE_BELOW_CORNER(t1, t1i)
|
||||
AVERAGE_BELOW_CORNER(t2, t2i)
|
||||
AVERAGE_BELOW_CORNER(t3, t3i)
|
||||
AVERAGE_BELOW_CORNER(t4, t4i)
|
||||
|
||||
if (divisor > 1)
|
||||
lr /= divisor
|
||||
lg /= divisor
|
||||
lb /= divisor
|
||||
|
||||
#endif
|
||||
|
||||
// Cache these values a head of time so 4 individual lighting overlays don't all calculate them individually.
|
||||
var/mx = max(lum_r, lum_g, lum_b) // Scale it so 1 is the strongest lum, if it is above 1.
|
||||
var/mx = max(lr, lg, lb) // Scale it so 1 is the strongest lum, if it is above 1.
|
||||
. = 1 // factor
|
||||
if (mx > 1)
|
||||
. = 1 / mx
|
||||
@@ -132,9 +194,13 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
else if (mx < LIGHTING_SOFT_THRESHOLD)
|
||||
. = 0 // 0 means soft lighting.
|
||||
|
||||
cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
if (.)
|
||||
cache_r = round(lr * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
cache_g = round(lg * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
cache_b = round(lb * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
|
||||
else
|
||||
cache_r = cache_g = cache_b = LIGHTING_SOFT_THRESHOLD
|
||||
|
||||
cache_mx = round(mx, LIGHTING_ROUND_VALUE)
|
||||
|
||||
UPDATE_MASTER(t1)
|
||||
@@ -142,7 +208,18 @@ var/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, 2, 1)
|
||||
UPDATE_MASTER(t3)
|
||||
UPDATE_MASTER(t4)
|
||||
|
||||
#ifdef USE_CORNER_ZBLEED
|
||||
|
||||
UPDATE_ABOVE_CORNER(t1, t1i)
|
||||
UPDATE_ABOVE_CORNER(t2, t2i)
|
||||
UPDATE_ABOVE_CORNER(t3, t3i)
|
||||
UPDATE_ABOVE_CORNER(t4, t4i)
|
||||
|
||||
#endif
|
||||
|
||||
#undef UPDATE_MASTER
|
||||
#undef AVERAGE_BELOW_CORNER
|
||||
#undef UPDATE_ABOVE_CORNER
|
||||
|
||||
/datum/lighting_corner/Destroy(force = FALSE)
|
||||
crash_with("Some fuck [force ? "force-" : ""]deleted a lighting corner.")
|
||||
|
||||
@@ -355,12 +355,7 @@
|
||||
var/test_x
|
||||
var/test_y
|
||||
|
||||
var/zlights_going_up = FALSE
|
||||
var/turf/originalT // This is needed to reset our search point for bidirectional Z-lights.
|
||||
|
||||
FOR_DVIEW(originalT, Ceiling(actual_range), source_turf, 0)
|
||||
T = originalT
|
||||
zlights_going_up = FALSE
|
||||
FOR_DVIEW(T, Ceiling(actual_range), source_turf, 0)
|
||||
check_t:
|
||||
|
||||
if (light_angle && !facing_opaque) // Directional lighting coordinate filter.
|
||||
@@ -371,7 +366,7 @@
|
||||
if ((PSEUDO_WEDGE(limit_a_x, limit_a_y, test_x, test_y) > 0) || (PSEUDO_WEDGE(test_x, test_y, limit_b_x, limit_b_y) > 0))
|
||||
continue
|
||||
|
||||
if (T.dynamic_lighting || T.light_sources)
|
||||
if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T) || T.light_sources)
|
||||
Tcorners = T.corners
|
||||
if (!T.lighting_corners_initialised)
|
||||
T.lighting_corners_initialised = TRUE
|
||||
@@ -396,19 +391,10 @@
|
||||
|
||||
// Note: above is defined on ALL turfs, but below is only defined on OPEN TURFS.
|
||||
|
||||
zlight_check:
|
||||
if (zlights_going_up) // If we're searching upwards, check above.
|
||||
if (istype(T.above)) // We escape the goto loop if this condition is false.
|
||||
T = T.above
|
||||
// Upwards lights are handled at the corner level, so only search down.
|
||||
if (T && (T.flags & MIMIC_BELOW) && T.below)
|
||||
T = T.below
|
||||
goto check_t
|
||||
else
|
||||
if (T && (T.flags & MIMIC_BELOW) && T.below) // Not searching upwards and we have a below turf.
|
||||
T = T.below // Consider the turf below us as well. (Z-lights)
|
||||
goto check_t
|
||||
else // Not searching upwards and we don't have a below turf.
|
||||
zlights_going_up = TRUE
|
||||
T = originalT
|
||||
goto zlight_check
|
||||
|
||||
END_FOR_DVIEW
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
check_t:
|
||||
|
||||
if (T.dynamic_lighting || T.light_sources)
|
||||
if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T) || T.light_sources)
|
||||
Tcorners = T.corners
|
||||
if (!T.lighting_corners_initialised)
|
||||
T.lighting_corners_initialised = TRUE
|
||||
|
||||
@@ -49,7 +49,7 @@ var/list/admin_verbs_lighting = list(
|
||||
|
||||
if (!check_rights(R_DEBUG|R_DEV)) return
|
||||
|
||||
if (!T.dynamic_lighting)
|
||||
if (TURF_IS_DYNAMICALLY_LIT(T))
|
||||
src << "That turf is not dynamically lit."
|
||||
return
|
||||
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
src << "<span class='warning'>Your powers are not capable of taking you that far.</span>"
|
||||
return
|
||||
|
||||
if (!T.dynamic_lighting || T.get_lumcount() > 0.1)
|
||||
if (T.get_lumcount() > 0.1)
|
||||
src << "<span class='warning'>The destination is too bright.</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -1287,7 +1287,7 @@
|
||||
//0.1% chance of playing a scary sound to someone who's in complete darkness
|
||||
if(isturf(loc) && rand(1,1000) == 1)
|
||||
var/turf/T = loc
|
||||
if(T.dynamic_lighting && T.get_lumcount() < 0.01) // give a little bit of tolerance for near-dark areas.
|
||||
if(T.get_lumcount() < 0.01) // give a little bit of tolerance for near-dark areas.
|
||||
playsound_local(src,pick(scarySounds),50, 1, -1)
|
||||
|
||||
/mob/living/carbon/human/proc/handle_changeling()
|
||||
|
||||
@@ -17,35 +17,25 @@ var/z_levels = 0 // Each bit represents a connection between adjacent levels. S
|
||||
SSatlas.height_markers -= src
|
||||
return ..()
|
||||
|
||||
// The storage of connections between adjacent levels means some bitwise magic is needed.
|
||||
// Legacy shims.
|
||||
/proc/HasAbove(var/z)
|
||||
if(z >= world.maxz || z > 16 || z < 1)
|
||||
return 0
|
||||
return z_levels & (1 << (z - 1))
|
||||
return HAS_ABOVE(z)
|
||||
|
||||
/proc/HasBelow(var/z)
|
||||
if(z > world.maxz || z > 17 || z < 2)
|
||||
return 0
|
||||
return z_levels & (1 << (z - 2))
|
||||
return HAS_BELOW(z)
|
||||
|
||||
// Thankfully, no bitwise magic is needed here.
|
||||
/proc/GetAbove(var/atom/atom)
|
||||
var/turf/turf = get_turf(atom)
|
||||
if(!turf)
|
||||
return null
|
||||
return HasAbove(turf.z) ? get_step(turf, UP) : null
|
||||
/proc/GetAbove(atom/A)
|
||||
return A ? GET_ABOVE(A) : null
|
||||
|
||||
/proc/GetBelow(var/atom/atom)
|
||||
var/turf/turf = get_turf(atom)
|
||||
if(!turf)
|
||||
return null
|
||||
return HasBelow(turf.z) ? get_step(turf, DOWN) : null
|
||||
/proc/GetBelow(atom/A)
|
||||
return A ? GET_BELOW(A) : null
|
||||
|
||||
/proc/GetConnectedZlevels(z)
|
||||
. = list(z)
|
||||
for(var/level = z, HasBelow(level), level--)
|
||||
for(var/level = z, HAS_BELOW(level), level--)
|
||||
. += level-1
|
||||
for(var/level = z, HasAbove(level), level++)
|
||||
for(var/level = z, HAS_ABOVE(level), level++)
|
||||
. += level+1
|
||||
|
||||
/proc/AreConnectedZLevels(var/zA, var/zB)
|
||||
@@ -68,9 +58,10 @@ var/z_levels = 0 // Each bit represents a connection between adjacent levels. S
|
||||
return new_entry[zB]
|
||||
|
||||
/proc/get_zstep(ref, dir)
|
||||
if(dir == UP)
|
||||
. = GetAbove(ref)
|
||||
else if (dir == DOWN)
|
||||
. = GetBelow(ref)
|
||||
switch (dir)
|
||||
if (UP)
|
||||
. = GET_ABOVE(ref)
|
||||
if (DOWN)
|
||||
. = GET_BELOW(ref)
|
||||
else
|
||||
. = get_step(ref, dir)
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define GET_BELOW_OR_NULL(atom, z) \
|
||||
(!(z > world.maxz || z > 17 || z < 2) && z_levels & (1 << (z - 2))) ? get_step(atom, DOWN) : null
|
||||
|
||||
/datum/random_map/automata/cave_system
|
||||
iterations = 5
|
||||
descriptor = "moon caves"
|
||||
@@ -131,7 +128,7 @@
|
||||
if(EMPTY_CHAR)
|
||||
new_path = mineral_rich
|
||||
if(FLOOR_CHAR)
|
||||
var/turf/below = GET_BELOW_OR_NULL(T, T.z)
|
||||
var/turf/below = GET_BELOW(T)
|
||||
if(below)
|
||||
var/area/below_area = below.loc // Let's just assume that the turf is not in nullspace.
|
||||
if(below_area.station_area)
|
||||
@@ -164,5 +161,3 @@
|
||||
target_turf_type = /turf/unsimulated/chasm_mask
|
||||
mineral_sparse = /turf/simulated/floor/asteroid/ash
|
||||
mineral_rich = /turf/simulated/floor/asteroid/ash
|
||||
|
||||
#undef GET_BELOW_OR_NULL
|
||||
|
||||
Reference in New Issue
Block a user