Squashes 146 commits from battle-engine-extraction. Net: 2,045 files changed, +11,896 / -158,687 lines. Ships engine passes 4-7 (dead-code cull, view-layer stub, receive-path shrink) plus the Phase-5 AsyncLocal ambient deletion that turns concurrent battles into a type-system property rather than a scope contract. ## What landed **Passes 4-7 (chunks 1-34):** Extended the Phase-4 const-false collapse into a cascading cull across the skill graph, view layer, and receive-path periphery. Six mode flags (IsWatchBattle/IsReplayBattle/IsAdmin/IsAdminWatch/IsPuzzleQuest/ IsAINetwork) became `const false`, every guarded block deleted. Field*.cs subclass ctors + BackGroundBase + ObjectChecker culled to no-ops. Mulligan family reworked to take a mgr param through IMulliganMgr.InitMulligan. Emotion/Recovery/Resource clusters null-stubbed. Prediction/OperationSimulator/ skill filters converted from static ambient reads to per-mgr reads via SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr / ins.BattleMgr / this.BattleMgr. **Phase-5 ambient rip (chunks 35-47):** Deleted BattleAmbient / BattleAmbient- Context / TestBattleScope in full. Every per-battle mutable slot now lives on the mgr instance itself: mgr.InstanceIsForecast / InstanceIsRandomDraw / InstanceRecoveryInfo / InstanceViewerId / InstanceNetworkAgent / GameMgr BattleManagerBase.GetIns() returns null unconditionally; the residual static flags + 3 façades (Certification.ViewerId, Data.BattleRecoveryInfo, ToolboxGame.RealTimeNetworkAgent) are null-tolerant defaults kept for the handful of engine-internal readers that still reference their types. Zero BattleAmbient references anywhere in engine + node + tests. Added pre-seeded GameMgr ctor overload threaded through the mgr chain (BattleManagerBase → SingleBattleMgr / NetworkBattleManagerBase → NetworkStandard- BattleMgr → HeadlessBattleMgr / HeadlessNetworkBattleMgr). Fixtures build a GameMgr, seed it via HeadlessEngineEnv.SeedCharaIds/SeedNetUser, and pass it to the mgr's ctor — no ambient reach. Node side (SVSim.BattleNode/SessionBattleEngine): _ctx replaced with a plain GameMgr field; 34 `using var _ambient = BattleAmbient.Enter(_ctx)` scope wraps ripped from every accessor and mutator; EngineGlobalInit.WirePerSessionGameMgr takes GameMgr as a param and runs from SessionBattleEngine.SetupInternal BEFORE mgr construction. Test side: TestBattleScope deleted; 18 fixture [SetUp]s migrated to `HeadlessEngineEnv.EnsureProcessGlobals()`; MultiInstanceEngineTests rewritten around per-mgr construction (GetIns() → null is the pinned invariant). ## Regression fixes - **chunk-48** (MulliganCtrl): chunk-35's `= null` stubs on card lookups broke the live receive-driven Deal path (BattlePlayerBase.DrawCard NRE'd downstream of NetworkPlayerMulliganCtrl.StartMulliganVfx). Restored the three lookups via `_battlePlayer.BattleMgr.GetBattleCardIdx`. Engine tests were satisfied by the WireMulliganPhase seam; unit tests exposed the live-path gap. ## Ship state - SVSim.BattleEngine.Tests: 56/56 pass, 2 skip - SVSim.UnitTests: 1554/1554 pass (was 1523/31-fail before chunk 48) - Solution build: 0 source warnings (40 pre-existing NU1902 MessagePack CVEs in SVSim.EmulatedEntrypoint, unrelated) - Sequential PVP smoke: verified live (two back-to-back battles, no regression on cleanup/spinup) - Concurrent PVP smoke: verified live Adds tools/engine-port/ClosureAnalyzer/ — the Roslyn transitive-type-closure analyzer needed to make future cascade cleanup safe (per feedback memory "Engine cleanup needs closure tool" from the 2026-06-28 pass-3 failure). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
97 lines
2.6 KiB
C#
97 lines
2.6 KiB
C#
using System.Collections.Generic;
|
|
using Cute;
|
|
|
|
public class AreaBGInfoSection20
|
|
{
|
|
|
|
public static List<ChapterExtraData> GetChapterExtraDatas()
|
|
{
|
|
List<ChapterExtraData> list = new List<ChapterExtraData>();
|
|
list.AddRange(Chapter1_2());
|
|
list.AddRange(Chapter3_9());
|
|
list.AddRange(OtherWorldChapters(10, 17, 12, new List<int> { 1, 2, 6, 7 }, addTreeEffect: true));
|
|
list.AddRange(OtherWorldChapters(18, 25, 10, new List<int> { 1, 2 }, addTreeEffect: true));
|
|
list.AddRange(OtherWorldChapters(26, 33, 9, new List<int> { 2, 3, 4, 7, 8, 9 }, addTreeEffect: true));
|
|
list.AddRange(OtherWorldChapters(34, 40, 20, null, addTreeEffect: false));
|
|
return list;
|
|
}
|
|
|
|
private static List<ChapterExtraData> OtherWorldChapters(int start, int end, int section, List<int> extraTextureIndex, bool addTreeEffect)
|
|
{
|
|
List<ChapterExtraData> list = new List<ChapterExtraData>();
|
|
for (int i = start; i <= end; i++)
|
|
{
|
|
ChapterExtraData chapterExtraData = new ChapterExtraData
|
|
{
|
|
SectionId = 20,
|
|
ExtraTextureChapter = i,
|
|
BGSectionId = section
|
|
};
|
|
chapterExtraData.AddTreeEffect = addTreeEffect;
|
|
if (i == 17 || i == 25 || i == 33)
|
|
{
|
|
chapterExtraData.BGExtraEffectPath = "scn_map_change_9";
|
|
chapterExtraData.SeType = 0;
|
|
}
|
|
if (extraTextureIndex.IsNotNullOrEmpty())
|
|
{
|
|
chapterExtraData.ExtraTextureIndex = extraTextureIndex;
|
|
chapterExtraData.BGSuffix = "b";
|
|
}
|
|
list.Add(chapterExtraData);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private static List<ChapterExtraData> Chapter1_2()
|
|
{
|
|
return new List<ChapterExtraData>
|
|
{
|
|
new ChapterExtraData
|
|
{
|
|
SectionId = 20,
|
|
ExtraTextureChapter = 1,
|
|
BGExtraEffectPath = "scn_map_change_9",
|
|
SeType = 0
|
|
},
|
|
new ChapterExtraData
|
|
{
|
|
SectionId = 20,
|
|
ExtraTextureChapter = 2,
|
|
BGExtraEffectPath = "scn_map_change_8",
|
|
AttachExtraEffectToBgRoot = true,
|
|
SeType = 0
|
|
}
|
|
};
|
|
}
|
|
|
|
private static List<ChapterExtraData> Chapter3_9()
|
|
{
|
|
List<ChapterExtraData> list = new List<ChapterExtraData>();
|
|
for (int i = 3; i <= 9; i++)
|
|
{
|
|
ChapterExtraData chapterExtraData = new ChapterExtraData
|
|
{
|
|
SectionId = 20,
|
|
ExtraTextureChapter = i,
|
|
ExtraTextureIndex = { 1, 2, 6 },
|
|
BGSectionId = 2,
|
|
BGSuffix = "b"
|
|
};
|
|
if (i == 9)
|
|
{
|
|
chapterExtraData.BGExtraEffectPath = "scn_map_change_9";
|
|
chapterExtraData.SeType = 0;
|
|
}
|
|
list.Add(chapterExtraData);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public static bool IsSpeedUpParticleTransition(int previousChapter, int nextChapter)
|
|
{
|
|
bool flag = previousChapter == 33 && nextChapter == 32;
|
|
return previousChapter == 0 || flag;
|
|
}
|
|
}
|