using SVSim.BattleNode.Lifecycle; using SVSim.BattleNode.Protocol; namespace SVSim.BattleNode.Sessions.Dispatch.Handlers; internal sealed class InitBattleHandler : IFrameHandler { public IReadOnlyList Handle(FrameDispatchContext ctx) { // case 2: Bot — ack only, NO Matched (Matched would corrupt client opponent info). if (ctx.Type == BattleType.Bot && ctx.SenderPhase == BattleSessionPhase.AwaitingInitBattle) { var r = new List { new(ctx.From, BattleFrames.BuildAck(NetworkBattleUri.InitBattle), true), }; ctx.SenderPhase = BattleSessionPhase.AwaitingLoaded; return r; } // case 5: general — push Matched (per-perspective) to the sender only. if (ctx.SenderPhase == BattleSessionPhase.AwaitingInitBattle) { var r = new List { new(ctx.From, ServerBattleFrames.BuildMatched( ctx.From.Context, ctx.Other.Context, ctx.From.ViewerId, ctx.Other.ViewerId, ctx.BattleId, BattleFrameDefaults.BattleSeed), false), }; ctx.SenderPhase = BattleSessionPhase.AwaitingLoaded; return r; } return Array.Empty(); } }