【转】游戏汉化之Tile全格式解读 by 阿一

最近在破解一些图片的格式,并想导出PNG,不过老是记不住bpp的格式,转载之,方便查看。

做些锚记:

 

标准1BPP

NDS 1BPP

标准2BPP

VB 2BPP

NGP 2BPP

NES 2BPP(1BPP+1BPP)

GB 2BPP(1BPP+1BPP)

普通4BPP(N64/MD 4BPP)

GBA 4BPP

SMS 4BPP(1BPP+1BPP+1BPP+1BPP)

SNES 4BPP(1BPP+1BPP+1BPP+1BPP)

GBA 8BPP

GBA3 XBPP

---------------------------------------------------------------------------------------------------------------------------------------------------------

本文章首发于:第9海盗
文章作者:阿一
发布时间:2008年11月4日

 

介于目前网络上没有一个对Tile全部格式的完整解读文章,特写一篇供大家参考,希望对您有用处。
   不过可能您会说,现在已经有CrystalTile2这么方便的编辑工具,似乎并不需要了解其中底层的结构存储。如果您想自己开发类似CT2这样的 Tile处理工具,或者想自己编写某某游戏的专用汉化工具,这篇文章值得你参考。如果您是对编程不太精通的汉化破解者,那么您就当这篇文章是您的深造之旅 吧,了解ROM的数据结构对汉化有非常大的好处。

 

先讲一下几个基本概念
什么BPP?

引用:
BPP是英文Bit Per Pixel的缩写,意思就是每个像素需要占用的位数,具体什么是“位”请自行参考计算机原理基本课程。

 
什么是low nibble first和high nibble first?

引用:
高 半字节在先还是低半字节在先,例如二进制存储为:01101111,如果按高半字节先读,结果就是01101111,如果按照低半字节先读,结果就是 11110110

 
什么是Big-endian和Little-endian?

引用:
例 如要读取一个2字节的整型数,十六进制存储为:0x1234,Big-endian就是把高值存储在开始地址,读取出来就是0x1234,而 Little-endian正好相反,把小的存储在开始地址上,读取出来就是0x3412

 

下面开始正式结构解读:

标准1BPP

引用:
解释: 1位代 表一个点,字节内从左到右读
颜色: 2色
示例: 10110110 从左到右每个位分别代表屏幕上1-8的点

 
 
NDS 1BPP

引用:
解释: 1 位代表一个点,字节内从右到左读
颜色: 2色
示例: 10110110 从右到左分别代表屏幕上1-8的点

 
 
标准2BPP

引用:
解释: 2位代 表一个点,字节内从左到右读取
颜色: 4色
示例: 10110110 从左到右分别代表屏幕上1-4的点

 
 
VB 2BPP

引用:
解释: 2个 位代表一个点,以BPP为单位从右向左反读
颜色: 4色
示例: 10110110 当前例子总共4个点,从右向左反读为10,01,11,10,这4个颜色分别为屏幕上1-4的点

 

NGP 2BPP

引用:
解释: 2 个位代表一个点,以BPP为单位从右向左反读,并在像素层面进行水平翻转
颜色: 4色
示例: 10110110 当前例子总共4个点,从右向左反读为10,01,11,10,像素层面翻转,结果为:10,11,01,10,这4个颜色分别为屏幕上1-4的点
附注: 相对VB 2BPP,仅仅多了一个像素层面的水平翻转

 
 
NES 2BPP(1BPP+1BPP)

引用:
解 释: 2个位被分开存储,1个位在当前位置,另外1个位存储在当前Tile结束后
颜色: 4色
示例: 10110110 ......(中间7个字节) ......11011010 由于2个位被分开存储,因此存储一个8*8的Tile只需要8个字节,8个字节结束后就是当前Tile的另外一个BPP,当前例子中,屏幕第1个点就是 11,相应第2、第3点就是10和01,后面等等,注后面1位以高位的形式合并,合并后的完整结果为:11,10,01,11,10,01,11,00, 分别代表了屏幕上1-8的点
附注: 为什么要分开存储?这是为了节省空间,有些图片如果只使用了2色,那么用1BPP就足够了,但是有些图片如果使 用的颜色超过了2色,那么就可以在1BPP的结尾再附加另外一个1BPP的数据,结合在一起,就变成2BPP,可以使用4色了

 
 
