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,42 +134,58 @@ 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); + _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + return; + } + + if (TryComp(uid, out var regulator) && + regulator.NormalBodyTemperature > temperature.ColdDamageThreshold && + regulator.NormalBodyTemperature < temperature.HeatDamageThreshold) + { + idealTemp = regulator.NormalBodyTemperature; + } + else + { + idealTemp = (temperature.ColdDamageThreshold + temperature.HeatDamageThreshold) / 2; + } + + if (args.CurrentTemperature <= idealTemp) + { + type = AlertType.Cold; + threshold = temperature.ColdDamageThreshold; + } + else + { + type = AlertType.Hot; + threshold = temperature.HeatDamageThreshold; + } + + // 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; - // Cold mild. - case <= 280 and > 260: - _alerts.ShowAlert(uid, AlertType.Cold, 2); + case <= 0.4f: + _alerts.ShowAlert(uid, type, 2); break; - // Cold weak. - case <= 292 and > 280: - _alerts.ShowAlert(uid, AlertType.Cold, 1); + case <= 0.66f: + _alerts.ShowAlert(uid, type, 1); break; - // Safe. - case <= 327 and > 292: + case > 0.66f: _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); break; - - // Heat weak. - case <= 335 and > 327: - _alerts.ShowAlert(uid, AlertType.Hot, 1); - break; - - // Heat mild. - case <= 360 and > 335: - _alerts.ShowAlert(uid, AlertType.Hot, 2); - break; - - // Heat strong. - case > 360: - _alerts.ShowAlert(uid, AlertType.Hot, 3); - break; } }