[Bug] tbl.ts 字符串表解码器偏差:线性假想索引未对齐暗黑2官方哈希桶(Hash Table)键值格式 #8
Labels
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Blocks
#7 [Code Review] 整体代码质量、架构缺陷与技术债务全景审查报告
troytt/diablo2-web
Reference: troytt/diablo2-web#8
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
模块位置
src/formats/tbl.ts,scripts/verify-tbl.ts,scripts/lib/tbl-writer.ts问题背景与现象
tbl.ts目前使用的是简化的[CRC][Count][Offsets...][UTF-16LE Strings]线性顺序布局。lib/tbl-writer.ts写入并读回)。string.tbl,expansionstring.tbl,patchstring.tbl)均是基于TBLHeader(含crc,num_elements,hash_size,version,index_offset,max_tries,file_size)与哈希桶(Hash Table)索引的键值对存储结构。造成的影响
data\local\LNG\CHI\string.tbl解码出全部为乱码(详见HANDOVER.md:119)。src/game/level-names-zh.ts)。解决建议
TBLHeader、HashNode、KeyNode结构体;max_tries)的键检索逻辑;scripts/lib/tbl-writer.ts,并让scripts/verify-tbl.ts直接对齐原版string.tbl真文件验证。已修复 —
fix(formats): 按官方哈希桶格式重写 tbl 解码器与编码器(f4dd55b)原实现按顺序表解析,与真实
.tbl的哈希桶布局不符。现已按实际格式重写:u16 crc, u16 numElements, u32 hashTableSize, u8 version, u32 stringOffset, u32 maxTries, u32 fileSize;其后是numElements个 u16 索引;再其后是hashTableSize个 17 字节节点。patchstring实测:原始大小写 1169/1169 命中,转大写只有 3/1169。isActive != 0即可;valueLength含结尾 NUL。变异测试(由我方独立选定,非实现方自选): 把哈希 key 强制转大写 → 出现 767 处不匹配,测试转红;还原后转绿。