[Parity][render][S1][H][R] 光源:数据表驱动的光源全部缺失,同时到处是自造的光源和系数 #606

Closed
opened 2026-10-02 11:42:46 +00:00 by troytt · 1 comment
Owner

1.13c 客户端保真度审计立项(基准快照:7bd1090 / main @ 77a20c7)

证据标记说明:V-data = 1.13c MPQ 数据表 (.txt / animdata.d2 / .tbl / pal.pl2);V-src = D2MOO 逆向源码;V-bin = 1.13c DLL 反汇编;K = 1.13c 公认行为。

来源审计项:render#5 — [S1][H][R] 光源:数据表驱动的光源全部缺失,同时到处是自造的光源和系数

  • 位置:
    • missile:src/client/view/unit-drawables.ts:394-400、:422、:427-437
    • overlay:unit-drawables.ts:486-504
    • 状态 meta:unit-drawables.ts:535-545(强度 190)
    • 施法:unit-drawables.ts:607-628(215 / 210)
    • 玩家与环境:src/client/scene/lighting-presets.ts:243-257、:271-279
    • 物体 / 怪物:没有任何光源代码(buildSceneDrawables 只为 missile、overlay、cast 生成 pointLights)
  • 代码:
    const lightUnits = entry.light > 0 ? entry.light : entry.trans === 1 ? 6 : 0          // L394
    isCold ? Math.max(120, entry.red) : entry.red, isCold ? Math.max(175, entry.green) : entry.green   // L397-398
    radius: Math.max(14, lightUnits * 2), intensity: 250                                    // L431-432
    const flicker = (Math.sin(inputs.tick * 0.35) * 1.5) | 0                                // presets L247
    const basePlayerRadius = (isDarkCave ? 20 : 22) + (inputs.playerLightRadiusBonus ?? 0) // presets L248;isDarkCave = rawIntensity <= 14(L245)
    radius: Math.max(8, basePlayerRadius + flicker), intensity: 242, red: 255, green: 234, blue: 196   // presets L252-256
    const effectiveAmbIntensity = rawIntensity > 0 ? rawIntensity : 5  …  : 185 / 175 / 165             // presets L271-279
    
  • 原版:
    • 物体:V-data objects.txt #59 Portal(TP) Lit1 18 / Lit2 19,RGB 120,120,255,Flicker 1;#60 Portal(PP) RGB 255,120,120;#39 fire Lit1/Lit2 19,255,236,176,Flicker 1;#119 Waypoint Lit1 18 / Lit2 19,100,100,255,Flicker 1。这些光源(按模式 Lit0-7,带 Flicker)完全没有实现。
    • 怪物:V-data monstats2.txt #156 andariel Light 8,#211 duriel Light 9(light-r/g/b 255)。没有实现。
    • missile:V-data missiles.txt #90 nova、#119 frostnova、#118 poisonnova 的 Light 为空(poisonnova 的 RGB 甚至是 0,0,0),代码却因为 trans===1 给它们造了半径 6×2=14 的光;#59 icebolt RGB 81,81,255,被钳成 120,175,255;Flicker 列(#56 chargedbolt 4、#69 firewall 4)被忽略。仓库文档 docs/lighting_reverse_engineering_113c.md:116 写明 missile 光"直接读 Missiles.txt Light/Red/Green/Blue",没有 ×2、下限 14、冷色钳制。
    • 玩家:同一文档 :114 写"基础半径 10–13 sub-tile + 物品 STAT_LIGHTRADIUS",:117 写"闪烁每 25Hz 逻辑帧 ±1 sub-tile"(文档自述来自 D2Client 反汇编,地址未复核)。LightGrid 的 radius 单位就是 sub-tile(common/drlg/light-grid.ts:53-70),所以 20/22 约为文档值的 2 倍;sin 闪烁、强度 242、暖色 255,234,196 都没有出处(?)。
    • 环境:强度为 0 时回退到 5 和 185,175,165;envIntensity 缺失时回退 255(L243)。均无出处(?)。
    • overlay:半径 max(12, Radius) 违反了 overlay.txt 的 Radius(大量为 6);InitRadius 未使用;强度 210 无出处。
    • 预设:noon / morning / sunset / night / cave / hell / eclipse / dusk / torch / cold 等是自造的用户选项,默认 'auto'(settings/client-settings.ts:58、:71),不影响默认游玩,但 auto 下的 isDarkCave 启发式(L245)同样是自造的。
  • 影响:
    • 传送门、小站、火盆、火把、Boss 周围没有光(地城和夜间最明显)。
    • nova 类技能凭空照亮地面。
    • 冰系光颜色发白;所有 missile 和 overlay 的光圈都偏大。
    • 玩家光圈约为原版 2 倍,并按自造的正弦闪烁。
  • 建议:
    • 物体按 objects.txt Lit{mode} + RGB + Flicker 建光源;怪物按 monstats2.txt Light + light-r/g/b;missile 按 missiles.txt Light / Flicker / RGB 原值(没有 Light 就不发光);overlay 按 Radius / InitRadius / RGB 原值。
    • 玩家半径按文档的基础值 + STAT_LIGHTRADIUS,先逆向确认(待确认 #4)。
    • 删除所有 max(...) 下限、×2、冷色钳制和自造的强度常量。
  • 已有 issue:—
> **1.13c 客户端保真度审计立项**(基准快照:`7bd1090` / `main @ 77a20c7`) > 证据标记说明:`V-data` = 1.13c MPQ 数据表 (`.txt` / `animdata.d2` / `.tbl` / `pal.pl2`);`V-src` = D2MOO 逆向源码;`V-bin` = 1.13c DLL 反汇编;`K` = 1.13c 公认行为。 ### 来源审计项:`render#5` — [S1][H][R] 光源:数据表驱动的光源全部缺失,同时到处是自造的光源和系数 - 位置: - missile:`src/client/view/unit-drawables.ts:394-400`、`:422`、`:427-437` - overlay:`unit-drawables.ts:486-504` - 状态 meta:`unit-drawables.ts:535-545`(强度 190) - 施法:`unit-drawables.ts:607-628`(215 / 210) - 玩家与环境:`src/client/scene/lighting-presets.ts:243-257`、`:271-279` - 物体 / 怪物:没有任何光源代码(`buildSceneDrawables` 只为 missile、overlay、cast 生成 `pointLights`) - 代码: ```ts const lightUnits = entry.light > 0 ? entry.light : entry.trans === 1 ? 6 : 0 // L394 isCold ? Math.max(120, entry.red) : entry.red, isCold ? Math.max(175, entry.green) : entry.green // L397-398 radius: Math.max(14, lightUnits * 2), intensity: 250 // L431-432 const flicker = (Math.sin(inputs.tick * 0.35) * 1.5) | 0 // presets L247 const basePlayerRadius = (isDarkCave ? 20 : 22) + (inputs.playerLightRadiusBonus ?? 0) // presets L248;isDarkCave = rawIntensity <= 14(L245) radius: Math.max(8, basePlayerRadius + flicker), intensity: 242, red: 255, green: 234, blue: 196 // presets L252-256 const effectiveAmbIntensity = rawIntensity > 0 ? rawIntensity : 5 … : 185 / 175 / 165 // presets L271-279 ``` - 原版: - **物体**:V-data `objects.txt` #59 Portal(TP) Lit1 18 / Lit2 19,RGB 120,120,255,Flicker 1;#60 Portal(PP) RGB **255,120,120**;#39 fire Lit1/Lit2 19,255,236,176,Flicker 1;#119 Waypoint Lit1 18 / Lit2 19,100,100,255,Flicker 1。这些光源(按模式 Lit0-7,带 Flicker)完全没有实现。 - **怪物**:V-data `monstats2.txt` #156 andariel Light 8,#211 duriel Light 9(light-r/g/b 255)。没有实现。 - **missile**:V-data `missiles.txt` #90 nova、#119 frostnova、#118 poisonnova 的 Light **为空**(poisonnova 的 RGB 甚至是 0,0,0),代码却因为 `trans===1` 给它们造了半径 6×2=14 的光;#59 icebolt RGB 81,81,255,被钳成 120,175,255;Flicker 列(#56 chargedbolt 4、#69 firewall 4)被忽略。仓库文档 `docs/lighting_reverse_engineering_113c.md:116` 写明 missile 光"直接读 Missiles.txt Light/Red/Green/Blue",没有 ×2、下限 14、冷色钳制。 - **玩家**:同一文档 `:114` 写"基础半径 10–13 sub-tile + 物品 STAT_LIGHTRADIUS",`:117` 写"闪烁每 25Hz 逻辑帧 ±1 sub-tile"(文档自述来自 D2Client 反汇编,地址未复核)。`LightGrid` 的 radius 单位就是 sub-tile(`common/drlg/light-grid.ts:53-70`),所以 20/22 约为文档值的 2 倍;sin 闪烁、强度 242、暖色 255,234,196 都没有出处(?)。 - **环境**:强度为 0 时回退到 5 和 185,175,165;`envIntensity` 缺失时回退 255(L243)。均无出处(?)。 - **overlay**:半径 `max(12, Radius)` 违反了 overlay.txt 的 Radius(大量为 6);InitRadius 未使用;强度 210 无出处。 - **预设**:noon / morning / sunset / night / cave / hell / eclipse / dusk / torch / cold 等是自造的用户选项,默认 `'auto'`(`settings/client-settings.ts:58`、`:71`),不影响默认游玩,但 `auto` 下的 `isDarkCave` 启发式(L245)同样是自造的。 - 影响: - 传送门、小站、火盆、火把、Boss 周围没有光(地城和夜间最明显)。 - nova 类技能凭空照亮地面。 - 冰系光颜色发白;所有 missile 和 overlay 的光圈都偏大。 - 玩家光圈约为原版 2 倍,并按自造的正弦闪烁。 - 建议: - 物体按 `objects.txt` Lit{mode} + RGB + Flicker 建光源;怪物按 `monstats2.txt` Light + light-r/g/b;missile 按 `missiles.txt` Light / Flicker / RGB 原值(没有 Light 就不发光);overlay 按 Radius / InitRadius / RGB 原值。 - 玩家半径按文档的基础值 + `STAT_LIGHTRADIUS`,先逆向确认(待确认 #4)。 - 删除所有 `max(...)` 下限、×2、冷色钳制和自造的强度常量。 - 已有 issue:—
Author
Owner

Resolved in commit 56f4f7f: Authentic 1.13c data-driven point lights from objects, monstats2, missiles, and overlay tables. Player base radius aligned to 11 sub-tiles + STAT_LIGHTRADIUS without arbitrary inflation or fake sine flicker.

Resolved in commit 56f4f7f: Authentic 1.13c data-driven point lights from objects, monstats2, missiles, and overlay tables. Player base radius aligned to 11 sub-tiles + STAT_LIGHTRADIUS without arbitrary inflation or fake sine flicker.
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#606
No description provided.