diff --git a/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs b/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs index 395db5e..ccd84da 100644 --- a/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs +++ b/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs @@ -38,12 +38,17 @@ public static class ScriptedLifecycle SelfDeck: BuildPlayerDeck(ctx.SelfDeckCardIds)), bid: battleId); - public static MsgEnvelope BuildBattleStart(long playerViewerId) => + public static MsgEnvelope BuildBattleStart(MatchContext ctx, long playerViewerId) => EnvelopeForPush(NetworkBattleUri.BattleStart, new BattleStartBody( TurnState: 0, // player goes first - BattleType: 11, // TK2 NetworkBattleType - SelfInfo: ScriptedProfiles.PlayerBattleStartProfile, + BattleType: ctx.BattleType, + SelfInfo: new BattleStartSelfInfo( + Rank: ScriptedProfiles.PlayerRank, + BattlePoint: ScriptedProfiles.PlayerBattlePoint, + ClassId: ctx.ClassId, + CharaId: ctx.CharaId, + CardMasterName: ctx.CardMasterName), OppoInfo: ScriptedProfiles.OpponentBattleStartProfile)); public static MsgEnvelope BuildDeal() => diff --git a/SVSim.BattleNode/Lifecycle/ScriptedProfiles.cs b/SVSim.BattleNode/Lifecycle/ScriptedProfiles.cs index 8697eed..0958b85 100644 --- a/SVSim.BattleNode/Lifecycle/ScriptedProfiles.cs +++ b/SVSim.BattleNode/Lifecycle/ScriptedProfiles.cs @@ -27,13 +27,10 @@ internal static class ScriptedProfiles Seed: BattleSeed, OppoDeckCount: 30); - // From frame[5] (BattleStart). - public static readonly BattleStartSelfInfo PlayerBattleStartProfile = new( - Rank: "10", - BattlePoint: "6270", - ClassId: "1", - CharaId: "1", - CardMasterName: "card_master_node_10015"); + // From frame[5] (BattleStart). Hardcoded; see spec §Deferred plumbing — sourcing these + // from real per-viewer state needs a TK2 rank/battle-point tracker. + public const string PlayerRank = "10"; + public const string PlayerBattlePoint = "6270"; public static readonly BattleStartOppoInfo OpponentBattleStartProfile = new( Rank: "1", diff --git a/SVSim.BattleNode/Sessions/BattleSession.cs b/SVSim.BattleNode/Sessions/BattleSession.cs index d22a622..d7012b9 100644 --- a/SVSim.BattleNode/Sessions/BattleSession.cs +++ b/SVSim.BattleNode/Sessions/BattleSession.cs @@ -239,7 +239,7 @@ public sealed class BattleSession Phase = BattleSessionPhase.AwaitingLoaded; break; case NetworkBattleUri.Loaded when Phase == BattleSessionPhase.AwaitingLoaded: - result.Add((ScriptedLifecycle.BuildBattleStart(ViewerId), NoStock: false)); + result.Add((ScriptedLifecycle.BuildBattleStart(Context, ViewerId), NoStock: false)); result.Add((ScriptedLifecycle.BuildDeal(), NoStock: false)); Phase = BattleSessionPhase.AwaitingSwap; break; diff --git a/SVSim.UnitTests/BattleNode/Lifecycle/ScriptedLifecycleTests.cs b/SVSim.UnitTests/BattleNode/Lifecycle/ScriptedLifecycleTests.cs index 11093fb..f78257a 100644 --- a/SVSim.UnitTests/BattleNode/Lifecycle/ScriptedLifecycleTests.cs +++ b/SVSim.UnitTests/BattleNode/Lifecycle/ScriptedLifecycleTests.cs @@ -68,14 +68,33 @@ public class ScriptedLifecycleTests } [Test] - public void BuildBattleStart_HasTurnStateZeroAndBattleTypeEleven() + public void BuildBattleStart_HasTurnStateZero_AndUsesContextBattleType() { - var env = ScriptedLifecycle.BuildBattleStart(playerViewerId: 1); + var env = ScriptedLifecycle.BuildBattleStart(FixtureCtx(), playerViewerId: 1); var body = (BattleStartBody)env.Body; Assert.That(body.TurnState, Is.EqualTo(0)); Assert.That(body.BattleType, Is.EqualTo(11)); } + [Test] + public void BuildBattleStart_class_chara_cardMaster_battleType_flow_from_context() + { + var ctx = FixtureCtx() with + { + ClassId = "7", CharaId = "5000123", + CardMasterName = "card_master_test_v2", + BattleType = 42, + }; + + var env = ScriptedLifecycle.BuildBattleStart(ctx, playerViewerId: 1); + var body = (BattleStartBody)env.Body; + + Assert.That(body.SelfInfo.ClassId, Is.EqualTo("7")); + Assert.That(body.SelfInfo.CharaId, Is.EqualTo("5000123")); + Assert.That(body.SelfInfo.CardMasterName, Is.EqualTo("card_master_test_v2")); + Assert.That(body.BattleType, Is.EqualTo(42)); + } + [Test] public void BuildDeal_HasThreeSelfAndThreeOppoEntries() { diff --git a/SVSim.UnitTests/BattleNode/Lifecycle/TypedBodyWireShapeTests.cs b/SVSim.UnitTests/BattleNode/Lifecycle/TypedBodyWireShapeTests.cs index 662552d..73ef459 100644 --- a/SVSim.UnitTests/BattleNode/Lifecycle/TypedBodyWireShapeTests.cs +++ b/SVSim.UnitTests/BattleNode/Lifecycle/TypedBodyWireShapeTests.cs @@ -85,7 +85,7 @@ public class TypedBodyWireShapeTests [Test] public void BuildBattleStart_SerializesAllWireKeysAndPreservesBattlePointAsymmetry() { - var env = ScriptedLifecycle.BuildBattleStart(playerViewerId: 906243102); + var env = ScriptedLifecycle.BuildBattleStart(FixtureCtx(), playerViewerId: 906243102); var json = MsgEnvelope.ToJson(env); var node = JsonNode.Parse(json)!.AsObject();