东峰司也能学会的自制色鸟鸟步兵补丁思路

闲聊步兵简易教程五彩斑斓的世界HD
浏览数 - 425发布于 - 2025-05-15 - 10:25

前言:众所周知,steam版的《五彩斑斓的世界》(简称色鸟鸟)是有步兵补丁的,但它本身是英文版,对不少读者而言是一道语言障碍。这就不能不让人思考,是否可以把这些步兵CG提取出来,做成普通HD版也适用的步兵补丁?当然是可以的,不过不能直接把文件复制粘贴过去。该怎么办呢?我在逐步探索的过程中,慢慢地形成了一些自己的思路。由于我只是普通爱好者,这些思路肯定有不少可以优化的地方,还望各位读者不吝赐教。

 

所需工具:Garbro,python3,能写py代码的工具(记事本),能跑py代码的工具(cmd框)。当然anaconda之类的也行。此处Garbro的作用是且仅是文件格式转换工具与hzc浏览窗口,理论上文件转换也可以用python做到,不过我暂时不会……

hzc文件相关内容回顾:

我们首先回顾一下我们已有的知识:FAVORITE社(下称F社)的引擎是Favorite View Points(下称fvp),读取hcb脚本,以.bin文件为归档文件,支持免封包,游戏的图片资源用hzc文件(该文件文件头有文件签名b’hzc1’,因此称为hzc文件)。

在普通的HD版色鸟鸟中,游戏会使用的hzc文件结构是文件头+逐行倒序写入的去文件头bmp像素字节。具体来说:

hzc文件的文件头结构如下:

1.4字节的“hzc1”

2.4字节的小端序整数,表示压缩数据原大小(即不含文件头的bmp文件大小)

3.8字节固定内容,0x20 0x00 0x00 0x00与“NVSG”

4.2字节固定内容0x00 0x01(不确定,实际上可能有0x01 0x00的情况,怀疑是无影响内容)

5.2字节。若为小端序0则表示24位bmp图,为小端序1则表示32位bmp图,为小端序2则表示32位bmp图且伴随差分。

6.2字节小端序整数,表示图片宽度(不确定具体术语,此处说的是横向像素数)

7.2字节小端序整数,表示图片高度(不确定具体术语,此处说的是纵向像素数)

8.4字节,表示图片在游戏内的偏移(小端序,前2字节为x偏移,后2字节为y偏移),这个数据与图片无关,必须从原hzc文件中获取。

9.4字节的0x00

10.4字节。若0x12位置的字节为0x02,此处小端序整数表示差分数;否则全为0x00

11.8字节的0x00

总计44字节的文件头,接下来是0x78 0xDA开头的zlib压缩数据(实际可能会有不同)。经测试,将压缩等级设置为9时,所得的结果与原始hzc数据一致。

之后是steam版的hzc文件,文件头处相同,不过后面接着的就不是zlib压缩数据,而是tlg图片格式内容。当然,我们可以用Garbro把tlg转化为png或其他格式以便操作。

再学习一下BMP文件的文件头组成。如果是54字节的文件头,通常包含以下内容:

1.2字节的“BM”(仅考虑Windows系统)

2.4字节的文件总大小(包括像素数据和文件头)

3.4字节的0x00

4.4字节的小端序像素数据绝对偏移

5.4字节的小端序位图信息头长度(我们就认为是28 00 00 00就好)

6.两个4字节的小端序整数,分别记录图片的长和宽(也就是计算分辨率)

7.2字节的“0x01 0x00”

8.2字节,记录每个像素的位数。此处我们仅需考虑0x18与0x20两种即可,前者对应RGB,后者对应RGBA。这一位的信息影响每个像素对应的字节数。换言之我们可以通过分辨率和文件大小反推出这一位的值。

 

基本思路:得到png再拼图然后转到bmp再合成hzc。

为了便于演示,我将会选择一些”e”类cg。这些cg虽然是非H内容的cg,不过由于出现了一些美妙内容,也被归到了成人内容中。

第一步,得到tlg文件。

首先是要得到hzc,garbro可行,参考我之前的探索内容也行。之后是得到tlg文件。显然,garbro认定hzc文件必然是用zlib压缩,因此不能通过其直接拿到tlg文件。怎么办呢?仔细观察:

huohua_离民-1747304291806-QQ20250515130453png
huohua_离民-1747304309082-QQ20250515130515png

可发现这种hzc文件事实上是在tlg正式内容之前加上hzc文件头及差分所属底图(如果是差分文件)。那么事情就简单了,我们直接检索tlg文件的文件头出现位置,把前面的所有内容都删掉,自然就得到tlg了:

signature = b'TLG6.0'

index = content.find(signature)

