]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Accurate temperature alerts (#19913)
authorErrant <35878406+Errant-4@users.noreply.github.com>
Wed, 18 Oct 2023 18:05:15 +0000 (20:05 +0200)
committerGitHub <noreply@github.com>
Wed, 18 Oct 2023 18:05:15 +0000 (10:05 -0800)
Content.Server/Temperature/Systems/TemperatureSystem.cs

index 4796704d27be1ec69432e882a8428dc5a63a4135..0dc5e9391af8da22249f468623372d8569e7d3c0 100644 (file)
@@ -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<TemperatureComponent>(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<ThermalRegulatorComponent>(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;
         }
     }