From eb2f1a3d2b95a9dff3aeda00b322f7653614e278 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Tue, 16 Jun 2026 04:04:59 +0100 Subject: [PATCH] Route main menu settings through commits --- .voidbot/state/aetheria.cc | Bin 144421 -> 144850 bytes Aetheria.State.Verify/Program.cs | 82 +++++++++++-------- Assets/Scripts/Gameplay/ActionGameManager.cs | 30 +++++++ Assets/Scripts/UI/MainMenu.cs | 11 ++- docs/aetheria-perfect-machine-map.md | 11 ++- 5 files changed, 88 insertions(+), 46 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index a71310eb60c1b9f2b2fe149d252b36f1da961958..fe58beeda4f0dcb655209abccdb7b7f68fe4d535 100644 GIT binary patch delta 1143 zcmZXU&ubJh6vxe4r9V6fts+JAAu3jO*R@sqLk}WKRcMh~5%!kOWOiaR$(m%k?5XIj zM_FV%h$vRYdQpn32-1^BLDWm7q8@~T2Y>tpzRb2=tCyLOd3pJKzwga^u-y9Yd+XEL z%$B~PLf=qte|~VVw|IkWtG&+5bTsw`@`XYn+1iuYS&KL7l|Z+7Bn@nB*`3*UbH1nL z`KS7=aq^}+S@@0Tm%o;$&x}wma}kpV`+KB zz*AAgEkw+Q$~XB3o}fJXNIG1$5tmFV5K5LXA2o)Tq*+bx@?@cePj_Dq0;MCG-k1fY zp`>X!sJE*UYn`dK?hQqe37vX0MT@ZG-D5 z!G;u(V@oZ=HAAI{rX*gau3!qcq|%40F^g-r`*uy6{3FYx3;9Skj^lv{)uCpTra6=LJ+&B-iFcI68t%~NB8K4>spI)<2RU~>p zQBA4Q6CaJyc^D5lh6pp6_ElN|JmM$jIxqjzSQ9FiKGjv%5>8YQBO^=MIjYY!9C6n<9j~3K`8IbV$phJ({0zwHt?NoMN~7c#kWO+c`4y1e$;md-Qv33u z{lL)0P*sLkT6DG1W+%Dy9~u>Fk6piy-MKiLJS&lb+PC-HJOBT9K6wJAyD92~jT|%q+D1wL4J!1E43GqyPW_ delta 888 zcmZ8gF=!M)6!rF^L`|h3QH$h@jq%Qqi(+_U za?#aW6ffB*PwM_cXOy~>r3+d@7*)g zl}H#KAo!9wGBTi08>uk4w^LlJ%!(Bhw2bGNKp%vpHsPWIF0^3;WCnE$;v8@+_z{MR z3#0R(Lllk%TcN|#wNwx?MXYT&T5-dP$>9oZ-Dt|IG}QqU4mIo0 zXR!w3A!#s?66ipKD~77aeM}y0pS~%pLbvJVQslvr_7e3nt+^`#g5<%DRH~|lk3xsM zQMsYJ=^~$wP2PMQWG_2{(T4jzcuWHWjpUE8Eyl~*;~`ajaz?{pAu@)3#$yJmil+fi zH)qeJF~kjT$?u(kNeWLw2bwqS3S1?rtD)3nBf5Tj7Fc9FNpvyAYrNX|f0^F3C)1KB zMTD>rgQC;r!i5g$`@TC>8jt#2kNmhSz%=K}6eJC^Wf0Ke1W4nYe44$0CBzT{xsuWw zS!K$h^9cQ9?0fG;?IA@|<%YNf%&Z{jNG&oOhc}q8Npb}j_4bkFtp}Nnsru7vnLGL3 z(Q;v&zTwjN`24zIF71c)vrCzuM>pSp{dBH=YB}@pMN !actionGameManager.Contains(symbol, StringComparison.Ordinal)) + .ToArray(); + + if (missingCommits.Length > 0) { throw new InvalidOperationException( - "MainMenu no longer exposes a shared typed player-settings commit return path."); + "ActionGameManager no longer owns complete runtime player-settings commit primitives: " + + string.Join(", ", missingCommits)); } - var graphicsSettings = ExtractMethodBody(source, "ShowGraphicsSettings"); - if (!graphicsSettings.Contains("CommitRuntimeSettingsAndReturn", StringComparison.Ordinal)) + var forbiddenSymbols = new[] + { + "ActionGameManager.RuntimePlayerSettings.Name =", + "ActionGameManager.RuntimePlayerSettings.GameplaySettings.TemperatureUnit =", + "ActionGameManager.RuntimePlayerSettings.GameplaySettings.SignificantDigits =", + "ActionGameManager.RuntimePlayerSettings.GraphicsSettings.NebulaQuality =", + "ActionGameManager.RuntimePlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap =" + }; + + var hits = File.ReadLines(mainMenuPath) + .Select((line, index) => new { LineNumber = index + 1, Line = line }) + .Where(line => forbiddenSymbols.Any(symbol => line.Line.Contains(symbol, StringComparison.Ordinal))) + .Select(line => $"{Path.GetRelativePath(root, mainMenuPath)}:{line.LineNumber}: {line.Line.Trim()}") + .ToArray(); + + if (hits.Length > 0) { throw new InvalidOperationException( - "MainMenu graphics settings can return without queuing the typed player-settings commit."); + "MainMenu still owns direct RuntimePlayerSettings mutation: " + + string.Join("; ", hits)); } - var gameplaySettings = ExtractMethodBody(source, "ShowGameplaySettings"); - if (!gameplaySettings.Contains("CommitRuntimeSettingsAndReturn", StringComparison.Ordinal)) + var missingUiCalls = requiredCommits + .Where(symbol => !source.Contains("ActionGameManager." + symbol, StringComparison.Ordinal)) + .ToArray(); + + if (missingUiCalls.Length > 0) { throw new InvalidOperationException( - "MainMenu gameplay settings can return without queuing the typed player-settings commit."); + "MainMenu no longer routes settings changes through ActionGameManager: " + + string.Join(", ", missingUiCalls)); } } @@ -1178,33 +1215,6 @@ static void RequireDockedCurrentShipCommitAuthority(string root) } } -static string ExtractMethodBody(string source, string methodName) -{ - var signature = "private void " + methodName + "()"; - var signatureIndex = source.IndexOf(signature, StringComparison.Ordinal); - if (signatureIndex < 0) - throw new InvalidOperationException($"Cannot find MainMenu.{methodName} for settings authority verification."); - - var braceIndex = source.IndexOf('{', signatureIndex); - if (braceIndex < 0) - throw new InvalidOperationException($"Cannot find MainMenu.{methodName} body for settings authority verification."); - - var depth = 0; - for (var index = braceIndex; index < source.Length; index++) - { - if (source[index] == '{') - depth++; - else if (source[index] == '}') - { - depth--; - if (depth == 0) - return source.Substring(braceIndex, index - braceIndex + 1); - } - } - - throw new InvalidOperationException($"MainMenu.{methodName} body is not balanced."); -} - static bool ContainsBehaviorValueKind(AetheriaBehaviorValue value, string kind) { return string.Equals(value.Kind, kind, StringComparison.OrdinalIgnoreCase) || diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 93c00996b..c065e065f 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -85,6 +85,36 @@ public class ActionGameManager : MonoBehaviour QueueRuntimePlayerSettingsCommit(); } + public static void CommitRuntimePlayerName(string name) + { + RuntimePlayerSettings.Name = name ?? ""; + QueueRuntimePlayerSettingsCommit(); + } + + public static void CommitRuntimeTemperatureUnit(TemperatureUnit unit) + { + RuntimePlayerSettings.GameplaySettings.TemperatureUnit = unit; + QueueRuntimePlayerSettingsCommit(); + } + + public static void CommitRuntimeSignificantDigits(int significantDigits) + { + RuntimePlayerSettings.GameplaySettings.SignificantDigits = significantDigits; + QueueRuntimePlayerSettingsCommit(); + } + + public static void CommitRuntimeNebulaQuality(Quality quality) + { + RuntimePlayerSettings.GraphicsSettings.NebulaQuality = quality; + QueueRuntimePlayerSettingsCommit(); + } + + public static void CommitRuntimeShowAsteroidsInMinimap(bool show) + { + RuntimePlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap = show; + QueueRuntimePlayerSettingsCommit(); + } + private static RuntimePlayerSettings CreateDefaultRuntimePlayerSettings() { var settings = new RuntimePlayerSettings(); diff --git a/Assets/Scripts/UI/MainMenu.cs b/Assets/Scripts/UI/MainMenu.cs index 9c624146c..0e4bf36f2 100644 --- a/Assets/Scripts/UI/MainMenu.cs +++ b/Assets/Scripts/UI/MainMenu.cs @@ -213,14 +213,14 @@ public class MainMenu : MonoBehaviour _nextMenu.panel.Title.text = TitleSubtitle("gameplay", "settings"); _nextMenu.panel.AddField("Name", () => ActionGameManager.RuntimePlayerSettings.Name, - s => ActionGameManager.RuntimePlayerSettings.Name = s); + ActionGameManager.CommitRuntimePlayerName); _nextMenu.panel.AddField("Temperature Unit", () => (int) ActionGameManager.RuntimePlayerSettings.GameplaySettings.TemperatureUnit, - i => ActionGameManager.RuntimePlayerSettings.GameplaySettings.TemperatureUnit = (TemperatureUnit) i, + i => ActionGameManager.CommitRuntimeTemperatureUnit((TemperatureUnit) i), Enum.GetNames(typeof(TemperatureUnit))); _nextMenu.panel.AddField("Significant Digits", () => ActionGameManager.RuntimePlayerSettings.GameplaySettings.SignificantDigits, - i => ActionGameManager.RuntimePlayerSettings.GameplaySettings.SignificantDigits = i); + ActionGameManager.CommitRuntimeSignificantDigits); _nextMenu.panel.AddButton("Back", CommitRuntimeSettingsAndReturn); } @@ -233,13 +233,13 @@ public class MainMenu : MonoBehaviour () => (int)ActionGameManager.RuntimePlayerSettings.GraphicsSettings.NebulaQuality, i => { - ActionGameManager.RuntimePlayerSettings.GraphicsSettings.NebulaQuality = (Quality)i; + ActionGameManager.CommitRuntimeNebulaQuality((Quality)i); CloudRenderer.quality = ActionGameManager.RuntimePlayerSettings.GraphicsSettings.NebulaQuality; }, Enum.GetNames(typeof(Quality))); _nextMenu.panel.AddField("Show Asteroids in Minimap", () => ActionGameManager.RuntimePlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap, - b => ActionGameManager.RuntimePlayerSettings.GraphicsSettings.ShowAsteroidsInMinimap = b); + ActionGameManager.CommitRuntimeShowAsteroidsInMinimap); _nextMenu.panel.AddButton("Back", CommitRuntimeSettingsAndReturn); } @@ -270,7 +270,6 @@ public class MainMenu : MonoBehaviour private void CommitRuntimeSettingsAndReturn() { - ActionGameManager.QueueRuntimePlayerSettingsCommit(); ShowSettings(); Fade(false); } diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index 8d67c313f..551c58a34 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -86,10 +86,9 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. pointer into the typed Verse replacement for `PlayerSettings.msgpack`: player name, tutorial flag, story-file hash cursors, gameplay formatting, graphics preferences, input binding overrides, and action-bar inputs. Unity's menu and - input screens mutate `RuntimePlayerSettings` in memory and queue typed Verse - commits through shared player-settings commit primitives. Gameplay and - graphics settings now return through the same main-menu commit primitive; the - in-memory projection is not portable state authority. Aetheria has its own + input screens route edits through named player-settings commit primitives that + mutate the session `RuntimePlayerSettings` projection and queue typed Verse + commits. The in-memory projection is not portable state authority. Aetheria has its own remapping UI that calls Unity's InputSystem at the binding/action layer; Unity's generated `AetheriaInput` class is the edge consumer of typed binding overrides, not @@ -1600,6 +1599,10 @@ First Aetheria surfaces to publish: - Done: route main-menu graphics settings returns through the same typed player-settings commit primitive as gameplay settings, so graphics edits no longer survive only as session-local `RuntimePlayerSettings`. + - Done: route main-menu player name, gameplay formatting, and graphics + preference edits through named `ActionGameManager` commit methods. MainMenu + reads the `RuntimePlayerSettings` projection for display, but no longer + assigns its player/gameplay/graphics fields directly. - Remaining: delete or quarantine old cache abstractions that no longer protect an invariant once catalog migration has a typed reader.