// AUTHORED SHIM (not copied). A non-null no-op HandViewBase the headless emit path needs. // // On the OperateMgr/network play path, BattlePlayerBase.SetupActionProcessorEvent subscribes an // OnBeforePlayCard handler that calls BattleView.HandView.RemoveCardFromView (BattlePlayerBase.cs:1422) — // a pure presentation-layer hand-card removal. The m1_stub_gen generated IBattlePlayerView.HandView getter // returns default! (null), so the call NREs. The direct-ActionProcessor solo oracles never hit this // (SetupActionProcessorEvent is OperateMgr-only). Seed a single shared no-op HandViewBase whose card-view // list is non-null so RemoveCardFromView is a safe no-op (the played card is never in this view's list, so // the abstract RearrangeHand is never reached). Nothing here touches game state. using UnityEngine; namespace Wizard.Battle.View { internal sealed class HeadlessHandViewStub : HandViewBase { // Shared instance the generated IBattlePlayerView.HandView getters return headless. public static readonly HeadlessHandViewStub Instance = new HeadlessHandViewStub(); // Base param ctor initializes the protected _battleCardViewList (the default ctor leaves it null, // which RemoveCardFromView would NRE on). CreateHandControl is overridden to a null no-op below. public HeadlessHandViewStub() : base(null, null) { } protected override void RearrangeHand(float rearrangeTime, bool isNewReplayMoveTurn = false) { } protected override HandControl CreateHandControl(GameObject handGameObject, BattleCamera battleCamera) => null; } }