From 897b3735d604a1cc98308ffa533d5f3be0e4a15b Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Sun, 13 Sep 2026 18:10:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BB=8E=E9=9B=B6=E5=AE=9E=E7=8E=B0=E7=9A=84=E6=9A=97=E9=BB=91?= =?UTF-8?q?=E7=A0=B4=E5=9D=8F=E7=A5=9E=20II=20WebGL2=20=E5=BC=95=E6=93=8E?= =?UTF-8?q?=EF=BC=88TypeScript=20+=20Vite=EF=BC=8C=E9=9B=B6=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E4=BE=9D=E8=B5=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 内容概览 - 归档层: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。 --- .gitignore | 16 + HANDOVER.md | 366 +++++ README.md | 450 ++++++ THIRD_PARTY_NOTICES.md | 13 + acts.html | 54 + index.html | 110 ++ map.html | 54 + net.html | 46 + package-lock.json | 977 ++++++++++++ package.json | 34 + scripts/browser/README.md | 41 + scripts/browser/checks/act-pack-state.js | 57 + scripts/browser/checks/act-state.js | 39 + scripts/browser/checks/map-save-load.js | 39 + scripts/browser/checks/map-switch.js | 90 ++ scripts/browser/checks/net-state.js | 11 + scripts/browser/checks/walk-state.js | 8 + scripts/browser/inspect-page.mjs | 93 ++ scripts/browser/many-pages.mjs | 146 ++ scripts/dump-format.ts | 135 ++ scripts/inspect-mpq.ts | 77 + scripts/lib/tbl-writer.ts | 59 + scripts/make-fixtures.ts | 318 ++++ scripts/make-map-fixtures.ts | 254 +++ scripts/make-mpq-fixture.ts | 248 +++ scripts/make-pl2-fixture.ts | 85 + scripts/net-relay.ts | 191 +++ scripts/net-server.ts | 22 + scripts/pack-act-assets.ts | 642 ++++++++ scripts/png.ts | 172 +++ scripts/port-object-lookup.ts | 184 +++ scripts/verify-acts.ts | 121 ++ scripts/verify-archive.ts | 99 ++ scripts/verify-combat.ts | 239 +++ scripts/verify-d2-data.ts | 138 ++ scripts/verify-dc6.ts | 80 + scripts/verify-dcc.ts | 698 +++++++++ scripts/verify-deploy.ts | 131 ++ scripts/verify-depth-order.ts | 50 + scripts/verify-dt1-pixels.ts | 51 + scripts/verify-format-parity.sh | 106 ++ scripts/verify-generators.ts | 645 ++++++++ scripts/verify-implode.ts | 152 ++ scripts/verify-items.ts | 193 +++ scripts/verify-listfile.ts | 90 ++ scripts/verify-m4.ts | 185 +++ scripts/verify-m5.ts | 355 +++++ scripts/verify-mpq-roundtrip.ts | 96 ++ scripts/verify-net.ts | 860 +++++++++++ scripts/verify-object-lookup.ts | 180 +++ scripts/verify-objects.ts | 694 +++++++++ scripts/verify-packs.ts | 240 +++ scripts/verify-sprites.ts | 144 ++ scripts/verify-tbl.ts | 59 + scripts/verify-tile-alignment.ts | 296 ++++ scripts/verify-tiles.ts | 149 ++ scripts/verify-widths.ts | 62 + src/formats/bitstream.ts | 219 +++ src/formats/cel.ts | 472 ++++++ src/formats/cof.ts | 224 +++ src/formats/dc6.ts | 209 +++ src/formats/dcc.ts | 820 ++++++++++ src/formats/ds1.ts | 413 +++++ src/formats/dt1.ts | 515 +++++++ src/formats/pal.ts | 83 + src/formats/pcx.ts | 103 ++ src/formats/pl2.ts | 228 +++ src/formats/sprite.ts | 99 ++ src/formats/tbl.ts | 116 ++ src/game/acts.ts | 328 ++++ src/game/animation.ts | 123 ++ src/game/character.ts | 290 ++++ src/game/combat.ts | 676 ++++++++ src/game/d2map.ts | 646 ++++++++ src/game/items.ts | 587 +++++++ src/game/level-names-zh.ts | 112 ++ src/game/map.ts | 391 +++++ src/game/maze.ts | 1795 ++++++++++++++++++++++ src/game/object-lookup-data.ts | 31 + src/game/object-lookup.ts | 162 ++ src/game/objects.ts | 905 +++++++++++ src/game/quests.ts | 278 ++++ src/game/rng.ts | 124 ++ src/game/save.ts | 315 ++++ src/game/skills.ts | 277 ++++ src/game/tables.ts | 155 ++ src/game/wilderness.ts | 908 +++++++++++ src/main.ts | 230 +++ src/mpq/archive.ts | 501 ++++++ src/mpq/crypt.ts | 159 ++ src/mpq/decompress.ts | 131 ++ src/mpq/file-source.ts | 37 + src/mpq/implode-tables.ts | 108 ++ src/mpq/implode.ts | 326 ++++ src/mpq/index.ts | 7 + src/mpq/mount.ts | 134 ++ src/mpq/source.ts | 140 ++ src/net/lockstep.ts | 230 +++ src/net/netplay.ts | 522 +++++++ src/net/protocol.ts | 187 +++ src/net/transport.ts | 400 +++++ src/render/atlas.ts | 128 ++ src/render/renderer.ts | 447 ++++++ src/scene/act-scene.ts | 1123 ++++++++++++++ src/scene/map-scene.ts | 1217 +++++++++++++++ src/scene/net-scene.ts | 612 ++++++++ src/sim/input.ts | 191 +++ src/sim/loop.ts | 104 ++ src/walk.ts | 289 ++++ tools/go-oracle/main.go | 323 ++++ tsconfig.json | 19 + vite.config.ts | 30 + walk.html | 51 + 113 files changed, 30394 insertions(+) create mode 100644 .gitignore create mode 100644 HANDOVER.md create mode 100644 README.md create mode 100644 THIRD_PARTY_NOTICES.md create mode 100644 acts.html create mode 100644 index.html create mode 100644 map.html create mode 100644 net.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/browser/README.md create mode 100644 scripts/browser/checks/act-pack-state.js create mode 100644 scripts/browser/checks/act-state.js create mode 100644 scripts/browser/checks/map-save-load.js create mode 100644 scripts/browser/checks/map-switch.js create mode 100644 scripts/browser/checks/net-state.js create mode 100644 scripts/browser/checks/walk-state.js create mode 100644 scripts/browser/inspect-page.mjs create mode 100644 scripts/browser/many-pages.mjs create mode 100644 scripts/dump-format.ts create mode 100644 scripts/inspect-mpq.ts create mode 100644 scripts/lib/tbl-writer.ts create mode 100644 scripts/make-fixtures.ts create mode 100644 scripts/make-map-fixtures.ts create mode 100644 scripts/make-mpq-fixture.ts create mode 100644 scripts/make-pl2-fixture.ts create mode 100644 scripts/net-relay.ts create mode 100644 scripts/net-server.ts create mode 100644 scripts/pack-act-assets.ts create mode 100644 scripts/png.ts create mode 100644 scripts/port-object-lookup.ts create mode 100644 scripts/verify-acts.ts create mode 100644 scripts/verify-archive.ts create mode 100644 scripts/verify-combat.ts create mode 100644 scripts/verify-d2-data.ts create mode 100644 scripts/verify-dc6.ts create mode 100644 scripts/verify-dcc.ts create mode 100644 scripts/verify-deploy.ts create mode 100644 scripts/verify-depth-order.ts create mode 100644 scripts/verify-dt1-pixels.ts create mode 100644 scripts/verify-format-parity.sh create mode 100644 scripts/verify-generators.ts create mode 100644 scripts/verify-implode.ts create mode 100644 scripts/verify-items.ts create mode 100644 scripts/verify-listfile.ts create mode 100644 scripts/verify-m4.ts create mode 100644 scripts/verify-m5.ts create mode 100644 scripts/verify-mpq-roundtrip.ts create mode 100644 scripts/verify-net.ts create mode 100644 scripts/verify-object-lookup.ts create mode 100644 scripts/verify-objects.ts create mode 100644 scripts/verify-packs.ts create mode 100644 scripts/verify-sprites.ts create mode 100644 scripts/verify-tbl.ts create mode 100644 scripts/verify-tile-alignment.ts create mode 100644 scripts/verify-tiles.ts create mode 100644 scripts/verify-widths.ts create mode 100644 src/formats/bitstream.ts create mode 100644 src/formats/cel.ts create mode 100644 src/formats/cof.ts create mode 100644 src/formats/dc6.ts create mode 100644 src/formats/dcc.ts create mode 100644 src/formats/ds1.ts create mode 100644 src/formats/dt1.ts create mode 100644 src/formats/pal.ts create mode 100644 src/formats/pcx.ts create mode 100644 src/formats/pl2.ts create mode 100644 src/formats/sprite.ts create mode 100644 src/formats/tbl.ts create mode 100644 src/game/acts.ts create mode 100644 src/game/animation.ts create mode 100644 src/game/character.ts create mode 100644 src/game/combat.ts create mode 100644 src/game/d2map.ts create mode 100644 src/game/items.ts create mode 100644 src/game/level-names-zh.ts create mode 100644 src/game/map.ts create mode 100644 src/game/maze.ts create mode 100644 src/game/object-lookup-data.ts create mode 100644 src/game/object-lookup.ts create mode 100644 src/game/objects.ts create mode 100644 src/game/quests.ts create mode 100644 src/game/rng.ts create mode 100644 src/game/save.ts create mode 100644 src/game/skills.ts create mode 100644 src/game/tables.ts create mode 100644 src/game/wilderness.ts create mode 100644 src/main.ts create mode 100644 src/mpq/archive.ts create mode 100644 src/mpq/crypt.ts create mode 100644 src/mpq/decompress.ts create mode 100644 src/mpq/file-source.ts create mode 100644 src/mpq/implode-tables.ts create mode 100644 src/mpq/implode.ts create mode 100644 src/mpq/index.ts create mode 100644 src/mpq/mount.ts create mode 100644 src/mpq/source.ts create mode 100644 src/net/lockstep.ts create mode 100644 src/net/netplay.ts create mode 100644 src/net/protocol.ts create mode 100644 src/net/transport.ts create mode 100644 src/render/atlas.ts create mode 100644 src/render/renderer.ts create mode 100644 src/scene/act-scene.ts create mode 100644 src/scene/map-scene.ts create mode 100644 src/scene/net-scene.ts create mode 100644 src/sim/input.ts create mode 100644 src/sim/loop.ts create mode 100644 src/walk.ts create mode 100644 tools/go-oracle/main.go create mode 100644 tsconfig.json create mode 100644 vite.config.ts create mode 100644 walk.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a57d470 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# 依赖与构建产物(用 npm 脚本可重建) +node_modules/ +dist/ +dist-game/ +dist-acts/ +*.log + +# 用户自备的游戏数据与本机参考源码:体积大 / 无再分发许可,绝不入库 +samples/ +*.mpq +reference/ + +# 临时调试产物 +.tmp/ +__pycache__/ +.DS_Store diff --git a/HANDOVER.md b/HANDOVER.md new file mode 100644 index 0000000..259ba74 --- /dev/null +++ b/HANDOVER.md @@ -0,0 +1,366 @@ +# 交接文档 · d2web + +**项目路径:`/root/diablo_web`**(原 `/root/codex_web/dsh/d2web`,2025-09-12 迁移;目录内没有任何写死的绝对路径,迁移后功能与迁移前一致,验证见文末「迁移后复验」) + +一句话:**用纯 TypeScript + Vite + WebGL2 从零写的暗黑破坏神 2 引擎**,读取**用户自备**的经典版 MPQ, +目标是浏览器内可玩的垂直切片。仓库**不含任何暴雪素材**,零运行时依赖(只用平台 API)。 + +--- + +## 1. 现在能玩什么 + +```bash +cd /root/diablo_web +npm install # 只装 devDependencies:vite / typescript / @types/node + +# 夹具(仓库不含素材,夹具是脚本生成的) +node scripts/make-map-fixtures.ts samples/fixtures +node scripts/make-mpq-fixture.ts samples/fixtures # 把夹具打成真 MPQ + +npm run dev # http://127.0.0.1:5173/ +``` + +| 页面 | 地址 | 内容 | +| --- | --- | --- | +| 资源检查器 | `/` 或 `/?sample=samples/spawn.mpq` | MPQ 头/存储标志/压缩掩码分布、成员列表、精灵逐帧预览 | +| 可行走演示 | `/walk.html?sample=samples/spawn.mpq` | **真实暗黑 1 归档**:CEL/CL2 精灵、调色板、8 方向走动、碰撞 | +| 单人战役沙盒 | `/map.html?data=samples/fixtures` 或 `?mpq=<你的.mpq>` | DS1+DT1 地图、战斗、掉落与拾取、背包、技能、任务、NPC 对话、存档/读档(K/L) | +| 联机合作 | `/net.html?data=samples/fixtures&ws=ws://127.0.0.1:8787&peers=3&peer=0` | 2–4 人同一个世界,各控一名角色 | +| **diablo2 地图 + 女法师** | 本地 `/acts.html?act=1`;线上 `https://www.laiseek.xyz/diablo2/?act=1`(`?act=1..5`、`?level=