From 064cb8797e3921051de9287cdfac9a9258722c7e Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:05:15 +0200 Subject: [PATCH] Accurate temperature alerts (#19913) --- .../Temperature/Systems/TemperatureSystem.cs | 67 ++++++++++++------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index 4796704d27..0dc5e9391a 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Components; using Content.Server.Temperature.Components; using Content.Shared.Alert; using Content.Shared.Atmos; @@ -133,41 +134,57 @@ public sealed class TemperatureSystem : EntitySystem private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) { - switch (args.CurrentTemperature) + AlertType type; + float threshold; + float idealTemp; + + if (!TryComp(uid, out var temperature)) { - // Cold strong. - case <= 260: - _alerts.ShowAlert(uid, AlertType.Cold, 3); - break; + _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + return; + } - // Cold mild. - case <= 280 and > 260: - _alerts.ShowAlert(uid, AlertType.Cold, 2); - break; + if (TryComp(uid, out var regulator) && + regulator.NormalBodyTemperature > temperature.ColdDamageThreshold && + regulator.NormalBodyTemperature < temperature.HeatDamageThreshold) + { + idealTemp = regulator.NormalBodyTemperature; + } + else + { + idealTemp = (temperature.ColdDamageThreshold + temperature.HeatDamageThreshold) / 2; + } - // Cold weak. - case <= 292 and > 280: - _alerts.ShowAlert(uid, AlertType.Cold, 1); - break; + if (args.CurrentTemperature <= idealTemp) + { + type = AlertType.Cold; + threshold = temperature.ColdDamageThreshold; + } + else + { + type = AlertType.Hot; + threshold = temperature.HeatDamageThreshold; + } - // Safe. - case <= 327 and > 292: - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + // Calculates a scale where 1.0 is the ideal temperature and 0.0 is where temperature damage begins + // The cold and hot scales will differ in their range if the ideal temperature is not exactly halfway between the thresholds + var tempScale = (args.CurrentTemperature - threshold) / (idealTemp - threshold); + switch (tempScale) + { + case <= 0f: + _alerts.ShowAlert(uid, type, 3); break; - // Heat weak. - case <= 335 and > 327: - _alerts.ShowAlert(uid, AlertType.Hot, 1); + case <= 0.4f: + _alerts.ShowAlert(uid, type, 2); break; - // Heat mild. - case <= 360 and > 335: - _alerts.ShowAlert(uid, AlertType.Hot, 2); + case <= 0.66f: + _alerts.ShowAlert(uid, type, 1); break; - // Heat strong. - case > 360: - _alerts.ShowAlert(uid, AlertType.Hot, 3); + case > 0.66f: + _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); break; } } -- 2.51.2