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:
Aryn
2014-03-18 21:57:15 -06:00
parent 7e08bca4ef
commit 9007aedf15
10 changed files with 101 additions and 106 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View 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))

View File

@@ -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)

View File

@@ -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()