From ed17dde468fc8a2b5743d9f64c5afd7eab2f23f5 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:43:36 +0530 Subject: [PATCH] General maintenance for canisters (#80145) ## About The Pull Request 1. Fixes #80139 The greyscale config was not applied correctly and run timing halfway causing the appearance of the canister to be broken. That's fixed now. 2. Removes prototype canisters. They are not available in game and even as an admin tool their only function is to open the valve after an elapsed time interval. Even this was broken cause the UI for adjusting the timer was never added and the params had to be manually var edited all for a pretty pointless function. A better solution would be to allow players to attach signallers to canisters to control the delay but that could be a future PR 4. Other smaller optimizations include - converted vars like `can_min_release_pressure` and `can_max_release_pressure` & `temperature_resistance` into defines. Vars take up memory but not defines and so we saved some memory from this - removed var `starter_temp` cause its unused - removed var `protected_contents` cause it did nothing - moved the global canister list to its appropriate `code/define/globalvars/lists` folder where it belongs - Auto doc some vars & procs 5. Converted UI to typescript ## Changelog :cl: fix: canisters don't disappear when their colours are changed code: changed some vars into defines to save memory, removed unused/useless vars & added auto docs code: converted UI to typescript. moved global canister list to its appropriate folder refactor: removed prototype canisters and optimized canisters as a whole. /:cl: --- .../__DEFINES/atmospherics/atmos_machinery.dm | 5 + code/_globalvars/lists/canisters.dm | 29 ++ .../greyscale_configs/greyscale_objects.dm | 5 - .../json_configs/canister_proto.json | 39 --- .../machinery/portable/canister.dm | 324 +++++------------- .../mecha/equipment/tools/air_tank.dm | 6 +- .../obj/pipes_n_cables/prototype_canister.dmi | Bin 1871 -> 0 bytes tgstation.dme | 1 + .../interfaces/{Canister.jsx => Canister.tsx} | 79 +++-- 9 files changed, 175 insertions(+), 313 deletions(-) create mode 100644 code/_globalvars/lists/canisters.dm delete mode 100644 code/datums/greyscale/json_configs/canister_proto.json delete mode 100644 icons/obj/pipes_n_cables/prototype_canister.dmi rename tgui/packages/tgui/interfaces/{Canister.jsx => Canister.tsx} (83%) diff --git a/code/__DEFINES/atmospherics/atmos_machinery.dm b/code/__DEFINES/atmospherics/atmos_machinery.dm index cd770ba317d..eb0f853ee94 100644 --- a/code/__DEFINES/atmospherics/atmos_machinery.dm +++ b/code/__DEFINES/atmospherics/atmos_machinery.dm @@ -77,3 +77,8 @@ ///What direction is the machine pumping (into pump/port or out to the tank/area)? #define PUMP_IN TRUE #define PUMP_OUT FALSE + +///Max allowed pressure for canisters to release air per tick +#define CAN_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE * 25) +///Min allowed pressure for canisters to release air per tick +#define CAN_MIN_RELEASE_PRESSURE (ONE_ATMOSPHERE * 0.1) diff --git a/code/_globalvars/lists/canisters.dm b/code/_globalvars/lists/canisters.dm new file mode 100644 index 00000000000..f8ec95f6020 --- /dev/null +++ b/code/_globalvars/lists/canisters.dm @@ -0,0 +1,29 @@ +///List of all the gases, used in labelling the canisters +GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) + +///Returns a map of canister id to its type path +/proc/init_gas_id_to_canister() + return sort_list(list( + GAS_N2 = /obj/machinery/portable_atmospherics/canister/nitrogen, + GAS_O2 = /obj/machinery/portable_atmospherics/canister/oxygen, + GAS_CO2 = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, + GAS_PLASMA = /obj/machinery/portable_atmospherics/canister/plasma, + GAS_N2O = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, + GAS_NITRIUM = /obj/machinery/portable_atmospherics/canister/nitrium, + GAS_BZ = /obj/machinery/portable_atmospherics/canister/bz, + GAS_AIR = /obj/machinery/portable_atmospherics/canister/air, + GAS_WATER_VAPOR = /obj/machinery/portable_atmospherics/canister/water_vapor, + GAS_TRITIUM = /obj/machinery/portable_atmospherics/canister/tritium, + GAS_HYPER_NOBLIUM = /obj/machinery/portable_atmospherics/canister/nob, + GAS_PLUOXIUM = /obj/machinery/portable_atmospherics/canister/pluoxium, + "caution" = /obj/machinery/portable_atmospherics/canister, + GAS_MIASMA = /obj/machinery/portable_atmospherics/canister/miasma, + GAS_FREON = /obj/machinery/portable_atmospherics/canister/freon, + GAS_HYDROGEN = /obj/machinery/portable_atmospherics/canister/hydrogen, + GAS_HEALIUM = /obj/machinery/portable_atmospherics/canister/healium, + GAS_PROTO_NITRATE = /obj/machinery/portable_atmospherics/canister/proto_nitrate, + GAS_ZAUKER = /obj/machinery/portable_atmospherics/canister/zauker, + GAS_HELIUM = /obj/machinery/portable_atmospherics/canister/helium, + GAS_ANTINOBLIUM = /obj/machinery/portable_atmospherics/canister/antinoblium, + GAS_HALON = /obj/machinery/portable_atmospherics/canister/halon + )) diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm index 08df98148a1..7202c41ecc5 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_objects.dm @@ -112,11 +112,6 @@ name = "Hazard Striped Canister" json_config = 'code/datums/greyscale/json_configs/canister_hazard.json' -/datum/greyscale_config/prototype_canister - name = "Prototype Canister" - icon_file = 'icons/obj/pipes_n_cables/prototype_canister.dmi' - json_config = 'code/datums/greyscale/json_configs/canister_proto.json' - /datum/greyscale_config/stationary_canister name = "Stationary Canister" icon_file = 'icons/obj/pipes_n_cables/stationary_canisters.dmi' diff --git a/code/datums/greyscale/json_configs/canister_proto.json b/code/datums/greyscale/json_configs/canister_proto.json deleted file mode 100644 index 09f19b80e9b..00000000000 --- a/code/datums/greyscale/json_configs/canister_proto.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "can_base", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "can_shader", - "blend_mode": "multiply" - }, - { - "type": "icon_state", - "icon_state": "stand", - "blend_mode": "overlay" - }, - { - "type": "icon_state", - "icon_state": "decals", - "blend_mode": "overlay" - }, - [ - { - "type": "icon_state", - "icon_state": "light_base", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "light", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] - ] -} diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 6ff638b447e..02f499e00a6 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -1,33 +1,7 @@ +///The default pressure for releasing air into an holding tank or the turf #define CAN_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE) - -///List of all the gases, used in labelling the canisters -GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) - -/proc/init_gas_id_to_canister() - return sort_list(list( - GAS_N2 = /obj/machinery/portable_atmospherics/canister/nitrogen, - GAS_O2 = /obj/machinery/portable_atmospherics/canister/oxygen, - GAS_CO2 = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, - GAS_PLASMA = /obj/machinery/portable_atmospherics/canister/plasma, - GAS_N2O = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, - GAS_NITRIUM = /obj/machinery/portable_atmospherics/canister/nitrium, - GAS_BZ = /obj/machinery/portable_atmospherics/canister/bz, - GAS_AIR = /obj/machinery/portable_atmospherics/canister/air, - GAS_WATER_VAPOR = /obj/machinery/portable_atmospherics/canister/water_vapor, - GAS_TRITIUM = /obj/machinery/portable_atmospherics/canister/tritium, - GAS_HYPER_NOBLIUM = /obj/machinery/portable_atmospherics/canister/nob, - GAS_PLUOXIUM = /obj/machinery/portable_atmospherics/canister/pluoxium, - "caution" = /obj/machinery/portable_atmospherics/canister, - GAS_MIASMA = /obj/machinery/portable_atmospherics/canister/miasma, - GAS_FREON = /obj/machinery/portable_atmospherics/canister/freon, - GAS_HYDROGEN = /obj/machinery/portable_atmospherics/canister/hydrogen, - GAS_HEALIUM = /obj/machinery/portable_atmospherics/canister/healium, - GAS_PROTO_NITRATE = /obj/machinery/portable_atmospherics/canister/proto_nitrate, - GAS_ZAUKER = /obj/machinery/portable_atmospherics/canister/zauker, - GAS_HELIUM = /obj/machinery/portable_atmospherics/canister/helium, - GAS_ANTINOBLIUM = /obj/machinery/portable_atmospherics/canister/antinoblium, - GAS_HALON = /obj/machinery/portable_atmospherics/canister/halon - )) +///The temperature resistance of this canister +#define TEMPERATURE_RESISTANCE (1000 + T0C) /obj/machinery/portable_atmospherics/canister name = "canister" @@ -44,8 +18,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) pressure_resistance = 7 * ONE_ATMOSPHERE req_access = list() - var/icon/canister_overlay_file = 'icons/obj/pipes_n_cables/canisters.dmi' - ///Is the valve open? var/valve_open = FALSE ///Used to log opening and closing of the valve, available on VV @@ -55,40 +27,17 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) ///Maximum pressure allowed on initialize inside the canister, multiplied by the filled var var/maximum_pressure = 90 * ONE_ATMOSPHERE ///Stores the path of the gas for mapped canisters - var/gas_type + var/datum/gas/gas_type ///Player controlled var that set the release pressure of the canister var/release_pressure = ONE_ATMOSPHERE - ///Maximum pressure allowed for release_pressure var - var/can_max_release_pressure = (ONE_ATMOSPHERE * 25) - ///Minimum pressure allower for release_pressure var - var/can_min_release_pressure = (ONE_ATMOSPHERE * 0.1) - ///Maximum amount of external heat that the canister can handle before taking damage - var/temperature_resistance = 1000 + T0C - ///Initial temperature gas mixture - var/starter_temp - // Prototype vars - ///Is the canister a prototype one? - var/prototype = FALSE - ///Timer variables - var/valve_timer = null - var/timer_set = 30 - var/default_timer_set = 30 - var/minimum_timer_set = 1 - var/maximum_timer_set = 300 - var/timing = FALSE - ///If true, the prototype canister requires engi access to be used - var/restricted = FALSE ///Window overlay showing the gas inside the canister var/image/window - + ///Is shielding turned on/off var/shielding_powered = FALSE - + ///The powercell used to enable shielding var/obj/item/stock_parts/cell/internal_cell - + ///Is the cell hatch opened var/cell_container_opened = FALSE - - var/protected_contents = FALSE - ///used while processing to update appearance only when its pressure state changes var/current_pressure_state @@ -308,46 +257,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (N2O_ANESTHETIC * maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) SSair.start_processing_machine(src) -/** - * Getter for the amount of time left in the timer of prototype canisters - */ -/obj/machinery/portable_atmospherics/canister/proc/get_time_left() - if(timing) - . = round(max(0, valve_timer - world.time) * 0.1, 1) - else - . = timer_set - -/** - * Starts the timer of prototype canisters - */ -/obj/machinery/portable_atmospherics/canister/proc/set_active() - timing = !timing - if(timing) - valve_timer = world.time + (timer_set SECONDS) - update_appearance() - -/obj/machinery/portable_atmospherics/canister/proto - name = "prototype canister" - greyscale_config = /datum/greyscale_config/prototype_canister - greyscale_colors = "#ffffff#a50021#ffffff" - -/obj/machinery/portable_atmospherics/canister/proto/default - name = "prototype canister" - desc = "The best way to fix an atmospheric emergency... or the best way to introduce one." - volume = 5000 - max_integrity = 300 - temperature_resistance = 2000 + T0C - can_max_release_pressure = (ONE_ATMOSPHERE * 30) - can_min_release_pressure = (ONE_ATMOSPHERE / 30) - prototype = TRUE - -/obj/machinery/portable_atmospherics/canister/proto/default/oxygen - name = "prototype canister" - desc = "A prototype canister for a prototype bike, what could go wrong?" - gas_type = /datum/gas/oxygen - filled = 1 - release_pressure = ONE_ATMOSPHERE*2 - /** * Called on Initialize(), fill the canister with the gas_type specified up to the filled level (half if 0.5, full if 1) * Used for canisters spawned in maps and by admins @@ -356,8 +265,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(!gas_type) return air_contents.add_gas(gas_type) - if(starter_temp) - air_contents.temperature = starter_temp air_contents.gases[gas_type][MOLES] = (maximum_pressure * filled) * air_contents.volume / (R_IDEAL_GAS_EQUATION * air_contents.temperature) SSair.start_processing_machine(src) @@ -376,25 +283,24 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(shielding_powered) - . += mutable_appearance(canister_overlay_file, "shielding") - . += emissive_appearance(canister_overlay_file, "shielding", src) + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', "shielding") + . += emissive_appearance('icons/obj/pipes_n_cables/canisters.dmi', "shielding", src) if(cell_container_opened) - . += mutable_appearance(canister_overlay_file, "cell_hatch") + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', "cell_hatch") - var/isBroken = machine_stat & BROKEN ///Function is used to actually set the overlays - if(isBroken) - . += mutable_appearance(canister_overlay_file, "broken") + if(machine_stat & BROKEN) + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', "broken") if(holding) - . += mutable_appearance(canister_overlay_file, "can-open") + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', "can-open") if(connected_port) - . += mutable_appearance(canister_overlay_file, "can-connector") + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', "can-connector") - var/light_state = get_pressure_state(air_contents.return_pressure()) + var/light_state = get_pressure_state() 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) + . += mutable_appearance('icons/obj/pipes_n_cables/canisters.dmi', light_state) + . += emissive_appearance('icons/obj/pipes_n_cables/canisters.dmi', "[light_state]-light", src, alpha = src.alpha) update_window() @@ -402,18 +308,20 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() update_window() +///Updates the overlays of this canister based on its air contents /obj/machinery/portable_atmospherics/canister/proc/update_window() if(!air_contents) return + var/static/alpha_filter if(!alpha_filter) // Gotta do this separate since the icon may not be correct at world init - alpha_filter = filter(type="alpha", icon=icon(icon, "window-base")) + alpha_filter = filter(type="alpha", icon = icon('icons/obj/pipes_n_cables/canisters.dmi', "window-base")) cut_overlay(window) - window = image(icon, icon_state="window-base", layer=FLOAT_LAYER) + window = image('icons/obj/pipes_n_cables/canisters.dmi', icon_state = "window-base", layer = FLOAT_LAYER) var/list/window_overlays = list() for(var/visual in air_contents.return_visuals(get_turf(src))) - var/image/new_visual = image(visual, layer=FLOAT_LAYER) + var/image/new_visual = image(visual, layer = FLOAT_LAYER) new_visual.filters = alpha_filter window_overlays += new_visual window.overlays = window_overlays @@ -421,7 +329,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) // Both of these procs handle the external temperature damage. /obj/machinery/portable_atmospherics/canister/should_atmos_process(datum/gas_mixture/air, exposed_temperature) - return (exposed_temperature > temperature_resistance && !shielding_powered) + return (exposed_temperature > TEMPERATURE_RESISTANCE && !shielding_powered) /obj/machinery/portable_atmospherics/canister/atmos_expose(datum/gas_mixture/air, exposed_temperature) take_damage(5, BURN, 0) @@ -446,38 +354,40 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) var/obj/item/stock_parts/cell/active_cell = item if(!cell_container_opened) balloon_alert(user, "open the hatch first") - return + return TRUE if(!user.transferItemToLoc(active_cell, src)) - return + return TRUE if(internal_cell) user.put_in_hands(internal_cell) balloon_alert(user, "you successfully replace the cell") else balloon_alert(user, "you successfully install the cell") internal_cell = active_cell - return + return TRUE + return ..() /obj/machinery/portable_atmospherics/canister/screwdriver_act(mob/living/user, obj/item/screwdriver) - if(screwdriver.tool_behaviour != TOOL_SCREWDRIVER) - return screwdriver.play_tool_sound(src, 50) cell_container_opened = !cell_container_opened to_chat(user, span_notice("You [cell_container_opened ? "open" : "close"] the cell container hatch of [src].")) update_appearance() - return TRUE + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/portable_atmospherics/canister/crowbar_act(mob/living/user, obj/item/tool) + . = TOOL_ACT_TOOLTYPE_SUCCESS + if(!cell_container_opened || !internal_cell) return + internal_cell.forceMove(drop_location()) - balloon_alert(user, "you successfully remove the cell") - return TRUE + balloon_alert(user, "cell removed") /obj/machinery/portable_atmospherics/canister/welder_act_secondary(mob/living/user, obj/item/I) - . = ..() + . = TOOL_ACT_TOOLTYPE_SUCCESS if(!I.tool_start_check(user, amount=1)) - return TRUE + return + var/pressure = air_contents.return_pressure() if(pressure > 300) to_chat(user, span_alert("The pressure gauge on [src] indicates a high pressure inside... maybe you want to reconsider?")) @@ -487,26 +397,21 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(I.use_tool(src, user, 3 SECONDS, volume=50)) to_chat(user, span_notice("You cut [src] apart.")) deconstruct(TRUE) - return TRUE /obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/tool) - . = ..() + . = TOOL_ACT_TOOLTYPE_SUCCESS if(user.combat_mode) return FALSE - if(atom_integrity >= max_integrity) - return TRUE - if(machine_stat & BROKEN) - return TRUE - if(!tool.tool_start_check(user, amount=1)) - return TRUE + if(atom_integrity >= max_integrity || (machine_stat & BROKEN) || !tool.tool_start_check(user, amount = 1)) + return + to_chat(user, span_notice("You begin repairing cracks in [src]...")) while(tool.use_tool(src, user, 2.5 SECONDS, volume=40)) atom_integrity = min(atom_integrity + 25, max_integrity) if(atom_integrity >= max_integrity) to_chat(user, span_notice("You've finished repairing [src].")) - return TRUE + return to_chat(user, span_notice("You repair some of the cracks in [src]...")) - return TRUE /obj/machinery/portable_atmospherics/canister/Exited(atom/movable/gone, direction) . = ..() @@ -525,9 +430,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) return canister_break() -/** - * Handle canisters disassemble, releases the gas content in the turf - */ +///Handle canisters disassemble, releases the gas content in the turf /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) @@ -550,6 +453,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) . = ..() if(!.) return + if(close_valve) valve_open = FALSE update_appearance() @@ -558,26 +462,22 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) user.investigate_log("started a transfer into [holding].", INVESTIGATE_ATMOS) /obj/machinery/portable_atmospherics/canister/process(seconds_per_tick) - var/our_pressure = air_contents.return_pressure() var/our_temperature = air_contents.return_temperature() - protected_contents = FALSE if(shielding_powered) var/power_factor = round(log(10, max(our_pressure - pressure_limit, 1)) + log(10, max(our_temperature - temp_limit, 1))) var/power_consumed = power_factor * 250 * seconds_per_tick if(powered(AREA_USAGE_EQUIP, ignore_use_power = TRUE)) use_power(power_consumed, AREA_USAGE_EQUIP) - protected_contents = TRUE - else if(internal_cell?.use(power_consumed * 0.025)) - protected_contents = TRUE - else + else if(!internal_cell?.use(power_consumed * 0.025)) shielding_powered = FALSE SSair.start_processing_machine(src) investigate_log("shielding turned off due to power loss") ///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) +/obj/machinery/portable_atmospherics/canister/proc/get_pressure_state() + var/air_pressure = air_contents.return_pressure() switch(air_pressure) if((40 * ONE_ATMOSPHERE) to INFINITY) return "can-3" @@ -593,9 +493,6 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/process_atmos() if(machine_stat & BROKEN) return PROCESS_KILL - if(timing && valve_timer < world.time) - valve_open = !valve_open - timing = FALSE // Handle gas transfer. if(valve_open) @@ -613,7 +510,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) 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()) + var/new_pressure_state = get_pressure_state() 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 @@ -632,8 +529,8 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) /obj/machinery/portable_atmospherics/canister/ui_static_data(mob/user) return list( "defaultReleasePressure" = round(CAN_DEFAULT_RELEASE_PRESSURE), - "minReleasePressure" = round(can_min_release_pressure), - "maxReleasePressure" = round(can_max_release_pressure), + "minReleasePressure" = round(CAN_MIN_RELEASE_PRESSURE), + "maxReleasePressure" = round(CAN_MAX_RELEASE_PRESSURE), "pressureLimit" = round(pressure_limit), "holdingTankLeakPressure" = round(TANK_LEAK_PRESSURE), "holdingTankFragPressure" = round(TANK_FRAGMENT_PRESSURE) @@ -645,85 +542,69 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) "tankPressure" = round(air_contents.return_pressure()), "releasePressure" = round(release_pressure), "valveOpen" = !!valve_open, - "isPrototype" = !!prototype, "hasHoldingTank" = !!holding, "hasHypernobCrystal" = !!nob_crystal_inserted, "reactionSuppressionEnabled" = !!suppress_reactions ) - if (prototype) - . += list( - "restricted" = restricted, - "timing" = timing, - "time_left" = get_time_left(), - "timer_set" = timer_set, - "timer_is_not_default" = timer_set != default_timer_set, - "timer_is_not_min" = timer_set != minimum_timer_set, - "timer_is_not_max" = timer_set != maximum_timer_set - ) - if (holding) var/datum/gas_mixture/holding_mix = holding.return_air() - . += list( - "holdingTank" = list( - "name" = holding.name, - "tankPressure" = round(holding_mix.return_pressure()) - ) + .["holdingTank"] = list( + "name" = holding.name, + "tankPressure" = round(holding_mix.return_pressure()) ) + else + .["holdingTank"] = null + . += list( "shielding" = shielding_powered, - "hasCell" = (internal_cell ? TRUE : FALSE), - "cellCharge" = internal_cell?.percent() + "cellCharge" = internal_cell ? internal_cell.percent() : 0 ) /obj/machinery/portable_atmospherics/canister/ui_act(action, params) . = ..() if(.) return + switch(action) if("relabel") var/label = tgui_input_list(usr, "New canister label", "Canister", GLOB.gas_id_to_canister) if(isnull(label)) return - if(!..()) - var/newtype = GLOB.gas_id_to_canister[label] - if(newtype) - var/obj/machinery/portable_atmospherics/canister/replacement = newtype - investigate_log("was relabelled to [initial(replacement.name)] by [key_name(usr)].", INVESTIGATE_ATMOS) - name = initial(replacement.name) - desc = initial(replacement.desc) - icon_state = initial(replacement.icon_state) - base_icon_state = icon_state - set_greyscale(initial(replacement.greyscale_colors), initial(replacement.greyscale_config)) - if("restricted") - restricted = !restricted - if(restricted) - req_access = list(ACCESS_ENGINEERING) - else - req_access = list() - . = TRUE + var/newtype = GLOB.gas_id_to_canister[label] + if(isnull(newtype)) + return + var/obj/machinery/portable_atmospherics/canister/replacement = newtype + investigate_log("was relabelled to [initial(replacement.name)] by [key_name(usr)].", INVESTIGATE_ATMOS) + name = initial(replacement.name) + desc = initial(replacement.desc) + icon_state = initial(replacement.icon_state) + base_icon_state = icon_state + set_greyscale(initial(replacement.greyscale_colors), initial(replacement.greyscale_config)) + if("pressure") var/pressure = params["pressure"] if(pressure == "reset") pressure = CAN_DEFAULT_RELEASE_PRESSURE . = TRUE else if(pressure == "min") - pressure = can_min_release_pressure + pressure = CAN_MIN_RELEASE_PRESSURE . = TRUE else if(pressure == "max") - pressure = can_max_release_pressure + pressure = CAN_MAX_RELEASE_PRESSURE . = TRUE else if(pressure == "input") - pressure = tgui_input_number(usr, "New release pressure", "Canister Pressure", release_pressure, can_max_release_pressure, can_min_release_pressure) - if(!isnull(pressure) && !..()) + pressure = tgui_input_number(usr, "New release pressure", "Canister Pressure", release_pressure, CAN_MAX_RELEASE_PRESSURE, CAN_MIN_RELEASE_PRESSURE) + if(!isnull(pressure)) . = TRUE else if(text2num(pressure) != null) pressure = text2num(pressure) . = TRUE if(.) - release_pressure = clamp(round(pressure), can_min_release_pressure, can_max_release_pressure) + release_pressure = clamp(round(pressure), CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) investigate_log("was set to [release_pressure] kPa by [key_name(usr)].", INVESTIGATE_ATMOS) - if("valve") //logging for openning canisters + + if("valve") var/logmsg var/admin_msg var/danger = FALSE @@ -757,24 +638,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) investigate_log(logmsg, INVESTIGATE_ATMOS) release_log += logmsg . = TRUE - if("timer") - var/change = params["change"] - switch(change) - if("reset") - timer_set = default_timer_set - if("decrease") - timer_set = max(minimum_timer_set, timer_set - 10) - if("increase") - timer_set = min(maximum_timer_set, timer_set + 10) - if("input") - var/user_input = tgui_input_number(usr, "Set time to valve toggle", "Canister Timer", timer_set, maximum_timer_set, minimum_timer_set) - if(isnull(user_input) || QDELETED(usr) || QDELETED(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - timer_set = user_input - log_admin("[key_name(usr)] has activated a prototype valve timer") - . = TRUE - if("toggle_timer") - set_active() + if("eject") if(holding) if(valve_open) @@ -788,7 +652,9 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) SSair.start_processing_machine(src) message_admins("[ADMIN_LOOKUPFLW(usr)] turned [shielding_powered ? "on" : "off"] the [src] powered shielding.") usr.investigate_log("turned [shielding_powered ? "on" : "off"] the [src] powered shielding.") + update_appearance() . = TRUE + if("reaction_suppression") if(!nob_crystal_inserted) stack_trace("[usr] tried to toggle reaction suppression on a canister without a noblium crystal inside, possible href exploit attempt.") @@ -798,38 +664,32 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) message_admins("[ADMIN_LOOKUPFLW(usr)] turned [suppress_reactions ? "on" : "off"] the [src] reaction suppression.") usr.investigate_log("turned [suppress_reactions ? "on" : "off"] the [src] reaction suppression.") . = TRUE + if("recolor") - select_colors() + var/initial_config = initial(greyscale_config) + if(isnull(initial_config)) + return FALSE + + var/datum/greyscale_modify_menu/menu = new( + src, usr, list("[initial_config]"), CALLBACK(src, PROC_REF(recolor)), + starting_icon_state = initial(icon_state), + starting_config = initial_config, + starting_colors = initial(greyscale_colors) + ) + menu.ui_interact(usr) . = TRUE update_appearance() -/obj/machinery/portable_atmospherics/canister/proc/select_colors() - var/atom/fake_atom = src - var/list/allowed_configs = list() - var/config = initial(fake_atom.greyscale_config) - if(!config) - return - allowed_configs += "[config]" - - var/datum/greyscale_modify_menu/menu = new( - src, usr, allowed_configs, CALLBACK(src, PROC_REF(recolor)), - starting_icon_state=initial(fake_atom.icon_state), - starting_config=initial(fake_atom.greyscale_config), - starting_colors=initial(fake_atom.greyscale_colors) - ) - menu.ui_interact(usr) - /obj/machinery/portable_atmospherics/canister/proc/recolor(datum/greyscale_modify_menu/menu) - set_greyscale(menu.split_colors) + set_greyscale(menu.split_colors, menu.config.type) /obj/machinery/portable_atmospherics/canister/unregister_holding() valve_open = FALSE return ..() /obj/machinery/portable_atmospherics/canister/take_atmos_damage() - if(shielding_powered) - return FALSE - return ..() + return shielding_powered ? FALSE : ..() #undef CAN_DEFAULT_RELEASE_PRESSURE +#undef TEMPERATURE_RESISTANCE diff --git a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm index 3062d9923bc..f00444ae598 100644 --- a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm +++ b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm @@ -107,8 +107,8 @@ "auto_pressurize_on_seal" = auto_pressurize_on_seal, "port_connected" = internal_tank?.connected_port ? TRUE : FALSE, "tank_release_pressure" = round(internal_tank.release_pressure), - "tank_release_pressure_min" = internal_tank.can_min_release_pressure, - "tank_release_pressure_max" = internal_tank.can_max_release_pressure, + "tank_release_pressure_min" = CAN_MIN_RELEASE_PRESSURE, + "tank_release_pressure_max" = CAN_MAX_RELEASE_PRESSURE, "tank_pump_active" = tank_pump_active, "tank_pump_direction" = tank_pump_direction, "tank_pump_pressure" = round(tank_pump_pressure), @@ -122,7 +122,7 @@ switch(action) if("set_cabin_pressure") var/new_pressure = text2num(params["new_pressure"]) - internal_tank.release_pressure = clamp(round(new_pressure), internal_tank.can_min_release_pressure, internal_tank.can_max_release_pressure) + internal_tank.release_pressure = clamp(round(new_pressure), CAN_MIN_RELEASE_PRESSURE, CAN_MAX_RELEASE_PRESSURE) return TRUE if("toggle_port") if(internal_tank.connected_port) diff --git a/icons/obj/pipes_n_cables/prototype_canister.dmi b/icons/obj/pipes_n_cables/prototype_canister.dmi deleted file mode 100644 index fb73aa2ed6d25ff3fa474cf427c56877cd06953f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1871 zcmb`I=~vPT7sr2)idlrmWh|An%!w97t*|sn&BrB|)KSz&#|4>^q)^co1;i!PDKd{4 zq^OMPQ>KwhsiWhPSk$;rE<-L5^dEdel;p8WfuB_5&$437?RRCtd-7>ug4Ey-t_2uEyZ1 z@(8`s(6(4<>~+`RE%HrqI0@Z#7CKm`n5@%eoWdnfJF(!{RnGZAu+Deu5-@f~V2_@Xk_m zY(`CSRYCFLUjyl=%jc>JKbhoG=-o=ve0R1;W$_bhah*z6$rWkH%{`ZiM3@`&`!U~< z26{|ffIu`gb(K+muBxBXQCG(?*m`tVa3Iqhnx0sWaQl5?;y6hBRWVaG-PqWep!mc0 zW74Vl&!3BF9ooie05KK6ek;2mnnZe+j9On>N*+r>Mzwd(&mRTE8*8dJ(@6kra`OB0 z+quiB(R#TRa{jQCus%DBAA1d<358+5+)!vOr^1_vqQ)LHc|~_RNq7Q{1TonR1{B8& zW3$=OSZr5trbqr>;rIg|tr!1=0{+!Oi_3E%W2=WcEf1FTNtWlvfd1D2hVSR&lYFla zXQ#Yc6$k=)dwa!`t=G8A-_iD&m-J!DWK#$PqD*^>Ylv+X65h+4D60lJIXUeq>H=(H z;?UIR(QWF18r;Gx=MVnChn>@w;%5+;53sT_E>xv&l9eqg0`kj9)0O7FxrfE5)uBr- zo?~i8AhE0e?po_JTv%3M^}XPbkMct_SPQpg)Qrb;hdNrv9XI};rSlrWJuMuc-jN8> z^ye_oD=SQOQN~b`dJ_u^iwp^A9|Eg&;@4~Z8z|DgT(_>GKS5L0Ru2l_hsjQc9fsnp zI`b62>3SdoYDVT)T*kokcF6VC=eVg!;SjaFgpaGPq>#VhI8ZVBk5iD_SrwQXd^wt8 zm%*#gByk>h4ekJdo31Yjs1k&MPJP5fey?6dG=bo=t>4$EXiqBW(-|r!^ysCxIK5Zc zfVH??Q=p45n?*6ec5)u1ILWs6&M3YGYM(t*5w4=k?PU``XOYpOCZ1F#$nUF;zi2I* z6y}}26U9$ufGYkpti^LkABmUE;BcW6Ef`h!HkwM^t3Jwy)WyMB)Xo?>iIoVaO( zj6`hN#mC2AXp0ndb%BffE<|bWHb@kG^BDy_?ce|g$ZN{J_9LDtM>)rLcs_d9OxoR))plDj(J=HX^JqG7mDDo!&2BVTV+=@5H;% zH9St)*ZCt@hZ&;y8+tIGU55RGNX^0owFm#16&+nAW~Ny&D{&uNE@DZ|(l#PyskCNZ zET1#C`eV%Q^ln3wPCHtLU@WDrGSF{UDz;(l87Y14V)C1VqTW&x(Y}H#pUV3*%Cl)`$SYbcTTWi z`gNKmd3G|2KO9TBd1{yaJzmzvmv``t`=AN14Mc3lx1k0&4vXcj-PwjsZ5#VOt&@vb zK;zSm3Qzrx#X86U3v+s8#zKRFrZIi{k1b$=pfdffh+buUr6eU!X3T5b04=85oXwYe zN7|0F^b=r$)!4(b!L0`wG=+4 z%6G_1+nhamLERzfk{nBPIn3O&ADn#_^#7tTg9ouL*D;3|)gKb@`j4L**EKrxFV!M@ A`2YX_ diff --git a/tgstation.dme b/tgstation.dme index d940a6a78aa..7d90db878ad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -508,6 +508,7 @@ #include "code\_globalvars\time_vars.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\ambience.dm" +#include "code\_globalvars\lists\canisters.dm" #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\color.dm" #include "code\_globalvars\lists\crafting.dm" diff --git a/tgui/packages/tgui/interfaces/Canister.jsx b/tgui/packages/tgui/interfaces/Canister.tsx similarity index 83% rename from tgui/packages/tgui/interfaces/Canister.jsx rename to tgui/packages/tgui/interfaces/Canister.tsx index efb74f42177..87d41a4b8e1 100644 --- a/tgui/packages/tgui/interfaces/Canister.jsx +++ b/tgui/packages/tgui/interfaces/Canister.tsx @@ -1,38 +1,60 @@ import { toFixed } from 'common/math'; +import { BooleanLike } from 'common/react'; import { useBackend } from '../backend'; import { Box, Button, Flex, Icon, Knob, LabeledControls, LabeledList, RoundGauge, Section, Tooltip } from '../components'; import { formatSiUnit } from '../format'; import { Window } from '../layouts'; -const formatPressure = (value) => { +const formatPressure = (value: number) => { if (value < 10000) { return toFixed(value) + ' kPa'; } return formatSiUnit(value * 1000, 1, 'Pa'); }; +type HoldingTank = { + name: string; + tankPressure: number; +}; + +type Data = { + portConnected: BooleanLike; + tankPressure: number; + releasePressure: number; + defaultReleasePressure: number; + minReleasePressure: number; + maxReleasePressure: number; + hasHypernobCrystal: BooleanLike; + cellCharge: number; + pressureLimit: number; + valveOpen: BooleanLike; + holdingTank: HoldingTank; + holdingTankLeakPressure: number; + holdingTankFragPressure: number; + shielding: BooleanLike; + reactionSuppressionEnabled: BooleanLike; +}; + export const Canister = (props) => { - const { act, data } = useBackend(); + const { act, data } = useBackend(); const { - portConnected, + shielding, + holdingTank, + pressureLimit, + valveOpen, tankPressure, releasePressure, defaultReleasePressure, minReleasePressure, maxReleasePressure, + portConnected, + cellCharge, hasHypernobCrystal, reactionSuppressionEnabled, - hasCell, - cellCharge, - pressureLimit, - valveOpen, - isPrototype, - hasHoldingTank, - holdingTank, - holdingTankLeakPressure, holdingTankFragPressure, - restricted, + holdingTankLeakPressure, } = data; + return ( @@ -42,19 +64,10 @@ export const Canister = (props) => { title="Canister" buttons={ <> - {!!isPrototype && ( -