mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-24 17:11:40 +00:00
Largely ported from the work done at Baystation in Baystation12#17460 and later commits.
- Shuttles no longer require a separate area for each location they jump to.
Instead destinations are indicated by landmark objects, which are not necessarily exclusive to that shuttle.
This means that more than one shuttle could use the same docking port (not at the same time of course).
- Enhanced shuttle control computers to use nanoui if they didn't.
- Organizes shuttle datum code a bit better so there is less re-inventing the wheel in subtypes.
- Allows the possibility of shuttles (or destinations) that start on late-loaded maps.
- Deprecate the "extra" shuttle areas that are no longer needed and update shuttle areas in unit tests
This all required a bit of infrastructure improvements.
- ChangeArea proc, for changing the area of a turf.
- Fixed lighting overlays actually being able to be destroyed.
- Added a few utility macros and procs.
- Added "turf translation" procs which are like move_contents_to but more flexible.
(cherry picked from commit c837078105)
103 lines
3.2 KiB
Plaintext
103 lines
3.2 KiB
Plaintext
/turf
|
|
var/dynamic_lighting = TRUE // Does the turf use dynamic lighting?
|
|
luminosity = 1
|
|
|
|
var/tmp/lighting_corners_initialised = FALSE
|
|
|
|
var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf.
|
|
var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay.
|
|
var/tmp/list/datum/lighting_corner/corners
|
|
var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile.
|
|
|
|
/turf/New()
|
|
. = ..()
|
|
|
|
if(opacity)
|
|
has_opaque_atom = TRUE
|
|
|
|
// Causes any affecting light sources to be queued for a visibility update, for example a door got opened.
|
|
/turf/proc/reconsider_lights()
|
|
for(var/datum/light_source/L in affecting_lights)
|
|
L.vis_update()
|
|
|
|
/turf/proc/lighting_clear_overlay()
|
|
if(lighting_overlay)
|
|
qdel(lighting_overlay, force = TRUE)
|
|
|
|
for(var/datum/lighting_corner/C in corners)
|
|
C.update_active()
|
|
|
|
// Builds a lighting overlay for us, but only if our area is dynamic.
|
|
/turf/proc/lighting_build_overlay()
|
|
if(lighting_overlay)
|
|
return
|
|
|
|
var/area/A = loc
|
|
if(A.dynamic_lighting)
|
|
if(!lighting_corners_initialised)
|
|
generate_missing_corners()
|
|
|
|
new /atom/movable/lighting_overlay(src)
|
|
|
|
for(var/datum/lighting_corner/C in corners)
|
|
if(!C.active) // We would activate the corner, calculate the lighting for it.
|
|
for(var/L in C.affecting)
|
|
var/datum/light_source/S = L
|
|
S.recalc_corner(C)
|
|
|
|
C.active = TRUE
|
|
|
|
// Used to get a scaled lumcount.
|
|
/turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1)
|
|
if(!lighting_overlay)
|
|
return 1
|
|
|
|
var/totallums = 0
|
|
for(var/datum/lighting_corner/L in corners)
|
|
totallums += max(L.lum_r, L.lum_g, L.lum_b)
|
|
|
|
totallums /= 4 // 4 corners, max channel selected, return the average
|
|
|
|
totallums =(totallums - minlum) /(maxlum - minlum)
|
|
|
|
return CLAMP01(totallums)
|
|
|
|
// Can't think of a good name, this proc will recalculate the has_opaque_atom variable.
|
|
/turf/proc/recalc_atom_opacity()
|
|
has_opaque_atom = FALSE
|
|
for(var/atom/A in src.contents + src) // Loop through every movable atom on our tile PLUS ourselves (we matter too...)
|
|
if(A.opacity)
|
|
has_opaque_atom = TRUE
|
|
|
|
// If an opaque movable atom moves around we need to potentially update visibility.
|
|
/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc)
|
|
. = ..()
|
|
|
|
if(Obj && Obj.opacity)
|
|
has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case.
|
|
reconsider_lights()
|
|
|
|
/turf/Exited(var/atom/movable/Obj, var/atom/newloc)
|
|
. = ..()
|
|
|
|
if(Obj && Obj.opacity)
|
|
recalc_atom_opacity() // Make sure to do this before reconsider_lights(), incase we're on instant updates.
|
|
reconsider_lights()
|
|
|
|
/turf/proc/get_corners()
|
|
if(has_opaque_atom)
|
|
return null // Since this proc gets used in a for loop, null won't be looped though.
|
|
|
|
return corners
|
|
|
|
/turf/proc/generate_missing_corners()
|
|
lighting_corners_initialised = TRUE
|
|
if(!corners)
|
|
corners = list(null, null, null, null)
|
|
|
|
for(var/i = 1 to 4)
|
|
if(corners[i]) // Already have a corner on this direction.
|
|
continue
|
|
|
|
corners[i] = new /datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i])
|