From 1b743db10360a66a86ef359133e04533c93b891c Mon Sep 17 00:00:00 2001 From: ESwordTheCat Date: Sun, 8 Jun 2014 22:07:07 -0800 Subject: [PATCH] Glowsticks. --- code/__HELPERS/game.dm | 34 +++- code/controllers/_DynamicAreaLighting_TG.dm | 165 ++++++++++++++++++-- icons/obj/weapons.dmi | Bin 35564 -> 35632 bytes 3 files changed, 187 insertions(+), 12 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 33368828c62..45de6ae7f27 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -468,4 +468,36 @@ var/list/DummyCache = list() if(our_area != get_area_master(M)) continue mobs_found += M - return mobs_found \ No newline at end of file + return mobs_found + +/proc/GetRedPart(const/hexa) + var/hex = uppertext(hexa) + var/hi = text2ascii(hex, 2) + var/lo = text2ascii(hex, 3) + return (((hi >= 65 ? hi - 55 : hi - 48) << 4) | (lo >= 65 ? lo - 55 : lo - 48)) + +/proc/GetGreenPart(const/hexa) + var/hex = uppertext(hexa) + var/hi = text2ascii(hex, 4) + var/lo = text2ascii(hex, 5) + return (((hi >= 65 ? hi - 55 : hi - 48) << 4) | (lo >= 65 ? lo - 55 : lo - 48)) + +/proc/GetBluePart(const/hexa) + var/hex = uppertext(hexa) + var/hi = text2ascii(hex, 6) + var/lo = text2ascii(hex, 7) + return (((hi >= 65 ? hi - 55 : hi - 48) << 4) | (lo >= 65 ? lo - 55 : lo - 48)) + +/proc/GetHexColors(const/hexa) + var/hex = uppertext(hexa) + var/hi1 = text2ascii(hex, 2) + var/lo1 = text2ascii(hex, 3) + var/hi2 = text2ascii(hex, 4) + var/lo2 = text2ascii(hex, 5) + var/hi3 = text2ascii(hex, 6) + var/lo3 = text2ascii(hex, 7) + return list( + ((hi1 >= 65 ? hi1 - 55 : hi1 - 48) << 4) | (lo1 >= 65 ? lo1 - 55 : lo1 - 48), + ((hi2 >= 65 ? hi2 - 55 : hi2 - 48) << 4) | (lo2 >= 65 ? lo2 - 55 : lo2 - 48), + ((hi3 >= 65 ? hi3 - 55 : hi3 - 48) << 4) | (lo3 >= 65 ? lo3 - 55 : lo3 - 48) + ) diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index 223bf4e5c58..c6494c70c76 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -32,6 +32,7 @@ #define LIGHTING_CIRCULAR 1 //comment this out to use old square lighting effects. #define LIGHTING_LAYER 10 //Drawing layer for lighting overlays #define LIGHTING_ICON 'icons/effects/ss13_dark_alpha6.dmi' //Icon used for lighting shading effects +#define LIGHT_WHITE "#FFFFFF" // Hex for white light, aka normal. datum/light_source var/atom/owner @@ -39,6 +40,7 @@ datum/light_source var/list/effect = list() var/__x = 0 //x coordinate at last update var/__y = 0 //y coordinate at last update + var/l_color New(atom/A) @@ -46,6 +48,7 @@ datum/light_source CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.") ..() owner = A + l_color = owner.l_color __x = owner.x __y = owner.y // the lighting object maintains a list of all light sources @@ -74,7 +77,7 @@ datum/light_source proc/remove_effect() // before we apply the effect we remove the light's current effect. for(var/turf/T in effect) // negate the effect of this light source - T.update_lumcount(-effect[T]) + T.update_lumcount(-effect[T], l_color, 1) effect.Cut() // clear the effect list proc/add_effect() @@ -85,7 +88,7 @@ datum/light_source var/delta_lumen = lum(T) if(delta_lumen > 0) effect[T] = delta_lumen - T.update_lumcount(delta_lumen) + T.update_lumcount(delta_lumen, l_color, 0) return 0 else @@ -114,7 +117,7 @@ atom var/datum/light_source/light var/trueLuminosity = 0 // Typically 'luminosity' squared. The builtin luminosity must remain linear. // We may read it, but NEVER set it directly. - + var/l_color. //Turfs with opacity when they are constructed will trigger nearby lights to update //Turfs and atoms with luminosity when they are constructed will create a light_source automatically @@ -208,12 +211,66 @@ turf/SetOpacity(new_opacity) turf var/lighting_lumcount = 0 var/lighting_changed = 0 + var/color_lighting_lumcount = 0 + var/list/colors = list() turf/space lighting_lumcount = 4 //starlight -turf/proc/update_lumcount(amount) +turf/proc/update_lumcount(amount, _lcolor, removing = 0) lighting_lumcount += amount + var/blended + + if (_lcolor) + if (l_color != LIGHT_WHITE && _lcolor != LIGHT_WHITE && l_color != _lcolor && !removing) // Blend colors. + var/redblend = min((GetRedPart(l_color)) + (GetRedPart(_lcolor)), 255) + var/greenblend = min((GetGreenPart(l_color)) + (GetGreenPart(_lcolor)), 255) + var/blueblend = min((GetBluePart(l_color)) + (GetBluePart(_lcolor)), 255) + blended = "#[add_zero2(num2hex(redblend), 2)][add_zero2(num2hex(greenblend),2)][add_zero2(num2hex(blueblend),2)]" + + if (removing) + colors.Remove(_lcolor) // Remove the color that's leaving us from our list. + + if (colors && !colors.len) + l_color = null // All our color is gone, no color for us. + else if (colors && colors.len > 1) + var/maxdepth = 3 // Will blend 3 colors, anymore than that and it looks bad or we will get lag on every tile update. + var/currentblended + + for (var/i = 0, ++i <= colors.len) + if (i > maxdepth) + //world << "Maxdepth reached, breaking loop." + break + + if (!currentblended) + //world << "First iteration, currentblended = [colors[i]]." + currentblended = colors[i] // Start with the first of the remaining colors. + continue + + var/redblend = min((GetRedPart(currentblended)) + (GetRedPart(colors[i])), 255) + var/greenblend = min((GetGreenPart(currentblended)) + (GetGreenPart(colors[i])), 255) + var/blueblend = min((GetBluePart(currentblended)) + (GetBluePart(colors[i])), 255) + currentblended = "#[add_zero2(num2hex(redblend), 2)][add_zero2(num2hex(greenblend), 2)][add_zero2(num2hex(blueblend), 2)]" + //world << "Finished [i] [currentblended]." + + if (currentblended) + //world << "Ended up with [currentblended]" + l_color = currentblended // blended the remaining colors so apply it. + else + l_color = null // Something went wrong, no color for you. + else + l_color = colors[colors.len] + else // we added a color. + colors.Add(_lcolor) // Add the base color to the list. + + if (blended) + l_color = blended // If we had a blended color, this is what we get otherwise. + else + l_color = _lcolor // Basecolor is our color. + + // if ((l_color != LIGHT_WHITE && l_color != "#FFF") || removing) + color_lighting_lumcount = max(color_lighting_lumcount + amount, 0) // Minimum of 0. + if(!lighting_changed) lighting_controller.changed_turfs += src lighting_changed = 1 @@ -222,21 +279,27 @@ turf/proc/lighting_tag(var/level) var/area/A = loc return A.tagbase + "sd_L[level]" -turf/proc/build_lighting_area(var/tag, var/level) +turf/proc/build_lighting_area(var/tag, var/level, const/color_light) var/area/Area = loc var/area/A = new Area.type() // create area if it wasn't found // replicate vars for(var/V in Area.vars) switch(V) - if("contents","lighting_overlay","overlays") continue + if ("contents","lighting_overlay", "color_overlay", "overlays") + continue else if(issaved(Area.vars[V])) A.vars[V] = Area.vars[V] A.tag = tag A.lighting_subarea = 1 A.lighting_space = 0 // in case it was copied from a space subarea - A.SetLightLevel(level) + if (A.l_color != l_color) + A.l_color = l_color + //color_light = min(max(round(color_lighting_lumcount, 1), 0), lighting_controller.lighting_states) + //world << "[color_light] [color_lighting_lumcount]" + + A.SetLightLevel(level, color_light) Area.related += A return A @@ -248,11 +311,26 @@ turf/proc/shift_to_subarea() var/level = min(max(round(lighting_lumcount,1),0),lighting_controller.lighting_states) var/new_tag = lighting_tag(level) + + // pomf - If we have a lighting color that is not white, apply the new tag to seperate the areas. + if (color_lighting_lumcount && l_color) + new_tag += "sd_LC[light]" // pomf - We append the color lighting lumcount so we can have colored lights. + else + new_tag += "sd_L[light]" + + if (l_color) + new_tag += "[l_color][color_lighting_lumcount]" + if(Area.tag!=new_tag) //skip if already in this area var/area/A = locate(new_tag) // find an appropriate area + var/color_light = min(max(round(color_lighting_lumcount,1),0),lighting_controller.lighting_states) - if(!A) - A = build_lighting_area(new_tag,level) + if (!A) + A = build_lighting_area(new_tag, level, color_light) + else if (A.l_color != l_color) + A.l_color = l_color + //color_light = min(max(round(color_lighting_lumcount, 1), 0), lighting_controller.lighting_states) + A.SetLightLevel(level, color_light) A.contents += src // move the turf into the area @@ -275,8 +353,9 @@ area var/lighting_subarea = 0 //tracks whether we're a lighting sub-area var/lighting_space = 0 // true for space-only lighting subareas var/tagbase + var/image/color_overlay //Tracks the color image. - proc/SetLightLevel(light) + proc/SetLightLevel(light, color_light = 0) if(!src) return if(light <= 0) light = 0 @@ -292,7 +371,69 @@ area else lighting_overlay = image(LIGHTING_ICON,,num2text(light),LIGHTING_LAYER) - overlays += lighting_overlay + if (color_overlay) + overlays.Remove(color_overlay) + color_overlay.icon_state = "white" + else + if (l_color && l_color != LIGHT_WHITE) + color_overlay = image('icons/weapons.dmi', ,"white", 10.1) + + if (istype(color_overlay)) + color_overlay.color = l_color + + /* + if (light < 6) + switch (level) + if (6) + color_overlay.alpha = 140 + if (5) + color_overlay.alpha = 120 + if (4) + color_overlay.alpha = 100 + if (3) + color_overlay.alpha = 80 + if (2) + color_overlay.alpha = 60 + if (1) + color_overlay.alpha = 40 + if (-INFINITY to 0) + //world << "Zero or below, [color_light]." + color_overlay.alpha = 0 + else + //world << "Setting the alpha to max... color_light [color_light]." + color_overlay.alpha = 140 + + color_overlay.blend_mode = BLEND_MULTIPLY + */ + + if (1) + switch (color_light) + if (6) + color_overlay.alpha = 180 + if (5) + color_overlay.alpha = 140 + if (4) + color_overlay.alpha = 120 + if (3) + color_overlay.alpha = 80 + if (2) + color_overlay.alpha = 60 + if (1) + color_overlay.alpha = 20 + if (-INFINITY to 0) + //world << "Zero or below, [color_light]." + color_overlay.alpha = 0 + else + //world << "Setting the alpha to max... color_light [color_light]." + color_overlay.alpha = 180 + + if (color_overlay.color) + overlays.Add(color_overlay) + + if (isnull(color_overlay)) + overlays.Add(lighting_overlay) + else if (light < 6) + overlays.Add(lighting_overlay) proc/SetDynamicLighting() @@ -311,6 +452,8 @@ area //#undef LIGHTING_LAYER #undef LIGHTING_CIRCULAR //#undef LIGHTING_ICON +#undef LIGHT_WHITE + #define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag. #define LIGHTING_MAX_LUMINOSITY_MOBILE 5 //Moving objects have a lower max luminosity since these update more often. (lag reduction) #define LIGHTING_MAX_LUMINOSITY_TURF 1 //turfs have a severely shortened range to protect from inevitable floor-lighttile spam. diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 20ba86d9ac2d22f5e79f673a7d0f265e757bfeb1..8a697100db82b00fad9a54444418efbfdce65462 100644 GIT binary patch delta 15945 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 delta 15876 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