第三代存档数据结构
| 这篇文章属于半成品,目前尚未完成。你可以帮助我们扩充完善它。 |
注意:以下内容仅部分在精灵宝可梦绿宝石美版中得到测试并通过,未在该版本中测试的信息将被标注出来,所有信息目前没有在其它版本中进行测试。如果各位改版爱好者对以下内容进行了相关测试,请务必给出相关测试信息,以便我们对本文章进行更新。
存档文件
第三代存档数据结构即指第三代精灵宝可梦主线游戏游戏存档中游戏相关数据的分布方式,当前主流PC模拟器VisualBoyAdvance将其保存为.SAV或.SAn(n为一大于等于1整数)文件。以下内容将以该类存档文件为基础进行讲解。
存档文件分64KB和128KB两种文件大小类型。128KB存档文件本身包含两份存档信息——当前存档和备份存档,如果当前存档数据被损坏,游戏将自动调用备份存档;64KB存档文件则仅包含当前存档。
存档区分
128KB游戏存档文件中两份存档的区分是依靠“存档ID”(后文详述)进行的。每存档一次则存档ID大小加1,存档ID最大的即为当前存档。值得注意的是,两份存档在文件中的排布顺序是有要求的,存档ID为偶数(即第偶数次存档)的位于文件前面,存档ID为奇数(即第奇数次存档)的位于文件后面,二者顺序不可颠倒,否则游戏有可能读取备份存档,并且无任何提示(即误将备份存档当做当前存档读取,原因不明)。
存档结构
| 128KB 存档文 件 |
存档1 |
| 区块1 | |
| 区块2 | |
| …… | |
| 区块14 | |
| 存档2 | 区块1 |
| 区块2 | |
| …… | |
| 区块14 | |
| 未知16KB | |
| 64KB 存档 文件 |
| 区块1 |
| 区块2 |
| …… |
| 区块14 |
| 未知8KB |
对于128KB存档文件,两份存档数据结构一致,以下内容对于任意一份存档皆适用。
一份存档中数据并非连续的,而是被分为一个个的区块,每个区块占4096字节,供14个区块,即4096 x 14 = 57344B = 56KB。至于剩下的8KB(对于128KB存档文件则是位于整个文件尾部的16KB),其作用尚不明确,有相关文章表示这段数据存储了荣誉殿堂的相关数据[1]。
区块结构
所有存档区块均遵循同一个数据结构,包含数据区、空白区、区块ID、校验和、识别码、存档ID。
| 区块数据结构 | ||
|---|---|---|
| 字段 | 偏移量 | 长度 |
| 数据区 | 0 | 3968字节 |
| 空白区 | 3968 | 116字节 |
| 区块ID | 4084 | 2字节 |
| 校验和 | 4086 | 2字节 |
| 识别码 | 4088 | 4字节 |
| 存档ID | 4092 | 4字节 |
数据区
为游戏数据真正存储的区域。
空白区
作用尚不明确,该区域所有字节似乎总为0x0。
区块ID
即该区块的编号,注意该ID并不一定与该区块在存档中的位置顺序相同。同一份存档中区块似乎可以任意排布。
校验和
用来对数据区所含数据正确性进行校验的一个16位整数,低位在前方式存储。校验方法如下:将数据区每四个字节看做低位在前的32位整数,依次读取并相加,最终得到的32位整数的高16位和低16位分别作为两个16位整数再次相加,所得结果与该校验和比较,如果相等,则该区块通过校验,否则认为该区块受到损坏,整份存档则同样被认为受到损坏,游戏将调用备份存档。
识别码
识别该存档是否为第三代主线游戏所产生,始终为0x08012025。
存档ID
与当前存档次数相同,128KB存档文件还被用来识别当前存档和备份存档。(目前尚不清楚如果存档次数达到0xFFFFFFFF后将会如何处理)
区块组合与数据分布
区块组合
读取存档文件时,游戏将把当前存档每个区块的数据区读取出来,并按照区块ID的大小顺序进行排布组合(注意并非按照区块的出现次序),最终构成游戏存档的完整内容(以下称之为“存档内容”),共3968x14=55552Byte。
数据分布
以下数据分布的描述皆是以存档内容为基础的,请与存档文件相区分。目前仍有很多数据的作用尚不明确。
- 偏移量0x0为玩家名,占8字节(包括其结尾的0xFF)。
- 偏移量0x9处字节最低位为玩家性别,0为男性,1为女性。(未测试)
- 偏移量0xA至0xD为完整训练家ID,前两位为游戏中所显示的训练家ID,整个ID用来给一些数据进行加密。
- 偏移量0x11B8(宝石版,仅测试过绿宝石)/0x0FB8(火红叶绿版,未测试)为队伍精灵数据的起始,每只精灵占用100字节,其数据结构符合第三代精灵数据结构。
- 偏移量0x1418(宝石版)/0x1218(火红叶绿版)为道具仓库数据起始。(两项皆未经过测试)
- 偏移量0x4D84为盒子中精灵数据的起始,14个盒子 x 30只精灵 x 每只80个字节。
- 偏移量0xD0C4为盒子名称的起始,每个名字占9字节(包括其结尾的0xFF)。
- 道具数量在绿宝石版和火红叶绿版中被加密,但红蓝宝石版未加密。加密密钥(16位整数)位于0xAC(绿宝石)/0xF20(火红叶绿)。(皆未经过测试)
- 所有道具种类数据存放在一个列表中(0则代表空位,但其数量仍然经过XOR运算加密)。(未经测试)
- 背包数据结构为16位整数的道具种类和道具数量,绿宝石和火红叶绿版本经过加密。(未经测试)
参考资料
| |||||||||||||||||
