mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 12:01:47 +00:00
credit to zewaka for the idea of using underlays turns the lighting object movables that were unnecessary and increased maptick into a datum which then applies and removes an underlay in update(). also applies a lot of general lighting clean ups (mostly using as anything in loops and fixing single letter var names). multiz is a little different by necessity, now only the bottom turf's lighting matters in the brightness of the top turf unlike master where the bottom turf's lighting object is hidden from the vis_contents of the top turf. there are still some kinks to iron out here though, since currently objects suspended in openspace (like tram platforms) look bad and glass floors look bad too only thing i have left to do is make multiz work (well) UPDATE: multiz now appears the same as far as i can tell, its possible there are other situations in which its different but datum mats work and it automatically updates if the turf below changes. now i just need to make the system less finnicky if at all possible (and possibly merge managed_turf_vis_content with managed_overlays maybe?) new update: its basically equivalent to normal multiz as far as i can tell (visually at least, in the circumstances ive tested so far) NEW NEW UPDATE: turfs no longer have the VIS_HIDE vis_flag and multiz works without stacking the lighting from the floor below! so this shouldnt have any overt drawbacks to master anymore 1 needless movable per tile is terrible for maptick. this is probably a larger improvement than my emissive blocker change in terms of maptick. im guessing we'd get around 0.6 average maptick per player after this where currently we get 0.85 or so Edit: according to lemon, sybil reached 0.71 maptick per person when tm'd with this if this is a big enough improvement i might finally be able to get rid of the Gone discord avatar
163 lines
5.0 KiB
Plaintext
163 lines
5.0 KiB
Plaintext
|
|
// The proc you should always use to set the light of this atom.
|
|
// Nonesensical value for l_color default, so we can detect if it gets set to null.
|
|
#define NONSENSICAL_VALUE -99999
|
|
/atom/proc/set_light(l_range, l_power, l_color = NONSENSICAL_VALUE, l_on)
|
|
if(l_range > 0 && l_range < MINIMUM_USEFUL_LIGHT_RANGE)
|
|
l_range = MINIMUM_USEFUL_LIGHT_RANGE //Brings the range up to 1.4, which is just barely brighter than the soft lighting that surrounds players.
|
|
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color, l_on) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
|
|
if(!isnull(l_power))
|
|
set_light_power(l_power)
|
|
|
|
if(!isnull(l_range))
|
|
set_light_range(l_range)
|
|
|
|
if(l_color != NONSENSICAL_VALUE)
|
|
set_light_color(l_color)
|
|
|
|
if(!isnull(l_on))
|
|
set_light_on(l_on)
|
|
|
|
update_light()
|
|
|
|
#undef NONSENSICAL_VALUE
|
|
|
|
// Will update the light (duh).
|
|
// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf...
|
|
/atom/proc/update_light()
|
|
set waitfor = FALSE
|
|
if (QDELETED(src))
|
|
return
|
|
|
|
if(light_system != STATIC_LIGHT)
|
|
CRASH("update_light() for [src] with following light_system value: [light_system]")
|
|
|
|
if (!light_power || !light_range || !light_on) // We won't emit light anyways, destroy the light source.
|
|
QDEL_NULL(light)
|
|
else
|
|
if (!ismovable(loc)) // We choose what atom should be the top atom of the light here.
|
|
. = src
|
|
else
|
|
. = loc
|
|
|
|
if (light) // Update the light or create it if it does not exist.
|
|
light.update(.)
|
|
else
|
|
light = new/datum/light_source(src, .)
|
|
|
|
|
|
/**
|
|
* Updates the atom's opacity value.
|
|
*
|
|
* This exists to act as a hook for associated behavior.
|
|
* It notifies (potentially) affected light sources so they can update (if needed).
|
|
*/
|
|
/atom/proc/set_opacity(new_opacity)
|
|
if (new_opacity == opacity)
|
|
return
|
|
SEND_SIGNAL(src, COMSIG_ATOM_SET_OPACITY, new_opacity)
|
|
. = opacity
|
|
opacity = new_opacity
|
|
|
|
|
|
/atom/movable/set_opacity(new_opacity)
|
|
. = ..()
|
|
if(isnull(.) || !isturf(loc))
|
|
return
|
|
|
|
if(opacity)
|
|
AddElement(/datum/element/light_blocking)
|
|
else
|
|
RemoveElement(/datum/element/light_blocking)
|
|
|
|
|
|
/turf/set_opacity(new_opacity)
|
|
. = ..()
|
|
if(isnull(.))
|
|
return
|
|
recalculate_directional_opacity()
|
|
|
|
|
|
/atom/movable/Moved(atom/OldLoc, Dir)
|
|
. = ..()
|
|
for (var/datum/light_source/light as anything in light_sources) // Cycle through the light sources on this atom and tell them to update.
|
|
light.source_atom.update_light()
|
|
|
|
|
|
/atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION)
|
|
return
|
|
|
|
|
|
/turf/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION)
|
|
if(!_duration)
|
|
stack_trace("Lighting FX obj created on a turf without a duration")
|
|
new /obj/effect/dummy/lighting_obj (src, _range, _power, _color, _duration)
|
|
|
|
|
|
/obj/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION)
|
|
if(!_duration)
|
|
stack_trace("Lighting FX obj created on a obj without a duration")
|
|
new /obj/effect/dummy/lighting_obj (get_turf(src), _range, _power, _color, _duration)
|
|
|
|
|
|
/mob/living/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = COLOR_WHITE, _duration = FLASH_LIGHT_DURATION)
|
|
mob_light(_range, _power, _color, _duration)
|
|
|
|
|
|
/mob/living/proc/mob_light(_range, _power, _color, _duration)
|
|
var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _range, _power, _color, _duration)
|
|
return mob_light_obj
|
|
|
|
/// Setter for the light power of this atom.
|
|
/atom/proc/set_light_power(new_power)
|
|
if(new_power == light_power)
|
|
return
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_POWER, new_power) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
. = light_power
|
|
light_power = new_power
|
|
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_POWER, .)
|
|
|
|
/// Setter for the light range of this atom.
|
|
/atom/proc/set_light_range(new_range)
|
|
if(new_range == light_range)
|
|
return
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_RANGE, new_range) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
. = light_range
|
|
light_range = new_range
|
|
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .)
|
|
|
|
/// Setter for the light color of this atom.
|
|
/atom/proc/set_light_color(new_color)
|
|
if(new_color == light_color)
|
|
return
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_COLOR, new_color) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
. = light_color
|
|
light_color = new_color
|
|
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .)
|
|
|
|
/// Setter for whether or not this atom's light is on.
|
|
/atom/proc/set_light_on(new_value)
|
|
if(new_value == light_on)
|
|
return
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ON, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
. = light_on
|
|
light_on = new_value
|
|
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_ON, .)
|
|
|
|
/// Setter for the light flags of this atom.
|
|
/atom/proc/set_light_flags(new_value)
|
|
if(new_value == light_flags)
|
|
return
|
|
if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_FLAGS, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE)
|
|
return
|
|
. = light_flags
|
|
light_flags = new_value
|
|
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .)
|