From cf7359e03ee349d073b16dd50dcd00ac4873e0fc Mon Sep 17 00:00:00 2001 From: Lohikar Date: Fri, 30 Jun 2017 05:09:41 -0500 Subject: [PATCH] Atmos icon tweaks (#2874) changes: Airlock vents now use icon_states instead of atmos icon manager overlays. Omni vents now use SSoverlay caching instead of atmos icon manager caching. Added missing icon_states from #2812. --- .../components/binary_devices/dp_vent_pump.dm | 12 ++- .../components/omni_devices/filter.dm | 1 + .../components/omni_devices/mixer.dm | 1 + .../components/omni_devices/omni_base.dm | 74 +++++++----------- icons/atmos/pipes.dmi | Bin 3657 -> 14454 bytes 5 files changed, 34 insertions(+), 54 deletions(-) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index eeb43f830ba..8536539c9ed 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -59,23 +59,21 @@ if(!check_icon_cache()) return - overlays.Cut() - - var/vent_icon = "vent" + var/istate = "" var/turf/T = get_turf(src) if(!istype(T)) return if(!T.is_plating() && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) - vent_icon += "h" + istate += "h" if(!powered()) - vent_icon += "off" + istate += "off" else - vent_icon += "[use_power ? "[pump_direction ? "out" : "in"]" : "off"]" + istate += "[use_power ? "[pump_direction ? "out" : "in"]" : "off"]" - overlays += icon_manager.get_atmos_icon("device", , , vent_icon) + icon_state = istate /obj/machinery/atmospherics/binary/dp_vent_pump/update_underlays() if(..()) diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index 8e68e0756a1..ca0c7576918 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -4,6 +4,7 @@ /obj/machinery/atmospherics/omni/filter name = "omni gas filter" icon_state = "map_filter" + base_icon = "filter" var/list/filters = new() var/datum/omni_port/input diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm index 144a5d24b4e..6a3be47e8bd 100644 --- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm @@ -4,6 +4,7 @@ /obj/machinery/atmospherics/omni/mixer name = "omni gas mixer" icon_state = "map_mixer" + base_icon = "mixer" use_power = 1 idle_power_usage = 150 //internal circuitry, friction losses and stuff diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index d60dc32d023..8c845271d50 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -12,14 +12,16 @@ var/configuring = 0 //var/target_pressure = ONE_ATMOSPHERE //a base type as abstract as this should NOT be making these kinds of assumptions + var/base_icon + var/tag_north = ATM_NONE var/tag_south = ATM_NONE var/tag_east = ATM_NONE var/tag_west = ATM_NONE - var/overlays_on[5] - var/overlays_off[5] - var/overlays_error[2] + var/list/on_states = list() + var/list/off_states = list() + var/underlays_current[4] var/list/ports = new() @@ -44,20 +46,23 @@ initialize_directions |= d ports += new_port - build_icons() - /obj/machinery/atmospherics/omni/update_icon() + cut_overlays() + var/list/to_add = list(base_icon) if(stat & NOPOWER) - overlays = overlays_off + to_add += off_states else if(error_check()) - overlays = overlays_error + to_add += "error" + else if (use_power) + to_add[1] = "[base_icon]_glow" + to_add += on_states else - overlays = use_power ? (overlays_on) : (overlays_off) + to_add += off_states + + add_overlay(to_add) underlays = underlays_current - return - /obj/machinery/atmospherics/omni/proc/error_check() return @@ -108,29 +113,12 @@ ui_interact(user) return -/obj/machinery/atmospherics/omni/proc/build_icons() - if(!check_icon_cache()) - return - - var/core_icon = null - if(istype(src, /obj/machinery/atmospherics/omni/mixer)) - core_icon = "mixer" - else if(istype(src, /obj/machinery/atmospherics/omni/filter)) - core_icon = "filter" - else - return - - //directional icons are layers 1-4, with the core icon on layer 5 - if(core_icon) - overlays_off[5] = icon_manager.get_atmos_icon("omni", , , core_icon) - overlays_on[5] = icon_manager.get_atmos_icon("omni", , , core_icon + "_glow") - - overlays_error[1] = icon_manager.get_atmos_icon("omni", , , core_icon) - overlays_error[2] = icon_manager.get_atmos_icon("omni", , , "error") - /obj/machinery/atmospherics/omni/proc/update_port_icons() if(!check_icon_cache()) return + + on_states.Cut() + off_states.Cut() for(var/datum/omni_port/P in ports) if(P.update) @@ -148,22 +136,19 @@ if(!ref_layer) continue - var/list/port_icons = select_port_icons(P) - if(port_icons) + var/list/underlay_icon = select_port_icons(P) + if(underlay_icon) if(P.node) - underlays_current[ref_layer] = port_icons["pipe_icon"] + underlays_current[ref_layer] = underlay_icon else underlays_current[ref_layer] = null - overlays_off[ref_layer] = port_icons["off_icon"] - overlays_on[ref_layer] = port_icons["on_icon"] else underlays_current[ref_layer] = null - overlays_off[ref_layer] = null - overlays_on[ref_layer] = null update_icon() -/obj/machinery/atmospherics/omni/proc/select_port_icons(var/datum/omni_port/P) +// Assumes on_states and off_states have been cut if required. +/obj/machinery/atmospherics/omni/proc/select_port_icons(datum/omni_port/P) if(!istype(P)) return @@ -182,21 +167,16 @@ ic_on += "_filter" ic_off += "_out" - ic_on = icon_manager.get_atmos_icon("omni", , , ic_on) - ic_off = icon_manager.get_atmos_icon("omni", , , ic_off) + on_states += ic_on + off_states += ic_off - var/pipe_state var/turf/T = get_turf(src) if(!istype(T)) return if(!T.is_plating() && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) - //pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) - pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") + . = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") else - //pipe_state = icon_manager.get_atmos_icon("underlay_intact", P.dir, color_cache_name(P.node)) - pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "intact") - - return list("on_icon" = ic_on, "off_icon" = ic_off, "pipe_icon" = pipe_state) + . = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "intact") /obj/machinery/atmospherics/omni/update_underlays() for(var/datum/omni_port/P in ports) diff --git a/icons/atmos/pipes.dmi b/icons/atmos/pipes.dmi index 6bd0b15f618d614aee81dd2187f761c3b8db011f..1ef58ff1b37f8543663f59c588f7a0e75cb86dcc 100644 GIT binary patch literal 14454 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 J1@h+p{}0-BAEy8S literal 3657 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