From 4464f5cdcece584f39f37655bca67e04a869b598 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 21 Jun 2026 23:17:00 +0100 Subject: [PATCH] Move HUD thermal risk into runtime render settings --- Aetheria.State.Verify/Program.cs | 22 +++++++++++++++++++ Assets/Scripts/Gameplay/ActionGameManager.cs | 4 +++- Assets/Scripts/UI/HUD/SchematicDisplay.cs | 4 +++- .../AetheriaRuntimeDaemonRenderQueries.cs | 17 +++++++++++++- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index d881dcd33..beca6b5d3 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -1818,6 +1818,9 @@ static void RequireDaemonRenderQueryAuthority(string root) "public readonly struct AetheriaRuntimeDaemonRenderSettings", "public readonly struct AetheriaRuntimeExponentialCurve", "public double ConvergenceMinimumDistance { get; }", + "public double HypothermiaTemperature { get; }", + "public double HeatstrokeTemperature { get; }", + "public double NormalizeThermalRisk(double temperature)", "public AetheriaRuntimeExponentialCurve TemperatureEmissionCurve { get; }", "public static AetheriaRuntimeGravityInfluenceBrush[] QueryGravityInfluences(", "AetheriaRuntimeZoneSnapshotCommit? zone", @@ -2149,6 +2152,25 @@ static void RequireDaemonRenderQueryAuthority(string root) "EntityInstance no longer resolves convergence from daemon target projection: " + string.Join(", ", missingEntityInstanceSymbols)); } + + var schematicDisplayPath = Path.Combine(root, "Assets", "Scripts", "UI", "HUD", "SchematicDisplay.cs"); + var schematicDisplay = File.Exists(schematicDisplayPath) + ? File.ReadAllText(schematicDisplayPath) + : throw new InvalidOperationException("Cannot verify HUD thermal presentation authority; SchematicDisplay.cs is missing."); + if (schematicDisplay.Contains("Settings.GameplaySettings.HypothermiaTemperature", StringComparison.Ordinal) || + schematicDisplay.Contains("Settings.GameplaySettings.HeatstrokeTemperature", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "SchematicDisplay must normalize cockpit thermal risk through shared daemon render settings instead of Unity GameSettings."); + } + + if (!schematicDisplay.Contains("ZoneRenderer.RenderSettings.NormalizeThermalRisk(", StringComparison.Ordinal) || + !actionGameManager.Contains("Settings.GameplaySettings.HypothermiaTemperature", StringComparison.Ordinal) || + !actionGameManager.Contains("Settings.GameplaySettings.HeatstrokeTemperature", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "HUD thermal presentation no longer flows through the shared daemon render settings bridge."); + } } static void RequireTypedZoneConstructionKeys(string root) diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 0a73c328e..972d418c3 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -569,7 +569,9 @@ public class ActionGameManager : MonoBehaviour emissionCurve.Exponent, emissionCurve.Multiplier, emissionCurve.Constant), - Settings.GameplaySettings.ConvergenceMinimumDistance); + Settings.GameplaySettings.ConvergenceMinimumDistance, + Settings.GameplaySettings.HypothermiaTemperature, + Settings.GameplaySettings.HeatstrokeTemperature); } private readonly (float2 direction, string name)[] _directions = { diff --git a/Assets/Scripts/UI/HUD/SchematicDisplay.cs b/Assets/Scripts/UI/HUD/SchematicDisplay.cs index c4fc6e4fa..9f2f47308 100644 --- a/Assets/Scripts/UI/HUD/SchematicDisplay.cs +++ b/Assets/Scripts/UI/HUD/SchematicDisplay.cs @@ -193,7 +193,9 @@ public class SchematicDisplay : MonoBehaviour HeatstrokeMeterFill.anchorMax = new Vector2(_entity.Heatstroke, 1); HypothermiaMeterFill.anchorMax = new Vector2(_entity.Hypothermia, 1); - HeatstrokeLimitFill.anchorMax = new Vector2(unlerp(Settings.GameplaySettings.HypothermiaTemperature, Settings.GameplaySettings.HeatstrokeTemperature, _cockpit.Item.Temperature), 1); + HeatstrokeLimitFill.anchorMax = new Vector2( + (float)ActionGameManager.Instance.ZoneRenderer.RenderSettings.NormalizeThermalRisk(_cockpit.Item.Temperature), + 1); } SensorCooldownFill.anchorMax = new Vector2(_entity.Sensor?.Cooldown ?? 0, 1); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs index 985200e7b..9def43d8f 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonRenderQueries.cs @@ -51,14 +51,29 @@ namespace GameCult.Aetheria.State.Verse { public AetheriaRuntimeDaemonRenderSettings( AetheriaRuntimeExponentialCurve temperatureEmissionCurve, - double convergenceMinimumDistance) + double convergenceMinimumDistance, + double hypothermiaTemperature, + double heatstrokeTemperature) { TemperatureEmissionCurve = temperatureEmissionCurve; ConvergenceMinimumDistance = convergenceMinimumDistance; + HypothermiaTemperature = hypothermiaTemperature; + HeatstrokeTemperature = heatstrokeTemperature; } public AetheriaRuntimeExponentialCurve TemperatureEmissionCurve { get; } public double ConvergenceMinimumDistance { get; } + public double HypothermiaTemperature { get; } + public double HeatstrokeTemperature { get; } + + public double NormalizeThermalRisk(double temperature) + { + var range = HeatstrokeTemperature - HypothermiaTemperature; + if (range <= 0) + return temperature >= HeatstrokeTemperature ? 1.0 : 0.0; + + return Math.Max(0.0, Math.Min(1.0, (temperature - HypothermiaTemperature) / range)); + } } public readonly struct AetheriaRuntimeGravityInfluenceBrush