From d95734c606035f4040e758b3ad3426b3a5339092 Mon Sep 17 00:00:00 2001 From: Cody Brittain Date: Sun, 12 May 2024 16:51:45 -0400 Subject: [PATCH] Emissives (#18895) A significant amount of influence was taken from https://github.com/Baystation12/Baystation12/pull/33255, however adapted to Aurora. Key things to note is the port of the newer alpha settings from /tg/, among other improvements. The ancient holographic and screen overlay code has been purged. This is now handled with emissives, while holograms are handled with filters as well. --------- Co-authored-by: Cody Brittain --- aurorastation.dme | 3 +- code/__DEFINES/emissives.dm | 28 +++++ code/__DEFINES/layers.dm | 6 + code/__DEFINES/lighting.dm | 4 +- code/__HELPERS/emissives.dm | 35 ++++++ code/__HELPERS/overlay.dm | 58 ---------- code/_onclick/hud/rendering/_renderer.dm | 36 ++++++ code/datums/late_choices.dm | 3 + code/defines/mutable_appearance.dm | 7 +- code/game/atoms_movable.dm | 44 +++++++- code/game/dna/dna_modifier.dm | 1 + code/game/machinery/alarm.dm | 5 +- code/game/machinery/atmo_control.dm | 5 + .../atmoalter/area_atmos_computer.dm | 1 + code/game/machinery/atmoalter/meter.dm | 11 +- code/game/machinery/body_scanner.dm | 4 +- code/game/machinery/computer/Operating.dm | 2 + code/game/machinery/computer/atmos_alert.dm | 1 + code/game/machinery/computer/camera.dm | 5 + code/game/machinery/computer/cloning.dm | 1 + code/game/machinery/computer/computer.dm | 25 ++++- code/game/machinery/computer/law.dm | 2 + code/game/machinery/computer/pod.dm | 1 + code/game/machinery/computer/robot.dm | 1 + code/game/machinery/crusher_piston.dm | 13 ++- code/game/machinery/cryo.dm | 25 ++--- code/game/machinery/floor_light.dm | 4 + code/game/machinery/lightswitch.dm | 5 +- code/game/machinery/newscaster.dm | 105 ++++++++++++++---- code/game/machinery/requests_console.dm | 44 ++++---- code/game/machinery/ringer.dm | 40 ++++--- code/game/machinery/status_display.dm | 5 + code/game/machinery/suit_cycler.dm | 15 ++- .../telecomms/computers/logbrowser.dm | 1 + .../machinery/telecomms/computers/message.dm | 1 + .../telecomms/computers/telemonitor.dm | 1 + .../telecomms/computers/traffic_control.dm | 1 + code/game/machinery/vending.dm | 48 +++----- code/game/machinery/vending_types.dm | 24 ++-- code/game/objects/items.dm | 1 + .../objects/items/devices/radio/intercom.dm | 70 +++++++++--- code/game/objects/items/items_icon.dm | 2 + code/game/objects/items/skrell.dm | 2 +- code/game/objects/structures.dm | 1 + code/game/objects/structures/railing.dm | 10 +- code/modules/client/preferences.dm | 3 +- code/modules/clothing/glasses/glasses.dm | 15 ++- code/modules/clothing/suits/hazardvests.dm | 7 ++ code/modules/clothing/suits/miscellaneous.dm | 14 +++ code/modules/clothing/suits/utility.dm | 14 +++ code/modules/clothing/under/pants.dm | 15 +++ .../modules/heavy_vehicle/components/frame.dm | 13 +-- code/modules/heavy_vehicle/mech_icon.dm | 2 +- code/modules/mob/abstract/abstract.dm | 1 + .../abstract/new_player/preferences_setup.dm | 1 + .../mob/living/carbon/carbon_defines.dm | 1 + .../mob/living/carbon/human/human_defines.dm | 3 + .../silicon/robot/drone/drone_console.dm | 1 + .../simple_animal/hostile/ipc_zombie.dm | 9 +- code/modules/mob/mob_defines.dm | 1 + .../computers/modular_computer/core.dm | 87 ++++++++++++--- code/modules/multiz/zmimic/mimic_common.dm | 4 - code/modules/organs/organ_external.dm | 3 + code/modules/organs/organ_icon.dm | 46 +++++--- .../ship_weaponry/_targeting_console.dm | 2 + .../overmap/ships/computers/engine_control.dm | 2 + code/modules/overmap/ships/computers/helm.dm | 4 + .../overmap/ships/computers/sensors.dm | 2 + .../overmap/ships/computers/shuttle.dm | 1 + code/modules/power/apc.dm | 41 ++++--- .../power/fusion/consoles/_consoles.dm | 1 + .../power/fusion/consoles/core_control.dm | 1 + .../power/fusion/consoles/gyrotron_control.dm | 2 + .../power/fusion/consoles/injector_control.dm | 2 + code/modules/power/lights/fixtures.dm | 6 +- code/modules/power/singularity/emitter.dm | 6 +- code/modules/power/smes.dm | 39 +++++-- code/modules/power/solar.dm | 6 +- code/modules/research/rdconsole.dm | 1 + code/modules/research/server.dm | 1 + code/modules/shuttles/shuttle_console.dm | 1 + code/modules/telesci/telesci_computer.dm | 1 + html/changelogs/GeneralCamo - Emissives.yml | 60 ++++++++++ html/changelogs/archive/2020-04.yml | 2 +- icons/clothing/kit/firefighter.dmi | Bin 3526 -> 10746 bytes icons/clothing/kit/highvis.dmi | Bin 2059 -> 5896 bytes icons/mob/clothing/suit/hazardvest.dmi | Bin 5210 -> 17390 bytes icons/obj/emitter.dmi | Bin 2530 -> 1984 bytes icons/obj/machinery/floor_light.dmi | Bin 47380 -> 47382 bytes icons/obj/machinery/modular_console.dmi | Bin 272553 -> 270585 bytes icons/obj/machinery/modular_terminal.dmi | Bin 65782 -> 66612 bytes icons/obj/vending.dmi | Bin 78535 -> 80599 bytes .../elyra/elyra_corvette/elyra_corvette.dm | 1 + maps/away/ships/sadar_scout/sadar_scout.dm | 1 + 94 files changed, 824 insertions(+), 306 deletions(-) create mode 100644 code/__DEFINES/emissives.dm create mode 100644 code/__HELPERS/emissives.dm delete mode 100644 code/__HELPERS/overlay.dm create mode 100644 html/changelogs/GeneralCamo - Emissives.yml 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 63e6e1c410510438977cdcc570ce8c7359539ade..006b13c5d22cf15b653001fc88effe194fa08acd 100644 GIT binary patch literal 10746 zcmb_?by!qiyY?Pt=oaZ1Qd&R+MOwN$q*G8pLX>8PP)Zsl1(6O3Nu^5!l#W5Vq`Pb8 z+x*`1o$vat^T&D5b)CQV-mCW$_x-H(tO#vQC1L_P0ssJrRg~p*0RRHNLI6A*@L}dr z_!N8$`RW^c%GX|Gd(S|j3j3l_cBv5%U%V?`tHJ)5#tdlGYtzt4`m+Gt$OsMBn+9GPwMlO+ok zI{!9{jTbgO%^B*D|6|GVFo1^YlHAZmJS;eP>`o5KfzK>MprXa-ZeLVkfTYW2!1ZzM zz~E;Rbx9XkT>51w8NF*)w<*pd#!xDX{28y?z|o`oS%-?bw~lJzW;lRy#iZb)LjXWW z$Ip1;_9`yD>xKevzoUJpNbf=iYc6(mNURnX{aHAA-W?rzF7s0|U!7s88#TSV;~zL<;!p#v{Q-fXu9Jr7+D$AEYTQ)!lw-lB8%HU|E1%18hJ2-W><1 zKMnP@M1YD2Ds!s)D=MC7A0JfQ~_(hmJt5TO5p&MlgQ7Klr6RMbm^3z7a( z)N9Mi+my;$(CjrQmTWum^(-ospQ=%|1y<1~I0)Q!4w=+sO2?az1v)n?<(7WnhCevI zTAd>goqEecZX-F`OsdaVk`xnPrWGYO4;gEzJ)W~=XpQ;&JAbQ`_OZGOMSjzL#!DRn zz_C>jSfpNExn4O58jp;_ym)@_vIa3e!EDedY0I_4kd80IfTcQN=UU_`>CHSXO4MUZ zu|Fl`WwjY)>NY-sus)x!t7R){Q}QjO(Wksk-bwu(DE@K?=&>HffCn*U+eP_ zmU9CQv(n>YLVhQ9+-F_$w8RA$6U}G@)eG5X?kBAN^@nkL8a=mI9-QK5A8NfKK3Q?$ zHY_@zp!i+?BZ1FAYHC2D#;~H-VKtew4dq&!bz0*nwfa8rIsNt7T28Dx_yh3G49JAM z)AH)mm)o&Y7c@1|Xym>9;0;Up%?qP#z*u2g1mmmDAkF0UyG4rCvhkBuP0@MAgHN|m z6;bB?+hJbNqe;; zy-~t%Rp-P+UWMzIp}e>0nPrYi_lgh(ddQsvhWjF~lv{I{ll$Hj7e6;^q=Cv@;@uyl z!>-LUj!%080}VLuT%ZcRK4z6&)>Xh^Z#Ds`_{KSiKJ5n$cQ1`l@4D`@!gYxU;LP;U z?_^n&WPZlW%bhs*Cw?ZOf(Ip41Nj!M+^b5s`d&@=sH%+2)hxBZ4`t#QbNbm+U<|=) z{sqxRBD1?%A%AM$pMi}v<~JaJY%3#~)p2Wvf=TWL>pdoWaLyR0>%H5 zu*Yi1gNBP&M;zidCAc$SjUPP7WWWZPMp9-5OWR^lov*Vx4u}A9ST=v8Ex?Bw^zY~8 ze;ZehOpqp6sG$jA#&gk;z#hC5Ve!uxnH96xgNOeV4&_+ju;M*7ZTF=O zXAWOOG61qPG#&uV+Uh5SEHsD(SB4Dd?SE6)ZivGgaJDuWwi{84zpZ_Jk8Hg|DOsw~ z}&V0fNO3OB#lQynTnQ-k1`aQJr#^{!ic zYOOoqbcU_ymT=mDkNaG}>5acx{jgO=U+eRkm0sWHqSKMYW(NOnILs)L=@_$|I6xp2 zaKXya!#8O)M+-<@tl3U`%}JhNFo!~0bEc7huSAB0YN7+pzIj4i8!Lk|WN^8dAV0&t zc?5Wio-S&XNJ(HFEkI!F9Zuz%^o69P-p|Fy!&cW}%M;(JWDLf-A8sBl(!s{#$JcZ) z;7p6Xd4z>7&eyXw06-1s+?`tSSok%o3u0Mz-Bt>3@?GY9ElZ8Q951qjnjmeq^fyt5 zZ`?AOhE)VEC3E~hRHllG3D~NFB38YnT^S$RHTOR2E z59WBnlDfFK*z{jrWl^Aus>p4Saj@5ogPutb!CQk8^nSgjGRsv~`Z?Oqr=UU2WH zWeDz%r#7tuJQcO4j35AX3cGo2E zaj6heoEAXls;pGv6po2WY8k!T_*$Jz(SLuDey{JW;npGxm*FWqC+(ee?6%ce zi4hPOru&XvH@J03KWUS~X#8%h=&N#bZzfBB0LMqny#1pn4dOnxM!@n!5H^cm!mo#i zmqm{KmN_csuqiE-dm+(R%QqrXz8phM$Ww!Bi6$<;$P#u4x*@%>N>z|Ue~cMf%7Wsn z^f}DqB;Q(BdWoj%VflD0!u-mSE-mfKoQ`;dG1QLj?s!Ml;oHb>74Z=9yONUTLym%5 z$wA9;w^J$?%rRT*9b-mOO&0BzbqgrVy0+=H?n+vO5|*)>pqr4c(fVCkg!4Ihhi)AYFoGg2j={Gr3@_u=_ZD@ z_fG26Wq(~t|4@B@@(d<(goi3YIj>3Hn4iO{?|PjCUjA4jSyM>dFRAo?kdAO*7c>Vz zcEh4^t2ph)$pUgDgw=GWQ}TrraP>~dnVzO*I{9J0lK(r@Mp`_h@%0%b-JwB-=B@d}1)hc(b8DFX6! zkEOhbGy5`+MM4|Du^rF0T#c>%n)+JtkLc=W#`f{Qhgb7dbOlaQD-64yZ%B&_K4$)G zN-p7L@F;mDx_YgE15fOCB|SEFiN**+11LhD)<6q?6WzBUrzdUmx8Lu6QEK+VA?+_J z`fHOyVR5nH%o&6ZLN)_C`ALX8LJ=cx4-P;2T1F)q9Or@Fp0il8$zlM8T;i1aS5iML zV>aJN;E65tvq3KJO#8r;n#ZN^Xz?#WLA{XmLS#E1xmZHa=m0P@d-UscG!j8ddsI~I z(t)$RO{y_RjKo&3W$*r}J4y@|^YMy^0l|YA^GJ5N%)8MJid)*;bHQ~*=6*7=GQrx) z4iJ@0h+5tVyk>+Qq}w5UKAFiO0&%KBb@lsln;A)yPlQ7|<*SZ-J>5#>oB4%?_?l#k zU};!np;(WxxganY&!l_fmhjZCGOCkj9LykT-_-qke69Zl_O6;NPd9jkW1VAEg-ntd zj43`)1lX+m0rFuLZtj7tS}%4e(#k?UjKnuZqKAEC^=3}N+B_J*B zO20rB;USsOpdCIbtm4h?l|Ao-RuMdH(cBZku>Y((y?+_WC3;Br9votZolJ zY%^*9ITE>s3>FyzD))t7C7~M62mjy~HC0wOlONZ@HyVA#f)*ETg0AJin#C^Pz0DA_ zpbQ_Qri!9Ggl9xQ(|c-#4ym%PG>(@l769wOEr$1`kqEXU*Ryu0kcCwX^(AxuV-PSt z+~UCUFTmzaUP%oOyDTb_t3bGNznI&_vO%7zA!iw!cc&}}Lc%9?(hnz;*W*`mkXFPG_^pdlS0W1y48}l|A4#BSs(EKJ{A7uc zDUipd)MRpZV}BtdIXSu?Z|C~SlN8&*?`A@Nckm4qUZb3$&{}bZj)g;?1ves6)Qc)& zd4qUHu=d$7iT9Mz^=)LHqJ?W;s->fPPp$??U`9aGTD&xIsmVl zUrvZy1gN1KA&yvthji=V76=PcXVnP_UdD|0z?ifc^P9-Rj&uSVwqUH*mixDvMQ0;@ zq?1^y9=OSgR=DO;#0tE&a@iGUw||Bvjha)YcsvU5L)Np5+>9f{ zdqOFWOkx-22`deCx$@49rVS=9fOm~78AbT6@M}WIYI=R_6{hZ&J|0$Zhz?jeGdT16 zLvZwwtM%|)M}KEFI%z}TehvL}h1`r)BbH8Ev~kZjwn_1@uU&oI^1h=BF3w1bFOu8S zq^`kvqXg;vB&|(A%zS+GDHb4+8NYYl2++;HHfUWvtX|B5-az(l*&5LG_Hh# z+h5zZq?vk_Z9H|ONkI@z1iL4!!6oc9-e*J>>NVeg3Dhxv!VER#H#C=1r-)vRQ`faN zVro-xl(dfS+3pl7T~z^D@up zEn|>W%1I*$thj*|s2+3Oi&K3>NRsU9yaIg)S?eC{CW z8iuTh$;jy8n{S$A*|1z~Lp&K?Vwtq|zxuPfJu2mNrK+<9+{9NXtn~alEu(8`0_L)Z zc{pa@{mFs3(Vqt0JmmCKgqa(zgPc1XAHLY^4kWM)>smeL&HRn%sAk<&2|8{*IeLfe zc9+UBx|n-Pj~ClTP*;N0Dz<)Tk|ei-fAy1$2baQ(Wp*=vod-0Ks}od!R1^V zR8inCU%eZ7CmM58Sh`=HIuyRNiw=j<^RdKARA!c5Qv<`A)0rkQi2g^+V34w(KJ}sv{B`$*>8^0mz#reeX77DG ztHqfxx#hl)@$lB!Zwp6P2rZWIg#mkAUP_g#o> zE;~c*8+kiVBHAKcopOIzPOZgyFS+hw9P3>5joAptfR#(18*i=CF>?St@>7LdV#M|D zlOhg2>o`&`rdxMn-~#LK5zTdU0e)H0j`Q0$+lnU?T?VoWS@5pa1~1#*88)_)HG$E{ z2JOqwU4csW5uqBAeXW@#&>$_yvcNJ-;EJ1XI`_P(-m&Li+f#ZjeiC00@gthJI%@?i zzZ<`wsmN{17c-%TL9Xr(iQCBkAuy9I2{@z`2yFiujv{Fu@@@&5nAxHy_Oa~;9kJr= z3k}s55f^omF}Mv>QSNv?8P+pN<#AHQ<<&Dq2N~AU!17|)m$c=p&zNj0tZ)yJ(Va3O zEl&i>R{DqKc%v;rjYjNO?3T>|MWAhJG(&hR0~rzVRIp3G$?AD&TiQBo$N+~l+^CvA z0Yy>vX(HBQ{Q(k**~Z_*7`e}*gv;;uc7(_J_6)>;5B^Aw$8nsTR#P?l z3fqMY$g{ggAaF;9|32w$>jerCl)?;;bno0V`F^mo_mS-hPClihX8PdMtd_4dWs-@o z8cmt~+cKFxp(3vf4waF@R>Pgo2|iI7l0Z7DwJY?&k}CuQ8!7q+qzQoM+dpM==M->cWjI?&?K<#> zq~H(_#1X*)4dj#oB(^}4Lg+{To~Wqu^Dlp^@hc{AB6&)yYHe2-{Y2^};;FJfWUZH- zu=(tiwU(I0sOe#UvJbZm1o?C^t{Z#TA#3v;38M^GfJbZr36qw2tGjdh_{CaV^@nyIca>^ExJiCf$t6v@*e%41oPoFou||e3lZ^({XqtkFs0BIkuO$>`x+F<` z`BMJN(JIbDpOI$!qyzngOvci%e$eE-0u7nT?~m#S%KTQAre0q zfC2@m_H0#iK^44?^?DSm+`aG3)7sk+hs*r2pRK~Uw0MNI#C|BjK6qdi`{lcX(ZN!6 zU&;5(pGp4$IHwPSx*)ydl#5>QeAVtN7gd8+sn?CSa0eG|w@#s$MbPc-8h1o7#MtQ} zRZGE#xlR!St1G^NA{D#6rniFyMZ2{K_l&4)H7(#0*XLi>CMMol#$JhB9E&Wi54d(^ zG)jTBOJ~nsRqcQ}dHR;}3EKs;a7U!{FNE??Dn<~)B8wK|w~pp_l84{;aSI2|3!^vp z4?x(A?4uS7VUyBm+HTKMFvG zgpn-PL|C$3&IUdVG-(}~O7d!qG{ovX?t!@13n2KovZxBjI7z7u@2CxHgYhi~F1tX% zI77K~*jcWfabiN=E}{`l1EA-U1x3|begfJ-TYi@dsA|Xcriu-$h6uD;LryvwL@UZLHt;eqf2!+ zm;y5EGa)jv)Lkta>e^0;{nY*8S}R;KFN>|~v1+J+EA;j4g&6sxh8tc~5$W4j__`1M z^7);Iy|E81n*m9?@k4NfVOAsFiVwumwR8wEXs(hQtm<zU<*vD1GM9#D`H`#n0CUv_-Jyv$dE=HuL@8{QCA9z~fS5k4LxyT&Aa#r}sST z@>=6-=Pbln?TvQtRgepsJ|D1BJMN$jD5it#4RVr(X_rrL2w@F25QPfGcef+Ux<2Yh z178)7AY}D-Z-}cb3h}tDdI*;^ygS5e=H02(xl*UI@D{!i`;^246PdiA$&b|A4ltAW z)7-(-jl!uVqc2)acYm#487aIn{=Q}&^sGjB%GarzLcX5M1K>T#{D-wP{d^jJzr)@A zE@l($Zgk#5rE$bU{t~NnU$~*6SL;Ajg=|_|0{g5ya)abmx9O>YSB-k{pzYc2$=Sk* z{Ony>$LL~aW;Xr&EH~X-VNtUuA$@LF)ySmOETz%F?feKVze7U7@#Bf9KsQ=nkL!}x zKu!7`g2~epr$ll`(0s|i;ql4ZxG5%mef5UC0Y6x{TJhi#>avNn4~ghJEx3p+yD(Y- zQYLyb(nHeGlW#gZ(T>j_MVF)5%zNeA4_O5-+t%YJvBN_-KNv|>5d!Nu7mMSoIPSky zJHL_#ocHzs4F_NMoMHNyAtOvN6ZC8EsS#BNLX-qSGfCK2+~02bgfE}n#OP;$(69Xw zEbTxDo-doK%bg@QtIP?GssUXgbH76=)X0~VS4*@nP8?>uap+rATIVN;&vxKnxIY;` z8CE*(iqW9JwunYgI8EPZX@DP)mej$B??$9FQatm8-d-+F8~ zIV(M%K{wG-%nclhf_P*#w)0^@E6VDrTAFhv43$jIeOXF`OhE>%L&5!N>#d}H=g?nE z9X=M-GhfX!nW75?2m=yi6K3uX3j~+8VkfyFQVIa@P&ao09N~_BLHtxsNHe;D zP%g-@Gruf+mPg&=s2R+a<9;qjclc7v^o7C}KGj{v^tNB#N#bN3+VuM;A3vw_#Mk6H zYz4pz4kyvahTsQ>-~IRVTK~hAI`3~MW!FhH+(5!$;_-qX>t*vpR6g3ZWqX4B@}IdY+A`DbxV$tn`0O?{UO^v3cM{;PopQJ* zQD4H7=W;T7-`TiD)JD^4jvDukPL6P%)8PBv^5?KtU&fbzLczQVK8=~hPxDlRGHv=T zBr34!XrXF%JIvIydh=|vqfS-7>T7P!O}rcG_!{eG#tC8?Jiq63Uw7zuXAlZmN%P+! z&`KY*?A8%{!ONZEUQv?p?bYqj<>)zcgNOsDJ%G$88rf6c(JS7S26YAI@3i2}obEHo zAgiWw%+`~2G`Mz~{*J>6>uZx8`-cXWVPG%ajzrg0V*2Z!+XFt{On}vL1rcgQSbq)? z$q1(UqU6)1{Iz6fFF(M!LL^@mdSZI$*~%?aCX-2@;hUrZuE$6%WJ*R(-al&G!Pc??X>#XFi={Oh}yG9XRRM zmXS@mT9ka#ev?Zo{XiRzUUwN6{hT7f(SE$xHu*BNv=pIOsQ8m^4phx;%4^)ZORX2u zG_xmD4VaxQDUta!Q0`RaEf;Bv7ed{!@GAQg-RbZn3Utpw$*gUH2Ik@|@mQF%!^K|XHq=I79^C7Sa6cIi z1H;*Q81s6^%N0`r%_IQy(sv&MR+W#WWY!b}iDn1d*3lzqwB8D!47W&?l86;M`?2D4 zM5BnP$CJmkr1Du{0`}4KD>%rU-GyM=tucUvkL0BeT8v-MRh zQ~&lruWB;IK(k#7i~tW@Ns+?3iCCG2{ya)he&Fo^gp9G>u)fFddY)WnPpZ};a}7O+ zht%$Td+d})ttDD&8Ksdfs(SgfKjV!U=|JLNjQl_l1CSlAcl^o?G_|FRR+_BA_vH4 z=sf`W0{;qodd;y37Ke@dcJ>Yn^VuN)QXtk62HeEBPbQ!IOnpQQn&DpC2Nz$eWNnBB z1WzGp=TZx>`AbVh7}qhZTe%dT2@wMx3yEJ7Bb`$OR`mlIUo(}(eOSFE3H1O%S;46K zF7(V-p08Oke8Sz-Lf+bGG$IoMW>Pf4V+Ol}^Tuq;uJ`0#XbFEQ*U>xd5sDxRMY=zH zoAYdJr&ipqeEF6np)WO3n@CNClIJk4%O-lm({6|WoRjjP(es_-fCA0$I4HCJ$VZDX zj_){N5<*b$HjEt)Do283CL;Rh+qxWPXY!1QZM|yKMY^8Id?<{Rx)^c2g`1qsdkp^o z#T$2wl~-LmaTdNzuXA3x`Zg*g@;d+Tg5q>kL)QuGe zdw?Bt7alUJMmV_`J>ncg)RiMd3e&IzW6P6oW^*bhEypRwWa?m^+XxmjATuwHkm!po zkkqRGQ$id5fbZG}ZjRSuf~IXReX7|9EMqO`6LFrXKNkg|H|Hj6udF}~F9Ue(t)SZf zKQ;ev6ozt;k~kKSN5`<9(-GkkiV?|J`t&-2`Kp7Xo++Qz8{u?Z4kDyN|K;V!76?j3dbyOy5uWjl}6 znv?weqDMdMj*gDZ;L1Uc`e$S$1O>z-CFDyJ-3za?DJq{u8XBE~il@1$irHNj(?aTH zhn-eXc5?DOuc?2_-ZUzf=;iI#@a{crdKu@mi8;=hDa6L&5&$tfa{bu(a0h!e#PC|M zN04_wh_}BV01*C+oNCU~2IGwz4&eN<@(4cOc+S^M=r?EV2vVii+?Bd?aWqb@P$^Us z^JmjCQlWL^YE~S?W*#Pgpe-!!U~Fq zI`-SavR@L|I&@$&i{?3TUn>Ok9wP!D$vFEgsT;A*&x|#8b6t1n%uuL5f3IEaHH|&P zsGfCHJPQDD9hev*vEk2_ z9l^Gv_53vmNsU?*KYL9Wbo3^_XnuFe+erEmp;qm6>Th+?#CVk;t;RH}>g(%9(%v#o zFLLMBPK|t+0jee8#OKBkw<=t~9XQ(y7Q^|e9#PJDzoRzs{l)md@!)!it;&NaOOdiv z6pPC)lDc{V7*3I3Jp_udcrbKglgnV79NJSg&s39~0%#DF3d)BWG>TXZ{)oDCylpK8 zW{a7>PvyPOXKYyDD2{eJ2`&`YCj-}Z@{uQRq9}rH>S7)1edcCo08?$4NYfd4fOHj4 zLv*&5I8lnF4XMVs6T6Nn%g^m>1cfkMbs)?yWk^B^@kLtP%;Nl#Dub0Eu6U|}rlj=N z8>?zp%wyy{9M3x*ixmRPb+Y1y%L8s0 zQ#78igC`?0qa;7tb=cD=>z*4aN|uI)bGaCn2) z=wZ7$S1|VjgFShDufaE`EL8CqhQDdd7e)1mJ#%|6;iD8X)N(nxe?*gQ;3Q$S$8nrZ zCqdCVFDtGeT7`E@U;98i(!W;6)Y{a%vr;MG&zz$P`?izOd50)N_%XkIK-F%bX<|0U z4O#7&)KKz6h>|%QsG<73zu+q2meorwPwj;9PN3{mUiZ{(Aa7!@D81G3{J=7gSE|(A{|7tAbiz2XXd6@@%+hFgQYPIC)o0YK{vp_N0T{dBok5AV0wOlB;V! zz}}*D%UepnXUl0rS|$jZ*w3)*D+VJ>2CFkCBtw;=PF7;AM9?fEY#oECFxlS&qn3 z^ljDNA9DRYuY1YIkGS--#^|a%f$cGRUM%Ixt0n7d@j-SD8ydGPJymcgwTS#;$hF}~ zOVH0c%5}98-dg59ED#}*h!jQ_cqUzeKm=HoTj9V% z)DQsFP|U;wR+kmUT$~&RQ>T%84%`o=kpLE7{UlwjjH#Qj7^J*NaT_8-mNP?ong_um zHvNSS5ix+04N^*^b)AcrPfz(-=q4^P7rf}(v`1gJt}ZqlVTE}cz;j-nx-J1t5r=uVebMJe6wAy??>|Ad6=bf+x7+VtQrb#3|ZQz0VniZo0x@)ZG zG-^u~6ik>+O*;M09W=xSs@#^s6tE2`j%Z+CZohWL$X@<8N4*0~VYnN|(Ek-GQiO@j z5d%DTX0QQ1u9}?L$JA2hCKSN&K8F?!KR4FL!#D0)_KHU@mzpJD+fdNb8rwJDULIO8 zAGk2q_5Ymc3!J?C&Yu7I2%fxV3ndh0U4FBV;;?3JCTjx#3(y$|BrVi!3f2lVHU^ng z)R**lpICALp1u#qel?4vT8a~+SYH37Jbih}RW@C-quUoT#n!2;lYf>+{>b5t)pr1d zMuB4|Q46k@+~tU-(_eQySSc4TyljX(Tgc`Xo;HANOJ5XN^&zg~R55`wR}&%R81qCs zSqJYsq4#cT3rt!fh$=}QQE{ftR6UxipnIpeLq^+ez4T|LbcH0vJR#2MrMH%?Qc8Kb zd8Vpt53uS0sB~|jch+e`xqkjM`z>DPt&OQTp3m-*jq}mB09A0M9;pM#^rJ4~>sYCB z;W`d>t9|;`GaJcrmNNDUX3M87N6|!ACiB>M3zAr*_U%?7o5%Un^*kVn{1j}nu;r_j z#=%ZI#u3bps9ayz0Nil22UxP$_7IMoZ1{}6DI~9?!+}82D#r?WMyHy9O|JO^0UgQo zqRkiXrhefL#-#ihMIZjyb26W>Ws-8W?>VYd+FGwU%}T#~Drx>SvoS-ikSm!li>M}G z|G4S7_iIOMo(j@hl}|em2TqC9O~Z7LCxkr%KKD`^3lf?Z9_SA2cS%UKwt2iIdd3)> zq{n1UvpBab@EKMcq^GOJZguF`m&zvSP8J0gcX;>&9Nt z_a^pJuuoruKtg-{!?yI)vpS2e$?U`uOhQqNNJ*yMHY~4PaA9(LZlAD}SIOnj69MJd zTfXO*#b+!kkg%w#>diD-v%N2{f1|moMtBg`8m#%N5X<`N!Q`uFW38T_ixcB&zE-e# zJNE^R3-@{neDG7shVGTW;F-KFBY8X3Jh9rWY#Ec>>W97+e`QF+Q&gRm!sLj zAliebmg-@mwR=sq+oQ9q--rCODK{M`p@$W|jAL-<|6txRcm&!Av)T6|Pp#Sy9VOGD z3;8LOn|74DhbvQCC)h^*1k=EW6=+88KhZq@k@46GMiaOV@fcXEus2kNZ$Ahd9mi8> zp9TGXH;wyMR=K{pq<{A0ulc#qee+eCujWDNT)qBoxOE~_!~_EPB$)U07fX^Rxi^h@ep*G@WNL14@wNcH#aX=6PvIIP%vNzwlpr2 zW`zn8^V0{m6}L~(C^+rg$Y>f0bX(WP`DTZyMi4$QCRA}3{RqE#5Y}xIf(*t#Ay$!G zuuH=mVLBtt5@iFGGpiw0ci~p01oAsV-8XqP@8LbP65+V_6X%*fon72*>VT8u$7hAU z(xGNwK%j2y_fWib98`vi5{jz~8~WnLUgr~O4$>UGpd1obKQiwB6qmC3o{bcB(0Auu zhlI;O>vBbdMExip4RU+c?7IT;``WY;jAj}=9|-6D?UB=bYTfx{cdf~ZQ9qZ%@UukE zZ@;>9ad0ZPR{)&K`$uul{Zaq8;}nS-#7{IxNI<~6#xaNcd#SFMR#QP!B@EZ%m*`HT z`^VhOcd70Zt>*7zVmDlS7)+5Uo73#4b-#tS2@8k2Y99R0d gDgIMcp79ofn;+SD0Vy?eJl6nB&=!Uj2CmWn1Cnu~%K!iX diff --git a/icons/clothing/kit/highvis.dmi b/icons/clothing/kit/highvis.dmi index 1ab2a871fea88ee7c3410d86594e5d3e10464baf..e384bcee624546aa583f896d37270307de3b4f37 100644 GIT binary patch literal 5896 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 diff --git a/icons/mob/clothing/suit/hazardvest.dmi b/icons/mob/clothing/suit/hazardvest.dmi index 6ee9d36eb4e96e300fc7e84fe97309074f74446c..ded0626bbb1a42ae81fe4a9971d701d1d2b08574 100644 GIT binary patch literal 17390 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 diff --git a/icons/obj/emitter.dmi b/icons/obj/emitter.dmi index 70b902a76ffa50321c3e85013bf5ff86d88011e6..fcfd440bacf867a2c158e0bf6bd0130e64b5cb68 100644 GIT binary patch delta 1903 zcmV-#2ax#U6TlCUBYy$8P)t-sz`(%%2Lm}PDoHsxSXfwBS64ebJA8b6HYX=jQ&V(w zbho#+R8&+tIyy2kGIMitxVX3+92`YOMK&lWN=izvudiz(DH|IbMn*W~r zuCA{A1_DDvLuzYlTU%R@kdVH4nkmzQ8;WNK<^jEahUe12hMWqW*nX=!PU ziHK`!YkYlwi-?DOeST_eYmAA9YHe®&wOiYh88S65kPC( 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 if1ELgZqSC9P^dh|zl-`RJ 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

HB%uTSw4EdSLYVl6+sesAu}T2*-1wd=T0=3o1v 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