diff --git a/SVSim.BattleNode/Sessions/Dispatch/Handlers/TurnEndHandler.cs b/SVSim.BattleNode/Sessions/Dispatch/Handlers/TurnEndHandler.cs index 9f29501..27c18af 100644 --- a/SVSim.BattleNode/Sessions/Dispatch/Handlers/TurnEndHandler.cs +++ b/SVSim.BattleNode/Sessions/Dispatch/Handlers/TurnEndHandler.cs @@ -1,4 +1,5 @@ using SVSim.BattleNode.Protocol; +using SVSim.BattleNode.Protocol.Bodies; namespace SVSim.BattleNode.Sessions.Dispatch.Handlers; @@ -16,15 +17,11 @@ internal sealed class TurnEndHandler : IFrameHandler { if (ctx.Type == BattleType.Pvp && ctx.BothAfterReady()) { - var te = BattleFrames.BuildTurnEndBroadcast(); - var jg = BattleFrames.BuildJudgeBroadcast(); - return new[] - { - new DispatchRoute(ctx.From, te, false), - new DispatchRoute(ctx.Other, te, false), - new DispatchRoute(ctx.From, jg, false), - new DispatchRoute(ctx.Other, jg, false), - }; + // Opponent sees {turnState}; receiving TurnEnd drives its SendJudge (handover gate). + // battleCode/actionSeq/cemetery are dropped. The paired Judge{spin} is emitted by + // JudgeHandler when the active player sends its own Judge frame. + var te = ctx.Env with { Body = new TurnEndBody(TurnState: 0) }; + return new[] { new DispatchRoute(ctx.Other, te, false) }; } if (ctx.Type == BattleType.Scripted) return new[] { new DispatchRoute(ctx.Other, ctx.Env, false) }; diff --git a/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs b/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs index 3ffe5d3..ed3be3a 100644 --- a/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs +++ b/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs @@ -518,7 +518,7 @@ public class BattleSessionDispatchTests } [Test] - public void Pvp_TurnEnd_from_A_in_BothAfterReady_broadcasts_TurnEnd_plus_Judge_to_both() + public void Pvp_TurnEnd_from_A_emits_turnState_to_B_only() { var (s, a, b) = NewPvpSession(); DriveToAfterReady(s, a); @@ -526,14 +526,11 @@ public class BattleSessionDispatchTests var routes = s.ComputeFrames(a, NewEnvelope(NetworkBattleUri.TurnEnd)); - Assert.That(routes.Count, Is.EqualTo(4)); - Assert.That(routes.Select(r => (r.Target, r.Frame.Uri)), Is.EquivalentTo(new[] - { - ((IBattleParticipant)a, NetworkBattleUri.TurnEnd), - ((IBattleParticipant)b, NetworkBattleUri.TurnEnd), - ((IBattleParticipant)a, NetworkBattleUri.Judge), - ((IBattleParticipant)b, NetworkBattleUri.Judge), - })); + Assert.That(routes.Count, Is.EqualTo(1)); + Assert.That(routes[0].Target, Is.SameAs(b)); + Assert.That(routes[0].Frame.Uri, Is.EqualTo(NetworkBattleUri.TurnEnd)); + var body = (SVSim.BattleNode.Protocol.Bodies.TurnEndBody)routes[0].Frame.Body; + Assert.That(body.TurnState, Is.EqualTo(0)); } [Test]