feat(map-gen/population): 完善户外荒野地图第7步「动态实体与遭遇战填充 (Population Phase)」 #36

Closed
opened 2026-09-16 08:13:18 +00:00 by troytt · 1 comment
Owner

背景说明

在《暗黑破坏神2》的户外荒野地图(Wilderness Level,DrlgType = 3)7 步生成管线中,第 1~6 步(拓扑初始化、方向边界 Border 1..8 与开放大门 Bord1o..4o 锚定、特殊任务地标预设散布、泥土路网折线寻路、LvlSub.txt 避障替换、256 项 8 邻域位掩码泥土瓦片合成与 5 \times 5 子格碰撞网格)已在 src/game/wilderness.ts 中完整落地并通过验证。

目前 DS1 预制体自带的静态实体坐标(level.objects)已随 stampDs1 导出,但**第 7 步:动态单位、物件与遭遇战生成(Population Phase / 对应原版 D2Game.dll 动态填充与部分 D2Common 道路附属生成)**尚未完全实现,特此立项追踪。


待实现功能清单 (TODOs)

1. 户外怪物群落(Monster Packs)与密度刷怪机制

  • 读取 Levels.txt 怪物池:根据当前关卡的 Mon1 ~ Mon25(普通难度)及 nmon1 ~ nmon25(噩梦/地狱)字段选择合法怪物种类。
  • 群落(Packs)生成:
    • 结合 MonStats.txt 中的 MinGrp / MaxGrp,以“怪堆(Pack + 随从)”为单位在开阔草地区域(非障碍物、非水域)成群生成,而非单只零散随机刷怪。
    • 出生点安全区保护:在罗格营地大门过渡桥(TownETrans.ds1 / TownSTrans.ds1)及传送点周围保留安全排斥半径,避免玩家刚出门即被贴脸包围。
  • 精英怪(Champion / Unique Boss Packs):
    • 依据 Levels.txt 中的 MonUMin / MonUMax 数量区间,在开阔区块或任务地标周边刷出头目怪(Champion)或随机暗金金怪(Unique Boss + Minions)并赋予词缀。

2. 固定超级暗金怪(SuperUniques)与守卫 NPC 行为绑定

  • 守卫弗拉维(Flavie / rogue2):
    • 在鲜血荒地 \leftrightarrow 冰冷高原交界处的开放大门预制体(Bord1o.ds1 ~ Bord4o.ds1)内激活罗格斥候 NPC 弗拉维,绑定驻守巡逻与自动射击靠近怪物的 AI。
  • 地标绑定超级暗金怪(SuperUniques.txt):
    • 毕须博须(Bishibosh):绑定在冰冷高原沉沦魔营地(Fallen Camp / bivouac)预制体内。
    • 拉卡尼休(Rakanishu):绑定在石块旷野凯恩石柱群(cairn2.ds1)旁。
    • 树头木拳(Treehead WoodFist):绑定在黑暗森林艾尼弗斯之树(funktree.ds1)旁。
    • 血鸟(Blood Raven):绑定在埋骨之地墓园(gravey.ds1)内。

3. 程序化小站(Waypoint)与路边交互物件散布

  • 程序化小站放置(DRLGOUTDOORS_SpawnAct12Waypoint):
    • 在需要生成小站的户外地图(冰冷高原 Id = 3、石块旷野 Id = 4、黑暗森林 Id = 5、黑色荒地 Id = 6),于靠近主干道且开阔平坦的 1 \times 1 区块自动生成小站底座及传送交互点。
  • 路边祭坛、水井与可交互容器(DRLGOUTDOORS_SpawnAct12Shrines):
    • 沿泥土路网边缘(dirtPathGrid 邻近格)与废墟旁按概率刷出神殿(Shrines)、恢复水井(Wells)、营火残骸、可踢翻的碎石/木桶以及普通宝箱,并对接 TreasureClassEx.txt 掉落表。

