Commit Graph

1 Commits

Author SHA1 Message Date
troytt 29b3a4aebd fix(render): NPC 有立绘时不再叠加绿色占位方块 (refs #6)
城镇 NPC 补齐之后,罗格营地一个分区会出现 19 个绿色方块糊在正常立绘上面。

起因是两套绘制路径各自独立判断:`buildPackRuntime` 用 `if (obj.frame)`
把 NPC 并入 `objectDrawables` 画出真实立绘,而实体层对 `engine.npcEntities`
里的每一个 NPC **无条件**再画一个 16x26 的纯绿占位方块。在只有凯恩一个
NPC 的年代这看不出问题,NPC 数量从 103 涨到 889 之后就藏不住了。

修复不是在实体层加一个平行的判断——那只会把同一个条件抄成两份,早晚漂移。
改为把判断抽成 `hasPackedSprite` 放进 `src/game/npc.ts`,两条路径共用同一个
函数:立绘层为真时画图,占位层为假时画框,互斥由函数本身保证。

该函数写成类型守卫,立绘层因此可以在同一次调用里把 `frame` 收窄成非空,
省掉原本那个多余的二次判空,也就不存在第二个会漂移的判断了。

`NpcEntity` 增加 `hasSprite` 字段,必填而非可选,这样将来新增放置点必须
表态。`GameEngine` 构造函数里那圈合成放置点显式标记为 `false`——它们本来
就没有预烘焙美术,占位方块对它们仍然是唯一的可见形式。金色名字标签两类
都保留,可交互提示不受影响。

顺带把 `npcEntities` 的行内结构类型换成已导出的 `NpcEntity`,避免同一个
形状在同一个文件里存在两份定义。

新增 `tests/npc-placeholder.test.ts`:除守卫本身的行为与收窄能力外,还把
全部已打包 NPC 过一遍,断言这个划分是完备的(每个 NPC 恰好落入一条路径,
不重不漏),并钉住罗格营地四个分区的 NPC 名册。守卫锚定在它真正读取的
`samples/d2-packs/index.json` 上。
2026-09-14 23:56:49 +00:00