feat(app): FA2 -- fellowship/allegiance command routing for graphical + headless hosts

Both LiveSocialSessionBindings construction sites updated together
(LiveSessionRuntimeFactory.cs, HeadlessSessionHost.cs) so the single
GameEventWiring.WireAll registration site serves both hosts identically
(the K-slice unification). CurrentGameRuntimeCommandAdapter implements
IRuntimeFellowshipCommands/IRuntimeAllegianceCommands over the App
command bus (LiveSessionCommandRouter gains 12 new *RuntimeCmd records
+ registrations + LiveSessionCommandBindings send delegates), mirroring
DirectGameRuntimeCommandAdapter's direct-session shape including the
identical Quit leader-hand-off rule read from RuntimeFellowshipState.
CurrentGameRuntimeAdapter (the graphical IGameRuntimeView/
IGameRuntimeCommands composite) exposes the two new views/command
groups. Headless's DirectGameRuntimeCommandAdapter needed no changes --
it already implements both new interfaces from the Runtime-layer
commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-12 01:32:18 +02:00
parent 369729f06a
commit cced83b483
8 changed files with 363 additions and 3 deletions

View file

@ -234,6 +234,8 @@ public sealed class InteractionUiRuntimeSourcesTests
public IRuntimeCharacterView Character => null!;
public IRuntimeSocialView Social => null!;
public IRuntimeChatView Chat => null!;
public IRuntimeFellowshipView Fellowship => null!;
public IRuntimeAllegianceView Allegiance => null!;
public IRuntimeActionView Actions => null!;
public IRuntimeMovementView Movement => null!;
public AcDream.Runtime.World.IRuntimeWorldEnvironmentView Environment =>
@ -250,6 +252,8 @@ public sealed class InteractionUiRuntimeSourcesTests
IRuntimeSpellbookCommands IGameRuntimeCommands.Spellbook => this;
IRuntimeCharacterCommands IGameRuntimeCommands.Character => this;
IRuntimeSocialCommands IGameRuntimeCommands.Social => null!;
IRuntimeFellowshipCommands IGameRuntimeCommands.Fellowship => null!;
IRuntimeAllegianceCommands IGameRuntimeCommands.Allegiance => null!;
public RuntimeStateCheckpoint CaptureCheckpoint() => default;

View file

@ -227,6 +227,8 @@ public sealed class GameplayInputCommandControllerTests
throw new NotSupportedException();
public IRuntimeSocialView Social => throw new NotSupportedException();
public IRuntimeChatView Chat => throw new NotSupportedException();
public IRuntimeFellowshipView Fellowship => throw new NotSupportedException();
public IRuntimeAllegianceView Allegiance => throw new NotSupportedException();
public IRuntimeActionView Actions => throw new NotSupportedException();
public IRuntimeMovementView Movement => throw new NotSupportedException();
public AcDream.Runtime.World.IRuntimeWorldEnvironmentView Environment =>

View file

@ -617,6 +617,18 @@ public sealed class LiveSessionCommandRouterTests
CharacterState: characterState ?? new RuntimeCharacterState(),
SendSingleCharacterOption: sendSingleCharacterOption ?? ((_, _) => { }),
SaveCharacterOptions: saveCharacterOptions ?? (() => { }),
SendFellowshipCreate: (_, _) => { },
SendFellowshipRecruit: _ => { },
SendFellowshipDismiss: _ => { },
SendFellowshipQuit: _ => { },
SendFellowshipAssignNewLeader: _ => { },
SendFellowshipChangeOpenness: _ => { },
SendFellowshipUpdateRequest: _ => { },
SendAllegianceSwear: _ => { },
SendAllegianceBreak: _ => { },
SendAllegianceKick: _ => { },
SendAllegianceInfoRequest: _ => { },
SendAllegianceUpdateRequest: _ => { },
Log: log));
[MethodImpl(MethodImplOptions.NoInlining)]