关联代码位置

  • 户外地图生成器:src/game/wilderness.ts(见 UNIMPLEMENTED_PASSES 中的 DRLGOUTDOORS_SpawnAct12Waypoint 与 DRLGOUTDOORS_SpawnAct12Shrines)
  • 场景与碰撞构建:src/game/iso-scene.ts
  • 物件与单位查表:src/game/object-lookup.ts
## 背景说明 在《暗黑破坏神2》的户外荒野地图(Wilderness Level,`DrlgType = 3`)7 步生成管线中,第 1~6 步(拓扑初始化、方向边界 `Border 1..8` 与开放大门 `Bord1o..4o` 锚定、特殊任务地标预设散布、泥土路网折线寻路、`LvlSub.txt` 避障替换、256 项 8 邻域位掩码泥土瓦片合成与 $5 \times 5$ 子格碰撞网格)已在 `src/game/wilderness.ts` 中完整落地并通过验证。 目前 DS1 预制体自带的静态实体坐标(`level.objects`)已随 `stampDs1` 导出,但**第 7 步:动态单位、物件与遭遇战生成(Population Phase / 对应原版 `D2Game.dll` 动态填充与部分 `D2Common` 道路附属生成)**尚未完全实现,特此立项追踪。 --- ## 待实现功能清单 (TODOs) ### 1. 户外怪物群落(Monster Packs)与密度刷怪机制 - **读取 `Levels.txt` 怪物池**:根据当前关卡的 `Mon1` ~ `Mon25`(普通难度)及 `nmon1` ~ `nmon25`(噩梦/地狱)字段选择合法怪物种类。 - **群落(Packs)生成**: - 结合 `MonStats.txt` 中的 `MinGrp` / `MaxGrp`,以“怪堆(Pack + 随从)”为单位在开阔草地区域(非障碍物、非水域)成群生成,而非单只零散随机刷怪。 - **出生点安全区保护**:在罗格营地大门过渡桥(`TownETrans.ds1` / `TownSTrans.ds1`)及传送点周围保留安全排斥半径,避免玩家刚出门即被贴脸包围。 - **精英怪(Champion / Unique Boss Packs)**: - 依据 `Levels.txt` 中的 `MonUMin` / `MonUMax` 数量区间,在开阔区块或任务地标周边刷出头目怪(Champion)或随机暗金金怪(Unique Boss + Minions)并赋予词缀。 ### 2. 固定超级暗金怪(SuperUniques)与守卫 NPC 行为绑定 - **守卫弗拉维(Flavie / `rogue2`)**: - 在鲜血荒地 $\leftrightarrow$ 冰冷高原交界处的开放大门预制体(`Bord1o.ds1` ~ `Bord4o.ds1`)内激活罗格斥候 NPC 弗拉维,绑定驻守巡逻与自动射击靠近怪物的 AI。 - **地标绑定超级暗金怪(SuperUniques.txt)**: - **毕须博须(Bishibosh)**:绑定在冰冷高原沉沦魔营地(Fallen Camp / `bivouac`)预制体内。 - **拉卡尼休(Rakanishu)**:绑定在石块旷野凯恩石柱群(`cairn2.ds1`)旁。 - **树头木拳(Treehead WoodFist)**:绑定在黑暗森林艾尼弗斯之树(`funktree.ds1`)旁。 - **血鸟(Blood Raven)**:绑定在埋骨之地墓园(`gravey.ds1`)内。 ### 3. 程序化小站(Waypoint)与路边交互物件散布 - **程序化小站放置(`DRLGOUTDOORS_SpawnAct12Waypoint`)**: - 在需要生成小站的户外地图(冰冷高原 `Id = 3`、石块旷野 `Id = 4`、黑暗森林 `Id = 5`、黑色荒地 `Id = 6`),于靠近主干道且开阔平坦的 $1 \times 1$ 区块自动生成小站底座及传送交互点。 - **路边祭坛、水井与可交互容器(`DRLGOUTDOORS_SpawnAct12Shrines`)**: - 沿泥土路网边缘(`dirtPathGrid` 邻近格)与废墟旁按概率刷出神殿(Shrines)、恢复水井(Wells)、营火残骸、可踢翻的碎石/木桶以及普通宝箱,并对接 `TreasureClassEx.txt` 掉落表。 --- ## 关联代码位置 - 户外地图生成器:`src/game/wilderness.ts`(见 `UNIMPLEMENTED_PASSES` 中的 `DRLGOUTDOORS_SpawnAct12Waypoint` 与 `DRLGOUTDOORS_SpawnAct12Shrines`) - 场景与碰撞构建:`src/game/iso-scene.ts` - 物件与单位查表:`src/game/object-lookup.ts`
Author
Owner

