namespace SVSim.BattleEngine.Rng { // The headless authoritative NETWORK battle mgr — the emitting twin of HeadlessBattleMgr. Emission // lives on the NetworkBattleSender, and the *override that actually invokes it* (SendPlayCard -> // NetworkSender.SendPlayCard) lives on NetworkStandardBattleMgr, NOT NetworkBattleManagerBase: the // base SendPlayCard is an empty virtual no-op (NetworkBattleManagerBase.cs:598). NetworkStandardBattleMgr // is the production standard-PvP mgr; its ctor also creates the NetworkSender (NetworkStandardBattleMgr.cs:92), // so no manual sender wiring is needed here. Extending the base instead would resolve state but never // emit (spec §7 risk 2a). RNG overrides are identical to HeadlessBattleMgr (the same BattleManagerBase // virtuals + RandomSourceBridge), so the M14 rand-list emit reuses this mgr unchanged. M13's // deterministic card never exercises a roll. public sealed class HeadlessNetworkBattleMgr : NetworkStandardBattleMgr { private readonly IRandomSource _rng; public HeadlessNetworkBattleMgr(Wizard.BattleMgr.IBattleMgrContentsCreator contentsCreator, IRandomSource rng = null) : base(contentsCreator) { _rng = rng ?? new SeededRandomSource(contentsCreator.RandomSeed); } public override int StableRandom(int val) { double unit = _rng.NextUnit(); randomResult = unit; return RandomSourceBridge.Range(val, unit); } public override double StableRandomDouble() { double unit = _rng.NextUnit(); randomResult = unit; return unit; } public override int StableRandomOnlySelf(int val) => _rng.NextSelf(val); } }