From 45630da55efad7ae44fc9cdfbecde81f581c1ad7 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Mon, 3 May 2021 08:15:14 -0400 Subject: [PATCH] Adds canister windows (#58826) --- code/__DEFINES/atmospherics.dm | 12 +++++++ .../json_configs/canister_default.json | 8 +++++ .../json_configs/canister_double_stripe.json | 8 +++++ .../json_configs/canister_hazard.json | 8 +++++ .../json_configs/canister_stripe.json | 8 +++++ .../environmental/LINDA_turf_tile.dm | 13 ++------ .../atmospherics/gasmixtures/gas_mixture.dm | 6 ++++ .../machinery/portable/canister.dm | 30 +++++++++++++++++- icons/obj/atmospherics/canisters.dmi | Bin 3053 -> 3129 bytes 9 files changed, 81 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index fc7255140bf..cab223597eb 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -535,6 +535,18 @@ out_var += cached_gases[total_moles_id][MOLES];\ } +GLOBAL_LIST_INIT(nonoverlaying_gases, typecache_of_gases_with_no_overlays()) +#define GAS_OVERLAYS(gases, out_var)\ + out_var = list();\ + for(var/_ID in gases){\ + if(GLOB.nonoverlaying_gases[_ID]) continue;\ + var/_GAS = gases[_ID];\ + var/_GAS_META = _GAS[GAS_META];\ + if(_GAS[MOLES] <= _GAS_META[META_GAS_MOLES_VISIBLE]) continue;\ + var/_GAS_OVERLAY = _GAS_META[META_GAS_OVERLAY];\ + out_var += _GAS_OVERLAY[min(TOTAL_VISIBLE_STATES, CEILING(_GAS[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))];\ + } + #ifdef TESTING GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) #define CALCULATE_ADJACENT_TURFS(T, state) if (SSadjacent_air.queue[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSadjacent_air.queue[T] = state} diff --git a/code/datums/greyscale/json_configs/canister_default.json b/code/datums/greyscale/json_configs/canister_default.json index 7ce97efcc57..b965e9ec3fd 100644 --- a/code/datums/greyscale/json_configs/canister_default.json +++ b/code/datums/greyscale/json_configs/canister_default.json @@ -12,5 +12,13 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] } diff --git a/code/datums/greyscale/json_configs/canister_double_stripe.json b/code/datums/greyscale/json_configs/canister_double_stripe.json index 914f7102719..33dd115d3ea 100644 --- a/code/datums/greyscale/json_configs/canister_double_stripe.json +++ b/code/datums/greyscale/json_configs/canister_double_stripe.json @@ -25,5 +25,13 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] } diff --git a/code/datums/greyscale/json_configs/canister_hazard.json b/code/datums/greyscale/json_configs/canister_hazard.json index 5bd07b49d4c..81c19362231 100644 --- a/code/datums/greyscale/json_configs/canister_hazard.json +++ b/code/datums/greyscale/json_configs/canister_hazard.json @@ -18,5 +18,13 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] } diff --git a/code/datums/greyscale/json_configs/canister_stripe.json b/code/datums/greyscale/json_configs/canister_stripe.json index 0fe05bf9112..9e5f087c0ae 100644 --- a/code/datums/greyscale/json_configs/canister_stripe.json +++ b/code/datums/greyscale/json_configs/canister_stripe.json @@ -18,5 +18,13 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] } diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 30d0ba1dcd7..9462696466c 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -139,10 +139,7 @@ /turf/open/proc/update_visuals() - var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance - var/list/new_overlay_types = list() - var/static/list/nonoverlaying_gases = typecache_of_gases_with_no_overlays() if(!air) // 2019-05-14: was not able to get this path to fire in testing. Consider removing/looking at callers -Naksu if (atmos_overlay_types) @@ -153,14 +150,8 @@ var/list/gases = air.gases - for(var/id in gases) - if (nonoverlaying_gases[id]) - continue - var/gas = gases[id] - var/gas_meta = gas[GAS_META] - var/gas_overlay = gas_meta[META_GAS_OVERLAY] - if(gas_overlay && gas[MOLES] > gas_meta[META_GAS_MOLES_VISIBLE]) - new_overlay_types += gas_overlay[min(TOTAL_VISIBLE_STATES, CEILING(gas[MOLES] / MOLES_GAS_VISIBLE_STEP, 1))] + var/list/new_overlay_types + GAS_OVERLAYS(gases, new_overlay_types) if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 981e78a8f40..1165c636734 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -133,6 +133,12 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) /datum/gas_mixture/proc/return_volume() return max(0, volume) +/// Gets the gas visuals for everything in this mixture +/datum/gas_mixture/proc/return_visuals() + var/list/output + GAS_OVERLAYS(gases, output) + return output + /// Calculate thermal energy in joules /datum/gas_mixture/proc/thermal_energy() return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 23c5669cf3b..9a4097fecd0 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -90,6 +90,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/restricted = FALSE ///Set the tier of the canister and overlay used var/mode = CANISTER_TIER_1 + ///Window overlay showing the gas inside the canister + var/image/window /obj/machinery/portable_atmospherics/canister/Initialize(mapload, datum/gas_mixture/existing_mixture) . = ..() @@ -99,6 +101,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) else create_gas() + update_window() + var/random_quality = rand() pressure_limit = initial(pressure_limit) * (1 + 0.2 * random_quality) @@ -400,7 +404,9 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(connected_port) . += mutable_appearance(canister_overlay_file, "can-connector") - switch(air_contents.return_pressure()) + var/air_pressure = air_contents.return_pressure() + + switch(air_pressure) if((40 * ONE_ATMOSPHERE) to INFINITY) . += mutable_appearance(canister_overlay_file, "can-3") if((10 * ONE_ATMOSPHERE) to (40 * ONE_ATMOSPHERE)) @@ -410,6 +416,28 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if((10) to (5 * ONE_ATMOSPHERE)) . += mutable_appearance(canister_overlay_file, "can-0") + update_window() + +/obj/machinery/portable_atmospherics/canister/update_greyscale() + . = ..() + update_window() + +/obj/machinery/portable_atmospherics/canister/proc/update_window() + if(!air_contents) + return + var/static/alpha_filter + if(!alpha_filter) // Gotta do this seperate since the icon may not be correct at world init + alpha_filter = filter(type="alpha", icon=icon(icon, "window-base")) + + cut_overlay(window) + window = image(icon, icon_state="window-base", layer=FLOAT_LAYER) + var/list/window_overlays = list() + for(var/visual in air_contents.return_visuals()) + var/image/new_visual = image(visual, layer=FLOAT_PLANE) + new_visual.filters = alpha_filter + window_overlays += new_visual + window.overlays = window_overlays + add_overlay(window) /obj/machinery/portable_atmospherics/canister/should_atmos_process(datum/gas_mixture/air, exposed_temperature) return exposed_temperature > temperature_resistance * mode diff --git a/icons/obj/atmospherics/canisters.dmi b/icons/obj/atmospherics/canisters.dmi index 385914d197908e638825646dbad1e961ed95d518..065290481a5da3ea54d0b1e3546e5f2864711e51 100644 GIT binary patch literal 3129 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