if index == -1:

    print(f"跳过 {hzc_file}:未找到TLG6.0签名")

    continue

# 截取签名后的内容并保存

tlg_file = hzc_file.with_suffix('.tlg')

tlg_file.write_bytes(content[index:])

 

第二步,把tlg转换为易于操作的png。

通常的图片查看器系统无法查看tlg,所以为了方便起见,可以先把它变为png。当然,理论上跳过这一步也可以,不过我不会为了照顾新手,还是选一些虽然麻烦但好弄的操作吧。我们打开garbro,选择需要转换的文件,右键选择转换多媒体文件:
huohua_离民-1747304328715-QQ20250514190249png

之后选择转成png,点击确定并等待。之后我们可以删掉tlg,毕竟原始的bin文件我们还留着,可以随时提取tlg。之后,我们就会看到底图和差分:huohua_离民-1747304364738-QQ20250515131535png

第三步,对得到的底图和差分进行拼图。

由于差分图和底图的分辨率一致,所以我们可以通过PS先打开底图,然后插入差分一张一张输出。不过这么做效率就太慢了,所以我们用python的png拼图功能:
base = Image.open(base_path).convert('RGBA')

diff = Image.open(diff_path).convert('RGBA')

combined = Image.alpha_composite(base, diff)

combined.save(output_path)

不过我们怎么确认差分对应的底图呢?还记得最开始我们删去的hzc文件中的信息吗?我们在删去之前先做个记录就好了:

if index > 45:

    orifil=content[45:index]

    with open('记录.txt','ab') as jilufile:

        jilufile.write(str(hzc_file).encode('utf8')+b' '+orifil+b'\x0D\x0A')

虽然变量名用拼音之类的情况是很有必要吐槽的,不过我是能用就行主义者所以没关系。

至于这个记录之后之后的处理,就随爱好即可,反正只要你知道你输入的玩意是怎么回事就行。稍做处理,我们就可以
with open (‘记录.txt’ , ’r’ , encoding=’ascii’) as f:

    content = f.readlines()

    for a in content:

        base = a.split()[1]

        diff = a.split()[0]

        png_overlay(base , diff)

这样,我们就得到若干png格式的cg图了。用这种方式拼好上面的两个图,我们就得到了这个: huohua_离民-1747304416994-SHINKUe01bpng

效果很不错呢。

 

第四步,把拼成的图转回到hzc文件形式。

我不会直接从png到hzc,所以先借助garbro把得到的png转成bmp(这一步需要足够大的空间,bmp文件的大小比png大了不知道多少)。大概需要8.14GB的空间,建议留足10G以上的空间进行操作。

之后根据我们之前的bmp转hzc代码,批量操作一下即可。

 

最后一步,把得到的hzc去后缀后,放入对应文件所在的文件夹中。

这一步我就不继续进行了,因为无后缀的文件无法直接用garbro预览,得点开才能看。fvp脚本里要的只是名字为“SHINKU_e01a”的文件,而不是“SHINKU_e01a.hzc”或别的什么文件,所以保留后缀反而读不到,需要删去后缀名。这一步可以在上一步hzc的写入中改变文件名,或者用bat命令:
    ren *.hzc *.
   (重命名指令,对所有以hzc为后缀的文件,将其后缀改为空)

非win系统的读者大概是不能用这一步的(但很可能也玩不了原作)。请在第四步处就处理这个问题。

 

经过了以上这些步骤,我们就可以得到普通HD版也可以用的hzc文件了。之后我们需要放回原版测试一下能不能用。由于我电脑上没有留色鸟鸟HD,这里用白永FHD替代,反正都是fvp,这里能读的话色鸟鸟HD应该也行的。结论是可以,得到的hzc文件完全可用。于是我们到这里就搞定了自制色鸟鸟步兵CG的步骤了。


(不知道可不可以在这里放链接,我就丢一串神秘数字吧:31 59 72 73 47 50 53 4C 64 56 72 69 36 64 44 30 57 41 6D 6D 72 6E 77 3F 70 77 64 3D 38 38 36 32)

#1

鉴于我在这里只搬了这一篇,补充一下第四步的更具体的信息。
①读取原hzc的文件头信息(尤其是图片偏移信息)保留固定内容(这一步是读取原hzc文件的偏移,由于cg图的偏移必然为0,所以实际操作中可以跳过这一步)②将去掉文件头的bmp先分组(分组依据是“每行像素数*像素字节数”为一组)后各组以行为单位倒序③以zlib加密(要和原来的内容一样的话,就用最高压缩得到0x78 0xDA开头的字段)④加上hzc文件头。这几步可以直接找D指导,毕竟我们对这两个文件头的分析已经都在文章里了。

2025-05-15 - 11:48
kohaku