GB 2BPP(1BPP+1BPP)

引用:
解释: 2 个位被分开存储,1个位在当前位置,另外1个位存储在当前行结束后
颜色: 4色
示例: 10110110 11011010,由于被分别存储,和NES 2BPP一样,前面1个字节就代表了8个点,后面1个字节就是另外一个BPP,后面为高位的形式合并后的结果 为:11,10,01,11,10,01,11,00,分别代表了屏幕上1-8的点

 
 
普通4BPP(N64/MD 4BPP)

引用:
解 释: 4个位代表一个点,从左到右读取,一个字节两个点
颜色: 16色
示例: 10110101,从左到右读取结果为:1011,0101,分别代表了屏幕上1-2的点

 
 
GBA 4BPP

引用:
解释: 4 个位代表一个点,从右到左,以4BPP为单位进行反读
颜色: 16色
示例: 10110101,从右向左以4位为单位进行反读,结果为:0101,1011,分别代表了屏幕上1-2的点

 
 
SMS 4BPP(1BPP+1BPP+1BPP+1BPP)

引用:
解 释: 4个位被分开存储,1行+1行+1行+1行,如果是8*8格式的Tile,那么就是1字节+1字节+1字节+1字节,4个字节第一 个位结合在一起,就是屏幕上第1个点,后面存储的是高位信息
颜色: 16色
示例: 10111011 01110011 11100010 10110110,屏幕上1-8的点颜色分别为:1101,0110,1111...下面的点以此类推

 
 
SNES 4BPP(1BPP+1BPP+1BPP+1BPP)

引用:
解 释: 4个位被分开存储,行后1个位,Tile结束后另外存储了2个位,如果是8*8格式的Tile,那么就是1字节+1字节+(1字 节+1字节)*7行+1字节+1字节,首尾4个字节的第一个位结合在一起,就是屏幕上第1个点,后面存储的是高位信息
颜色: 16色
示例: 10111011 01110011 ...(7行,每行2个字节,总共14个字节)... 11100010 10110110,屏幕上第1-8个点分别为:1101,0110,1111...下面的点以此类推

 
 
GBA 8BPP

引用:
解释: 8 个位代表一个点,即1个字节就是一个点
颜色: 256色
示例: 10110101 01101011,从左到右分别代表屏幕上1-2的点

 
 
GBA3 XBPP

引用:
解释: 2 个位代表一个点,CT2中所谓的GBA3 XBPP,其实就是双层Tile结构,并以BPP为单位从右到左进行反读
颜色: 4色
示例: 10011100,从右到左,2位为单位进行读取,结果为:00,11,01,10,第1和第3个值代表第1个 Tile的1-2个点,第2和第4个值代表第2个Tile的1-2个点
附注: 为什么要使用这种双层Tile组合在一起存储的格式呢?据CT2作者解释是因为NDS的硬件逻辑引起的,NDS 中一次性最少要读2个字节,合并存储能够提高读取效率。不过这个解释也还不太完整,具体更深入的原因留待您的发现吧。

 
 
  在这些Tile格式基础上,具体游戏中的字库再千变万化,都仅仅是Tile的结构组合,或者Tile之间夹杂了一些结构性的数据,在汉化的处理过程 中,如果不修改字库结构,可以直接跳过结构数据。 
  本篇文章某些内容初次涉及,有错误在所难免,如果您看了之后觉得和您的想法有分歧,欢迎发邮件探讨交流,阿一的邮 箱:ayi#pirate9.com(#换成@)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值