6.4 KiB
6.4 KiB
Diablo II Web 逆向与工程保真度开发铁律 (D2 Parity Rules)
[!IMPORTANT] 本项目为暗黑破坏神 2(Diablo II v1.13c)Web 端移植与高保真复刻项目。 在任何开发、重构、修复与测试过程中,必须严格遵守 Diablo II 1.13c 原版底层二进制(DLL 汇编与 C 逻辑)及 MPQ 官方数据表规范。 严禁凭空发明伪规则,严禁通过“静默容错”掩盖管线断层。
1. 原版权威与反伪逻辑准则 (Ground Truth Priority)
- 原版逻辑为唯一最高准则:
- 遇到地图生成(DRLG)、掉落(TC / Drop Pipeline)、怪物属性与随从(MonStats / SuperUniques)、物理碰撞(Collision)等机制疑问时,必须严格以 1.13c 逆向工程反汇编及官方数据表(
LvlTypes.txt,LvlPrest.txt,Levels.txt,SuperUniques.txt,TreasureClassEx.txt)为唯一事实来源。
- 遇到地图生成(DRLG)、掉落(TC / Drop Pipeline)、怪物属性与随从(MonStats / SuperUniques)、物理碰撞(Collision)等机制疑问时,必须严格以 1.13c 逆向工程反汇编及官方数据表(
- 严禁凭个别样本盲目类推:
- 暗黑2共有 136 个 Level ID,包含预置建筑、迷宫拼接、野外生成等截然不同的 DRLG 范式。
- 严禁仅测试 Act 1 鲜血荒地或罗格营地即假定全图可用。任何地图算法改动必须经受全 136 关卡全量场景普查。
- 杜绝“自创”Style / Sequence 编号:
- 程序化地貌贴图、路网、围墙、水系过渡所使用的
style与sequence必须来自该关卡绑定的 DT1 库实际导出定义,严禁跨章节挪用(例如严禁在沙漠、高地、雪山中使用 Act 1 的 Style 0 泥路或 Style 2 水面)。
- 程序化地貌贴图、路网、围墙、水系过渡所使用的
2. 地图与瓦片渲染铁律 (DRLG & Tile Invariants)
- 三通用 DT1 常驻加载机制(1.13c
DRLGROOM_LoadDt1Files):- 依据 1.13c 汇编逻辑(
D2Common.dll@ 0x6fdb8400),任何关卡在解析完其LvlTypes.txt声明的 DT1 后,必须无条件追加加载 3 个全局通用 DT1 库:data\global\tiles\Act1\Outdoors\Blank.dt1data\global\tiles\Act1\Barracks\InvisWal.dt1data\global\tiles\Act1\Barracks\Warp.dt1
- 其中
InvisWal.dt1包含style=49 sequence=7的地面瓦片(用于行走阻挡的隐形碰撞墙,见于 Act 5 混沌避难所、地狱、世界之石等处),严禁将其作为缺少贴图(missingTile)跳过。
- 依据 1.13c 汇编逻辑(
- 空单元格阻挡掩码与玩家出生点定位:
- 地图未放置有效地面瓦片的纯黑虚空区域,必须在子网格(Sub-tile)上严格打满
blocked = 1与COLLIDE_MASK_INVALID(包含COLLIDE_BLANK = 0x0001与COLLIDE_WALL = 0x0004)。 - 玩家出生点搜寻(
findIsoSpawn)绝对严禁直接取地图几何中心点(width/2, height/2)。在非矩形或中空地图(如遗忘之塔外景、皇宫、秘密避难所等),中心点极可能是纯黑虚空。 - 出生点必须严格落在“物理连通、有非隐藏有效地面瓦片且
blocked === 0”的最大可行走连通分量上,优先靠近传送门(Warp)或小站(Waypoint)。
- 地图未放置有效地面瓦片的纯黑虚空区域,必须在子网格(Sub-tile)上严格打满
- 消除平铺条纹:严禁在空间离散中使用简单线性算术:
- 地块变体选择(
pickVariant)严禁使用((x * A) ^ (y * B)) % count这类简单线性同余公式。在二维离散规则网格上,线性乘积会导致明显的 45 度斜向周期性机械几何平铺条纹。 - 变体散列必须使用高熵伪随机空间哈希(如 SplitMix64 坐标散列),并通过空间方差统计单测确保视觉离散度。
- 地块变体选择(
3. 严禁以“防御性编程”掩盖系统性缺陷 (Anti-Silent Failures)
- 严禁宽容吞错的伪 Fallback:
- 严禁编写类似
if (availableTiles.size === 0) return true;这类无原则放行逻辑。核心参数(如 DT1 库、关卡配置)漏传时,必须显式抛出异常或严格判定不可用,决不能让缺失数据伪装成“全量支持”。
- 严禁编写类似
- 杜绝越界贴图跨章节污染:
- 自动贴图 LUT(Auto-tiling LUT)必须在每次应用贴图更新前,严格执行
isTileAvailable(style, sequence)校验,未声明的贴图一律禁止写入渲染管线。
- 自动贴图 LUT(Auto-tiling LUT)必须在每次应用贴图更新前,严格执行
4. 资产管线与数据保真度 (Data & Pipeline Fidelity)
- 离线烘焙预打包(Pack)与运行时必须全链路对齐:
- 严禁预打包脚本维护一套写死的窄白名单,而运行时又依赖动态未打包资产。
- 所有暗金怪(
SuperUniques)必须自动推导并解析其随从(Minions)所依赖的全部 DCC/DC6 动画与材质资源,一并纳入离线打包构建。
- 原版文本数据转录不得篡改或简化:
SuperUniques.txt、MonStats.txt等元数据必须严格保留原版 Class 标识(如scarab2,zombie5,fetishshaman4,nihlathakboss等具体变体),禁止粗暴截断变体数字后缀或自编别名。
- 技能与投射物美术资源必须采用原版资源并离线烘焙 (Missile & Spell FX Parity):
- 严禁长期使用由代码绘制的方块、纯几何色块或纯程序化简易图形作为技能投射物/特效替代品。
- 所有技能投射物(Missiles)、次生爆炸(Explosions)、状态光环与法术特效,必须严格以 1.13c 原版 MPQ(
d2data.mpq/d2exp.mpq/Patch_D2.mpq)中由Missiles.txt的CelFile字段所引用的原版 DCC / DC6 动画文件为准(例如Firebolt.dcc,Fireball.dcc,FireArrowExplode2.dcc等)。 - 必须通过离线解包烘焙脚本(如
scripts/pack-missiles.ts)结合章节调色板(ACT1/pal.pl2),将原版 DCC/DC6 的全部朝向(如 16 方向)与全帧序列预打包烘焙为 Web 原生 Sprite Atlas(图集)及对应元数据,供前端 WebGL 运行时直接高效索引与渲染。 - 音效接入解耦:现阶段音效系统(
Sounds.txt/ WAV 音频资源)允许暂缓接入,但视觉动画必须具备 100% 像素级原版 DCC 贴图资产与帧率对齐。
5. 质量验证与门禁标准 (Verification Standards)
任何涉及地图、物品、怪物及战斗核心机制的代码提交,必须通过以下铁门禁:
- 全量无头自动化实机走查:涉及渲染和地图变动,必须执行全 136 个关卡的自动化走查截图或状态检验,杜绝抽检盲区。
- 严苛静态类型与全量单测:
npm run typecheck必须保持 0 errors。npx vitest run必须保持全量套件 100% 通过(包括global-dt1-load.test.ts,iso-spawn-void-guard.test.ts,variant-distribution.test.ts,superuniques-fidelity.test.ts等防退化单测)。