test(battlenode): N1 shadow replay tracks captured battle state (Phase 2 N1)
Full single-client capture replay (cl1 send=player seat, receive=opponent seat, ts-ordered) ingests end-to-end: 33 frames, 0 rejects, 0 invariant violations at turn boundaries (leader life/PP/board/hand). Headless gaps filled per playbook (no Engine/ drift): - IsRecovery=true after construction: the engine's own headless replay mode gates the live view/UI layer off (BattleUIContainer, turn-control UI, VFX waits) while keeping the live NetworkBattleReceiver (ND4) and authoritative state. - Seed ToolboxGame.RealTimeNetworkAgent, BattleUIContainer, _backGround, and per-player NullPlayerEmotion no-ops the receive/turn cycle dereferences. - _IfaceImpl.g.cs (shim, not Engine/): BattleCardView.BattleCardIconAnimations returns a lazy non-null no-op so the opponent card-reveal icon-init (deferred VFX) doesn't NRE. - HeadlessCardMaster.Load made cumulative: it replaced the global CardMaster each call, so a Load(deck) evicted the oracle card set and broke tests run after. Adds board-state accessors (LeaderLife/Pp/HandCount/BoardCount) and CaptureReplay ts ordering. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -17,7 +17,8 @@ namespace Wizard.Battle.View {
|
||||
Transform global::Wizard.Battle.View.IBattleCardView.Transform { get => default!; }
|
||||
CardTemplate global::Wizard.Battle.View.IBattleCardView.CardTemplate { get => default!; }
|
||||
BoxCollider global::Wizard.Battle.View.IBattleCardView.Collider { get => default!; }
|
||||
BattleCardIconAnimations global::Wizard.Battle.View.IBattleCardView.BattleCardIconAnimations { get => default!; }
|
||||
private BattleCardIconAnimations _headlessIconAnims; // HEADLESS-FIX (N1)
|
||||
BattleCardIconAnimations global::Wizard.Battle.View.IBattleCardView.BattleCardIconAnimations { get => _headlessIconAnims ??= new BattleCardIconAnimations(); } // HEADLESS-FIX (N1): non-null no-op so ReplaceReceivedCard.CreateActualCard's follower icon-init (a deferred VFX; InitializeIcon never runs headless) doesn't NRE on the opponent card-reveal path
|
||||
Func<bool> global::Wizard.Battle.View.IBattleCardView.GetIsOnMove { get => default!; }
|
||||
bool global::Wizard.Battle.View.IBattleCardView.InPlayModelActive { get => default!; set { } }
|
||||
BattleCamera global::Wizard.Battle.View.IBattleCardView.m_BattleCamera { get => default!; }
|
||||
|
||||
Reference in New Issue
Block a user