diff --git a/aurorastation.dme b/aurorastation.dme index 920a2564c5f..b949e1fce4f 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -52,6 +52,7 @@ #include "code\__DEFINES\drinks.dm" #include "code\__DEFINES\dview.dm" #include "code\__DEFINES\economy.dm" +#include "code\__DEFINES\emissives.dm" #include "code\__DEFINES\emitter.dm" #include "code\__DEFINES\empulse.dm" #include "code\__DEFINES\evacuation.dm" @@ -168,6 +169,7 @@ #include "code\__HELPERS\atoms.dm" #include "code\__HELPERS\data_structures.dm" #include "code\__HELPERS\dll_call.dm" +#include "code\__HELPERS\emissives.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\functional.dm" #include "code\__HELPERS\game.dm" @@ -183,7 +185,6 @@ #include "code\__HELPERS\mouse.dm" #include "code\__HELPERS\nameof.dm" #include "code\__HELPERS\names.dm" -#include "code\__HELPERS\overlay.dm" #include "code\__HELPERS\overmap.dm" #include "code\__HELPERS\qdel.dm" #include "code\__HELPERS\ref.dm" diff --git a/code/__DEFINES/emissives.dm b/code/__DEFINES/emissives.dm new file mode 100644 index 00000000000..b9311b81ed3 --- /dev/null +++ b/code/__DEFINES/emissives.dm @@ -0,0 +1,28 @@ +// Emissive blockers +/// For anything that shouldn't block emissives. Small objects or translucent objects primarily +#define EMISSIVE_BLOCK_NONE 0 +/// For anything that doesn't change outline or opaque area much or at all. +#define EMISSIVE_BLOCK_GENERIC 1 +/// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. +#define EMISSIVE_BLOCK_UNIQUE 2 + +#define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,val,val,0) +/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. +#define EMISSIVE_COLOR _EMISSIVE_COLOR(1) +/// A globally cached version of [EMISSIVE_COLOR] for quick access. +GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) + +#define _EM_BLOCK_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,val, 0,0,0,0) +/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. +#define EM_BLOCK_COLOR _EM_BLOCK_COLOR(1) +/// A globally cached version of [EM_BLOCK_COLOR] for quick access. +GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) + + +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +#define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) +/// A globally cached version of [EM_MASK_MATRIX] for quick access. +GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) + +/// A set of appearance flags applied to all emissive and emissive blocker overlays. +#define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR|NO_CLIENT_COLOR) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 9149e00ba79..3c4058a8d6e 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -161,6 +161,12 @@ #define RADIAL_BASE_LAYER 6 #define RADIAL_CONTENT_LAYER 7 +/// This plane masks out lighting, to create an "emissive" effect for e.g glowing screens in otherwise dark areas. +#define EMISSIVE_PLANE 10 +#define EMISSIVE_TARGET "*emissive" + /// The layer you should use when you -really- don't want an emissive overlay to be blocked. + #define EMISSIVE_LAYER_UNBLOCKABLE 9999 + //-------------------- Rendering --------------------- /// Semantics - The final compositor or a filter effect renderer diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index a1b94823fea..e44d33862d9 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -123,9 +123,9 @@ #define L_WALLMOUNT_HI_POWER 1 // For red/delta alert on fire alarms. #define L_WALLMOUNT_HI_RANGE 4 // This controls by how much console sprites are dimmed before being overlayed. -#define HOLOSCREEN_ADDITION_FACTOR 0.5 #define HOLOSCREEN_MULTIPLICATION_FACTOR 0.5 -#define HOLOSCREEN_ADDITION_OPACITY 0.5 +#define HOLOSCREEN_ADDITION_OPACITY 0.75 +#define HOLOSCREEN_ADDITION_SCREENSAVER_OPACITY 0.5 #define HOLOSCREEN_MULTIPLICATION_OPACITY 1 // Just so we can avoid unneeded proc calls when profiling is disabled. diff --git a/code/__HELPERS/emissives.dm b/code/__HELPERS/emissives.dm new file mode 100644 index 00000000000..7d975a3758d --- /dev/null +++ b/code/__HELPERS/emissives.dm @@ -0,0 +1,35 @@ +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. +/proc/emissive_appearance(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = EMPTY_BITFIELD) + var/mutable_appearance/appearance = mutable_appearance(icon = icon, icon_state = icon_state, layer = layer, plane = EMISSIVE_PLANE, flags = appearance_flags|EMISSIVE_APPEARANCE_FLAGS) + if(alpha == 255) + appearance.color = GLOB.emissive_color + else + var/alpha_ratio = alpha/255 + appearance.color = _EMISSIVE_COLOR(alpha_ratio) + appearance.blend_mode = BLEND_OVERLAY + return appearance + +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EM_BLOCK_COLOR]. +/proc/emissive_blocker(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = EMPTY_BITFIELD, source = null) + var/mutable_appearance/appearance = mutable_appearance(icon = icon, icon_state = icon_state, layer = layer, plane = EMISSIVE_PLANE, flags = appearance_flags|EMISSIVE_APPEARANCE_FLAGS) + if(alpha == 255) + appearance.color = GLOB.em_block_color + else + var/alpha_ratio = alpha/255 + appearance.color = _EM_BLOCK_COLOR(alpha_ratio) + return appearance + +// Designed to be a faster version of the above, for most use-cases +/proc/fast_emissive_blocker(atom/make_blocker) + var/mutable_appearance/blocker = new() + blocker.icon = make_blocker.icon + blocker.icon_state = make_blocker.icon_state + blocker.appearance_flags |= make_blocker.appearance_flags | EMISSIVE_APPEARANCE_FLAGS + blocker.dir = make_blocker.dir + if(make_blocker.alpha == 255) + blocker.color = GLOB.em_block_color + else + var/alpha_ratio = make_blocker.alpha/255 + blocker.color = _EM_BLOCK_COLOR(alpha_ratio) + blocker.plane = EMISSIVE_PLANE + return blocker diff --git a/code/__HELPERS/overlay.dm b/code/__HELPERS/overlay.dm deleted file mode 100644 index 53d9c16b3f9..00000000000 --- a/code/__HELPERS/overlay.dm +++ /dev/null @@ -1,58 +0,0 @@ -// Factor/Opacity values are defined in __defines\lighting.dm - -/proc/holographic_overlay(obj/target, icon, icon_state) - if (!icon || !icon_state) - CRASH("Invalid parameters.") - - var/list/m_cache = SSicon_cache.holo_multiplier_cache - var/list/m_cache_icon - var/image/multiply - if (m_cache[icon]) - m_cache_icon = m_cache[icon] - multiply = m_cache_icon[icon_state] - else - m_cache_icon = list() - m_cache[icon] = m_cache_icon - - if (!multiply) - multiply = make_screen_overlay(icon, icon_state) - multiply.blend_mode = BLEND_MULTIPLY - multiply.color = list( - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY - ) - m_cache_icon[icon_state] = multiply - - var/list/a_cache = SSicon_cache.holo_adder_cache - var/list/a_cache_icon = a_cache[icon] - var/image/overlay - if (!a_cache_icon) - a_cache_icon = list() - a_cache[icon] = a_cache_icon - else - overlay = a_cache_icon[icon_state] - - if (!overlay) - overlay = make_screen_overlay(icon, icon_state, HOLOSCREEN_ADDITION_OPACITY) - overlay.blend_mode = BLEND_ADD - a_cache_icon[icon_state] = overlay - - target.AddOverlays(list(multiply, overlay)) - -/proc/make_screen_overlay(icon, icon_state, brightness_factor = null, glow_radius = 1) - var/image/overlay = image(icon, icon_state) - overlay.plane = EFFECTS_ABOVE_LIGHTING_PLANE - var/image/underlay = image(overlay) - underlay.alpha = 128 - underlay.filters = filter(type="bloom", offset=glow_radius, size=glow_radius*2, threshold="#000") - overlay.underlays += underlay - if (brightness_factor) - overlay.color = list( - brightness_factor, 0, 0, 0, - 0, brightness_factor, 0, 0, - 0, 0, brightness_factor, 0, - 0, 0, 0, 1 - ) - return overlay diff --git a/code/_onclick/hud/rendering/_renderer.dm b/code/_onclick/hud/rendering/_renderer.dm index bec1cc93e78..5cd80fb2634 100644 --- a/code/_onclick/hud/rendering/_renderer.dm +++ b/code/_onclick/hud/rendering/_renderer.dm @@ -190,6 +190,14 @@ GLOBAL_LIST_EMPTY(zmimic_renderers) relay_blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/atom/movable/renderer/lighting/Initialize() + . = ..() + filters += filter( + type = "alpha", + render_source = EMISSIVE_TARGET, + flags = MASK_INVERSE + ) + /// Draws visuals that should not be affected by darkness. /atom/movable/renderer/above_lighting name = "Above Lighting" @@ -262,3 +270,31 @@ GLOBAL_LIST_EMPTY(zmimic_renderers) /atom/movable/renderer/scene_group/Initialize() . = ..() filters += filter(type = "displace", render_source = "*warp", size = 5) + + +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + * + * This works best if emissive overlays applied only to objects that emit light, + * since luminosity=0 turfs may not be rendered. + */ +/atom/movable/renderer/emissive + name = "Emissive" + group = RENDER_GROUP_NONE + plane = EMISSIVE_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + render_target_name = EMISSIVE_TARGET + +/atom/movable/renderer/emissive/Initialize() + . = ..() + filters += filter( + type = "color", + color = GLOB.em_mask_matrix + ) diff --git a/code/datums/late_choices.dm b/code/datums/late_choices.dm index 6c23f9bf353..7094ec74264 100755 --- a/code/datums/late_choices.dm +++ b/code/datums/late_choices.dm @@ -54,6 +54,9 @@ /datum/late_choices/proc/do_update_character_icon() update_icon_on_next_open = FALSE var/mob/mannequin = NP.client.prefs.update_mannequin() + for(var/mutable_appearance/I in mannequin.overlays) + if(I.plane == EMISSIVE_PLANE) + mannequin.overlays -= I character_image = getFlatIcon(mannequin, SOUTH) /datum/late_choices/ui_data(mob/user) diff --git a/code/defines/mutable_appearance.dm b/code/defines/mutable_appearance.dm index 183435996b6..b29cdf51009 100644 --- a/code/defines/mutable_appearance.dm +++ b/code/defines/mutable_appearance.dm @@ -10,10 +10,13 @@ plane = FLOAT_PLANE // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE) +/proc/mutable_appearance(icon, icon_state, color, flags = DEFAULT_APPEARANCE_FLAGS | RESET_COLOR | RESET_ALPHA, plane = FLOAT_PLANE, layer = FLOAT_LAYER) + RETURN_TYPE(/mutable_appearance) var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state - MA.layer = layer + MA.color = color + MA.appearance_flags = flags MA.plane = plane + MA.layer = layer return MA diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 97b7c00aa46..a593d364af7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -53,10 +53,20 @@ /// We do it like this to prevent people trying to mutate them and to save memory on holding the lists ourselves var/spatial_grid_key -/atom/movable/Destroy(force) - if (orbiting) - stop_orbit() + /// Either [EMISSIVE_BLOCK_NONE], [EMISSIVE_BLOCK_GENERIC], or [EMISSIVE_BLOCK_UNIQUE] + var/blocks_emissive = EMISSIVE_BLOCK_NONE + ///Internal holder for emissive blocker object, DO NOT USE DIRECTLY. Use blocks_emissive + var/mutable_appearance/em_block +/atom/movable/Initialize(mapload, ...) + . = ..() + update_emissive_blocker() + if (em_block) + AddOverlays(em_block) + +/atom/movable/Destroy(force) + if(orbiting) + stop_orbit() GLOB.moved_event.unregister_all_movement(loc, src) //Recalculate opacity @@ -106,6 +116,9 @@ if (bound_overlay) QDEL_NULL(bound_overlay) + if(em_block) + QDEL_NULL(em_block) + /atom/movable/proc/moveToNullspace() . = TRUE @@ -287,6 +300,31 @@ turfs -= get_turf(src) src.throw_at(pick(turfs), maxrange, speed) +/atom/movable/proc/update_emissive_blocker() + switch (blocks_emissive) + if (EMISSIVE_BLOCK_GENERIC) + em_block = fast_emissive_blocker(src) + if (EMISSIVE_BLOCK_UNIQUE) + if (!em_block && !QDELING(src)) + appearance_flags |= KEEP_TOGETHER + render_target = ref(src) + em_block = emissive_blocker( + icon = icon, + icon_state = icon_state, + appearance_flags = appearance_flags, + source = render_target + ) + return em_block + +/atom/movable/update_icon() + ..() + UPDATE_OO_IF_PRESENT + if (em_block) + CutOverlays(em_block) + update_emissive_blocker() + if (em_block) + AddOverlays(em_block) + //Overlays /atom/movable/overlay var/atom/master = null diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index ff141fb576f..74f4e8c465b 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -200,6 +200,7 @@ desc = "Scan DNA." icon_screen = "dna" icon_keyboard = "teal_key" + icon_keyboard_emis = "teal_key_mask" light_color = LIGHT_COLOR_BLUE density = 1 circuit = /obj/item/circuitboard/scan_consolenew diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index c18809e8a54..23f6d63b84c 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -510,9 +510,12 @@ pixel_x = 10; if(alarm_area?.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow - alarm_overlay = make_screen_overlay(icon, "alarm[icon_level]") + alarm_overlay = image(icon, "alarm[icon_level]") AddOverlays(alarm_overlay) + var/emissive_overlay = emissive_appearance(icon, "alarm[icon_level]") + AddOverlays(emissive_overlay) + var/new_color = null switch(icon_level) if (0) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 2e23ecd2a53..2d8656e00fb 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -133,6 +133,7 @@ desc = "A console that gives an atmospheric condition readout of various sensors connected to it." icon_screen = "tank" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN var/frequency = 1439 @@ -215,6 +216,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "tank" icon_keyboard = "atmos_key" + icon_keyboard_emis = "atmos_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE @@ -230,6 +232,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "tank" icon_keyboard = "atmos_key" + icon_keyboard_emis = "atmos_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE @@ -317,6 +320,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "tank" icon_keyboard = "atmos_key" + icon_keyboard_emis = "atmos_key_mask" ui_type = "AtmosControlSupermatter" is_connected = TRUE has_off_keyboards = TRUE @@ -417,6 +421,7 @@ /obj/machinery/computer/general_air_control/fuel_injection icon_screen = "alert:0" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN ui_type = "AtmosControlInjector" diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 2b907fc81da..187968d8a03 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -3,6 +3,7 @@ desc = "A computer used to control the stationary scrubbers and pumps in the area." icon_screen = "area_atmos" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/area_atmos diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 49fbf32a2c2..cbfe6335f95 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -14,6 +14,9 @@ var/image/button_overlay var/image/atmos_overlay + var/mutable_appearance/button_emissive + var/mutable_appearance/atmos_emissive + /obj/machinery/meter/Initialize() . = ..() @@ -58,8 +61,10 @@ else atmos_overlay_name = "pressure4" - button_overlay = image(icon, button_overlay_name) - atmos_overlay = image(icon, atmos_overlay_name) + button_overlay = overlay_image(icon, button_overlay_name) + atmos_overlay = overlay_image(icon, atmos_overlay_name) + button_emissive = emissive_appearance(icon, button_overlay_name) + atmos_emissive = emissive_appearance(icon, atmos_overlay_name) var/env_temperature = environment.temperature @@ -90,6 +95,8 @@ AddOverlays(button_overlay) AddOverlays(atmos_overlay) + AddOverlays(button_emissive) + AddOverlays(atmos_emissive) if(frequency) var/datum/radio_frequency/radio_connection = SSradio.return_frequency(frequency) diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index 61bffa4d30b..5ccc41913c5 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -287,8 +287,10 @@ return else if(!console_overlay) - console_overlay = make_screen_overlay(icon, "body_scannerconsole-screen") + console_overlay = image(icon, "body_scannerconsole-screen") + var/emissive_overlay = emissive_appearance(icon, "body_scannerconsole-screen") AddOverlays(console_overlay) + AddOverlays(emissive_overlay) set_light(1.4, 1, COLOR_PURPLE) /obj/machinery/body_scanconsole/Initialize() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 07a6cd76486..3a387242e4d 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -7,6 +7,7 @@ anchored = TRUE icon_screen = "crew" icon_keyboard = "teal_key" + icon_keyboard_emis = "teal_key_mask" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/operating @@ -121,6 +122,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "med_comp" icon_keyboard = "med_key" + icon_keyboard_emis = "med_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index ec7145d07d1..93f4f7f2a4d 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -11,6 +11,7 @@ GLOBAL_LIST_EMPTY(minor_air_alarms) icon_screen = "alert:0" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN /obj/machinery/computer/atmos_alert/Initialize() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2e9bcdaea7d..e06314514ad 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -4,6 +4,7 @@ desc = "Used to access the various cameras on the station." icon_screen = "cameras" icon_keyboard = "yellow_key" + icon_keyboard_emis = "yellow_key_mask" light_color = LIGHT_COLOR_YELLOW var/current_network = null var/obj/machinery/camera/current_camera = null @@ -270,6 +271,7 @@ desc = "Used to access the various cameras on the outpost." icon_screen = "miningcameras" icon_keyboard = "purple_key" + icon_keyboard_emis = "purple_key_mask" light_color = LIGHT_COLOR_PURPLE network = list("MINE") circuit = /obj/item/circuitboard/security/mining @@ -280,6 +282,7 @@ desc = "Used to monitor fires and breaches." icon_screen = "engineeringcameras" icon_keyboard = "yellow_key" + icon_keyboard_emis = "yellow_key_mask" light_color = LIGHT_COLOR_YELLOW circuit = /obj/item/circuitboard/security/engineering @@ -288,6 +291,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "engines" icon_keyboard = "power_key" + icon_keyboard_emis = "power_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE @@ -303,6 +307,7 @@ desc = "Used to access the built-in cameras in helmets." icon_screen = "syndicam" icon_keyboard = "red_key" + icon_keyboard_emis = "red_key_mask" light_color = LIGHT_COLOR_RED network = list(NETWORK_MERCENARY) circuit = null diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 117142aac57..afe976b97ea 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -2,6 +2,7 @@ name = "cloning control console" icon_screen = "dna" icon_keyboard = "teal_key" + icon_keyboard_emis = "teal_key_mask" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/cloning req_access = list(ACCESS_GENETICS) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 5f73effb481..d5d62b897f7 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -15,6 +15,7 @@ var/icon_screen = "computer_generic" var/icon_scanline var/icon_keyboard = "green_key" + var/icon_keyboard_emis = "green_key_mask" var/light_range_on = 2 var/light_power_on = 1.3 var/overlay_layer @@ -109,7 +110,26 @@ AddOverlays(icon_broken) else if (icon_screen) if (is_holographic) - holographic_overlay(src, src.icon, icon_screen) + var/mutable_appearance/screen_overlay = overlay_image(src.icon, icon_screen) + var/mutable_appearance/screen_overlay_holographic = overlay_image(src.icon, icon_screen) + screen_overlay_holographic.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_overlay.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_overlay.blend_mode = BLEND_ADD + screen_overlay_holographic.blend_mode = BLEND_MULTIPLY + var/mutable_appearance/screen_overlay_emis = emissive_appearance(src.icon, icon_screen) + AddOverlays(screen_overlay_holographic) + AddOverlays(screen_overlay) + AddOverlays(screen_overlay_emis) if (icon_scanline) AddOverlays(icon_scanline) if (icon_keyboard) @@ -117,6 +137,9 @@ AddOverlays("[icon_keyboard]_off") else AddOverlays(icon_keyboard) + if(icon_keyboard_emis) + var/mutable_appearance/emis = emissive_appearance(icon, icon_keyboard_emis) + AddOverlays(emis) else if (overlay_layer != layer) AddOverlays(image(icon, icon_screen, overlay_layer)) else diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index e8f24eb387f..1d76029873b 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -5,6 +5,7 @@ desc = "Used to upload laws to the AI." icon_screen = "aiupload" icon_keyboard = "blue_key" + icon_keyboard_emis = "blue_key_mask" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/aiupload var/mob/living/silicon/ai/current = null @@ -63,6 +64,7 @@ desc = "Used to upload laws to Cyborgs." icon_screen = "aiupload" icon_keyboard = "blue_key" + icon_keyboard_emis = "blue_key_mask" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/borgupload var/mob/living/silicon/robot/current = null diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index f48a79c9d11..93ab52e73e8 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -5,6 +5,7 @@ desc = "A control console for launching pods. Some people prefer firing Mechas." icon_screen = "command" icon_keyboard = "green_key" + icon_keyboard_emis = "green_key_mask" light_color = LIGHT_COLOR_GREEN circuit = /obj/item/circuitboard/pod var/id = 1.0 diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 65ac336f5ba..ca40eeec217 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -5,6 +5,7 @@ icon_screen = "robot" icon_keyboard = "purple_key" + icon_keyboard_emis = "purple_key_mask" light_color = LIGHT_COLOR_PURPLE req_one_access = list(ACCESS_RD, ACCESS_ROBOTICS) diff --git a/code/game/machinery/crusher_piston.dm b/code/game/machinery/crusher_piston.dm index 8e535ecb744..d6380bdc53e 100644 --- a/code/game/machinery/crusher_piston.dm +++ b/code/game/machinery/crusher_piston.dm @@ -155,13 +155,20 @@ asmtype = "standalone" icon_state = asmtype + var/image_overlay + var/emissive_overlay if(powered(EQUIP)) if(blocked == 1) - holographic_overlay(src, icon, "[asmtype]-overlay-red") + image_overlay = image(icon, "[asmtype]-overlay-red") + emissive_overlay = emissive_appearance(icon, "[asmtype]-overlay-red") else if(action != "idle") - holographic_overlay(src, icon, "[asmtype]-overlay-orange") + image_overlay = image(icon, "[asmtype]-overlay-orange") + emissive_overlay = emissive_appearance(icon, "[asmtype]-overlay-orange") else - holographic_overlay(src, icon, "[asmtype]-overlay-green") + image_overlay = image(icon, "[asmtype]-overlay-green") + emissive_overlay = emissive_appearance(icon, "[asmtype]-overlay-green") + AddOverlays(image_overlay) + AddOverlays(emissive_overlay) if(panel_open) AddOverlays("[asmtype]-hatch") update_above() diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index af260252975..2c8f8c3da4f 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -54,12 +54,9 @@ var/slow_stasis_mult = 1.7 var/current_stasis_mult = 1 - var/global/list/screen_overlays - /obj/machinery/atmospherics/unary/cryo_cell/Initialize() . = ..() icon = 'icons/obj/cryogenics_split.dmi' - generate_overlays() update_icon() atmos_init() @@ -90,19 +87,6 @@ if(panel_open) . += "The maintenance hatch is open." -/obj/machinery/atmospherics/unary/cryo_cell/proc/generate_overlays(force = FALSE) - if(LAZYLEN(screen_overlays) && !force) - return - LAZYINITLIST(screen_overlays) - screen_overlays["cryo-off"] = make_screen_overlay(icon, "lights_off") - screen_overlays["cryo-off-top"] = make_screen_overlay(icon, "lights_off_top") - screen_overlays["cryo-safe"] = make_screen_overlay(icon, "lights_safe") - screen_overlays["cryo-safe-top"] = make_screen_overlay(icon, "lights_safe_top") - screen_overlays["cryo-warn"] = make_screen_overlay(icon, "lights_warn") - screen_overlays["cryo-warn-top"] = make_screen_overlay(icon, "lights_warn_top") - screen_overlays["cryo-danger"] = make_screen_overlay(icon, "lights_danger") - screen_overlays["cryo-danger-top"] = make_screen_overlay(icon, "lights_danger_top") - /obj/machinery/atmospherics/unary/cryo_cell/process() ..() if(!node) @@ -351,8 +335,13 @@ warn_state = "danger" else if(air_contents.temperature >= temperature_warning_threshold) warn_state = "warn" - AddOverlays(screen_overlays["cryo-[warn_state]"]) - I = screen_overlays["cryo-[warn_state]-top"] + I = overlay_image(icon, "lights_[warn_state]") + AddOverlays(I) + I = overlay_image(icon, "lights_[warn_state]_top") + I.pixel_z = 32 + AddOverlays(I) + AddOverlays(emissive_appearance(icon, "lights_mask")) + I = emissive_appearance(icon, "lights_mask_top") I.pixel_z = 32 AddOverlays(I) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 4ecbe818365..f6875af043f 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -133,7 +133,9 @@ var/list/floor_light_cache = list() I.color = default_light_colour I.layer = layer+0.001 floor_light_cache[cache_key] = I + var/mutable_appearance/I_emis = emissive_appearance(icon, "[on_state]") AddOverlays(floor_light_cache[cache_key]) + AddOverlays(I_emis) else if(damaged == 0) //Needs init. damaged = rand(1,4) @@ -144,6 +146,8 @@ var/list/floor_light_cache = list() I.layer = layer+0.001 floor_light_cache[cache_key] = I AddOverlays(floor_light_cache[cache_key]) + var/mutable_appearance/I_emis = emissive_appearance(icon, "flicker[damaged]") + AddOverlays(I_emis) if(stat & BROKEN) icon_state = "broken" else diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index ff22febfa0d..9cab5951858 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -32,7 +32,10 @@ /obj/machinery/light_switch/update_icon() ClearOverlays() if(!(stat & NOPOWER)) - holographic_overlay(src, icon, "light[on]-overlay") + var/switch_overlay = image(icon, "light[on]-overlay") + var/emissive_overlay = emissive_appearance(icon, "light[on]-overlay") + AddOverlays(switch_overlay) + AddOverlays(emissive_overlay) if (!light_range || light_color != on ? "#82ff4c" : "#f86060") set_light(2, 0.3, on ? "#82ff4c" : "#f86060") else if (light_range) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 24b0020b0eb..9b2f7faf27c 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -89,7 +89,6 @@ var/list/obj/machinery/newscaster/allCasters = list() var/datum/feed_channel/viewing_channel = null var/datum/feed_message/viewing_message = null - var/global/list/screen_overlays /obj/machinery/newscaster/north PRESET_NORTH @@ -103,17 +102,6 @@ var/list/obj/machinery/newscaster/allCasters = list() /obj/machinery/newscaster/east PRESET_EAST -/obj/machinery/newscaster/proc/generate_overlays(var/force = 0) - if(LAZYLEN(screen_overlays) && !force) - return - LAZYINITLIST(screen_overlays) - screen_overlays["newscaster-screen"] = make_screen_overlay(icon, "newscaster-screen") - screen_overlays["newscaster-title"] = make_screen_overlay(icon, "newscaster-title") - screen_overlays["newscaster-wanted"] = make_screen_overlay(icon, "newscaster-wanted") - screen_overlays["newscaster-scanline"] = make_screen_overlay(icon, "newscaster-scanline") - for(var/i in 1 to 3) - screen_overlays["crack[i]"] = make_screen_overlay(icon, "crack[i]") - /obj/machinery/newscaster/security_unit name = "Security Newscaster" securityCaster = 1 @@ -137,7 +125,6 @@ var/list/obj/machinery/newscaster/allCasters = list() unit_no = allCasters.len + 1 if(dir & NORTH) alpha = 127 - generate_overlays() update_icon() //for any custom ones on the map... if(!mapload) @@ -157,29 +144,105 @@ var/list/obj/machinery/newscaster/allCasters = list() set_light(FALSE) if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite. ClearOverlays() - AddOverlays(screen_overlays["crack3"]) + var/mutable_appearance/cracked_overlay = overlay_image(icon, "crack3") + var/mutable_appearance/cracked_overlay_emis = emissive_appearance(icon, "crack3") + AddOverlays(list(cracked_overlay, cracked_overlay_emis)) return ClearOverlays() //reset overlays - AddOverlays(screen_overlays["newscaster-screen"]) + var/mutable_appearance/screen = overlay_image(icon, "newscaster-screen") + var/mutable_appearance/screen_hologram = overlay_image(icon, "newscaster-screen") + var/mutable_appearance/screen_emis = emissive_appearance(icon, "newscaster-screen") + screen_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram.blend_mode = BLEND_MULTIPLY + screen.blend_mode = BLEND_ADD + AddOverlays(list(screen_hologram, screen, screen_emis)) set_light(1.4, 1.3, COLOR_CYAN) - if(!alert || !SSnews.wanted_issue) // since we're transparent I don't want overlay nonsense - AddOverlays(screen_overlays["newscaster-title"]) + if(!alert || !SSnews.wanted_issue) + var/mutable_appearance/screen_title = overlay_image(icon, "newscaster-title") + var/mutable_appearance/screen_hologram_title = overlay_image(icon, "newscaster-title") + var/mutable_appearance/screen_emis_title = emissive_appearance(icon, "newscaster-title") + screen_hologram_title.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_title.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram_title.blend_mode = BLEND_MULTIPLY + screen_title.blend_mode = BLEND_ADD + AddOverlays(screen_hologram_title) + AddOverlays(screen_title) + AddOverlays(screen_emis_title) if(SSnews.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message - AddOverlays(screen_overlays["newscaster-wanted"]) + var/mutable_appearance/screen_title = overlay_image(icon, "newscaster-wanted") + var/mutable_appearance/screen_hologram_title = overlay_image(icon, "newscaster-wanted") + var/mutable_appearance/screen_emis_title = emissive_appearance(icon, "newscaster-wanted") + screen_hologram_title.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_title.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram_title.blend_mode = BLEND_MULTIPLY + screen_title.blend_mode = BLEND_ADD + AddOverlays(screen_hologram_title) + AddOverlays(screen_title) + AddOverlays(screen_emis_title) return if(alert) //new message alert overlay - AddOverlays(screen_overlays["newscaster-alert"]) + var/mutable_appearance/screen_title = overlay_image(icon, "newscaster-alert") + var/mutable_appearance/screen_hologram_title = overlay_image(icon, "newscaster-alert") + var/mutable_appearance/screen_emis_title = emissive_appearance(icon, "newscaster-alert") + screen_hologram_title.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_title.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram_title.blend_mode = BLEND_MULTIPLY + screen_title.blend_mode = BLEND_ADD + AddOverlays(screen_hologram_title) + AddOverlays(screen_title) + AddOverlays(screen_emis_title) if(hitstaken == 0) - AddOverlays(screen_overlays["newscaster-scanline"]) + AddOverlays("newscaster-scanline") if(hitstaken > 0) //Cosmetic damage overlay - AddOverlays(screen_overlays["crack[hitstaken]"]) + AddOverlays("crack[hitstaken]") icon_state = initial(icon_state) return diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 46688640389..215b7bacad2 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -119,7 +119,6 @@ var/list/obj/machinery/requests_console/allConsoles = list() ///List of PDAs we alert upon a request receipt var/list/obj/item/modular_computer/alert_pdas = list() - var/global/list/screen_overlays /obj/machinery/requests_console/north PRESET_NORTH @@ -133,41 +132,50 @@ var/list/obj/machinery/requests_console/allConsoles = list() /obj/machinery/requests_console/east PRESET_EAST -/obj/machinery/requests_console/proc/generate_overlays(var/force = 0) - if(LAZYLEN(screen_overlays) && !force) - return - LAZYINITLIST(screen_overlays) - screen_overlays["req_comp-idle"] = make_screen_overlay(icon, "req_comp-idle") - screen_overlays["req_comp-alert"] = make_screen_overlay(icon, "req_comp-alert") - screen_overlays["req_comp-redalert"] = make_screen_overlay(icon, "req_comp-redalert") - screen_overlays["req_comp-yellowalert"] = make_screen_overlay(icon, "req_comp-yellowalert") - screen_overlays["req_comp-scanline"] = make_screen_overlay(icon, "req_comp-scanline") - /obj/machinery/requests_console/power_change() ..() update_icon() /obj/machinery/requests_console/update_icon() ClearOverlays() + var/mutable_appearance/screen = overlay_image(icon, "req_comp-idle") + var/mutable_appearance/screen_hologram = overlay_image(icon, "req_comp-idle") + var/mutable_appearance/screen_emis = emissive_appearance(icon, "req_comp-idle") + screen_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram.blend_mode = BLEND_MULTIPLY + screen.blend_mode = BLEND_ADD if(stat & NOPOWER) icon_state = initial(icon_state) set_light(FALSE) else switch(newmessagepriority) if(0) - AddOverlays(screen_overlays["req_comp-idle"]) + screen = overlay_image(icon, "req_comp-idle") set_light(1.4, 1.3, COLOR_CYAN) if(1) - AddOverlays(screen_overlays["req_comp-alert"]) + screen = overlay_image(icon, "req_comp-alert") set_light(1.4, 1.3, COLOR_CYAN) if(2) - AddOverlays(screen_overlays["req_comp-redalert"]) + screen = overlay_image(icon, "req_comp-redalert") set_light(1.4, 1.3, COLOR_ORANGE) if(3) - AddOverlays(screen_overlays["req_comp-yellowalert"]) + screen = overlay_image(icon, "req_comp-yellowalert") set_light(1.4, 1.3, COLOR_ORANGE) - - AddOverlays(screen_overlays["req_comp-scanline"]) + AddOverlays(screen_hologram) + AddOverlays(screen) + AddOverlays(screen_emis) + AddOverlays(overlay_image(icon, "req_comp-scanline")) /obj/machinery/requests_console/Initialize(mapload, var/dir, var/building = 0) . = ..() @@ -177,7 +185,6 @@ var/list/obj/machinery/requests_console/allConsoles = list() src.set_dir(dir) if(src.dir & NORTH) alpha = 127 - generate_overlays() update_icon() if(!mapload) @@ -199,7 +206,6 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies |= department if (departmentType & RC_INFO) req_console_information |= department - generate_overlays() update_icon() if(!mapload) diff --git a/code/game/machinery/ringer.dm b/code/game/machinery/ringer.dm index c799376cc75..d49c66cd40f 100644 --- a/code/game/machinery/ringer.dm +++ b/code/game/machinery/ringer.dm @@ -39,8 +39,6 @@ pixel_x = 8; ///If the pinging is in cooldown, boolean var/pinged = FALSE - var/global/list/screen_overlays - /obj/machinery/ringer/north PRESET_NORTH @@ -60,7 +58,6 @@ pixel_x = 8; if(src.dir & NORTH) alpha = 127 - generate_overlays() update_icon() if(!mapload) @@ -78,32 +75,43 @@ pixel_x = 8; QDEL_NULL(ringers) return ..() -/obj/machinery/ringer/proc/generate_overlays(var/force = 0) - if(LAZYLEN(screen_overlays) && !force) - return - LAZYINITLIST(screen_overlays) - screen_overlays["bell-active"] = make_screen_overlay(icon, "bell-active") - screen_overlays["bell-alert"] = make_screen_overlay(icon, "bell-alert") - screen_overlays["bell-scanline"] = make_screen_overlay(icon, "bell-scanline") - screen_overlays["bell-standby"] = make_screen_overlay(icon, "bell-standby") - /obj/machinery/ringer/update_icon() ClearOverlays() + var/mutable_appearance/screen = overlay_image(icon, "bell-standby") + var/mutable_appearance/screen_hologram = overlay_image(icon, "bell-standby") + var/mutable_appearance/screen_emis = emissive_appearance(icon, "bell-standby") + screen_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram.blend_mode = BLEND_MULTIPLY + screen.blend_mode = BLEND_ADD if(!on || stat & NOPOWER) icon_state = initial(icon_state) set_light(FALSE) return if(rings_pdas || rings_pdas.len) - AddOverlays(screen_overlays["bell-active"]) + screen = overlay_image(icon, "bell-active") set_light(1.4, 1, COLOR_CYAN) if(pinged) - AddOverlays(screen_overlays["bell-alert"]) + screen = overlay_image(icon, "bell-alert") set_light(1.4, 1, COLOR_CYAN) if(on) - AddOverlays(screen_overlays["bell-scanline"]) + AddOverlays("bell-scanline") else - AddOverlays(screen_overlays["bell-standby"]) + screen = overlay_image(icon, "bell-standby") set_light(1.4, 1, COLOR_CYAN) + AddOverlays(screen_hologram) + AddOverlays(screen) + AddOverlays(screen_emis) /obj/machinery/ringer/attackby(obj/item/attacking_item, mob/user) if(stat & (BROKEN|NOPOWER) || !istype(user,/mob/living)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 3e06884ab6b..561821e43c7 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -97,12 +97,14 @@ if(length(message2) > CHARS_PER_LINE) message2 = "Error" update_display(message1, message2) + AddOverlays(emissive_appearance(icon, "outline", src, alpha = src.alpha)) else if(evacuation_controller.has_eta()) message1 = "-ETA-" message2 = get_shuttle_timer() if(length(message2) > CHARS_PER_LINE) message2 = "Error" update_display(message1, message2) + AddOverlays(emissive_appearance(icon, "outline", src, alpha = src.alpha)) return 1 if(STATUS_DISPLAY_MESSAGE) //custom messages var/line1 @@ -126,13 +128,16 @@ if(index2 > message2_len) index2 -= message2_len update_display(line1, line2) + AddOverlays(emissive_appearance(icon, "outline", src, alpha = src.alpha)) return 1 if(STATUS_DISPLAY_ALERT) set_picture(picture_state) + AddOverlays(emissive_appearance(icon, "outline", src, alpha = src.alpha)) return 1 if(STATUS_DISPLAY_TIME) message1 = "TIME" message2 = worldtime2text() + AddOverlays(emissive_appearance(icon, "outline", src, alpha = src.alpha)) update_display(message1, message2) return 1 return 0 diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm index a1feb018b84..d3edacd2595 100644 --- a/code/game/machinery/suit_cycler.dm +++ b/code/game/machinery/suit_cycler.dm @@ -124,13 +124,20 @@ var/image/panel = image(icon, "panel", layer = ABOVE_HUMAN_LAYER) AddOverlays(panel) + var/mutable_appearance/lights_emissive = emissive_appearance(icon, "light_radiation") if(irradiating) - var/image/irradiating_lights = make_screen_overlay(icon, "light_radiation") - AddOverlays(irradiating_lights) + var/image/irradiating_lights = overlay_image(icon, "light_radiation") + AddOverlays(list( + irradiating_lights, + lights_emissive + )) set_light(3, 0.8, COLOR_RED_LIGHT) else if(active) - var/image/active_lights = make_screen_overlay(icon, "light_active") - AddOverlays(active_lights) + var/image/active_lights = overlay_image(icon, "light_active") + AddOverlays(list( + active_lights, + lights_emissive + )) set_light(3, 0.8, COLOR_YELLOW) else set_light(0) diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index d0232fdcfd3..2ba04a1e3a6 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -8,6 +8,7 @@ desc = "A monitor that contains and displays the logs of a selected telecommunications server to authorized personnel." icon_screen = "comm_logs" icon_keyboard = "green_key" + icon_keyboard_emis = "green_key_mask" light_color = LIGHT_COLOR_GREEN var/screen = 0 // the screen number: diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index cd9c52a5a3e..b9e32eb7142 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -9,6 +9,7 @@ desc = "Used to access and maintain data on messaging servers. Allows you to view requests console messages." icon_screen = "comm_logs" icon_keyboard = "green_key" + icon_keyboard_emis = "green_key_mask" light_color = LIGHT_COLOR_GREEN var/hack_icon = "error" circuit = /obj/item/circuitboard/message_monitor diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index c12ab9b1709..1a503872ca6 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -9,6 +9,7 @@ desc = "A monitor that tracks the overall traffic of a telecommunications network, and displays a hierarchy of linked machines." icon_screen = "comm_monitor" icon_keyboard = "green_key" + icon_keyboard_emis = "green_key_mask" light_color = LIGHT_COLOR_GREEN var/screen = 0 // the screen number: diff --git a/code/game/machinery/telecomms/computers/traffic_control.dm b/code/game/machinery/telecomms/computers/traffic_control.dm index d72b692cfe8..c71f3e3b076 100644 --- a/code/game/machinery/telecomms/computers/traffic_control.dm +++ b/code/game/machinery/telecomms/computers/traffic_control.dm @@ -4,6 +4,7 @@ name = "telecommunications traffic control" icon_screen = "computer_generic" icon_keyboard = "green_key" + icon_keyboard_emis = "green_key_mask" light_color = LIGHT_COLOR_GREEN req_access = list(ACCESS_TCOMSAT) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 28efb16c57d..4b93baaf75e 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -53,7 +53,8 @@ z_flags = ZMM_MANGLE_PLANES var/icon_vend //Icon_state when vending - var/deny_time // How long the physical icon state lasts, used cut the deny overlay + var/icon_deny //Icon_state when denying + var/icon_screen // Power idle_power_usage = 10 @@ -122,14 +123,14 @@ var/vending_sound = 'sound/machines/vending/vending_drop.ogg' - var/global/list/screen_overlays - var/exclusive_screen = TRUE // Are we not allowed to show the deny and screen states at the same time? + ///Lighting mask for vending machine + var/light_mask var/ui_size = 80 // this is for scaling the ui buttons - i've settled on 80x80 for machines with prices, and 60x60 for those without and with large inventories (boozeomat) var/datum/asset/spritesheet/vending/v_asset light_range = 2 - light_power = 1.3 + light_power = 0.9 /obj/machinery/vending/Initialize(mapload) . = ..() @@ -145,7 +146,7 @@ if(src.product_ads) src.ads_list += text2list(src.product_ads, ";") - add_screen_overlay() + reset_light() build_products() build_inventory() power_change() @@ -158,17 +159,13 @@ /obj/machinery/vending/proc/reset_light() set_light(initial(light_range), initial(light_power), initial(light_color)) -/obj/machinery/vending/proc/add_screen_overlay(var/deny = FALSE) - if(!LAZYLEN(screen_overlays)) - LAZYINITLIST(screen_overlays) - if(!("[icon_state]-screen" in screen_overlays) || (deny && !("[icon_state]-deny" in screen_overlays))) - var/list/states = icon_states(icon) - if ("[icon_state]-screen" in states) - screen_overlays["[icon_state]-screen"] = make_screen_overlay(icon, "[icon_state]-screen") - if ("[icon_state]-deny" in states) - screen_overlays["[icon_state]-deny"] = make_screen_overlay(icon, "[icon_state]-deny") - AddOverlays(screen_overlays["[icon_state]-[deny ? "deny" : "screen"]"]) - reset_light() +/obj/machinery/vending/update_icon() + if(src.light_mask) + var/image/E = emissive_appearance(icon, light_mask) + AddOverlays(E) + if(src.icon_screen) + var/image/I = image(icon, icon_screen) + AddOverlays(I) /** * Build src.products @@ -296,7 +293,6 @@ src.panel_open = !src.panel_open to_chat(user, "You [src.panel_open ? "open" : "close"] the maintenance panel.") ClearOverlays() - add_screen_overlay() if(src.panel_open) AddOverlays("[initial(icon_state)]-panel") return TRUE @@ -617,14 +613,9 @@ if (action == "vendItem" && vend_ready && !currently_vending) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, SPAN_WARNING("Access denied.")) //Unless emagged of course - if(exclusive_screen) - ClearOverlays() - addtimer(CALLBACK(src, PROC_REF(add_screen_overlay)), deny_time ? deny_time : 15) - add_screen_overlay(deny = TRUE) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, CutOverlays), screen_overlays["[icon_state]-deny"]), deny_time ? deny_time : 15) + flick(src.icon_deny, src) set_light(initial(light_range), initial(light_power), COLOR_RED_LIGHT) - addtimer(CALLBACK(src, PROC_REF(reset_light)), deny_time ? deny_time : 15) - addtimer(CALLBACK(src, PROC_REF(add_screen_overlay)), deny_time ? deny_time : 15) + update_icon() return var/key = text2num(params["vendItem"]) @@ -675,13 +666,8 @@ if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(usr, "Access denied.") //Unless emagged of course) - if(exclusive_screen) - ClearOverlays() - addtimer(CALLBACK(src, PROC_REF(add_screen_overlay)), deny_time ? deny_time : 15) - add_screen_overlay(deny = TRUE) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, CutOverlays), screen_overlays["[icon_state]-deny"]), deny_time ? deny_time : 15) + flick(src.icon_deny, src) set_light(initial(light_range), initial(light_power), COLOR_RED_LIGHT) - addtimer(CALLBACK(src, PROC_REF(reset_light)), deny_time ? deny_time : 15) return src.vend_ready = 0 //One thing at a time!! src.status_message = "Vending..." @@ -802,7 +788,7 @@ set_light(0) else if(!(stat & NOPOWER)) icon_state = initial(icon_state) - add_screen_overlay() + update_icon() else icon_state = "[initial(icon_state)]-off" ClearOverlays() diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index 2b44da8bac7..7f03f2d9c4a 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -23,7 +23,6 @@ desc = "The mother of all vendors, from which vending itself comes!" icon_state = "engivend" icon_vend = "engivend-vend" - deny_time = 6 vend_id = "admin" req_access = list(ACCESS_JANITOR) products = list( @@ -51,7 +50,7 @@ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one." icon_state = "boozeomat" //////////////18 drink entities below, plus the glasses, in case someone wants to edit the number of bottles icon_vend = "boozeomat-vend" - deny_time = 16 + light_mask = "boozeomat-lightmask" vend_id = "booze" products = list( /obj/item/reagent_containers/food/drinks/bottle/applejack = 5, @@ -164,7 +163,6 @@ random_itemcount = 0 vending_sound = 'sound/machines/vending/vending_cans.ogg' light_color = COLOR_PALE_BLUE_GRAY - exclusive_screen = FALSE ui_size = 60 /obj/machinery/vending/boozeomat/ui_data(mob/user) @@ -222,6 +220,7 @@ vend_id = "tools" icon_state = "generic" icon_vend = "generic-vend" + light_mask = "generic-lightmask" products = list( /obj/item/device/assembly/prox_sensor = 5, /obj/item/device/assembly/igniter = 3, @@ -246,6 +245,7 @@ desc = "Just a normal vending machine - nothing to see here." icon_state = "generic" icon_vend = "generic-vend" + light_mask = "generic-lightmask" contraband = null random_itemcount = 0 products = list( @@ -265,6 +265,8 @@ product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" icon_state = "coffee" icon_vend = "coffee-vend" + icon_screen = "coffee-screen" + light_mask = "coffee-lightmask" vend_delay = 34 idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. vend_id = "coffee" @@ -318,6 +320,7 @@ product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" icon_state = "snack" icon_vend = "snack-vend" + light_mask = "snack-lightmask" vend_id = "snacks" products = list( /obj/item/reagent_containers/food/snacks/candy = 6, @@ -425,6 +428,9 @@ desc = "A soft drink vendor provided by an Idris subsidiary." icon_state = "cola_machine" icon_vend = "cola_machine-vend" + icon_deny = "cola_machine-deny" + icon_screen = "cola_machine-screen" + light_mask = "cola_machine-lightmask" product_slogans = "Idris Re-Fresh: the more expensive the place, the more of us you'll seee!" product_ads = "Refreshing!;Hope you're thirsty!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." vend_id = "cola" @@ -626,7 +632,6 @@ desc = "Medical drug dispenser." icon_state = "med" icon_vend = "med-vend" - deny_time = 15 product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access = list(ACCESS_MEDICAL_EQUIP) vend_id = "meds" @@ -701,7 +706,6 @@ desc = "A wall-mounted version of the NanoMed." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" icon_state = "wallmed" - deny_time = 15 req_access = list(ACCESS_MEDICAL) density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude vend_id = "meds" @@ -733,7 +737,6 @@ name = "\improper NanoMed Mini" desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment." icon_state = "wallmed" - deny_time = 15 req_access = list(ACCESS_MEDICAL) density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude vend_id = "meds" @@ -767,7 +770,6 @@ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon_state = "sec" icon_vend = "sec-vend" - deny_time = 16 req_access = list(ACCESS_SECURITY) vend_id = "security" products = list( @@ -798,7 +800,6 @@ restock_items = 1 random_itemcount = 0 light_color = COLOR_BABY_BLUE - exclusive_screen = FALSE manufacturer = "zavodskoi" /obj/machinery/vending/hydronutrients @@ -808,7 +809,6 @@ product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." icon_state = "nutri" icon_vend = "nutri-vend" - deny_time = 6 vend_id = "hydro" products = list( /obj/item/reagent_containers/glass/fertilizer/ez = 6, @@ -1036,6 +1036,7 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" icon_vend = "dinnerware-vend" + light_mask = "dinnerware-lightmask" vend_id = "cutlery" products = list( /obj/item/material/kitchen/utensil/fork = 12, @@ -1156,7 +1157,6 @@ desc = "Tools for tools." icon_state = "tool" icon_vend = "tool-vend" - deny_time = 6 vend_id = "tools" //req_access = list(ACCESS_MAINT_TUNNELS) //Maintenance access products = list( @@ -1192,7 +1192,6 @@ desc = "Spare tool vending. What? Did you expect some witty description?" icon_state = "engivend" icon_vend = "engivend-vend" - deny_time = 6 req_access = list(ACCESS_ENGINE) vend_id = "tools" products = list( @@ -1223,7 +1222,6 @@ name = "Tactical Express" desc = "Everything you need to ensure corporate bureaucracy makes it another day." icon_state = "tact" - deny_time = 19 req_access = list(ACCESS_SECURITY) vend_id = "tactical" products = list( @@ -1281,7 +1279,6 @@ desc = "Everything you need for do-it-yourself station repair." icon_state = "engi" icon_vend = "engi-vend" - deny_time = 6 req_access = list(ACCESS_ENGINE_EQUIP) vend_id = "tools" products = list( @@ -1328,7 +1325,6 @@ desc = "All the tools you need to create your own robot army." icon_state = "robotics" icon_vend = "robotics-vend" - deny_time = 14 req_access = list(ACCESS_ROBOTICS) vend_id = "robo-tools" products = list( diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 56d9a5b7bef..54b3ba5656f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -2,6 +2,7 @@ name = "item" icon = 'icons/obj/items.dmi' w_class = ITEMSIZE_NORMAL + blocks_emissive = EMISSIVE_BLOCK_GENERIC ///This saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/image/blood_overlay diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index fb7980f9aff..c39901d81ac 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -32,7 +32,6 @@ pixel_x = 8; z_flags = ZMM_MANGLE_PLANES var/number = 0 var/obj/machinery/abstract/intercom_listener/power_interface - var/global/list/screen_overlays var/radio_sound = null clickvol = 40 @@ -341,18 +340,8 @@ pixel_x = 8; /obj/item/device/radio/intercom/Initialize() . = ..() power_interface = new(loc, src) - generate_overlays() update_icon() -/obj/item/device/radio/intercom/proc/generate_overlays(var/force = 0) - if(LAZYLEN(screen_overlays) && !force) - return - LAZYINITLIST(screen_overlays) - screen_overlays["intercom_screen"] = make_screen_overlay(icon, "intercom_screen") - screen_overlays["intercom_scanline"] = make_screen_overlay(icon, "intercom_scanline") - screen_overlays["intercom_b"] = make_screen_overlay(icon, "intercom_b") - screen_overlays["intercom_l"] = make_screen_overlay(icon, "intercom_l") - /obj/item/device/radio/intercom/syndicate name = "illegally modified intercom" desc = "Talk through this. Evilly." @@ -432,18 +421,69 @@ pixel_x = 8; /obj/item/device/radio/intercom/update_icon() ClearOverlays() + var/mutable_appearance/screen = overlay_image(icon, "intercom_screen") + var/mutable_appearance/screen_hologram = overlay_image(icon, "intercom_screen") + var/mutable_appearance/screen_emis = emissive_appearance(icon, "intercom_screen") + screen_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_hologram.blend_mode = BLEND_MULTIPLY + screen.blend_mode = BLEND_ADD if(!on) icon_state = initial(icon_state) set_light(FALSE) return else - AddOverlays(screen_overlays["intercom_screen"]) - AddOverlays(screen_overlays["intercom_scanline"]) + AddOverlays(screen_hologram) + AddOverlays(screen) + AddOverlays(screen_emis) + AddOverlays("intercom_scanline") set_light(1.4, 1.3, COLOR_CYAN) if(broadcasting) - AddOverlays(screen_overlays["intercom_b"]) + var/mutable_appearance/screen_broadcasting = overlay_image(icon, "intercom_b") + var/mutable_appearance/screen_broadcasting_hologram = overlay_image(icon, "intercom_b") + screen_broadcasting_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_broadcasting.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_broadcasting_hologram.blend_mode = BLEND_MULTIPLY + screen_broadcasting.blend_mode = BLEND_ADD + AddOverlays(list(screen_broadcasting_hologram, screen_broadcasting)) if(listening) - AddOverlays(screen_overlays["intercom_l"]) + var/mutable_appearance/screen_listening = overlay_image(icon, "intercom_l") + var/mutable_appearance/screen_listening_hologram = overlay_image(icon, "intercom_l") + screen_listening_hologram.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + screen_listening.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + screen_listening_hologram.blend_mode = BLEND_MULTIPLY + screen_listening.blend_mode = BLEND_ADD + AddOverlays(list(screen_listening_hologram, screen_listening)) /obj/item/device/radio/intercom/broadcasting/Initialize() SHOULD_CALL_PARENT(FALSE) diff --git a/code/game/objects/items/items_icon.dm b/code/game/objects/items/items_icon.dm index 8b7d0b19b5a..58b3f5685e3 100644 --- a/code/game/objects/items/items_icon.dm +++ b/code/game/objects/items/items_icon.dm @@ -49,6 +49,8 @@ var/list/mob_icon_icon_states = list() I.AddOverlays(additional_parts) if(has_accents) I.AddOverlays(overlay_image(icon, "[UNDERSCORE_OR_NULL(src.icon_species_tag)][item_state][contained_sprite ? slot_str_to_contained_flag(slot) : ""]_acc", accent_color, accent_flags)) + if(blocks_emissive != EMISSIVE_BLOCK_NONE) + I.AddOverlays(emissive_blocker(mob_icon, mob_state)) var/offset_x = worn_x_dimension var/offset_y = worn_y_dimension center_image(I, offset_x, offset_y) diff --git a/code/game/objects/items/skrell.dm b/code/game/objects/items/skrell.dm index fc631c976c7..ff5fab9d863 100644 --- a/code/game/objects/items/skrell.dm +++ b/code/game/objects/items/skrell.dm @@ -60,7 +60,7 @@ /obj/effect/temp_visual/constellation/Initialize() . = ..() if(!glow_state) - glow_state = make_screen_overlay(icon, icon_state) + glow_state = overlay_image(icon, icon_state) AddOverlays(glow_state) /obj/effect/temp_visual/constellation/attackby(obj/item/attacking_item, mob/user) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 0e831dd0755..861b2872ade 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -2,6 +2,7 @@ icon = 'icons/obj/structures.dmi' w_class = ITEMSIZE_IMMENSE layer = STRUCTURE_LAYER + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/material_alteration = MATERIAL_ALTERATION_ALL // Overrides for material shit. Set them manually if you don't want colors etc. See wood chairs/office chairs. var/climbable diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 4972136f8d5..13d3b9577e5 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -147,7 +147,7 @@ /obj/structure/railing/update_icon(var/update_neighbors = TRUE) NeighborsCheck(update_neighbors) - overlays.Cut() + CutOverlays() if(dir == SOUTH) layer = ABOVE_HUMAN_LAYER else @@ -157,11 +157,11 @@ else icon_state = "railing1-[density]" if(neighbor_status & 32) - overlays += image(icon, "corneroverlay[density]") + AddOverlays(image(icon, "corneroverlay[density]")) if((neighbor_status & 16) || !(neighbor_status & 32) || (neighbor_status & 64)) - overlays += image(icon, "frontoverlay_l[density]") + AddOverlays(image(icon, "frontoverlay_l[density]")) if(!(neighbor_status & 2) || (neighbor_status & 1) || (neighbor_status & 4)) - overlays += image(icon, "frontoverlay_r[density]") + AddOverlays(image(icon, "frontoverlay_r[density]")) if(neighbor_status & 4) var/pix_offset_x = 0 var/pix_offset_y = 0 @@ -174,7 +174,7 @@ pix_offset_y = -32 if(WEST) pix_offset_y = 32 - overlays += image(icon, "mcorneroverlay[density]", pixel_x = pix_offset_x, pixel_y = pix_offset_y) + AddOverlays(image(icon, "mcorneroverlay[density]", pixel_x = pix_offset_x, pixel_y = pix_offset_y)) /obj/structure/railing/verb/flip() // This will help push railing to remote places, such as open space turfs set name = "Flip Railing" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b67634aeff8..06c22aa1d30 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -298,7 +298,8 @@ var/list/preferences_datums = list() client.screen |= O O.appearance = MA O.dir = D - O.plane = HUD_PLANE + O.hud_layerise() + O.plane = 11 //THIS IS DUMB. Figure out a way to remove emissive blockers from the mob and their overlays. var/list/screen_locs = preview_screen_locs["[D]"] var/screen_x = screen_locs[1] var/screen_x_minor = screen_locs[2] diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index c43331dd261..b0ff0de5b93 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -1112,7 +1112,8 @@ BLIND // can't see anything toggleable = TRUE toggle_changes_appearance = FALSE var/eye_color = COLOR_WHITE - var/image/mob_overlay + var/mutable_appearance/mob_overlay + var/mutable_appearance/mob_overlay_emis /obj/item/clothing/glasses/eyepatch/hud/handle_flipping(mob/user) ..() @@ -1123,14 +1124,14 @@ BLIND // can't see anything var/mob/living/carbon/human/H = loc if(H.glasses == src) H.CutOverlays(mob_overlay, ATOM_ICON_CACHE_PROTECTED) - mob_overlay = image('icons/obj/clothing/glasses.dmi', "[icon_state]_eye") + mob_overlay = mutable_appearance('icons/obj/clothing/glasses.dmi', "[icon_state]_eye") mob_overlay.appearance_flags = RESET_COLOR mob_overlay.color = eye_color - mob_overlay.layer = LIGHTING_LAYER + 1 + mob_overlay_emis = emissive_appearance('icons/obj/clothing/glasses.dmi', "[icon_state]_eye") if(active && ishuman(loc)) var/mob/living/carbon/human/H = loc if(H.glasses == src) - H.AddOverlays(mob_overlay, ATOM_ICON_CACHE_PROTECTED) + H.AddOverlays(list(mob_overlay, mob_overlay_emis), ATOM_ICON_CACHE_PROTECTED) update_icon() /obj/item/clothing/glasses/eyepatch/hud/Initialize() @@ -1140,14 +1141,20 @@ BLIND // can't see anything /obj/item/clothing/glasses/eyepatch/hud/equipped(mob/user, slot) if(active && slot == slot_glasses) user.AddOverlays(mob_overlay, ATOM_ICON_CACHE_PROTECTED) + user.AddOverlays(mob_overlay_emis, TRUE) + user.z_flags |= ZMM_MANGLE_PLANES else user.CutOverlays(mob_overlay, ATOM_ICON_CACHE_PROTECTED) + user.AddOverlays(mob_overlay_emis, TRUE) + user.z_flags &= ZMM_MANGLE_PLANES return ..() /obj/item/clothing/glasses/eyepatch/hud/Destroy() if (ishuman(loc)) loc.CutOverlays(mob_overlay, ATOM_ICON_CACHE_PROTECTED) + loc.CutOverlays(mob_overlay, TRUE) QDEL_NULL(mob_overlay) + QDEL_NULL(mob_overlay_emis) return ..() /obj/item/clothing/glasses/eyepatch/hud/attack_self() diff --git a/code/modules/clothing/suits/hazardvests.dm b/code/modules/clothing/suits/hazardvests.dm index 8d6f2b48c6c..384c36cd146 100644 --- a/code/modules/clothing/suits/hazardvests.dm +++ b/code/modules/clothing/suits/hazardvests.dm @@ -27,6 +27,13 @@ item_state = icon_state update_clothing_icon() +/obj/item/clothing/suit/storage/hazardvest/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_wear_suit_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "[opened ? "hazard_open-emissive" : "hazard-emissive"]", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/suit/storage/hazardvest/blue name = "blue hazard vest" desc = "A high-visibility vest used in work zones. This one is blue." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 3b7f0456ce7..fc5a9c81912 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -404,6 +404,13 @@ body_parts_covered = UPPER_TORSO|ARMS contained_sprite = TRUE +/obj/item/clothing/suit/storage/toggle/highvis/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_wear_suit_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "[opened ? "jacket_highvis_open_su_emis" : "jacket_highvis_su_emis"]", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/suit/storage/toggle/highvis_alt name = "high visibility jacket" desc = "A bright yellow jacket with reflective stripes. For use in operations, engineering, and sometimes even law enforcement, in cold and poor weather or when visibility is low." @@ -413,6 +420,13 @@ body_parts_covered = UPPER_TORSO|ARMS contained_sprite = TRUE +/obj/item/clothing/suit/storage/toggle/highvis_alt/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_wear_suit_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "[opened ? "jacket_highvis_alt_open_su-emis" : "jacket_highvis_alt_su-emis"]", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/suit/storage/toggle/track name = "track jacket" desc = "a track jacket, for the athletic." diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 070aed32b02..0840315cdb1 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -35,6 +35,13 @@ max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS +/obj/item/clothing/suit/fire/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_wear_suit_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "firesuit-emissive", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/suit/fire/atmos name = "atmospheric technician firesuit" desc = "A suit that protects against fire and heat, this one is designed for atmospheric technicians." @@ -46,6 +53,13 @@ BODYTYPE_VAURCA_BULWARK = 'icons/mob/species/bulwark/fire.dmi' ) +/obj/item/clothing/suit/fire/atmos/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_wear_suit_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "atmos_firesuit-emissive", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /* * Bomb protection */ diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index a2825775483..53fd8bad2ec 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -4,6 +4,7 @@ // Pants Parent Item /obj/item/clothing/under/pants + abstract_type = /obj/item/clothing/under/pants name = "pants parent item" desc = DESC_PARENT icon = 'icons/obj/item/clothing/under/pants.dmi' @@ -49,6 +50,13 @@ icon_state = "pants_highvis" item_state = "pants_highvis" +/obj/item/clothing/under/pants/highvis/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_w_uniform_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "pants_highvis_un-emis", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/under/pants/highvis_alt name = "high visibility pants" desc = "A pair of bright yellow pants with reflective stripes. For use in operations, engineering, and sometimes even law enforcement, in cold and poor weather or when visibility is low." @@ -56,6 +64,13 @@ icon_state = "pants_highvis_alt" item_state = "pants_highvis_alt" +/obj/item/clothing/under/pants/highvis_alt/get_mob_overlay(mob/living/carbon/human/H, mob_icon, mob_state, slot) + var/image/I = ..() + if(slot == slot_w_uniform_str) + var/image/emissive_overlay = emissive_appearance(mob_icon, "pants_highvis_alt_un-emis", alpha = src.alpha) + I.AddOverlays(emissive_overlay) + return I + /obj/item/clothing/under/pants/camo name = "camouflage pants" desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station." diff --git a/code/modules/heavy_vehicle/components/frame.dm b/code/modules/heavy_vehicle/components/frame.dm index 7a5472aa39d..d9faf8bd142 100644 --- a/code/modules/heavy_vehicle/components/frame.dm +++ b/code/modules/heavy_vehicle/components/frame.dm @@ -88,20 +88,19 @@ /obj/structure/heavy_vehicle_frame/update_icon() //As mech icons uses a caching system, any changes here, particularly to layers, must be reflected in /mob/living/heavy_vehicle/update_icon(). - var/list/new_overlays = get_mech_icon(list(body), MECH_BASE_LAYER) + AddOverlays(get_mech_icon(list(body), MECH_BASE_LAYER)) if(body) density = TRUE - new_overlays += get_mech_image("[body.icon_state]_cockpit", body.on_mech_icon, MECH_BASE_LAYER) + AddOverlays(get_mech_image("[body.icon_state]_cockpit", body.on_mech_icon, MECH_BASE_LAYER)) else density = FALSE if(head) - new_overlays += get_mech_image("[head.icon_state]", head.on_mech_icon, head.color, MECH_HEAD_LAYER) - new_overlays += get_mech_image("[head.icon_state]_eyes", head.on_mech_icon, null, EYEGLOW_LAYER) + AddOverlays(get_mech_image("[head.icon_state]", head.on_mech_icon, head.color, MECH_HEAD_LAYER)) + AddOverlays(get_mech_image("[head.icon_state]_eyes", head.on_mech_icon, null, EYEGLOW_LAYER)) if(arms) - new_overlays += get_mech_image(arms.icon_state, arms.on_mech_icon, arms.color, MECH_ARM_LAYER) + AddOverlays(get_mech_image(arms.icon_state, arms.on_mech_icon, arms.color, MECH_ARM_LAYER)) if(legs) - new_overlays += get_mech_image(legs.icon_state, legs.on_mech_icon, legs.color, MECH_LEG_LAYER) - overlays = new_overlays + AddOverlays(get_mech_image(legs.icon_state, legs.on_mech_icon, legs.color, MECH_LEG_LAYER)) if(density != opacity) set_opacity(density) diff --git a/code/modules/heavy_vehicle/mech_icon.dm b/code/modules/heavy_vehicle/mech_icon.dm index a9dc1d0cebc..275f9806363 100644 --- a/code/modules/heavy_vehicle/mech_icon.dm +++ b/code/modules/heavy_vehicle/mech_icon.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(mecha_icon_cache) if(far_icon_state in mecha_weapon_overlays) new_overlays += get_mech_image(far_icon_state, 'icons/mecha/mecha_weapon_overlays.dmi', null, MOB_LAYER) - overlays = new_overlays + SetOverlays(new_overlays) /mob/living/heavy_vehicle/regenerate_icons() return diff --git a/code/modules/mob/abstract/abstract.dm b/code/modules/mob/abstract/abstract.dm index 25eeca124a8..02f14102940 100644 --- a/code/modules/mob/abstract/abstract.dm +++ b/code/modules/mob/abstract/abstract.dm @@ -2,6 +2,7 @@ name = "abstract mob" status_flags = GODMODE invisibility = INVISIBILITY_ABSTRACT + blocks_emissive = EMISSIVE_BLOCK_NONE density = FALSE anchored = TRUE diff --git a/code/modules/mob/abstract/new_player/preferences_setup.dm b/code/modules/mob/abstract/new_player/preferences_setup.dm index cf87e8db93d..02d804ab686 100644 --- a/code/modules/mob/abstract/new_player/preferences_setup.dm +++ b/code/modules/mob/abstract/new_player/preferences_setup.dm @@ -260,6 +260,7 @@ if(gender) mannequin.change_gender(gender) dress_preview_mob(mannequin) + mannequin.ClearOverlays() return mannequin /datum/preferences/proc/update_preview_icon() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 51ba27967d1..f400a7b35cf 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,6 +1,7 @@ /mob/living/carbon gender = MALE accent = ACCENT_CETI + blocks_emissive = EMISSIVE_BLOCK_UNIQUE var/datum/species/species //Contains icon generation and language information, set during New(). //stomach contents redefined at mob/living level, removed from here diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index ffd85216dc9..658b1a8474f 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,4 +1,7 @@ /mob/living/carbon/human + + blocks_emissive = EMISSIVE_BLOCK_NONE + // Tail Style var/tail_style = null diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 3f0144fe4e3..e3694ae9732 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -3,6 +3,7 @@ desc = "Used to monitor the station's drone population and the assembler that services them." icon_screen = "power_monitor" icon_keyboard = "yellow_key" + icon_keyboard_emis = "yellow_key_mask" light_color = LIGHT_COLOR_YELLOW req_access = list(ACCESS_ENGINE_EQUIP) circuit = /obj/item/circuitboard/drone_control diff --git a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm index 345f7c48c5d..50af3a9cb44 100644 --- a/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/ipc_zombie.dm @@ -41,6 +41,9 @@ ///Overlay of a screen to display on the zombie's monitor var/image/screen_overlay + ///Emissive overlay of above + var/image/emissive_overlay + ///IPC corpse to spawn on the simplemob's death var/corpse = /obj/effect/landmark/corpse/ipc_zombie @@ -50,18 +53,20 @@ icon_dead = "[icon_state]_off" screen = pick("screen_blue", "screen_red", "screen_orange", "screen_lumi_eyes", "screen_goggles", "screen_console", "screen_static2", "screen_static3") screen_overlay = image('icons/mob/npc/ipc_zombie.dmi', "[screen]") - screen_overlay.plane = plane = EFFECTS_ABOVE_LIGHTING_PLANE screen_overlay.appearance_flags = KEEP_APART AddOverlays(screen_overlay) + emissive_overlay = emissive_appearance('icons/mob/npc/ipc_zombie.dmi', "[screen]") + AddOverlays(emissive_overlay) set_light(MINIMUM_USEFUL_LIGHT_RANGE, 2, LIGHT_COLOR_TUNGSTEN) /mob/living/simple_animal/hostile/ipc_zombie/update_icon() ClearOverlays() if(screen && stat != DEAD) screen_overlay = image('icons/mob/npc/ipc_zombie.dmi', "[screen]") - screen_overlay.plane = EFFECTS_ABOVE_LIGHTING_PLANE screen_overlay.appearance_flags = KEEP_APART AddOverlays(screen_overlay) + emissive_overlay = emissive_appearance('icons/mob/npc/ipc_zombie.dmi', "[screen]") + AddOverlays(emissive_overlay) /mob/living/simple_animal/hostile/ipc_zombie/death() ..() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6e3c88fb8bf..cecef72857d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -4,6 +4,7 @@ animate_movement = 2 movable_flags = MOVABLE_FLAG_PROXMOVE sight = DEFAULT_SIGHT + blocks_emissive = EMISSIVE_BLOCK_GENERIC var/datum/mind/mind var/static/next_mob_id = 0 diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 8c7472ea6c8..c01c811fad8 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -172,12 +172,32 @@ return if(!enabled) if(icon_state_screensaver && working) - if (is_holographic) - holographic_overlay(src, src.icon, icon_state_screensaver) - else - AddOverlays(icon_state_screensaver) + var/mutable_appearance/I = overlay_image(src.icon, icon_state_screensaver) + if(is_holographic) + var/mutable_appearance/I_holographic = overlay_image(src.icon, icon_state_screensaver) + I_holographic.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + I.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_SCREENSAVER_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_SCREENSAVER_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_SCREENSAVER_OPACITY, 0, + 0, 0, 0, 1 + )) + I_holographic.blend_mode = BLEND_MULTIPLY + I.blend_mode = BLEND_ADD + AddOverlays(I_holographic) + var/mutable_appearance/E = emissive_appearance(src.icon, icon_state_screensaver) + AddOverlays(I) + AddOverlays(E) if(icon_state_screensaver_key && working) - AddOverlays(icon_state_screensaver_key) + var/image/EK = emissive_appearance(src.icon, icon_state_screensaver_key) + var/image/IK = image(src.icon, icon_state_screensaver_key) + AddOverlays(EK) + AddOverlays(IK) if (screensaver_light_range && working && !flashlight) set_light(screensaver_light_range, light_power, screensaver_light_color ? screensaver_light_color : "#FFFFFF") @@ -185,21 +205,56 @@ set_light(0) return if(active_program) - var/state = active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu + var/state_program = active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu + var/mutable_appearance/state = overlay_image(src.icon, state_program) var/state_key = active_program.program_key_icon_state ? active_program.program_key_icon_state : icon_state_menu_key // for corresponding keyboards. - if (is_holographic) - holographic_overlay(src, src.icon, state) - else - AddOverlays(state) - AddOverlays(state_key) + if(is_holographic) + var/mutable_appearance/state_holographic = overlay_image(src.icon, state_program) + state_holographic.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + state.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + state.blend_mode = BLEND_ADD + state_holographic.blend_mode = BLEND_MULTIPLY + AddOverlays(state_holographic) + AddOverlays(list(state, state_key)) + var/emissive_image = emissive_appearance(src.icon, state_program) + var/emissive_image_key = emissive_appearance(src.icon, "[state_key]_mask") + AddOverlays(list(emissive_image, emissive_image_key)) if(!flashlight) set_light(light_range, light_power, l_color = active_program.color) else - if (is_holographic) - holographic_overlay(src, src.icon, icon_state_menu) - else - AddOverlays(icon_state_menu) - AddOverlays(icon_state_menu_key) + var/mutable_appearance/menu = overlay_image(src.icon, icon_state_menu) + if(is_holographic) + var/mutable_appearance/holographic_menu = overlay_image(src.icon, icon_state_menu) + holographic_menu.filters += filter(type="color", color=list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + )) + menu.filters += filter(type="color", color=list( + HOLOSCREEN_ADDITION_OPACITY, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_OPACITY, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_OPACITY, 0, + 0, 0, 0, 1 + )) + menu.blend_mode = BLEND_ADD + holographic_menu.blend_mode = BLEND_MULTIPLY + AddOverlays(holographic_menu) + AddOverlays(list(menu, icon_state_menu_key)) + var/emissive_menu = emissive_appearance(src.icon, icon_state_menu) + var/emissive_menu_key = emissive_appearance(src.icon, "[icon_state_menu_key]_mask") + AddOverlays(emissive_menu) + AddOverlays(emissive_menu_key) if(!flashlight) set_light(light_range, light_power, l_color = menu_light_color) diff --git a/code/modules/multiz/zmimic/mimic_common.dm b/code/modules/multiz/zmimic/mimic_common.dm index 6f8b417a6ad..e1064f635c8 100644 --- a/code/modules/multiz/zmimic/mimic_common.dm +++ b/code/modules/multiz/zmimic/mimic_common.dm @@ -12,7 +12,3 @@ ..() if (above) update_above() - -/atom/movable/update_icon() - ..() - UPDATE_OO_IF_PRESENT diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index b9d9b5a3d70..bacfd922ff0 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -62,6 +62,9 @@ ///The `/icon` of the mob that has this organ var/icon/mob_icon + ///A list of overlays for the organ + var/list/mutable_appearance/mob_overlays + var/gendered_icon = 0 var/force_icon diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 5de5b51f45d..3ebad07740d 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -101,15 +101,15 @@ return mob_icon /obj/item/organ/external/head/get_additional_images(var/mob/living/carbon/human/H) + ..() if(!H.mind) - return + return mob_overlays var/datum/vampire/vampire = H.mind.antag_datums[MODE_VAMPIRE] if(vampire && (vampire.status & VAMP_FRENZIED)) - var/image/return_image = image(H.species.eyes_icons, H, "[H.species.eyes]_frenzy") - return_image.plane = EFFECTS_ABOVE_LIGHTING_PLANE - return_image.appearance_flags = KEEP_APART - LAZYADD(additional_images, return_image) - return list(return_image) + var/mutable_appearance/return_image = emissive_appearance(H.species.eyes_icons, H, "[H.species.eyes]_frenzy") + mob_overlays += return_image + + return mob_overlays /obj/item/organ/external/proc/apply_markings(restrict_to_robotic = FALSE) if (!cached_markings) @@ -157,8 +157,14 @@ if(owner && owner.gender == MALE) gender = "m" + var/chosen_icon + var/chosen_icon_state + if(force_icon) - mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") + chosen_icon = force_icon + chosen_icon_state = "[icon_name][gendered_icon ? "_[gender]" : ""]" + mob_icon = new /icon(force_icon, chosen_icon_state) + AddOverlays(emissive_blocker(chosen_icon, chosen_icon_state)) if((painted && skin_color) || robotize_type == PROSTHETIC_SYNTHSKIN) mob_icon.Blend(skin_color, ICON_ADD) if(!isnull(s_tone)) @@ -170,8 +176,14 @@ get_internal_organs_overlay() else if(!dna) - mob_icon = new /icon('icons/mob/human_races/human/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") + chosen_icon = 'icons/mob/human_races/human/r_human.dmi' + chosen_icon_state = "[icon_name][gendered_icon ? "_[gender]" : ""]" + mob_icon = new /icon(chosen_icon, chosen_icon_state) + var/mutable_appearance/limb_em_block = emissive_blocker(chosen_icon, chosen_icon_state, MOB_SHADOW_LAYER) + limb_em_block.dir = dir + mob_overlays += list(limb_em_block) else + chosen_icon_state = "[icon_name][gendered_icon ? "_[gender]" : ""]" if(!gendered_icon) gender = null else @@ -181,14 +193,18 @@ gender = "m" if(skeletal) - mob_icon = new /icon(species.skeleton_icon, "[icon_name][gender ? "_[gender]" : ""]") + chosen_icon = species.skeleton_icon + mob_icon = new /icon(chosen_icon, chosen_icon_state) else if (status & ORGAN_ROBOT && !force_skintone) - mob_icon = new /icon('icons/mob/human_races/ipc/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") + chosen_icon = 'icons/mob/human_races/ipc/robotic.dmi' + mob_icon = new /icon(chosen_icon, chosen_icon_state) else if (status & ORGAN_MUTATED) - mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]") + chosen_icon = species.deform else - mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]") + chosen_icon = species.icobase + + mob_icon = new /icon(chosen_icon, chosen_icon_state) if(status & ORGAN_DEAD) mob_icon.ColorTone(rgb(10,50,0)) @@ -211,6 +227,10 @@ apply_markings() get_internal_organs_overlay() + var/mutable_appearance/limb_em_block = emissive_blocker(chosen_icon, chosen_icon_state, MOB_SHADOW_LAYER) + limb_em_block.dir = dir + mob_overlays += list(limb_em_block) + if(body_hair) var/list/limb_icon_cache = SSicon_cache.limb_icons_cache var/cache_key = "[body_hair]-[icon_name]-[hair_color]" @@ -226,7 +246,7 @@ return mob_icon /obj/item/organ/external/proc/get_additional_images(var/mob/living/carbon/human/H) - return + return mob_overlays /obj/item/organ/external/proc/cut_additional_images(var/mob/living/carbon/human/H) if(LAZYLEN(additional_images)) diff --git a/code/modules/overmap/ship_weaponry/_targeting_console.dm b/code/modules/overmap/ship_weaponry/_targeting_console.dm index 387db35a295..c2f2cc8b23a 100644 --- a/code/modules/overmap/ship_weaponry/_targeting_console.dm +++ b/code/modules/overmap/ship_weaponry/_targeting_console.dm @@ -3,6 +3,7 @@ desc = "A targeting systems console using Zavodskoi software." icon_screen = "teleport" icon_keyboard = "teal_key" + icon_keyboard_emis = "teal_key_mask" light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/ship/targeting var/obj/machinery/ship_weapon/cannon @@ -18,6 +19,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "hostile" icon_keyboard = "red_key" + icon_keyboard_emis = "red_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 8755c1de513..3fde0717feb 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -4,6 +4,7 @@ name = "engine control console" icon_screen = "enginecontrol" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/ship/engines var/display_state = "status" @@ -21,6 +22,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "engines" icon_keyboard = "tech_key" + icon_keyboard_emis = "tech_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 864b450de2d..1affe7991a1 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -5,6 +5,7 @@ name = "helm control console" icon_screen = "helm" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN var/autopilot = 0 var/list/known_sectors = list() @@ -29,6 +30,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "helm" icon_keyboard = "security_key" + icon_keyboard_emis = "security_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE @@ -311,6 +313,7 @@ name = "navigation console" icon_screen = "nav" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/ship/navigation @@ -327,6 +330,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "nav" icon_keyboard = "generic_key" + icon_keyboard_emis = "generic_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 5d6675074e4..9d357f217c4 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -2,6 +2,7 @@ name = "sensors console" icon_screen = "sensors" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN extra_view = 4 var/obj/machinery/iff_beacon/identification @@ -40,6 +41,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "teleport" icon_keyboard = "teleport_key" + icon_keyboard_emis = "teleport_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index ec6a5cb04f5..d8133db34b1 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -68,6 +68,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "helm" icon_keyboard = "tech_key" + icon_keyboard_emis = "tech_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e4f79d42f73..8c8a891b1cc 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -578,28 +578,28 @@ status_overlays_lighting.len = 4 status_overlays_environ.len = 4 - status_overlays_lock[1] = make_screen_overlay(icon, "apc-cover-0") // none - status_overlays_lock[2] = make_screen_overlay(icon, "apc-cover-1") // coverlocked/locked - status_overlays_lock[3] = make_screen_overlay(icon, "apc-cover-2") // coverlocked + locked + status_overlays_lock[1] = overlay_image(icon, "apc-cover-0") // none + status_overlays_lock[2] = overlay_image(icon, "apc-cover-1") // coverlocked/locked + status_overlays_lock[3] = overlay_image(icon, "apc-cover-2") // coverlocked + locked - status_overlays_charging[1] = make_screen_overlay(icon, "apc-charge-0") - status_overlays_charging[2] = make_screen_overlay(icon, "apc-charge-1") - status_overlays_charging[3] = make_screen_overlay(icon, "apc-charge-2") + status_overlays_charging[1] = overlay_image(icon, "apc-charge-0") + status_overlays_charging[2] = overlay_image(icon, "apc-charge-1") + status_overlays_charging[3] = overlay_image(icon, "apc-charge-2") - status_overlays_equipment[1] = make_screen_overlay(icon, "apcoequip-0") - status_overlays_equipment[2] = make_screen_overlay(icon, "apcoequip-1") - status_overlays_equipment[3] = make_screen_overlay(icon, "apcoequip-2") - status_overlays_equipment[4] = make_screen_overlay(icon, "apcoequip-3") + status_overlays_equipment[1] = overlay_image(icon, "apcoequip-0") + status_overlays_equipment[2] = overlay_image(icon, "apcoequip-1") + status_overlays_equipment[3] = overlay_image(icon, "apcoequip-2") + status_overlays_equipment[4] = overlay_image(icon, "apcoequip-3") - status_overlays_lighting[1] = make_screen_overlay(icon, "apcolight-0") - status_overlays_lighting[2] = make_screen_overlay(icon, "apcolight-1") - status_overlays_lighting[3] = make_screen_overlay(icon, "apcolight-2") - status_overlays_lighting[4] = make_screen_overlay(icon, "apcolight-3") + status_overlays_lighting[1] = overlay_image(icon, "apcolight-0") + status_overlays_lighting[2] = overlay_image(icon, "apcolight-1") + status_overlays_lighting[3] = overlay_image(icon, "apcolight-2") + status_overlays_lighting[4] = overlay_image(icon, "apcolight-3") - status_overlays_environ[1] = make_screen_overlay(icon, "apcoenv-0") - status_overlays_environ[2] = make_screen_overlay(icon, "apcoenv-1") - status_overlays_environ[3] = make_screen_overlay(icon, "apcoenv-2") - status_overlays_environ[4] = make_screen_overlay(icon, "apcoenv-3") + status_overlays_environ[1] = overlay_image(icon, "apcoenv-0") + status_overlays_environ[2] = overlay_image(icon, "apcoenv-1") + status_overlays_environ[3] = overlay_image(icon, "apcoenv-2") + status_overlays_environ[4] = overlay_image(icon, "apcoenv-3") var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state @@ -636,10 +636,15 @@ if(!(stat & (BROKEN|MAINT)) && update_state & UPDATE_ALLGOOD) AddOverlays(status_overlays_lock[locked+coverlocked+1]) AddOverlays(status_overlays_charging[charging+1]) + AddOverlays(emissive_appearance(icon, "apc-cover-0")) + AddOverlays(emissive_appearance(icon, "apc-charge-0")) if(operating) AddOverlays(status_overlays_equipment[equipment+1]) AddOverlays(status_overlays_lighting[lighting+1]) AddOverlays(status_overlays_environ[environ+1]) + AddOverlays(emissive_appearance(icon, "apcoequip-0")) + AddOverlays(emissive_appearance(icon, "apcolight-0")) + AddOverlays(emissive_appearance(icon, "apcoenv-0")) if(update & 3) if(update_state & UPDATE_BLUESCREEN) diff --git a/code/modules/power/fusion/consoles/_consoles.dm b/code/modules/power/fusion/consoles/_consoles.dm index 264e2f5b94b..e84b6be1c63 100644 --- a/code/modules/power/fusion/consoles/_consoles.dm +++ b/code/modules/power/fusion/consoles/_consoles.dm @@ -1,5 +1,6 @@ /obj/machinery/computer/fusion icon_keyboard = "yellow_key" + icon_keyboard_emis = "yellow_key_mask" icon_screen = "solar" light_color = COLOR_ORANGE idle_power_usage = 250 diff --git a/code/modules/power/fusion/consoles/core_control.dm b/code/modules/power/fusion/consoles/core_control.dm index ece19165011..755f64693bf 100644 --- a/code/modules/power/fusion/consoles/core_control.dm +++ b/code/modules/power/fusion/consoles/core_control.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "solar_screen" icon_keyboard = "id_key" + icon_keyboard_emis = "id_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/power/fusion/consoles/gyrotron_control.dm b/code/modules/power/fusion/consoles/gyrotron_control.dm index 852a4f234d4..d9150d11589 100644 --- a/code/modules/power/fusion/consoles/gyrotron_control.dm +++ b/code/modules/power/fusion/consoles/gyrotron_control.dm @@ -3,6 +3,7 @@ desc = "A terminal for controlling an INDRA Mk.II Tokamak Fusion core using Hephaestus software." icon_keyboard = "yellow_key" icon_screen = "power_monitor" + icon_keyboard_emis = "yellow_key_mask" light_color = COLOR_ORANGE ui_template = "FusionGyrotronControl" @@ -11,6 +12,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "rust_screen" icon_keyboard = "generic_key" + icon_keyboard_emis = "generic_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/power/fusion/consoles/injector_control.dm b/code/modules/power/fusion/consoles/injector_control.dm index 21ed36ef8de..b120a7a3aee 100644 --- a/code/modules/power/fusion/consoles/injector_control.dm +++ b/code/modules/power/fusion/consoles/injector_control.dm @@ -2,6 +2,7 @@ name = "fuel injection control computer" desc = "A terminal responsible for regulating fuel injection using Hephaestus software." icon_keyboard = "yellow_key" + icon_keyboard_emis = "yellow_key_mask" icon_screen = "explosive" ui_template = "FusionInjectorControl" var/global_rate = 100 @@ -11,6 +12,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "power_screen" icon_keyboard = "med_key" + icon_keyboard_emis = "med_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/code/modules/power/lights/fixtures.dm b/code/modules/power/lights/fixtures.dm index 40f9d8e19f7..5d7bea229a8 100644 --- a/code/modules/power/lights/fixtures.dm +++ b/code/modules/power/lights/fixtures.dm @@ -248,11 +248,9 @@ if (on) var/image/I = LIGHT_FIXTURE_CACHE(icon, "[base_state]_on", target_color) - if (!fitting_is_on_floor) - I.plane = EFFECTS_ABOVE_LIGHTING_PLANE - else - I.plane = plane + var/image/E = emissive_appearance(icon, "[base_state]_on") AddOverlays(I) + AddOverlays(E) else AddOverlays(LIGHT_FIXTURE_CACHE(icon, "[base_state]_off", target_color)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index f9f47a23c7a..09fa187ead9 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -66,10 +66,10 @@ wifi_receiver = new(_wifi_id, src) /obj/machinery/power/emitter/update_icon() + ClearOverlays() if(active && powernet && avail(active_power_usage)) - icon_state = "emitter_+a" - else - icon_state = "emitter" + AddOverlays(emissive_appearance(icon, "[icon_state]_lights")) + AddOverlays("[icon_state]_lights") /obj/machinery/power/emitter/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f5a5e07221a..6d30347d76c 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -163,26 +163,43 @@ /obj/machinery/power/smes/update_icon() ClearOverlays() + var/mutable_appearance/oc + var/mutable_appearance/oc_emis + var/mutable_appearance/og + var/mutable_appearance/og_emis + var/mutable_appearance/op + var/mutable_appearance/op_emis if(!can_function()) return - if(inputting == 2) - AddOverlays("[icon_state]-oc2") - else if (inputting == 1) - AddOverlays("[icon_state]-oc1") + if(inputting == (1 || 2)) + oc = overlay_image(icon, "[icon_state]-oc[inputting]") + oc_emis = emissive_appearance(icon, "[icon_state]-oc[inputting]") else if (input_attempt) - AddOverlays("[icon_state]-oc0") + oc = overlay_image(icon, "[icon_state]-oc0") + oc_emis = emissive_appearance(icon, "[icon_state]-oc0") + var/clevel = chargedisplay() if(clevel) - AddOverlays("[icon_state]-og[clevel]") + og = overlay_image(icon, "[icon_state]-og[clevel]") + og_emis = emissive_appearance(icon, "[icon_state]-og[clevel]") - if(outputting == 2) - AddOverlays("[icon_state]-op2") - else if (outputting == 1) - AddOverlays("[icon_state]-op1") + if(outputting == 2 || 1) + op = overlay_image(icon, "[icon_state]-op[outputting]") + op_emis = emissive_appearance(icon, "[icon_state]-op[outputting]") else - AddOverlays("[icon_state]-op0") + op = overlay_image(icon, "[icon_state]-op0") + op_emis = emissive_appearance(icon, "[icon_state]-op0") + + AddOverlays(list( + oc, + oc_emis, + og, + og_emis, + op, + op_emis + )) /obj/machinery/power/smes/proc/chargedisplay() return round(5.5*charge/(capacity ? capacity : 5e6)) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index d1a2a525b2a..34d20ee5a6a 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -537,10 +537,12 @@ if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" - holographic_overlay(src, src.icon, "broken") + var/mutable_appearance/image_overlay = overlay_image(src.icon, "broken") + AddOverlays(image_overlay) AddOverlays("red_key") else - holographic_overlay(src, src.icon, "solar") + var/mutable_appearance/image_overlay = overlay_image(src.icon, "solar") + AddOverlays(image_overlay) AddOverlays("yellow_key") // diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index c9284776fbd..d46c35c2e3a 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -32,6 +32,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, icon_screen = "rdcomp" icon_keyboard = "purple_key" + icon_keyboard_emis = "purple_key_mask" light_color = LIGHT_COLOR_PURPLE circuit = /obj/item/circuitboard/rdconsole diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 6966147db9d..37ba9c2fa12 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -204,6 +204,7 @@ icon_screen = "rdcomp" icon_keyboard = "purple_key" + icon_keyboard_emis = "purple_key_mask" light_color = LIGHT_COLOR_PURPLE circuit = /obj/item/circuitboard/rdservercontrol diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index dce25335dda..b28fce44422 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -2,6 +2,7 @@ name = "shuttle control console" icon_screen = "shuttle" icon_keyboard = "cyan_key" + icon_keyboard_emis = "cyan_key_mask" light_color = LIGHT_COLOR_CYAN var/shuttle_tag // Used to coordinate data in shuttle controller. diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 22fe44ec7c1..47637771afa 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -3,6 +3,7 @@ desc = "Used to create bluespace portals using the telescience telepad." icon_screen = "teleport" icon_keyboard = "lightblue_key" + icon_keyboard_emis = "lightblue_key_mask" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/telesci_console var/sending = 1 diff --git a/html/changelogs/GeneralCamo - Emissives.yml b/html/changelogs/GeneralCamo - Emissives.yml new file mode 100644 index 00000000000..3bf2c8eff09 --- /dev/null +++ b/html/changelogs/GeneralCamo - Emissives.yml @@ -0,0 +1,60 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: GeneralCamo + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added emissives, objects that can alpha mask the lighting plane while being blocked by blockers." + - refactor: "Converted all screen overlays and holographic overlays to the new system." + - rscdel: "Removed bloom." diff --git a/html/changelogs/archive/2020-04.yml b/html/changelogs/archive/2020-04.yml index 62df32a5758..8cc4ba4000e 100644 --- a/html/changelogs/archive/2020-04.yml +++ b/html/changelogs/archive/2020-04.yml @@ -322,7 +322,7 @@ - bugfix: Air alarms and APCs now self-destruct when they detect their area as being within a mine or space area. chada1: - - tweak: Moved the help/harm overlays for 'borgs back to add_overlay. + - tweak: Moved the help/harm overlays for 'borgs back to AddOverlays. - bugfix: Fixed a bug that caused ss_overlays to blank the 'borg eyes if they had another overlay added to them. 2020-04-21: diff --git a/icons/clothing/kit/firefighter.dmi b/icons/clothing/kit/firefighter.dmi index 63e6e1c4105..006b13c5d22 100644 Binary files a/icons/clothing/kit/firefighter.dmi and b/icons/clothing/kit/firefighter.dmi differ diff --git a/icons/clothing/kit/highvis.dmi b/icons/clothing/kit/highvis.dmi index 1ab2a871fea..e384bcee624 100644 Binary files a/icons/clothing/kit/highvis.dmi and b/icons/clothing/kit/highvis.dmi differ diff --git a/icons/mob/clothing/suit/hazardvest.dmi b/icons/mob/clothing/suit/hazardvest.dmi index 6ee9d36eb4e..ded0626bbb1 100644 Binary files a/icons/mob/clothing/suit/hazardvest.dmi and b/icons/mob/clothing/suit/hazardvest.dmi differ diff --git a/icons/obj/emitter.dmi b/icons/obj/emitter.dmi index 70b902a76ff..fcfd440bacf 100644 Binary files a/icons/obj/emitter.dmi and b/icons/obj/emitter.dmi differ diff --git a/icons/obj/machinery/floor_light.dmi b/icons/obj/machinery/floor_light.dmi index 2e7394ce8ce..162badd991d 100644 Binary files a/icons/obj/machinery/floor_light.dmi and b/icons/obj/machinery/floor_light.dmi differ diff --git a/icons/obj/machinery/modular_console.dmi b/icons/obj/machinery/modular_console.dmi index 40279e3ded6..7d885c50e03 100644 Binary files a/icons/obj/machinery/modular_console.dmi and b/icons/obj/machinery/modular_console.dmi differ diff --git a/icons/obj/machinery/modular_terminal.dmi b/icons/obj/machinery/modular_terminal.dmi index e175b62a6f9..8fb790834b9 100644 Binary files a/icons/obj/machinery/modular_terminal.dmi and b/icons/obj/machinery/modular_terminal.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index acf2c7e3673..93fe4e676ed 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dm b/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dm index a0b8fac56bf..a9fae7c32ef 100644 --- a/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dm +++ b/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dm @@ -127,6 +127,7 @@ icon = 'icons/obj/machinery/modular_terminal.dmi' icon_screen = "helm" icon_keyboard = "security_key" + icon_keyboard_emis = "security_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE diff --git a/maps/away/ships/sadar_scout/sadar_scout.dm b/maps/away/ships/sadar_scout/sadar_scout.dm index b40b36ade7d..3e437fe1f3a 100644 --- a/maps/away/ships/sadar_scout/sadar_scout.dm +++ b/maps/away/ships/sadar_scout/sadar_scout.dm @@ -163,6 +163,7 @@ icon_state = "computer" icon_screen = "helm" icon_keyboard = "security_key" + icon_keyboard_emis = "security_key_mask" is_connected = TRUE has_off_keyboards = TRUE can_pass_under = FALSE