troytt
53f52ba61e
fix(formats): 替换原始缓冲区的未检查读取
...
Rewrites raw buffer deserialization across formats to use ByteReader, DataView and safe property assignments with precise error propagation. Eliminates untested internal bounds checks and explicitly validates untrusted asset streams safely.
2026-09-14 13:19:01 +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
7d8629cd73
feat(scene): 衔接 NPC 数据至引擎层及交互面板验证 ( fixes #6 )
...
建立 NPC token 到独立显示名称的转译字典。将打包导出的 NPC 集合统一注水到 GameEngine 模型内以生效交互半径;同时增加 Canvas UI 外围的绝对定位 DOM 生成层来渲染 NPC 头顶铭牌名称,以及挂载对应的对话展示面板供 engine.dialog 同步刷新。更新 E2E 环境验证逻辑检测交互健壮性。
2026-09-14 13:14:34 +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
1e7645d388
feat: 在 Act 场景中挂载 GameEngine 提供真实的模拟物理状态
...
将刚才提取出的引擎初始化进 `act-scene.ts`,配置一个空的怪物列表。
使得 Act 地图不再仅仅是个“游览器”,而是拥有血条、法力、体力、碰撞并进行 ticks 的真实服务器沙盒对象。
2026-09-14 12:37:29 +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
98d6a6dad2
refactor: 提取 ViewportCamera 与后备 Demo 数据
...
提取 ViewportCamera 到 `src/sim/camera.ts` 以复用视角缩放控制逻辑。
将原本散落在 sandbox 测试场景里的怪物、物品、任务等 Demo 数据提取至 `src/game/demo-data.ts`,作为 Act 场景的缺省源数据,解耦纯 UI 代码与配置逻辑。
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
2a0dd4ce25
feat(packer): bake all 101 generated levels into static packs with 3 variants each
...
- Update scripts/pack-act-assets.ts to bake 3 deterministic variants for each maze (DrlgType 1) and wilderness (DrlgType 3) level
- Cache mazePieces, wildernessPieces, substitutions, and palettes for fast one-pass baking
- Populate LEVEL_NAMES_ZH with all 136 standard Chinese level names
- Update variantLabelZh to format var1..var3 as 变体 1..3
- Guard scripts/verify-packs.ts to verify preset levels cleanly while supporting non-preset entries
2026-09-14 11:15:13 +00:00
troytt
1cfef30878
fix(generators): 修复 70 关随机迷宫与 31 关野外地图生成与连通性 ( fixes #2 )
...
- 地图图块与层级修正 (src/formats/ds1.ts & src/game/acts.ts):
- 依据 D2MOO DrlgRoomTile.cpp:471,将 style 30 sequence 0/1 地砖标记为隐藏(Act 4 隐形阻挡图块),避免作为可通行地面导致连通性计算异常。
- 为 'Act 5 - Barricade' 关卡补充加载 'Expansion/Siege/temptile.dt1'。
- 随机迷宫生成器修正 (src/game/maze.ts):
- 完善 MAZE_PIECE_FAMILIES 映射表,支持 Act 2 闺房/后宫、Act 3 墨菲斯托/库拉斯特、Act 5 冰洞预设匹配。
- 支持 River、Pool、Tainted Sun 等特异房间预设的分类与放置。
- 修正 prevChain 中 Baal 前室房间方向映射顺序,对齐 D2MOO DrlgMaze.cpp 原版顺时针方向 ['NSE', 'SEW', 'NSW', 'NEW']。
- 野外生成器修正 (src/game/wilderness.ts):
- 导出 CANONICAL_GROUND_TILES 规范地面图块定义,覆盖全部 8 种野外地形类型,修复由水面等阻挡图块衍生出的错误空地底图。
- 针对窄条连接桥关卡(如库拉斯特堤道 Level 82)引入全尺寸直接盖印逻辑,避免无效边框环绕。
- 为未配置尺寸的野外关卡(如 Level 111, 112)提供 D2MOO 规范的 160x64 默认边界回退。
- 验证脚本增强 (scripts/verify-generators.ts):
- package.json 新增 verify:generators 校验命令。
- 迷宫验证增加单房间预设关卡(Level 61, 114, 116, 119)特殊尺寸与房间数豁免。
- 针对有悬崖环绕的野外地图排除外部边缘非游玩空洞格,确保真实可通行区域连通性判断准确。
- 过滤零售版 MPQ 未收录 debris.dt1 的 Barricade Snow 预设,使图块丢失率降至 0.5% 以下。
- 自动化验证 101/101 关卡(70 迷宫 + 31 野外)全数通过,746 项断言 100% 成立。
2026-09-14 10:33:45 +00:00
troytt
72731bb143
feat(objects): 完整实现对象层解码、打包图集与场景深度绘制 ( #5 )
...
- 数据与查找修复:
- 修复 src/game/object-lookup-data.ts 中 Act 3 墨菲斯托红门 (104:342:1Y:ON) 错位问题,恢复 3,615 条记录唯一性。
- 排除 COF 非图元文件,优先选取主体图元 (tr) 与 DCC/DC6 静态帧。
- 资产打包与图集生成 (scripts/pack-act-assets.ts):
- 引入全局 decodedMemberCache,一次性解码去重。
- 将所有有效美术对象装箱至 objectPages (objects-*.png),并正确计算象限锚点偏移 (-16 + box.left / f.offsetX, 16 + box.top / (offsetY - height + 1))。
- 动态统计 objectsArtPending,62 张地图全部实现 0 待解。
- 场景渲染与深度排序 (src/scene/act-scene.ts):
- 预加载 scene.objectPages 纹理并在 beforeunload 中释放,避免内存泄漏。
- 将 objectDrawables 与 runtime.walls 按 (subX+subY)/5 与 cellX+cellY 的统一深度双指针交替绘制,并保持与角色前后的画家算法正确遮挡。
- 自动化验证 (scripts/verify-packs.ts & scripts/verify-object-lookup.ts):
- 新增图集页边界与 0 待解帧断言 (1302/1302 全数通过)。
- 更新查找表统计与点位断言 (20/20 全数通过)。
2026-09-14 09:27:54 +00:00
troytt
a80ee2cafc
fix(render): 修复 SpriteRenderer 显存泄漏与补充 WebGL 上下文保护 ( fixes #9 )
...
- 优化 createProgram:Shader 链接后立即 detach 并 deleteShader,链接失败自动清理 Program
- 新增 deleteAtlas:支持释放指定 GPU 纹理显存,并在活跃批次解绑时安全 flush
- 新增 dispose 与 isDisposed:释放全部托管纹理、VAO、VBO、Program 与事件监听,支持幂等和 context-lost 防御
- 补充 WebGL context lost/restored 监听与自动恢复提示
- act-scene/map-scene/net-scene/walk 接入生命周期管理与 beforeunload 资源释放
- 新增 verify:renderer 单元生命周期验证套件 (26 项断言全部通过)
2026-09-14 07:54:51 +00:00
troytt
a86b2a4582
fix(collision): 修复 DT1 碰撞网格方向与朝向对齐 ( fixes #4 )
...
- 修正 DT1 block 碰撞体 Y 轴解析方向
- 修复 character.ts 角色朝向映射函数与方向角度
- 增加 verify-collision-orientation 自动化验证脚本
- 完善 tools/go-oracle 工具链
2026-09-14 07:54:38 +00:00
troytt
61c6691555
修复顶角墙缺左半:DS1 只列 type 3,引擎会自己补画 type 4
...
现象:墙角(两段墙交汇的上顶点)左边一块渲染不正常——角的左脸缺失,右半的墙基露出来,
接缝处出现台阶/突块。例:第三章「下水道二层」(sewertreasure1)有 5 处。
根因:D2 的顶角美术是两半拼的,DS1 只存「顶角右半」(type 3),左半(type 4)从不列出;
引擎在装配房间瓦片时会自己补——
DRLGROOMTILE_InitWallTileData(D2Common/DRLG/RoomTile.cpp,1.10f 0x6FD889C0):
if (nTileType == TILETYPE_WALL_TOP_CORNER_RIGHT)
再以同格的同份 packed tile 信息追加一个 TILETYPE_WALL_TOP_CORNER_LEFT 图块
我们的渲染器只画 DS1 列的引用,所以这一步从未发生。
改动:buildIsoMapScene 的墙循环里,type 3 解析成功后,用同一 style:sequence 精确解析
type 4 伙伴,同格、按各自的 minBlockY 规则绘制,并把它并入碰撞栅格;新增
scene.cornerPairs / scene.missingCornerPairs 供校验使用。verify-tiles 增加两条断言。
实测:35 关共 411 个 type 3,全部有 type 4 伙伴(缺失 0),墙绘制数 9103 → 9514;
「下水道二层」72 → 77 面墙,与 5 个顶角一致。
2026-09-14 09:18:43 +08:00
troytt
897b3735d6
初始提交:从零实现的暗黑破坏神 II WebGL2 引擎(TypeScript + Vite,零运行时依赖)
...
内容概览
- 归档层:MPQ v1 容器(hash/block 表、Storm 加密、分扇区编解码),含 PKWARE
implode/explode 移植;支持 HTTP Range 只读取所需字节。
- 格式层:dc6 / ds1 / dt1 / pal / pl2 / cel / pcx / tbl / sprite,以及 dcc / cof / bitstream。
- 地图层:等距投影场景构建(地板/墙/屋顶分层、逐格瓦片变体加权随机、sub-tile 碰撞),
资源包(索引色 PNG 图集 + scene.json)离线烘焙与逐像素差分校验。
- 角色层:DCC + COF 合成(8 方向),法师行走/站立替换占位棋子。
- 页面:acts.html 全屏画布 + 三级选择器(章节 / 场景 / 细分场景),资源包优先、
可回退到直读归档(?live=1)。
- 验证脚本:verify:all / implode / acts / d2 / packs / dcc / deploy / listfile /
object-lookup / alignment / tiles / generators 等,均带断言与退出码。
数据与许可
- 游戏数据(samples/)与第三方参考源码(reference/)不入库:体积大且无再分发许可,
见 THIRD_PARTY_NOTICES.md。
- 生成关卡(70 迷宫 + 31 野外)尚未烘焙,现状与修复清单见 HANDOVER.md §4f。
2026-09-13 18:10:28 +08:00