jaenster/libd2

GitHub: jaenster/libd2

该项目用 Zig 重新实现暗黑破坏神 II 1.14d 的确定性引擎核心,以种子驱动复现地图生成、物品掉落和运行时模拟等子系统,并提供跨语言的 C ABI 与 WebAssembly 接口。

Stars: 4 | Forks: 0

# libd2 使用 [Zig](https://ziglang.org) 重新实现的确定性 **Diablo II 1.14d** 引擎核心 — 将游戏种子转化为世界的种子驱动子系统。 通过对零售版二进制文件进行逆向工程实现,不包含任何 Blizzard 代码。 ## 本仓库中的包 | 包 | 模块 | 依赖于 | 说明 | |-|-|-|-| | [`formats`](packages/formats) | `d2-formats` | — | 用于 D2 磁盘数据的纯解析器/解码器:`ds1`(关卡结构)、`dt1`(图块艺术 + 碰撞标志)、`dc6`/`dcc`/`cof`(精灵/动画)、`dt1pix` 以及内置 blob 容器编解码器。输入字节切片,输出类型化记录;无引擎状态。 | | [`fog`](packages/fog) | `d2-fog` | — | 引擎 `Fog::Memory` 隔离板池分配器(固定大小类、位图槽位重用、整体销毁)的精确复刻。与引擎无关。 | | [`drlg`](packages/drlg) | `d2-drlg` | `formats`, `fog` | **DRLG** — 地图生成器。给定一个种子,它可以为所有五个章节中的每个关卡生成房间/图块布局、碰撞网格、道路以及物品/怪物群。纯生成过程,已通过 1000+ 个种子验证字节完全一致。 | | [`render`](packages/render) | `d2-render` | `drlg`, `formats` | 将 drlg 的生成输出转化为视觉效果:自动地图精灵单元和真实的 DT1 图块艺术具象化。一个纯粹的生成后消费者。 | | [`items`](packages/items) | `d2-items` | — | 种子驱动的物品掉落:宝藏类别解析、基于等级的物品类别 roll、品质以及魔法/稀有词缀选择。 | | [`sim`](packages/sim) | `d2-sim` | — | 运行时模拟:单位、属性、RNG、战斗、投射物,以及字节完全一致的服务器↔客户端协议层。 | 每个子系统均已根据从真实引擎中捕获的真实基准进行了验证。 从源码构建包、测试、原生库和 wasm:请参阅 [docs/BUILDING.md](docs/BUILDING.md)。 ## 使用说明 使用您选择的任何语言调用 `libd2` — Zig 将这些包作为源码模块使用;其他语言则使用每个包附带的 **C ABI**(一个通过 `export fn` 表面编译为带有 C 头文件的原生共享 + 静态库,以及 **WebAssembly** 构建)。C 边界意味着在具有 C FFI 的*任何*语言中都可以使用*相同*的构建产物。 ### 快速开始 — TypeScript / Node ``` npm install @jaenster/d2drlg ``` ``` import { shrines } from '@jaenster/d2drlg'; // Cold Plains (level 3) for seed 1337. The wasm loads lazily on first call — no setup. const s = await shrines(1337, 3); console.log(`${s.length} shrines/wells:`); for (const sh of s) console.log(` ${sh.isWell ? 'well ' : 'shrine'} class ${sh.classId} at tile (${sh.tileX}, ${sh.tileY})`); // 5 shrines/wells: // shrine class 2 at tile (995, 1124) // shrine class 84 at tile (994, 1114) // shrine class 81 at tile (1050, 1098) // well class 130 at tile (1010, 1091) // shrine class 83 at tile (1002, 1090) ``` 微型类型化 shim,支持 ESM + CommonJS,可在现代 Node/Bun/Deno 上原生运行。每个包的用法结构相同(`@jaenster/d2items`, …)。 ### 语言指南 - [C](docs/usage/c.md) - [C++](docs/usage/cpp.md) - [C#](docs/usage/csharp.md) - [Node (WebAssembly)](docs/usage/node.md) - [Zig](docs/usage/zig.md) 获取构建产物的途径: - **原生库 + 头文件** — 附带在每个包的 GitHub Release 中 (`-vX.Y.Z`),每个目标平台一个压缩包:linux / macos / windows × x64 / arm64。 - **WebAssembly** — 以 `@jaenster/d2` 的形式发布到 npm(例如 `@jaenster/d2drlg`), 一个基于 wasm 的微型类型化 TypeScript shim(ESM + CommonJS)。 ### 参考文档 API (`drlg` 地图生成器) 语言指南使用 `drlg` (`d2drlg`) 作为贯穿全文的示例 — 给定一个种子,它会生成整个章节的房间布局 — 并使用 `items` (`d2items`) 作为第二个示例。 `drlg` 的 C API: ``` typedef struct D2DrlgCtx D2DrlgCtx; // loaded game tables typedef struct D2DrlgAct D2DrlgAct; // a generated act typedef struct D2DrlgRoom { int32_t x, y, w, h, n_type, n_preset_type; } D2DrlgRoom; typedef struct D2DrlgShrine { int32_t class_id, x, y; } D2DrlgShrine; // x/y are subtiles (÷5 for tiles) D2DrlgCtx *d2drlg_ctx_create(void); void d2drlg_ctx_destroy(D2DrlgCtx *ctx); // generate a whole act. difficulty 0/1/2; act_no 0..4. NULL on error. D2DrlgAct *d2drlg_gen_act(D2DrlgCtx *ctx, uint32_t seed, int32_t difficulty, int32_t act_no); void d2drlg_act_free(D2DrlgAct *act); int32_t d2drlg_act_level_count(D2DrlgAct *act); int32_t d2drlg_act_level_id(D2DrlgAct *act, int32_t level_index); int32_t d2drlg_act_level_room_count(D2DrlgAct *act, int32_t level_index); // writes up to `cap` rooms of a level into `out`; returns full count (may exceed cap) or <0. int32_t d2drlg_act_rooms(D2DrlgAct *act, int32_t level_index, D2DrlgRoom *out, int32_t cap); // writes up to `cap` of a level's seeded outdoor shrines/wells; returns full count or <0. int32_t d2drlg_level_shrines(D2DrlgCtx *ctx, uint32_t seed, int32_t difficulty, int32_t level_id, D2DrlgShrine *out, int32_t cap); uint32_t d2drlg_abi_version(void); ``` 每个包都遵循相同的结构:`d2_create`/`_destroy`(或 `_ctx_create`),类型化的 `extern struct` 记录,以及调用者提供的输出缓冲区。完整的头文件包含在每个发布版本中(并且存放在 `packages//include/` 路径下)。 ## 关于内置资源 `packages/drlg` 在 `src/blobs/` 下嵌入了少量预先生成的小型二进制 blob(子图块碰撞标志、DS1 关卡结构、自动地图精灵以及一小片图块艺术),并在 `src/maps/` 下包含一些 `.dt1`/`.ds1` 固定测试数据。这些内容**衍生自 Blizzard 游戏数据**,仅为了让生成器能够直接构建和自我验证而包含在内。它们不可作为游戏内容重新分发;本仓库不隶属于 Blizzard Entertainment,也未获得其认可。Diablo II 版权 © Blizzard Entertainment。
标签:AI工具, MITM代理, Zig, 云资产清单, 暗黑破坏神2, 游戏开发, 游戏引擎, 逆向工程, 随机生成