Multi-instancing migration (Step 2): convert the two static `bool` fields IsForecast and IsRandomDraw to static properties that resolve through BattleAmbient.Current when a scope is active, falling back to a private static when not (preserves today's behavior for unwrapped callers — solo SingleBattleMgr, in-process unit tests). This is the field-to-property pivot that lets HeadlessBattleMgr (and any future per-session battle host) carry its own forecast / random-draw flags inside an AsyncLocal scope without colliding with sibling battles (design 2026-06-07-engine-multi-instancing, Task 2). ZERO logic change for unwrapped callers (fallback storage holds the value); scoped callers get per-scope isolation. --- Engine/BattleManagerBase.cs (~line 414) - public static bool IsRandomDraw = false; + private static bool _isRandomDrawFallback = false; + public static bool IsRandomDraw { + get => SVSim.BattleEngine.Ambient.BattleAmbient.Current?.IsRandomDraw ?? _isRandomDrawFallback; + set { + var c = SVSim.BattleEngine.Ambient.BattleAmbient.Current; + if (c != null) c.IsRandomDraw = value; + else _isRandomDrawFallback = value; + } + } --- Engine/BattleManagerBase.cs (~line 416) - public static bool IsForecast = false; + private static bool _isForecastFallback = false; + public static bool IsForecast { + get => SVSim.BattleEngine.Ambient.BattleAmbient.Current?.IsForecast ?? _isForecastFallback; + set { + var c = SVSim.BattleEngine.Ambient.BattleAmbient.Current; + if (c != null) c.IsForecast = value; + else _isForecastFallback = value; + } + }