Commit Graph

359 Commits

Author SHA1 Message Date
troytt 1124830988 feat(skill-060): implement 1.13c Chilling Armor module and Vitest suite (#214) 2026-09-22 03:43:50 +00:00
troytt 084e1fd30a feat(skill-059): implement 1.13c Blizzard module and Vitest suite (#213) 2026-09-22 03:43:47 +00:00
troytt 2df5fdae46 feat(skill-058): implement 1.13c Energy Shield module and Vitest suite (#212) 2026-09-22 03:43:45 +00:00
troytt e9250c44ef feat(skill-057): implement 1.13c Thunder Storm module and Vitest suite (#211) 2026-09-22 03:43:43 +00:00
troytt 3246c1f73c feat(skill-056): implement 1.13c Meteor module and Vitest suite (#210) 2026-09-22 03:43:41 +00:00
troytt 8a6981f193 feat(skill-055): implement 1.13c Glacial Spike module and Vitest suite (#209) 2026-09-22 03:43:40 +00:00
troytt 0e7dfe1db4 feat(skill-054): implement 1.13c Teleport module and Vitest suite (#208) 2026-09-22 03:43:38 +00:00
troytt 13520d6d3c feat(skill-053): implement 1.13c Chain Lightning module and Vitest suite (#207) 2026-09-22 03:43:36 +00:00
troytt 9700297af4 feat(skill-052): implement 1.13c Enchant module and Vitest suite (#206) 2026-09-22 03:43:35 +00:00
troytt 9ce66a70fa feat(skill-051): implement 1.13c Fire Wall module and Vitest suite (#205) 2026-09-22 03:43:33 +00:00
troytt 3f32b5029e feat(skill-050): implement 1.13c Shiver Armor module and Vitest suite (#204) 2026-09-22 03:43:31 +00:00
troytt 195038b35a feat(skill-049): implement 1.13c Lightning module and Vitest suite (#203) 2026-09-22 03:43:29 +00:00
troytt 53aadb174c feat(skill-048): implement 1.13c Nova module and Vitest suite (#202) 2026-09-22 03:43:28 +00:00
troytt 74be483943 feat(skill-047): implement 1.13c Fire Ball module and Vitest suite (#201) 2026-09-22 03:43:26 +00:00
troytt 296766e1c1 feat(skill-046): implement 1.13c Blaze module and Vitest suite (#200) 2026-09-22 03:43:24 +00:00
troytt b8b4799899 feat(skill-045): implement 1.13c Ice Blast module and Vitest suite (#199) 2026-09-22 03:43:22 +00:00
troytt c95d27711b feat(skill-044): implement 1.13c Frost Nova module and Vitest suite (#198) 2026-09-22 03:43:21 +00:00
troytt 8b665cb632 feat(skill-043): implement 1.13c Telekinesis module and Vitest suite (#197) 2026-09-22 03:43:19 +00:00
troytt 7b368e215c feat(skill-042): implement 1.13c Static Field module and Vitest suite (#196) 2026-09-22 03:43:17 +00:00
troytt ec97bbe9c1 feat(skill-041): implement 1.13c Inferno module and Vitest suite (#195) 2026-09-22 03:43:16 +00:00
troytt 7cf35b548b feat(skill-040): implement 1.13c Frozen Armor module and Vitest suite (#194) 2026-09-22 03:43:14 +00:00
troytt 2362dc40da feat(skill-039): implement 1.13c Ice Bolt module and Vitest suite (#193) 2026-09-22 03:43:12 +00:00
troytt 234fef3103 feat(skill-038): implement 1.13c Charged Bolt module and Vitest suite (#192) 2026-09-22 03:43:11 +00:00
troytt 948ffb581e feat(skill-037): implement 1.13c Warmth module and Vitest suite (#191) 2026-09-22 03:43:09 +00:00
troytt 62fde25987 feat(skill-036): implement 1.13c Fire Bolt module and Vitest suite (#190) 2026-09-22 03:43:07 +00:00
troytt 172db498e3 feat(skill-035): implement 1.13c Lightning Fury module and Vitest suite (#189) 2026-09-22 03:43:05 +00:00
troytt 7dbae1d717 feat(skill-034): implement 1.13c Lightning Strike module and Vitest suite (#188) 2026-09-22 03:39:16 +00:00
troytt 69df633fe7 feat(skill-033): implement 1.13c Pierce module and Vitest suite (#187) 2026-09-22 03:39:11 +00:00
troytt 3318f6b455 feat(skill-032): implement 1.13c Valkyrie module and Vitest suite (#186) 2026-09-22 03:39:03 +00:00
troytt 6561498ddc feat(skill-031): implement 1.13c Freezing Arrow module and Vitest suite (#185) 2026-09-22 03:38:56 +00:00
troytt 308cc1c663 feat(skill-030): implement 1.13c Fend module and Vitest suite (#184) 2026-09-22 03:38:50 +00:00
troytt 20f53d2149 feat(skill-029): implement 1.13c Evade module and Vitest suite (#183) 2026-09-22 03:38:43 +00:00
troytt 02b5ab1a79 feat(skill-028): implement 1.13c Dopplezon module and Vitest suite (#182) 2026-09-22 03:38:35 +00:00
troytt a5beae70dc feat(skill-027): implement 1.13c Immolation Arrow module and Vitest suite (#181) 2026-09-22 03:38:27 +00:00
troytt 94f77a5c93 feat(skill-026): implement 1.13c Strafe module and Vitest suite (#180) 2026-09-22 03:38:19 +00:00
troytt 9d1b9105cc feat(skill-025): implement 1.13c Plague Javelin module and Vitest suite (#179) 2026-09-22 03:38:14 +00:00
troytt 2654262432 feat(skill-024): implement 1.13c Charged Strike module and Vitest suite (#178) 2026-09-22 03:38:04 +00:00
troytt c8477a5a15 feat(skill-023): implement 1.13c Penetrate module and Vitest suite (#177) 2026-09-22 03:37:58 +00:00
troytt eca9504b05 feat(skill-022): implement 1.13c Guided Arrow module and Vitest suite (#176) 2026-09-22 03:37:52 +00:00
troytt 3c01cdaf05 feat(skill-021): implement 1.13c Ice Arrow module and Vitest suite (#175) 2026-09-22 03:37:42 +00:00
troytt a77db32397 feat(skill-020): implement 1.13c Lightning Bolt module and Vitest suite (#174) 2026-09-22 03:37:34 +00:00
troytt 4f9707ac1f feat(skill-019): implement 1.13c Impale module and Vitest suite (#173) 2026-09-22 03:37:25 +00:00
troytt 16253ffb3a feat(skill-018): implement 1.13c Avoid module and Vitest suite (#172) 2026-09-22 03:37:16 +00:00
troytt 7824e889e1 feat(skill-017): implement 1.13c Slow Missiles module and Vitest suite (#171) 2026-09-22 03:37:09 +00:00
troytt 85347c7e69 feat(skill-016): implement 1.13c Exploding Arrow module and Vitest suite (#170) 2026-09-22 03:37:00 +00:00
troytt c3b3fa3404 feat(skill-015): implement 1.13c Poison Javelin module and Vitest suite (#169) 2026-09-22 03:36:54 +00:00
troytt d8ed948816 feat(skill-014): implement 1.13c Power Strike module and Vitest suite (#168) 2026-09-22 03:36:49 +00:00
troytt fa65670572 feat(skill-013): implement 1.13c Dodge module and Vitest suite (#167) 2026-09-22 03:36:42 +00:00
troytt ffd4e6ae51 feat(skill-012): implement 1.13c Multiple Shot module and Vitest suite (#166) 2026-09-22 03:36:36 +00:00
troytt a8bfc318e0 feat(skill-011): implement 1.13c Cold Arrow module and Vitest suite (#165) 2026-09-22 03:36:29 +00:00
troytt 1294496555 feat(skill-010): implement 1.13c Jab module and Vitest suite (#164) 2026-09-22 03:36:21 +00:00
troytt 5ec7c16294 feat(skill-009): implement 1.13c Critical Strike module and Vitest suite (#163) 2026-09-22 03:36:16 +00:00
troytt 50599c6833 feat(skill-008): implement 1.13c Inner Sight module and Vitest suite (#162) 2026-09-22 03:36:09 +00:00
troytt d94b96241a feat(skill-007): implement 1.13c Fire Arrow module and Vitest suite (#161) 2026-09-22 03:36:02 +00:00
troytt f5c0b8f8b8 feat(skill-006): implement 1.13c Magic Arrow module and Vitest suite (#160) 2026-09-22 03:35:55 +00:00
troytt cc44f72536 feat(skill-005): implement 1.13c Left Hand Swing module and Vitest suite (#159) 2026-09-22 03:35:46 +00:00
troytt b87c7281f8 feat(skill-004): implement 1.13c Left Hand Throw module and Vitest suite (#158) 2026-09-22 03:35:38 +00:00
troytt 1d73542791 feat(skill-003): implement 1.13c Unsummon module and Vitest suite (#157) 2026-09-22 03:35:29 +00:00
troytt 5e2f189584 feat(skill-002): implement 1.13c Throw module and Vitest suite (#156) 2026-09-22 03:35:23 +00:00
troytt 7be0b1c707 feat(skill-001): implement 1.13c Kick module and Vitest suite (#155) 2026-09-22 03:35:14 +00:00
troytt 49abeb5f8c feat(skill-000): implement 1.13c Attack module and Vitest suite (#154) 2026-09-22 03:35:06 +00:00
troytt 550787cb0a feat(engine): implement R1 universal 1.13c skill engine, 7-class renderer, arena harness, and M2/E2E suites 2026-09-22 03:22:02 +00:00
troytt 244bdc1efb fix: resolve slug edge cases and Act 5 Pandemonium level names (Fixes #147) 2026-09-22 03:17:22 +00:00
troytt 09cc23b53c fix: load localized map area names from tbl on transition (Fixes #147) 2026-09-22 02:55:24 +00:00
troytt f24ad292ca feat(char): pack and render all 7 hero classes with R8 atlases and tests 2026-09-22 02:38:22 +00:00
troytt c58cb60f79 fix: align ControlBar XP bar coordinates and 10-segment ticks (Fixes #146) 2026-09-22 02:06:48 +00:00
troytt 75eba8d9ff feat(anim): 实现 Schema 2 实体图集打包与全量验证 (M1 完成) 2026-09-21 14:03:17 +00:00
troytt 3fa29ec0b8 feat(anim): 实现基于 8.8 定点数时钟的实体动画状态机与事件调度器 (ActorAnimator) 2026-09-21 13:50:23 +00:00
troytt 5586c50c8b Merge branch 'feat/animation-system' into main: 合并动画锚点系统与 animdata 解析 2026-09-21 13:30:23 +00:00
troytt f58ae5b693 feat(drlg): 注入 10,029 条原版 DT1 多候选地表加权池,修复库拉斯特与雪原瓦片并完成全量验证 (Phase D3) 2026-09-21 13:30:14 +00:00
troytt 380d01c6c3 feat(anim): 实现动画锚点系统、animdata 解析与玩家/怪物动画合成对齐 2026-09-21 13:30:04 +00:00
troytt e2a74cc8f0 feat(ui/controls): 实现完整 UI/HUD 系统、操作快捷键对齐与装备词条染色 (fixes #134, fixes #135, fixes #136, fixes #137, fixes #138, fixes #139, fixes #140)
- R1 (Issue #134): 离线烘焙预生成 UI 图集 (public/ui/) 与 embedded DropTables,彻底消除 2 秒纯色占位回退,实现零运行期 MPQ/DLL 依赖
- R2 (Issue #135): 修复地图缩放 (0.4x~8.0x) 及多 DPR 下 NPC 名称标签与模型顶部的投影对齐
- R3 (Issue #136): HUD 与全屏画布采用 1:1 纵横比等比缩放与居中,彻底修复宽屏下红蓝球被横向拉伸为椭圆的问题
- R4 (Issue #137): 传送点菜单 (Waypoint Menu) 支持点击无缝跨场景传送,随机选取地图变体并平稳降落在对应小站子网格
- R5 (Issue #138): 角色属性面板 (InvChar6) 文本与数字完美对准背景凹槽石框,加点按钮对齐
- R6 (Issue #139): 物品栏 5 级回退 DC6 图标渲染,消灭空白占位框;装备 Tooltip 等比缩放与视口翻折防遮挡
- R7 (Issue #140): 任务日志界面集成 1~5 幕全量 27 个任务图标 (a1q1..a5q6) 及 27 帧已完成印章,第 4 幕自动进行插槽钳制保护
- Controls Parity: 还原原版左键移动/NPC交互/小站/攻击,Shift 强制原地站立攻击,右键释放技能与被动/无技能移动回退,解除 A/W/S/1..4 快捷键与移动冲突
- Tooltips & Dyes: 基于 1.13c PL2 调色板 Table 104 (cgrn) 渲染翡翠绿军帽,战争召唤按 descpriority 完整呈现 11 行符文之语属性与三行正统标题
2026-09-21 11:09:10 +00:00
troytt ca55cd29d8 feat(i18n): 补全暗黑2全量词缀汉化、修复语序倒装、充能技能负数与属性词条解析 (Issue #122) 2026-09-19 12:35:08 +00:00
troytt 7f7b769840 feat(i18n): 装备与词条中英文多语言切换支持 EN/ZH/双语 (fixes #122) 2026-09-19 12:05:24 +00:00
troytt fc6388779e feat(tooltip/drop): 接线properties.ts实现显示层数据驱动化并完成Phase4 1.13c细节对齐 (fixes #133) 2026-09-19 11:06:06 +00:00
troytt 308e16f955 fix(affix): 校验词缀classspecific职业限制并支持职业专属装备classlevelreq等级需求 (fixes #132) 2026-09-19 10:51:55 +00:00
troytt 75eb4f4f4b feat(drop/tooltip): 实现Superior/LowQuality属性、Ethereal无形与Socket打孔生成及Rare逐槽分配 (fixes #131) 2026-09-19 10:43:20 +00:00
troytt 041cd65ce0 fix(tooltip): 对齐1.13c dgrp全等合并规则,四抗与四维属性仅在全部相等时折叠显示 (fixes #130) 2026-09-19 10:32:47 +00:00
troytt 6d2de24000 feat(drop/affix): 将AutoMagic.txt与1.13c StaffMods接入掉落与Tooltip管线 (fixes #129) 2026-09-19 10:27:07 +00:00
troytt 72eb7dea8b fix(affix/tooltip): 为魔法与稀有词缀补齐NON_RANDOM_RANGE_CODES保护,保留元素伤害区间与触发充能技能参数 (fixes #128) 2026-09-19 10:09:35 +00:00
troytt a618ed7501 fix(drop): 基于ItemTypes.txt标志驱动品质判定与classSpecific传递,杜绝普通/劣质戒指护身符 (fixes #127) 2026-09-19 10:01:46 +00:00
troytt b31a199e6b fix(drop): 补齐Boss掉落monsterType=4使底模升级走Good档并建立1.13c回归基线 (fixes #126) 2026-09-19 09:52:01 +00:00
troytt f68b1de4ec feat(tooltip/stats): 实现武器防具基础属性增强与底模对照、词条合并与ItemStatCost优先级排序 (fixes #123, #125)
- Issue #123: 计算武器1H/2H增强伤害 (dmg%, dmg-min, dmg-max)、防具增强防御 (ac%, ac)、力量/敏捷/等级需求 (ease, levelreq) 及耐久度上限 (dur, dur%, 3x/2x降级),并附带原始底模数值对照(如 Two-Hand Damage: 36 to 48 (18 to 24), Defense: 260 (130), Required Strength: 124 (156))
- Issue #125: 实现 aggregateAndSortProperties:
  * 自动合并 fire-min + fire-max -> Adds X-Y Fire Damage(冰、电、毒、物理同理)
  * 自动合并 dgrp=2 四抗为 All Resistances +X,dgrp=1 四维为 +X to All Attributes
  * 累加前后缀同类标量词缀,并按 ItemStatCost.txt descpriority (180..0) 严格降序排列
- 全程保持 1.13c 官方英文规范,新增 tests/item-tooltip-123-125.test.ts 专项单测通过

TAG=agy
CONV=aade657e-0c8e-42ff-a5f2-87b2afe80e02
2026-09-19 08:05:07 +00:00
troytt 2cf5acb459 fix(tooltip/affix): 对齐1.13c Properties/ItemStatCost/.tbl全量182项词条模板与descFunc=11规则 (fixes #124)
- 溯源并修正 rep-dur (ItemStatCost ID 252, descFunc=11, ModStre9t/ModStre9u):
  按 seconds = Math.floor(100 / par) 计算恢复周期(如 par=5 为 20s,par=20 为 5s,par=3 为 33s)
- 内嵌 1.13c Skills.txt + SkillDesc.txt + ENG .tbl 全量 222 项技能名称与职业限制映射(支持 Wearwolf->Werewolf, Summon Fenris->Summon Dire Wolf, Plague Poppy->Poison Creeper, 197->Firestorm 等)
- 内嵌 1.13c CharStats.txt StrSkillTab1..3 + StrClassOnly 全部 21 个技能系 (par 0..20)
- 覆盖 UniqueItems / SetItems / Sets / MagicAffixes / AutoMagic 全部 182 个唯一属性代码,0 处回退泄露
- 新增 tests/item-tooltip-124.test.ts 覆盖全表 182 项属性代码断言,全量 1619 项单测通过

TAG=agy
CONV=aade657e-0c8e-42ff-a5f2-87b2afe80e02
2026-09-19 07:43:58 +00:00
troytt 84686b6939 feat(items): 属性词条具体数值Roll点、统一1.13c英文规范与品质降级Fallback机制 (Issue #122)
- 词条具体数值Roll点:Unique/Set/Magic/Rare 具备属性范围区间时通过 D2 PRNG randRange 随机 roll 出具体离散数值,保存在 Item.rolledProps,消除 +11-20 这类区间显示
- 统一英文官方原文:所有装备底模(Shako, Monarch 等)、品质、属性词条(+X to Mana, All Resistances +X% 等)统一采用 1.13c 英文 canonical 原文,在 Gitea 开启 Issue #122 跟踪中文本地化
- 严谨对齐 1.13c 品质 Fallback 逻辑:
  * Charms (cm1/cm2/cm3) 无法生成 Rare,Unique/Set 失败时统一降级为 Magic
  * 装备类底模 Unique 失败降级为 Rare 且最大耐久度 x3 (Triple Durability)
  * 装备类底模 Set 失败降级为 Magic 且最大耐久度 x2 (Double Durability)
  * Rare 词缀生成失败降级为 Magic 且最大耐久度 x2
- 补充 drop-pipeline.test.ts Section 7 专项单元测试,全量 1614 项测试全部通过
2026-09-19 04:17:15 +00:00
troytt c9a9a5558d fix(loot): 修复怪物选择器TC被Baal(H)死锁覆盖的缺陷 (Issue #121)
- 修复 getEffectiveTcName 中因比对 tcInput.value 产生误判,导致所有选定怪物均错误回退到初始 Baal (H) 的核心 Bug
- 引入清晰独立的 customTcOverride 状态变量,仅在用户显式提交高级自定义 TC 时生效
- 在选择新怪物、切换难度或切换任务首杀状态时自动重置 customTcOverride,保证当前怪物真实 1.13c TC 生效
- 优化怪物卡片 Picks 次数与单次 NoDrop 比例展示,提升数据可读性
- 新增 tests/loot.test.ts 专项测试验证 Council、Andariel、Pindleskin 等所有预设怪物 TC 解析正确性
2026-09-19 03:58:27 +00:00
troytt 9b4347a72f feat(boss): 新建幕Boss击杀模拟与真实属性掉落页面 (boss.html)
- 新增 boss.html 及配套前端交互引擎 src/boss.ts,支持 Act 1~5 关底 Boss(安达利尔、督瑞尔、墨菲斯托、迪亚波罗、巴尔)
- 支持 普通/噩梦/地狱 三大难度与首杀 (Quest Kill) 切换
- 支持 1~8 人房间人数 (PP) 与 0~1000% 寻宝率 (MF) 动态调整
- 提取并内置 1.13c 完整掉落表数据 (src/data/canonical-drop-data.ts),支持零延迟离线秒开解析
- 修复 D2Rng 默认种子全零导致 NoDrop 的历史缺陷,以及杂项物品误入品质判定的问题
- 新增 src/game/item-tooltip.ts,完整还原暗金/套装/亮金/魔法/符文/基础装备的暗黑2经典属性面板
- 新增 tests/boss.test.ts 单元测试并全量通过 1603 项测试
2026-09-19 03:42:32 +00:00
troytt 79bf8f4cda perf(scene): 解决首屏阻塞式 166 次 MPQ Range 请求导致的地图载入卡顿 (Issue #117)
- 将 DropTables 移出首屏临界路径,消除 runScene 启动时 166 次 MPQ HTTP Range 阻塞
- 引入 getSharedDropTables 全局单例记忆化缓存,避免跨地图切关卡时重复挂载与重读 MPQ
- 在 boot() 初始阶段提早非阻塞式预热,并在 GameEngine 创建后异步注入 dropTables
- 在 GameEngine 中添加 setDropTables 方法支持动态掉落表注入
- 新增 tests/scene-drop-preload.test.ts 覆盖单例缓存与延迟注入行为验证

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-19 03:03:28 +00:00
troytt 3317ef0d90 feat(loot): 完善首杀路由、种子锁规避与暂停继续交互 (Issue #110)
- 增强首杀/Bug杀模拟:支持 UI 首杀切换与 Boss 首杀 TC 自动路由(如 Baal -> Baalq)
- 修复无种子参数时 PRNG 零锁死导致的 100% NoDrop 偶发故障
- 增强逆向检索:掉落来源按综合概率降序排列并高亮展示
- 交互优化:新增蒙特卡洛模拟暂停/继续与优雅中断控制

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 15:05:37 +00:00
troytt afc653dbc8 Merge branch 'issue-115' 2026-09-18 14:59:24 +00:00
troytt 111a631dc7 fix(monsters): 修正 SuperUniques.txt 随从类名转录笔误与打包白名单脱节 (Issue #115)
TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:58:59 +00:00
troytt 51c869d547 Merge branch 'issue-116' 2026-09-18 14:32:27 +00:00
troytt ad822bfe31 Merge branch 'issue-114' 2026-09-18 14:32:19 +00:00
troytt 0535a63174 Merge branch 'issue-112' 2026-09-18 14:32:12 +00:00
troytt ed344259a1 fix(tiles): 参照 1.13c DRLGROOM_LoadDt1Files 补充常驻全局通用 DT1 (InvisWal / Blank / Warp) (Issue #112)
参照 1.13c D2Common.dll (DRLGROOM_LoadDt1Files @ 0x6fdb8400),在加载完 LvlTypes.txt 后无条件追加 3 个全局常驻通用 DT1:
- data\global\tiles\Act1\Outdoors\Blank.dt1
- data\global\tiles\Act1\Barracks\InvisWal.dt1
- data\global\tiles\Act1\Barracks\Warp.dt1

其中 InvisWal.dt1 包含 style=49 sequence=7 的地面阻挡瓦片 (walk-blocking collision invisible wall),解决了 Act 5 Hell 1 (125) 和 Pandemonium 3 (135) 等全地图漫游中报 missingTile: floor style=49 sequence=7:0 的问题。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:31:42 +00:00
troytt fd67de7b1b fix(d2map): 修正空单元格阻挡掩码与玩家出生点虚空悬空问题 (Issue #114)
1. 在 buildIsoMapScene 中为所有无有效非隐藏地面的单元格(纯黑虚空)标记全部 25 个子瓦片为 blocked = 1 及 COLLIDE_MASK_INVALID (COLLIDE_BLANK | COLLIDE_WALL)。
2. 在 level-links.ts 中实现增强型 findIsoSpawn 并从 d2map.ts 导出,确保出生点单元格必须拥有有效地面且 blocked === 0,优先选取有效传送点/入口位置,或在包含地面的最大可行走连通区域中定位。
3. 添加单元测试 tests/iso-spawn-void-guard.test.ts,验证 16x16 画布中 4x4 房间外的虚空单元格全阻挡,且出生点必定落在房间内。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:30:43 +00:00
troytt f111ba5a74 fix(drlg): 消除 pickVariant 45度斜向机械平铺条纹并纠正生成器虚构 Style (Issue #116)
- src/game/d2map.ts: 替换 pickVariant 中线性的 (seed + cellX) * cellY 乘法公式为 SplitMix64 空间坐标散列,消除 45 度斜向机械平铺条纹并解决 row 0 退化问题。
- src/game/wilderness-acts.ts: 确保 Mesa 关卡(104~106)峡谷地面始终使用 Mesa 真实的 style 10 地砖,杜绝仅在 Lava 存在的 style 20 引用。
- src/game/wilderness-siege.ts: 攻城木桩栅栏破坏缺口两端(type 7 pillar)改用 fence.dt1 style 2 真实存在的 sequence 10 与 11。
- tests/wilderness-siege-strips.test.ts: 更新攻城木桩断言,验证残破柱桩(type 7)匹配真实的 sequence 10 与 11。
- tests/variant-distribution.test.ts: 新增 64x64 网格变体均匀分布与对角无周期性断言,以及 Kurast、Mesa、Siege 的真实合法 DT1 样式断言。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:30:37 +00:00
troytt 985d85ebb0 fix(wilderness): 修复 pack-act-assets 漏传 dt1Libraries 及 wilderness 自动贴图跨章节污染 (Issue #113)
- scripts/pack-act-assets.ts: 在 generateWilderness 中透传 dt1Libraries: resolvedLibraries,保证地面自动过渡与瓦片解析能获得关卡所加载的全部 DT1 库。
- src/game/wilderness.ts:
  - applyGroundTransitions: 当 options.libraries 为空或未指定时直接返回 0 处过渡,修复 isTileAvailable 无库时无条件返回 true 的漏洞。
  - 增加关卡类型与章节编号守卫(非 Act 1 - Wilderness 关卡与非 Act 1 关卡跳过),避免对 Mesa (104)、Desert (43)、Barricade (112, 117) 注入无效瓦片。
  - 在 phase 1 与 phase 2 中严格校验 (update.style, update.sequence) 瓦片是否存在于当前 DT1 库中,确保不会写入不存在的过渡瓦片。
- tests/wilderness-ground-blend.test.ts: 更新并补充 auto-tiling 测试,覆盖无库安全回退以及非 Act 1 关卡拦截。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 14:26:16 +00:00
troytt 370dcc05b1 feat(items): 用 TC 树替换 rollDrop 并彻底删除 demo 物品数据 (Issue #107) 2026-09-18 12:54:50 +00:00
troytt 064e956de6 feat(items): 用 TC 树替换 rollDrop 并彻底删除 demo 物品数据 (Issue #107) 2026-09-18 12:54:21 +00:00
troytt 6a85c96a5b feat(items): 新增掉落模拟器与概率表网页 loot.html (Issue #110) 2026-09-18 12:20:28 +00:00
troytt acd027bd38 feat(items): 实现物品名本地化三层链与中英文 fallback (Issue #108) 2026-09-18 12:01:36 +00:00
troytt 399aed7d95 feat(items): 实现物品名本地化三层链与中英文 fallback (Issue #108) 2026-09-18 12:00:46 +00:00
troytt 33ce4e79b8 feat(items): 实现符文之语 Runes.txt 与镶嵌装配 (Issue #105) 2026-09-18 11:55:36 +00:00
troytt 3cdf9dc8fc feat(items): 实现符文之语 Runes.txt 与镶嵌装配 (Issue #105) 2026-09-18 11:55:12 +00:00
troytt b576f634be feat(items): 实现 TreasureClassEx 展开算法 (Issue #101) 2026-09-18 11:50:29 +00:00
troytt bc05af8baa feat(items): 实现 TreasureClassEx 展开算法 (Issue #101) 2026-09-18 11:49:45 +00:00
troytt 8b61ed059f feat(items): 实现宝石与符文镶嵌属性 Gems.txt (Issue #106) 2026-09-18 11:49:02 +00:00
troytt 57322cabad feat(items): 实现词缀抽取与 alvl 计算 (Issue #104) 2026-09-18 11:49:02 +00:00
troytt 27288156a8 feat(items): 实现 auto-TC 运行时生成 (Issue #100) 2026-09-18 11:49:01 +00:00
troytt aff10832c3 feat(items): 实现宝石与符文镶嵌属性 Gems.txt (Issue #106) 2026-09-18 11:48:37 +00:00
troytt 390816c4cc feat(items): 实现词缀抽取与 alvl 计算 (Issue #104) 2026-09-18 11:48:25 +00:00
troytt ce07af1b9a feat(items): 实现 auto-TC 运行时生成 (Issue #100) 2026-09-18 11:47:34 +00:00
troytt 6754df22eb feat(items): 实现 ItemRatio 品质判定 (Issue #102) 2026-09-18 11:47:25 +00:00
troytt 6991ffa249 feat(items): 实现 ItemRatio 品质判定 (Issue #102) 2026-09-18 11:46:42 +00:00
troytt 94be8ceb87 feat(items): 实现 exceptional / elite 基底升级 (Issue #103) 2026-09-18 11:46:21 +00:00
troytt ca3512f195 feat(wilderness): 还原边界顶点链表与格子级土路算法替换 Catmull-Rom 样条 (Issue #82)
- 实现 DRLGVER_CreateVertices (D2MOO DrlgDrlgVer.cpp:15-226):
  * 构建关卡边界矩形封闭双向循环链表 (顺时针 V0(0,0), V1(w,0), V2(w,h), V3(0,h))
  * 对边界连接/门/预置插入 1-2 个顶点 (支持 span [v15, v16])
  * 设置标识: dwFlags |= 1 (连接), 预置房 dwFlags |= 2
  * 采用相对坐标 (x - originX, y - originY)
  * 消耗 0 次随机数 rolls
  * 从 UNIMPLEMENTED_PASSES 移除 DRLGVER_CreateVertices
- 实现 DRLGOUTDOORS_CalculatePathCoordinates (DrlgOutdoors.cpp:1139-1168):
  * 边界顶点 8 格吸附 (ALTDIR_WEST: +11, ALTDIR_NORTH: +11, ALTDIR_EAST: -5, ALTDIR_SOUTH: -5)
  * Math.trunc 保持 C 整数截断一致性
  * 兼容 (pLevel, pVertex1, pVertex2) 与 (vertex, origin) 调用签名
- 实现 DRLGOUTDOORS_CalculateHubCoordinates (DrlgOutdoors.cpp:1171-1278 / sub_6FD7F5B0):
  * 桥梁 (0x10): 锚定桥梁坐标 (8*bx+3, 8*by+3)
  * 单顶点: 关卡中心
  * 多顶点: 平均坐标为中心,向外 0..7 半径四方向螺旋寻找未阻挡有效格子 (0x1B81)
- 替换 Catmull-Rom 样条及随机抖动,使用格子级确定性 Bresenham 线段连接,0 RNG rolls
- 添加单元测试 tests/outdoor-vertices-path.test.ts 覆盖全部算法特性

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:37:20 +00:00
troytt 6ead63c6c5 feat(items): 加载 SetItems.txt 与 Sets.txt (Issue #98) 2026-09-18 11:36:05 +00:00
troytt 73ed3292e3 feat(items): 加载 SetItems.txt 与 Sets.txt (Issue #98) 2026-09-18 11:35:37 +00:00
troytt e3ab760ce1 feat(items): 加载 TreasureClassEx.txt (Issue #99) 2026-09-18 11:35:29 +00:00
troytt 52c8161755 feat(items): 加载 TreasureClassEx.txt (Issue #99) 2026-09-18 11:35:05 +00:00
troytt e3a8eb67fe test(tiles): 同步 Kurast/Mesa/Desert/Barricade 真实 DT1 瓦片断言 (Issue #83)
- 同步 wilderness-acts.test.ts、wilderness-roads-multi-act.test.ts、wilderness-siege-strips.test.ts 断言以适配真实的 DT1 瓦片编号
- 微调 wilderness-siege.ts 破损木桩 sequence 与投石台矮墙 prop1

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:32:55 +00:00
troytt 9b980b8218 feat(items): 加载 UniqueItems.txt (Issue #97) 2026-09-18 11:29:47 +00:00
troytt 6b18783fbc feat(items): 加载 UniqueItems.txt (Issue #97) 2026-09-18 11:29:08 +00:00
troytt 625e31a5d1 feat(items): 加载 MagicPrefix.txt 与 MagicSuffix.txt (Issue #94) 2026-09-18 11:29:05 +00:00
troytt 866cdd4988 feat(items): 加载 MagicPrefix.txt 与 MagicSuffix.txt (Issue #94) 2026-09-18 11:28:39 +00:00
troytt d4e219fb02 feat(items): 加载 Misc.txt (Issue #93) 2026-09-18 11:28:23 +00:00
troytt 5fbd220ca2 feat(items): 加载 Weapons.txt (Issue #92) 2026-09-18 11:27:40 +00:00
troytt 98daef5adf feat(items): 加载 Weapons.txt (Issue #92) 2026-09-18 11:27:13 +00:00
troytt 050cb25dfe feat(items): 加载 Misc.txt (Issue #93) 2026-09-18 11:26:45 +00:00
troytt 193c1209b2 feat(items): 加载 Armor.txt (Issue #91) 2026-09-18 11:24:47 +00:00
troytt 7187154ac8 feat(wilderness): 还原 DRLGOUTDOORS_SpawnAct12Waypoint 原版 8x8 单元网格打乱与有效性判定 (Issue #80)
- 还原 1.13c 原版 DRLGOUTDOORS_SpawnAct12Waypoint (D2Common.dll ≈0x6FD92700) 算法
- Branch A: Cold Plains (level 3) 特例:寻址连接到 Blood Moor (level 2) 的边界网格,执行四向边界 clamp 并写入 0x20000 标记,精准消耗 0 次 RNG rolls
- Branch B: 常规路径:构建 (nGridWidth-2)*(nGridHeight-2) 区域坐标数组,执行 2*nArea 轮随机对调打乱(暴雪原版 swap shuffle,非 Fisher-Yates),逐项使用 TestGridCellSpawnValid ((flags & 0x1B81) === 0) 判定有效性格子并写入 0x10000 标记
- 清理旧有试探性评分启发逻辑(LANDMARK_REGEX、isNearDirtRoad、hubRadius 及硬编码 Act 3 判定区)
- 添加 tests/outdoor-waypoint-113c.test.ts 单元测试并对齐已有测试用例

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:15:41 +00:00
troytt a1a549e8a0 feat(items): 加载 ItemStatCost.txt 与 Properties.txt (Issue #90) 2026-09-18 11:14:59 +00:00
troytt fb79151888 feat(items): 加载 ItemStatCost.txt 与 Properties.txt (Issue #90) 2026-09-18 11:14:41 +00:00
troytt a935869717 feat(items): 加载 AutoMagic.txt (Issue #96) 2026-09-18 11:13:37 +00:00
troytt 060291163c feat(items): 加载 AutoMagic.txt (Issue #96) 2026-09-18 11:13:14 +00:00
troytt 64d5c728b9 feat(items): 冻结物品数据结构与 .d2s 位对齐规格预留 (Issue #88) 2026-09-18 11:13:02 +00:00
troytt 983c894439 feat(items): 加载 RarePrefix.txt 与 RareSuffix.txt (Issue #95) 2026-09-18 11:12:35 +00:00
troytt 24fbc3b5c1 feat(items): 冻结物品数据结构与 .d2s 位对齐规格预留 (Issue #88) 2026-09-18 11:12:17 +00:00
troytt 20a8ff58f7 feat(items): 加载 RarePrefix.txt 与 RareSuffix.txt (Issue #95) 2026-09-18 11:12:17 +00:00
troytt 2a4ef21ce6 feat(items): 加载 ItemTypes.txt 与 Equiv 继承判定 (Issue #89) 2026-09-18 11:11:33 +00:00
troytt 5e5d897fbd feat(items): 加载 ItemTypes.txt 与 Equiv 继承判定 (Issue #89) 2026-09-18 11:11:07 +00:00
troytt 2d7c7be510 feat(maze): 补齐后宫、地窖、蜘蛛巢穴与熔岩层迷宫特殊预设表 (Issue #84)
补齐 MAZE_LEVEL_TYPE_PROFILES 中缺失特殊预设表的 4 个关卡类型:
- Act 2 - Harem: prev 与 next 楼梯连接表 (Level 51)
- Act 2 - Basement: prev、waypoint 与 next 连接表 (Levels 52, 53, 54)
- Act 3 - Spider: prev 楼梯与 golden chest (Khalim's Eye) 宝箱表 (Levels 84, 85)
- Act 5 - Lava: prev 红门与 golden chest 宝箱表 (Levels 125, 126, 127)

同时在 maze-special-passes 中补充对应 LvlPrest.txt Def 常量与 def registry,
使 UNIMPLEMENTED_PASSES 归零并通过全量测试。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 11:09:44 +00:00
troytt 928d42220c feat(rng): 实现 1.13c PRNG 64位 LCG 与 per-unit seed (Issue #87) 2026-09-18 11:08:37 +00:00
troytt 5d6dc8a15f feat(anim): 接入 LvlPrest.txt 的 Animate 列还原逐关卡动画速度 (Issue #85)
- 从 LvlPrest.txt 读取 Animate 列作为动画速度 animSpeed (D2 1.13c 默认速度 80,即 80/256 帧/tick @ 25Hz => 128ms/帧)
- 在 animated-tiles.ts 中提供 frameDurationMsFromAnimSpeed 公式函数与 128ms 默认帧时长
- 统一在 acts.ts、maze.ts、preset.ts、wilderness.ts、pack-act-assets.ts 中解析并传递 animSpeed 与 frameDurationMs
- 在 act-scene.ts 中接入 MapRuntime 与 PackSceneJson,渲染循环根据关卡独立的 frameDurationMs 更新动画瓦片
- 更新 scripts/verify-packs.ts 校验门禁并通过 1671/1671 项断言
- 新增 tests/animated-tiles-speed.test.ts 专项单测,全量 vitest 1137 测试全通

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:57:00 +00:00
troytt 24eb66d2e6 fix(wilderness): 修复 Act 1 荒野关卡内部连通性与通路屏障 (Issue #79)
- 将 Act 1 荒野道路地面瓦片由 style 5 (在 Town/Floor.dt1 中为不可通行的水面瓦片) 修正为 style 0 (可通行的土地瓦片),消除横跨地图阻断通行的碰撞墙屏障
- 确保所有 Act 1 荒野关卡 (Blood Moor, Cold Plains, Stony Field, Dark Wood, Black Marsh, Tamoe Highland) 连通可达率全部达到 100%
- 更新测试断言以匹配修正后的瓦片 style 0
- 保持 DRLGROOMTILE_GetTileCache 中 mandatory seed 确定性机制不变

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:52:05 +00:00
troytt 045dd2b6b6 refactor(drlg): 清理伪造的 Blizzard 命名与重复别名 (Issue #81)
- 移除 src/game/wilderness.ts 中的伪造 Blizzard 别名:
  - 删除 DRLGROOMTILE_ComputeNeighborMask = computeNeighborMask
  - 删除 DRLGROOMTILE_ApplyTransitions = applyGroundTransitions
- 保留本地实现函数 computeNeighborMask 与 applyGroundTransitions,并在其 JSDoc
  注释中明确标注为 Web 端移植自定义算法,非暴雪原版 DRLG 引擎 API。
- 移除 src/game/level-links.ts 中重复的 DRLGOUTDOORS_SpawnAct12Waypoint 别名,
  保留 findWaypointSpot 作为本地函数与模块导出;保留 src/game/wilderness.ts 中
  全库唯一的 DRLGOUTDOORS_SpawnAct12Waypoint 导出。
- 新增 tests/drlg-alias-guard.test.ts 回归守卫测试,校验 wilderness.ts、maze.ts、
  level-links.ts 导出项及源码静态 AST/文本,确保伪造别名绝不复发且小站导出唯一。
- 同步更新 tests/wilderness-ground-blend.test.ts 与 tests/wilderness-waypoints-shrines.test.ts
  移除对旧别名的断言与导入。
- 同步更新 scripts/verify-packs.ts 兜底楼梯基线容差 (80->92) 对齐全关卡完整烘焙集。

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:36:27 +00:00
troytt 3fba5e9136 fix(wilderness): 消除 DRLGROOMTILE_GetTileCache 中的 Math.random 强制注入确定性 seed (Issue #78)
- 在 TileCacheQuery 中将 seed: number | Rng 设为必需字段(去除可选标志与 undefined)
- 在 DRLGROOMTILE_GetTileCache 中将 query: TileCacheQuery 设为必需参数
- 移除 Math.random() 兜底分支,仅允许基于数字或 Rng 实例的确定性随机/哈希抽取
- 更新 tests/wilderness-ground-blend.test.ts 中旧测试用例显式注入确定性 seed: 0
- 新增 tests/tile-cache-seed.test.ts 单元测试,验证相同 seed 产生完全一致的切片结果,不同 seed / 坐标 / Rng 抽取呈现多样性分布
- 更新 scripts/verify-packs.ts 的 MAX_EXPECTED_FALLBACK_WARPS 基线以满足 1671/1671 项断言

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 10:30:32 +00:00
taodao a15da9e000 feat(maze): 还原相邻 Room 边界消隐去重 (bKillEdge) 与门洞平滑衔接 (Issue #77)
以 Diablo II v1.13c D2Common.dll 为黄金标准,在 maze.ts 的 stamp() 中补齐两处
原版装载期行为。

1) bKillEdge 外边界接缝裁剪

原版 DRLGPRESET_InitPresetRoomGrids (DrlgPreset.cpp:1105) 由 LvlPrest.KillEdge
与房间是否贴合地图外缘共同推导:

  bKillEdgeX = pDrlgRoom->nTileXPos + nTileWidth == pDrlgCoord.nPosX + nWidth

再由 DRLGROOMTILE_LoadInitRoomTiles (DrlgRoomTile.cpp:449) 转成
nTileCountX = nTileWidth + (bKillEdgeX == 0)。

- MazePiece 新增 killEdge 字段(来源 LvlPrest.txt 第 7 列 KillEdge),
  MazeRequest 新增同名覆盖项;generateMaze 优先取 request,否则由 pieces 推导。
- stamp() 在 KillEdge 生效时将合成图收窄一列一行,并对贴合外缘的房间按
  variant.width - 1 / height - 1 落图,内部接缝的一格重叠保持不变。
- pack-act-assets.ts 的 getMazePieces 读取真实 KillEdge 列。

经实测 MPQ 内 LvlPrest.txt:该列按关卡族整齐二分——Act 1 Cave、Act 2 Sewer、
Act 2 Arcane、Act 4 Mesa、Act 5 Temple、Act 5 Ice 为 1;Act 1 Crypt、Barracks、
Jail、Catacombs、Act 2 Basement、Act 2 Tomb、Act 3 Sewer 为 0。此前引擎完全忽略
该列,上述 6 个关卡族生成的地图恒比原版多一列一行。

2) 门洞 bHidden 消隐与门槛过道地砖补充

- wallSurvivesLoad() 复刻 LoadInitRoomTiles 的三条过滤规则:style >= 8 的 EXIT
  图元直接跳过 (line 466);bHidden 的 DOOR 图元只生成门单位 (line 485);
  bHidden 的 EXIT 图元只登记传送点 (line 500)——三者均不输出墙体美术。
- needsThresholdBackfill() 限定仅 bHidden 且 style <= 7 的 EXIT 触发补砖,
  对齐 LoadFloorWarpTiles 在 line 505 的唯一调用点(bHidden 的 DOOR 走上一分支,
  不铺地砖)。
- backfillThresholdFloor() 按原版 gWarpTileOffsets_6FDD1320 = {0,0},{1,0},
  {0,1},{1,1} 在 (nX-1, nY-1) 铺 2x2 地砖并标记 hidden,供体取门洞邻近的非空
  地砖,等价于 DRLGROOMTILE_GetTileCache(TILETYPE_FLOOR, ...)。
- 补砖在所有房间落图完成后统一执行:门洞位于两房交界,供体可能属于当时尚未
  落图的邻居。

verify-packs 只校验 preset 关卡(entry.kind !== 'preset' 时跳过),故迷宫尺寸
变化不会影响 1671 项逐字节断言。

新增 tests/killedge-113c.test.ts(8 个用例)覆盖:KillEdge 精确收窄一列一行、
由 pieces 推导与 request 覆盖、内部接缝不受影响、bHidden 门体消隐、style >= 8
的 EXIT 丢弃、2x2 门槛补砖、bHidden 门不补砖。已做变异测试:关闭裁剪或关闭墙体
过滤各会导致 3 个用例失败,确认断言有效。

Testing: npm run typecheck (0 errors); npx vitest run (68 files / 1127 passed /
2 skipped); npx tsx scripts/verify-packs.ts (1671/1671).

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 09:05:17 +00:00
taodao e64e9a9ccd feat(maze): 还原核心迷宫专用布局例程与基于 LvlPrest Def ID 的精准预设替换 (Issue #73)
以 Diablo II v1.13c D2Common.dll 为黄金标准,对齐 DRLGMAZE_Place*Stuff 系列
专用布局例程:

- 新增 1.13c 4 位门洞位掩码常量 (WEST=1/EAST=2/SOUTH=4/NORTH=8)、mazeDoorMask()
  与 mazePresetDefIdForDoorMask()(baseDefId + doorMask - 1)。
- 补齐 LvlPrest.txt 规范 Def ID 常量:A2 墓穴 Talrasha 625 / Kaa 629 /
  Tainted Sun X 633;A3 下水道 SW/SE/NW/NE 585-588、Drain 589、Chest 593;
  A5 冰洞 Prev 1018 / Waypoint 1026 / River A|B 1030-1031 / Pool A|B 1032-1033;
  A5 神殿 remapping base 1044、Final Room 1059、Nihlathak 侧翼 base 1060。
- 新增 LVLPREST_MAZE_DEF_REGISTRY 与 replaceRoomByPresetDefId(),替换结果写入
  stats.notes(lvlPrestDef=<id> (<name>))便于验证。
- placeAct2TombStuff:新增 levelId 61(爪蛇神庙 2)固定放置太阳祭坛 Def 633。
- placeAct3SewerStuff:levelId 92 放置四角入口房 585-588 + Drain/Chest 按方向偏移。
- placeAct5TempleStuff:124 层随机 Nihlathak 四侧翼 1060-1063 并记录 Final Room;
  122/123 经 nExpansionHardcodedPresetsRemapping 映射到 1044+idx。
- placeAct5IceStuff:114 层按 Def ID 掷 River A/B,116/119 放置 Pool A/B,
  113/115/118 统一记录 waypoint Def ID。

修复两处潜在保真度缺陷:
- maze.ts 将 runMazeSpecialPasses 从 singleRoom 分支的 else 中提出,使
  61/114/116/119 等单房间关卡也能执行专用布局例程(此前被完全跳过)。
- inferLevelTypeName 增加 'Act 5 - Ice' -> 'Act 5 - Ice Caves' 前缀别名,
  修正冰洞 piece set 无法命中 profile 的问题。

新增 tests/maze-113c.test.ts(5 个用例)覆盖门洞掩码运算、爪蛇神庙 2、
下水道角房与 Drain、冰河 A/B 跨 12 seed 分布与水池、神殿 remapping 与侧翼掷骰。

Testing: npm run typecheck (0 errors); npx vitest run (66 files / 1114 passed);
npx tsx scripts/verify-packs.ts (1671/1671).

TAG=agy
CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1
2026-09-18 08:45:15 +00:00