记蒼の彼方のフォーリズム の CG提取

您所在的位置:网站首页 提取galgame的cg 记蒼の彼方のフォーリズム の CG提取

记蒼の彼方のフォーリズム の CG提取

#记蒼の彼方のフォーリズム の CG提取| 来源: 网络整理| 查看: 265

封面:梦回2019ICPC银川区域赛热身赛(

自从Steam版的蒼の彼方のフォーリズム发行之后,就一直惦记着游戏的CG资源,毕竟宣传的时候可是着重强调了2K(2560*1440)的分辨率。但是经过搜索,网上现有的解包都是针对DVD版蒼の彼方のフォーリズム的,那时候的封包是基于bgi/arc的格式,而且没有2K分辨率的资源,如下:

自己装的蒼の彼方のフォーリズムPerfectEdition,可见BGI/arc封包形式

而Steam版的资源文件就完全不一样了:

等等......这不是Uni.......

竟然是Unity的文件夹形式,那先直接扔AssetStudio里看看:

很遗憾,从文件夹中读取到的有效资源只有OP/ED/ROUTE_END影片,不过先收下了(

游戏发售后的研究就这些了......

剩下的事还要从蝙蝠说起......转眼到了2020年,在家无聊到发霉的人又开始打起了各种Galgame资源的主意

由于游戏是基于.NET的Unity实现,那

.NET反编译方便啊游戏运行时玩家要查看CG必然会从封包中提取资源,而提取的方式会以dll库函数/直接写在可执行程序中的形式存在

以下Python脚本,展示了从.dat文件中提取文件的逻辑:

#! /usr/bin/env python3 import struct import os import sys # 32 Bits module global mod, mod1 mod = 2 ** 32 mod1 = 2 ** 31 # Generate Key array def gk(k): num = (k * 7391 + 42828) % mod num2 = (num 1 return out # decrypt data with key(Generated by k) def dd(data, k): data = bytearray(data) key = gk(k) for i in range(len(data)): b2 = data[i] b2 = b2 ^ key[i % 253] b2 = b2 + 3 + key[i % 89] b2 = b2 ^ 153 data[i] = b2 & 255 return data # Parse file header and get file list & location for decrypt def getInfo(f): f.seek(0) header = f.read(1024) num = 0 num = (sum(struct.unpack(251 * "i", header[16:-4])) + mod1) % mod - mod1 raw = dd(f.read(16 * num), struct.unpack("I", header[212:216])[0]) start = struct.unpack("I", raw[12:16])[0] array = dd(f.read(start - 1024 - 16 * num), struct.unpack("I", header[92:96])[0]) out = [] for i in range(num): l, offset, k, p = struct.unpack("IIII", raw[16 * i:16 * (i + 1)]) name = array[offset:array.find(0, offset)].decode("ascii") out.append((name, p, l, k)) return out # Locate position, create file, then write decrypted binaries def extract(f, files, out): for name, p, l, k in files: print("Extracting file %s ..." % name, end="") name = os.path.join(out, name) os.makedirs(os.path.dirname(name), exist_ok=True) with open(name, "wb") as o: f.seek(p) data = dd(f.read(l), k) o.write(data) print("Done.", end="\n") # Entry: argv1-> .dat file path; argv2-> output path if __name__ == "__main__": path = sys.argv[1] f = open(path, "rb") files = getInfo(f) if len(sys.argv) == 3: extract(f, files, sys.argv[2]) elif len(sys.argv) == 2: for item in files: print(item[0], item[2], "\tKByte(s)")

代码各部分的功能写在注释里了

UPDATE:之前写文章的时候懒得去找dll中的方法,但前天把三色s破解之后顺手又逆向了苍彼的方法,顺着关键词找方法,定位在Assembly-CSharp.dll下的PRead方法中,有:

private void Init() { this.ti = new Dictionary(); this.fs.Position = 0L; byte[] array = new byte[1024]; this.fs.Read(array, 0, 1024); int num = 0; for (int i = 4; i DDLC风(迫害明日香√正常的组合

游戏一定是将CG的组合方式记录到的某处,再次对游戏文件分析,system.dat 中的内容引人注意:

vcglist.csv

vcglist.csv 文件内容如下:

...... VCG01_351 AKCG01_A3 AKCG01_B5 AKCG01_C1 VCG01_361 AKCG01_A3 AKCG01_B6 AKCG01_C1 VCG01B_310 AKCG01B_A3 AKCG01B_B1 VCG01B_320 AKCG01B_A3 AKCG01B_B2 VCG01B_330 AKCG01B_A3 AKCG01B_B3 VCG01B_340 AKCG01B_A3 AKCG01B_B4 VCG01B_350 AKCG01B_A3 AKCG01B_B5 VCG01B_360 AKCG01B_A3 AKCG01B_B6 VCG02_11 AKCG02_A1 AKCG02_B1 VCG02_12 AKCG02_A1 AKCG02_B2 VCG02_13 AKCG02_A1 AKCG02_B3 VCG03_11 AKCG03_A1 AKCG03_B1 ......第一列为CG的命名,前面的数字代表CG所属组,后面的数字代表CG所属分镜其后若干列代表合成该CG所需的文件的文件名(无扩展名)

将转换后的所有png图片、vcglist.csv、以下combine.py文件放在同一文件夹下,创建combine文件夹存放合成后的CG:

import os with open("vcglist.csv", "r", encoding='utf8') as cglist: content = cglist.read().split('\n')[:-1] for line in content: line = line.split(' ') cgname = line[0] combo = line[1:] for i in range(0, len(combo)): combo[i] = combo[i] + ".png" print("Generating %s......" % cgname) ret = os.system("convert -page +0+0 " + " -page +0+0 ".join(combo) + " -mosaic " + "./combined/" + cgname + ".png") if ret !=0: with open("failed.log", "a+") as log: log.write(cgname + "\n")

我是在WSL环境下(安装了ImageMagick的convert命令)执行该脚本,如果合成出现问题(如缺少文件),会在同目录下的failed.log日志中记录合成失败的CG,以此为根据查询vcglist.csv找到缺少的文件。

P.S. 合成要花挺长时间......可以开多线程来进行,但是正好要睡觉了,所以就没多想,写完开始运行就睡了(逃

第二天:

我:Yes!

以上,蒼の彼方のフォーリズム的CG提取也就告一段落了,不过合成出来的文件真的多且大(3000+文件&&7G+大小)

展示几张合成的CG,点击查看原图就是2k分辨率图(当 心 流 量):

吃瓜,都可以吃.jpg串戏的米泽圆配音来张全家福

最后的吐槽:

雪碧社你复活了extra2就gkd!雪碧社的CG真挺好(柚子社你多整点日常CG)我永远喜欢小木曽雪......莉佳!(划掉,みさき是我老婆)他们什么时候更新的18x补丁啊我怎么不知道(蹲一个看看多少人记得2019银川热身赛的题(


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3