troytt
|
b28ce37e8a
|
docs(roadmap): correct M6 — discard map-scene.ts instead of merging
原诊断断言 act-scene.ts「无战斗/无物品/无技能/无存档」,据此把 M6 定为
「两轨合流、抽出第三个共享层」。逐行核查后发现这个断言是错的。
act-scene.ts:777 就实例化了 GameEngine,820 行 tick 它,962/968/978/984 行
分别绘制怪物、NPC、投射物、地面掉落,826-827 行的存读档也是经引擎走的。
之前 grep 不到是因为查的是 tickCombat/spawnMonsters 的直接导入,而
act-scene 是通过 GameEngine 间接获得这些能力的。
真相是 GameEngine(engine.ts,350 行)本身就已经是地图无关的共享层——
它只依赖 WorldMapProvider { widthPx, heightPx, overlap() }。原计划要新建的
src/scene/shared/gameplay.ts 不需要了。
「真地图上没有怪物」的全部原因是 act-scene.ts:785 的 stats: [],
因为 combat.ts:376 是 if (stats.length === 0) return 0。
反过来 map-scene.ts 查出三个确凿缺陷:
1. 孤儿世界:399-403 行 createWorld + spawnMonsters 建的世界从未被 tick,
453 行的 GameEngine 又建了自己的世界;let player = world.player 是死变量。
2. 怪物动画冻结(真实 bug):572 行读孤儿世界的 world.tick,而 world.tick += 1
只在 combat.ts:518 的 tickCombat 里发生,map-scene 从不直接调它。world.tick
恒为 0,表达式退化成每只怪一个固定帧,追击/攻击时动画静止。
3. 存读档绕过引擎:488-489 行传 saving:false/loading:false,然后在 492-511 行
于引擎外部读写 localStorage。在 tick 外做存读档对确定性是隐患。
另有 12 个死导入(tickCombat/rebindPlayer/damageMonster/castSkill/
tickProjectiles/QuestLog/npcDialog/captureSnapshot/parseSnapshot/
restoreSnapshot/serializeSnapshot/Rng),是逻辑搬进 GameEngine 后未清理的外壳。
因此 M6 改为:舍弃 map-scene.ts 与 map.html,收敛到 act-scene.ts 单轨。
范围收窄为三件事——打通 stats、修复 overlap 布尔化导致的脱困梯度丢失、
删除 map-scene 并把夹具回归检查改为直接驱动 GameEngine。风险由「高」下调为「中」。
TAG=agy
CONV=c89513df-cd12-4749-b5bd-5e9f16639391
|
2026-09-15 06:52:29 +00:00 |