Files
CHOMPStation2/code/modules/lighting/planet_sunlight_ch.dm
2024-04-23 08:13:25 +02:00

129 lines
3.9 KiB
Plaintext

/datum/planet_sunlight_handler
var/redint = 0
var/greenint = 0
var/blueint = 0
var/red = 0.0
var/green = 0.0
var/blue = 0.0
var/redshadeint = 0
var/greenshadeint = 0
var/blueshadeint = 0
var/redshade = 0.0
var/greenshade = 0.0
var/blueshade = 0.0
var/cache_r = 0.0
var/cache_g = 0.0
var/cache_b = 0.0
var/cache_r_shade = 0.0
var/cache_g_shade = 0.0
var/cache_b_shade = 0.0
var/maxlum = 0.0
var/maxlumshade = 0.0
var/datum/simple_sun/sun
var/atom/movable/sun_vis_simple/vis_overhead
var/atom/movable/sun_vis_simple/vis_shade
var/list/shandlers = list()
/datum/planet_sunlight_handler/New(var/planet)
. = ..()
var/datum/planet/P = planet
var/datum/simple_sun/S = planet
if(istype(P))
sun = new /datum/simple_sun/planetary(P)
if(istype(S))
sun = S
vis_overhead = new(null)
vis_shade = new(null)
/datum/planet_sunlight_handler/proc/update_sun()
sun.update()
var/brightness = sun.brightness * SSlighting.sun_mult
var/list/color = hex2rgb(sun.color)
red = brightness * (color[1] / 255.0)
green = brightness * (color[2] / 255.0)
blue = brightness * (color[3] / 255.0)
redshade = 0.6 * red
greenshade = 0.6 * green
blueshade = 0.6 * blue
redint = round(red * 255)
greenint = round(green * 255)
blueint = round(blue * 255)
redshadeint = round(redshade * 255)
greenshadeint = round(greenshade * 255)
blueshadeint = round(blueshade * 255)
vis_overhead.color = rgb(redint,greenint,blueint)
vis_shade.color = rgb(redshadeint,greenshadeint,blueshadeint)
var/largest_color_luminosity = max(red, green, blue) // Scale it so one of them is the strongest lum, if it is above 1.
maxlum = largest_color_luminosity
. = 1 // factor
if (largest_color_luminosity > 1)
. = 1 / largest_color_luminosity
#if LIGHTING_SOFT_THRESHOLD != 0
else if (largest_color_luminosity < LIGHTING_SOFT_THRESHOLD)
. = 0 // 0 means soft lighting.
cache_r = round(red * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
cache_g = round(green * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
cache_b = round(blue * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
#else
cache_r = round(red * ., LIGHTING_ROUND_VALUE)
cache_g = round(green * ., LIGHTING_ROUND_VALUE)
cache_b = round(blue * ., LIGHTING_ROUND_VALUE)
#endif
largest_color_luminosity = max(redshade, greenshade, blueshade) // Scale it so one of them is the strongest lum, if it is above 1.
maxlumshade = largest_color_luminosity
. = 1 // factor
if (largest_color_luminosity > 1)
. = 1 / largest_color_luminosity
#if LIGHTING_SOFT_THRESHOLD != 0
else if (largest_color_luminosity < LIGHTING_SOFT_THRESHOLD)
. = 0 // 0 means soft lighting.
cache_r_shade = round(redshade * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
cache_g_shade = round(greenshade * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
cache_b_shade = round(blueshade * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD
#else
cache_r_shade = round(redshade * ., LIGHTING_ROUND_VALUE)
cache_g_shade = round(greenshade * ., LIGHTING_ROUND_VALUE)
cache_b_shade = round(blueshade * ., LIGHTING_ROUND_VALUE)
#endif
//Visuals we use to remove need to update overlays for tiles that have nothing but sunlight
/atom/movable/sun_vis_simple
icon = 'icons/effects/effects.dmi'
icon_state = "white"
plane = PLANE_LIGHTING
mouse_opacity = 0
alpha = 255
color = "#FFFFFF"
//A simplified datum for controlling the sun color/brightness
//This allows for the sunlight system to be used outside of only planets
/datum/simple_sun
var/brightness = 1.0
var/color = "#FFFFFF"
//Called from planet_sunlight_handler.update_sun()
//Should update brightness and color values
/datum/simple_sun/proc/update()
return //Do nothing. This is meant to be overridden.
/datum/simple_sun/planetary
var/datum/sun_holder/sun
/datum/simple_sun/planetary/New(var/datum/planet/planet)
sun = planet.sun_holder
/datum/simple_sun/planetary/update()
. = ..()
brightness = sun.our_brightness
color = sun.our_color