[DRLG-M4] 严格对齐 LvlSub.txt 试验次数与全排列候选位地块替换算法 #76

Closed
opened 2026-09-18 06:36:38 +00:00 by troytt · 1 comment
Owner

目标与背景

以暴雪原版 1.13c D2Common.dll DRLGTILESUB_DoSubstitutions 为黄金标准,重构 src/game/wilderness.ts 与 src/game/maze.ts 中的地块替换逻辑。

缺陷与审计发现

  1. 缺失 Trials == -1 全排列洗牌查找: 在 1.13c 中,当 Trials == -1 时,引擎会遍历全部 (Width - SubWidth) * (Height - SubHeight) 个候选坐标,构建全排列随机洗牌数组,顺序测试第一个合法位置。当前 Web 引擎仅支持简单有上限的随机尝试,导致部分小概率关键预设替换失败或遗漏。
  2. 四层原子覆盖同步不足: 暴雪原版在执行替换时 (sub_6FD8ACE0),同步覆盖 Floor、Wall(支持多层)、Roof 与 Shadow,并维护 Roof 计数。当前替换偏重于地面层,缺少对暗影与顶部遮罩的完整覆盖。

验收条件

  • 严格读取并应用 LvlSub.txt 中的 Prob0..4、Trials0..4 与 Max0..4。
  • 实现 Trials == -1 时的全局坐标 Fisher-Yates 随机洗牌扫描机制。
  • 实现地表、多层墙体、屋顶与暗影层的原子级同步覆盖。
  • npm run typecheck 0 errors。
  • npx vitest run 全量通过并新增 LvlSub 替换测试。
  • npx tsx scripts/verify-packs.ts 1671/1671 项逐字节完全匹配。
### 目标与背景 以暴雪原版 1.13c `D2Common.dll` `DRLGTILESUB_DoSubstitutions` 为黄金标准,重构 `src/game/wilderness.ts` 与 `src/game/maze.ts` 中的地块替换逻辑。 ### 缺陷与审计发现 1. **缺失 Trials == -1 全排列洗牌查找**: 在 1.13c 中,当 `Trials == -1` 时,引擎会遍历全部 `(Width - SubWidth) * (Height - SubHeight)` 个候选坐标,构建全排列随机洗牌数组,顺序测试第一个合法位置。当前 Web 引擎仅支持简单有上限的随机尝试,导致部分小概率关键预设替换失败或遗漏。 2. **四层原子覆盖同步不足**: 暴雪原版在执行替换时 (`sub_6FD8ACE0`),同步覆盖 Floor、Wall(支持多层)、Roof 与 Shadow,并维护 Roof 计数。当前替换偏重于地面层,缺少对暗影与顶部遮罩的完整覆盖。 ### 验收条件 - [ ] 严格读取并应用 `LvlSub.txt` 中的 `Prob0..4`、`Trials0..4` 与 `Max0..4`。 - [ ] 实现 `Trials == -1` 时的全局坐标 Fisher-Yates 随机洗牌扫描机制。 - [ ] 实现地表、多层墙体、屋顶与暗影层的原子级同步覆盖。 - [ ] `npm run typecheck` 0 errors。 - [ ] `npx vitest run` 全量通过并新增 LvlSub 替换测试。 - [ ] `npx tsx scripts/verify-packs.ts` 1671/1671 项逐字节完全匹配。
troytt added this to the [M17] 核心地下城与碰撞层原版一致性 (1.13c) milestone 2026-09-18 06:36:38 +00:00
Author
Owner

已完成原版 1.13c LvlSub.txt 试验次数与全排列候选位地块替换算法 (DRLGTILESUB_DoSubstitutions) 对齐并合入 main (f36d1b4):

  • 实现 Trials == -1 时的全局候选位 Fisher-Yates 随机洗牌全排列扫描机制 (buildSubstitutionCandidatePermutation),消除固定左上扫描偏差并保证穷尽扫描。
  • 支持 SubTheme 0..4 索引的 Prob0..4、Trials0..4、Max0..4 与多变体随机抽样 (DRLGTILESUB_PickSubPreset)。
  • 实现 stampSubstitutionPatch 地表、墙体、屋顶 (type === 15)、暗影四层原子级同步覆盖。
  • 1671/1671 Pack 验证与 1114 项单元测试全量通过。
已完成原版 1.13c `LvlSub.txt` 试验次数与全排列候选位地块替换算法 (`DRLGTILESUB_DoSubstitutions`) 对齐并合入 `main` (`f36d1b4`): - 实现 `Trials == -1` 时的全局候选位 Fisher-Yates 随机洗牌全排列扫描机制 (`buildSubstitutionCandidatePermutation`),消除固定左上扫描偏差并保证穷尽扫描。 - 支持 `SubTheme` 0..4 索引的 `Prob0..4`、`Trials0..4`、`Max0..4` 与多变体随机抽样 (`DRLGTILESUB_PickSubPreset`)。 - 实现 `stampSubstitutionPatch` 地表、墙体、屋顶 (`type === 15`)、暗影四层原子级同步覆盖。 - 1671/1671 Pack 验证与 1114 项单元测试全量通过。
Sign in to join this conversation.
No Label
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#76
No description provided.