mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-19 14:51:27 +00:00
* Removes comparisons to true and false * Update .github/CONTRIBUTING.md Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --------- Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
132 lines
4.6 KiB
Plaintext
132 lines
4.6 KiB
Plaintext
|
|
/atom
|
|
var/light_power = 1 // Intensity of the light.
|
|
var/light_range = 0 // Range in tiles of the light.
|
|
var/light_color // Hexadecimal RGB string representing the colour of the light.
|
|
|
|
var/tmp/datum/light_source/light // Our light source. Don't fuck with this directly unless you have a good reason!
|
|
var/tmp/list/light_sources // Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list.
|
|
|
|
// 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)
|
|
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(l_power != null)
|
|
light_power = l_power
|
|
|
|
if(l_range != null)
|
|
light_range = l_range
|
|
|
|
if(l_color != NONSENSICAL_VALUE)
|
|
light_color = l_color
|
|
|
|
SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color)
|
|
|
|
update_light()
|
|
|
|
#undef NONSENSICAL_VALUE
|
|
|
|
/atom/proc/remove_light()
|
|
light_power = 0
|
|
light_range = 0
|
|
light_color = 0
|
|
update_light()
|
|
|
|
// 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_power || !light_range) // 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, .)
|
|
|
|
/atom/proc/extinguish_light(force = FALSE)
|
|
return
|
|
|
|
// If we have opacity, make sure to tell (potentially) affected light sources.
|
|
/atom/movable/Destroy()
|
|
var/turf/T = loc
|
|
. = ..()
|
|
if(opacity && istype(T))
|
|
var/old_has_opaque_atom = T.has_opaque_atom
|
|
T.recalc_atom_opacity()
|
|
if(old_has_opaque_atom != T.has_opaque_atom)
|
|
T.reconsider_lights()
|
|
|
|
// Should always be used to change the opacity of an atom.
|
|
// It notifies (potentially) affected light sources so they can update (if needed).
|
|
/atom/proc/set_opacity(new_opacity)
|
|
if(new_opacity == opacity)
|
|
return
|
|
|
|
opacity = new_opacity
|
|
var/turf/T = loc
|
|
if(!isturf(T))
|
|
return
|
|
|
|
if(new_opacity)
|
|
T.has_opaque_atom = TRUE
|
|
T.reconsider_lights()
|
|
else
|
|
var/old_has_opaque_atom = T.has_opaque_atom
|
|
T.recalc_atom_opacity()
|
|
if(old_has_opaque_atom != T.has_opaque_atom)
|
|
T.reconsider_lights()
|
|
|
|
/atom/vv_edit_var(var_name, var_value)
|
|
switch(var_name)
|
|
if("light_range")
|
|
set_light(l_range=var_value)
|
|
return TRUE
|
|
|
|
if("light_power")
|
|
set_light(l_power=var_value)
|
|
return TRUE
|
|
|
|
if("light_color")
|
|
set_light(l_color=var_value)
|
|
return TRUE
|
|
|
|
return ..()
|
|
|
|
|
|
/atom/proc/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE)
|
|
return
|
|
|
|
/turf/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE)
|
|
if(!_duration)
|
|
stack_trace("Lighting FX obj created on a turf without a duration")
|
|
new /obj/effect/dummy/lighting_obj (src, _color, _range, _power, _duration)
|
|
|
|
/obj/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE)
|
|
var/temp_color
|
|
var/temp_power
|
|
var/temp_range
|
|
if(!_reset_lighting) //incase the obj already has a lighting color that you don't want cleared out after, ie computer monitors.
|
|
temp_color = light_color
|
|
temp_power = light_power
|
|
temp_range = light_range
|
|
set_light(_range, _power, _color)
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, set_light), _reset_lighting ? initial(light_range) : temp_range, _reset_lighting ? initial(light_power) : temp_power, _reset_lighting ? initial(light_color) : temp_color), _duration, TIMER_OVERRIDE|TIMER_UNIQUE)
|
|
|
|
/mob/living/flash_lighting_fx(_range = FLASH_LIGHT_RANGE, _power = FLASH_LIGHT_POWER, _color = LIGHT_COLOR_WHITE, _duration = FLASH_LIGHT_DURATION, _reset_lighting = TRUE)
|
|
mob_light(_color, _range, _power, _duration)
|
|
|
|
/mob/living/proc/mob_light(_color, _range, _power, _duration)
|
|
var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _color, _range, _power, _duration)
|
|
return mob_light_obj
|