From b1aba205ea414cc585c0ea4b5d3a457b323692a6 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Thu, 22 Dec 2022 14:14:48 +0530 Subject: [PATCH] Gas canisters correctly update their appearance (#72124) ## About The Pull Request Fixes issue #71712 & #72140 Don't know how the author wasn't able to reproduce it even though it happens all the time on all maps https://user-images.githubusercontent.com/110812394/208730887-7ad4b02d-9dcc-4d71-b54f-489c3bd616f6.mp4 ## The Problem The current code only updates the appearance of the canister when its valve is opened & if it takes damage . It doesn't deal with the case when its wrenched normally to a port without any problems ## The Solution Update the appearance during processing but only when its pressure changes significantly for the indicator light to be notified about it. This way we don't have to care if - the valve is open - its wrenched to a port - its leaking & taking damage Regardless of what the cause is only if the pressure inside the canister changes significantly from its current value do we update the appearance. This is so much more optimal than the previous code as` update_appearance()` will be called a maximum of 8 times during its full cycle of losing & refilling gas and won't be called at all if there is no pressure change ## Changelog :cl: fix: correctly update canister appearance /:cl: Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- .../machinery/portable/canister.dm | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index aee0513a7f9..3edd33b0bd6 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -89,6 +89,9 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/protected_contents = FALSE + ///used while processing to update appearance only when its pressure state changes + var/current_pressure_state + /obj/machinery/portable_atmospherics/canister/Initialize(mapload, datum/gas_mixture/existing_mixture) . = ..() @@ -379,21 +382,10 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(connected_port) . += mutable_appearance(canister_overlay_file, "can-connector") - var/air_pressure = air_contents.return_pressure() - - switch(air_pressure) - if((40 * ONE_ATMOSPHERE) to INFINITY) - . += mutable_appearance(canister_overlay_file, "can-3") - . += emissive_appearance(canister_overlay_file, "can-3-light", src, alpha = src.alpha) - if((10 * ONE_ATMOSPHERE) to (40 * ONE_ATMOSPHERE)) - . += mutable_appearance(canister_overlay_file, "can-2") - . += emissive_appearance(canister_overlay_file, "can-2-light", src, alpha = src.alpha) - if((5 * ONE_ATMOSPHERE) to (10 * ONE_ATMOSPHERE)) - . += mutable_appearance(canister_overlay_file, "can-1") - . += emissive_appearance(canister_overlay_file, "can-1-light", src, alpha = src.alpha) - if((10) to (5 * ONE_ATMOSPHERE)) - . += mutable_appearance(canister_overlay_file, "can-0") - . += emissive_appearance(canister_overlay_file, "can-0-light", src, alpha = src.alpha) + var/light_state = get_pressure_state(air_contents.return_pressure()) + if(light_state) //happens when pressure is below 10kpa which means no light + . += mutable_appearance(canister_overlay_file, light_state) + . += emissive_appearance(canister_overlay_file, "[light_state]-light", src, alpha = src.alpha) update_window() @@ -572,6 +564,20 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) else shielding_powered = FALSE +///return the icon_state component for the canister's indicator light based on its current pressure reading +/obj/machinery/portable_atmospherics/canister/proc/get_pressure_state(air_pressure) + switch(air_pressure) + if((40 * ONE_ATMOSPHERE) to INFINITY) + return "can-3" + if((10 * ONE_ATMOSPHERE) to (40 * ONE_ATMOSPHERE)) + return "can-2" + if((5 * ONE_ATMOSPHERE) to (10 * ONE_ATMOSPHERE)) + return "can-1" + if((10) to (5 * ONE_ATMOSPHERE)) + return "can-0" + else + return null + /obj/machinery/portable_atmospherics/canister/process_atmos() if(machine_stat & BROKEN) return PROCESS_KILL @@ -579,7 +585,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) valve_open = !valve_open timing = FALSE - var/visual_update = FALSE // Handle gas transfer. if(valve_open) var/turf/location = get_turf(src) @@ -587,17 +592,20 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) excited = TRUE if(air_contents.release_gas_to(target_air, release_pressure)) - visual_update = TRUE if(!holding) air_update_turf(FALSE, FALSE) // A bit different than other atmos devices. Wont stop if currently taking damage. if(take_atmos_damage()) - visual_update = TRUE - excited = TRUE - - if(visual_update) update_appearance() + excited = TRUE + return ..() //we have already updated appearance so dont need to update again below + + var/new_pressure_state = get_pressure_state(air_contents.return_pressure()) + if(current_pressure_state != new_pressure_state) //update apperance only when its pressure changes significantly from its current value + update_appearance() + current_pressure_state = new_pressure_state + return ..() /obj/machinery/portable_atmospherics/canister/ui_state(mob/user)