From a455259b3fdd4f196df0627f391aa578112e212b Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 21 Jul 2021 16:40:33 -0500 Subject: [PATCH] GAGS coloring for Atmos that displays changes in temperature (#59924) This PR adds temperature based coloring for atmos gas meters and freezers. These values are based on the BODYTEMP icon warnings that you get when a room is too hot or too cold. There is also some minor code improvements where some of the icon heat and cold warnings were hardcoded values. I made this a constant in the __DEFINES.atmospherics.dm file that you can see below. These values have been applied to air alarms, thermomachines, gas meters, and species code. This is a QoL update for atmos tech nerds. Instead of having to manually examine a gas meter or use an analyzer to determine what temperature is in the pipes you can rely on the colored icons to communicate that information rapidly. This should also help prevent harmful gas leaks where a person unwrenches a pipe without realizing there is hot gas inside it. And you should be able to troubleshoot a delaming SM faster and easier with these colors. --- code/__DEFINES/atmospherics.dm | 14 + .../config_types/greyscale_configs.dm | 10 + code/datums/greyscale/json_configs/meter.json | 375 ++++++++++++++++++ .../greyscale/json_configs/thermomachine.json | 59 +++ .../atmospherics/machinery/airalarm.dm | 2 +- .../binary_devices/thermomachine.dm | 76 ++-- .../atmospherics/machinery/other/meter.dm | 35 +- .../mob/living/carbon/human/species.dm | 8 +- .../atmospherics/components/thermomachine.dmi | Bin 5376 -> 4191 bytes icons/obj/atmospherics/pipes/meter.dmi | Bin 716 -> 1445 bytes 10 files changed, 533 insertions(+), 46 deletions(-) create mode 100644 code/datums/greyscale/json_configs/meter.json create mode 100644 code/datums/greyscale/json_configs/thermomachine.json diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 18474f555c3..4ed7e668c75 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -212,6 +212,20 @@ /// The modifier on cold damage hulks get. #define HULK_COLD_DAMAGE_MOD 2 +// Body temperature warning icons +/// The temperature the red icon is displayed. +#define BODYTEMP_HEAT_WARNING_3 (BODYTEMP_HEAT_DAMAGE_LIMIT + 360) //+700k +/// The temperature the orange icon is displayed. +#define BODYTEMP_HEAT_WARNING_2 (BODYTEMP_HEAT_DAMAGE_LIMIT + 120) //460K +/// The temperature the yellow icon is displayed. +#define BODYTEMP_HEAT_WARNING_1 (BODYTEMP_HEAT_DAMAGE_LIMIT) //340K +/// The temperature the light green icon is displayed. +#define BODYTEMP_COLD_WARNING_1 (BODYTEMP_COLD_DAMAGE_LIMIT) //270k +/// The temperature the cyan icon is displayed. +#define BODYTEMP_COLD_WARNING_2 (BODYTEMP_COLD_DAMAGE_LIMIT - 70) //200k +/// The temperature the blue icon is displayed. +#define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k + /// what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. #define SPACE_HELM_MIN_TEMP_PROTECT 2.0 /// Thermal insulation works both ways /Malkevin diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm index fbfef1ad55d..0b06cd82ae6 100644 --- a/code/datums/greyscale/config_types/greyscale_configs.dm +++ b/code/datums/greyscale/config_types/greyscale_configs.dm @@ -338,6 +338,16 @@ icon_file = 'icons/obj/stack_objects.dmi' json_config = 'code/datums/greyscale/json_configs/wrap_paper.json' +/datum/greyscale_config/meter + name = "Meter" + icon_file = 'icons/obj/atmospherics/pipes/meter.dmi' + json_config = 'code/datums/greyscale/json_configs/meter.json' + +/datum/greyscale_config/thermomachine + name = "Thermomachine" + icon_file = 'icons/obj/atmospherics/components/thermomachine.dmi' + json_config = 'code/datums/greyscale/json_configs/thermomachine.json' + /datum/greyscale_config/janicart_upgrade name = "Janicart Upgrade" icon_file = 'icons/obj/janicart_upgrade.dmi' diff --git a/code/datums/greyscale/json_configs/meter.json b/code/datums/greyscale/json_configs/meter.json new file mode 100644 index 00000000000..3acd68b6f72 --- /dev/null +++ b/code/datums/greyscale/json_configs/meter.json @@ -0,0 +1,375 @@ +{ + "meter": [ + { + "type": "icon_state", + "icon_state": "pressure0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + } + ], + "meter0": [ + { + "type": "icon_state", + "icon_state": "pressure0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons0", + "blend_mode": "overlay" + } + ], + "meter1_1": [ + { + "type": "icon_state", + "icon_state": "pressure1_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter1_2": [ + { + "type": "icon_state", + "icon_state": "pressure1_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter1_3": [ + { + "type": "icon_state", + "icon_state": "pressure1_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter1_4": [ + { + "type": "icon_state", + "icon_state": "pressure1_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter1_5": [ + { + "type": "icon_state", + "icon_state": "pressure1_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter1_6": [ + { + "type": "icon_state", + "icon_state": "pressure1_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons1", + "blend_mode": "overlay" + } + ], + "meter2_1": [ + { + "type": "icon_state", + "icon_state": "pressure2_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter2_2": [ + { + "type": "icon_state", + "icon_state": "pressure2_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter2_3": [ + { + "type": "icon_state", + "icon_state": "pressure2_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter2_4": [ + { + "type": "icon_state", + "icon_state": "pressure2_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter2_5": [ + { + "type": "icon_state", + "icon_state": "pressure2_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter2_6": [ + { + "type": "icon_state", + "icon_state": "pressure2_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons2", + "blend_mode": "overlay" + } + ], + "meter3_1": [ + { + "type": "icon_state", + "icon_state": "pressure3_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter3_2": [ + { + "type": "icon_state", + "icon_state": "pressure3_2", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter3_3": [ + { + "type": "icon_state", + "icon_state": "pressure3_3", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter3_4": [ + { + "type": "icon_state", + "icon_state": "pressure3_4", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter3_5": [ + { + "type": "icon_state", + "icon_state": "pressure3_5", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter3_6": [ + { + "type": "icon_state", + "icon_state": "pressure3_6", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons3", + "blend_mode": "overlay" + } + ], + "meter4": [ + { + "type": "icon_state", + "icon_state": "pressure4", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "meter_base", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "buttons4", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/thermomachine.json b/code/datums/greyscale/json_configs/thermomachine.json new file mode 100644 index 00000000000..ee939c95ef1 --- /dev/null +++ b/code/datums/greyscale/json_configs/thermomachine.json @@ -0,0 +1,59 @@ +{ + "thermo_0": [ + { + "type": "icon_state", + "icon_state": "temp_meter", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thermo_base", + "blend_mode": "overlay" + } + ], + "thermo_1": [ + { + "type": "icon_state", + "icon_state": "temp_meter_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thermo_base_1", + "blend_mode": "overlay" + } + ], + "thermo_1_blinking": [ + { + "type": "icon_state", + "icon_state": "temp_meter_1", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "blinking", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "thermo_base_1", + "blend_mode": "overlay" + } + ], + "thermo-open": [ + { + "type": "icon_state", + "icon_state": "temp_meter-o", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thermo_base-o", + "blend_mode": "overlay" + } + ] +} diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index a3b4c968fd1..232423d497c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -85,7 +85,7 @@ var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(HAZARD_LOW_PRESSURE, WARNING_LOW_PRESSURE, WARNING_HIGH_PRESSURE, HAZARD_HIGH_PRESSURE), // kPa. Values are min2, min1, max1, max2 - "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), + "temperature" = new/datum/tlv(BODYTEMP_COLD_WARNING_1, BODYTEMP_COLD_WARNING_1+10, BODYTEMP_HEAT_WARNING_1-27, BODYTEMP_HEAT_WARNING_1), /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), diff --git a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm index c3c883c4376..b80c6f2e304 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/thermomachine.dm @@ -2,7 +2,7 @@ /obj/machinery/atmospherics/components/binary/thermomachine icon = 'icons/obj/atmospherics/components/thermomachine.dmi' - icon_state = "freezer" + icon_state = "thermo_base" name = "Temperature control unit" desc = "Heats or cools gas in connected pipes." @@ -19,11 +19,10 @@ vent_movement = NONE pipe_flags = PIPING_ONE_PER_TURF - set_dir_on_move = FALSE + greyscale_config = /datum/greyscale_config/thermomachine + greyscale_colors = COLOR_VIBRANT_LIME - var/icon_state_off = "freezer" - var/icon_state_on = "freezer_1" - var/icon_state_open = "freezer-o" + set_dir_on_move = FALSE var/min_temperature = T20C //actual temperature will be defined by RefreshParts() and by the cooling var var/max_temperature = T20C //actual temperature will be defined by RefreshParts() and by the cooling var @@ -81,35 +80,43 @@ /obj/machinery/atmospherics/components/binary/thermomachine/update_icon_state() - if(cooling) - icon_state_off = "freezer" - icon_state_on = "freezer_1" - icon_state_open = "freezer-o" - else - icon_state_off = "heater" - icon_state_on = "heater_1" - icon_state_open = "heater-o" + switch(target_temperature) + if(BODYTEMP_HEAT_WARNING_3 to INFINITY) + greyscale_colors = COLOR_RED + if(BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_3) + greyscale_colors = COLOR_ORANGE + if(BODYTEMP_HEAT_WARNING_1 to BODYTEMP_HEAT_WARNING_2) + greyscale_colors = COLOR_YELLOW + if(BODYTEMP_COLD_WARNING_1 to BODYTEMP_HEAT_WARNING_1) + greyscale_colors = COLOR_VIBRANT_LIME + if(BODYTEMP_COLD_WARNING_2 to BODYTEMP_COLD_WARNING_1) + greyscale_colors = COLOR_CYAN + if(BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) + greyscale_colors = COLOR_BLUE + else + greyscale_colors = COLOR_VIOLET + + set_greyscale(colors=greyscale_colors) + if(panel_open) - icon_state = icon_state_open + icon_state = "thermo-open" return ..() if(on && is_operational) - icon_state = icon_state_on + if(skipping_work) + icon_state = "thermo_1_blinking" + else + icon_state = "thermo_1" return ..() - icon_state = icon_state_off + icon_state = "thermo_0" return ..() /obj/machinery/atmospherics/components/binary/thermomachine/update_overlays() . = ..() - //Doesn't check if the pipes are intact - var/mutable_appearance/pipe_appearance1 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[dir]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) - pipe_appearance1.color = COLOR_LIME - var/mutable_appearance/pipe_appearance2 = mutable_appearance('icons/obj/atmospherics/pipes/pipe_underlays.dmi', "intact_[turn(dir, 180)]_[piping_layer]", layer = GAS_SCRUBBER_LAYER) - pipe_appearance2.color = COLOR_MOSTLY_PURE_RED - . += pipe_appearance1 - . += pipe_appearance2 - if(skipping_work && on) - var/mutable_appearance/skipping = mutable_appearance(icon, "blinking") - . += skipping + if(!initial(icon)) + return + var/mutable_appearance/thermo_overlay = new(initial(icon)) + . += getpipeimage(thermo_overlay, "pipe", dir, COLOR_LIME, piping_layer) + . += getpipeimage(thermo_overlay, "pipe", turn(dir, 180), COLOR_MOSTLY_PURE_RED, piping_layer) /obj/machinery/atmospherics/components/binary/thermomachine/examine(mob/user) . = ..() @@ -237,7 +244,7 @@ if(!anchored) to_chat(user, span_notice("Anchor [src] first!")) return - if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, item)) + if(default_deconstruction_screwdriver(user, "thermo-open", "thermo-0", item)) change_pipe_connection(panel_open) return if(default_change_direction_wrench(user, item)) @@ -451,15 +458,11 @@ . = ..() /obj/machinery/atmospherics/components/binary/thermomachine/freezer - icon_state = "freezer" - icon_state_off = "freezer" - icon_state_on = "freezer_1" - icon_state_open = "freezer-o" cooling = TRUE /obj/machinery/atmospherics/components/binary/thermomachine/freezer/on on = TRUE - icon_state = "freezer_1" + icon_state = "thermo_base_1" /obj/machinery/atmospherics/components/binary/thermomachine/freezer/on/Initialize() . = ..() @@ -468,20 +471,19 @@ /obj/machinery/atmospherics/components/binary/thermomachine/freezer/on/coldroom name = "Cold room temperature control unit" + icon_state = "thermo_base_1" + greyscale_colors = COLOR_CYAN + cooling = TRUE /obj/machinery/atmospherics/components/binary/thermomachine/freezer/on/coldroom/Initialize() . = ..() target_temperature = COLD_ROOM_TEMP /obj/machinery/atmospherics/components/binary/thermomachine/heater - icon_state = "heater" - icon_state_off = "heater" - icon_state_on = "heater_1" - icon_state_open = "heater-o" cooling = FALSE /obj/machinery/atmospherics/components/binary/thermomachine/heater/on on = TRUE - icon_state = "heater_1" + icon_state = "thermo_base_1" #undef THERMOMACHINE_SAFE_TEMPERATURE diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 8ded7e1e25f..3e3995dee6b 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -2,7 +2,7 @@ name = "gas flow meter" desc = "It measures something." icon = 'icons/obj/atmospherics/pipes/meter.dmi' - icon_state = "meterX" + icon_state = "meter_base" layer = HIGH_PIPE_LAYER power_channel = AREA_USAGE_ENVIRON use_power = IDLE_POWER_USE @@ -13,6 +13,8 @@ var/frequency = 0 var/atom/target var/target_layer = PIPING_LAYER_DEFAULT + greyscale_config = /datum/greyscale_config/meter + greyscale_colors = COLOR_GRAY /obj/machinery/meter/atmos frequency = FREQ_ATMOS_STORAGE @@ -59,18 +61,22 @@ /obj/machinery/meter/process_atmos() if(!(target?.flags_1 & INITIALIZED_1)) - icon_state = "meterX" + icon_state = "meter0" + greyscale_colors = COLOR_GRAY + set_greyscale(colors=greyscale_colors) return FALSE if(machine_stat & (BROKEN|NOPOWER)) - icon_state = "meter0" + icon_state = "meter" + greyscale_colors = COLOR_GRAY + set_greyscale(colors=greyscale_colors) return FALSE use_power(5) var/datum/gas_mixture/environment = target.return_air() if(!environment) - icon_state = "meterX" + icon_state = "meter0" return FALSE var/env_pressure = environment.return_pressure() @@ -88,6 +94,27 @@ else icon_state = "meter4" + var/env_temperature = environment.temperature + if(env_pressure == 0 || env_temperature == 0) + greyscale_colors = COLOR_GRAY + else + switch(env_temperature) + if(BODYTEMP_HEAT_WARNING_3 to INFINITY) + greyscale_colors = COLOR_RED + if(BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_3) + greyscale_colors = COLOR_ORANGE + if(BODYTEMP_HEAT_WARNING_1 to BODYTEMP_HEAT_WARNING_2) + greyscale_colors = COLOR_YELLOW + if(BODYTEMP_COLD_WARNING_1 to BODYTEMP_HEAT_WARNING_1) + greyscale_colors = COLOR_VIBRANT_LIME + if(BODYTEMP_COLD_WARNING_2 to BODYTEMP_COLD_WARNING_1) + greyscale_colors = COLOR_CYAN + if(BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) + greyscale_colors = COLOR_BLUE + else + greyscale_colors = COLOR_VIOLET + set_greyscale(colors=greyscale_colors) + if(frequency) var/datum/radio_frequency/radio_connection = SSradio.return_frequency(frequency) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 85b437a418a..fe0d1a693e1 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1683,9 +1683,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) humi.remove_movespeed_modifier(/datum/movespeed_modifier/cold) // display alerts based on how hot it is switch(humi.bodytemperature) - if(0 to 460) + if(bodytemp_heat_damage_limit to BODYTEMP_HEAT_WARNING_2) humi.throw_alert("temp", /atom/movable/screen/alert/hot, 1) - if(461 to 700) + if(BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_3) humi.throw_alert("temp", /atom/movable/screen/alert/hot, 2) else humi.throw_alert("temp", /atom/movable/screen/alert/hot, 3) @@ -1699,9 +1699,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) humi.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((bodytemp_cold_damage_limit - humi.bodytemperature) / COLD_SLOWDOWN_FACTOR)) // Display alerts based how cold it is switch(humi.bodytemperature) - if(201 to bodytemp_cold_damage_limit) + if(BODYTEMP_COLD_WARNING_2 to bodytemp_cold_damage_limit) humi.throw_alert("temp", /atom/movable/screen/alert/cold, 1) - if(120 to 200) + if(BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) humi.throw_alert("temp", /atom/movable/screen/alert/cold, 2) else humi.throw_alert("temp", /atom/movable/screen/alert/cold, 3) diff --git a/icons/obj/atmospherics/components/thermomachine.dmi b/icons/obj/atmospherics/components/thermomachine.dmi index ad3d5e4454622bcd783769e46b5bc8a66a30a750..6c148c389731a55c32745b18a930266132cee480 100644 GIT binary patch literal 4191 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 IV<+PO0M%UO^8f$< literal 5376 zcmcJTcT`hdw!i~|C_#f#r3DmhNKp|Hk=~Ue3P{m_pn!m(7a;_ZA~2vx6ObZR=|y@8 zEdo+PkzN9XUP1{aJric$H}kDGZ_T{*)_Q-Od)7Vc?0fFn<+t}a;fDHJr&#$|0RX@$ z9c^_Zdf$B1P8_E{ji#Jf=w02L$4@-eU%1=2Ikrg{=YWGySpIz4`M{nPIu?=dy2aG~dtH@A0ChhaXyP#Pg-X3g(5IvZ8OS49}F zmw8F(K8O}JpU?HA@}{~4pM5uRwz2cLu*~Ecv7f@P3a|@@cf7-SI!^@W>fd|#yn)2W zo^Vl?Xt&e^q0D@8;}^YmV5$YKRdJntt7up!Jm#IOSHb7CIX1=JVmoq7wWolsqCD`n z%*|-A#=_NP0DzN0M_uKy&zH?qm=ou6QZsz3XCrZR9VG2?l2>CLkYrM8m~(FK^m91Dh~~Yufk_ke&@f6cf5K_cVf@OTX*8VA66y*gxKg8^-^KW zP8LqK7S4#4>pL9*eGP{lZ!Xq5mN57=+K^xY_LY&|_YlkHwz85^Q+x}Q5s25M>+x?&&Q z8O-jAWf4{lW;&TEuN!L?0+6#)7WboJxK-qKq=8BMC8Y=G;6Svq;ztDLTa9RsIL z;v4I}6WjVAfY8v;A0x@e1tzXbJxR)s`QFpy61!a&I%8Z_9s}2+?_!m&Xo#Lw zaf}*C{`yrURW~O{IG-Rf+1hpix~QWy*kA{8Q-REmt=a(ES+6G#>SdQlwY$3tj9$UA z#yc_RVnBD{JE#VP6VJD@vNNNezLfn@0wPN*yaV$@cg~?V6->G8I8r#5>OC_jjy3H< zBret;L%$#$Y;r`vq6O}>7FEwgtk9P6WRup8-t5 zcQh0cbHHnte|*|CQg6J>ZDPjopc^7aOHGAn+1+cR>|v975fO00?jozzkRE8I0C_z& zAW$Qcdo}tuF@HTvD1f%3?rPZ!F#*(Co(|L&ZB6TZcFlMywci}~g(LtdFezTx%ftX` z^8N4U>QbQ}!bb|9MHyXX7dM818-LR<5;UWODT7dWaFJkw)U%(DCaFs?ljrE>0X3}wa}L)FmYwOBVhq?l zv*adDMl%h!LJ0n!31M@$MQG&`&HerCy5HxiCIW@BK$&k3xtO+>QlNviHY_Db%-)6& zq6?=00(6(VJWW&!JMFrh>ivAutMpvH=6Ccf>TFx#u+yBSmv)_wewtht3{4i&vbi1& zTXa-t*tgEC!!K3;2s!Z3BgY4)BAT8+5LXC^T*~sPKdYQgepF}mT`oU1K5Kki(k#d* z0`aVpb$P=~@pNIjt@}&IsAb{NAhxqX5?I6?E2M)3Imvgj5V=d2} zJ9)LYqx@Q&(Tfyb6iz$WsHT{oX^u8ik`8~Sgs(+?e?`SOL*ogk)2Sk=!SRtDPv?~kqX+8%K;Y&p z)^XLH1o0WS@u|O%{uZ+sP!%8`gp)O7mbVb17x2P2Eo{9md&ogQRUYZc0%9zk<4Ctc zMsTSN6NXn)#kqiL(HNfxs`P>pUB_ zTY=XsYd$6R^oRqg^${!}sw8)Uf?PmKQA^1!+`>r@=4&Ml z$P1TRE(LgRINBkC$XUm>PO)t#^`?v?pkU`nZdbS|4}!D_HS;EIHYmxcOQs+_r{{w_ zT@Cc>B`0v&7h}o8Yr~fKq4crw!?H1(IU}>3!$SHfq`8vFRU+Zi~5~^`y$_8~{Sz zO&orEj3rZqgc;g_Q|$~GT=ptysrl&SXvA@XLAMfkSL!a?n%wEz(;gf=v|XO(HW0P- zGG^Nw=bUnCJXX&FCntD$1s9P#5T@CAWTew%Q>qQLp=Dm|eqfowVqp2T{$yq#&*0>w zMSfOA#Z8`arJI7Z+4yb^cy}CS#)EvT6K+l=e1w}Zh{ozfpQ`*=Ex=cJIicJzq1FAC zgScALtZVJVA-+a!(X-ZcAB%}O!wcM1_2ByTiVxVVVitInN)7oc_x*817dryKz9}UR zn5-g@5cMHLc?KNe>On9`6s~j8jgyu6*$M@GdXW}-ABx2He*@awl96i&<_EIi_v#RW zz}a_FIhLa@RtIy)v)c=KWf2ha{y`!aJ)RQUXq{ojY}S|f3~j(?ek{+wxam{NmR_zu zP~~z4Twj^WCGMoD8R2&(Pk+CnnR;pyhI|xntOJHYq_b#Oj z9y%rM4d0qO?h+IT{%JgZ)OZ%OU+5x~cDq-tTPK>!c&|}hVJjeE$vFLF!Xn03$j<%F zEV{Ukv0aM#hS2&4Cbs@j10}p2z_bs zUi*E8ii>OGFS!ILEd(*TJdF~x@Q)|*(6zJ$_I^kPDGFlR!>yl}jRljeXaT$Is6AK& z%`N50h@JKK%!Rf?lcQ-s@zaSLYHqSP$rB=j<#Y4Hw3_7FuDgsgO&6ZAq^`E zd{M`N+X$l(bKD|`5*{7>GC|Ur^=fH#^#_}G@^a(f_Rce*a6UB3Vb{xw7S}0V`c|aL zEtf**)+7>%oy#~jHa3^VUt9tm*7o-A?PY$^xvZzB$9DSkaZ~K$H1qsQIy9XoU;6mS z)qsVBj$667NXt1HhvSjpPwb|a#IsdTXY=`I5(6BI_yrG41vp0Tz z4o*%B^eAcBIymGp*ubwEz*#v#YJ^K-4n?*8gc}ysuT!OccOsRp!TY%v7ZV|AWMSu% z6dtLwk;wNQm>Y9b2O4OP`W_QXFCJCwwAnIi^aZvx_HsKy! z4^0jW_6s9??^=6&m)iXSJ1H1YXP|f2u~YJgD%wNgQ2jm@c7#~~LLxJ9zw@b3y;bQ# zU6~db_9K^SrUX_dza$)Pp;4mXpz$&rEj>!b8^u6;FV5T3b6|S<-duTIUERvo76`7W zTuI$f%z;f@h|!)Vwnf6Rr26`L2WnsS>Pldm&@XKLc-yadaYy;|Orn3_`U+?Zll~4C zR9$An=ha$^Tkh7^D{?Y;+N%^#-LBlbPn}y-I#-!y@X%9HSu9|`r<%I`iMG)Vzp-{3 zY!w8kOcSKcO-@d7HRt!~KRu^aM2=nDA~8%%OnBfXDqDzSRn8XEN9i9kC|3nVKdUC+ zhb;RF6;-2!+G9}5CEf5_YqH>sPvgJAiepTN`(;8;l+>uN2p=YyKMP0KEkJ6i_vgPk zQsejbcU+5VyK!>v2OFLQn3rdBU)nCo*$_bh`==%V^T#rZB0=uV24DV_XhYy0H5iNQ0H)n7=(CMPCE@1M=Sl zc%$}?bN#a_&jv7M9hK=X^?O+Qb+h7sJ`ze>{5t$3f zJIj6^Ij=gO0kuN*tSi&%S0}XuYHEcM^Hk+vq4Ce8J)H7l*QmA3xrpXDl~j!Iej(cuex-rP4qy3~y*zf%kjn=nR` z#nJFfzbDyQyoRk5m04yFMK?vhQ1Lc!(=?_pL284}R^hN?S|C9UN4@qa7ZG@xx}wVO zsCoNKa%Ud{;fpxyC2%M@m|W1ua#;cpI8@h!W6+%zY<3+LS-p72cV6@mhVv7MLdqS) zm+WkhgoUror=SP9Cx&kAm}aW=A!gRmaYw@2D;aqUwQo=?+ZjFRrWMV3`M$b?$tU_xkJB(vg?kr-=a;!4)7eH8KNXS)$_TEImDdr!3B-B)Yr!$+cNh=PJhEEan*vGPSXH<3hYO9vSi zDb*V|q#tOD8qt9|pH8CEvqv%l=PWOukr!4@;u-sc(Q9-@ul}DIEep2F{C{EeG5Vnn zTn&^~5%BCnxKR?@AC8j6SJyEZbN9q$*QJf|^<9#O$CQo%>T5YEam?h;n7(@#`(<0` zTP>oHetr$kLUOd({Py`u68Wey4bp(I;G0N}nVH7r0q zr~`juHmd7Cg81LN7gJVJY@-VJ&5FqM_;^?7DSkPBy!7<+w8G((`*6tzj^L|3T@2^w zWhuSJSsN}etM`(Kii)xh6YY7pWXpgbtAgn@+A@9RbFTxC+nxnU8y}5Ayzm|V%+~px z4~1Lomln8{*#uIN%Au!J=R5qYh zML!f6vjwM-Mr=OZTY5@~Z&jb#P9e!O6HwTcT?VFc#^BDMQT%PEt&N)Ya-^8G3IYh- zkiPD$$K}lI7i|x*({*{v?^KGar`&)B3Onr$;*5mz5B`3u^hf^s$2HT@K+^6Z0CaE9 za9b>VZ}Cg|#!TZ~JiihZkHPIi6>=E2Q-)+^WTfTgf6)&t*(ZYUbj5kU<>TYScWNoB zs;Q|-V9o^Bolj?A%DPUq%;@XuD^+7xRj>M=l=LrJ`_BUp3IJGG-Xk`{edTQ*V2!M^JmFQ9ygd{8o8am(yufDIvV=w#i~|8 Fe+6`e38Mf2 diff --git a/icons/obj/atmospherics/pipes/meter.dmi b/icons/obj/atmospherics/pipes/meter.dmi index c4cc27d78c4a09c789597c01138b218137e369fd..2816d22f43907fd3b40b97db2b6cc3d4cfa0b54c 100644 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^4}kap2OE%-ZOp$8q#jm=P@u; z%$a(5BiA7Vfny&nE4vo2Q_A(byUC-wWW{;~UE5s8wJIwg-L{U9(YaKY;`zY;#9syO zTdBYQIAl(I-EMKe%zV?9xT8_Fx2;T4I(x%(#?;j^3Kcp|7|s=~X7sc}kcUtO!* zG$o_7=xM0k@BFIrN44)&=EbTVXUX8bV02+!V;S?7+c(!T%J4i$U|?sqkT`IVfse<+ z;K6|gW@a$M;BV6^{)M}L*2n8!TQ$x5r;_){qAhOMeOB{7H2EpuSIz%$e&Ek^hP?~k zObCj4@{4!v)5N%%Q_~F@7+C5(T^vIy=DfXY=%<`6(eO|)s#EW;m!?u7lV8JXlbtLf zCM7$a-#K(W@LuA{s{Vk*LsRK3uhPUelMO~UGagH_#l5MNZ`<84M26xE9Z0n&RfmUo+#1R-|t@k z@%HW87w0p3Zz^p#Y{290?jBwL=I-6QFRYopjkOLWO0;!%ck9aq{rmL#{CT-W|NdUz zuD{bizO=OT>(RpxH*el-UOgjw-_PQ6^WWMh{`>Rzd;0bR|7YtSc)#!e!<%ojt!!-m z{0TF-|L1F!?dd;r?=*b>{(b&^u4msr>+9=Z{yBTQej@WM`^yxqSKZXS4q&vEPmnPTLw~DZhZew(Z46W zJL1+auhV+71?Y*}-~TW1zMLN?y?=+#pJ%2&&&J>TvpoOb=g*(N%xJRQ_g|g$N1WgC zl{&Tmo<4nQz~fwHci7-dJ>Sij9`7HP%=%Tbr0Cye=LK2+gg-C7JaO7S#$1Na&u8tQ zEPa8^pg#VY|GkE%{{O2!&&dB5BXf>PaeYhU1O`PF2M$gFC#DwCnU?YwYCa$SIeA?V z@6xlIe|D`-IdA#j^*J-&VWacQqksLeYN-9R=<-A@@A>~rtS%dHBwWAQAbf-2Oscy1 z0^S4rW{51{W%xWpBtdrW&u8yX*F0x-I-#AYK)!px-nfv%IB(7xIkWuxvwm{V-~a1n z;^(sPXS8z|NZWrJAcf+zCK%ScBC(EHZbt@?@G@<_oeXh+roXD6(3x+%{$O9{r*=9 z^Q`%&&$F+2ZvXdhKQKWa;xJqA^S|wWyZQMaKZj3#cDupg&>iUumjw*&E#J9s0xt)l zNYnjy^v3F|tM+m0%m6BeJMUPk}_0RI3pK0W|5W&i;HGynfH0RI4)|1-eAz^IP)RR9100d!JM zQvg8b*k%9#0K|G!Sad{Xb7OL8aCB*JZU6vyoQ;z)3&JoEh3Di~gmx{`+_i2l(jpz~ z>?VbtHqa`hLGj-kbr6ceBg?zvdxUSe)NJcr)0%4E=$rW2T`y*1idC-F-SuIJ1Cv&R zxbqM`!yLLGF(#7)@rOjK-uXE$tX3!AP4ddI)63XBVl1z>;kh#i-LrLjDiIU zmMFN!KtinvwIP-{Z13AJX_no(;;tr@ju)S6N2e?Rm0dTbWoqK39oQ@7Row4c`C z6#RjrS?&M;0ewkCK~!jg?V7<&!$1&4?Gh-#Py#K)2c&R9R1l>C%M~C>@PT_SoTGHW z1&J2ug@s%)J7||#?^p?X@AfS#GhedT|4V5a09c0h>WG(a+Up-WFWs~^x8HPLI$T(- z`p1XPOCK+6H}ZyYkox(lSceODFLHyrdKm{(v_Y(m4qml`!`|jV-oH!f*&F8c5|63( zi{^e*cpr8E00933`oWp>gLGQn)$Rwm>}l=?@rF6A(|AIg({kRy`dvFP2gbb|5H%cc2lNB_0RR9%4ctG0=8w2}fHj8L2N;8teSk6V7Y(pv&5{A8 yyk9cF-GM3Z7Y*=r;Qp9;zi9491$iIfviSlY+i$Jdy=2n>0000