【关卡规则】关卡怪物生成逻辑异常:罗格营地出现怪物、奶牛关生成非奶牛怪、未成怪堆(Packs) #32

Closed
opened 2026-09-15 10:50:38 +00:00 by troytt · 1 comment
Owner

问题现象

  1. 罗格营地(Town)本应是安全区,不应有任何攻击性怪物,但场景中却生成了怪物;
  2. 神秘奶牛关(Moo Moo Farm) 理论上应该只生成 Hell Bovine(母牛),但当前却生成了沉沦魔、骷髅等杂怪;
  3. 怪物数量与密度异常,全图固定只有 12 只怪,且零星稀疏散落在地图各处,并未形成 D2 原版的群落聚居(Monster Packs / 随从怪群)。

根本原因排查分析

  1. 本地关卡包 samples/d2-packs 为旧版本未烘焙怪物数据:
    • 检查本地关卡包 samples/d2-packs/act1/39-act-1-moo-moo-farm-var1/scene.json 及其他场景文件发现,当前包内缺少 monsters 字段(scene.monsters 为 undefined)。
  2. 客户端引擎触发了写死的 DEMO 兜底逻辑:
    • 在 src/scene/act-scene.ts(第 518-521 行):
      monsterPacks: scene.monsters?.packs ?? [],
      monsterTypes: scene.monsters?.types ?? [],
      monsterStats: DEMO_MONSTERS,
      monsterCount: PLACEHOLDER_MONSTER_COUNT, // 固定常量 12 只!
      
    • 在 src/game/engine.ts 中,当 monsterPacks.length === 0 时:
      引擎会退化为无视关卡类型与关卡属性,直接在全图可用坐标上随机散布 12 只 DEMO_MONSTERS(即 demo-fallen 沉沦魔、demo-zombie 僵尸、demo-skeleton 骷髅)。
    • 这直接导致:
      • 安全区(Town)因为没有区分 isTown,被填入了这 12 只怪;
      • 奶牛关因为缺乏 pack 数据,也被填入了这 12 只怪;
      • 怪物数量永远固定为 12 只,完全无法展现 Levels.txt / MonStats.txt 规定的族群聚集与数量分布。

建议解决方案

  1. 重新烘焙本地 samples/d2-packs:
    • 运行 pack-act-assets.ts,将根据 Levels.txt、MonStats.txt、MonLvl.txt 规范计算的真实怪物族群(Packs, Types, Stats)完整注入 scene.json。
  2. 严密化运行时生成与安全区检查:
    • 在 engine.ts 与 act-scene.ts 中增加安全区判定(若是 Town / 安全区,则怪物数量强制为 0);
    • 当关卡包确实没有怪物数据时,应优雅静默或根据关卡 ID 动态拉取规则,杜绝在所有地图粗暴回退为 12 只 DEMO 怪。
## 问题现象 1. **罗格营地(Town)本应是安全区**,不应有任何攻击性怪物,但场景中却生成了怪物; 2. **神秘奶牛关(Moo Moo Farm)** 理论上应该只生成 Hell Bovine(母牛),但当前却生成了沉沦魔、骷髅等杂怪; 3. **怪物数量与密度异常**,全图固定只有 12 只怪,且零星稀疏散落在地图各处,并未形成 D2 原版的群落聚居(Monster Packs / 随从怪群)。 ## 根本原因排查分析 1. **本地关卡包 samples/d2-packs 为旧版本未烘焙怪物数据**: - 检查本地关卡包 `samples/d2-packs/act1/39-act-1-moo-moo-farm-var1/scene.json` 及其他场景文件发现,当前包内缺少 `monsters` 字段(`scene.monsters` 为 `undefined`)。 2. **客户端引擎触发了写死的 DEMO 兜底逻辑**: - 在 `src/scene/act-scene.ts`(第 518-521 行): ```typescript monsterPacks: scene.monsters?.packs ?? [], monsterTypes: scene.monsters?.types ?? [], monsterStats: DEMO_MONSTERS, monsterCount: PLACEHOLDER_MONSTER_COUNT, // 固定常量 12 只! ``` - 在 `src/game/engine.ts` 中,当 `monsterPacks.length === 0` 时: 引擎会退化为无视关卡类型与关卡属性,直接在全图可用坐标上随机散布 12 只 `DEMO_MONSTERS`(即 demo-fallen 沉沦魔、demo-zombie 僵尸、demo-skeleton 骷髅)。 - 这直接导致: - 安全区(Town)因为没有区分 `isTown`,被填入了这 12 只怪; - 奶牛关因为缺乏 pack 数据,也被填入了这 12 只怪; - 怪物数量永远固定为 12 只,完全无法展现 `Levels.txt` / `MonStats.txt` 规定的族群聚集与数量分布。 ## 建议解决方案 1. **重新烘焙本地 samples/d2-packs**: - 运行 `pack-act-assets.ts`,将根据 `Levels.txt`、`MonStats.txt`、`MonLvl.txt` 规范计算的真实怪物族群(Packs, Types, Stats)完整注入 `scene.json`。 2. **严密化运行时生成与安全区检查**: - 在 `engine.ts` 与 `act-scene.ts` 中增加安全区判定(若是 Town / 安全区,则怪物数量强制为 0); - 当关卡包确实没有怪物数据时,应优雅静默或根据关卡 ID 动态拉取规则,杜绝在所有地图粗暴回退为 12 只 DEMO 怪。
Author
Owner

修复完成说明

已在提交 d6e6248 中修复:

  1. 城镇/安全区无怪规则:在 loadPackRuntime、loadLiveRuntime 和 GameEngine 中识别城镇与预算为 0 的场景,将回退怪物数 monsterCount 置为 0,杜绝在罗格营地生成怪物。
  2. 正确加载关卡专属怪物:在 src/game/monster-mapping.ts 补充了 hellbovine、cow 的艺术资产映射(Token CW, Weapon hth),奶牛关仅生成母牛(Hell Bovine)模型。
  3. 怪堆集群生成机制:修复当关卡存在 monsterPacks 时 monsterCount 依然强制覆盖为 12 只占位怪的逻辑缺陷,由 spawnMonsterPacks 正确按群落(营地中心 + 护卫环形簇拥)生成真正的群落怪堆。
### 修复完成说明 已在提交 `d6e6248` 中修复: 1. **城镇/安全区无怪规则**:在 `loadPackRuntime`、`loadLiveRuntime` 和 `GameEngine` 中识别城镇与预算为 0 的场景,将回退怪物数 `monsterCount` 置为 0,杜绝在罗格营地生成怪物。 2. **正确加载关卡专属怪物**:在 `src/game/monster-mapping.ts` 补充了 `hellbovine`、`cow` 的艺术资产映射(Token `CW`, Weapon `hth`),奶牛关仅生成母牛(Hell Bovine)模型。 3. **怪堆集群生成机制**:修复当关卡存在 `monsterPacks` 时 `monsterCount` 依然强制覆盖为 12 只占位怪的逻辑缺陷,由 `spawnMonsterPacks` 正确按群落(营地中心 + 护卫环形簇拥)生成真正的群落怪堆。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#32
No description provided.