diff --git a/baystation12.dme b/baystation12.dme
index c8173f401e..2584fc6002 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -85,15 +85,12 @@
#include "code\ATMOSPHERICS\components\unary\unary_base.dm"
#include "code\ATMOSPHERICS\components\unary\vent_pump.dm"
#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm"
-#include "code\controllers\_DynamicAreaLighting_TG.dm"
#include "code\controllers\autotransfer.dm"
#include "code\controllers\communications.dm"
#include "code\controllers\configuration.dm"
#include "code\controllers\emergency_shuttle_controller.dm"
-#include "code\controllers\failsafe.dm"
#include "code\controllers\hooks-defs.dm"
#include "code\controllers\hooks.dm"
-#include "code\controllers\lighting_controller.dm"
#include "code\controllers\master_controller.dm"
#include "code\controllers\shuttle_controller.dm"
#include "code\controllers\subsystems.dm"
@@ -106,7 +103,6 @@
#include "code\controllers\Processes\event.dm"
#include "code\controllers\Processes\garbage.dm"
#include "code\controllers\Processes\inactivity.dm"
-#include "code\controllers\Processes\lighting.dm"
#include "code\controllers\Processes\machinery.dm"
#include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nanoui.dm"
@@ -1030,6 +1026,14 @@
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
+#include "code\modules\lighting\_lighting_defs.dm"
+#include "code\modules\lighting\light_source.dm"
+#include "code\modules\lighting\lighting_atom.dm"
+#include "code\modules\lighting\lighting_overlay.dm"
+#include "code\modules\lighting\lighting_process.dm"
+#include "code\modules\lighting\lighting_system.dm"
+#include "code\modules\lighting\lighting_turf.dm"
+#include "code\modules\lighting\~lighting_undefs.dm"
#include "code\modules\liquid\splash_simulation.dm"
#include "code\modules\maps\dmm_suite.dm"
#include "code\modules\maps\reader.dm"
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index 688f71985d..50b048d75a 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -95,7 +95,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
icon = 'icons/effects/fire.dmi'
icon_state = "1"
- l_color = "#ED9200"
+ light_color = "#ED9200"
layer = TURF_LAYER
var/firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel()
@@ -114,13 +114,13 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
if(firelevel > 6)
icon_state = "3"
- SetLuminosity(7)
+ set_light(7)
else if(firelevel > 2.5)
icon_state = "2"
- SetLuminosity(5)
+ set_light(5)
else
icon_state = "1"
- SetLuminosity(3)
+ set_light(3)
//im not sure how to implement a version that works for every creature so for now monkeys are firesafe
for(var/mob/living/L in loc)
@@ -165,7 +165,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
qdel(src)
set_dir(pick(cardinal))
- SetLuminosity(3)
+ set_light(3)
firelevel = fl
air_master.active_hotspots.Add(src)
@@ -178,7 +178,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
/obj/fire/proc/RemoveFire()
if (istype(loc, /turf))
- SetLuminosity(0)
+ set_light(0)
loc = null
air_master.active_hotspots.Remove(src)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index ea7dbd083c..2654e86e79 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -69,18 +69,6 @@
/proc/isNotAdminLevel(var/level)
return !isAdminLevel(level)
-//Magic constants obtained by using linear regression on right-angled triangles of sides 0=dy) return (k1*dx) + (k2*dy) //No sqrt or powers :)
- else return (k2*dx) + (k1*dy)
-#undef k1
-#undef k2
-
/proc/circlerange(center=usr,radius=3)
var/turf/centerturf = get_turf(center)
diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm
deleted file mode 100644
index 6d3fd406dd..0000000000
--- a/code/controllers/_DynamicAreaLighting_TG.dm
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- Modified DynamicAreaLighting for TGstation - Coded by Carnwennan
-
- This is TG's 'new' lighting system. It's basically a heavily modified combination of Forum_Account's and
- ShadowDarke's respective lighting libraries. Credits, where due, to them.
-
- Like sd_DAL (what we used to use), it changes the shading overlays of areas by splitting each type of area into sub-areas
- by using the var/tag variable and moving turfs into the contents list of the correct sub-area. This method is
- much less costly than using overlays or objects.
-
- Unlike sd_DAL however it uses a queueing system. Everytime we call a change to opacity or luminosity
- (through SetOpacity() or SetLuminosity()) we are simply updating variables and scheduling certain lights/turfs for an
- update. Actual updates are handled periodically by the lighting_controller. This carries additional overheads, however it
- means that each thing is changed only once per lighting_controller.processing_interval ticks. Allowing for greater control
- over how much priority we'd like lighting updates to have. It also makes it possible for us to simply delay updates by
- setting lighting_controller.processing = 0 at say, the start of a large explosion, waiting for it to finish, and then
- turning it back on with lighting_controller.processing = 1.
-
- Unlike our old system there are hardcoded maximum luminositys (different for certain atoms).
- This is to cap the cost of creating lighting effects.
- (without this, an atom with luminosity of 20 would have to update 41^2 turfs!) :s
-
- Also, in order for the queueing system to work, each light remembers the effect it casts on each turf. This is going to
- have larger memory requirements than our previous system but it's easily worth the hassle for the greater control we
- gain. It also reduces cost of removing lighting effects by a lot!
-
- Known Issues/TODO:
- Shuttles still do not have support for dynamic lighting (I hope to fix this at some point)
- No directional lighting support. (prototype looked ugly)
-*/
-
-#define LIGHTING_CIRCULAR 1 //comment this out to use old square lighting effects.
-#define LIGHTING_LAYER 10 //Drawing layer for lighting overlays
-#define LIGHTING_ICON 'icons/effects/ss13_dark_alpha6.dmi' //Icon used for lighting shading effects
-
-datum/light_source
- var/atom/owner
- var/changed = 1
- var/list/effect = list()
- var/__x = 0 //x coordinate at last update
- var/__y = 0 //y coordinate at last update
- var/__z = 0 //z coordinate at last update
-
- var/_l_color //do not use directly, only used as reference for updating
- var/col_r
- var/col_g
- var/col_b
-
-
- New(atom/A)
- if(!istype(A))
- CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.")
- ..()
- owner = A
- readrgb(owner.l_color)
- __x = owner.x
- __y = owner.y
- __z = owner.z
- // the lighting object maintains a list of all light sources
- lighting_controller.lights += src
-
-
- //Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one
- proc/check()
- if(!owner)
- remove_effect()
- return 1 //causes it to be removed from our list of lights. The garbage collector will then destroy it.
-
- // check to see if we've moved since last update
- if(owner.x != __x || owner.y != __y || owner.z != __z)
- __x = owner.x
- __y = owner.y
- __z = owner.z
- changed = 1
-
- if (owner.l_color != _l_color)
- readrgb(owner.l_color)
- changed = 1
-
- if(changed)
- changed = 0
- remove_effect()
- return add_effect()
- return 0
-
-
- proc/remove_effect()
- // before we apply the effect we remove the light's current effect.
- for(var/turf/T in effect) // negate the effect of this light source
- T.update_lumcount(-effect[T], col_r, col_g, col_b, 1)
- effect.Cut() // clear the effect list
-
- proc/add_effect()
- // only do this if the light is turned on and is on the map
- if(owner.loc && owner.luminosity > 0)
- readrgb(owner.l_color)
- effect = list()
- for(var/turf/T in view(owner.get_light_range(),get_turf(owner)))
- var/delta_lumen = lum(T)
- if(delta_lumen > 0)
- effect[T] = delta_lumen
- T.update_lumcount(delta_lumen, col_r, col_g, col_b, 0)
-
- return 0
- else
- owner.light = null
- return 1 //cause the light to be removed from the lights list and garbage collected once it's no
- //longer referenced by the queue
-
- proc/lum(turf/A)
- if (owner.trueLuminosity < 1)
- return 0
- var/dist
- if(!A)
- dist = 0
- else
-#ifdef LIGHTING_CIRCULAR
- dist = cheap_hypotenuse(A.x, A.y, __x, __y)
-#else
- dist = max(abs(A.x - __x), abs(A.y - __y))
-#endif
- if (owner.trueLuminosity > 100) // This will never happen... right?
- return sqrt(owner.trueLuminosity) - dist
- else
- return sqrtTable[owner.trueLuminosity] - dist
-
- proc/readrgb(col)
- _l_color = col
- if(col)
- col_r = GetRedPart(col)
- col_g = GetGreenPart(col)
- col_b = GetBluePart(col)
- else
- col_r = null
-
-atom
- var/datum/light_source/light
- var/trueLuminosity = 0 // Typically 'luminosity' squared. The builtin luminosity must remain linear.
- // We may read it, but NEVER set it directly.
- var/l_color
-
-//Turfs with opacity when they are constructed will trigger nearby lights to update
-//Turfs and atoms with luminosity when they are constructed will create a light_source automatically
-turf/New()
- ..()
- if(luminosity)
- if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.")
- trueLuminosity = luminosity * luminosity
- light = new(src)
-
-//Movable atoms with opacity when they are constructed will trigger nearby lights to update
-//Movable atoms with luminosity when they are constructed will create a light_source automatically
-atom/movable/New()
- ..()
- if(opacity)
- if(isturf(loc))
- if(loc:lighting_lumcount > 1)
- UpdateAffectingLights()
- if(luminosity)
- if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.")
- trueLuminosity = luminosity * luminosity
- light = new(src)
-
-//Sets our luminosity.
-//If we have no light it will create one.
-//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its
-//queues are complete.
-//if we have a light already it is merely updated, rather than making a new one.
-atom/proc/SetLuminosity(new_luminosity, trueLum = FALSE)
- if(new_luminosity < 0)
- new_luminosity = 0
- if(!trueLum)
- new_luminosity *= new_luminosity
- if(light)
- if(trueLuminosity != new_luminosity) //non-luminous lights are removed from the lights list in add_effect()
- light.changed = 1
- else
- if(new_luminosity)
- light = new(src)
- trueLuminosity = new_luminosity
- if (trueLuminosity < 1)
- luminosity = 0
- else if (trueLuminosity <= 100)
- luminosity = sqrtTable[trueLuminosity]
- else
- luminosity = sqrt(trueLuminosity)
-
-atom/proc/AddLuminosity(delta_luminosity)
- if(delta_luminosity > 0)
- SetLuminosity(trueLuminosity + delta_luminosity*delta_luminosity, TRUE)
- else if(delta_luminosity < 0)
- SetLuminosity(trueLuminosity - delta_luminosity*delta_luminosity, TRUE)
-
-area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas
- luminosity = !!new_luminosity
- trueLuminosity = luminosity
-
-
-//change our opacity (defaults to toggle), and then update all lights that affect us.
-atom/proc/SetOpacity(new_opacity)
- if(new_opacity == null)
- new_opacity = !opacity //default = toggle opacity
- else if(opacity == new_opacity)
- return 0 //opacity hasn't changed! don't bother doing anything
- opacity = new_opacity //update opacity, the below procs now call light updates.
- return 1
-
-turf/SetOpacity(new_opacity)
- if(..()==1) //only bother if opacity changed
- if(lighting_lumcount) //only bother with an update if our turf is currently affected by a light
- UpdateAffectingLights()
-
-/atom/movable/SetOpacity(new_opacity)
- if(..()==1) //only bother if opacity changed
- if(isturf(loc)) //only bother with an update if we're on a turf
- var/turf/T = loc
- if(T.lighting_lumcount) //only bother with an update if our turf is currently affected by a light
- UpdateAffectingLights()
-
-
-turf
- var/lighting_lumcount = 0
- var/lighting_changed = 0
- var/color_lighting_lumcount = 0
-
- var/lumcount_r = 0
- var/lumcount_g = 0
- var/lumcount_b = 0
- var/light_col_sources = 0
-
-turf/space
- lighting_lumcount = 4 //starlight
-
-turf/proc/update_lumcount(amount, col_r, col_g, col_b, removing = 0)
- lighting_lumcount += amount
-
- if(!isnull(col_r)) //col_r is the "key" var, if it's null so will the rest
- if(removing)
- light_col_sources--
- lumcount_r -= col_r
- lumcount_g -= col_g
- lumcount_b -= col_b
- else
- light_col_sources++
- lumcount_r += col_r
- lumcount_g += col_g
- lumcount_b += col_b
-
- if(light_col_sources)
- var/r_avg = max(0, min(255, round(lumcount_r / light_col_sources, 16) + 15))
- var/g_avg = max(0, min(255, round(lumcount_g / light_col_sources, 16) + 15))
- var/b_avg = max(0, min(255, round(lumcount_b / light_col_sources, 16) + 15))
- l_color = rgb(r_avg, g_avg, b_avg)
- else
- l_color = null
-
- color_lighting_lumcount = max(color_lighting_lumcount + amount, 0) // Minimum of 0.
-
- if(!lighting_changed)
- lighting_controller.changed_turfs += src
- lighting_changed = 1
-
-turf/proc/lighting_tag(const/level)
- var/area/A = loc
- return A.tagbase + "sd_L[level]"
-
-turf/proc/build_lighting_area(const/tag, const/level, const/color_light)
- var/area/Area = loc
- var/area/A = new Area.type() // create area if it wasn't found
- // replicate vars
- for(var/V in Area.vars)
- switch(V)
- if ("contents","lighting_overlay", "color_overlay", "overlays")
- continue
- else
- if(issaved(Area.vars[V])) A.vars[V] = Area.vars[V]
-
- A.tag = tag
- A.lighting_subarea = 1
- A.lighting_space = 0 // in case it was copied from a space subarea
-
- if (l_color != A.l_color)
- A.l_color = l_color
- //color_light = min(max(round(color_lighting_lumcount, 1), 0), lighting_controller.lighting_states)
- //world << "[color_light] [color_lighting_lumcount]"
-
- A.SetLightLevel(level, color_light)
- Area.related += A
- return A
-
-turf/proc/shift_to_subarea()
- lighting_changed = 0
- var/area/Area = loc
-
- if(!istype(Area) || !Area.lighting_use_dynamic) return
-
- var/level = min(max(round(lighting_lumcount,1),0),lighting_controller.lighting_states)
- var/new_tag = lighting_tag(level)
-
- // pomf - If we have a lighting color that is not null, apply the new tag to seperate the areas.
- if (l_color)
- // pomf - We append the (rounded!) color lighting lumcount so we can have colored lights.
- new_tag += "[l_color][min(max(round(color_lighting_lumcount,1),0),lighting_controller.lighting_states)]"
-
- if(Area.tag!=new_tag) //skip if already in this area
- var/area/A = locate(new_tag) // find an appropriate area
- var/color_light = min(max(round(color_lighting_lumcount,1),0),lighting_controller.lighting_states)
-
- if (!A)
- A = build_lighting_area(new_tag, level, color_light)
- else if (l_color != A.l_color)
- A.l_color = l_color
- //color_light = min(max(round(color_lighting_lumcount, 1), 0), lighting_controller.lighting_states)
- A.SetLightLevel(level, color_light)
-
- A.contents += src // move the turf into the area
- universe.OnTurfTick(src)
-
-// Dedicated lighting sublevel for space turfs
-// helps us depower things in space, remove space fire alarms,
-// and evens out space lighting
-turf/space/lighting_tag(var/level)
- var/area/A = loc
- return A.tagbase + "sd_L_space"
-turf/space/build_lighting_area(var/tag,var/level)
- var/area/A = ..(tag,4)
- A.lighting_space = 1
- A.SetLightLevel(4)
- A.icon_state = null
- return A
-
-
-area
- var/lighting_use_dynamic = 1 //Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area
- var/image/lighting_overlay //tracks the darkness image of the area for easy removal
- var/lighting_subarea = 0 //tracks whether we're a lighting sub-area
- var/lighting_space = 0 // true for space-only lighting subareas
- var/tagbase
- var/image/color_overlay //Tracks the color image.
-
- proc/SetLightLevel(light, color_light = 0)
- if(!src) return
- if(light <= 0)
- light = 0
- luminosity = 0
- else
- if(light > lighting_controller.lighting_states)
- light = lighting_controller.lighting_states
- luminosity = 1
-
- if(lighting_overlay)
- overlays -= lighting_overlay
- lighting_overlay.icon_state = "[light]"
- else
- lighting_overlay = image(LIGHTING_ICON,,num2text(light),LIGHTING_LAYER)
-
- if (color_overlay)
- overlays.Remove(color_overlay)
- color_overlay.icon_state = "5"
- else
- if (l_color)
- color_overlay = image('icons/effects/effects.dmi', ,"5", 10.1)
- //color_overlay = image('icons/effects/effects.dmi', ,"white", 10.1)
-
- if (istype(color_overlay))
- color_overlay.color = l_color
-
-
- switch (color_light)
- if (6)
- color_overlay.icon_state = "5"
- //color_overlay.alpha = 180
- if (5)
- color_overlay.icon_state = "4"
- //color_overlay.alpha = 150
- if (4)
- color_overlay.icon_state = "3"
- //color_overlay.alpha = 120
- if (3)
- color_overlay.icon_state = "2"
- //color_overlay.alpha = 90
- if (2)
- color_overlay.icon_state = "1"
- //color_overlay.alpha = 60
- if (1)
- color_overlay.icon_state = "1"
- color_overlay.alpha = 200
- //color_overlay.alpha = 30
- if (-INFINITY to 0)
- //world << "Zero or below, [color_light]."
- color_overlay.alpha = 0
- else
- //world << "Setting the alpha to max... color_light [color_light]."
- color_overlay.alpha = 180
-
- color_overlay.blend_mode = BLEND_ADD
- if (color_overlay.color)
- overlays.Add(color_overlay)
-
- if (isnull(color_overlay))
- overlays.Add(lighting_overlay)
- else if (light < 6)
- overlays.Add(lighting_overlay)
-
- proc/SetDynamicLighting()
-
- src.lighting_use_dynamic = 1
- for(var/turf/T in src.contents)
- T.update_lumcount(0)
-
- proc/InitializeLighting() //TODO: could probably improve this bit ~Carn
- tagbase = "[type]"
- if(!tag) tag = tagbase
- if(!lighting_use_dynamic)
- if(!lighting_subarea) // see if this is a lighting subarea already
- //show the dark overlay so areas, not yet in a lighting subarea, won't be bright as day and look silly.
- SetLightLevel(4)
-
-//#undef LIGHTING_LAYER
-#undef LIGHTING_CIRCULAR
-//#undef LIGHTING_ICON
-
-#define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag.
-#define LIGHTING_MAX_LUMINOSITY_MOBILE 5 //Moving objects have a lower max luminosity since these update more often. (lag reduction)
-#define LIGHTING_MAX_LUMINOSITY_TURF 1 //turfs have a severely shortened range to protect from inevitable floor-lighttile spam.
-
-//set the changed status of all lights which could have possibly lit this atom.
-//We don't need to worry about lights which lit us but moved away, since they will have change status set already
-//This proc can cause lots of lights to be updated. :(
-atom/proc/UpdateAffectingLights()
- for(var/atom/A in oview(LIGHTING_MAX_LUMINOSITY_STATIC-1,src))
- if(A.light)
- A.light.changed = 1 //force it to update at next process()
-
-//caps luminosity effects max-range based on what type the light's owner is.
-atom/proc/get_light_range()
- return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC)
-
-atom/movable/get_light_range()
- return min(luminosity, LIGHTING_MAX_LUMINOSITY_MOBILE)
-
-obj/machinery/light/get_light_range()
- return min(luminosity, LIGHTING_MAX_LUMINOSITY_STATIC)
-
-turf/get_light_range()
- return min(luminosity, LIGHTING_MAX_LUMINOSITY_TURF)
-
-#undef LIGHTING_MAX_LUMINOSITY_STATIC
-#undef LIGHTING_MAX_LUMINOSITY_MOBILE
-#undef LIGHTING_MAX_LUMINOSITY_TURF
\ No newline at end of file
diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm
index ee506c0d27..6e37954087 100644
--- a/code/controllers/failsafe.dm
+++ b/code/controllers/failsafe.dm
@@ -25,7 +25,6 @@ var/datum/controller/failsafe/Failsafe
set background = 1
while(1) //more efficient than recursivly calling ourself over and over. background = 1 ensures we do not trigger an infinite loop
if(!master_controller) new /datum/controller/game_controller() //replace the missing master_controller! This should never happen.
- if(!lighting_controller) new /datum/controller/lighting() //replace the missing lighting_controller
if(processing)
if(lighting_controller.processing)
diff --git a/code/controllers/lighting_controller.dm b/code/controllers/lighting_controller.dm
deleted file mode 100644
index 8510af6714..0000000000
--- a/code/controllers/lighting_controller.dm
+++ /dev/null
@@ -1,130 +0,0 @@
-var/datum/controller/lighting/lighting_controller = new ()
-
-datum/controller/lighting
- var/processing = 0
- var/processing_interval = 5 //setting this too low will probably kill the server. Don't be silly with it!
- var/process_cost = 0
- var/iteration = 0
-
- var/lighting_states = 7
-
- var/list/lights = list()
- var/lights_workload_max = 0
-
-// var/list/changed_lights() //TODO: possibly implement this to reduce on overheads?
-
- var/list/changed_turfs = list()
- var/changed_turfs_workload_max = 0
-
-
-datum/controller/lighting/New()
- lighting_states = max( 0, length(icon_states(LIGHTING_ICON))-1 )
- if(lighting_controller != src)
- if(istype(lighting_controller,/datum/controller/lighting))
- Recover() //if we are replacing an existing lighting_controller (due to a crash) we attempt to preserve as much as we can
- qdel(lighting_controller)
- lighting_controller = src
-
-
-//Workhorse of lighting. It cycles through each light to see which ones need their effects updating. It updates their
-//effects and then processes every turf in the queue, moving the turfs to the corresponing lighting sub-area.
-//All queue lists prune themselves, which will cause lights with no luminosity to be garbage collected (cheaper and safer
-//than deleting them). Processing interval should be roughly half a second for best results.
-//By using queues we are ensuring we don't perform more updates than are necessary
-datum/controller/lighting/proc/process()
- processing = 1
- spawn(0)
- set background = 1
- while(1)
- if(processing)
- iteration++
- var/started = world.timeofday
-
- lights_workload_max = max(lights_workload_max,lights.len)
- for(var/i=1, i<=lights.len, i++)
- var/datum/light_source/L = lights[i]
- if(L && !L.check())
- continue
- lights.Cut(i,i+1)
- i--
-
- sleep(-1)
-
- changed_turfs_workload_max = max(changed_turfs_workload_max,changed_turfs.len)
- for(var/i=1, i<=changed_turfs.len, i++)
- var/turf/T = changed_turfs[i]
- if(T && T.lighting_changed)
- T.shift_to_subarea()
- changed_turfs.Cut() // reset the changed list
-
- process_cost = (world.timeofday - started)
-
- sleep(processing_interval)
-
-//same as above except it attempts to shift ALL turfs in the world regardless of lighting_changed status
-//Does not loop. Should be run prior to process() being called for the first time.
-//Note: if we get additional z-levels at runtime (e.g. if the gateway thin ever gets finished) we can initialize specific
-//z-levels with the z_level argument
-datum/controller/lighting/proc/initializeLighting(var/z_level)
- processing = 0
- spawn(-1)
- set background = 1
- for(var/i=1, i<=lights.len, i++)
- var/datum/light_source/L = lights[i]
- if(L.check())
- lights.Cut(i,i+1)
- i--
-
- var/z_start = 1
- var/z_finish = world.maxz
- if(z_level)
- z_level = round(z_level,1)
- if(z_level > 0 && z_level <= world.maxz)
- z_start = z_level
- z_finish = z_level
-
- for(var/k=z_start,k<=z_finish,k++)
- for(var/i=1,i<=world.maxx,i++)
- for(var/j=1,j<=world.maxy,j++)
- var/turf/T = locate(i,j,k)
- if(T) T.shift_to_subarea()
-
- changed_turfs.Cut() // reset the changed list
-
-
-//Used to strip valid information from an existing controller and transfer it to a replacement
-//It works by using spawn(-1) to transfer the data, if there is a runtime the data does not get transfered but the loop
-//does not crash
-datum/controller/lighting/proc/Recover()
- if(!istype(lighting_controller.changed_turfs,/list))
- lighting_controller.changed_turfs = list()
- if(!istype(lighting_controller.lights,/list))
- lighting_controller.lights = list()
-
- for(var/i=1, i<=lighting_controller.lights.len, i++)
- var/datum/light_source/L = lighting_controller.lights[i]
- if(istype(L))
- spawn(-1) //so we don't crash the loop (inefficient)
- L.check()
- lights += L //If we didn't runtime then this will get transferred over
-
- for(var/i=1, i<=lighting_controller.changed_turfs.len, i++)
- var/turf/T = lighting_controller.changed_turfs[i]
- if(istype(T) && T.lighting_changed)
- spawn(-1)
- T.shift_to_subarea()
-
- var/msg = "## DEBUG: [time2text(world.timeofday)] lighting_controller restarted. Reports:\n"
- for(var/varname in lighting_controller.vars)
- switch(varname)
- if("tag","bestF","type","parent_type","vars") continue
- else
- var/varval1 = lighting_controller.vars[varname]
- var/varval2 = vars[varname]
- if(istype(varval1,/list))
- varval1 = "/list([length(varval1)])"
- varval2 = "/list([length(varval2)])"
- msg += "\t [varname] = [varval1] -> [varval2]\n"
- world.log << msg
-
-#undef LIGHTING_ICON
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index d827a3a65e..ddfd99f5d6 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -30,7 +30,7 @@
var/tz = input("Z? (default 1)") as text|null
new map_datum(seed,tx,ty,tz)
-/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply"))
+/client/proc/restart_controller(controller in list("Supply"))
set category = "Debug"
set name = "Restart Controller"
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
@@ -39,13 +39,6 @@
usr = null
src = null
switch(controller)
- if("Failsafe")
- new /datum/controller/failsafe()
- feedback_add_details("admin_verb","RFailsafe")
- if("Lighting")
- new /datum/controller/lighting()
- lighting_controller.process()
- feedback_add_details("admin_verb","RLighting")
if("Supply")
supply_controller.process()
feedback_add_details("admin_verb","RSupply")
@@ -62,7 +55,7 @@
usr.client.debug_variables(antag)
message_admins("Admin [key_name_admin(usr)] is debugging the [antag.role_text] template.")
-/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Ticker Process","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano"))
+/client/proc/debug_controller(controller in list("Master","Ticker","Ticker Process","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller", "Gas Data","Event","Plants","Alarm","Nano"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -72,18 +65,12 @@
if("Master")
debug_variables(master_controller)
feedback_add_details("admin_verb","DMC")
- if("Failsafe")
- debug_variables(Failsafe)
- feedback_add_details("admin_verb","DFailsafe")
if("Ticker")
debug_variables(ticker)
feedback_add_details("admin_verb","DTicker")
if("Ticker Process")
debug_variables(tickerProcess)
feedback_add_details("admin_verb","DTickerProcess")
- if("Lighting")
- debug_variables(lighting_controller)
- feedback_add_details("admin_verb","DLighting")
if("Air")
debug_variables(air_master)
feedback_add_details("admin_verb","DAir")
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 13f1b39d98..21e965244b 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -26,8 +26,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
layer = 10
+ luminosity = 1
mouse_opacity = 0
- invisibility = INVISIBILITY_LIGHTING
var/lightswitch = 1
var/eject = null
@@ -99,7 +99,6 @@ var/list/ghostteleportlocs = list()
icon_state = "space"
requires_power = 1
always_unpowered = 1
- lighting_use_dynamic = 1
power_light = 0
power_equip = 0
power_environ = 0
@@ -142,10 +141,8 @@ area/space/atmosalert()
//place to another. Look at escape shuttle for example.
//All shuttles should now be under shuttle since we have smooth-wall code.
-/area/shuttle //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS.
+/area/shuttle
requires_power = 0
- luminosity = 1
- lighting_use_dynamic = 0
/area/shuttle/arrival
name = "\improper Arrival Shuttle"
@@ -246,15 +243,11 @@ area/space/atmosalert()
icon_state = "shuttle"
name = "\improper Alien Shuttle Base"
requires_power = 1
- luminosity = 0
- lighting_use_dynamic = 1
/area/shuttle/alien/mine
icon_state = "shuttle"
name = "\improper Alien Shuttle Mine"
requires_power = 1
- luminosity = 0
- lighting_use_dynamic = 1
/area/shuttle/prison/
name = "\improper Prison Shuttle"
@@ -340,7 +333,6 @@ area/space/atmosalert()
name = "start area"
icon_state = "start"
requires_power = 0
- luminosity = 1
lighting_use_dynamic = 0
has_gravity = 1
@@ -358,6 +350,7 @@ area/space/atmosalert()
icon_state = "centcom"
requires_power = 0
unlimited_power = 1
+ lighting_use_dynamic = 0
/area/centcom/control
name = "\improper Centcom Control"
@@ -396,6 +389,7 @@ area/space/atmosalert()
icon_state = "syndie-ship"
requires_power = 0
unlimited_power = 1
+ lighting_use_dynamic = 0
/area/syndicate_mothership/control
name = "\improper Mercenary Control Room"
@@ -1006,7 +1000,6 @@ area/space/atmosalert()
/area/holodeck
name = "\improper Holodeck"
icon_state = "Holodeck"
- luminosity = 1
lighting_use_dynamic = 0
/area/holodeck/alphadeck
@@ -1136,7 +1129,6 @@ area/space/atmosalert()
/area/solar
requires_power = 1
always_unpowered = 1
- luminosity = 1
lighting_use_dynamic = 0
auxport
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index d3373c9d43..38452c3d5b 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -13,20 +13,15 @@
uid = ++global_uid
all_areas += src
- if(requires_power)
- luminosity = 0
- else
+ if(!requires_power)
power_light = 0 //rastaf0
power_equip = 0 //rastaf0
power_environ = 0 //rastaf0
- luminosity = 1
- lighting_use_dynamic = 0
..()
// spawn(15)
power_change() // all machines set to current power level, also updates lighting icon
- InitializeLighting()
/area/proc/get_contents()
return contents
@@ -145,7 +140,7 @@
return
/area/proc/updateicon()
- if ((fire || eject || party) && (!requires_power||power_environ) && !lighting_space)//If it doesn't require power, can still activate this proc.
+ if ((fire || eject || party) && (!requires_power||power_environ) && !istype(src, /area/space))//If it doesn't require power, can still activate this proc.
if(fire && !eject && !party)
icon_state = "blue"
/*else if(atmosalm && !fire && !eject && !party)
@@ -173,8 +168,6 @@
return 1
if(always_unpowered)
return 0
- if(src.lighting_space)
- return 0 // Nope sorry
switch(chan)
if(EQUIP)
return power_equip
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 725d5b0a26..742c6389a9 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -26,7 +26,7 @@
/atom/Destroy()
. = ..()
density = 0
- SetOpacity(0)
+ set_opacity(0)
if(reagents)
qdel(reagents)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b8b8bbb9f6..f86c135da4 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -30,15 +30,10 @@
..()
/atom/movable/Destroy()
- if(opacity)
- if(isturf(loc))
- if(loc:lighting_lumcount > 1)
- UpdateAffectingLights()
+ . = ..()
+
loc = null
- ..()
-
-
/atom/movable/proc/initialize()
return
@@ -215,4 +210,4 @@
/atom/movable/overlay/attack_hand(a, b, c)
if (src.master)
return src.master.attack_hand(a, b, c)
- return
\ No newline at end of file
+ return
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 6e9c3d9b68..44486d605b 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -3,7 +3,7 @@
name = "blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob"
- luminosity = 3
+ light_range = 3
desc = "Some blob creature thingy"
density = 1
opacity = 0
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 337ad39c0d..b5854ed981 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -22,8 +22,8 @@
desc = "A floating crystal that hums with an unearthly energy"
icon_state = "pylon"
var/isbroken = 0
- luminosity = 5
- l_color = "#3e0000"
+ light_range = 5
+ light_color = "#3e0000"
var/obj/item/wepon = null
/obj/structure/cult/pylon/attack_hand(mob/M as mob)
@@ -47,7 +47,7 @@
isbroken = 1
density = 0
icon_state = "pylon-broken"
- SetLuminosity(0)
+ set_light(0)
else
user << "You hit the pylon!"
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
@@ -66,13 +66,12 @@
isbroken = 0
density = 1
icon_state = "pylon"
- SetLuminosity(5)
+ set_light(5)
/obj/structure/cult/tome
name = "Desk"
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl"
icon_state = "tomealtar"
-// luminosity = 5
//sprites for this no longer exist -Pete
//(they were stolen from another game anyway)
@@ -105,8 +104,8 @@
return
/obj/effect/gateway/active
- luminosity=5
- l_color="#ff0000"
+ light_range=5
+ light_color="#ff0000"
spawnable=list(
/mob/living/simple_animal/hostile/scarybat,
/mob/living/simple_animal/hostile/creature,
@@ -114,8 +113,8 @@
)
/obj/effect/gateway/active/cult
- luminosity=5
- l_color="#ff0000"
+ light_range=5
+ light_color="#ff0000"
spawnable=list(
/mob/living/simple_animal/hostile/scarybat/cult,
/mob/living/simple_animal/hostile/creature/cult,
diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm
index 965d2548f7..154078de3d 100644
--- a/code/game/gamemodes/cult/cultify/mob.dm
+++ b/code/game/gamemodes/cult/cultify/mob.dm
@@ -43,7 +43,7 @@
narsimage = image('icons/obj/narsie.dmi',src.loc,"narsie",9,1)
narsimage.mouse_opacity = 0
if(!narglow) //Create narglow
- narglow = image('icons/obj/narsie.dmi',narsimage.loc,"glow-narsie",LIGHTING_LAYER+2,1)
+ narglow = image('icons/obj/narsie.dmi',narsimage.loc,"glow-narsie",12,1)
narglow.mouse_opacity = 0
//Else if no dir is given, simply send them the image of narsie
var/new_x = 32 * (N.x - src.x) + N.pixel_x
diff --git a/code/game/gamemodes/cult/hell_universe.dm b/code/game/gamemodes/cult/hell_universe.dm
index 7a056deac2..9a7344f036 100644
--- a/code/game/gamemodes/cult/hell_universe.dm
+++ b/code/game/gamemodes/cult/hell_universe.dm
@@ -73,9 +73,8 @@ In short:
spess.overlays += I
/datum/universal_state/hell/proc/AmbientSet()
- for(var/turf/T in world)
- if(istype(T, /turf/space)) continue
- T.update_lumcount(1, 255, 0, 0, 0)
+ for(var/atom/movable/lighting_overlay/L in world)
+ L.update_lumcount(1, 0, 0)
/datum/universal_state/hell/proc/MiscSet()
for(var/turf/simulated/floor/T in world)
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
index 305205c6a0..d71ff249d1 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
@@ -8,7 +8,7 @@
//luminosity = 5
//l_color="#0066FF"
- layer = LIGHTING_LAYER+1
+ layer = 11
var/spawned=0 // DIR mask
var/next_check=0
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
index 62c8b1aa44..8c826fe22d 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
@@ -10,7 +10,7 @@
announce=0
narnar=0
- layer=LIGHTING_LAYER+2 // ITS SO BRIGHT
+ layer=12 // ITS SO BRIGHT
consume_range = 6
@@ -65,7 +65,7 @@
/mob/proc/see_rift(var/obj/singularity/narsie/large/exit/R)
if((R.z == src.z) && (get_dist(R,src) <= (R.consume_range+10)) && !(R in view(src)))
if(!riftimage)
- riftimage = image('icons/obj/rift.dmi',src.loc,"rift",LIGHTING_LAYER+2,1)
+ riftimage = image('icons/obj/rift.dmi',src.loc,"rift",12,1)
riftimage.mouse_opacity = 0
var/new_x = 32 * (R.x - src.x) + R.pixel_x
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
index e97cf0a0a4..37b68340a8 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
@@ -110,10 +110,9 @@ AUTOMATED ALERT: Link to [command_name()] lost."}
spess.overlays += "end01"
/datum/universal_state/supermatter_cascade/proc/AmbientSet()
- for(var/turf/T in world)
- if(istype(T, /turf/space)) continue
- if(!(T.z in config.admin_levels))
- T.update_lumcount(1, 160, 255, 0, 0)
+ for(var/atom/movable/lighting_overlay/L in world)
+ if(!(L.z in config.admin_levels))
+ L.update_lumcount(0.5, 1, 0)
/datum/universal_state/supermatter_cascade/proc/MiscSet()
for (var/obj/machinery/firealarm/alm in world)
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index 3d54f12e30..70740901fa 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -3,7 +3,7 @@
/obj/machinery/bot
icon = 'icons/obj/aibots.dmi'
layer = MOB_LAYER
- luminosity = 3
+ light_range = 3
use_power = 0
var/obj/item/weapon/card/id/botcard // the ID card that the bot "holds"
var/on = 1
@@ -18,12 +18,12 @@
/obj/machinery/bot/proc/turn_on()
if(stat) return 0
on = 1
- SetLuminosity(initial(luminosity))
+ set_light(initial(light_range))
return 1
/obj/machinery/bot/proc/turn_off()
on = 0
- SetLuminosity(0)
+ set_light(0)
/obj/machinery/bot/proc/explode()
qdel(src)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 5670ef2060..4a7aed5555 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -65,7 +65,7 @@
if(!isEmpProof())
if(prob(100/severity))
stat |= EMPED
- SetLuminosity(0)
+ set_light(0)
kick_viewers()
triggerCameraAlarm(30 / severity)
update_icon()
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 19ac77d2c7..374f0426ad 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -23,8 +23,8 @@
var/id = 1.0
dir = 1
explosion_resistance = 25
-
- //Most blast doors are infrequently toggled and sometimes used with regular doors anyways,
+
+ //Most blast doors are infrequently toggled and sometimes used with regular doors anyways,
//turning this off prevents awkward zone geometry in places like medbay lobby, for example.
block_air_zones = 0
@@ -56,7 +56,7 @@
src.density = 0
update_nearby_tiles()
src.update_icon()
- src.SetOpacity(0)
+ src.set_opacity(0)
sleep(15)
src.layer = open_layer
src.operating = 0
@@ -71,7 +71,7 @@
src.density = 1
update_nearby_tiles()
src.update_icon()
- src.SetOpacity(initial(opacity))
+ src.set_opacity(initial(opacity))
sleep(15)
src.operating = 0
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index b3dc9bf978..27ce595a77 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -35,11 +35,11 @@
..()
spawn(20)
- for(var/obj/machinery/door/window/brigdoor/M in world)
+ for(var/obj/machinery/door/window/brigdoor/M in machines)
if (M.id == src.id)
targets += M
- for(var/obj/machinery/flasher/F in world)
+ for(var/obj/machinery/flasher/F in machines)
if(F.id == src.id)
targets += F
@@ -345,4 +345,4 @@
#undef FONT_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
-#undef CHARS_PER_LINE
\ No newline at end of file
+#undef CHARS_PER_LINE
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index e02be363f4..0f3760009d 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -394,14 +394,14 @@
do_animate("opening")
icon_state = "door0"
- src.SetOpacity(0)
+ set_opacity(0)
sleep(3)
src.density = 0
sleep(7)
src.layer = open_layer
explosion_resistance = 0
update_icon()
- SetOpacity(0)
+ set_opacity(0)
update_nearby_tiles()
operating = 0
@@ -427,7 +427,7 @@
sleep(7)
update_icon()
if(visible && !glass)
- SetOpacity(1) //caaaaarn!
+ set_opacity(1) //caaaaarn!
operating = 0
update_nearby_tiles()
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index d71b060bb0..b7272dc829 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -26,7 +26,7 @@
else
on = 0
updateicon()
- SetLuminosity(0)
+ set_light(0)
src.visible_message("[src] shuts down due to lack of power!")
return
@@ -50,7 +50,7 @@
if(on)
on = 0
user << "\blue You turn off the light"
- SetLuminosity(0)
+ set_light(0)
else
if(!cell)
return
@@ -58,7 +58,7 @@
return
on = 1
user << "\blue You turn on the light"
- SetLuminosity(brightness_on)
+ set_light(brightness_on)
updateicon()
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index db3dd6d585..28bb2be7bc 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -37,7 +37,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED
icon_state = "holopad0"
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
-
+
var/power_per_hologram = 500 //per usage per hologram
idle_power_usage = 5
use_power = 1
@@ -120,10 +120,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
hologram.anchored = 1//So space wind cannot drag it.
hologram.name = "[A.name] (Hologram)"//If someone decides to right click.
- hologram.SetLuminosity(2) //hologram lighting
+ hologram.set_light(2) //hologram lighting
hologram.color = color //painted holopad gives coloured holograms
masters[A] = hologram
- SetLuminosity(2) //pad lighting
+ set_light(2) //pad lighting
icon_state = "holopad1"
A.holo = src
return 1
@@ -134,7 +134,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
qdel(masters[user])//Get rid of user's hologram
masters -= user //Discard AI from the list of those who use holopad
if (!masters.len)//If no users left
- SetLuminosity(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
+ set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted)
icon_state = "holopad0"
return 1
@@ -144,11 +144,11 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if((stat & NOPOWER) || !active_ai)
clear_holo(master)
continue
-
+
if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range)))
clear_holo(master)
continue
-
+
if(HOLOPAD_MODE == AREA_BASED)
var/area/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 6d823e23fe..ff974fbe19 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -164,7 +164,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
var/c_locked=0; //Will our new channel be locked to public submissions?
var/hitstaken = 0 //Death at 3 hits from an item with force>=15
var/datum/feed_channel/viewing_channel = null
- luminosity = 0
+ light_range = 0
anchored = 1
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index a563806714..23aba34169 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -54,7 +54,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/message = "";
var/dpt = ""; //the department which will be receiving the message
var/priority = -1 ; //Priority of the message being sent
- luminosity = 0
+ light_range = 0
var/datum/announcement/announcement = new
/obj/machinery/requests_console/power_change()
@@ -176,7 +176,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if (Console.department == department)
Console.newmessagepriority = 0
Console.icon_state = "req_comp0"
- Console.luminosity = 1
+ Console.set_light(1)
newmessagepriority = 0
icon_state = "req_comp0"
for(var/msg in messages)
@@ -320,7 +320,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
Console.messages += "Message from [department]
[message]"
screen = 6
- Console.luminosity = 2
+ Console.set_light(2)
messages += "Message sent to [dpt]
[message]"
else
for (var/mob/O in hearers(4, src.loc))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 479d55cb8b..b0423340e7 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1004,8 +1004,8 @@
set popup_menu = 0
if(usr!=occupant) return
lights = !lights
- if(lights) SetLuminosity(luminosity + lights_power)
- else SetLuminosity(luminosity - lights_power)
+ if(lights) set_light(light_range + lights_power)
+ else set_light(light_range - lights_power)
src.occupant_message("Toggled lights [lights?"on":"off"].")
log_message("Toggled lights [lights?"on":"off"].")
return
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index e6b166792f..6882f9affa 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -164,7 +164,7 @@
name = "purple sac"
desc = "Weird purple octopus-like thing."
layer = 3
- luminosity = NODERANGE
+ light_range = NODERANGE
var/node_range = NODERANGE
/obj/effect/alien/weeds/node/New()
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 74e2fa951f..c70a5ab9fc 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -58,7 +58,7 @@
density = 0
anchored = 1
layer = 2
- luminosity = 1
+ light_range = 1
icon = 'icons/effects/effects.dmi'
icon_state = "greenglow"
@@ -142,4 +142,4 @@
layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
- random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
\ No newline at end of file
+ random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 29eb08f487..ecd4904df7 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -244,7 +244,7 @@ steam.start() -- spawns the effect
/obj/effect/effect/smoke/illumination/New(var/newloc, var/brightness=15, var/lifetime=10)
time_to_live=lifetime
..()
- SetLuminosity(brightness)
+ set_light(brightness)
/////////////////////////////////////////////
// Bad smoke
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 336ee0386d..aac0b7d56a 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -37,4 +37,4 @@
name = "Bluespace"
icon = 'icons/turf/space.dmi'
icon_state = "bluespacify"
- layer = LIGHTING_LAYER
+ layer = 10
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 32f05901b4..58c053aa66 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -68,8 +68,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
- var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit
- lighting_controller.processing = 0
+// var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit
+// lighting_controller.processing = 0
var/approximate_intensity = (devastation_range * 3) + (heavy_impact_range * 2) + light_impact_range
@@ -87,8 +87,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/y0 = epicenter.y
var/z0 = epicenter.z
- for(var/turf/T in range(epicenter, max_range))
- var/dist = cheap_pythag(T.x - x0,T.y - y0)
+ for(var/turf/T in trange(max_range, epicenter))
+ var/dist = sqrt((T.x - x0)**2 + (T.y - y0)**2)
if(dist < devastation_range) dist = 1
else if(dist < heavy_impact_range) dist = 2
@@ -99,7 +99,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(T)
for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway
var/atom/movable/AM = atom_movable
- if(AM) AM.ex_act(dist)
+ if(AM && AM.simulated) AM.ex_act(dist)
var/took = (world.timeofday-start)/10
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
@@ -113,7 +113,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
sleep(8)
- if(!lighting_controller.processing) lighting_controller.processing = lighting_controller_was_processing
+// if(!lighting_controller.processing) lighting_controller.processing = lighting_controller_was_processing
if(!powernet_rebuild_was_deferred_already && defer_powernet_rebuild)
makepowernets()
defer_powernet_rebuild = 0
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 85d34c6a28..57fb2d647c 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -121,7 +121,6 @@ move an amendment to the drawing.
return
var/area/A = new
A.name = str
- A.tagbase = "[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
//var/ma
//ma = A.master ? "[A.master]" : "(null)"
//world << "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
@@ -132,9 +131,6 @@ move an amendment to the drawing.
move_turfs_to_area(turfs, A)
A.always_unpowered = 0
- for(var/turf/T in A.contents)
- T.lighting_changed = 1
- lighting_controller.changed_turfs += T
spawn(5)
//ma = A.master ? "[A.master]" : "(null)"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index c7421f9397..9979b66ce2 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -308,15 +308,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
/*
* The Actual PDA
*/
-/obj/item/device/pda/pickup(mob/user)
- if(fon)
- SetLuminosity(0)
- user.SetLuminosity(user.luminosity + f_lum)
-
-/obj/item/device/pda/dropped(mob/user)
- if(fon)
- user.SetLuminosity(user.luminosity - f_lum)
- SetLuminosity(f_lum)
/obj/item/device/pda/New()
..()
@@ -644,12 +635,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
if("Light")
if(fon)
fon = 0
- if(src in U.contents) U.SetLuminosity(U.luminosity - f_lum)
- else SetLuminosity(0)
+ set_light(0)
else
fon = 1
- if(src in U.contents) U.SetLuminosity(U.luminosity + f_lum)
- else SetLuminosity(f_lum)
+ set_light(f_lum)
if("Medical Scan")
if(scanmode == 1)
scanmode = 0
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index fb3edec873..36cd50ce2d 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -18,24 +18,17 @@
..()
if(on)
icon_state = "[initial(icon_state)]-on"
- SetLuminosity(brightness_on)
+ set_light(brightness_on)
else
icon_state = initial(icon_state)
- SetLuminosity(0)
+ set_light(0)
/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
if(on)
icon_state = "[initial(icon_state)]-on"
- if(loc == user)
- user.SetLuminosity(user.luminosity + brightness_on)
- else if(isturf(loc))
- SetLuminosity(brightness_on)
+ set_light(brightness_on)
else
- icon_state = initial(icon_state)
- if(loc == user)
- user.SetLuminosity(user.luminosity - brightness_on)
- else if(isturf(loc))
- SetLuminosity(0)
+ set_light(0)
/obj/item/device/flashlight/attack_self(mob/user)
if(!isturf(user.loc))
@@ -88,19 +81,6 @@
else
return ..()
-
-/obj/item/device/flashlight/pickup(mob/user)
- if(on)
- user.SetLuminosity(user.luminosity + brightness_on)
- SetLuminosity(0)
-
-
-/obj/item/device/flashlight/dropped(mob/user)
- if(on)
- user.SetLuminosity(user.luminosity - brightness_on)
- SetLuminosity(brightness_on)
-
-
/obj/item/device/flashlight/pen
name = "penlight"
desc = "A pen-sized light, used by medical staff."
@@ -217,7 +197,7 @@
on = 1 //Bio-luminesence has one setting, on.
/obj/item/device/flashlight/slime/New()
- SetLuminosity(brightness_on)
+ set_light(brightness_on)
spawn(1) //Might be sloppy, but seems to be necessary to prevent further runtimes and make these work as intended... don't judge me!
update_brightness()
icon_state = initial(icon_state)
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 020b1a83f0..e9c3687fe4 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -140,7 +140,9 @@
var/obj/item/weapon/light/L1 = new target.light_type(target.loc)
L1.status = target.status
L1.rigged = target.rigged
- L1.brightness = target.brightness
+ L1.brightness_range = target.brightness_range
+ L1.brightness_power = target.brightness_power
+ L1.brightness_color = target.brightness_color
L1.switchcount = target.switchcount
target.switchcount = 0
L1.update()
@@ -153,7 +155,9 @@
target.status = L2.status
target.switchcount = L2.switchcount
target.rigged = emagged
- target.brightness = L2.brightness
+ target.brightness_range = L2.brightness_range
+ target.brightness_power = L2.brightness_power
+ target.brightness_color = L2.brightness_color
target.on = target.has_power()
target.update()
qdel(L2)
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index a8cb707685..623c57be89 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -52,7 +52,7 @@
anchored = 0
mode = 0
src.visible_message("[user] detaches [src] from the cable!")
- SetLuminosity(0)
+ set_light(0)
icon_state = "powersink0"
return
@@ -74,7 +74,7 @@
if(2) //This switch option wasn't originally included. It exists now. --NeoFite
src.visible_message("[user] deactivates [src]!")
mode = 1
- SetLuminosity(0)
+ set_light(0)
icon_state = "powersink0"
processing_objects.Remove(src)
@@ -91,7 +91,7 @@
if(!PN)
return
- SetLuminosity(12)
+ set_light(12)
PN.trigger_warning()
// found a powernet, so drain up to max power from it
drained = PN.draw_power(drain_rate)
@@ -124,4 +124,4 @@
if(attached && attached.powernet)
PN = attached.powernet
else
- PN = null
\ No newline at end of file
+ PN = null
diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm
index 9bbdd1380d..3141779884 100644
--- a/code/game/objects/items/weapons/candle.dm
+++ b/code/game/objects/items/weapons/candle.dm
@@ -48,7 +48,7 @@
//src.damtype = "fire"
for(var/mob/O in viewers(usr, null))
O.show_message(flavor_text, 1)
- SetLuminosity(CANDLE_LUM)
+ set_light(CANDLE_LUM)
processing_objects.Add(src)
@@ -66,22 +66,8 @@
var/turf/T = loc
T.hotspot_expose(700, 5)
-
/obj/item/weapon/flame/candle/attack_self(mob/user as mob)
if(lit)
lit = 0
update_icon()
- SetLuminosity(0)
- user.SetLuminosity(user.luminosity - CANDLE_LUM)
-
-
-/obj/item/weapon/flame/candle/pickup(mob/user)
- if(lit)
- SetLuminosity(0)
- user.SetLuminosity(user.luminosity + CANDLE_LUM)
-
-
-/obj/item/weapon/flame/candle/dropped(mob/user)
- if(lit)
- user.SetLuminosity(user.luminosity - CANDLE_LUM)
- SetLuminosity(CANDLE_LUM)
\ No newline at end of file
+ set_light(0)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 15b43d63e0..304131d736 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -176,7 +176,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
M.update_inv_l_hand(0)
M.update_inv_r_hand(1)
processing_objects.Remove(src)
-
+
/obj/item/clothing/mask/smokable/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(isflamesource(W))
@@ -221,7 +221,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(istype(W, /obj/item/weapon/melee/energy/sword))
var/obj/item/weapon/melee/energy/sword/S = W
if(S.active)
- light("[user] swings their [W], barely missing their nose. They light their [name] in the process.")
+ light("[user] swings their [W], barely missing their nose. They light their [name] in the process.")
return
@@ -456,7 +456,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.apply_damage(2,BURN,"r_hand")
user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
- user.SetLuminosity(user.luminosity + 2)
+ set_light(2)
processing_objects.Add(src)
else
lit = 0
@@ -467,7 +467,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
user.visible_message("[user] quietly shuts off the [src].")
- user.SetLuminosity(user.luminosity - 2)
+ set_light(0)
processing_objects.Remove(src)
else
return ..()
@@ -496,17 +496,3 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(location)
location.hotspot_expose(700, 5)
return
-
-
-/obj/item/weapon/flame/lighter/pickup(mob/user)
- if(lit)
- SetLuminosity(0)
- user.SetLuminosity(user.luminosity+2)
- return
-
-
-/obj/item/weapon/flame/lighter/dropped(mob/user)
- if(lit)
- user.SetLuminosity(user.luminosity-2)
- SetLuminosity(2)
- return
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index a37ccd6c65..4b0501a2d1 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -7,8 +7,6 @@
var/list/climbers = list()
/obj/structure/Destroy()
- if(opacity)
- UpdateAffectingLights()
if(parts)
new parts(loc)
..()
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 186f1debac..7690a2d11e 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -62,7 +62,7 @@
flick("[mineral]fwall_opening", src)
sleep(15)
src.density = 0
- SetOpacity(0)
+ set_opacity(0)
opening = 0
else
opening = 1
@@ -70,7 +70,7 @@
icon_state = "[mineral]0"
density = 1
sleep(15)
- SetOpacity(1)
+ set_opacity(1)
src.relativewall()
opening = 0
@@ -186,7 +186,7 @@
flick("frwall_opening", src)
sleep(15)
density = 0
- SetOpacity(0)
+ set_opacity(0)
opening = 0
else
opening = 1
@@ -194,7 +194,7 @@
flick("frwall_closing", src)
density = 1
sleep(15)
- SetOpacity(1)
+ set_opacity(1)
relativewall()
opening = 0
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index d0a60d2a3e..ecd2d823db 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -168,7 +168,7 @@
/obj/structure/mineral_door/uranium
mineralType = "uranium"
hardness = 3
- luminosity = 2
+ light_range = 2
/obj/structure/mineral_door/sandstone
mineralType = "sandstone"
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 36d5bcc657..387c76eb69 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -479,10 +479,10 @@
/obj/structure/window/reinforced/polarized/proc/toggle()
if(opacity)
animate(src, color="#FFFFFF", time=5)
- SetOpacity(0)
+ set_opacity(0)
else
animate(src, color="#222222", time=5)
- SetOpacity(1)
+ set_opacity(1)
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 3c6e434b8c..0f5d49d223 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -26,18 +26,14 @@ var/list/mechtoys = list(
/obj/item/weapon/paper/manifest
name = "supply manifest"
-/area/supply/station //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS.
+/area/supply/station
name = "Supply Shuttle"
icon_state = "shuttle3"
- luminosity = 1
- lighting_use_dynamic = 0
requires_power = 0
-/area/supply/dock //DO NOT TURN THE lighting_use_dynamic STUFF ON FOR SHUTTLES. IT BREAKS THINGS.
+/area/supply/dock
name = "Supply Shuttle"
icon_state = "shuttle3"
- luminosity = 1
- lighting_use_dynamic = 0
requires_power = 0
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 9541e67116..cefccdc46f 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -133,19 +133,19 @@ turf/simulated/floor/proc/update_icon()
switch(get_lightfloor_state())
if(LIGHTFLOOR_STATE_OK)
icon_state = "light_on"
- SetLuminosity(5)
+ set_light(5)
if(LIGHTFLOOR_STATE_FLICKER)
var/num = pick("1","2","3","4")
icon_state = "light_on_flicker[num]"
- SetLuminosity(5)
+ set_light(5)
if(LIGHTFLOOR_STATE_BREAKING)
icon_state = "light_on_broken"
- SetLuminosity(5)
+ set_light(5)
if(LIGHTFLOOR_STATE_BROKEN)
icon_state = "light_off"
- SetLuminosity(0)
+ set_light(0)
else
- SetLuminosity(0)
+ set_light(0)
icon_state = "light_off"
else if(is_grass_floor())
if(!broken && !burnt)
@@ -339,7 +339,7 @@ turf/simulated/floor/proc/update_icon()
if(!floor_type) return
icon_plating = "plating"
- SetLuminosity(0)
+ set_light(0)
floor_type = null
intact = 0
broken = 0
@@ -355,7 +355,7 @@ turf/simulated/floor/proc/update_icon()
broken = 0
burnt = 0
intact = 1
- SetLuminosity(0)
+ set_light(0)
if(T)
if(istype(T,/obj/item/stack/tile/plasteel))
floor_type = T.type
diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm
index b036df007a..450352f9b5 100644
--- a/code/game/turfs/simulated/floor_types.dm
+++ b/code/game/turfs/simulated/floor_types.dm
@@ -14,7 +14,7 @@
/turf/simulated/floor/light
name = "Light floor"
- luminosity = 5
+ light_range = 5
icon_state = "light_on"
floor_type = /obj/item/stack/tile/light
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index bfd7548276..d8db07de58 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -6,6 +6,7 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" =
icon = 'icons/turf/space.dmi'
name = "\proper space"
icon_state = "0"
+ dynamic_lighting = 0
temperature = T20C
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
@@ -20,9 +21,9 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" =
if(!config.starlight)
return
if(locate(/turf/simulated) in orange(src,1))
- SetLuminosity(config.starlight)
+ set_light(config.starlight)
else
- SetLuminosity(0)
+ set_light(0)
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 98f56361fe..05fc4cd2db 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -32,6 +32,8 @@
// holy water
var/holy = 0
+ var/dynamic_lighting = 1
+
/turf/New()
..()
for(var/atom/movable/AM as mob|obj in src)
@@ -218,8 +220,10 @@
return W
///// Z-Level Stuff
- var/old_lumcount = lighting_lumcount - initial(lighting_lumcount)
var/obj/fire/old_fire = fire
+ var/old_opacity = opacity
+ var/old_dynamic_lighting = dynamic_lighting
+ var/list/old_affecting_lights = affecting_lights
//world << "Replacing [src.type] with [N]"
@@ -237,11 +241,6 @@
var/turf/simulated/W = new N( locate(src.x, src.y, src.z) )
//W.Assimilate_Air()
- W.lighting_lumcount += old_lumcount
- if((old_lumcount != W.lighting_lumcount) || (loc.name != "Space" && force_lighting_update))
- W.lighting_changed = 1
- lighting_controller.changed_turfs += W
-
if(old_fire)
fire = old_fire
@@ -258,15 +257,11 @@
S.update_starlight()
W.levelupdate()
- return W
+ . = W
else
var/turf/W = new N( locate(src.x, src.y, src.z) )
- W.lighting_lumcount += old_lumcount
- if((old_lumcount != W.lighting_lumcount) || (loc.name != "Space" && force_lighting_update))
- W.lighting_changed = 1
- lighting_controller.changed_turfs += W
if(old_fire)
old_fire.RemoveFire()
@@ -281,7 +276,16 @@
S.update_starlight()
W.levelupdate()
- return W
+ . = W
+
+ affecting_lights = old_affecting_lights
+ if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting) || force_lighting_update)
+ reconsider_lights()
+ if(dynamic_lighting != old_dynamic_lighting)
+ if(dynamic_lighting)
+ lighting_build_overlays()
+ else
+ lighting_clear_overlays()
//Commented out by SkyMarshal 5/10/13 - If you are patching up space, it should be vacuum.
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index a6b4bf7d16..87827dcf4b 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -208,8 +208,8 @@
O.vars[variable]) as num|null
if(new_value == null) return
- if(variable=="luminosity")
- O.SetLuminosity(new_value)
+ if(variable=="light_range")
+ O.set_light(new_value)
else
O.vars[variable] = new_value
@@ -217,24 +217,24 @@
if(istype(O, /mob))
for(var/mob/M in mob_list)
if ( istype(M , O.type) )
- if(variable=="luminosity")
- M.SetLuminosity(new_value)
+ if(variable=="light_range")
+ M.set_light(new_value)
else
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if ( istype(A , O.type) )
- if(variable=="luminosity")
- A.SetLuminosity(new_value)
+ if(variable=="light_range")
+ A.set_light(new_value)
else
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if ( istype(A , O.type) )
- if(variable=="luminosity")
- A.SetLuminosity(new_value)
+ if(variable=="light_range")
+ A.set_light(new_value)
else
A.vars[variable] = O.vars[variable]
@@ -242,24 +242,24 @@
if(istype(O, /mob))
for(var/mob/M in mob_list)
if (M.type == O.type)
- if(variable=="luminosity")
- M.SetLuminosity(new_value)
+ if(variable=="light_range")
+ M.set_light(new_value)
else
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
if (A.type == O.type)
- if(variable=="luminosity")
- A.SetLuminosity(new_value)
+ if(variable=="light_range")
+ A.set_light(new_value)
else
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
if (A.type == O.type)
- if(variable=="luminosity")
- A.SetLuminosity(new_value)
+ if(variable=="light_range")
+ A.set_light(new_value)
else
A.vars[variable] = O.vars[variable]
@@ -372,4 +372,4 @@
A.vars[variable] = O.vars[variable]
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
- message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
\ No newline at end of file
+ message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index fce2aa59dc..bdff5fb73a 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -455,10 +455,10 @@ var/list/forbidden_varedit_object_types = list(
O.vars[variable] = var_new
if("num")
- if(variable=="luminosity")
+ if(variable=="light_range")
var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num
if(var_new == null) return
- O.SetLuminosity(var_new)
+ O.set_light(var_new)
else if(variable=="stat")
var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num
if(var_new == null) return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 527f596f54..69d44bf89b 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -264,37 +264,19 @@ BLIND // can't see anything
return
on = !on
user << "You [on ? "enable" : "disable"] the helmet light."
- update_light(user)
+ update_flashlight(user)
else
return ..(user)
-/obj/item/clothing/head/proc/update_light(var/mob/user = null)
+/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null)
if(on && !light_applied)
- if(loc == user)
- user.SetLuminosity(user.luminosity + brightness_on)
- SetLuminosity(brightness_on)
+ set_light(brightness_on)
light_applied = 1
else if(!on && light_applied)
- if(loc == user)
- user.SetLuminosity(user.luminosity - brightness_on)
- SetLuminosity(0)
+ set_light(0)
light_applied = 0
update_icon(user)
-/obj/item/clothing/head/equipped(mob/user)
- ..()
- spawn(1)
- if(on && loc == user && !light_applied)
- user.SetLuminosity(user.luminosity + brightness_on)
- light_applied = 1
-
-/obj/item/clothing/head/dropped(mob/user)
- ..()
- spawn(1)
- if(on && loc != user && light_applied)
- user.SetLuminosity(user.luminosity - brightness_on)
- light_applied = 0
-
/obj/item/clothing/head/update_icon(var/mob/user)
overlays.Cut()
@@ -308,18 +290,6 @@ BLIND // can't see anything
var/mob/living/carbon/human/H = user
H.update_inv_head()
-/obj/item/clothing/head/equipped(mob/user)
- ..()
- update_light(user)
-
-/obj/item/clothing/head/pickup(mob/user)
- ..()
- update_light(user)
-
-/obj/item/clothing/head/dropped(mob/user)
- ..()
- update_light(user)
-
/obj/item/clothing/head/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index cae036d937..1dabe9f345 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -400,7 +400,7 @@
/mob/living/simple_animal/hostile/carp/holodeck/New()
..()
- SetLuminosity(2) //hologram lighting
+ set_light(2) //hologram lighting
/mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe)
if (safe)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 1d21c04932..2f6dc0ad73 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -341,9 +341,6 @@
..()
if(!seed)
return
- if(seed.get_trait(TRAIT_BIOLUM))
- user.SetLuminosity(user.luminosity + seed.get_trait(TRAIT_BIOLUM))
- SetLuminosity(0)
if(seed.get_trait(TRAIT_STINGS))
var/mob/living/carbon/human/H = user
if(istype(H) && H.gloves)
@@ -354,12 +351,6 @@
seed.do_thorns(H,src)
seed.do_sting(H,src,pick("r_hand","l_hand"))
-/obj/item/weapon/reagent_containers/food/snacks/grown/dropped(mob/user)
- ..()
- if(seed && seed.get_trait(TRAIT_BIOLUM))
- user.SetLuminosity(user.luminosity - seed.get_trait(TRAIT_BIOLUM))
- SetLuminosity(seed.get_trait(TRAIT_BIOLUM))
-
// Predefined types for placing on the map.
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index a92e237eeb..9fd666fbb6 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -165,9 +165,10 @@
if(!istype(splat)) // Plants handle their own stuff.
splat.name = "[thrown.name] [pick("smear","smudge","splatter")]"
if(get_trait(TRAIT_BIOLUM))
+ var/clr
if(get_trait(TRAIT_BIOLUM_COLOUR))
- splat.l_color = get_trait(TRAIT_BIOLUM_COLOUR)
- splat.SetLuminosity(get_trait(TRAIT_BIOLUM))
+ clr = get_trait(TRAIT_BIOLUM_COLOUR)
+ splat.set_light(get_trait(TRAIT_BIOLUM), l_color = clr)
if(get_trait(TRAIT_PRODUCT_COLOUR))
splat.color = get_trait(TRAIT_PRODUCT_COLOUR)
@@ -276,12 +277,11 @@
// Handle light requirements.
if(!light_supplied)
- var/area/A = get_area(current_turf)
- if(A)
- if(A.lighting_use_dynamic)
- light_supplied = max(0,min(10,current_turf.lighting_lumcount)-5)
- else
- light_supplied = 5
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in current_turf
+ if(L)
+ light_supplied = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ else
+ light_supplied = 5
if(light_supplied)
if(abs(light_supplied - get_trait(TRAIT_IDEAL_LIGHT)) > get_trait(TRAIT_LIGHT_TOLERANCE))
health_change += rand(1,3) * HYDRO_SPEED_MULTIPLIER
@@ -696,9 +696,10 @@
product.desc += " On second thought, something about this one looks strange."
if(get_trait(TRAIT_BIOLUM))
+ var/clr
if(get_trait(TRAIT_BIOLUM_COLOUR))
- product.l_color = get_trait(TRAIT_BIOLUM_COLOUR)
- product.SetLuminosity(get_trait(TRAIT_BIOLUM))
+ clr = get_trait(TRAIT_BIOLUM_COLOUR)
+ product.set_light(get_trait(TRAIT_BIOLUM), l_color = clr)
//Handle spawning in living, mobile products (like dionaea).
if(istype(product,/mob/living))
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index 004baf6797..09cf13bad2 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -145,14 +145,13 @@
color = icon_colour
// Apply colour and light from seed datum.
if(seed.get_trait(TRAIT_BIOLUM))
- SetLuminosity(1+round(seed.get_trait(TRAIT_POTENCY)/20))
+ var/clr
if(seed.get_trait(TRAIT_BIOLUM_COLOUR))
- l_color = seed.get_trait(TRAIT_BIOLUM_COLOUR)
- else
- l_color = null
+ clr = seed.get_trait(TRAIT_BIOLUM_COLOUR)
+ set_light(1+round(seed.get_trait(TRAIT_POTENCY)/20), l_color = clr)
return
else
- SetLuminosity(0)
+ set_light(0)
/obj/effect/plant/proc/refresh_icon()
var/growth = min(max_growth,round(health/growth_threshold))
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index f8b7a82be4..ea20f2c0e3 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -350,7 +350,7 @@
usr << "There is no label to remove."
return
-/obj/machinery/portable_atmospherics/hydroponics/verb/set_light()
+/obj/machinery/portable_atmospherics/hydroponics/verb/setlight()
set name = "Set Light"
set category = "Object"
set src in view(1)
@@ -596,13 +596,12 @@
if(closed_system && mechanical)
light_string = "that the internal lights are set to [tray_light] lumens"
else
- var/area/A = T.loc
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
var/light_available
- if(A)
- if(A.lighting_use_dynamic)
- light_available = max(0,min(10,T.lighting_lumcount)-5)
- else
- light_available = 5
+ if(L)
+ light_available = max(0,min(10,L.lum_r + L.lum_g + L.lum_b)-5)
+ else
+ light_available = 5
light_string = "a light level of [light_available] lumens"
usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K."
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index 54c2380bcf..1ad67c6d2e 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -16,7 +16,7 @@
..()
verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb
verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/remove_label
- verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/set_light
+ verbs -= /obj/machinery/portable_atmospherics/hydroponics/verb/setlight
/obj/machinery/portable_atmospherics/hydroponics/soil/CanPass()
return 1
diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm
index 61e19632ea..7f31a06477 100644
--- a/code/modules/hydroponics/trays/tray_update_icons.dm
+++ b/code/modules/hydroponics/trays/tray_update_icons.dm
@@ -73,12 +73,11 @@
// Update bioluminescence.
if(seed)
if(seed.get_trait(TRAIT_BIOLUM))
- SetLuminosity(round(seed.get_trait(TRAIT_POTENCY)/10))
+ var/clr
if(seed.get_trait(TRAIT_BIOLUM_COLOUR))
- l_color = seed.get_trait(TRAIT_BIOLUM_COLOUR)
- else
- l_color = null
+ clr = seed.get_trait(TRAIT_BIOLUM_COLOUR)
+ set_light(round(seed.get_trait(TRAIT_POTENCY)/10), l_color = clr)
return
- SetLuminosity(0)
- return
\ No newline at end of file
+ set_light(0)
+ return
diff --git a/code/modules/lighting/__lighting_docs.dm b/code/modules/lighting/__lighting_docs.dm
new file mode 100644
index 0000000000..6ad0e32cdb
--- /dev/null
+++ b/code/modules/lighting/__lighting_docs.dm
@@ -0,0 +1,67 @@
+/*
+BS12 object based lighting system
+*/
+
+/*
+Changes from tg DAL:
+ - Lighting is done using objects instead of subareas.
+ - Animated transitions. (newer tg DAL has this)
+ - Full colours with mixing.
+ - Support for lights on shuttles.
+
+ - Code:
+ - Instead of one flat luminosity var, light is represented by 3 atom vars:
+ - light_range; range in tiles of the light, used for calculating falloff,
+ - light_power; multiplier for the brightness of lights,
+ - light_color; hex string representing the RGB colour of the light.
+ - SetLuminosity() is now set_light() and takes the three variables above.
+ - Variables can be left as null to not update them.
+ - SetOpacity() is now set_opacity().
+ - Areas have luminosity set to 1 permanently, no hard-lighting.
+ - Objects inside other objects can have lights and they properly affect the turf. (flashlights)
+ - area/master and area/list/related have been eviscerated since subareas aren't needed.
+*/
+
+/*
+Relevant vars/procs:
+
+atom: (lighting_atom.dm)
+ - var/light_range; range in tiles of the light, used for calculating falloff
+ - var/light_power; multiplier for the brightness of lights
+ - var/light_color; hex string representing the RGB colour of the light
+
+ - var/datum/light_source/light; light source datum for this atom, only present if light_range && light_power
+ - var/list/light_sources; light sources in contents that are shining through this object, including this object
+
+ - proc/set_light(l_range, l_power, l_color):
+ - Sets light_range/power/color to non-null args and calls update_light()
+ - proc/set_opacity(new_opacity):
+ - Sets opacity to new_opacity.
+ - If opacity has changed, call turf.reconsider_lights() to fix light occlusion
+ - proc/update_light():
+ - Updates the light var on this atom, deleting or creating as needed and calling .update()
+
+
+turf: (lighting_turf.dm)
+ - var/list/affecting_lights; list of light sources that are shining onto this turf
+
+ - proc/reconsider_lights():
+ - Force all light sources shining onto this turf to update
+
+ - proc/lighting_clear_overlays():
+ - Delete (manual GC) all light overlays on this turf, used when changing turf to space
+ - proc/lighting_build_overlays():
+ - Create lighting overlays for this turf
+
+
+atom/movable/lighting_overlay: (lighting_overlay.dm)
+ - var/lum_r, var/lum_g, var/lum_b; lumcounts of each colour
+ - var/needs_update; set on update_lumcount, checked by lighting process
+
+ - var/xoffset, var/yoffset; (only present when using sub-tile overlays) fractional offset of this overlay in the tile
+
+ - proc/update_lumcount(delta_r, delta_g, delta_b):
+ - Change the lumcount vars and queue the overlay for update
+ - proc/update_overlay()
+ - Called by the lighting process to update the color of the overlay
+*/
diff --git a/code/modules/lighting/_lighting_defs.dm b/code/modules/lighting/_lighting_defs.dm
new file mode 100644
index 0000000000..a913c97e21
--- /dev/null
+++ b/code/modules/lighting/_lighting_defs.dm
@@ -0,0 +1,10 @@
+#define LIGHTING_INTERVAL 5 // frequency, in 1/10ths of a second, of the lighting process
+
+#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square
+#define LIGHTING_LAMBERTIAN 1 // use lambertian shading for light sources
+#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
+#define LIGHTING_TRANSITIONS 1 // smooth, animated transitions, similar to /tg/station
+
+#define LIGHTING_RESOLUTION 1 // resolution of the lighting overlays, powers of 2 only, max of 32
+#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
+#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
new file mode 100644
index 0000000000..6322446204
--- /dev/null
+++ b/code/modules/lighting/light_source.dm
@@ -0,0 +1,169 @@
+/datum/light_source
+ var/atom/top_atom
+ var/atom/source_atom
+
+ var/turf/source_turf
+ var/light_power
+ var/light_range
+ var/light_color // string, decomposed by parse_light_color()
+
+ var/lum_r
+ var/lum_g
+ var/lum_b
+
+ var/list/effect_r
+ var/list/effect_g
+ var/list/effect_b
+ var/list/effect_turf
+
+ var/applied
+
+ var/needs_update
+ var/destroyed
+ var/force_update
+
+/datum/light_source/New(atom/owner, atom/top)
+ source_atom = owner
+ if(!source_atom.light_sources) source_atom.light_sources = list()
+ source_atom.light_sources += src
+ top_atom = top
+ if(top_atom != source_atom)
+ if(!top.light_sources) top.light_sources = list()
+ top_atom.light_sources += src
+
+ source_turf = top_atom
+ light_power = source_atom.light_power
+ light_range = source_atom.light_range
+ light_color = source_atom.light_color
+
+ parse_light_color()
+
+ effect_r = list()
+ effect_g = list()
+ effect_b = list()
+ effect_turf = list()
+
+ update()
+
+ return ..()
+
+/datum/light_source/proc/destroy()
+ destroyed = 1
+ force_update()
+ if(source_atom) source_atom.light_sources -= src
+ if(top_atom) top_atom.light_sources -= src
+
+/datum/light_source/proc/update(atom/new_top_atom)
+ if(new_top_atom && new_top_atom != top_atom)
+ if(top_atom != source_atom) top_atom.light_sources -= src
+ top_atom = new_top_atom
+ if(top_atom != source_atom)
+ if(!top_atom.light_sources) top_atom.light_sources = list()
+ top_atom.light_sources += src
+ lighting_update_lights += src
+ needs_update = 1
+
+/datum/light_source/proc/force_update()
+ needs_update = 1
+ force_update = 1
+ lighting_update_lights += src
+
+/datum/light_source/proc/check()
+ if(!source_atom)
+ destroy()
+ return 1
+
+ if(!top_atom)
+ top_atom = source_atom
+ . = 1
+
+ if(istype(top_atom, /turf))
+ if(source_turf != top_atom)
+ source_turf = top_atom
+ . = 1
+ else if(top_atom.loc != source_turf)
+ source_turf = top_atom.loc
+ . = 1
+
+ if(source_atom.light_power != light_power)
+ light_power = source_atom.light_power
+ . = 1
+
+ if(source_atom.light_range != light_range)
+ light_range = source_atom.light_range
+ . = 1
+
+ if(source_atom.light_color != light_color)
+ light_color = source_atom.light_color
+ parse_light_color()
+ . = 1
+
+ if(light_range && light_power && !applied)
+ . = 1
+
+/datum/light_source/proc/parse_light_color()
+ if(light_color)
+ lum_r = GetRedPart(light_color) / 255
+ lum_g = GetGreenPart(light_color) / 255
+ lum_b = GetBluePart(light_color) / 255
+ else
+ lum_r = 1
+ lum_g = 1
+ lum_b = 1
+
+/datum/light_source/proc/falloff(atom/movable/lighting_overlay/O)
+ #if LIGHTING_FALLOFF == 1 // circular
+ #if LIGHTING_RESOLUTION == 1
+ . = (O.x - source_turf.x)**2 + (O.y - source_turf.y)**2 + LIGHTING_HEIGHT
+ #else
+ . = (O.x - source_turf.x + O.xoffset)**2 + (O.y - source_turf.y + O.yoffset)**2 + LIGHTING_HEIGHT
+ #endif
+
+ #if LIGHTING_LAMBERTIAN == 1
+ . = CLAMP01((1 - CLAMP01(sqrt(.) / light_range)) * (1 / (sqrt(. + 1))))
+ #else
+ . = 1 - CLAMP01(sqrt(.) / light_range)
+ #endif
+
+ #elif LIGHTING_FALLOFF == 2 // square
+ #if LIGHTING_RESOLUTION == 1
+ . = abs(O.x - source_turf.x) + abs(O.y - source_turf.y) + LIGHTING_HEIGHT
+ #else
+ . = abs(O.x - source_turf.x + O.xoffset) + abs(O.y - source_turf.y + O.yoffset) + LIGHTING_HEIGHT
+ #endif
+
+ #if LIGHTING_LAMBERTIAN == 1
+ . = CLAMP01((1 - CLAMP01(. / light_range)) * (1 / (sqrt(.)**2 + )))
+ #else
+ . = 1 - CLAMP01(. / light_range)
+ #endif
+ #endif
+
+/datum/light_source/proc/apply_lum()
+ applied = 1
+ if(istype(source_turf))
+ for(var/atom/movable/lighting_overlay/O in view(light_range, source_turf))
+ var/strength = light_power * falloff(O)
+
+ effect_r[O] = lum_r * strength
+ effect_g[O] = lum_g * strength
+ effect_b[O] = lum_b * strength
+
+ O.update_lumcount(lum_r * strength, lum_g * strength, lum_b * strength)
+ for(var/turf/T in view(light_range, source_turf))
+ if(!T.affecting_lights) T.affecting_lights = list()
+ T.affecting_lights += src
+ effect_turf += T
+
+/datum/light_source/proc/remove_lum()
+ applied = 0
+ for(var/atom/movable/lighting_overlay/O in effect_r)
+ O.update_lumcount(-effect_r[O], -effect_g[O], -effect_b[O])
+
+ for(var/turf/T in effect_turf)
+ if(T.affecting_lights) T.affecting_lights -= src
+
+ effect_r.Cut()
+ effect_g.Cut()
+ effect_b.Cut()
+ effect_turf.Cut()
diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm
new file mode 100644
index 0000000000..92500ecc1d
--- /dev/null
+++ b/code/modules/lighting/lighting_atom.dm
@@ -0,0 +1,81 @@
+/atom
+ var/light_power = 1 // intensity of the light
+ var/light_range = 0 // range in tiles of the light
+ var/light_color // RGB string representing the colour of the light
+
+ var/datum/light_source/light
+ var/list/light_sources
+
+/atom/proc/set_light(l_range, l_power, l_color)
+ if(l_power != null) light_power = l_power
+ if(l_range != null) light_range = l_range
+ if(l_color != null) light_color = l_color
+
+ update_light()
+
+/atom/proc/update_light()
+ if(!light_power || !light_range)
+ if(light)
+ light.destroy()
+ light = null
+ else
+ if(!istype(loc, /atom/movable))
+ . = src
+ else
+ . = loc
+
+ if(light)
+ light.update(.)
+ else
+ light = new /datum/light_source(src, .)
+
+/atom/New()
+ . = ..()
+ if(light_power && light_range)
+ update_light()
+
+/atom/Destroy()
+ if(light)
+ light.destroy()
+ light = null
+ return ..()
+
+/atom/movable/Destroy()
+ var/turf/T = loc
+ if(opacity && istype(T))
+ T.reconsider_lights()
+ return ..()
+
+/atom/movable/Move()
+ var/turf/old_loc = loc
+ . = ..()
+
+ if(loc != old_loc)
+ for(var/datum/light_source/L in light_sources)
+ L.source_atom.update_light()
+
+ var/turf/new_loc = loc
+ if(istype(old_loc) && opacity)
+ old_loc.reconsider_lights()
+
+ if(istype(new_loc) && opacity)
+ new_loc.reconsider_lights()
+
+/atom/proc/set_opacity(new_opacity)
+ var/old_opacity = opacity
+ opacity = new_opacity
+ var/turf/T = loc
+ if(old_opacity != new_opacity && istype(T))
+ T.reconsider_lights()
+
+/obj/item/equipped()
+ . = ..()
+ update_light()
+
+/obj/item/pickup()
+ . = ..()
+ update_light()
+
+/obj/item/dropped()
+ . = ..()
+ update_light()
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
new file mode 100644
index 0000000000..b75d8aec7f
--- /dev/null
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -0,0 +1,48 @@
+/atom/movable/lighting_overlay
+ name = ""
+ mouse_opacity = 0
+ simulated = 0
+ anchored = 1
+
+ icon = LIGHTING_ICON
+ layer = LIGHTING_LAYER
+ invisibility = INVISIBILITY_LIGHTING
+ blend_mode = BLEND_MULTIPLY
+ color = "#000000"
+
+ var/lum_r
+ var/lum_g
+ var/lum_b
+
+ #if LIGHTING_RESOLUTION != 1
+ var/xoffset
+ var/yoffset
+ #endif
+
+ var/needs_update
+
+/atom/movable/lighting_overlay/New()
+ . = ..()
+ verbs.Cut()
+
+/atom/movable/lighting_overlay/proc/update_lumcount(delta_r, delta_g, delta_b)
+ lum_r += delta_r
+ lum_g += delta_g
+ lum_b += delta_b
+
+ needs_update = 1
+ lighting_update_overlays += src
+
+/atom/movable/lighting_overlay/proc/update_overlay()
+ var/mx = max(lum_r, lum_g, lum_b)
+ . = 1 // factor
+ if(mx > 1)
+ . = 1/mx
+ #if LIGHTING_TRANSITIONS == 1
+ animate(src,
+ color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .),
+ LIGHTING_INTERVAL - 1
+ )
+ #else
+ color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .)
+ #endif
diff --git a/code/modules/lighting/lighting_process.dm b/code/modules/lighting/lighting_process.dm
new file mode 100644
index 0000000000..e2e422bd60
--- /dev/null
+++ b/code/modules/lighting/lighting_process.dm
@@ -0,0 +1,29 @@
+/datum/controller/process/lighting/setup()
+ name = "lighting"
+ schedule_interval = LIGHTING_INTERVAL
+
+ create_lighting_overlays()
+
+/datum/controller/process/lighting/doWork()
+ for(var/datum/light_source/L in lighting_update_lights)
+ if(L.needs_update)
+ if(L.destroyed)
+ L.remove_lum()
+ else if(L.check() || L.force_update)
+ L.remove_lum()
+ L.apply_lum()
+ L.force_update = 0
+ L.needs_update = 0
+
+ scheck()
+
+ lighting_update_lights.Cut()
+
+ for(var/atom/movable/lighting_overlay/O in lighting_update_overlays)
+ if(O.needs_update)
+ O.update_overlay()
+ O.needs_update = 0
+
+ scheck()
+
+ lighting_update_overlays.Cut()
diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm
new file mode 100644
index 0000000000..6177c81f8f
--- /dev/null
+++ b/code/modules/lighting/lighting_system.dm
@@ -0,0 +1,47 @@
+/var/list/lighting_update_lights = list()
+/var/list/lighting_update_overlays = list()
+
+/area/var/lighting_use_dynamic = 1
+
+// duplicates lots of code, but this proc needs to be as fast as possible.
+/proc/create_lighting_overlays(zlevel = 0)
+ var/state = "light[LIGHTING_RESOLUTION]"
+ var/area/A
+ if(zlevel == 0) // populate all zlevels
+ for(var/turf/T in world)
+ if(T.dynamic_lighting)
+ A = T.loc
+ if(A.lighting_use_dynamic)
+ #if LIGHTING_RESOLUTION == 1
+ var/atom/movable/lighting_overlay/O = new(T)
+ O.icon_state = state
+ #else
+ for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
+ for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
+ var/atom/movable/lighting_overlay/O = new(T)
+ O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
+ O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
+ O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.icon_state = state
+ #endif
+ else
+ for(var/x = 1; x <= world.maxx; x++)
+ for(var/y = 1; y <= world.maxy; y++)
+ var/turf/T = locate(x, y, zlevel)
+ if(T.dynamic_lighting)
+ A = T.loc
+ if(A.lighting_use_dynamic)
+ #if LIGHTING_RESOLUTION == 1
+ var/atom/movable/lighting_overlay/O = new(T)
+ O.icon_state = state
+ #else
+ for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
+ for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
+ var/atom/movable/lighting_overlay/O = new(T)
+ O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
+ O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
+ O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.icon_state = state
+ #endif
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
new file mode 100644
index 0000000000..266e4b1d79
--- /dev/null
+++ b/code/modules/lighting/lighting_turf.dm
@@ -0,0 +1,29 @@
+/turf
+ var/list/affecting_lights
+
+/turf/proc/reconsider_lights()
+ for(var/datum/light_source/L in affecting_lights)
+ L.force_update()
+
+/turf/proc/lighting_clear_overlays()
+ for(var/atom/movable/lighting_overlay/L in src)
+ L.loc = null
+
+/turf/proc/lighting_build_overlays()
+ if(!locate(/atom/movable/lighting_overlay) in src)
+ var/state = "light[LIGHTING_RESOLUTION]"
+ var/area/A = loc
+ if(A.lighting_use_dynamic)
+ #if LIGHTING_RESOLUTION == 1
+ var/atom/movable/lighting_overlay/O = new(src)
+ O.icon_state = state
+ #else
+ for(var/i = 0; i < LIGHTING_RESOLUTION; i++)
+ for(var/j = 0; j < LIGHTING_RESOLUTION; j++)
+ var/atom/movable/lighting_overlay/O = new(src)
+ O.pixel_x = i * (32 / LIGHTING_RESOLUTION)
+ O.pixel_y = j * (32 / LIGHTING_RESOLUTION)
+ O.xoffset = (((2*i + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.yoffset = (((2*j + 1) / (LIGHTING_RESOLUTION * 2)) - 0.5)
+ O.icon_state = state
+ #endif
diff --git a/code/modules/lighting/~lighting_undefs.dm b/code/modules/lighting/~lighting_undefs.dm
new file mode 100644
index 0000000000..9308cc6b65
--- /dev/null
+++ b/code/modules/lighting/~lighting_undefs.dm
@@ -0,0 +1,10 @@
+#undef LIGHTING_INTERVAL
+
+#undef LIGHTING_FALLOFF
+#undef LIGHTING_LAMBERTIAN
+#undef LIGHTING_HEIGHT
+#undef LIGHTING_TRANSITIONS
+
+#undef LIGHTING_RESOLUTION
+#undef LIGHTING_LAYER
+#undef LIGHTING_ICON
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index bdb70368d2..234f1f9ecc 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -104,7 +104,7 @@
icon_state = "furnace"
density = 1
anchored = 1
- luminosity = 3
+ light_range = 3
var/obj/machinery/mineral/input = null
var/obj/machinery/mineral/output = null
var/obj/machinery/mineral/console = null
@@ -231,4 +231,4 @@
else
continue
- console.updateUsrDialog()
\ No newline at end of file
+ console.updateUsrDialog()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index f616d57ac4..d88067108c 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -5,7 +5,7 @@
name = "Light-emtter"
anchored = 1
unacidable = 1
- luminosity = 8
+ light_range = 8
/**********************Miner Lockers**************************/
diff --git a/code/modules/mob/freelook/ai/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm
index 327b39fbf2..8a91d0540e 100644
--- a/code/modules/mob/freelook/ai/update_triggers.dm
+++ b/code/modules/mob/freelook/ai/update_triggers.dm
@@ -28,7 +28,7 @@
if(src.can_use())
cameranet.addCamera(src)
else
- src.SetLuminosity(0)
+ src.set_light(0)
cameranet.removeCamera(src)
/obj/machinery/camera/New()
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index b9f8c9b4df..36110c600c 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -110,14 +110,14 @@
if(stat)
return 0
on = 1
- SetLuminosity(light_strength)
+ set_light(light_strength)
update_icons()
return 1
/mob/living/bot/proc/turn_off()
on = 0
- SetLuminosity(0)
+ set_light(0)
update_icons()
/mob/living/bot/proc/explode()
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm
index 5a82e3f373..ec0dd5d7e1 100644
--- a/code/modules/mob/living/carbon/alien/diona/life.dm
+++ b/code/modules/mob/living/carbon/alien/diona/life.dm
@@ -4,10 +4,12 @@
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
- var/area/A = T.loc
- if(A)
- if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
- else light_amount = 5
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
+ if(L)
+ light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ else
+ light_amount = 5
+
nutrition += light_amount
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index c16a03d5ca..4bbb81612c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -877,10 +877,11 @@
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
- var/area/A = T.loc
- if(A)
- if(A.lighting_use_dynamic) light_amount = min(10,T.lighting_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
- else light_amount = 5
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
+ if(L)
+ light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ else
+ light_amount = 5
nutrition += light_amount
traumatic_shock -= light_amount
@@ -898,10 +899,11 @@
var/light_amount = 0
if(isturf(loc))
var/turf/T = loc
- var/area/A = T.loc
- if(A)
- if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
- else light_amount = 10
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
+ if(L)
+ light_amount = L.lum_r + L.lum_g + L.lum_b //hardcapped so it's not abused by having a ton of flashlights
+ else
+ light_amount = 10
if(light_amount > species.light_dam) //if there's enough light, start dying
take_overall_damage(1,1)
else //heal in the dark
@@ -1418,8 +1420,9 @@
//0.1% chance of playing a scary sound to someone who's in complete darkness
if(isturf(loc) && rand(1,1000) == 1)
- var/turf/currentTurf = loc
- if(!currentTurf.lighting_lumcount)
+ var/turf/T = loc
+ var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
+ if(L && L.lum_r + L.lum_g + L.lum_b == 0)
playsound_local(src,pick(scarySounds),50, 1, -1)
proc/handle_stomach()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 1518e72ff4..4a41479e34 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -139,7 +139,7 @@
var/obj/item/I = O
mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR
var/momentum = speed*mass
-
+
if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED)
var/dir = get_dir(O.throw_source, src)
@@ -200,14 +200,14 @@
/mob/living/proc/IgniteMob()
if(fire_stacks > 0 && !on_fire)
on_fire = 1
- src.AddLuminosity(3)
+ set_light(light_range + 3)
update_fire()
/mob/living/proc/ExtinguishMob()
if(on_fire)
on_fire = 0
fire_stacks = 0
- src.AddLuminosity(-3)
+ set_light(max(0, light_range - 3))
update_fire()
/mob/living/proc/update_fire()
@@ -219,18 +219,18 @@
/mob/living/proc/handle_fire()
if(fire_stacks < 0)
fire_stacks = max(0, fire_stacks++) //If we've doused ourselves in water to avoid fire, dry off slowly
-
+
if(!on_fire)
return 1
else if(fire_stacks <= 0)
ExtinguishMob() //Fire's been put out.
return 1
-
+
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
if(G.gas["oxygen"] < 1)
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
return 1
-
+
var/turf/location = get_turf(src)
location.hotspot_expose(fire_burn_temperature(), 50, 1)
@@ -242,6 +242,6 @@
/mob/living/proc/fire_burn_temperature()
if (fire_stacks <= 0)
return 0
-
+
//Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot.
return round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index fe6f301dd3..f40036ae6b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -468,13 +468,13 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/reset_view(atom/A)
if(camera)
- camera.SetLuminosity(0)
+ camera.set_light(0)
if(istype(A,/obj/machinery/camera))
camera = A
..()
if(istype(A,/obj/machinery/camera))
- if(camera_light_on) A.SetLuminosity(AI_CAMERA_LUMINOSITY)
- else A.SetLuminosity(0)
+ if(camera_light_on) A.set_light(AI_CAMERA_LUMINOSITY)
+ else A.set_light(0)
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
@@ -612,7 +612,7 @@ var/list/ai_verbs_default = list(
src << "Camera lights [camera_light_on ? "activated" : "deactivated"]."
if(!camera_light_on)
if(camera)
- camera.SetLuminosity(0)
+ camera.set_light(0)
camera = null
else
lightNearbyCamera()
@@ -627,20 +627,20 @@ var/list/ai_verbs_default = list(
if(src.camera)
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && src.camera != camera)
- src.camera.SetLuminosity(0)
+ src.camera.set_light(0)
if(!camera.light_disabled)
src.camera = camera
- src.camera.SetLuminosity(AI_CAMERA_LUMINOSITY)
+ src.camera.set_light(AI_CAMERA_LUMINOSITY)
else
src.camera = null
else if(isnull(camera))
- src.camera.SetLuminosity(0)
+ src.camera.set_light(0)
src.camera = null
else
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && !camera.light_disabled)
src.camera = camera
- src.camera.SetLuminosity(AI_CAMERA_LUMINOSITY)
+ src.camera.set_light(AI_CAMERA_LUMINOSITY)
camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds.
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index e25bb9ff10..615f1d3a41 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -58,7 +58,7 @@
src.has_power = 0
if(lights_on) // Light is on but there is no power!
lights_on = 0
- SetLuminosity(0)
+ set_light(0)
/mob/living/silicon/robot/proc/handle_regular_status_updates()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 8cc67772b5..8a19607edc 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -367,9 +367,9 @@
lights_on = !lights_on
usr << "You [lights_on ? "enable" : "disable"] your integrated light."
if(lights_on)
- SetLuminosity(integrated_light_power) // 1.5x luminosity of flashlight
+ set_light(integrated_light_power) // 1.5x luminosity of flashlight
else
- SetLuminosity(0)
+ set_light(0)
/mob/living/silicon/robot/verb/self_diagnosis_verb()
set category = "Robot Commands"
diff --git a/code/modules/mob/living/simple_animal/constructs/constructs.dm b/code/modules/mob/living/simple_animal/constructs/constructs.dm
index 1ae5bba479..56746a51d5 100644
--- a/code/modules/mob/living/simple_animal/constructs/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs/constructs.dm
@@ -240,7 +240,7 @@
////////////////Glow//////////////////
/mob/living/simple_animal/construct/proc/add_glow()
overlays = 0
- var/overlay_layer = LIGHTING_LAYER+1
+ var/overlay_layer = 11
if(layer != MOB_LAYER)
overlay_layer=TURF_LAYER+0.2
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index a1284503e1..a68280a430 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -94,7 +94,7 @@
emote_hear = list("clicks")
emote_see = list("clacks")
desc = "Free crabs!"
- src.sd_SetLuminosity(0)
+ src.sd_set_light(0)
inventory_head.loc = src.loc
inventory_head = null
else
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 755c66b6cb..97b78668bf 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -199,7 +199,9 @@
power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list
var/on = 0 // 1 if on, 0 if off
var/on_gs = 0
- var/brightness = 8 // luminosity when on, also used in power calculation
+ var/brightness_range = 8 // luminosity when on, also used in power calculation
+ var/brightness_power = 3
+ var/brightness_color = null
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
var/flickering = 0
var/light_type = /obj/item/weapon/light/tube // the type of light item
@@ -215,7 +217,9 @@
icon_state = "bulb1"
base_state = "bulb"
fitting = "bulb"
- brightness = 4
+ brightness_range = 4
+ brightness_power = 2
+ brightness_color = "#a0a080"
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
@@ -224,7 +228,8 @@
name = "spotlight"
fitting = "large tube"
light_type = /obj/item/weapon/light/tube/large
- brightness = 12
+ brightness_range = 12
+ brightness_power = 4
/obj/machinery/light/built/New()
status = LIGHT_EMPTY
@@ -247,11 +252,14 @@
switch(fitting)
if("tube")
- brightness = 8
+ brightness_range = 8
+ brightness_power = 3
if(prob(2))
broken(1)
if("bulb")
- brightness = 4
+ brightness_range = 4
+ brightness_power = 2
+ brightness_color = "#a0a080"
if(prob(5))
broken(1)
spawn(1)
@@ -285,7 +293,7 @@
update_icon()
if(on)
- if(luminosity != brightness)
+ if(light_range != brightness_range || light_power != brightness_power || light_color != brightness_color)
switchcount++
if(rigged)
if(status == LIGHT_OK && trigger)
@@ -299,15 +307,15 @@
status = LIGHT_BURNED
icon_state = "[base_state]-burned"
on = 0
- SetLuminosity(0)
+ set_light(0)
else
use_power = 2
- SetLuminosity(brightness)
+ set_light(brightness_range, brightness_power, brightness_color)
else
use_power = 1
- SetLuminosity(0)
+ set_light(0)
- active_power_usage = (luminosity * 10)
+ active_power_usage = ((light_range + light_power) * 10)
if(on != on_gs)
on_gs = on
@@ -368,8 +376,9 @@
user << "You insert the [L.name]."
switchcount = L.switchcount
rigged = L.rigged
- brightness = L.brightness
- l_color = L.color
+ brightness_range = L.brightness_range
+ brightness_power = L.brightness_power
+ brightness_color = L.brightness_color
on = has_power()
update()
@@ -515,8 +524,9 @@
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
- L.brightness = src.brightness
- L.color = l_color
+ L.brightness_range = brightness_range
+ L.brightness_power = brightness_power
+ L.brightness_color = brightness_color
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -541,8 +551,9 @@
var/obj/item/weapon/light/L = new light_type()
L.status = status
L.rigged = rigged
- L.brightness = brightness
- L.color = l_color
+ L.brightness_range = brightness_range
+ L.brightness_power = brightness_power
+ L.brightness_color = brightness_color
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -575,7 +586,6 @@
if(status == LIGHT_OK)
return
status = LIGHT_OK
- brightness = initial(brightness)
on = 1
update()
@@ -610,7 +620,7 @@
/obj/machinery/light/process()
if(on)
- use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT)
+ use_power(light_range * LIGHTING_POWER_FACTOR, LIGHT)
// called when area power state changes
@@ -650,7 +660,9 @@
var/switchcount = 0 // number of times switched
matter = list("metal" = 60)
var/rigged = 0 // true if rigged to explode
- var/brightness = 2 //how much light it gives off
+ var/brightness_range = 2 //how much light it gives off
+ var/brightness_power = 1
+ var/brightness_color = null
/obj/item/weapon/light/tube
name = "light tube"
@@ -659,12 +671,14 @@
base_state = "ltube"
item_state = "c_tube"
matter = list("glass" = 100)
- brightness = 8
+ brightness_range = 8
+ brightness_power = 3
/obj/item/weapon/light/tube/large
w_class = 2
name = "large light tube"
- brightness = 15
+ brightness_range = 15
+ brightness_power = 4
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -673,7 +687,9 @@
base_state = "lbulb"
item_state = "contvapour"
matter = list("glass" = 100)
- brightness = 5
+ brightness_range = 5
+ brightness_power = 2
+ brightness_color = "#a0a080"
/obj/item/weapon/light/throw_impact(atom/hit_atom)
..()
@@ -686,7 +702,8 @@
base_state = "fbulb"
item_state = "egg4"
matter = list("glass" = 100)
- brightness = 5
+ brightness_range = 5
+ brightness_power = 2
// update the icon state and description of the light
@@ -707,9 +724,9 @@
..()
switch(name)
if("light tube")
- brightness = rand(6,9)
+ brightness_range = rand(6,9)
if("light bulb")
- brightness = rand(4,6)
+ brightness_range = rand(4,6)
update()
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 24758fc27e..8b51264460 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -9,7 +9,7 @@
density = 0
unacidable = 1
use_power = 0
- luminosity = 4
+ light_range = 4
var/obj/machinery/field_generator/FG1 = null
var/obj/machinery/field_generator/FG2 = null
var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 50093c440b..094915047b 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -31,8 +31,8 @@ var/global/list/narsie_list = list()
// Pixel stuff centers Narsie.
pixel_x = -236
pixel_y = -256
- luminosity = 1
- l_color = "#3e0000"
+ light_range = 1
+ light_color = "#3e0000"
current_size = 12
consume_range = 12 // How many tiles out do we eat.
@@ -144,7 +144,7 @@ var/global/list/narsie_list = list()
if(T.icon_state != "cult-narsie")
T.desc = "something that goes beyond your understanding went this way"
T.icon_state = "cult-narsie"
- T.luminosity = 1
+ T.set_light(1)
/obj/singularity/narsie/proc/narsiewall(var/turf/T)
T.desc = "An opening has been made on that wall, but who can say if what you seek truly lies on the other side?"
@@ -152,7 +152,7 @@ var/global/list/narsie_list = list()
T.icon_state = "cult-narsie"
T.opacity = 0
T.density = 0
- luminosity = 1
+ set_light(1)
/obj/singularity/narsie/large/consume(const/atom/A) //Has its own consume proc because it doesn't need energy and I don't want BoHs to explode it. --NEO
//NEW BEHAVIOUR
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index e04268e0a9..55b4fad1a4 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -8,7 +8,7 @@
anchored = 1
density = 1
layer = 6
- luminosity = 6
+ light_range = 6
unacidable = 1 //Don't comment this out.
var/current_size = 1
diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm
index d20e2743fd..7ca422bed4 100644
--- a/code/modules/shieldgen/sheldwallgen.dm
+++ b/code/modules/shieldgen/sheldwallgen.dm
@@ -228,7 +228,7 @@
anchored = 1
density = 1
unacidable = 1
- luminosity = 3
+ light_range = 3
var/needs_power = 0
var/active = 1
// var/power = 10
diff --git a/code/modules/spells/aoe_turf/conjure/construct.dm b/code/modules/spells/aoe_turf/conjure/construct.dm
index d5a2de92e2..e33d1f2b3c 100644
--- a/code/modules/spells/aoe_turf/conjure/construct.dm
+++ b/code/modules/spells/aoe_turf/conjure/construct.dm
@@ -130,8 +130,8 @@
name = "Juggerwall"
icon = 'icons/effects/effects.dmi'
icon_state = "m_shield_cult"
- l_color = "#B40000"
- luminosity = 2
+ light_color = "#B40000"
+ light_range = 2
/obj/effect/forcefield/cult/cultify()
return
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index e9a23bb23b..bf5d6957a6 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -37,7 +37,7 @@
icon_state = "darkmatter"
density = 1
anchored = 0
- luminosity = 4
+ light_range = 4
var/gasefficency = 0.25
@@ -54,7 +54,7 @@
var/emergency_alert = "CRYSTAL DELAMINATION IMMINENT."
var/explosion_point = 1000
- l_color = "#8A8A00"
+ light_color = "#8A8A00"
var/warning_color = "#B8B800"
var/emergency_color = "#D9D900"
@@ -117,10 +117,8 @@
//Changes color and luminosity of the light to these values if they were not already set
/obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr)
- if(l_color != clr)
- l_color = clr
- if(luminosity != lum)
- SetLuminosity(lum)
+ if(lum != light_range || clr != light_color)
+ set_light(lum, l_color = clr)
/obj/machinery/power/supermatter/proc/announce_warning()
var/integrity = damage / explosion_point
@@ -174,7 +172,7 @@
if(!istype(L, /turf/space) && (world.timeofday - lastwarning) >= WARNING_DELAY * 10)
announce_warning()
else
- shift_light(4,initial(l_color))
+ shift_light(4,initial(light_color))
if(grav_pulling)
supermatter_pull()
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index e733ad8df4..9407dc937a 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -11,7 +11,7 @@
density = 1
anchored = 1
animate_movement=1
- luminosity = 3
+ light_range = 3
can_buckle = 1
buckle_movable = 1
@@ -181,13 +181,13 @@
if(powered && cell.charge < charge_use)
return 0
on = 1
- luminosity = initial(luminosity)
+ set_light(initial(light_range))
update_icon()
return 1
/obj/vehicle/proc/turn_off()
on = 0
- luminosity = 0
+ set_light(0)
update_icon()
/obj/vehicle/proc/Emag(mob/user as mob)
@@ -367,4 +367,4 @@
if(prob(10))
new /obj/effect/decal/cleanable/blood/oil(src.loc)
spawn(1) healthcheck()
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/setup.dm b/code/setup.dm
index 68c2b94c75..654d9c8b70 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -954,3 +954,5 @@ var/list/be_special_flags = list(
#define LANGUAGE_ROOTSPEAK "Rootspeak"
#define LANGUAGE_TRADEBAND "Tradeband"
#define LANGUAGE_GUTTER "Gutter"
+
+#define CLAMP01(x) max(0, min(1, x))
diff --git a/icons/effects/lighting_overlay.dmi b/icons/effects/lighting_overlay.dmi
new file mode 100644
index 0000000000..1ff16d2b78
Binary files /dev/null and b/icons/effects/lighting_overlay.dmi differ