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

2023-11-17

最近在破解一些图片的格式,并想导出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(#换成@)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】游戏汉化之Tile全格式解读 by 阿一 的相关文章

  • Request 获取请求数据(方法)

    1 Request 继承体系 2 Request 获取请求数据 2 1 请求行 String getMethod 获取请求方式 GET String getContextPath 获取虚拟目录 项目访问路径 request demo Str
  • java占用cpu最高的线程堆栈信息

    jstack找出占用cpu最高的线程堆栈信息 package com example demo public class Math public static final int initData 666 public int comput

随机推荐

  • Swagger3的使用

    本篇涉及到的swagger注解 速记 EnableSwagger2 开启swagger EnableOpenApi 开启swagger的Api功能 EnableWebMvc 是为了解决swagger和springmvc整合之后总是出现空指针
  • 解决idea打不开的两种可能性

    一 如果 IDEA 下载完成后打不开 可能是因为 dea64 exe vmoptions 文件中保留了之前版本的破译配置 注释或者删除就可以了 1 打开 C Users Administrator AppData Roaming JetBr
  • python stm32-STM32 上面跑Python

    By Derrick Wang 之前我一直在找一种方案 可以把stm32打造成一个真正的创客平台 因为传统的开发环境安装编译 眼花缭乱的工具栏和按钮并不实用于非电子类专业的爱好者设计出自己的作品 这样的高门槛把很多有兴趣者拒之门外 一个没有
  • UDP协议介绍

    UDP 是一个简单地面向数据报的运输层协议 进程的每个输出操作都正好产生一个 UDP 数据报 并组装成一份待发送的 IP 数据报 UDP 不提供可靠性 它把应用程序传给 IP 层的数据发送出去 但是并不保证他们能到达目的地 UDP数据报封装
  • [蓝桥杯] 分数 (Python 实现)

    题目 代码 b 0 a 1 for i in range 0 20 b a a 2 print d d b a 2 结果 1048575 524288
  • C++案例

    目录 一 while循环猜数组 二 水仙花数 三 for循环敲桌子游戏 四 9 9乘法表 五 一维数组 元素逆置 六 冒泡排序 七 封装一个函数 利用冒泡排序 实现对整型数组的升序排序 八 结构体嵌套结构体 九 结构体排序 一 while循
  • 哈夫曼编码最大编码长度

    概念 层数 叶子节点为待编码的数据 根为第0层 编码长度 第 L L L层数据编码后的长度为 L L L 节点概率 若节点为叶子节点 则概率为叶子所编码数据的频率
  • Linux INPUT 子系统实验

    按键 鼠标 键盘 触摸屏等都属于输入 input 设备 Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件 输入设备本质上还是字符设备 只是在此基础上套上了 input 框架 用户只需要负责上报输入事件 比如按键值
  • Python3之异常with语句

    高级语法之异常with 语法 with 表达式1 as 变量1 表达式2 as 变量2 语句块 with的作用 使用于对资源进行访问的场合 确保使用过程中不管是否发生异常都会执行必须的 清理 操作 并释放资源 如 文件打开后自动关闭 线程中
  • 如何判断是否适合学编程?

    能问出这个问题的人 肯定是心里有点想学习编程 但是又担心自己不适合学习编程 学不会反而浪费时间 那么 如何判断自己是否适合学习编程呢 可以从如下几个方面入手 1 明确自己为什么要学编程 因为不同的编程语言适用的领域不一样 比如我认识一个做互
  • 使用COLMAP进行三维重构

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 COLMAP是什么 二 数据准备 2 1 数据采集 2 2 数据组织 三 重构 3 1 提取图像特征 3 2 特征点匹配 3 3 稀疏重建 SfM 3 4
  • QT开发遇到的问题(1)——程序循环执行的问题

    我之前一直直接用C 开发工程 有需求需要跨平台开发 前期使用时候感觉还可以 转到工程应用时候 就遇到好多坑 今天就遇到个大坑 在开发时候需要不断循环一块代码来实现某种功能 QT不像C 那种 这个更加专业 下面我对这个问题进行详细说明分析 问
  • ResultSet详解

    结果集 ResultSet 是数据中查询结果返回的一种对象 可以说结果集是一个存储查询结果的对象 但是结果集并不仅仅具有存储的功能 他同时还具有操纵数据的功能 可能完成对数据的更新等 结果集读取数据的方法主要是getXXX 他的参数可以是整
  • docker 入门指南

    docker Docker is an open platform for developing shipping and running applications Docker enables you to separate your a
  • Matlab零基础入门

    前言 本篇是随笔 一段时间没用Matlab 简单复习了下 都是入门知识 零基础可读 文章目录 1 初步认识界面和命名 2 数据类型和矩阵 3 元胞数组和结构体 3 1 元胞数组 3 2 eye 3 3 3 magic 3 4 结构体 4 矩
  • RNA-seq——学习路线、学习经验、实战项目、学习总结

    1 参考课程和博客 B站 RNA seq转录组数据分析入门实战 生信技能树 转录组测序数据分析 简书 RNA seq 1 用conda安装RNA seq所需要的工具 简书 RNA seq 2 1 原始数据下载的几种方法 简书 RNA seq
  • python接口自动化(三)--如何设计接口测试用例(详解)

    简介 上篇我们已经介绍了什么是接口测试和接口测试的意义 在开始接口测试之前 我们来想一下 如何进行接口测试的准备工作 或者说 接口测试的流程是什么 有些人就很好奇 接口测试要流程干嘛 不就是拿着接口文档直接利用接口 测试工具测试嘛 其实 如
  • 开发EduSoho v8.7.10 本地播放视频超时或者快进后网络错误导致视频下载中途失败。鉴权播放次数问题

    EduSoho v8 7 10 本地播放视频超时或者快进后网络错误导致视频下载中途失败 鉴权播放次数问题 文件路径 src AppBundle Twig WebExtension php protected function makeTok
  • CFileDialog 多文件选择注意事项

    当选择文件数量比较多的时候 发现CFileDialog返回文件名并不完整 翻阅MSDN发现文件名长度是有限制的 解决思路 CFileDialog dlgOpen TRUE T txt NULL OFN HIDEREADONLY OFN RE
  • 【转】游戏汉化之Tile全格式解读 by 阿一

    最近在破解一些图片的格式 并想导出PNG 不过老是记不住bpp的格式 转载之 方便查看 做些锚记 标准1BPP NDS 1BPP 标准2BPP VB 2BPP NGP 2BPP NES 2BPP 1BPP 1BPP GB 2BPP 1BPP