已在 commit e9f2cee (feat(map-gen/population): implement wilderness population phase, waypoints, shrines, superuniques & safe zones (fixes #36)) 中完整实现户外荒野第 7 步(Population Phase)的所有要求,并通过全部单元测试(634 passed):

1. 标准怪物群落刷怪与安全保护半径 (SafeZone)

  • 数据驱动刷怪:planLevelMonsters 根据 Levels.txt (MonDen, MonUMin, MonUMax, m1..m10) 与 MonStats.txt (MinGrp..MaxGrp) 预算并生成怪物小队,头目与随从 (minion) 保持簇状分布。
  • 安全区排斥半径:在 combat.ts (spawnMonsterPacks) 与 act-scene.ts 中引入 SafeZone 排除判定,围绕玩家出生点 (radius: 180)、传送小站 (radius: 160) 与城镇过渡桥/边界出入口 (radius: 160) 建立安全区,杜绝过图即被怪群包围(Spawn Kill)。

2. 精英头目(Champions & Uniques)与词缀 (MonUMod.txt)

  • 确定性词缀抽取与数值加成:在 monsters.ts 中实现 CANONICAL_ELITE_MODIFIERS、rollEliteModifiers 与 applyEliteModifiers,为蓝色头目(Champions,抽取 strong/fast 等)与金色暗金怪(Uniques,抽取 1~2 项词缀如 cursed、fireenchant、lightenchant、coldenchant、stoneskin、magicresistant 等)赋予对应的生命倍率、伤害加成(如 Extra Strong +50% 伤害)与移速加成(如 Extra Fast +40% 速度)。

3. 固定暗金头目(SuperUniques)与特殊 NPC 地标绑定

  • 毕须博须 (Bishibosh):绑定至冰冷之原 (levelId 3) 的沉沦魔营地 Act 1 - Fallen Camp Bishibosh (bivouac)。
  • 拉卡尼休 (Rakanishu):绑定至乱石旷野 (levelId 4) 的凯恩之石 Act 1 - Cairn Stones (cairn2),附带闪电强化 + 特别快速 (lightenchant, fast)。
  • 树头木拳 (Treehead WoodFist):绑定至黑暗森林 (levelId 5) 的艾尼弗斯之树 Act 1 - Inifus (funktree),附带特别强壮 + 特别快速 (strong, fast)。
  • 血鸟 (Blood Raven):绑定至埋骨之地 (levelId 17 / gravey)。
  • 守卫弗拉维 (Flavie / rogue2):自动锚定在鲜血荒地 (levelId 2) 与冰冷之原 (levelId 3) 交界的开口边界门内侧(土路交界点)。

4. 传送小站与路边神殿/交互物动态散布

  • 户外传送小站 (DRLGOUTDOORS_SpawnAct12Waypoint):在冰冷之原 (3)、乱石旷野 (4)、黑暗森林 (5)、黑色荒地 (6) 等户外带小站地图的主干道 (dirt road) 旁自动寻找 3x3 开阔平地生成传送小站 (type: 2, id: 37)。
  • 路边神殿与交互物 (DRLGOUTDOORS_SpawnAct12Shrines):沿主干道两侧及废墟/农舍周边自动散布神殿 (SF, SH, BC, SG)、治愈水井 (HW)、宝箱 (L1, C1, C2) 以及木桶/篝火 (BR, BF)。
  • 清理 UNIMPLEMENTED_PASSES:已将 DRLGOUTDOORS_SpawnAct12Waypoint 与 DRLGOUTDOORS_SpawnAct12Shrines 从未实现列表中移除。
已在 commit `e9f2cee` (`feat(map-gen/population): implement wilderness population phase, waypoints, shrines, superuniques & safe zones (fixes #36)`) 中完整实现户外荒野第 7 步(Population Phase)的所有要求,并通过全部单元测试(634 passed): ### 1. 标准怪物群落刷怪与安全保护半径 (`SafeZone`) - **数据驱动刷怪**:`planLevelMonsters` 根据 `Levels.txt` (`MonDen`, `MonUMin`, `MonUMax`, `m1..m10`) 与 `MonStats.txt` (`MinGrp`..`MaxGrp`) 预算并生成怪物小队,头目与随从 (`minion`) 保持簇状分布。 - **安全区排斥半径**:在 `combat.ts` (`spawnMonsterPacks`) 与 `act-scene.ts` 中引入 `SafeZone` 排除判定,围绕玩家出生点 (`radius: 180`)、传送小站 (`radius: 160`) 与城镇过渡桥/边界出入口 (`radius: 160`) 建立安全区,杜绝过图即被怪群包围(Spawn Kill)。 ### 2. 精英头目(Champions & Uniques)与词缀 (`MonUMod.txt`) - **确定性词缀抽取与数值加成**:在 `monsters.ts` 中实现 `CANONICAL_ELITE_MODIFIERS`、`rollEliteModifiers` 与 `applyEliteModifiers`,为蓝色头目(Champions,抽取 `strong`/`fast` 等)与金色暗金怪(Uniques,抽取 1~2 项词缀如 `cursed`、`fireenchant`、`lightenchant`、`coldenchant`、`stoneskin`、`magicresistant` 等)赋予对应的生命倍率、伤害加成(如 `Extra Strong` +50% 伤害)与移速加成(如 `Extra Fast` +40% 速度)。 ### 3. 固定暗金头目(SuperUniques)与特殊 NPC 地标绑定 - **毕须博须 (Bishibosh)**:绑定至冰冷之原 (`levelId 3`) 的沉沦魔营地 `Act 1 - Fallen Camp Bishibosh` (`bivouac`)。 - **拉卡尼休 (Rakanishu)**:绑定至乱石旷野 (`levelId 4`) 的凯恩之石 `Act 1 - Cairn Stones` (`cairn2`),附带闪电强化 + 特别快速 (`lightenchant`, `fast`)。 - **树头木拳 (Treehead WoodFist)**:绑定至黑暗森林 (`levelId 5`) 的艾尼弗斯之树 `Act 1 - Inifus` (`funktree`),附带特别强壮 + 特别快速 (`strong`, `fast`)。 - **血鸟 (Blood Raven)**:绑定至埋骨之地 (`levelId 17` / `gravey`)。 - **守卫弗拉维 (Flavie / `rogue2`)**:自动锚定在鲜血荒地 (`levelId 2`) 与冰冷之原 (`levelId 3`) 交界的开口边界门内侧(土路交界点)。 ### 4. 传送小站与路边神殿/交互物动态散布 - **户外传送小站 (`DRLGOUTDOORS_SpawnAct12Waypoint`)**:在冰冷之原 (3)、乱石旷野 (4)、黑暗森林 (5)、黑色荒地 (6) 等户外带小站地图的主干道 (`dirt road`) 旁自动寻找 3x3 开阔平地生成传送小站 (`type: 2, id: 37`)。 - **路边神殿与交互物 (`DRLGOUTDOORS_SpawnAct12Shrines`)**:沿主干道两侧及废墟/农舍周边自动散布神殿 (`SF`, `SH`, `BC`, `SG`)、治愈水井 (`HW`)、宝箱 (`L1`, `C1`, `C2`) 以及木桶/篝火 (`BR`, `BF`)。 - **清理 `UNIMPLEMENTED_PASSES`**:已将 `DRLGOUTDOORS_SpawnAct12Waypoint` 与 `DRLGOUTDOORS_SpawnAct12Shrines` 从未实现列表中移除。
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#36
No description provided.