这套客户端的全部资源都装在 .wdf(PFDW 容器)里:按 uid 索引、按块存储。解析器写出来一天就够,写对要靠几条用事故换来的铁律。
条目名的构成
包内条目名不是文件名,是一条拼装规则:
条目名 = 去掉 "TILE\" 前缀 + 目录原样 + 文件名转小写
例:TILE\SCENE\LIHUA\MAP.TEX → scene/lihua/map.tex
所以 find() 必须给全路径。只给文件名去查,命中不了任何条目——这是地形贴图全黑事故的根源之一:地形名带 tile\ 前缀,而包内条目没有,查找直接落空。
恰好 EOF
变长结构的解析终止条件是读到恰好 EOF。多读一字节或提前一字节停,都可能把下一个条目的头错位解析成合法数据——不崩溃,只是悄悄读错。校验办法只有一个:解析完最后一个条目时,文件指针必须精确等于文件长度。
md5 与 BlockSize
- 同一份文件只能比 md5——大小、时间戳都会骗人,散装文件与包内文件尤其如此;
- 发布态容器里被跳过的条目
BlockSize=1是无害占位,但任何重打包/转换之后必须整体重算,否则块偏移全错。
工具链上值得投入:一个零依赖的解包器(体检/列条目/按 uid 取字节/导目录树/贴图转 PNG)在本项目里被反复使用,回报远超编写成本。