mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 19:22:56 +00:00
Fixed an annoying bug with giving another player a flashlight,
opened up at least 100 individual bugs where people kept setting loc and expecting light updates to catch it.
This commit is contained in:
@@ -1283,12 +1283,12 @@
|
||||
#include "code\WorkInProgress\explosion_particles.dm"
|
||||
#include "code\WorkInProgress\periodic_news.dm"
|
||||
#include "code\WorkInProgress\Apples\artifacts.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\_Defs.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Compatibility.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Controller.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Engine.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Light.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Lightpoint.dm"
|
||||
#include "code\WorkInProgress\Aryn\Lighting\Math.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm"
|
||||
#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm"
|
||||
|
||||
@@ -36,10 +36,14 @@ turf_light_data/proc/copy_to(turf/T)
|
||||
//T.ResetValue()
|
||||
|
||||
atom/proc/SetLuminosity(n)
|
||||
ASSERT(n >= 0)
|
||||
|
||||
n = min(n,10) //Caelcode.
|
||||
if(n > 0)
|
||||
//world << "[name].SetLuminosity([n]) \[[max(1,n>>1)],[n]\]"
|
||||
SetLight(max(1,n>>1),n)
|
||||
else
|
||||
//world << "[name].SetLuminosity(0)"
|
||||
SetLight(0,0)
|
||||
luminosity = n
|
||||
//else lighting_controller.initial_lights.Add(src)
|
||||
@@ -89,25 +89,14 @@ var/list/lit_z_levels = list(1,5)
|
||||
started = 1
|
||||
|
||||
for(var/turf/T)
|
||||
if(!T.is_outside && T.light_overlay)
|
||||
if(T.light_overlay)
|
||||
|
||||
T.ResetValue()
|
||||
T.UpdateLight()
|
||||
T.light_overlay.icon_state = "[MAX_VALUE(T.lightSE)][MAX_VALUE(T.lightSW)][MAX_VALUE(T.lightNW)][MAX_VALUE(T.lightNE)]"
|
||||
|
||||
world << "<b><font color=red>Lighting initialization took [(world.timeofday-start_time)/world.fps] seconds.</font></b>"
|
||||
world << "<font color=red>Updated [turfs_updated] turfs.</font>"
|
||||
|
||||
/datum/controller/lighting/proc/MarkIconUpdate(turf/T)
|
||||
if(!T.needs_light_update)
|
||||
icon_updates.Add(T)
|
||||
T.needs_light_update = 1
|
||||
|
||||
/datum/controller/lighting/proc/FlushIconUpdates()
|
||||
for(var/turf/T in icon_updates)
|
||||
T.UpdateLight()
|
||||
T.needs_light_update = 0
|
||||
icon_updates = list()
|
||||
|
||||
/datum/controller/lighting/proc/AddBorder(turf/T)
|
||||
if(!T.is_border)
|
||||
light_border.Add(T)
|
||||
|
||||
@@ -50,9 +50,6 @@ Turf Procs:
|
||||
Resets the opacity cache and looks for opaque objects. Also responsible for adding and removing borders to space.
|
||||
*/
|
||||
|
||||
|
||||
#define LIGHTCLAMP(x) ( max(0,min(3,round(x,1))) )
|
||||
|
||||
atom/movable/lighting_overlay
|
||||
name = ""
|
||||
anchored = 1
|
||||
@@ -68,10 +65,9 @@ turf/var/atom/movable/lighting_overlay/light_overlay
|
||||
|
||||
turf/var/lit_value = 0
|
||||
turf/var/max_brightness = 0
|
||||
turf/var/has_opaque = 0
|
||||
turf/var/has_opaque = -1
|
||||
turf/var/is_outside = 0
|
||||
turf/var/is_border = 0
|
||||
turf/var/needs_light_update = 0
|
||||
|
||||
turf/var/lightpoint/lightNE
|
||||
turf/var/lightpoint/lightNW
|
||||
@@ -85,7 +81,11 @@ atom/movable/New()
|
||||
if(!light)
|
||||
SetLight(luminosity,luminosity)
|
||||
else
|
||||
light.atom = src
|
||||
light.Reset()
|
||||
else if(light)
|
||||
light.atom = src
|
||||
light.Reset()
|
||||
if(opacity)
|
||||
if(lighting_ready())
|
||||
opacity = 0
|
||||
@@ -96,15 +96,16 @@ atom/movable/Del()
|
||||
if(opacity) SetOpacity(0)
|
||||
. = ..()
|
||||
|
||||
atom/movable/Move()
|
||||
atom/movable/Move(turf/newloc)
|
||||
var/o = opacity
|
||||
if(o) SetOpacity(0)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(o) SetOpacity(1)
|
||||
if(light)
|
||||
light.Reset()
|
||||
if(lighting_ready()) lighting_controller.FlushIconUpdates()
|
||||
|
||||
turf/Entered(atom/movable/M)
|
||||
. = ..()
|
||||
if(M.light) M.light.Reset()
|
||||
|
||||
atom/proc/SetLight(intensity, radius)
|
||||
//if(lights_verbose) world << "SetLight([intensity],[radius])"
|
||||
@@ -115,7 +116,7 @@ atom/proc/SetLight(intensity, radius)
|
||||
//if(lights_verbose) world << "Shut off light with [light.lit_turfs.len] turfs lit."
|
||||
light.Off()
|
||||
light.intensity = 0
|
||||
if(lighting_ready()) lighting_controller.FlushIconUpdates()
|
||||
//if(lighting_ready()) lighting_controller.FlushIconUpdates()
|
||||
return
|
||||
if(!light)
|
||||
//if(lights_verbose) world << "New light."
|
||||
@@ -126,25 +127,31 @@ atom/proc/SetLight(intensity, radius)
|
||||
light.radius = min(radius,15)
|
||||
light.intensity = intensity
|
||||
light.Reset()
|
||||
if(lighting_ready()) lighting_controller.FlushIconUpdates()
|
||||
//if(lighting_ready()) lighting_controller.FlushIconUpdates()
|
||||
|
||||
atom/proc/SetOpacity(o)
|
||||
if(o == opacity) return
|
||||
opacity = o
|
||||
var/turf/T = loc
|
||||
if(isturf(T))
|
||||
T.CheckForOpaqueObjects()
|
||||
for(var/light/A in T.lit_by)
|
||||
A.Reset()
|
||||
lighting_controller.FlushIconUpdates()
|
||||
|
||||
turf/proc/UpdateLight()
|
||||
if(light_overlay)
|
||||
light_overlay.icon_state = "[lightSE.max_value()][lightSW.max_value()][lightNW.max_value()][lightNE.max_value()]"
|
||||
//lighting_controller.FlushIconUpdates()
|
||||
|
||||
turf/proc/AddLight(light/light)
|
||||
atom/proc/UpdateLights()
|
||||
if(light) light.Reset()
|
||||
for(var/atom/movable/A in src)
|
||||
if(A.light) A.light.Reset()
|
||||
|
||||
//turf/proc/UpdateLight()
|
||||
// if(light_overlay)
|
||||
// light_overlay.icon_state = "[lightSE.max_value()][lightSW.max_value()][lightNW.max_value()][lightNE.max_value()]"
|
||||
|
||||
turf/proc/AddLight(light/light, brightness)
|
||||
if(is_outside) return
|
||||
|
||||
var/brightness = light.CalculateBrightness(src)
|
||||
if(brightness <= 0) return
|
||||
|
||||
if(!lit_by) lit_by = list()
|
||||
@@ -153,13 +160,19 @@ turf/proc/AddLight(light/light)
|
||||
|
||||
lit_by[light] = brightness
|
||||
|
||||
if(!has_opaque && lighting_ready())
|
||||
if(lighting_ready())
|
||||
if(brightness > max_brightness)
|
||||
lit_value = LIGHTCLAMP(brightness)
|
||||
max_brightness = brightness
|
||||
ResetCachedValues()
|
||||
|
||||
if(lightNE) lightNE.cached_value = -1
|
||||
if(lightNW) lightNW.cached_value = -1
|
||||
if(lightSE) lightSE.cached_value = -1
|
||||
if(lightSW) lightSW.cached_value = -1
|
||||
|
||||
for(var/turf/T in range(1,src))
|
||||
lighting_controller.MarkIconUpdate(T)
|
||||
if(T.light_overlay)
|
||||
T.light_overlay.icon_state = "[MAX_VALUE(T.lightSE)][MAX_VALUE(T.lightSW)][MAX_VALUE(T.lightNW)][MAX_VALUE(T.lightNE)]"
|
||||
|
||||
turf/proc/RemoveLight(light/light)
|
||||
if(lit_by)
|
||||
@@ -187,17 +200,10 @@ turf/proc/ResetValue()
|
||||
lit_value = LIGHTCLAMP(lighting_controller.starlight)
|
||||
return
|
||||
|
||||
CheckForOpaqueObjects()
|
||||
if(has_opaque < 0) CheckForOpaqueObjects()
|
||||
if(has_opaque)
|
||||
lit_value = 0
|
||||
else
|
||||
the_part_where_I_calculate_brightness()
|
||||
|
||||
if(lighting_ready())
|
||||
the_part_where_I_use_range()
|
||||
|
||||
turf/proc
|
||||
the_part_where_I_calculate_brightness()
|
||||
max_brightness = 0
|
||||
for(var/light/light in lit_by)
|
||||
var/brightness = lit_by[light]//light.CalculateBrightness(src)
|
||||
@@ -205,20 +211,14 @@ turf/proc
|
||||
max_brightness = brightness
|
||||
lit_value = LIGHTCLAMP(max_brightness)
|
||||
|
||||
the_part_where_I_use_range()
|
||||
ResetCachedValues()
|
||||
if(lighting_ready())
|
||||
if(lightNE) lightNE.cached_value = -1
|
||||
if(lightNW) lightNW.cached_value = -1
|
||||
if(lightSE) lightSE.cached_value = -1
|
||||
if(lightSW) lightSW.cached_value = -1
|
||||
for(var/turf/T in range(1,src))
|
||||
lighting_controller.MarkIconUpdate(T)
|
||||
|
||||
turf/proc/ResetCachedValues()
|
||||
if(lightNE)
|
||||
lightNE.cached_value = -1
|
||||
if(lightNW)
|
||||
lightNW.cached_value = -1
|
||||
if(lightSE)
|
||||
lightSE.cached_value = -1
|
||||
if(lightSW)
|
||||
lightSW.cached_value = -1
|
||||
if(T.light_overlay)
|
||||
T.light_overlay.icon_state = "[MAX_VALUE(T.lightSE)][MAX_VALUE(T.lightSW)][MAX_VALUE(T.lightNW)][MAX_VALUE(T.lightNE)]"
|
||||
|
||||
turf/proc/CheckForOpaqueObjects()
|
||||
has_opaque = opacity
|
||||
@@ -226,6 +226,4 @@ turf/proc/CheckForOpaqueObjects()
|
||||
for(var/atom/movable/M in contents)
|
||||
if(M.opacity)
|
||||
has_opaque = 1
|
||||
break
|
||||
|
||||
#undef LIGHTCLAMP
|
||||
break
|
||||
@@ -24,21 +24,30 @@ Class Procs:
|
||||
|
||||
light/var/radius = 0
|
||||
light/var/intensity = 0
|
||||
light/var/list/lit_turfs
|
||||
light/var/ambient_extension = 3
|
||||
light/var/list/lit_turfs = list()
|
||||
light/var/atom/atom
|
||||
|
||||
light/New(atom/atom)
|
||||
light/New(atom/atom, radius, ambience=3)
|
||||
ASSERT(atom)
|
||||
src.atom = atom
|
||||
|
||||
if(istype(atom))
|
||||
src.atom = atom
|
||||
else
|
||||
src.intensity = atom
|
||||
src.radius = radius
|
||||
src.ambient_extension = ambience
|
||||
|
||||
light/proc/Reset()
|
||||
//if(atom.lights_verbose) world << "light.Reset()"
|
||||
Off()
|
||||
if(intensity > 0)
|
||||
//if(atom.lights_verbose) world << "Restoring light."
|
||||
for(var/turf/T in view(get_turf(atom),radius+1))
|
||||
var/turf/loc = atom
|
||||
for(var/turf/T in view(loc,radius+ambient_extension))
|
||||
if(!T.is_outside)
|
||||
T.AddLight(src)
|
||||
var/brightness = CalculateBrightness(T, loc)
|
||||
T.AddLight(src, brightness)
|
||||
lit_turfs.Add(T)
|
||||
//if(atom.lights_verbose) world << "[lit_turfs.len] turfs added."
|
||||
|
||||
@@ -46,15 +55,20 @@ light/proc/Off()
|
||||
//if(atom.lights_verbose) world << "light.Off()"
|
||||
for(var/turf/T in lit_turfs)
|
||||
T.RemoveLight(src)
|
||||
lit_turfs = list()
|
||||
lit_turfs.Cut()
|
||||
|
||||
light/proc/CalculateBrightness(turf/T)
|
||||
light/proc/Flash(t)
|
||||
Reset()
|
||||
spawn(t)
|
||||
Off()
|
||||
|
||||
light/proc/CalculateBrightness(turf/T, turf/loc)
|
||||
ASSERT(T)
|
||||
var/square = get_square_dist(atom.x,atom.y,atom.z,T.x,T.y,T.z)
|
||||
if(square > (radius+2)*(radius+2)) return 0
|
||||
var/square = DISTSQ3(loc.x-T.x,loc.y-T.y,loc.z-T.z)
|
||||
if(square > (radius+ambient_extension)*(radius+ambient_extension)) return 0
|
||||
//+2 offset gives an ambient light effect.
|
||||
|
||||
var/value = ((radius)/(2*fsqrt(square) + 1)) * intensity - 0.48
|
||||
var/value = ((radius)/(2*FSQRT(square) + 1)) * intensity - 0.48
|
||||
/*
|
||||
lightRadius
|
||||
---------------- * lightValue - 0.48
|
||||
|
||||
@@ -50,16 +50,10 @@ lightpoint
|
||||
T.lightNW = src
|
||||
|
||||
proc/max_value()
|
||||
if(cached_value < 0)
|
||||
var
|
||||
valueA = value_of(NW)
|
||||
valueB = value_of(NE)
|
||||
valueC = value_of(SW)
|
||||
valueD = value_of(SE)
|
||||
cached_value = max(valueA,valueB,valueC,valueD)
|
||||
return cached_value
|
||||
|
||||
proc/value_of(turf/T)
|
||||
if(!T) return 0
|
||||
if(T.is_outside) return min(lighting_controller.starlight,3)
|
||||
return T.lit_value
|
||||
var
|
||||
valueA = VALUE_OF(NW)
|
||||
valueB = VALUE_OF(NE)
|
||||
valueC = VALUE_OF(SW)
|
||||
valueD = VALUE_OF(SE)
|
||||
cached_value = max(valueA,valueB,valueC,valueD)
|
||||
return cached_value
|
||||
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
|
||||
Some math procs used by lighting, including ul's fastroot.
|
||||
|
||||
*/
|
||||
|
||||
var/list/fastroot = list(0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7)
|
||||
|
||||
proc/get_square_dist(Ax,Ay,Az,Bx,By,Bz)
|
||||
var/X = (Ax - Bx)
|
||||
var/Y = (Ay - By)
|
||||
var/Z = (Az - Bz)
|
||||
return (X * X + Y * Y + Z * Z)
|
||||
|
||||
proc/fsqrt(n)
|
||||
if (n > fastroot.len)
|
||||
//world << "Adding [n-fastroot.len] entries to root table."
|
||||
for(var/i = fastroot.len, i <= n, i++)
|
||||
fastroot += round(sqrt(i))
|
||||
return fastroot[n + 1]
|
||||
15
code/WorkInProgress/Aryn/Lighting/_Defs.dm
Normal file
15
code/WorkInProgress/Aryn/Lighting/_Defs.dm
Normal file
@@ -0,0 +1,15 @@
|
||||
#define SQ(X) ((X)*(X))
|
||||
#define DISTSQ3(A,B,C) (SQ(A)+SQ(B)+SQ(C))
|
||||
#define FSQRT(X) (X >= fastroot.len ? new_fsqrt(X) : fastroot[(X)+1])
|
||||
#define MAX_VALUE(X) (X.cached_value < 0 ? X.max_value() : X.cached_value)
|
||||
#define VALUE_OF(X) ( !X ? 0 : ( X.is_outside ? LIGHTCLAMP(lighting_controller.starlight) : X.lit_value ) )
|
||||
#define LIGHTCLAMP(x) ( max(0,min(3,round(x,1))) )
|
||||
|
||||
var/list/fastroot = list(0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5,
|
||||
5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7)
|
||||
|
||||
proc/new_fsqrt(n)
|
||||
//world << "Adding [n-fastroot.len] entries to root table."
|
||||
for(var/i = fastroot.len, i <= n, i++)
|
||||
fastroot += round(sqrt(i))
|
||||
@@ -89,13 +89,13 @@
|
||||
|
||||
|
||||
/obj/item/device/flashlight/pickup(mob/user)
|
||||
if(on)
|
||||
if(on && luminosity)
|
||||
user.SetLuminosity(user.luminosity + brightness_on)
|
||||
SetLuminosity(0)
|
||||
|
||||
|
||||
/obj/item/device/flashlight/dropped(mob/user)
|
||||
if(on)
|
||||
if(on && !luminosity)
|
||||
user.SetLuminosity(user.luminosity - brightness_on)
|
||||
SetLuminosity(brightness_on)
|
||||
|
||||
|
||||
@@ -717,8 +717,11 @@ It can still be worn/put on as normal.
|
||||
if(item && target.has_organ_for_slot(slot_to_process)) //Placing an item on the mob
|
||||
if(item.mob_can_equip(target, slot_to_process, 0))
|
||||
source.u_equip(item)
|
||||
target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1)
|
||||
item.dropped(source)
|
||||
|
||||
target.equip_to_slot_if_possible(item, slot_to_process, 0, 1, 1)
|
||||
item.pickup(target)
|
||||
|
||||
source.update_icons()
|
||||
target.update_icons()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user