using SVSim.BattleNode.Lifecycle; using SVSim.BattleNode.Protocol; namespace SVSim.BattleNode.Sessions.Dispatch.Handlers; internal sealed class LoadedHandler : IFrameHandler { public IReadOnlyList Handle(FrameDispatchContext ctx) { // case 3: Bot — silent (client populates opponent state from AIBattleStart HTTP data). if (ctx.Type == BattleType.Bot && ctx.SenderPhase == BattleSessionPhase.AwaitingLoaded) { ctx.SenderPhase = BattleSessionPhase.AwaitingSwap; return Array.Empty(); } // case 6: general — BattleStart (per-perspective) + Deal to the sender. if (ctx.SenderPhase == BattleSessionPhase.AwaitingLoaded) { // A goes first deterministically (turnState 0); B goes second (turnState 1). var turnState = ReferenceEquals(ctx.From, ctx.A) ? 0 : 1; var r = new List { new(ctx.From, ServerBattleFrames.BuildBattleStart( ctx.From.Context, ctx.Other.Context, ctx.From.ViewerId, turnState), false), new(ctx.From, ServerBattleFrames.BuildDeal(), false), }; ctx.SenderPhase = BattleSessionPhase.AwaitingSwap; return r; } return Array.Empty(); } }