mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Setting lights on every single turf takes way too long. Instead of havingto create a light source for every single outdoor turf, we find the corners to light up and apply the sunlight to them directly. We also make sure to avoid having planet sunlight being 4x too strong, which would happen if we naively looped over all corners of all outdoor turfs. Note: This has the side effect of making the sun's light and color ACCURATELY reflected on turfs. Previous code doubled up on light and appeared brighter than it should.
107 lines
3.5 KiB
Plaintext
107 lines
3.5 KiB
Plaintext
var/datum/controller/process/planet/planet_controller = null
|
|
|
|
/datum/controller/process/planet
|
|
var/list/planets = list()
|
|
var/list/z_to_planet = list()
|
|
|
|
/datum/controller/process/planet/setup()
|
|
name = "planet controller"
|
|
planet_controller = src
|
|
schedule_interval = 1 MINUTE
|
|
|
|
var/list/planet_datums = typesof(/datum/planet) - /datum/planet
|
|
for(var/P in planet_datums)
|
|
var/datum/planet/NP = new P()
|
|
planets.Add(NP)
|
|
|
|
allocateTurfs()
|
|
|
|
/datum/controller/process/planet/proc/allocateTurfs()
|
|
for(var/turf/simulated/OT in outdoor_turfs)
|
|
for(var/datum/planet/P in planets)
|
|
if(OT.z in P.expected_z_levels)
|
|
P.planet_floors |= OT
|
|
break
|
|
outdoor_turfs.Cut() //Why were you in there INCORRECTLY?
|
|
|
|
for(var/turf/unsimulated/wall/planetary/PW in planetary_walls)
|
|
for(var/datum/planet/P in planets)
|
|
if(PW.type == P.planetary_wall_type)
|
|
P.planet_walls |= PW
|
|
break
|
|
planetary_walls.Cut()
|
|
|
|
/datum/controller/process/planet/proc/unallocateTurf(var/turf/T)
|
|
for(var/planet in planets)
|
|
var/datum/planet/P = planet
|
|
if(T.z in P.expected_z_levels)
|
|
P.planet_floors -= T
|
|
|
|
/datum/controller/process/planet/doWork()
|
|
if(outdoor_turfs.len || planetary_walls.len)
|
|
allocateTurfs()
|
|
|
|
for(var/datum/planet/P in planets)
|
|
P.process(schedule_interval / 10)
|
|
SCHECK //Your process() really shouldn't take this long...
|
|
//Weather style needs redrawing
|
|
if(P.needs_work & PLANET_PROCESS_WEATHER)
|
|
P.needs_work &= ~PLANET_PROCESS_WEATHER
|
|
var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state)
|
|
new_overlay.plane = PLANE_PLANETLIGHTING
|
|
//Redraw weather icons
|
|
for(var/T in P.planet_floors)
|
|
var/turf/simulated/turf = T
|
|
// turf.overlays -= turf.weather_overlay
|
|
turf.weather_overlay = new_overlay
|
|
// turf.overlays += turf.weather_overlay
|
|
turf.update_icon()
|
|
SCHECK
|
|
|
|
//Sun light needs changing
|
|
if(P.needs_work & PLANET_PROCESS_SUN)
|
|
P.needs_work &= ~PLANET_PROCESS_SUN
|
|
// Remove old value from corners
|
|
var/list/sunlit_corners = P.sunlit_corners
|
|
var/old_lum_r = -P.sun["lum_r"]
|
|
var/old_lum_g = -P.sun["lum_g"]
|
|
var/old_lum_b = -P.sun["lum_b"]
|
|
if(old_lum_r || old_lum_g || old_lum_b)
|
|
for(var/C in P.sunlit_corners)
|
|
var/datum/lighting_corner/LC = C
|
|
LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b)
|
|
SCHECK
|
|
sunlit_corners.Cut()
|
|
|
|
// Calculate new values to apply
|
|
var/new_brightness = P.sun["brightness"]
|
|
var/new_color = P.sun["color"]
|
|
var/lum_r = new_brightness * GetRedPart (new_color) / 255
|
|
var/lum_g = new_brightness * GetGreenPart(new_color) / 255
|
|
var/lum_b = new_brightness * GetBluePart (new_color) / 255
|
|
var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
|
|
for(var/I in P.planet_floors)
|
|
var/turf/simulated/T = I
|
|
if(!T.lighting_corners_initialised)
|
|
T.generate_missing_corners()
|
|
for(var/C in T.get_corners())
|
|
var/datum/lighting_corner/LC = C
|
|
if(LC.update_gen != update_gen && LC.active)
|
|
sunlit_corners += LC
|
|
LC.update_gen = update_gen
|
|
LC.update_lumcount(lum_r, lum_g, lum_b)
|
|
SCHECK
|
|
update_gen--
|
|
P.sun["lum_r"] = lum_r
|
|
P.sun["lum_g"] = lum_g
|
|
P.sun["lum_b"] = lum_b
|
|
|
|
//Temperature needs updating
|
|
if(P.needs_work & PLANET_PROCESS_TEMP)
|
|
P.needs_work &= ~PLANET_PROCESS_TEMP
|
|
//Set new temperatures
|
|
for(var/W in P.planet_walls)
|
|
var/turf/unsimulated/wall/planetary/wall = W
|
|
wall.set_temperature(P.weather_holder.temperature)
|
|
SCHECK
|