diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ecfb96d562..98f487a71b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1299,24 +1299,26 @@ var/list/WALLITEMS = list( colour += temp_col return colour +var/mob/dview/dview_mob = new + //Version of view() which ignores darkness, because BYOND doesn't have it. /proc/dview(var/range = world.view, var/center, var/invis_flags = 0) if(!center) return - var/global/mob/dview/DV - if(!DV) - DV = new + dview_mob.loc = center - DV.loc = center + dview_mob.see_invisible = invis_flags - DV.see_in_dark = range - DV.see_invisible = invis_flags - - . = view(range, DV) - DV.loc = null + . = view(range, dview_mob) + dview_mob.loc = null /mob/dview invisibility = 101 density = 0 + anchored = 1 + simulated = 0 + + see_in_dark = 1e6 + diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm index a54b2f0f84..1ee235fa6f 100644 --- a/code/modules/lighting/light_source.dm +++ b/code/modules/lighting/light_source.dm @@ -127,32 +127,35 @@ lum_g = 1 lum_b = 1 -/datum/light_source/proc/falloff(atom/movable/lighting_overlay/O) - #if LIGHTING_FALLOFF == 1 // circular - . = (O.x - source_turf.x)**2 + (O.y - source_turf.y)**2 + LIGHTING_HEIGHT - - #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 - . = abs(O.x - source_turf.x) + abs(O.y - source_turf.y) + LIGHTING_HEIGHT - - #if LIGHTING_LAMBERTIAN == 1 - . = CLAMP01((1 - CLAMP01(. / light_range)) * (1 / (sqrt(.)**2 + ))) - #else - . = 1 - CLAMP01(. / light_range) - #endif +#if LIGHTING_FALLOFF == 1 //circular + #define LUM_DISTANCE(swapvar, O, T) swapvar = (O.x - T.x)**2 + (O.y - T.y)**2 + LIGHTING_HEIGHT + #if LIGHTING_LAMBERTIAN == 1 + #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01((1 - CLAMP01(sqrt(swapvar) / light_range)) * (1 / sqrt(swapvar + 1))) + #else + #define LUM_ATTENUATION(swapvar) swapvar = 1 - CLAMP01(sqrt(swapvar) / light_range) #endif +#elif LIGHTING_FALLOFF == 2 //square + #define LUM_DISTANCE(swapvar, O, T) swapvar = abs(O.x - T.x) + abs(O.y - T.y) + LIGHTING_HEIGHT + #if LIGHTING_LAMBERTIAN == 1 + #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01((1 - CLAMP01(swapvar / light_range)) * (1 / sqrt(swapvar**2 + 1))) + #else + #define LUM_ATTENUATION(swapvar) swapvar = CLAMP01(swapvar / light_range) + #endif +#endif + +#define LUM_FALLOFF(swapvar, O, T) \ + LUM_DISTANCE(swapvar, O, T); \ + LUM_ATTENUATION(swapvar); /datum/light_source/proc/apply_lum() applied = 1 if(istype(source_turf)) - for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING)) + FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING) if(T.lighting_overlay) - var/strength = light_power * falloff(T.lighting_overlay) + var/strength + LUM_FALLOFF(strength, T, source_turf) + strength *= light_power + if(!strength) //Don't add turfs that aren't affected to the affected turfs. continue @@ -196,7 +199,7 @@ //Stupid dumb copy pasta because BYOND and speed. /datum/light_source/proc/smart_vis_update() var/list/view[0] - for(var/turf/T in dview(light_range, source_turf, INVISIBILITY_LIGHTING)) + FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING) view += T //Filter out turfs. //This is the part where we calculate new turfs (if any) @@ -204,7 +207,9 @@ for(var/turf/T in new_turfs) //Big huge copy paste from apply_lum() incoming because screw unreadable defines and screw proc call overhead. if(T.lighting_overlay) - . = light_power * falloff(T.lighting_overlay) + LUM_FALLOFF(., T, source_turf) + . *= light_power + if(!.) //Don't add turfs that aren't affected to the affected turfs. continue @@ -240,3 +245,7 @@ effect_turf.Cut(idx, idx + 1) effect_str.Cut(idx, idx + 1) + +#undef LUM_FALLOFF +#undef LUM_DISTANCE +#undef LUM_ATTENUATION diff --git a/code/setup.dm b/code/setup.dm index 6d49d591b3..2035c842dc 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -986,3 +986,7 @@ var/list/be_special_flags = list( #define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass) +#define FOR_DVIEW(type, range, center, invis_flags) \ + dview_mob.loc = center; \ + dview_mob.see_invisible = invis_flags; \ + for(type in view(range, dview_mob))