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:
@@ -19,10 +19,18 @@ namespace SVSim.BattleEngine.Tests
|
||||
private static readonly string CardsJsonPath =
|
||||
Path.Combine(AppContext.BaseDirectory, "Data", "cards.json");
|
||||
|
||||
// Load the given card ids (empty = none) into a fresh CardMaster registered as Default.
|
||||
// Every id ever requested this process. Load is CUMULATIVE: each call rebuilds the master from
|
||||
// the union, so a later Load(subset) never evicts cards an earlier Load (e.g. EnsureInitialized's
|
||||
// oracle set) installed. Without this, the static CardMaster is shared mutable state across the
|
||||
// whole NUnit run and a Load(deck) in one test silently breaks an oracle test that runs after.
|
||||
private static readonly HashSet<int> _everLoaded = new();
|
||||
|
||||
// Load the given card ids (empty = none) into a CardMaster registered as Default, MERGED with all
|
||||
// previously-loaded ids.
|
||||
public static void Load(params int[] cardIds)
|
||||
{
|
||||
var want = new HashSet<int>(cardIds);
|
||||
foreach (var id in cardIds) _everLoaded.Add(id);
|
||||
var want = new HashSet<int>(_everLoaded);
|
||||
var rows = new List<CardCSVData>();
|
||||
if (want.Count > 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user