refactor(runtime): cut graphical host over to canonical root

Make every App composition phase borrow one GameRuntime, retire the duplicate view/event adapters, and dispose the root only after its graphical borrowers release. This preserves synchronous UI commands while giving shutdown one exact ownership ledger.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-26 19:06:09 +02:00
parent ecb9f79444
commit ce41efb9e5
29 changed files with 613 additions and 778 deletions

View file

@ -36,10 +36,14 @@ public sealed class RuntimeMovementOwnershipTests
app,
StringComparison.Ordinal);
Assert.Empty(Regex.Matches(app, @"\bbool\s+_autoRunActive\b"));
Assert.Single(Regex.Matches(
Assert.Empty(Regex.Matches(
app,
@"RuntimeLocalPlayerMovementState\s+\w+\s*=\s*new\s*\(")
.Cast<Match>());
Assert.Single(Regex.Matches(
runtime,
@"new\s+RuntimeLocalPlayerMovementState\s*\(")
.Cast<Match>());
Assert.DoesNotContain(
"ACDREAM_RUN_SKILL",
runtime,
@ -59,10 +63,10 @@ public sealed class RuntimeMovementOwnershipTests
root,
"Input",
"DispatcherMovementInputSource.cs");
string view = ReadAppSource(
string adapter = ReadAppSource(
root,
"Runtime",
"CurrentGameRuntimeViewAdapter.cs");
"CurrentGameRuntimeAdapter.cs");
string commands = ReadAppSource(
root,
"Runtime",
@ -73,7 +77,11 @@ public sealed class RuntimeMovementOwnershipTests
"GameWindowLifetime.cs");
Assert.Contains(
"RuntimeLocalPlayerMovementState _playerControllerSlot = new();",
"RuntimeLocalPlayerMovementState _playerControllerSlot =>",
gameWindow,
StringComparison.Ordinal);
Assert.Contains(
"_runtime.MovementOwner;",
gameWindow,
StringComparison.Ordinal);
Assert.Contains(
@ -90,16 +98,16 @@ public sealed class RuntimeMovementOwnershipTests
StringComparison.Ordinal);
Assert.Contains("_movement.AutoRunActive", input, StringComparison.Ordinal);
Assert.Contains(
"movement ?? throw new ArgumentNullException(nameof(movement))).View",
view,
"private readonly GameRuntime _runtime;",
adapter,
StringComparison.Ordinal);
Assert.Contains("_movement.Execute(command)", commands, StringComparison.Ordinal);
Assert.Contains(
"RuntimeLocalPlayerMovementState Movement",
"GameRuntime Runtime",
lifetime,
StringComparison.Ordinal);
Assert.Contains(
"\"runtime local movement state\"",
"\"game runtime root\"",
lifetime,
StringComparison.Ordinal);
}