diff --git a/code/controllers/subsystems/openturf.dm b/code/controllers/subsystems/openturf.dm index b12ce150868..886bac773ad 100644 --- a/code/controllers/subsystems/openturf.dm +++ b/code/controllers/subsystems/openturf.dm @@ -1,6 +1,8 @@ #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.25 // The multiplication factor for openturf shadower darkness. Lighting will be multiplied by this. +#define SHADOWER_LAYER 0 /var/datum/controller/subsystem/openturf/SSopenturf @@ -29,12 +31,16 @@ var/turf/simulated/open/T = get_turf(AM) if (istype(T)) - T.update() + T.update_icon() else qdel(AM) CHECK_TICK + for (var/thing in openspace_turfs) + var/turf/simulated/open/T = thing + T.update_icon() + enable() /datum/controller/subsystem/openturf/proc/hard_reset() @@ -119,23 +125,48 @@ var/atom/movable/object = thing if (QDELETED(object) || object.no_z_overlay) // Don't queue deleted stuff or stuff that doesn't need an overlay. - if (no_mc_tick) - CHECK_TICK - else if (MC_TICK_CHECK) - break continue - // Cache our already-calculated depth so we don't need to re-calculate it a bunch of times. + if (istype(object, /atom/movable/lighting_overlay)) // Special case. + var/atom/movable/openspace/multiplier/shadower = T.shadower + // This is duplicated in lighting_overlay.dm for performance reasons. + shadower.appearance = object + shadower.plane = OPENTURF_CAP_PLANE + shadower.layer = SHADOWER_LAYER + shadower.invisibility = 0 + if (shadower.icon_state == LIGHTING_BASE_ICON_STATE) + // We're using a color matrix, so just darken the colors. + var/list/c_list = shadower.color + c_list[CL_MATRIX_RR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_RG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_RB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AB] *= SHADOWER_DARKENING_FACTOR + shadower.color = c_list + else + shadower.color = list( + SHADOWER_DARKENING_FACTOR, 0, 0, + 0, SHADOWER_DARKENING_FACTOR, 0, + 0, 0, SHADOWER_DARKENING_FACTOR + ) + else + if (!object.bound_overlay) // Generate a new overlay if the atom doesn't already have one. + object.bound_overlay = new(T) + object.bound_overlay.associated_atom = object - if (!object.bound_overlay) // Generate a new overlay if the atom doesn't already have one. - object.bound_overlay = new(T) - object.bound_overlay.associated_atom = object + var/atom/movable/openspace/overlay/OO = object.bound_overlay - var/atom/movable/openspace/overlay/OO = object.bound_overlay + // Cache our already-calculated depth so we don't need to re-calculate it a bunch of times. + OO.depth = depth - OO.depth = depth - - queued_overlays += OO + queued_overlays += OO T.updating = FALSE @@ -178,8 +209,9 @@ OO.plane = OPENTURF_MAX_PLANE - OO.depth OO.opacity = FALSE OO.queued = FALSE - if (istype(OO.associated_atom, /atom/movable/openspace/multiplier)) // Special case for multipliers. - OO.layer = 1e6 + + if (istype(OO.associated_atom, /atom/movable/openspace/multiplier) && OO.plane < OPENTURF_MAX_PLANE) // Special case for multipliers. + OO.plane++ if (OO.bound_overlay) // If we have a bound overlay, queue it too. OO.update_above() diff --git a/code/controllers/subsystems/sunlight.dm b/code/controllers/subsystems/sunlight.dm index be49e45cf13..4e833639387 100644 --- a/code/controllers/subsystems/sunlight.dm +++ b/code/controllers/subsystems/sunlight.dm @@ -75,6 +75,9 @@ light_range = Ceiling(config.sun_accuracy * 1.2) return ..() +/atom/movable/sunobj/can_fall() + . = FALSE + /datum/sun_state var/color = "#FFFFFF" var/name = "INVALID" diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 7287da841c4..e0a9fb6b4d5 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -45,9 +45,6 @@ #define ALL_EQUAL ((rr == gr && gr == br && br == ar) && (rg == gg && gg == bg && bg == ag) && (rb == gb && gb == bb && bb == ab)) /atom/movable/lighting_overlay/proc/update_overlay() - if (QDELING(src)) // This shouldn't happen. - return - var/turf/T = loc if (!istype(T)) // Erm... if (loc) @@ -103,13 +100,29 @@ color = null else icon_state = LIGHTING_BASE_ICON_STATE - color = list( - rr, rg, rb, 0, - gr, gg, gb, 0, - br, bg, bb, 0, - ar, ag, ab, 0, - 0, 0, 0, 1 - ) + if (islist(color)) + var/list/c_list = color + c_list[CL_MATRIX_RR] = rr + c_list[CL_MATRIX_RG] = rg + c_list[CL_MATRIX_RB] = rb + c_list[CL_MATRIX_GR] = gr + c_list[CL_MATRIX_GG] = gg + c_list[CL_MATRIX_GB] = gb + c_list[CL_MATRIX_BR] = br + c_list[CL_MATRIX_BG] = bg + c_list[CL_MATRIX_BB] = bb + c_list[CL_MATRIX_AR] = ar + c_list[CL_MATRIX_AG] = ag + c_list[CL_MATRIX_AB] = ab + color = c_list + else + color = list( + rr, rg, rb, 0, + gr, gg, gb, 0, + br, bg, bb, 0, + ar, ag, ab, 0, + 0, 0, 0, 1 + ) #else color = list( cr.cache_r, cr.cache_g, cr.cache_b, 0, @@ -120,8 +133,44 @@ ) #endif - if (bound_overlay) - update_above() + // If we're on an openturf, update the shadower object too. + // We could queue an icon update for the entire OT, but this involves less overhead. + var/turf/simulated/open/OT = loc:above + if (OT) + var/atom/movable/openspace/multiplier/shadower = OT.shadower + if (!shadower) // The OT hasn't been initialized yet. + OT.update_icon() + return + + shadower.appearance = src + shadower.plane = OPENTURF_CAP_PLANE + shadower.layer = SHADOWER_LAYER + shadower.invisibility = 0 + if (shadower.icon_state == LIGHTING_BASE_ICON_STATE) + // We're using a color matrix, so just darken the colors. + var/list/c_list = shadower.color + c_list[CL_MATRIX_RR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_RG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_RB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_GB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_BB] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AR] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AG] *= SHADOWER_DARKENING_FACTOR + c_list[CL_MATRIX_AB] *= SHADOWER_DARKENING_FACTOR + shadower.color = c_list + else + shadower.color = list( + SHADOWER_DARKENING_FACTOR, 0, 0, + 0, SHADOWER_DARKENING_FACTOR, 0, + 0, 0, SHADOWER_DARKENING_FACTOR + ) + + if (shadower.bound_overlay) + shadower.update_above() #undef ALL_EQUAL diff --git a/code/modules/multiz/openspace.dm b/code/modules/multiz/openspace.dm index ce687d8d91f..e129edbf36d 100644 --- a/code/modules/multiz/openspace.dm +++ b/code/modules/multiz/openspace.dm @@ -90,14 +90,15 @@ /atom/movable/openspace/multiplier name = "openspace multiplier" desc = "You shouldn't see this." - icon = 'icons/misc/openspace.dmi' - icon_state = "white" + icon = 'icons/effects/lighting_overlay.dmi' + icon_state = "blank" plane = OPENTURF_CAP_PLANE + layer = SHADOWER_LAYER blend_mode = BLEND_MULTIPLY color = list( - 0.75, 0, 0, - 0, 0.75, 0, - 0, 0, 0.75 + SHADOWER_DARKENING_FACTOR, 0, 0, + 0, SHADOWER_DARKENING_FACTOR, 0, + 0, 0, SHADOWER_DARKENING_FACTOR ) /atom/movable/openspace/multiplier/Destroy() diff --git a/icons/misc/openspace.dmi b/icons/misc/openspace.dmi deleted file mode 100644 index 50a549c5ee9..00000000000 Binary files a/icons/misc/openspace.dmi and /dev/null differ