[Parity][render/items][S2][R/H] 地面物品掉落/静止绘制忽略 DC6 帧偏移与暗金/套装专属 flippyfile,且按名字/替换前缀猜地面图 #609

Closed
opened 2026-10-02 11:42:46 +00:00 by troytt · 0 comments
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#9 — [S2][R][H] 地面物品掉落 / 静止绘制忽略 DC6 帧偏移;goldAmount ?? 50;掉落时不用暗金 / 套装的 flippyfile

  • 位置:src/client/scene/world-renderer.ts:728、:731-755、:773-783
  • 代码:
    Math.round(unit.worldX - sr.w / 2), Math.round(unit.worldY - sr.h),   // 不使用帧的 offsetX/offsetY
    const goldAmt = unit.goldAmount ?? 50
    rawCode === 'cm1' ? 'flpchm1' : …  : BAKED_UI_MANIFEST.codeToFlippyFile[rawCode]
    
  • 原版:
    • flippy DC6 每帧都带 offsetX/offsetY,翻滚弧线就靠它表现(BAKED_UI_MANIFEST.flippyFrames 已保存偏移,例如 flp2ax 的 offY 依次为 −17、−46、−76……)。
    • 掉落时序 IMODE_DROPPING:速度 256、帧数 4352(17 帧),落地后停在第 16 帧(V-src Units.cpp:805-817)。40 ms/帧与此一致 ✓。
    • 暗金物品用 uniqueitems.txt 的 flippyfile(V-data #382 Annihilus cm1 → flpmss,#401 Hellfire Torch cm2 → flptrch)。普通护身符 misc.txt #96-98 cm1/2/3 → flpchm1/2/3,代码写死的值碰巧一致(H-b)。
  • 影响:
    • 掉落时看不到抛物弧线,物品在原地"翻帧"。
    • 静止位置偏离原版(原版按 DC6 偏移锚定)。
    • 金币堆没有数量时按 50 选图(F)。
    • Annihilus、Hellfire Torch 掉落时显示成普通护身符的翻滚图。
  • 建议:绘制位置改为 worldX + offsetX、worldY + offsetY(按 DC6 锚点语义);去掉 ?? 50,缺失时报错;flippy 文件按 品质→uniqueitems/setitems.flippyfile → 基础表 flippyfile 的顺序选择。
  • 已有 issue:#555(拾取 / Alt 标签)是另一个问题;本条是新问题

来源审计项:inv-skills#17 — [S3][F] 地面物品图和金币堆:按名字查找、invfile→flp 的替换猜测、金币数缺省 1、50/500 阈值无出处

  • 位置:
    • src/client/ui/inventory.ts:397-411(getGoldFlippyRect):Math.floor(amount || 1),阈值 50/500。
    • src/client/ui/inventory.ts:413-487(resolveGroundItemSpriteRect):按名字查找,把 invFile 换成 flp 前缀来猜图。
    • 跨文件:src/common/items/item-bridge.ts:1454:String(item.code ?? '').trim().toLowerCase() || 'rin'。本地 tsx 核对,缺 code 的物品会变成戒指。
  • 原版:
    • 地面图来自 weapons/armor/misc.txt 的 flippyfile;uniqueitems/setitems 有自己的 flippyfile 列,例如 Annihilus 为 flpmss、Hellfire Torch 为 flptrch(V-data)。
    • itemtypes 中 gold 的 VarInvGfx=0,金币堆分档逻辑在 D2Client 中,阈值未核实(?)。
  • 影响:
    • 数据缺失时静默猜图。
    • 金币堆档位可能与原版不同。
  • 建议:只用表里的 flippyfile;金币阈值需要逆向;缺 code 时报错。
  • 已有 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#9` — [S2][R][H] 地面物品掉落 / 静止绘制忽略 DC6 帧偏移;`goldAmount ?? 50`;掉落时不用暗金 / 套装的 flippyfile - 位置:`src/client/scene/world-renderer.ts:728`、`:731-755`、`:773-783` - 代码: ```ts Math.round(unit.worldX - sr.w / 2), Math.round(unit.worldY - sr.h), // 不使用帧的 offsetX/offsetY const goldAmt = unit.goldAmount ?? 50 rawCode === 'cm1' ? 'flpchm1' : … : BAKED_UI_MANIFEST.codeToFlippyFile[rawCode] ``` - 原版: - flippy DC6 每帧都带 offsetX/offsetY,翻滚弧线就靠它表现(`BAKED_UI_MANIFEST.flippyFrames` 已保存偏移,例如 flp2ax 的 offY 依次为 −17、−46、−76……)。 - 掉落时序 IMODE_DROPPING:速度 256、帧数 4352(17 帧),落地后停在第 16 帧(V-src `Units.cpp:805-817`)。40 ms/帧与此一致 ✓。 - 暗金物品用 `uniqueitems.txt` 的 flippyfile(V-data #382 Annihilus cm1 → `flpmss`,#401 Hellfire Torch cm2 → `flptrch`)。普通护身符 `misc.txt` #96-98 cm1/2/3 → flpchm1/2/3,代码写死的值碰巧一致(H-b)。 - 影响: - 掉落时看不到抛物弧线,物品在原地"翻帧"。 - 静止位置偏离原版(原版按 DC6 偏移锚定)。 - 金币堆没有数量时按 50 选图(F)。 - Annihilus、Hellfire Torch 掉落时显示成普通护身符的翻滚图。 - 建议:绘制位置改为 `worldX + offsetX`、`worldY + offsetY`(按 DC6 锚点语义);去掉 `?? 50`,缺失时报错;flippy 文件按 品质→uniqueitems/setitems.flippyfile → 基础表 flippyfile 的顺序选择。 - 已有 issue:#555(拾取 / Alt 标签)是另一个问题;本条是新问题 ### 来源审计项:`inv-skills#17` — [S3][F] 地面物品图和金币堆:按名字查找、invfile→flp 的替换猜测、金币数缺省 1、50/500 阈值无出处 - 位置: - `src/client/ui/inventory.ts:397-411`(`getGoldFlippyRect`):`Math.floor(amount || 1)`,阈值 50/500。 - `src/client/ui/inventory.ts:413-487`(`resolveGroundItemSpriteRect`):按名字查找,把 `invFile` 换成 `flp` 前缀来猜图。 - 跨文件:`src/common/items/item-bridge.ts:1454`:`String(item.code ?? '').trim().toLowerCase() || 'rin'`。本地 tsx 核对,缺 code 的物品会变成戒指。 - 原版: - 地面图来自 weapons/armor/misc.txt 的 `flippyfile`;uniqueitems/setitems 有自己的 `flippyfile` 列,例如 Annihilus 为 flpmss、Hellfire Torch 为 flptrch(V-data)。 - itemtypes 中 gold 的 `VarInvGfx`=0,金币堆分档逻辑在 D2Client 中,阈值未核实(?)。 - 影响: - 数据缺失时静默猜图。 - 金币堆档位可能与原版不同。 - 建议:只用表里的 flippyfile;金币阈值需要逆向;缺 code 时报错。 - 已有 issue:—
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#609
No description provided.