diff --git a/SVSim.BattleEngine/Shim/Generated/BattleCardView_BuildInfo.g.cs b/SVSim.BattleEngine/Shim/Generated/BattleCardView_BuildInfo.g.cs index a5de79c..0969d6c 100644 --- a/SVSim.BattleEngine/Shim/Generated/BattleCardView_BuildInfo.g.cs +++ b/SVSim.BattleEngine/Shim/Generated/BattleCardView_BuildInfo.g.cs @@ -1,4 +1,6 @@ // AUTO-GENERATED no-op stubs (m1_stub_gen) from Shadowverse_Code_2026-05-23\Wizard.Battle.View\BattleCardView.cs +// CONTAINS HAND-EDITS (HEADLESS-FIX). Before any regen, grep this file for "HEADLESS-FIX" and re-apply +// those blocks; a plain regen will clobber them. using System; using System.Collections.Generic; using System.Linq; diff --git a/SVSim.BattleEngine/Shim/Generated/EnemyClassBattleCardView.g.cs b/SVSim.BattleEngine/Shim/Generated/EnemyClassBattleCardView.g.cs index 2b6b381..a22e38a 100644 --- a/SVSim.BattleEngine/Shim/Generated/EnemyClassBattleCardView.g.cs +++ b/SVSim.BattleEngine/Shim/Generated/EnemyClassBattleCardView.g.cs @@ -1,4 +1,6 @@ // AUTO-GENERATED no-op stubs (m1_stub_gen) from Shadowverse_Code_2026-05-23\Wizard.Battle.View\EnemyClassBattleCardView.cs +// CONTAINS HAND-EDITS (HEADLESS-FIX). Before any regen, grep this file for "HEADLESS-FIX" and re-apply +// those blocks; a plain regen will clobber them. using UnityEngine; using Wizard.Battle.Player.ClassCharacter; namespace Wizard.Battle.View diff --git a/SVSim.BattleEngine/Shim/Generated/PlayerClassBattleCardView.g.cs b/SVSim.BattleEngine/Shim/Generated/PlayerClassBattleCardView.g.cs index 2b70d15..e4e27be 100644 --- a/SVSim.BattleEngine/Shim/Generated/PlayerClassBattleCardView.g.cs +++ b/SVSim.BattleEngine/Shim/Generated/PlayerClassBattleCardView.g.cs @@ -1,4 +1,6 @@ // AUTO-GENERATED no-op stubs (m1_stub_gen) from Shadowverse_Code_2026-05-23\Wizard.Battle.View\PlayerClassBattleCardView.cs +// CONTAINS HAND-EDITS (HEADLESS-FIX). Before any regen, grep this file for "HEADLESS-FIX" and re-apply +// those blocks; a plain regen will clobber them. using UnityEngine; using Wizard.Battle.Player.ClassCharacter; namespace Wizard.Battle.View diff --git a/SVSim.BattleNode/Sessions/Engine/SessionBattleEngine.cs b/SVSim.BattleNode/Sessions/Engine/SessionBattleEngine.cs index ef5d2d3..ab9042b 100644 --- a/SVSim.BattleNode/Sessions/Engine/SessionBattleEngine.cs +++ b/SVSim.BattleNode/Sessions/Engine/SessionBattleEngine.cs @@ -159,6 +159,15 @@ internal sealed class SessionBattleEngine // Each returns LIVE engine state off the seated player, mirroring the Phase-1 oracle reads // (VanillaFollowerOracleTests: player.Pp, player.HandCardList.Count, ClassAndInPlayCardList, // leader == the Class card). seat:true == player, false == opponent (F-N-2). + // + // INVARIANT (two accessor bands, different null-engine policy): + // • This "oracle" band (down to EvolveWaitTurnCount) goes through Seat(), which THROWS if the + // engine isn't owned/seated for this session. It is TEST-ONLY — called solely from the + // node-native harness/tests, where the engine is always seated. Do NOT call these from a wire + // handler. + // • The wire-path band below (PlayedCardCost/Spellboost/Clan/Tribe/Id) DEGRADES to a fallback + // when the engine isn't owned (single-active-engine gate), so a non-engine session never + // crashes. Production handlers read ONLY that band. public int LeaderLife(bool playerSeat) => Seat(playerSeat).Class.Life; public int Pp(bool playerSeat) => Seat(playerSeat).Pp;