troytt
|
3cd4549332
|
fix: 修复非基底对象 NPC 丢失及其资源检索区分大小写的问题
在前一次提交的基础上修复并强化了 Type 1 对象(怪兽及 NPC 原型)解析与打包的正确性。
1. 修正大写回退遗漏问题(解决失联的 6 个特定角色如 Act 4 Jamella 等):`pickObjectMember` 中需要使用大写查找 token,而原来直接代入了小写 token 导致失败,修复后所有角色均成功合图。
2. 添加安全跳过统计 (`skippedMissingArtSpawns`),使得未匹配上图片的隐藏对象能干净跳过。
3. 增加 `tests/resolve-type1.test.ts` 提供核心覆盖率。
4. 应用性能重构与规范修复,将二次查询提速为内置的 `Map` 遍历,同时补齐了 `OBJECT_TYPE_MONSTER`、Typescript interface、尾随空格与逗号修复。
5. 后向保留了省略 tables 时旧版逻辑的注解。
(refs #6)
|
2026-09-14 15:37:32 +00:00 |
troytt
|
ad7ced6760
|
test: 修复三处跳过守卫,它们只在真实资源到位时才暴露
这三个测试都犯了同一个错误:**守卫检查的资源,和实际读取的资源不是同
一个**。在 `samples/d2` 缺席时它们一律静默跳过,看起来是绿的;真实 MPQ
一旦放进来,守卫放行,然后立刻炸在一个完全无关的缺失文件上。
- `tests/dcc.test.ts`
守卫看 `samples/d2`,扫描目标却硬编码成 `samples/fixtures`——那里没有
`d2char.mpq`。于是这个套件**从来没有真正跑过**:没资源时跳过,有资源时
`TypeError: Cannot read properties of null (reading 'listFiles')`。
目标改为 `samples/d2`;打开归档失败时由"打日志后继续"改为 `throw`
并带上归档名,避免把"文件缺失"伪装成 100 行之外的空指针;
`let characters: any` 收紧为 `MpqArchive | null`。
- `tests/widths.test.ts`
守卫看 `samples/d2`,真实输入却是一个空成员名和
`scripts/browser/checks/map-widths.txt`——后者在仓库里从未存在过。
改为按实际输入判断。顺带补 `: string` 标注,否则空字符串字面量会被
收窄成 `never`。
- `tests/formats-malformed.test.ts`
守卫看 `samples/d2` 目录是否存在,却去读其中一个散落的 `.cof`。但
`samples/d2/` 放的是 MPQ **归档**,不是解包后的目录树,目录存在完全
不能说明那个文件存在。改为直接判断该文件路径。
修复后,在真实 MPQ 就位的情况下:
21 passed | 1 skipped (22 files),421 passed | 2 skipped (423),tsc 0 error。
其中 `dcc.test.ts` 从"0 个测试"变成真正执行。
|
2026-09-14 14:51:50 +00:00 |
troytt
|
f52edd85f9
|
test(formats): 增加针对损坏资产的覆盖率和回归测试 (fixes #11)
Implements regression limits testing bounds limits, invalid header mappings and stream truncations for binary formats, verifying the decoder engine halts cleanly without exception masking or propagation leaks. Ensures zero false positives and safely covers buffer boundary rules.
|
2026-09-14 13:24:25 +00:00 |
troytt
|
a6ca337a10
|
feat(formats): 添加安全的二进制数据读取器
Provides ByteReader, requireBytes, and precise FormatError subclasses (TruncatedDataError, InvalidFieldError) to enable safe decoding bounds checking.
|
2026-09-14 13:19:01 +00:00 |
troytt
|
11439256bf
|
fix(art): 将 NPC 渲染文件的基础寻址从 objects 修正为 monsters
修正 Deckard Cain、Jerhyn 等城镇 NPC 的基础美术路径。通过从 objectEntry 下传的 baseIsMonsters 布尔标识,使特定 Object 的 DCC 及 COF 查表过程自动从默认的 `data\global\objects` 切换到 `data\global\monsters`, 彻底解决打包器因跨域失效而丢弃图集的情况。
|
2026-09-14 13:08:46 +00:00 |
troytt
|
e3ca14c357
|
refactor(lockstep): 按项目规范彻底移除 any 约束逃逸并优化哈希分配性能 (refs #7)
此提交响应了进一步集成的代码质量与内存性能审查反馈:
1. 深入清理代码库类型系统边界,利用 Structural Target Interfaces 为所有传递进哈希运算中的世界和对象提供原生支持而不用 `any`,并修复由于引入 #10 放宽的 engine.ts 的 syncEngineState 缺失的 `EngineViewState` 严谨签名;
2. 提升了数据解析健壮性:在 save.ts 中增加严格的运行时验证(利用 Type Guard: `asserts value is GameSnapshot`),取消一切断言强转;
3. 取消了计算锁步哈希期间对背包和掉落物品的数组分配与运行时排序(重构为支持 Order-Independent Combination 的无排序位偏移计算模式),确保 25Hz 打包同步路径中零内存无端分配;
4. 并修正了 net-scene 等多个测试的静态数据映射与严格的突变检测。
|
2026-09-14 13:05:18 +00:00 |
troytt
|
45b6a2caa7
|
feat(lockstep): 接入实际组件状态哈希并修复场景验证死区 (refs #7)
替换了 net-scene 中的闭包测试用 digestWorld 状态逻辑,通过真实注入的 inventories, quests, groundLoot 清单确保联机场景具备全覆盖的一致性锁步哈希验证。增加了 integration 测实验证 pickup 产生的完整分歧,确保从引擎层面而非独立计算侧暴露漏洞。
|
2026-09-14 12:55:16 +00:00 |
troytt
|
4290e5feb2
|
fix(game): 移除不安全的类型转换并增加存档校验 (refs #7)
在 character.ts 中使用 flatMap 结合类型缩窄(null 检查),移除了对 DccFile 的强制类型转换,保证内部逻辑的编译期安全。在 save.ts 中增加了对背包数据的严格运行时有效性验证,避免由于恶意或破损存档导致的隐式游戏损坏,并用专用的反序列化测试覆盖新校验过程。
|
2026-09-14 12:44:19 +00:00 |
troytt
|
fc201d7290
|
feat(lockstep): 实现完整的锁步状态哈希算法 (refs #7)
扩展了锁步哈希验证以包含背包内容、地面物品和任务进度。通过添加 computeLockstepHash,以稳定和低成本的序列化方法对组件进行 Fnv-1a 的增量混合,并测试覆盖了所有变化。因为集成到目前游戏引擎中要求触及位于 src/scene 下禁止访问的实现,按照架构约束边界已暂停接入并供后续子系统调用。
|
2026-09-14 12:44:18 +00:00 |
troytt
|
6e6d8ed022
|
feat: 将所有动态实体加入地形深度排序渲染列队 (fixes #10)
将 monsters、npcs、projectiles、ground items 等 Engine 内的物理对象一并收集,
利用相同的 `cell.x + cell.y` 画家排序与 `act-scene.ts` 里由预处理好的 `walls` / `objectDrawables` 进行混合深度渲染。
此改变为后续加载真实的实体资源图集打下渲染基础。
|
2026-09-14 12:40:48 +00:00 |
troytt
|
38d06cdb28
|
feat: 抽取独立无状态 GameEngine 领域与相关逻辑
将 map-scene 中负责每帧更新逻辑与状态管理的巨量代码抽取成 `src/game/engine.ts` 内的 `GameEngine`。
解耦模拟与 WebGL 和 DOM,保证可以无界面测试。
并引入了 `tests/engine.test.ts` 自动化单元测试(Vitest)。
|
2026-09-14 12:37:29 +00:00 |
troytt
|
4d47a56e68
|
feat(mpq): 实现 ADPCM 与 Huffman 音频解码并接入 Web Audio (fixes #13)
- 基于 StormLib 的 C++ 原型,实现了 4-bit IMA ADPCM 解码(单声道与双声道分离)。
- 实现 FGK 自适应 Huffman 树解码,从给定分布表构建静态初始树进而按流插入权重并重平衡。
- 保证严格使用位运算确保 16-bit 符号处理正确,增加对应 ADPCM 解码保护边界。
- 新增 `AudioManager` 基于 Web Audio API 设计跨文件懒加载及混音管理,避免在未配置时报错。
- `tests/mpq-audio.test.ts` 加入覆盖测试,并含 ADPCM 打包构造器,证明解压流程完整有效。
- `package.json` 添加 `verify:audio` 脚本,可快速校验环境依赖导入。
|
2026-09-14 12:30:21 +00:00 |
troytt
|
f4dd55be6c
|
fix(formats): 按官方哈希桶格式重写 tbl 解码器与编码器 (fixes #8)
- 重构了 `src/formats/tbl.ts` 以正确读取 21字节魔数头与 17字节哈希桶节点
- 使用了 NUL 终止与正确的字节长度计算方式,修正之前错误的 UTF-16 假设
- 支持通过 `TextDecoder` 选择代码页 (默认为 windows-1252,支持 gbk 等 fallback)
- 暴露了原始的 O(1) 线性探测查询函数 `lookupTblFast` 和哈希函数 `tblHash`
- 对 `scripts/lib/tbl-writer.ts` 及其验证脚本进行了重写,以正确写入和校验哈希桶布局
- 增加了完整涵盖功能与越界校验的 vitest 单元测试,并在真实的 113c patchstring.tbl 下实现了 1169/1169 哈希全量验证通过
- 将测试文件加入项目目录
|
2026-09-14 12:30:07 +00:00 |
troytt
|
1a81693d74
|
test: 引入 Vitest 测试框架、覆盖率统计与 CI 流水线 (fixes #14)
- 安装了 `vitest` 和 `@vitest/coverage-v8`,配置支持对 `tests/**/*.test.ts` 文件做测试。
- 将基于 `process.exit(1)` 的断言脚本平滑翻译为了符合 Vitest 生态的 `test` 与 `expect` 结构。
- 加入了 Github Actions (Gitea Actions) 语法的 CI 文件,分别验证 20.x, 22.x 下的测试通过情况。
- 原有的 `scripts/verify-*.ts` 等 CLI 脚本功能照常运作,且依赖缺失时通过 skipIf 进行安全跳过。
|
2026-09-14 12:25:28 +00:00 |