From aeb850fef0e6ac0f0858794d635d85ab172e3fff Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Wed, 13 Jun 2012 18:59:52 -0700 Subject: [PATCH 1/3] Working UL --- baystation12.dme | 2 +- code/FEA/FEA_fire.dm | 4 +- .../Cael_Aislinn/Supermatter/SuperMatter.dm | 2 +- .../SkyMarshal}/Ultralight.dm | 687 +++++++++--------- code/ZAS/Fire.dm | 6 +- code/ZAS/Processing.dm | 4 +- code/datums/helper_datums/teleport.dm | 2 +- code/defines/area/Space Station 13 areas.dm | 26 +- code/defines/obj/door.dm | 24 +- code/defines/obj/hydro.dm | 22 +- code/defines/procs/helpers.dm | 12 +- code/defines/turf.dm | 4 +- code/game/area/areas.dm | 12 +- code/game/machinery/doors/airlock.dm | 8 +- code/game/machinery/doors/door.dm | 6 +- code/game/machinery/doors/poddoor.dm | 94 +-- code/game/machinery/doors/shutters.dm | 6 +- code/game/machinery/doors/windowdoor.dm | 4 +- code/game/machinery/flasher.dm | 6 +- code/game/machinery/floodlight.dm | 8 +- code/game/machinery/hologram.dm | 8 +- code/game/machinery/hydroponics.dm | 12 +- code/game/machinery/igniter.dm | 4 +- code/game/machinery/shieldgen.dm | 2 +- code/game/master_controller.dm | 6 +- code/game/mecha/mecha.dm | 4 +- code/game/objects/alien/weeds.dm | 2 +- code/game/objects/blood.dm | 2 +- code/game/objects/devices/PDA/PDA.dm | 16 +- code/game/objects/devices/flashlight.dm | 54 +- code/game/objects/devices/powersink.dm | 6 +- code/game/objects/effect_system.dm | 4 +- code/game/objects/glowshroom.dm | 2 +- code/game/objects/items/candle.dm | 15 +- .../objects/items/weapons/cigs_lighters.dm | 12 +- .../game/objects/items/weapons/papers_bins.dm | 14 +- code/game/objects/mineral_doors.dm | 2 +- code/game/objects/transfer_valve.dm | 16 +- code/game/supplyshuttle.dm | 8 +- code/game/turf.dm | 24 +- code/modules/admin/verbs/massmodvar.dm | 14 +- code/modules/admin/verbs/modifyvariables.dm | 2 +- code/modules/mining/mine_turfs.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 7 +- code/modules/mob/mob.dm | 4 +- code/modules/mob/mob_defines.dm | 4 +- code/modules/mob/simple_animal/corgi.dm | 4 +- code/modules/power/lighting.dm | 4 +- code/modules/power/sd_DynamicAreaLighting.dm | 42 +- .../power/singularity/containment_field.dm | 2 +- .../unused/mining/spaceship_builder_unused.dm | 2 +- code/unused/pda2/pda2.dm | 14 +- 52 files changed, 622 insertions(+), 633 deletions(-) rename code/{unused => WorkInProgress/SkyMarshal}/Ultralight.dm (93%) diff --git a/baystation12.dme b/baystation12.dme index f12daf760b0..1f8ba207fdf 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1076,7 +1076,6 @@ #include "code\modules\power\lighting.dm" #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" -#include "code\modules\power\sd_DynamicAreaLighting.dm" #include "code\modules\power\smes.dm" #include "code\modules\power\solar.dm" #include "code\modules\power\switch.dm" @@ -1204,6 +1203,7 @@ #include "code\WorkInProgress\SkyMarshal\coatrack.dm" #include "code\WorkInProgress\SkyMarshal\portalathe.dm" #include "code\WorkInProgress\SkyMarshal\traitoritems.dm" +#include "code\WorkInProgress\SkyMarshal\Ultralight.dm" #include "code\WorkInProgress\SkyMarshal\wardrobes.dm" #include "code\WorkInProgress\Tastyfish\Eliza.dm" #include "code\WorkInProgress\Tastyfish\Eliza_Data.dm" diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm index c37e51ac2ca..db653b820b6 100644 --- a/code/FEA/FEA_fire.dm +++ b/code/FEA/FEA_fire.dm @@ -156,13 +156,13 @@ obj New() ..() dir = pick(cardinal) - sd_SetLuminosity(3) + ul_SetLuminosity(3) Del() if (istype(loc, /turf/simulated)) var/turf/simulated/T = loc loc:active_hotspot = null - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) diff --git a/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm b/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm index ebbf265ca31..ca0693a2cc3 100644 --- a/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm +++ b/code/WorkInProgress/Cael_Aislinn/Supermatter/SuperMatter.dm @@ -30,7 +30,7 @@ New() ..() spawn(1) - sd_SetLuminosity(4) + ul_SetLuminosity(4,6,0) bullet_act(var/obj/item/projectile/Proj) if(Proj.flag != "bullet") diff --git a/code/unused/Ultralight.dm b/code/WorkInProgress/SkyMarshal/Ultralight.dm similarity index 93% rename from code/unused/Ultralight.dm rename to code/WorkInProgress/SkyMarshal/Ultralight.dm index 9b9189c957a..1e3a0aebeda 100644 --- a/code/unused/Ultralight.dm +++ b/code/WorkInProgress/SkyMarshal/Ultralight.dm @@ -1,340 +1,349 @@ -//UltraLight system, by Sukasa - -var - const - UL_I_FALLOFF_SQUARE = 0 - UL_I_FALLOFF_ROUND = 1 - - UL_I_LIT = 0 - UL_I_EXTINGUISHED = 1 - UL_I_ONZERO = 2 - - ul_LightingEnabled = 1 - ul_LightingResolution = 1 - ul_Steps = 7 - ul_FalloffStyle = UL_I_FALLOFF_ROUND // Sets the lighting falloff to be either squared or circular. - ul_TopLuminosity = 0 - ul_Layer = 10 - ul_SuppressLightLevelChanges = 0 - - list/ul_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/ul_Clamp(var/Value) - return min(max(Value, 0), ul_Steps) - -atom - var - LuminosityRed = 0 - LuminosityGreen = 0 - LuminosityBlue = 0 - - ul_Extinguished = UL_I_ONZERO - -atom/proc/ul_SetLuminosity(var/Red, var/Green = Red, var/Blue = Red) - - if(LuminosityRed == Red && LuminosityGreen == Green && LuminosityBlue == Blue) - return //No point doing all that work if it won't have any effect anyways... - - if (ul_Extinguished == UL_I_EXTINGUISHED) - LuminosityRed = Red - LuminosityGreen = Green - LuminosityBlue = Blue - - return - - if (ul_IsLuminous()) - ul_Extinguish() - - LuminosityRed = Red - LuminosityGreen = Green - LuminosityBlue = Blue - - ul_Extinguished = UL_I_ONZERO - - if (ul_IsLuminous()) - ul_Illuminate() - - return - -atom/proc/ul_Illuminate() - if (ul_Extinguished == UL_I_LIT) - return - - ul_Extinguished = UL_I_LIT - - ul_UpdateTopLuminosity() - luminosity = ul_Luminosity() - - for(var/turf/Affected in view(ul_Luminosity(), src)) - var/Falloff = src.ul_FalloffAmount(Affected) - - var/DeltaRed = LuminosityRed - Falloff - var/DeltaGreen = LuminosityGreen - Falloff - var/DeltaBlue = LuminosityBlue - Falloff - - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) - - Affected.LightLevelRed += max(DeltaRed, 0) - Affected.LightLevelGreen += max(DeltaGreen, 0) - Affected.LightLevelBlue += max(DeltaBlue, 0) - - Affected.MaxRed += LuminosityRed - Affected.MaxGreen += LuminosityGreen - Affected.MaxBlue += LuminosityBlue - - Affected.ul_UpdateLight() - - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - return - -atom/proc/ul_Extinguish() - - if (ul_Extinguished != UL_I_LIT) - return - - ul_Extinguished = UL_I_EXTINGUISHED - - for(var/turf/Affected in view(ul_Luminosity(), src)) - - var/Falloff = ul_FalloffAmount(Affected) - - var/DeltaRed = LuminosityRed - Falloff - var/DeltaGreen = LuminosityGreen - Falloff - var/DeltaBlue = LuminosityBlue - Falloff - - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) - - Affected.LightLevelRed -= max(DeltaRed, 0) - Affected.LightLevelGreen -= max(DeltaGreen, 0) - Affected.LightLevelBlue -= max(DeltaBlue, 0) - - Affected.MaxRed -= LuminosityRed - Affected.MaxGreen -= LuminosityGreen - Affected.MaxBlue -= LuminosityBlue - - Affected.ul_UpdateLight() - - if (ul_SuppressLightLevelChanges == 0) - Affected.ul_LightLevelChanged() - - for(var/atom/AffectedAtom in Affected) - AffectedAtom.ul_LightLevelChanged() - - luminosity = 0 - - return - - -/* - Calculates the correct lighting falloff value (used to calculate what brightness to set the turf to) to use, - when called on a luminous atom and passed an atom in the turf to be lit. - - Supports multiple configurations, BS12 uses the circular falloff setting. This setting uses an array lookup - to avoid the cost of the square root function. -*/ -atom/proc/ul_FalloffAmount(var/atom/ref) - if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) - var/x = (ref.x - src.x) - var/y = (ref.y - src.y) - if ((x*x + y*y) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= x*x+y*y, i++) - ul_FastRoot += round(sqrt(x*x+y*y)) - return round(ul_LightingResolution * ul_FastRoot[x*x + y*y + 1], 1) - - else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) - return get_dist(src, ref) - - return 0 - -atom/proc/ul_SetOpacity(var/NewOpacity) - if(opacity != NewOpacity) - - var/list/Blanked = ul_BlankLocal() - var/atom/T = src - while(T && !isturf(T)) - T = T.loc - - opacity = NewOpacity - - if(T) - T:LightLevelRed = 0 - T:LightLevelGreen = 0 - T:LightLevelBlue = 0 - - ul_UnblankLocal(Blanked) - - return - -atom/proc/ul_UnblankLocal(var/list/ReApply = view(ul_TopLuminosity, src)) - for(var/atom/Light in ReApply) - if(Light.ul_IsLuminous()) - Light.ul_Illuminate() - - return - -atom/proc/ul_BlankLocal() - var/list/Blanked = list( ) - var/TurfAdjust = isturf(src) ? 1 : 0 - - for(var/atom/Affected in view(ul_TopLuminosity, src)) - if(Affected.ul_IsLuminous() && Affected.ul_Extinguished == UL_I_LIT && (ul_FalloffAmount(Affected) <= Affected.luminosity + TurfAdjust)) - Affected.ul_Extinguish() - Blanked += Affected - - return Blanked - -atom/proc/ul_UpdateTopLuminosity() - if (ul_TopLuminosity < LuminosityRed) - ul_TopLuminosity = LuminosityRed - - if (ul_TopLuminosity < LuminosityGreen) - ul_TopLuminosity = LuminosityGreen - - if (ul_TopLuminosity < LuminosityBlue) - ul_TopLuminosity = LuminosityBlue - - return - -atom/proc/ul_Luminosity() - return max(LuminosityRed, LuminosityGreen, LuminosityBlue) - -atom/proc/ul_IsLuminous(var/Red = LuminosityRed, var/Green = LuminosityGreen, var/Blue = LuminosityBlue) - return (Red > 0 || Green > 0 || Blue > 0) - -atom/proc/ul_LightLevelChanged() - //Designed for client projects to use. Called on items when the turf they are in has its light level changed - return - -atom/proc/New() - ..() - if(ul_IsLuminous()) - spawn(1) - ul_Illuminate() - return - -atom/proc/Del() - if(ul_IsLuminous()) - ul_Extinguish() - - ..() - - return - -// formerly atom/proc/movable/Move(), this now overwrites other shit causing random inexplicable problems. -// need to find a way to plug it in to the root without overriding, might just do the snowflake treatment -/*atom/proc/Move() - ul_Extinguish() - ..() - ul_Illuminate() - return*/ - -turf - var - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - - list/MaxRed = list( ) - list/MaxGreen = list( ) - list/MaxBlue = list( ) - - - -turf/proc/ul_GetRed() - return ul_Clamp(min(LightLevelRed, max(MaxRed))) -turf/proc/ul_GetGreen() - return ul_Clamp(min(LightLevelGreen, max(MaxGreen))) -turf/proc/ul_GetBlue() - return ul_Clamp(min(LightLevelBlue, max(MaxBlue))) - -turf/proc/ul_UpdateLight() - - var/area/CurrentArea = loc - - if(!isarea(CurrentArea) || !CurrentArea.ul_Lighting) - return - - var/LightingTag = copytext(CurrentArea.tag, 1, findtext(CurrentArea.tag, ":UL")) + ":UL[ul_GetRed()]_[ul_GetGreen()]_[ul_GetBlue()]" - - if(CurrentArea.tag != LightingTag) - var/area/NewArea = locate(LightingTag) - - if(!NewArea) - NewArea = new CurrentArea.type() - NewArea.tag = LightingTag - - for(var/V in CurrentArea.vars - "contents") - if(issaved(CurrentArea.vars[V])) - NewArea.vars[V] = CurrentArea.vars[V] - - NewArea.tag = LightingTag - - NewArea.ul_Light(ul_GetRed(), ul_GetGreen(), ul_GetBlue()) - - - NewArea.contents += src - - return - -turf/proc/ul_Recalculate() - - ul_SuppressLightLevelChanges++ - - var/list/Lights = ul_BlankLocal() - - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - - ul_UnblankLocal(Lights) - - ul_SuppressLightLevelChanges-- - - return - -area - var - ul_Overlay = null - ul_Lighting = 1 - - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - - -area/proc/ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blue = LightLevelBlue) - - if(!src || !src.ul_Lighting) - return - - overlays -= ul_Overlay - - LightLevelRed = Red - LightLevelGreen = Green - LightLevelBlue = Blue - - luminosity = ul_IsLuminous(LightLevelRed, LightLevelGreen, LightLevelBlue) - - ul_Overlay = image('ULIcons.dmi', , num2text(LightLevelRed) + "-" + num2text(LightLevelGreen) + "-" + num2text(LightLevelBlue), ul_Layer) - - overlays += ul_Overlay - - return - -area/proc/ul_Prep() - - if(!tag) - tag = "[type]" - if(ul_Lighting) - if(!findtext(tag,":UL")) - ul_Light() - //world.log << tag - +//UltraLight system, by Sukasa + + +#define UL_I_FALLOFF_SQUARE 0 +#define UL_I_FALLOFF_ROUND 1 + +#define UL_I_LIT 0 +#define UL_I_EXTINGUISHED 1 +#define UL_I_ONZERO 2 +var + ul_LightingEnabled = 1 + ul_LightingResolution = 1 + ul_Steps = 7 + ul_FalloffStyle = UL_I_FALLOFF_ROUND // Sets the lighting falloff to be either squared or circular. + ul_TopLuminosity = 0 + ul_Layer = 10 + ul_SuppressLightLevelChanges = 0 + + list/ul_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) + +var/list/light_to_instantiate = list() +var/UL_setup = 0 + +proc/setup_UL() + UL_setup = 1 + world << "\red Setting up UltraLight..." + for(var/atom/A in light_to_instantiate) + if(A.ul_IsLuminous()) + A.ul_Illuminate() + +proc/ul_Clamp(var/Value) + return min(max(Value, 0), ul_Steps) + +atom + var + LuminosityRed = 0 + LuminosityGreen = 0 + LuminosityBlue = 0 + + ul_Extinguished = UL_I_ONZERO + +atom/proc/ul_SetLuminosity(var/Red, var/Green = Red, var/Blue = Red) + + if(LuminosityRed == Red && LuminosityGreen == Green && LuminosityBlue == Blue) + return //No point doing all that work if it won't have any effect anyways... + + if (ul_Extinguished == UL_I_EXTINGUISHED) + LuminosityRed = Red + LuminosityGreen = Green + LuminosityBlue = Blue + + return + + if (ul_IsLuminous()) + ul_Extinguish() + + LuminosityRed = Red + LuminosityGreen = Green + LuminosityBlue = Blue + + ul_Extinguished = UL_I_ONZERO + + if (ul_IsLuminous()) + ul_Illuminate() + + return + +atom/proc/ul_Illuminate() + if (ul_Extinguished == UL_I_LIT) + return + + ul_Extinguished = UL_I_LIT + + ul_UpdateTopLuminosity() + luminosity = ul_Luminosity() + + for(var/turf/Affected in view(ul_Luminosity(), src)) + var/Falloff = src.ul_FalloffAmount(Affected) + + var/DeltaRed = LuminosityRed - Falloff + var/DeltaGreen = LuminosityGreen - Falloff + var/DeltaBlue = LuminosityBlue - Falloff + + if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) + + Affected.LightLevelRed += max(DeltaRed, 0) + Affected.LightLevelGreen += max(DeltaGreen, 0) + Affected.LightLevelBlue += max(DeltaBlue, 0) + + Affected.MaxRed += LuminosityRed + Affected.MaxGreen += LuminosityGreen + Affected.MaxBlue += LuminosityBlue + + Affected.ul_UpdateLight() + + if (ul_SuppressLightLevelChanges == 0) + Affected.ul_LightLevelChanged() + + for(var/atom/AffectedAtom in Affected) + AffectedAtom.ul_LightLevelChanged() + return + +atom/proc/ul_Extinguish() + + if (ul_Extinguished != UL_I_LIT) + return + + ul_Extinguished = UL_I_EXTINGUISHED + + for(var/turf/Affected in view(ul_Luminosity(), src)) + + var/Falloff = ul_FalloffAmount(Affected) + + var/DeltaRed = LuminosityRed - Falloff + var/DeltaGreen = LuminosityGreen - Falloff + var/DeltaBlue = LuminosityBlue - Falloff + + if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) + + Affected.LightLevelRed -= max(DeltaRed, 0) + Affected.LightLevelGreen -= max(DeltaGreen, 0) + Affected.LightLevelBlue -= max(DeltaBlue, 0) + + Affected.MaxRed -= LuminosityRed + Affected.MaxGreen -= LuminosityGreen + Affected.MaxBlue -= LuminosityBlue + + Affected.ul_UpdateLight() + + if (ul_SuppressLightLevelChanges == 0) + Affected.ul_LightLevelChanged() + + for(var/atom/AffectedAtom in Affected) + AffectedAtom.ul_LightLevelChanged() + + luminosity = 0 + + return + + +/* + Calculates the correct lighting falloff value (used to calculate what brightness to set the turf to) to use, + when called on a luminous atom and passed an atom in the turf to be lit. + + Supports multiple configurations, BS12 uses the circular falloff setting. This setting uses an array lookup + to avoid the cost of the square root function. +*/ +atom/proc/ul_FalloffAmount(var/atom/ref) + if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) + var/x = (ref.x - src.x) + var/y = (ref.y - src.y) + if ((x*x + y*y) > ul_FastRoot.len) + for(var/i = ul_FastRoot.len, i <= x*x+y*y, i++) + ul_FastRoot += round(sqrt(x*x+y*y)) + return round(ul_LightingResolution * ul_FastRoot[x*x + y*y + 1], 1) + + else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) + return get_dist(src, ref) + + return 0 + +atom/proc/ul_SetOpacity(var/NewOpacity) + if(opacity != NewOpacity) + + var/list/Blanked = ul_BlankLocal() + var/atom/T = src + while(T && !isturf(T)) + T = T.loc + + opacity = NewOpacity + + if(T) + T:LightLevelRed = 0 + T:LightLevelGreen = 0 + T:LightLevelBlue = 0 + + ul_UnblankLocal(Blanked) + + return + +atom/proc/ul_UnblankLocal(var/list/ReApply = view(ul_TopLuminosity, src)) + for(var/atom/Light in ReApply) + if(Light.ul_IsLuminous()) + Light.ul_Illuminate() + + return + +atom/proc/ul_BlankLocal() + var/list/Blanked = list( ) + var/TurfAdjust = isturf(src) ? 1 : 0 + + for(var/atom/Affected in view(ul_TopLuminosity, src)) + if(Affected.ul_IsLuminous() && Affected.ul_Extinguished == UL_I_LIT && (ul_FalloffAmount(Affected) <= Affected.luminosity + TurfAdjust)) + Affected.ul_Extinguish() + Blanked += Affected + + return Blanked + +atom/proc/ul_UpdateTopLuminosity() + if (ul_TopLuminosity < LuminosityRed) + ul_TopLuminosity = LuminosityRed + + if (ul_TopLuminosity < LuminosityGreen) + ul_TopLuminosity = LuminosityGreen + + if (ul_TopLuminosity < LuminosityBlue) + ul_TopLuminosity = LuminosityBlue + + return + +atom/proc/ul_Luminosity() + return max(LuminosityRed, LuminosityGreen, LuminosityBlue) + +atom/proc/ul_IsLuminous(var/Red = LuminosityRed, var/Green = LuminosityGreen, var/Blue = LuminosityBlue) + return (Red > 0 || Green > 0 || Blue > 0) + +atom/proc/ul_LightLevelChanged() + //Designed for client projects to use. Called on items when the turf they are in has its light level changed + return + +atom/New() + ..() + if(UL_setup) + if(ul_IsLuminous()) + ul_Illuminate() + else + light_to_instantiate |= src + +atom/Del() + if(ul_IsLuminous()) + ul_Extinguish() + + ..() + + return + +// formerly atom/proc/movable/Move(), this now overwrites other shit causing random inexplicable problems. +// need to find a way to plug it in to the root without overriding, might just do the snowflake treatment +/*atom/proc/Move() + ul_Extinguish() + ..() + ul_Illuminate() + return*/ + +turf + var + LightLevelRed = 0 + LightLevelGreen = 0 + LightLevelBlue = 0 + + list/MaxRed = list( ) + list/MaxGreen = list( ) + list/MaxBlue = list( ) + + + +turf/proc/ul_GetRed() + return ul_Clamp(min(LightLevelRed, max(MaxRed))) +turf/proc/ul_GetGreen() + return ul_Clamp(min(LightLevelGreen, max(MaxGreen))) +turf/proc/ul_GetBlue() + return ul_Clamp(min(LightLevelBlue, max(MaxBlue))) + +turf/proc/ul_UpdateLight() + + var/area/CurrentArea = loc + + if(!isarea(CurrentArea) || !CurrentArea.ul_Lighting) + return + + var/LightingTag = copytext(CurrentArea.tag, 1, findtext(CurrentArea.tag, ":UL")) + ":UL[ul_GetRed()]_[ul_GetGreen()]_[ul_GetBlue()]" + + if(CurrentArea.tag != LightingTag) + var/area/NewArea = locate(LightingTag) + + if(!NewArea) + NewArea = new CurrentArea.type() + NewArea.tag = LightingTag + + for(var/V in CurrentArea.vars - "contents") + if(issaved(CurrentArea.vars[V])) + NewArea.vars[V] = CurrentArea.vars[V] + + NewArea.tag = LightingTag + + NewArea.ul_Light(ul_GetRed(), ul_GetGreen(), ul_GetBlue()) + + + NewArea.contents += src + + return + +turf/proc/ul_Recalculate() + + ul_SuppressLightLevelChanges++ + + var/list/Lights = ul_BlankLocal() + + LightLevelRed = 0 + LightLevelGreen = 0 + LightLevelBlue = 0 + + ul_UnblankLocal(Lights) + + ul_SuppressLightLevelChanges-- + + return + +area + var + ul_Overlay = null + ul_Lighting = 1 + + LightLevelRed = 0 + LightLevelGreen = 0 + LightLevelBlue = 0 + + +area/proc/ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blue = LightLevelBlue) + + if(!src || !src.ul_Lighting) + return + + overlays -= ul_Overlay + + LightLevelRed = Red + LightLevelGreen = Green + LightLevelBlue = Blue + + luminosity = ul_IsLuminous(LightLevelRed, LightLevelGreen, LightLevelBlue) + + ul_Overlay = image('ULIcons.dmi', , num2text(LightLevelRed) + "-" + num2text(LightLevelGreen) + "-" + num2text(LightLevelBlue), ul_Layer) + + overlays += ul_Overlay + + return + +area/proc/ul_Prep() + + if(!tag) + tag = "[type]" + if(ul_Lighting) + if(!findtext(tag,":UL")) + ul_Light() + //world.log << tag + return \ No newline at end of file diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 2042564ee1d..be430d58e2a 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -157,14 +157,14 @@ obj New(newLoc,fl) ..() dir = pick(cardinal) - sd_SetLuminosity(3) + ul_SetLuminosity(3) firelevel = fl for(var/mob/living/carbon/human/M in loc) M.FireBurn(min(max(0.1,firelevel / 20),10)) //Burn the humans! Del() if (istype(loc, /turf/simulated)) - src.sd_SetLuminosity(0) + ul_SetLuminosity(0) loc = null @@ -267,7 +267,7 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid) temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature ) //Consume some gas. - var/consumed_gas = min(oxygen,0.005*firelevel,total_fuel) / fuel_sources + var/consumed_gas = min(oxygen,0.05*firelevel,total_fuel) / fuel_sources oxygen = max(0,oxygen-consumed_gas) diff --git a/code/ZAS/Processing.dm b/code/ZAS/Processing.dm index 2d001fb97bf..b5ebc7a9d8b 100644 --- a/code/ZAS/Processing.dm +++ b/code/ZAS/Processing.dm @@ -95,7 +95,7 @@ zone/proc/process() AirflowSpace(src) ShareSpace(air,total_space*(zone_share_percent/100)) - if(!(last_update%20)) //every 20 processes. +/* if(!(last_update%20)) //every 20 processes. if(connections) connections.Remove(null) if(!connections.len) @@ -103,7 +103,7 @@ zone/proc/process() if(connected_zones) connected_zones.Remove(null) if(!connected_zones.len) - del connected_zones + del connected_zones*/ //React the air here. //air.react(null,0) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 8b93f01736d..e4aa79dbb0b 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -124,7 +124,7 @@ playSpecials(destturf,effectout,soundout) // Re-Apply lum - teleatom.sd_SetLuminosity(prevlum) + teleatom.ul_SetLuminosity(prevlum) destarea.Entered(teleatom) diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm index 592198d5d21..03517f28075 100755 --- a/code/defines/area/Space Station 13 areas.dm +++ b/code/defines/area/Space Station 13 areas.dm @@ -126,10 +126,8 @@ proc/process_ghost_teleport_locs() //place to another. Look at escape shuttle for example. //All shuttles show now be under shuttle since we have smooth-wall code. -/area/shuttle //DO NOT TURN THE SD_LIGHTING STUFF ON FOR SHUTTLES. IT BREAKS THINGS. +/area/shuttle //DO NOT TURN THE ul_Lighting STUFF ON FOR SHUTTLES. IT BREAKS THINGS. requires_power = 0 - luminosity = 1 - sd_lighting = 0 /area/shuttle/arrival name = "\improper Arrival Shuttle" @@ -233,15 +231,11 @@ proc/process_ghost_teleport_locs() icon_state = "shuttle" name = "\improper Alien Shuttle Base" requires_power = 1 - luminosity = 0 - sd_lighting = 1 /area/shuttle/alien/mine icon_state = "shuttle" name = "\improper Alien Shuttle Mine" requires_power = 1 - luminosity = 0 - sd_lighting = 1 /area/shuttle/prison/ name = "\improper Prison Shuttle" @@ -313,7 +307,7 @@ proc/process_ghost_teleport_locs() icon_state = "start" requires_power = 0 luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 has_gravity = 1 // === end remove @@ -808,8 +802,6 @@ proc/process_ghost_teleport_locs() /area/holodeck name = "\improper Holodeck" icon_state = "Holodeck" - luminosity = 1 - sd_lighting = 0 /area/holodeck/alphadeck name = "\improper Holodeck Alpha" @@ -966,8 +958,6 @@ proc/process_ghost_teleport_locs() /area/solar requires_power = 0 - luminosity = 1 - sd_lighting = 0 auxport name = "\improper Port Auxiliary Solar Array" @@ -1483,26 +1473,18 @@ proc/process_ghost_teleport_locs() /area/turret_protected/AIsatextFP name = "\improper AI Sat Ext" icon_state = "storage" - luminosity = 1 - sd_lighting = 0 /area/turret_protected/AIsatextFS name = "\improper AI Sat Ext" icon_state = "storage" - luminosity = 1 - sd_lighting = 0 /area/turret_protected/AIsatextAS name = "\improper AI Sat Ext" icon_state = "storage" - luminosity = 1 - sd_lighting = 0 /area/turret_protected/AIsatextAP name = "\improper AI Sat Ext" icon_state = "storage" - luminosity = 1 - sd_lighting = 0 /area/turret_protected/NewAIMain name = "\improper AI Main New" @@ -1580,7 +1562,7 @@ proc/process_ghost_teleport_locs() /area/turret_protected/AssistantRoom name = "\improper Assistant Room" icon_state = "storage" - sd_lighting = 0 + ul_Lighting = 0 ///////////////////////////////////////////////////////////////////// /* @@ -1653,7 +1635,7 @@ var/list/the_station_areas = list ( name = "Keelin's private beach" icon_state = "null" luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 requires_power = 0 var/sound/mysound = null diff --git a/code/defines/obj/door.dm b/code/defines/obj/door.dm index 92196e75f69..e4e01d8c66d 100644 --- a/code/defines/obj/door.dm +++ b/code/defines/obj/door.dm @@ -52,8 +52,8 @@ f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST)) f1.density = density f2.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) Del() del f1 @@ -71,8 +71,8 @@ f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH)) f1.density = density f2.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) Del() del f1 @@ -96,10 +96,10 @@ f2.density = density f3.density = density f4.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) - f4.sd_SetOpacity(opacity) - f3.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) + f4.ul_SetOpacity(opacity) + f3.ul_SetOpacity(opacity) Del() del f1 @@ -125,10 +125,10 @@ f2.density = density f3.density = density f4.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) - f4.sd_SetOpacity(opacity) - f3.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) + f4.ul_SetOpacity(opacity) + f3.ul_SetOpacity(opacity) Del() del f1 diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 82d54ac17ef..efb3da713da 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -1149,16 +1149,16 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/Del() if(istype(loc,/mob)) - loc.sd_SetLuminosity(loc.luminosity - potency/5) + loc.ul_SetLuminosity(loc.LuminosityRed - potency/5, loc.LuminosityGreen - potency/5, loc.LuminosityBlue - potency/5) ..() /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/pickup(mob/user) - src.sd_SetLuminosity(0) - user.total_luminosity += potency/5 + src.ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + potency/5, user.LuminosityGreen + potency/5, user.LuminosityBlue + potency/5) /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries/dropped(mob/user) - user.total_luminosity -= potency/5 - src.sd_SetLuminosity(potency/5) + user.ul_SetLuminosity(user.LuminosityRed - potency/5, user.LuminosityGreen - potency/5, user.LuminosityBlue - potency/5) + src.ul_SetLuminosity(potency/5) /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod seed = "/obj/item/seeds/cocoapodseed" @@ -1621,7 +1621,7 @@ if(istype(src.loc,/mob)) pickup(src.loc) else - src.sd_SetLuminosity(potency/10) + src.ul_SetLuminosity(potency/10) lifespan = 120 //ten times that is the delay endurance = 30 maturation = 15 @@ -1646,16 +1646,16 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Del() if(istype(loc,/mob)) - loc.sd_SetLuminosity(loc.luminosity - potency/10) + loc.ul_SetLuminosity(loc.LuminosityRed - potency/10, loc.LuminosityGreen - potency/10, loc.LuminosityBlue - potency/10) ..() /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user) - src.sd_SetLuminosity(0) - user.total_luminosity += potency/10 + ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + potency/10, user.LuminosityGreen + potency/10, user.LuminosityBlue + potency/10) /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/dropped(mob/user) - user.total_luminosity -= potency/10 - src.sd_SetLuminosity(potency/10) + user.ul_SetLuminosity(user.LuminosityRed - potency/10, user.LuminosityGreen - potency/10, user.LuminosityBlue - potency/10) + ul_SetLuminosity(potency/10) // ********************** // Other harvested materials from plants (that are not food) diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 8bfb13504d1..2ef0a60f833 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -1515,9 +1515,9 @@ proc/listclearnulls(list/list) var/area/AR = X.loc - if(AR.sd_lighting) + if(AR.ul_Lighting) X.opacity = !X.opacity - X.sd_SetOpacity(!X.opacity) + X.ul_SetOpacity(!X.opacity) toupdate += X @@ -1526,9 +1526,9 @@ proc/listclearnulls(list/list) var/area/AR2 = ttl.loc - if(AR2.sd_lighting) + if(AR2.ul_Lighting) ttl.opacity = !ttl.opacity - ttl.sd_SetOpacity(!ttl.opacity) + ttl.ul_SetOpacity(!ttl.opacity) fromupdate += ttl @@ -1687,9 +1687,9 @@ proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) var/area/AR = X.loc - if(AR.sd_lighting) + if(AR.ul_Lighting) X.opacity = !X.opacity - X.sd_SetOpacity(!X.opacity) + X.ul_SetOpacity(!X.opacity) toupdate += X diff --git a/code/defines/turf.dm b/code/defines/turf.dm index 3d9befcfba7..84ee94551e9 100644 --- a/code/defines/turf.dm +++ b/code/defines/turf.dm @@ -45,6 +45,8 @@ thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 + LightLevelBlue = 5 + transit var/pushdirection // push things that get caught in the transit tile this direction @@ -311,7 +313,7 @@ New() ..() - sd_SetLuminosity(3) + ul_SetLuminosity(3) /turf/simulated/wall/mineral/gold walltype = "gold" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 629e420d529..03330d9fbd4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -14,9 +14,9 @@ uid = ++global_uid spawn(1) //world.log << "New: [src] [tag]" - var/sd_created = findtext(tag,"sd_L") - sd_New(sd_created) - if(sd_created) + var/ul_created = findtext(tag,":UL") + ul_Prep() + if(ul_created) related += src return related = list(src) @@ -27,7 +27,7 @@ if(name == "Space") // override defaults for space requires_power = 1 always_unpowered = 1 - sd_SetLuminosity(1) + ul_SetLuminosity(1) power_light = 0 power_equip = 0 power_environ = 0 @@ -38,11 +38,11 @@ power_equip = 0//rastaf0 power_environ = 0//rastaf0 luminosity = 1 - sd_lighting = 0 // *DAL* + ul_Lighting = 0 // *DAL* else luminosity = 0 area_lights_luminosity = rand(6,9) - //sd_SetLuminosity(0) // *DAL* + //ul_SetLuminosity(0) // *DAL* diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 420d36e9178..50d14572e77 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -477,7 +477,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. update_icon() if (!istype(src, /obj/machinery/door/airlock/glass)) - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) src.operating = 0 return user << "\red You need to be wielding the Fire axe to do that." @@ -494,7 +494,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. update_icon() if (!istype(src, /obj/machinery/door/airlock/glass)) - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) src.operating = 0 return @@ -513,7 +513,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. update_icon() if ((src.visible) && (!istype(src, /obj/machinery/door/airlock/glass))) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) src.operating = 0 else user << "\red You need to be wielding the Fire axe to do that." @@ -527,7 +527,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. update_icon() if ((src.visible) && (!istype(src, /obj/machinery/door/airlock/glass))) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) src.operating = 0 else diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 50fdb03b0cf..840cec57eef 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -249,12 +249,12 @@ if(!src.operating) //in case of emag src.operating = 1 animate("opening") - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) sleep(10) src.layer = 2.7 src.density = 0 update_icon() - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) update_nearby_tiles() if(operating == 1) //emag again @@ -332,7 +332,7 @@ update_icon() if(src.visible && (!src.glass)) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) if(operating == 1) operating = 0 update_nearby_tiles() diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index dfdfe818d6c..f1d78e40b4e 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -22,7 +22,7 @@ src.icon_state = "pdoor0" sleep(15) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) src.operating = 0 return return @@ -38,7 +38,7 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) update_nearby_tiles() if(operating == 1) //emag again @@ -56,7 +56,7 @@ src.icon_state = "pdoor1" src.density = 1 if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) @@ -74,12 +74,12 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) f1.density = 0 - f1.sd_SetOpacity(0) + f1.ul_SetOpacity(0) f2.density = 0 - f2.sd_SetOpacity(0) + f2.ul_SetOpacity(0) update_nearby_tiles() @@ -99,12 +99,12 @@ src.density = 1 f1.density = 1 - f1.sd_SetOpacity(1) + f1.ul_SetOpacity(1) f2.density = 1 - f2.sd_SetOpacity(1) + f2.ul_SetOpacity(1) if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) @@ -122,16 +122,16 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) f1.density = 0 - f1.sd_SetOpacity(0) + f1.ul_SetOpacity(0) f2.density = 0 - f2.sd_SetOpacity(0) + f2.ul_SetOpacity(0) f3.density = 0 - f3.sd_SetOpacity(0) + f3.ul_SetOpacity(0) f4.density = 0 - f4.sd_SetOpacity(0) + f4.ul_SetOpacity(0) update_nearby_tiles() @@ -151,16 +151,16 @@ src.density = 1 f1.density = 1 - f1.sd_SetOpacity(1) + f1.ul_SetOpacity(1) f2.density = 1 - f2.sd_SetOpacity(1) + f2.ul_SetOpacity(1) f3.density = 1 - f3.sd_SetOpacity(1) + f3.ul_SetOpacity(1) f4.density = 1 - f4.sd_SetOpacity(1) + f4.ul_SetOpacity(1) if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) @@ -178,12 +178,12 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) f1.density = 0 - f1.sd_SetOpacity(0) + f1.ul_SetOpacity(0) f2.density = 0 - f2.sd_SetOpacity(0) + f2.ul_SetOpacity(0) update_nearby_tiles() @@ -203,12 +203,12 @@ src.density = 1 f1.density = 1 - f1.sd_SetOpacity(1) + f1.ul_SetOpacity(1) f2.density = 1 - f2.sd_SetOpacity(1) + f2.ul_SetOpacity(1) if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) @@ -226,16 +226,16 @@ src.icon_state = "pdoor0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) f1.density = 0 - f1.sd_SetOpacity(0) + f1.ul_SetOpacity(0) f2.density = 0 - f2.sd_SetOpacity(0) + f2.ul_SetOpacity(0) f3.density = 0 - f3.sd_SetOpacity(0) + f3.ul_SetOpacity(0) f4.density = 0 - f4.sd_SetOpacity(0) + f4.ul_SetOpacity(0) update_nearby_tiles() @@ -255,16 +255,16 @@ src.density = 1 f1.density = 1 - f1.sd_SetOpacity(1) + f1.ul_SetOpacity(1) f2.density = 1 - f2.sd_SetOpacity(1) + f2.ul_SetOpacity(1) f3.density = 1 - f3.sd_SetOpacity(1) + f3.ul_SetOpacity(1) f4.density = 1 - f4.sd_SetOpacity(1) + f4.ul_SetOpacity(1) if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) @@ -285,8 +285,8 @@ f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,EAST)) f1.density = density f2.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) Del() del f1 @@ -304,8 +304,8 @@ f2 = new/obj/machinery/door/poddoor/filler_object (get_step(src,NORTH)) f1.density = density f2.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) Del() del f1 @@ -329,10 +329,10 @@ f2.density = density f3.density = density f4.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) - f4.sd_SetOpacity(opacity) - f3.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) + f4.ul_SetOpacity(opacity) + f3.ul_SetOpacity(opacity) Del() del f1 @@ -358,10 +358,10 @@ f2.density = density f3.density = density f4.density = density - f1.sd_SetOpacity(opacity) - f2.sd_SetOpacity(opacity) - f4.sd_SetOpacity(opacity) - f3.sd_SetOpacity(opacity) + f1.ul_SetOpacity(opacity) + f2.ul_SetOpacity(opacity) + f4.ul_SetOpacity(opacity) + f3.ul_SetOpacity(opacity) Del() del f1 diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 8e1b9a8cae9..386eac23c23 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -18,7 +18,7 @@ src.icon_state = "shutter0" sleep(15) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) src.operating = 0 return return @@ -34,7 +34,7 @@ src.icon_state = "shutter0" sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) update_nearby_tiles() if(operating == 1) //emag again @@ -52,7 +52,7 @@ src.icon_state = "shutter1" src.density = 1 if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index dfa6f2ccb03..d885ecb77a1 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -94,7 +94,7 @@ sleep(10) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) update_nearby_tiles() if(operating == 1) //emag again @@ -111,7 +111,7 @@ src.density = 1 if (src.visible) - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) update_nearby_tiles() sleep(10) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 2b87f3211cc..86fd9a7cf90 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -24,17 +24,17 @@ /obj/machinery/flasher/New() sleep(4) - src.sd_SetLuminosity(2) + src.ul_SetLuminosity(2) /obj/machinery/flasher/power_change() if ( powered() ) stat &= ~NOPOWER icon_state = "[base_state]1" - src.sd_SetLuminosity(2) + src.ul_SetLuminosity(2) else stat |= ~NOPOWER icon_state = "[base_state]1-p" - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob) diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 08e13e535cb..992c79e6805 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -16,17 +16,17 @@ if (!on) if (luminosity) updateicon() - sd_SetLuminosity(0) + ul_SetLuminosity(0) return if(!luminosity && cell && cell.charge > 0) - sd_SetLuminosity(10) + ul_SetLuminosity(10) updateicon() if(!cell && luminosity) on = 0 updateicon() - sd_SetLuminosity(0) + ul_SetLuminosity(0) return cell.charge -= use @@ -34,7 +34,7 @@ if(cell.charge <= 0 && luminosity) on = 0 updateicon() - sd_SetLuminosity(0) + ul_SetLuminosity(0) return /obj/machinery/floodlight/attack_hand(mob/user as mob) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index c9a9faa92ee..2f85c5db954 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -72,20 +72,20 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ hologram.icon = A.holo_icon hologram.mouse_opacity = 0//So you can't click on it. hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - hologram.sd_SetLuminosity(1)//To make it glowy. + hologram.ul_SetLuminosity(1)//To make it glowy. hologram.anchored = 1//So space wind cannot drag it. hologram.name = "AI hologram"//If someone decides to right click. - sd_SetLuminosity(1)//To make the pad glowy. + ul_SetLuminosity(0,0,1)//To make the pad glowy. icon_state = "holopad1" master = A//AI is the master. use_power = 2//Active power usage. return 1 /obj/machinery/hologram/holopad/proc/clear_holo() - hologram.sd_SetLuminosity(0)//Clear lighting. + hologram.ul_SetLuminosity(0)//Clear lighting. del(hologram)//Get rid of hologram. master = null//Null the master, since no-one is using it now. - sd_SetLuminosity(0)//Clear lighting for the parent. + ul_SetLuminosity(0)//Clear lighting for the parent. icon_state = "holopad0" use_power = 1//Passive power usage. return 1 diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index d665d3a473e..534c501d1bf 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -179,12 +179,12 @@ obj/machinery/hydroponics/proc/updateicon() if(myseed) if(luminosity && !istype(myseed,/obj/item/seeds/glowshroom)) //revert luminosity to 0 - sd_SetLuminosity(0) + ul_SetLuminosity(0) else if(!luminosity && istype(myseed,/obj/item/seeds/glowshroom)) //update luminosity - sd_SetLuminosity(myseed.potency/10) + ul_SetLuminosity(myseed.potency/10) else if(luminosity) - sd_SetLuminosity(0) + ul_SetLuminosity(0) return @@ -1014,10 +1014,10 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if(myseed) if(luminosity && !istype(myseed,/obj/item/seeds/glowshroom)) - sd_SetLuminosity(0) + ul_SetLuminosity(0) else if(!luminosity && istype(myseed,/obj/item/seeds/glowshroom)) - sd_SetLuminosity(myseed.potency/10) + ul_SetLuminosity(myseed.potency/10) else if(luminosity) - sd_SetLuminosity(0) + ul_SetLuminosity(0) return \ No newline at end of file diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 015a35bc4b1..35f94eff582 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -53,11 +53,11 @@ if ( powered() && disable == 0 ) stat &= ~NOPOWER icon_state = "[base_state]" - src.sd_SetLuminosity(2) + src.ul_SetLuminosity(2) else stat |= ~NOPOWER icon_state = "[base_state]-p" - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/device/detective_scanner)) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 9b98922870b..d334b02f9f7 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -427,7 +427,7 @@ if(A && B) needs_power = 1 spawn(1) - src.sd_SetLuminosity(3) + src.ul_SetLuminosity(3) /* for(var/mob/M as mob in src.loc) //does not work for some reason. if(istype(M,/mob/living/carbon)) diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index f77e9f4a77a..76882780fe7 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -55,12 +55,12 @@ datum/controller/game_controller // Now that the game is world is fully initialized, pause server until a user connects. world.sleep_offline = 1 - setup_objects() - setupgenetics() setupdooralarms() + setup_objects() + // for(var/i = 0, i < max_secret_rooms, i++) // make_mining_asteroid_secret() // Because energy cutlasses, facehuggers, and empty rooms are silly. FOR NOW. - Erthilo @@ -104,6 +104,8 @@ datum/controller/game_controller new /obj/structure/closet/emcloset(loc) emclosetcount-- + setup_UL() + world << "\red \b Initializations complete." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f2ac1f25269..d1c9c000be0 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -942,9 +942,9 @@ return lights = !lights if(lights) - src.sd_SetLuminosity(src.luminosity + src.lights_power) + src.ul_SetLuminosity(src.luminosity + src.lights_power) else - src.sd_SetLuminosity(src.luminosity - src.lights_power) + src.ul_SetLuminosity(src.luminosity - src.lights_power) src.log_message("Toggled lights.") return diff --git a/code/game/objects/alien/weeds.dm b/code/game/objects/alien/weeds.dm index 3c07c2fd732..4ae4b2f118a 100644 --- a/code/game/objects/alien/weeds.dm +++ b/code/game/objects/alien/weeds.dm @@ -13,7 +13,7 @@ /obj/effect/alien/weeds/node/New() ..() - sd_SetLuminosity(NODERANGE) + ul_SetLuminosity(NODERANGE) return /obj/effect/alien/weeds/proc/Life() diff --git a/code/game/objects/blood.dm b/code/game/objects/blood.dm index 3581860518a..389802bd9aa 100644 --- a/code/game/objects/blood.dm +++ b/code/game/objects/blood.dm @@ -63,7 +63,7 @@ New() ..() - sd_SetLuminosity(1) + ul_SetLuminosity(1) spawn(1200) // 2 minutes del(src) \ No newline at end of file diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index 9e2ec3aac75..83658eb318e 100755 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -173,13 +173,13 @@ */ /obj/item/device/pda/pickup(mob/user) if (fon) - sd_SetLuminosity(0) - user.total_luminosity += f_lum + ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + (f_lum - 1), user.LuminosityGreen + (f_lum - 1), user.LuminosityBlue + (f_lum + 1)) /obj/item/device/pda/dropped(mob/user) if (fon) - user.total_luminosity -= f_lum - sd_SetLuminosity(f_lum) + user.ul_SetLuminosity(user.LuminosityRed - (f_lum - 1), user.LuminosityGreen - (f_lum - 1), user.LuminosityBlue - (f_lum + 1)) + ul_SetLuminosity(f_lum - 1, f_lum - 1, f_lum + 1) /obj/item/device/pda/New() ..() @@ -468,11 +468,11 @@ fon = (!fon) if (src in U.contents) if (fon) - U.total_luminosity += f_lum + U.ul_SetLuminosity(U.LuminosityRed + (f_lum - 1), U.LuminosityGreen + (f_lum - 1), U.LuminosityBlue + (f_lum + 1)) else - U.total_luminosity -= f_lum + U.ul_SetLuminosity(U.LuminosityRed - (f_lum - 1), U.LuminosityGreen - (f_lum - 1), U.LuminosityBlue - (f_lum + 1)) else - sd_SetLuminosity(fon * f_lum) + ul_SetLuminosity(fon * f_lum) if("Medical Scan") if(scanmode == 1) scanmode = 0 @@ -939,7 +939,7 @@ if (src in M.contents) if(fon) fon = 0 - M.total_luminosity -= f_lum + M.ul_SetLuminosity(M.LuminosityRed + (f_lum - 1), M.LuminosityGreen + (f_lum - 1), M.LuminosityBlue + (f_lum + 1)) if(T) T.hotspot_expose(700,125) diff --git a/code/game/objects/devices/flashlight.dm b/code/game/objects/devices/flashlight.dm index 62b9c9506e0..503e624bfe3 100644 --- a/code/game/objects/devices/flashlight.dm +++ b/code/game/objects/devices/flashlight.dm @@ -17,30 +17,30 @@ ..() if (on) icon_state = icon_on - src.sd_SetLuminosity(brightness_on) + src.ul_SetLuminosity(brightness_on, brightness_on, 0) else icon_state = icon_off - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) /obj/item/device/flashlight/proc/update_brightness(var/mob/user = null) if (on) icon_state = icon_on if(src.loc == user) - user.total_luminosity += brightness_on + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + brightness_on, user.LuminosityBlue) else if (isturf(src.loc)) - src.sd_SetLuminosity(brightness_on) + src.ul_SetLuminosity(brightness_on, brightness_on, 0) else icon_state = icon_off if(src.loc == user) - user.total_luminosity -= brightness_on + user.ul_SetLuminosity(user.LuminosityRed - brightness_on, user.LuminosityGreen - brightness_on, user.LuminosityBlue) else if (isturf(src.loc)) - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) /obj/item/device/flashlight/attack_self(mob/user) - if(!isturf(user.loc)) - user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. - return +// if(!isturf(user.loc)) +// user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities. +// return on = !on update_brightness(user) return @@ -82,14 +82,14 @@ /obj/item/device/flashlight/pickup(mob/user) if(on) - user.total_luminosity += brightness_on - src.sd_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + brightness_on, user.LuminosityBlue) + src.ul_SetLuminosity(0) /obj/item/device/flashlight/dropped(mob/user) if(on) - user.total_luminosity -= brightness_on - src.sd_SetLuminosity(brightness_on) + user.ul_SetLuminosity(user.LuminosityRed - brightness_on, user.LuminosityGreen - brightness_on, user.LuminosityBlue) + src.ul_SetLuminosity(brightness_on) /obj/item/device/flashlight/pen @@ -148,21 +148,19 @@ item_state = "hardhat[on]_[color]" if(on) - user.total_luminosity += brightness_on + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) else - user.total_luminosity -= brightness_on + user.ul_SetLuminosity(user.LuminosityRed - brightness_on, user.LuminosityGreen - (brightness_on - 1), user.LuminosityBlue) /obj/item/clothing/head/helmet/hardhat/pickup(mob/user) if(on) - user.total_luminosity += brightness_on - user.UpdateLuminosity() - src.sd_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) + ul_SetLuminosity(0) /obj/item/clothing/head/helmet/hardhat/dropped(mob/user) if(on) - user.total_luminosity -= brightness_on - user.UpdateLuminosity() - src.sd_SetLuminosity(brightness_on) + user.ul_SetLuminosity(user.LuminosityRed - brightness_on, user.LuminosityGreen - (brightness_on - 1), user.LuminosityBlue) + ul_SetLuminosity(brightness_on, brightness_on - 1, 0) //RIG helmet light /obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) @@ -174,21 +172,19 @@ item_state = "rig[on]-[color]" if(on) - user.total_luminosity += brightness_on + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) else - user.total_luminosity -= brightness_on + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) /obj/item/clothing/head/helmet/space/rig/pickup(mob/user) if(on) - user.total_luminosity += brightness_on - user.UpdateLuminosity() - src.sd_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) + ul_SetLuminosity(0) /obj/item/clothing/head/helmet/space/rig/dropped(mob/user) if(on) - user.total_luminosity -= brightness_on - user.UpdateLuminosity() - src.sd_SetLuminosity(brightness_on) + user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue) + ul_SetLuminosity(brightness_on, brightness_on-1, 0) // the desk lamps are a bit special /obj/item/device/flashlight/lamp diff --git a/code/game/objects/devices/powersink.dm b/code/game/objects/devices/powersink.dm index 4edc453e01d..ea45398d5c9 100644 --- a/code/game/objects/devices/powersink.dm +++ b/code/game/objects/devices/powersink.dm @@ -50,7 +50,7 @@ for(var/mob/M in viewers(user)) if(M == user) continue M << "[user] detaches the power sink from the cable." - sd_SetLuminosity(0) + ul_SetLuminosity(0) icon_state = "powersink0" return @@ -85,7 +85,7 @@ if(M == user) continue M << "[user] deactivates the power sink!" mode = 1 - sd_SetLuminosity(0) + ul_SetLuminosity(0) icon_state = "powersink0" processing_objects.Remove(src) @@ -94,7 +94,7 @@ var/datum/powernet/PN = attached.get_powernet() if(PN) if(!luminosity) - sd_SetLuminosity(12) + ul_SetLuminosity(12) // found a powernet, so drain up to max power from it diff --git a/code/game/objects/effect_system.dm b/code/game/objects/effect_system.dm index 3e80c869db6..74b382e8944 100644 --- a/code/game/objects/effect_system.dm +++ b/code/game/objects/effect_system.dm @@ -975,10 +975,10 @@ steam.start() -- spawns the effect ..() update_nearby_tiles(1) spawn(1) - sd_NewOpacity(1) + ul_SetOpacity(1) Del() - sd_NewOpacity(0) + ul_SetOpacity(0) density = 0 update_nearby_tiles(1) ..() diff --git a/code/game/objects/glowshroom.dm b/code/game/objects/glowshroom.dm index 6ae84e27615..6a3f3410eef 100644 --- a/code/game/objects/glowshroom.dm +++ b/code/game/objects/glowshroom.dm @@ -41,7 +41,7 @@ icon_state = "glowshroomf" spawn(2) //allows the luminosity and spread rate to be affected by potency at the moment of creation - sd_SetLuminosity(potency/10) + ul_SetLuminosity(potency/10) spawn(delay) if(src) Spread() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 3e103f23ab6..e54c7fbb778 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -51,7 +51,7 @@ //src.damtype = "fire" for(var/mob/O in viewers(usr, null)) O.show_message(flavor_text, 1) - sd_SetLuminosity(CANDLE_LUM) + ul_SetLuminosity(CANDLE_LUM, CANDLE_LUM -2, 0) processing_objects.Add(src) @@ -74,20 +74,19 @@ if(lit) lit = 0 update_icon() - sd_SetLuminosity(0) - user.total_luminosity -= CANDLE_LUM + ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed - CANDLE_LUM, user.LuminosityGreen - (CANDLE_LUM - 2), user.LuminosityBlue) pickup(mob/user) if(lit) - src.sd_SetLuminosity(0) - user.total_luminosity += CANDLE_LUM - + ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + CANDLE_LUM, user.LuminosityGreen + (CANDLE_LUM - 2), user.LuminosityBlue) dropped(mob/user) if(lit) - user.total_luminosity -= CANDLE_LUM - src.sd_SetLuminosity(CANDLE_LUM) + user.ul_SetLuminosity(user.LuminosityRed - CANDLE_LUM, user.LuminosityGreen - (CANDLE_LUM - 2), user.LuminosityBlue) + src.ul_SetLuminosity(CANDLE_LUM, CANDLE_LUM, 0) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 77628fab40e..fe196918547 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -441,7 +441,7 @@ ZIPPO for(var/mob/O in viewers(user, null)) O.show_message("\red After a few attempts, \the [user] manages to light \the [src], they however burn themself in the process.", 1) - user.total_luminosity += 2 + user.ul_SetLuminosity(user.LuminosityRed + 2, user.LuminosityGreen + 1, user.LuminosityBlue) processing_objects.Add(src) else src.lit = 0 @@ -454,7 +454,7 @@ ZIPPO for(var/mob/O in viewers(user, null)) O.show_message("\red [user] quietly shuts off the [src].", 1) - user.total_luminosity -= 2 + user.ul_SetLuminosity(user.LuminosityRed - 2, user.LuminosityGreen - 1, user.LuminosityBlue) processing_objects.Remove(src) else return ..() @@ -483,13 +483,13 @@ ZIPPO pickup(mob/user) if(lit) - src.sd_SetLuminosity(0) - user.total_luminosity += 2 + ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + 2, user.LuminosityGreen + 1, user.LuminosityBlue) return dropped(mob/user) if(lit) - user.total_luminosity -= 2 - src.sd_SetLuminosity(2) + user.ul_SetLuminosity(user.LuminosityRed - 2, user.LuminosityGreen - 1, user.LuminosityBlue) + ul_SetLuminosity(2) return diff --git a/code/game/objects/items/weapons/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm index c3b8a87196d..48608855433 100644 --- a/code/game/objects/items/weapons/papers_bins.dm +++ b/code/game/objects/items/weapons/papers_bins.dm @@ -37,9 +37,9 @@ NOTEBOOK M << "\red \the [src] burns up." if(istype(src.loc,/mob)) var/mob/M = src.loc - M.total_luminosity -= 8 + M.ul_SetLuminosity(M.LuminosityRed - 8, M.LuminosityGreen - 6, M.LuminosityBlue) else - src.sd_SetLuminosity(0) + ul_SetLuminosity(0) processing_objects.Remove(src) del(src) @@ -53,13 +53,13 @@ NOTEBOOK /obj/item/weapon/paper/pickup(mob/user) if(burning) - src.sd_SetLuminosity(0) - user.total_luminosity += 8 + src.ul_SetLuminosity(0) + user.ul_SetLuminosity(user.LuminosityRed + 8, user.LuminosityGreen + 6, user.LuminosityBlue) /obj/item/weapon/paper/dropped(mob/user) if(burning) - user.total_luminosity -= 8 - src.sd_SetLuminosity(8) + user.ul_SetLuminosity(user.LuminosityRed - 8, user.LuminosityGreen - 6, user.LuminosityBlue) + src.ul_SetLuminosity(8,6,0) /obj/item/weapon/paper/examine() set src in view() @@ -163,7 +163,7 @@ NOTEBOOK if(is_burn(P)) for(var/mob/M in viewers(5, get_turf(src))) M << "\red [user] sets \the [src] on fire." - user.total_luminosity += 8 + user.ul_SetLuminosity(user.LuminosityRed + 8, user.LuminosityGreen + 6, user.LuminosityBlue) burning = 1 processing_objects.Add(src) update_icon() diff --git a/code/game/objects/mineral_doors.dm b/code/game/objects/mineral_doors.dm index 9e7fcb5fb2f..43e2a64041f 100644 --- a/code/game/objects/mineral_doors.dm +++ b/code/game/objects/mineral_doors.dm @@ -170,7 +170,7 @@ New() ..() - sd_SetLuminosity(3) + ul_SetLuminosity(3) /obj/structure/mineral_door/sandstone mineralType = "sandstone" diff --git a/code/game/objects/transfer_valve.dm b/code/game/objects/transfer_valve.dm index 3404d4b6498..e92b1ff8d8a 100644 --- a/code/game/objects/transfer_valve.dm +++ b/code/game/objects/transfer_valve.dm @@ -191,20 +191,20 @@ flick("fwall_opening", src) sleep(15) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) var/turf/T = src.loc - T.sd_LumReset() + T.ul_Recalculate() else icon_state = "wall" flick("fwall_closing", src) sleep(15) src.density = 1 - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) var/turf/T = src.loc //T.sd_LumUpdate() src.relativewall() - T.sd_LumReset() + T.ul_Recalculate() attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -235,20 +235,20 @@ flick("frwall_opening", src) sleep(15) src.density = 0 - src.sd_SetOpacity(0) + src.ul_SetOpacity(0) var/turf/T = src.loc - T.sd_LumReset() + T.ul_Recalculate() else icon_state = "r_wall" flick("frwall_closing", src) sleep(15) src.density = 1 - src.sd_SetOpacity(1) + src.ul_SetOpacity(1) var/turf/T = src.loc //T.sd_LumUpdate() src.relativewall() - T.sd_LumReset() + T.ul_Recalculate() attackby(obj/item/weapon/W as obj, mob/user as mob) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 8e173913891..ce3a54e9211 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -20,18 +20,18 @@ var/supply_shuttle_points = 50 var/ordernum=0 var/list/supply_groups = new() -/area/supply/station //DO NOT TURN THE SD_LIGHTING STUFF ON FOR SHUTTLES. IT BREAKS THINGS. +/area/supply/station //DO NOT TURN THE ul_Lighting STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "supply shuttle" icon_state = "shuttle3" luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 requires_power = 0 -/area/supply/dock //DO NOT TURN THE SD_LIGHTING STUFF ON FOR SHUTTLES. IT BREAKS THINGS. +/area/supply/dock //DO NOT TURN THE ul_Lighting STUFF ON FOR SHUTTLES. IT BREAKS THINGS. name = "supply shuttle" icon_state = "shuttle3" luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 requires_power = 0 //SUPPLY PACKS MOVED TO /code/defines/obj/supplypacks.dm diff --git a/code/game/turf.dm b/code/game/turf.dm index d530fc406a7..31bf5a1f9b3 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -162,7 +162,7 @@ if (!explode) W.opacity = 1 - W.sd_SetOpacity(0) + W.ul_SetOpacity(0) //This is probably gonna make lighting go a bit wonky in bombed areas, but sd_SetOpacity was the primary reason bombs have been so laggy. --NEO W.levelupdate() air_master.tiles_to_update |= W @@ -191,7 +191,7 @@ if(prior_icon) W.icon_state = prior_icon else W.icon_state = "plating" W.opacity = 1 - W.sd_SetOpacity(0) + W.ul_SetOpacity(0) W.levelupdate() air_master.tiles_to_update |= W @@ -327,7 +327,7 @@ var/turf/simulated/wall/S = new /turf/simulated/wall( locate(src.x, src.y, src.z) ) S.icon_old = old_icon S.opacity = 0 - S.sd_NewOpacity(1) + S.ul_SetOpacity(1) levelupdate() air_master.tiles_to_update |= S @@ -349,7 +349,7 @@ var/turf/simulated/wall/r_wall/S = new /turf/simulated/wall/r_wall( locate(src.x, src.y, src.z) ) S.icon_old = old_icon S.opacity = 0 - S.sd_NewOpacity(1) + S.ul_SetOpacity(1) levelupdate() air_master.tiles_to_update |= S @@ -851,7 +851,7 @@ spawn(100) if(O) del(O) - F.sd_LumReset() + F.ul_Recalculate() return /turf/simulated/wall/meteorhit(obj/M as obj) @@ -1055,19 +1055,19 @@ turf/simulated/floor/proc/update_icon() switch(T.state) if(0) icon_state = "light_on" - sd_SetLuminosity(5) + ul_SetLuminosity(5) if(1) var/num = pick("1","2","3","4") icon_state = "light_on_flicker[num]" - sd_SetLuminosity(5) + ul_SetLuminosity(5) if(2) icon_state = "light_on_broken" - sd_SetLuminosity(5) + ul_SetLuminosity(5) if(3) icon_state = "light_off" - sd_SetLuminosity(0) + ul_SetLuminosity(0) else - sd_SetLuminosity(0) + ul_SetLuminosity(0) icon_state = "light_off" if(is_grass_floor()) if(!broken && !burnt) @@ -1215,7 +1215,7 @@ turf/simulated/floor/return_siding_icon_state() if(!floor_tile) return del(floor_tile) icon_plating = "plating" - sd_SetLuminosity(0) + ul_SetLuminosity(0) floor_tile = null intact = 0 broken = 0 @@ -1231,7 +1231,7 @@ turf/simulated/floor/return_siding_icon_state() broken = 0 burnt = 0 intact = 1 - sd_SetLuminosity(0) + ul_SetLuminosity(0) if(T) if(istype(T,/obj/item/stack/tile/plasteel)) floor_tile = T diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 80f76fe9646..21a64028bdd 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -213,7 +213,7 @@ if(new_value == null) return if(variable=="luminosity") - O.sd_SetLuminosity(new_value) + O.ul_SetLuminosity(new_value) else O.vars[variable] = new_value @@ -222,7 +222,7 @@ for(var/mob/M in world) if ( istype(M , O.type) ) if(variable=="luminosity") - M.sd_SetLuminosity(new_value) + M.ul_SetLuminosity(new_value) else M.vars[variable] = O.vars[variable] @@ -230,7 +230,7 @@ for(var/obj/A in world) if ( istype(A , O.type) ) if(variable=="luminosity") - A.sd_SetLuminosity(new_value) + A.ul_SetLuminosity(new_value) else A.vars[variable] = O.vars[variable] @@ -238,7 +238,7 @@ for(var/turf/A in world) if ( istype(A , O.type) ) if(variable=="luminosity") - A.sd_SetLuminosity(new_value) + A.ul_SetLuminosity(new_value) else A.vars[variable] = O.vars[variable] @@ -247,7 +247,7 @@ for(var/mob/M in world) if (M.type == O.type) if(variable=="luminosity") - M.sd_SetLuminosity(new_value) + M.ul_SetLuminosity(new_value) else M.vars[variable] = O.vars[variable] @@ -255,7 +255,7 @@ for(var/obj/A in world) if (A.type == O.type) if(variable=="luminosity") - A.sd_SetLuminosity(new_value) + A.ul_SetLuminosity(new_value) else A.vars[variable] = O.vars[variable] @@ -263,7 +263,7 @@ for(var/turf/A in world) if (A.type == O.type) if(variable=="luminosity") - A.sd_SetLuminosity(new_value) + A.ul_SetLuminosity(new_value) else A.vars[variable] = O.vars[variable] diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 8e30ca8b469..ca79df17376 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -531,7 +531,7 @@ var/list/forbidden_varedit_object_types = list( if(variable=="luminosity") var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num if(var_new == null) return - O.sd_SetLuminosity(var_new) + O.ul_SetLuminosity(var_new) else var/var_new = input("Enter new number:","Num",O.vars[variable]) as null|num if(var_new==null) return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 29f1ac90dd3..817dbe2be0a 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -199,8 +199,8 @@ if(old_icon) W.icon_state = old_icon */ W.opacity = 1 - W.sd_SetOpacity(0) - W.sd_LumReset() + W.ul_SetOpacity(0) + W.ul_Recalculate() W.levelupdate() return W diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 38683219736..c477007eb23 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -125,8 +125,8 @@ G.process() if(isturf(loc) && rand(1,1000) == 1) //0.1% chance of playing a scary sound to someone who's in complete darkness - var/turf/currentTurf = loc - if(!currentTurf.sd_lumcount) + var/turf/currentTurf = get_turf(src) + if(!max(currentTurf.ul_GetRed(), currentTurf.ul_GetGreen(), currentTurf.ul_GetBlue())) playsound_local(src,pick(scarySounds),50, 1, -1) src.moved_recently = max(0, moved_recently-1) @@ -825,7 +825,8 @@ if(mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(istype(loc,/turf)) //else, there's considered to be no light - light_amount = min(10,loc:sd_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights + var/turf/currentTurf = get_turf(src) + light_amount = min(10,max(currentTurf.ul_GetRed(), currentTurf.ul_GetGreen(), currentTurf.ul_GetBlue())) - 5 //hardcapped so it's not abused by having a ton of flashlights if(nutrition < 500) //so they can't store nutrition to survive without light forever nutrition += light_amount if(light_amount > 0) //if there's enough light, heal diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b8e66cf0e39..8eea820f73f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -673,9 +673,7 @@ return health /mob/proc/UpdateLuminosity() - if(total_luminosity == last_luminosity) return 0//nothing to do here - last_luminosity = total_luminosity - sd_SetLuminosity(min(total_luminosity,7))//Current hardcode max at 7, should likely be a const somewhere else + ul_SetLuminosity(LuminosityRed, LuminosityGreen, LuminosityBlue)//Current hardcode max at 7, should likely be a const somewhere else return 1 /mob/MouseDrop(mob/M as mob) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3d54b956cb2..4417cdb9116 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -55,8 +55,8 @@ var/obj/screen/gun/run/gun_run_icon = null var/obj/screen/gun/mode/gun_setting_icon = null - var/total_luminosity = 0 //This controls luminosity for mobs, when you pick up lights and such this is edited. If you want the mob to use lights it must update its lum in its life proc or such. Note clamp this value around 7 or such to prevent massive light lag. - var/last_luminosity = 0 +// var/total_luminosity = 0 //This controls luminosity for mobs, when you pick up lights and such this is edited. If you want the mob to use lights it must update its lum in its life proc or such. Note clamp this value around 7 or such to prevent massive light lag. +// var/last_luminosity = 0 /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. diff --git a/code/modules/mob/simple_animal/corgi.dm b/code/modules/mob/simple_animal/corgi.dm index 09eb81ce2f5..15a0f1f3dfc 100644 --- a/code/modules/mob/simple_animal/corgi.dm +++ b/code/modules/mob/simple_animal/corgi.dm @@ -104,7 +104,7 @@ emote_hear = list("barks", "woofs", "yaps","pants") emote_see = list("shakes its head", "shivers") desc = "It's a corgi." - src.sd_SetLuminosity(0) + src.ul_SetLuminosity(0) inventory_head.loc = src.loc inventory_head = null else @@ -239,7 +239,7 @@ name = "Rudolph the Red-Nosed Corgi" emote_hear = list("barks christmas songs", "yaps") desc = "He has a very shiny nose." - src.sd_SetLuminosity(6) + src.ul_SetLuminosity(6) if(/obj/item/clothing/head/cargosoft) name = "Corgi Tech [real_name]" speak = list("Needs a stamp!", "Request DENIED!", "Fill these out in triplicate!") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b845d9f0eb6..6975e37730d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -123,7 +123,7 @@ var/oldlum = luminosity //luminosity = on * brightness - sd_SetLuminosity(on * brightness) // *DAL* + ul_SetLuminosity(on * brightness, on * brightness, ( fitting == "tube" ? on * brightness : 0 ) ) // *DAL* // if the state changed, inc the switching counter if(oldlum != luminosity) @@ -137,7 +137,7 @@ status = LIGHT_BURNED icon_state = "[base_state]-burned" on = 0 - sd_SetLuminosity(0) + ul_SetLuminosity(0) active_power_usage = (luminosity * 20) if(on != on_gs) on_gs = on diff --git a/code/modules/power/sd_DynamicAreaLighting.dm b/code/modules/power/sd_DynamicAreaLighting.dm index 7388288af2d..062e67d9867 100644 --- a/code/modules/power/sd_DynamicAreaLighting.dm +++ b/code/modules/power/sd_DynamicAreaLighting.dm @@ -1,23 +1,23 @@ /* Overview of sd_DynamicAreaLighting as modified for SS13 * * - * Use sd_SetLuminosity(value) to change the luminosity of an atom + * Use ul_SetLuminosity(value) to change the luminosity of an atom * rather than setting the luminosity var directly. * Avoid having luminous objects at compile-time since this can mess up - * the lighting system during map load. Instead use sd_SetLuminosity() in + * the lighting system during map load. Instead use ul_SetLuminosity() in * the atom's New() proc after a small spawn delay. * - * Use sd_SetOpacity(value) to change the opacity of an atom (e.g. doors) + * Use ul_SetOpacity(value) to change the opacity of an atom (e.g. doors) * rather than setting the opacity var directly. This ensures that lighting * will be blocked/unblocked as necessary. * * If creating a new opaque atom (e.g. a wall) at runtime, create the atom, - * set its opacity var to zero, then perform sd_SetOpacity(1) + * set its opacity var to zero, then perform ul_SetOpacity(1) * e.g.: * * var/obj/block/B = new(loc) * B.opacity = 0 - * B.sd_SetOpacity(1) + * B.ul_SetOpacity(1) * * * The library creates multiple instances of each /area to split a mapped area @@ -52,13 +52,13 @@ Using sd_DynamicAreaLighting 1) Luminosity changes at run time. If your program makes changes in luminosity while it is - running, you need to use sd_SetLuminosity(new_luminosity) + running, you need to use ul_SetLuminosity(new_luminosity) so the library can remove the effect of the old luminosity and apply the new effect. 2) Opacity changes at run time. As with luminosity changes, you need to use - sd_SetOpacity(new_opacity) if your program changes the opacity + ul_SetOpacity(new_opacity) if your program changes the opacity of atoms at runtime. 3) New atoms that change the opacity of a location. @@ -67,17 +67,17 @@ Using sd_DynamicAreaLighting sd_StripLocalLum() to strip the luminosity effect of anything shining on that space, create the new atom, then use sd_ApplyLocalLum() to reapply the luminosity effect. - Examine the sd_SetOpacity() proc for an example of the + Examine the ul_SetOpacity() proc for an example of the procedure. All areas will automatically use the sd_DynamicAreaLighting library when it is included in your project. You may disable lighting effect in an area by specifically setting the area's - sd_lighting var to 0. For example: + ul_Lighting var to 0. For example: area/always_lit luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 This library chops areas into 5 separate areas of differing light effect, so you may want to modify area Enter(), Exit(), @@ -253,17 +253,17 @@ All atoms have the following procs: IMPORTANT! Each sd_StripLocalLum() call should have a matching sd_ApplyLocalLum() to restore the local effect. - sd_SetLuminosity(new_luminosity as num) + ul_SetLuminosity(new_luminosity as num) Sets the atom's luminosity, making adjustments to the sd_lumcount of local turfs. - sd_SetOpacity(new_opacity as num) + ul_SetOpacity(new_opacity as num) Sets the atom's opacity, making adjustments to the sd_lumcount of local turfs. Areas have one additional proc and 4 variables: var - sd_lighting + ul_Lighting Turn this flag off to prevent sd_DynamicAreaLighting from effecting this area. DEFAULT VALUE: 1 (allow dynamic lighting) @@ -304,7 +304,7 @@ Turfs have these additional procs and vars: Places the turf in the appropriate sd_dark area, depending on its brightness (sd_lumcount). - sd_LumReset() + ul_Recalculate() Resets a turf's lumcount by stripping local luminosity, zeroing the lumcount, then reapplying local luminosity. @@ -436,7 +436,7 @@ atom return affected - sd_SetLuminosity(new_luminosity as num) + ul_SetLuminosity(new_luminosity as num) /* This proc should be called everytime you want to change the luminosity of an atom instead of setting it directly. @@ -448,7 +448,7 @@ atom sd_ApplyLum() - sd_SetOpacity(new_opacity as num) + ul_SetOpacity(new_opacity as num) /* if(opacity != new_opacity) var/list/affected = sd_StripLocalLum() opacity = new_opacity @@ -567,7 +567,7 @@ turf sd_lumcount = 0 // the brightness of the turf proc - sd_LumReset() + ul_Recalculate() /* Clear local lum, reset this turf's sd_lumcount, and re-apply local lum*/ var/list/affected = sd_StripLocalLum() @@ -580,7 +580,7 @@ turf sd_LumUpdate() set background = 1 var/area/Loc = loc - if(!istype(Loc) || !Loc.sd_lighting) return + if(!istype(Loc) || !Loc.ul_Lighting) return // change the turf's area depending on its brightness // restrict light to valid levels @@ -685,7 +685,7 @@ area var /* Turn this flag off to prevent sd_DynamicAreaLighting from affecting this area */ - sd_lighting = 1 + ul_Lighting = 1 /* This var determines if an area is outside (affected by sunlight) or not. */ @@ -718,7 +718,7 @@ area ..() if(!tag) tag = "[type]" spawn(1) // wait a tick - if(sd_lighting) + if(ul_Lighting) // see if this area was created by the library if(!findtext(tag, "sd_L")) /* show the dark overlay so areas outside of luminous regions @@ -731,7 +731,7 @@ area if(!tag) tag = "[type]" spawn(1) // wait a tick - if(sd_lighting) + if(ul_Lighting) // see if this area was created by the library if(!sd_created) /* show the dark overlay so areas outside of luminous regions diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 4cfcd3bbaa4..d763828e837 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -14,7 +14,7 @@ New() spawn(1) - src.sd_SetLuminosity(5) + src.ul_SetLuminosity(5) Del() diff --git a/code/unused/mining/spaceship_builder_unused.dm b/code/unused/mining/spaceship_builder_unused.dm index 0613ca3b9c2..235f5b66597 100644 --- a/code/unused/mining/spaceship_builder_unused.dm +++ b/code/unused/mining/spaceship_builder_unused.dm @@ -3,7 +3,7 @@ /area/shipbuilder requires_power = 0 luminosity = 1 - sd_lighting = 0 + ul_Lighting = 0 /area/shipbuilder/station name = "shipbuilder station" diff --git a/code/unused/pda2/pda2.dm b/code/unused/pda2/pda2.dm index 7aa1f538f57..f915ddf5f93 100644 --- a/code/unused/pda2/pda2.dm +++ b/code/unused/pda2/pda2.dm @@ -60,13 +60,13 @@ /obj/item/device/pda2/pickup(mob/user) if (src.fon) - src.sd_SetLuminosity(0) - user.sd_SetLuminosity(user.luminosity + src.f_lum) + src.ul_SetLuminosity(0) + user.ul_SetLuminosity(user.luminosity + src.f_lum) /obj/item/device/pda2/dropped(mob/user) if (src.fon) - user.sd_SetLuminosity(user.luminosity - src.f_lum) - src.sd_SetLuminosity(src.f_lum) + user.ul_SetLuminosity(user.luminosity - src.f_lum) + src.ul_SetLuminosity(src.f_lum) /obj/item/device/pda2/New() ..() @@ -240,11 +240,11 @@ if (ismob(src.loc)) if (src.fon) - src.loc.sd_SetLuminosity(src.loc.luminosity + src.f_lum) + src.loc.ul_SetLuminosity(src.loc.luminosity + src.f_lum) else - src.loc.sd_SetLuminosity(src.loc.luminosity - src.f_lum) + src.loc.ul_SetLuminosity(src.loc.luminosity - src.f_lum) else - src.sd_SetLuminosity(src.fon * src.f_lum) + src.ul_SetLuminosity(src.fon * src.f_lum) src.updateSelfDialog() From 692fdc724ea8cea1b82c76dd6f7119ebb820d3a9 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Mon, 18 Jun 2012 17:52:40 -0700 Subject: [PATCH 2/3] Second part of UltraLight. Some fixed up fire stuff. --- baystation12.dme | 1 + code/WorkInProgress/Cael_Aislinn/sculpture.dm | 2 +- code/WorkInProgress/SkyMarshal/Ultralight.dm | 184 ++++++++++-------- code/ZAS/Fire.dm | 21 +- code/defines/area/Space Station 13 areas.dm | 1 + code/defines/atom.dm | 8 - code/defines/turf.dm | 3 - code/game/area/areas.dm | 14 +- code/game/master_controller.dm | 8 +- code/modules/power/lighting.dm | 4 +- icons/effects/effects.dmi | Bin 189307 -> 190627 bytes 11 files changed, 132 insertions(+), 114 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 1f8ba207fdf..713dccd71fa 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -167,6 +167,7 @@ #define FILE_DIR "code/WorkInProgress/animusstation" #define FILE_DIR "code/WorkInProgress/Apples" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn" +#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/BirdMan" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Tajara" diff --git a/code/WorkInProgress/Cael_Aislinn/sculpture.dm b/code/WorkInProgress/Cael_Aislinn/sculpture.dm index 9dde8b37dd1..a20ed600b08 100644 --- a/code/WorkInProgress/Cael_Aislinn/sculpture.dm +++ b/code/WorkInProgress/Cael_Aislinn/sculpture.dm @@ -130,7 +130,7 @@ //account for darkness var/turf/T = get_turf(src) var/in_darkness = 0 - if(T.sd_lumcount == 0 && !istype(T, /turf/simulated)) + if(max(T.ul_GetRed(), T.ul_GetGreen(), T.ul_GetBlue()) == 0 && !istype(T, /turf/simulated)) in_darkness = 1 //see if we're able to do stuff diff --git a/code/WorkInProgress/SkyMarshal/Ultralight.dm b/code/WorkInProgress/SkyMarshal/Ultralight.dm index 1e3a0aebeda..41014ee1777 100644 --- a/code/WorkInProgress/SkyMarshal/Ultralight.dm +++ b/code/WorkInProgress/SkyMarshal/Ultralight.dm @@ -7,9 +7,11 @@ #define UL_I_LIT 0 #define UL_I_EXTINGUISHED 1 #define UL_I_ONZERO 2 + var ul_LightingEnabled = 1 ul_LightingResolution = 1 + ul_LightingResolutionSqrt = sqrt(ul_LightingResolution) ul_Steps = 7 ul_FalloffStyle = UL_I_FALLOFF_ROUND // Sets the lighting falloff to be either squared or circular. ul_TopLuminosity = 0 @@ -20,26 +22,15 @@ var 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) -var/list/light_to_instantiate = list() -var/UL_setup = 0 - -proc/setup_UL() - UL_setup = 1 - world << "\red Setting up UltraLight..." - for(var/atom/A in light_to_instantiate) - if(A.ul_IsLuminous()) - A.ul_Illuminate() proc/ul_Clamp(var/Value) return min(max(Value, 0), ul_Steps) -atom - var - LuminosityRed = 0 - LuminosityGreen = 0 - LuminosityBlue = 0 +atom/var/LuminosityRed = 0 +atom/var/LuminosityGreen = 0 +atom/var/LuminosityBlue = 0 - ul_Extinguished = UL_I_ONZERO +atom/var/ul_Extinguished = UL_I_ONZERO atom/proc/ul_SetLuminosity(var/Red, var/Green = Red, var/Blue = Red) @@ -76,22 +67,38 @@ atom/proc/ul_Illuminate() ul_UpdateTopLuminosity() luminosity = ul_Luminosity() - for(var/turf/Affected in view(ul_Luminosity(), src)) + for(var/turf/Affected in view(luminosity, src)) var/Falloff = src.ul_FalloffAmount(Affected) var/DeltaRed = LuminosityRed - Falloff var/DeltaGreen = LuminosityGreen - Falloff var/DeltaBlue = LuminosityBlue - Falloff - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) + if(DeltaRed > 0 || DeltaGreen > 0 || DeltaBlue > 0) - Affected.LightLevelRed += max(DeltaRed, 0) - Affected.LightLevelGreen += max(DeltaGreen, 0) - Affected.LightLevelBlue += max(DeltaBlue, 0) + if(DeltaRed > 0) + if(!Affected.MaxRed) + Affected.MaxRed = list() + if("[DeltaRed]" in Affected.MaxRed) + Affected.MaxRed["[DeltaRed]"]++ + else + Affected.MaxRed["[DeltaRed]"] = 1 - Affected.MaxRed += LuminosityRed - Affected.MaxGreen += LuminosityGreen - Affected.MaxBlue += LuminosityBlue + if(DeltaGreen > 0) + if(!Affected.MaxGreen) + Affected.MaxGreen = list() + if("[DeltaGreen]" in Affected.MaxGreen) + Affected.MaxGreen["[DeltaGreen]"]++ + else + Affected.MaxGreen["[DeltaGreen]"] = 1 + + if(DeltaBlue > 0) + if(!Affected.MaxBlue) + Affected.MaxBlue = list() + if("[DeltaBlue]" in Affected.MaxBlue) + Affected.MaxBlue["[DeltaBlue]"]++ + else + Affected.MaxBlue["[DeltaBlue]"] = 1 Affected.ul_UpdateLight() @@ -117,15 +124,34 @@ atom/proc/ul_Extinguish() var/DeltaGreen = LuminosityGreen - Falloff var/DeltaBlue = LuminosityBlue - Falloff - if(ul_IsLuminous(DeltaRed, DeltaGreen, DeltaBlue)) + if(DeltaRed > 0 || DeltaGreen > 0 || DeltaBlue > 0) - Affected.LightLevelRed -= max(DeltaRed, 0) - Affected.LightLevelGreen -= max(DeltaGreen, 0) - Affected.LightLevelBlue -= max(DeltaBlue, 0) + if(DeltaRed > 0) + if(Affected.MaxRed) + if(Affected.MaxRed["[DeltaRed]"] > 1) + Affected.MaxRed["[DeltaRed]"]-- + else + Affected.MaxRed.Remove("[DeltaRed]") + if(!Affected.MaxRed.len) + del Affected.MaxRed - Affected.MaxRed -= LuminosityRed - Affected.MaxGreen -= LuminosityGreen - Affected.MaxBlue -= LuminosityBlue + if(DeltaGreen > 0) + if(Affected.MaxGreen) + if(Affected.MaxGreen["[DeltaGreen]"] > 1) + Affected.MaxGreen["[DeltaGreen]"]-- + else + Affected.MaxGreen.Remove("[DeltaGreen]") + if(!Affected.MaxGreen.len) + del Affected.MaxGreen + + if(DeltaBlue > 0) + if(Affected.MaxBlue) + if(Affected.MaxBlue["[DeltaBlue]"] > 1) + Affected.MaxBlue["[DeltaBlue]"]-- + else + Affected.MaxBlue.Remove("[DeltaBlue]") + if(!Affected.MaxBlue.len) + del Affected.MaxBlue Affected.ul_UpdateLight() @@ -151,10 +177,17 @@ atom/proc/ul_FalloffAmount(var/atom/ref) if (ul_FalloffStyle == UL_I_FALLOFF_ROUND) var/x = (ref.x - src.x) var/y = (ref.y - src.y) - if ((x*x + y*y) > ul_FastRoot.len) - for(var/i = ul_FastRoot.len, i <= x*x+y*y, i++) - ul_FastRoot += round(sqrt(x*x+y*y)) - return round(ul_LightingResolution * ul_FastRoot[x*x + y*y + 1], 1) + if(ul_LightingResolution != 1) + if (round((x*x + y*y)*ul_LightingResolutionSqrt,1) > ul_FastRoot.len) + for(var/i = ul_FastRoot.len, i <= round(x*x+y*y*ul_LightingResolutionSqrt,1), i++) + ul_FastRoot += round(sqrt(i)) + return ul_FastRoot[round((x*x + y*y)*ul_LightingResolutionSqrt, 1) + 1]/ul_LightingResolution + + else + if ((x*x + y*y) > ul_FastRoot.len) + for(var/i = ul_FastRoot.len, i <= x*x+y*y, i++) + ul_FastRoot += round(sqrt(i)) + return ul_FastRoot[x*x + y*y + 1]/ul_LightingResolution else if (ul_FalloffStyle == UL_I_FALLOFF_SQUARE) return get_dist(src, ref) @@ -165,17 +198,9 @@ atom/proc/ul_SetOpacity(var/NewOpacity) if(opacity != NewOpacity) var/list/Blanked = ul_BlankLocal() - var/atom/T = src - while(T && !isturf(T)) - T = T.loc opacity = NewOpacity - if(T) - T:LightLevelRed = 0 - T:LightLevelGreen = 0 - T:LightLevelBlue = 0 - ul_UnblankLocal(Blanked) return @@ -222,49 +247,43 @@ atom/proc/ul_LightLevelChanged() atom/New() ..() - if(UL_setup) - if(ul_IsLuminous()) + if(ul_IsLuminous()) + spawn(1) ul_Illuminate() - else - light_to_instantiate |= src + return atom/Del() if(ul_IsLuminous()) ul_Extinguish() - ..() - return - -// formerly atom/proc/movable/Move(), this now overwrites other shit causing random inexplicable problems. -// need to find a way to plug it in to the root without overriding, might just do the snowflake treatment -/*atom/proc/Move() - ul_Extinguish() - ..() - ul_Illuminate() - return*/ - -turf - var - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - - list/MaxRed = list( ) - list/MaxGreen = list( ) - list/MaxBlue = list( ) +atom/movable/Move() + if(ul_IsLuminous()) + ul_Extinguish() + ..() + ul_Illuminate() + else + ..() +turf/var/list/MaxRed +turf/var/list/MaxGreen +turf/var/list/MaxBlue turf/proc/ul_GetRed() - return ul_Clamp(min(LightLevelRed, max(MaxRed))) + if(MaxRed) + return ul_Clamp(text2num(max(MaxRed))) + return 0 turf/proc/ul_GetGreen() - return ul_Clamp(min(LightLevelGreen, max(MaxGreen))) + if(MaxGreen) + return ul_Clamp(text2num(max(MaxGreen))) + return 0 turf/proc/ul_GetBlue() - return ul_Clamp(min(LightLevelBlue, max(MaxBlue))) + if(MaxBlue) + return ul_Clamp(text2num(max(MaxBlue))) + return 0 turf/proc/ul_UpdateLight() - var/area/CurrentArea = loc if(!isarea(CurrentArea) || !CurrentArea.ul_Lighting) @@ -298,25 +317,19 @@ turf/proc/ul_Recalculate() var/list/Lights = ul_BlankLocal() - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 - ul_UnblankLocal(Lights) ul_SuppressLightLevelChanges-- return -area - var - ul_Overlay = null - ul_Lighting = 1 - - LightLevelRed = 0 - LightLevelGreen = 0 - LightLevelBlue = 0 +area/var/ul_Overlay = null +area/var/ul_Lighting = 1 +area/var/LightLevelRed = 0 +area/var/LightLevelGreen = 0 +area/var/LightLevelBlue = 0 +area/var/list/LightLevels area/proc/ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blue = LightLevelBlue) @@ -324,6 +337,13 @@ area/proc/ul_Light(var/Red = LightLevelRed, var/Green = LightLevelGreen, var/Blu return overlays -= ul_Overlay + if(LightLevels) + if(Red < LightLevels["Red"]) + Red = LightLevels["Red"] + if(Green < LightLevels["Green"]) + Green = LightLevels["Green"] + if(Blue < LightLevels["Blue"]) + Blue = LightLevels["Blue"] LightLevelRed = Red LightLevelGreen = Green diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index be430d58e2a..5b2f48cdd31 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -124,11 +124,18 @@ obj if(flow.oxygen > 0.3 && (flow.toxins || fuel || liquid)) //Change icon depending on the fuel, and thus temperature. - icon_state = "1" - if(firelevel > 2.5) - icon_state = "2" if(firelevel > 6) icon_state = "3" + if(LuminosityRed != 7) + ul_SetLuminosity(7,5,0) + else if(firelevel > 2.5) + icon_state = "2" + if(LuminosityRed != 5) + ul_SetLuminosity(5,4,0) + else + icon_state = "1" + if(LuminosityRed != 3) + ul_SetLuminosity(3,2,0) //Ensure flow temperature is higher than minimum fire temperatures. flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) @@ -157,7 +164,7 @@ obj New(newLoc,fl) ..() dir = pick(cardinal) - ul_SetLuminosity(3) + ul_SetLuminosity(3,2,0) firelevel = fl for(var/mob/living/carbon/human/M in loc) M.FireBurn(min(max(0.1,firelevel / 20),10)) //Burn the humans! @@ -187,7 +194,6 @@ obj/liquid_fuel other.amount += src.amount spawn other.Spread() del src - return Spread() . = ..() @@ -201,8 +207,9 @@ obj/liquid_fuel if(S.air_check_directions & d) if(rand(25)) var/turf/simulated/O = get_step(src,d) - new/obj/liquid_fuel(O,amount*0.25) - amount *= 0.75 + if(!locate(/obj/liquid_fuel) in O) + new/obj/liquid_fuel(O,amount*0.25) + amount *= 0.75 flamethrower_fuel icon_state = "mustard" diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm index 03517f28075..d142c42a213 100755 --- a/code/defines/area/Space Station 13 areas.dm +++ b/code/defines/area/Space Station 13 areas.dm @@ -957,6 +957,7 @@ proc/process_ghost_teleport_locs() //Solars /area/solar + LightLevels = list("Red" = 2, "Green" = 2, "Blue" = 3) requires_power = 0 auxport diff --git a/code/defines/atom.dm b/code/defines/atom.dm index 2deb510cea0..1a1a79b94f8 100644 --- a/code/defines/atom.dm +++ b/code/defines/atom.dm @@ -47,14 +47,6 @@ return flags & INSERT_CONTAINER */ - Del() - var/F = file("del_log.txt") - var/coords = "" - if(src) - coords = "[src.x],[src.y],[src.z]" - F << "[time2text(world.timeofday, "hh:mm.ss")]: [src] - [src.loc] [coords] - [usr]" - ..() - obj assume_air(datum/gas_mixture/giver) if(loc) diff --git a/code/defines/turf.dm b/code/defines/turf.dm index 84ee94551e9..0c30c4dac16 100644 --- a/code/defines/turf.dm +++ b/code/defines/turf.dm @@ -45,8 +45,6 @@ thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 - LightLevelBlue = 5 - transit var/pushdirection // push things that get caught in the transit tile this direction @@ -127,7 +125,6 @@ /turf/space/New() -// icon = 'space.dmi' if(!istype(src, /turf/space/transit)) ..() icon_state = "[rand(1,25)]" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 03330d9fbd4..c24ac9e2f71 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -27,21 +27,23 @@ if(name == "Space") // override defaults for space requires_power = 1 always_unpowered = 1 - ul_SetLuminosity(1) + LightLevels = list("Red" = 2, "Green" = 2, "Blue" = 3) power_light = 0 power_equip = 0 power_environ = 0 //has_gravity = 0 // Space has gravity. Because.. because. - if(!requires_power) + else if(!requires_power) power_light = 0//rastaf0 power_equip = 0//rastaf0 power_environ = 0//rastaf0 - luminosity = 1 - ul_Lighting = 0 // *DAL* + if(!ul_Lighting) + luminosity = 1 else luminosity = 0 - area_lights_luminosity = rand(6,9) + area_lights_luminosity = rand(5,7) + if(LightLevels) + ul_Light() //ul_SetLuminosity(0) // *DAL* @@ -401,7 +403,7 @@ other_related -= other_master var/list/total_contents = list() for(var/area/RA in other_related) - RA.sd_lighting = 0 +// RA.ul_lighting = 0 total_contents |= RA.contents del RA.contents del RA.related diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm index 76882780fe7..00736c3b67d 100644 --- a/code/game/master_controller.dm +++ b/code/game/master_controller.dm @@ -55,12 +55,10 @@ datum/controller/game_controller // Now that the game is world is fully initialized, pause server until a user connects. world.sleep_offline = 1 - setupgenetics() - - setupdooralarms() - setup_objects() + setupgenetics() + // for(var/i = 0, i < max_secret_rooms, i++) // make_mining_asteroid_secret() // Because energy cutlasses, facehuggers, and empty rooms are silly. FOR NOW. - Erthilo @@ -104,7 +102,7 @@ datum/controller/game_controller new /obj/structure/closet/emcloset(loc) emclosetcount-- - setup_UL() + setupdooralarms() world << "\red \b Initializations complete." diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 6975e37730d..357956b92df 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -83,7 +83,7 @@ var/area/A = src.loc.loc brightness = A.area_lights_luminosity else - brightness = rand(6,9) + brightness = rand(5,7) if(prob(10)) broken(1) if("bulb") @@ -123,7 +123,7 @@ var/oldlum = luminosity //luminosity = on * brightness - ul_SetLuminosity(on * brightness, on * brightness, ( fitting == "tube" ? on * brightness : 0 ) ) // *DAL* + ul_SetLuminosity(on * brightness, on * brightness, ( fitting != "bulb" ? on * brightness : on ) ) // *DAL* // if the state changed, inc the switching counter if(oldlum != luminosity) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 39bbf9e3cb579d3d0c9d3d44f37ed8d61e42c5f3..348ea33a7f8cc94f9f9c8095a7ae5dee6405c4d0 100644 GIT binary patch delta 26966 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 From e1d91d5eafc96fe3d3d0a2b1f8c8e2710f6a857e Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Mon, 18 Jun 2012 19:57:49 -0700 Subject: [PATCH 3/3] Fixes some bugginess with UL. --- code/WorkInProgress/SkyMarshal/Ultralight.dm | 81 +++++++++++++++----- code/game/turf.dm | 2 - code/modules/power/lighting.dm | 8 +- 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/code/WorkInProgress/SkyMarshal/Ultralight.dm b/code/WorkInProgress/SkyMarshal/Ultralight.dm index 41014ee1777..3da33929f62 100644 --- a/code/WorkInProgress/SkyMarshal/Ultralight.dm +++ b/code/WorkInProgress/SkyMarshal/Ultralight.dm @@ -79,26 +79,35 @@ atom/proc/ul_Illuminate() if(DeltaRed > 0) if(!Affected.MaxRed) Affected.MaxRed = list() - if("[DeltaRed]" in Affected.MaxRed) - Affected.MaxRed["[DeltaRed]"]++ + var/list/parameter_list = params2list(Affected.MaxRedValues) + if(!("[DeltaRed]" in parameter_list)) + Affected.MaxRed.Add(DeltaRed) + parameter_list["[DeltaRed]"] = 1 else - Affected.MaxRed["[DeltaRed]"] = 1 + parameter_list["[DeltaRed]"] = "[text2num(parameter_list["[DeltaRed]"]) + 1]" + Affected.MaxRedValues = list2params(parameter_list) if(DeltaGreen > 0) if(!Affected.MaxGreen) Affected.MaxGreen = list() - if("[DeltaGreen]" in Affected.MaxGreen) - Affected.MaxGreen["[DeltaGreen]"]++ + var/list/parameter_list = params2list(Affected.MaxGreenValues) + if(!("[DeltaGreen]" in parameter_list)) + Affected.MaxGreen.Add(DeltaGreen) + parameter_list["[DeltaGreen]"] = 1 else - Affected.MaxGreen["[DeltaGreen]"] = 1 + parameter_list["[DeltaGreen]"] = "[text2num(parameter_list["[DeltaGreen]"]) + 1]" + Affected.MaxGreenValues = list2params(parameter_list) if(DeltaBlue > 0) if(!Affected.MaxBlue) Affected.MaxBlue = list() - if("[DeltaBlue]" in Affected.MaxBlue) - Affected.MaxBlue["[DeltaBlue]"]++ + var/list/parameter_list = params2list(Affected.MaxBlueValues) + if(!("[DeltaBlue]" in parameter_list)) + Affected.MaxBlue.Add(DeltaBlue) + parameter_list["[DeltaBlue]"] = 1 else - Affected.MaxBlue["[DeltaBlue]"] = 1 + parameter_list["[DeltaBlue]"] = "[text2num(parameter_list["[DeltaBlue]"]) + 1]" + Affected.MaxBlueValues = list2params(parameter_list) Affected.ul_UpdateLight() @@ -128,28 +137,55 @@ atom/proc/ul_Extinguish() if(DeltaRed > 0) if(Affected.MaxRed) - if(Affected.MaxRed["[DeltaRed]"] > 1) - Affected.MaxRed["[DeltaRed]"]-- + if(findtext(Affected.MaxRedValues, "[DeltaRed]")) + var/list/parameter_list = params2list(Affected.MaxRedValues) + if(!("[DeltaRed]" in parameter_list)) + Affected.MaxRed.Remove(DeltaRed) + parameter_list.Remove("[DeltaRed]") + else if (parameter_list["[DeltaRed]"] != "1") + parameter_list["[DeltaRed]"] = "[text2num(parameter_list["[DeltaRed]"]) - 1]" + else + Affected.MaxRed.Remove(DeltaRed) + parameter_list.Remove("[DeltaRed]") + Affected.MaxRedValues = list2params(parameter_list) else - Affected.MaxRed.Remove("[DeltaRed]") + Affected.MaxRed.Remove(DeltaRed) if(!Affected.MaxRed.len) del Affected.MaxRed if(DeltaGreen > 0) if(Affected.MaxGreen) - if(Affected.MaxGreen["[DeltaGreen]"] > 1) - Affected.MaxGreen["[DeltaGreen]"]-- + if(findtext(Affected.MaxGreenValues, "[DeltaGreen]")) + var/list/parameter_list = params2list(Affected.MaxGreenValues) + if(!("[DeltaGreen]" in parameter_list)) + Affected.MaxGreen.Remove(DeltaGreen) + parameter_list.Remove("[DeltaGreen]") + else if (parameter_list["[DeltaGreen]"] != "1") + parameter_list["[DeltaGreen]"] = "[text2num(parameter_list["[DeltaGreen]"]) - 1]" + else + Affected.MaxGreen.Remove(DeltaGreen) + parameter_list.Remove("[DeltaGreen]") + Affected.MaxGreenValues = list2params(parameter_list) else - Affected.MaxGreen.Remove("[DeltaGreen]") + Affected.MaxGreen.Remove(DeltaGreen) if(!Affected.MaxGreen.len) del Affected.MaxGreen if(DeltaBlue > 0) if(Affected.MaxBlue) - if(Affected.MaxBlue["[DeltaBlue]"] > 1) - Affected.MaxBlue["[DeltaBlue]"]-- + if(findtext(Affected.MaxBlueValues, "[DeltaBlue]")) + var/list/parameter_list = params2list(Affected.MaxBlueValues) + if(!("[DeltaBlue]" in parameter_list)) + Affected.MaxBlue.Remove(DeltaBlue) + parameter_list.Remove("[DeltaBlue]") + else if (parameter_list["[DeltaBlue]"] != "1") + parameter_list["[DeltaBlue]"] = "[text2num(parameter_list["[DeltaBlue]"]) - 1]" + else + Affected.MaxBlue.Remove(DeltaBlue) + parameter_list.Remove("[DeltaBlue]") + Affected.MaxBlueValues = list2params(parameter_list) else - Affected.MaxBlue.Remove("[DeltaBlue]") + Affected.MaxBlue.Remove(DeltaBlue) if(!Affected.MaxBlue.len) del Affected.MaxBlue @@ -269,18 +305,21 @@ atom/movable/Move() turf/var/list/MaxRed turf/var/list/MaxGreen turf/var/list/MaxBlue +turf/var/MaxRedValues +turf/var/MaxGreenValues +turf/var/MaxBlueValues turf/proc/ul_GetRed() if(MaxRed) - return ul_Clamp(text2num(max(MaxRed))) + return ul_Clamp(max(MaxRed)) return 0 turf/proc/ul_GetGreen() if(MaxGreen) - return ul_Clamp(text2num(max(MaxGreen))) + return ul_Clamp(max(MaxGreen)) return 0 turf/proc/ul_GetBlue() if(MaxBlue) - return ul_Clamp(text2num(max(MaxBlue))) + return ul_Clamp(max(MaxBlue)) return 0 turf/proc/ul_UpdateLight() diff --git a/code/game/turf.dm b/code/game/turf.dm index 31bf5a1f9b3..8fc7ca5b8e6 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -895,8 +895,6 @@ var/list/plating_icons = list("plating","platingdmg1","platingdmg2","platingdmg3 airless icon_state = "floor" name = "airless floor" - oxygen = 0.01 - nitrogen = 0.01 temperature = TCMB New() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 357956b92df..b97ef79607d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -84,11 +84,11 @@ brightness = A.area_lights_luminosity else brightness = rand(5,7) - if(prob(10)) + if(prob(5)) broken(1) if("bulb") - brightness = 3 - if(prob(25)) + brightness = rand(4,5) + if(prob(15)) broken(1) spawn(1) update() @@ -123,7 +123,7 @@ var/oldlum = luminosity //luminosity = on * brightness - ul_SetLuminosity(on * brightness, on * brightness, ( fitting != "bulb" ? on * brightness : on ) ) // *DAL* + ul_SetLuminosity(on * brightness, on * brightness, ( fitting != "bulb" ? on * brightness : on ) ) // *DAL* // if the state changed, inc the switching counter if(oldlum != luminosity)