更改

跳转至: 导航搜索

Database.tdb/zh

添加3,752字节2020年1月3日 (五) 22:15
写完了
后文叙述中,比特之间左为高位,字节之间右为高位。(与HxD排布一致)
后文中有关字符串的序列化指的是以ASCII进行序列化。后文中有关字符串的存储是指:先以ASCII进行序列化。然后与C语言类似,在字符串的末尾存储<code>0x00</code>以表示字符串结束。
后文中的Int类型存储均是大端序存储模式后文中的Int32类型和Float类型存储均是大端序存储模式
=== 加密解开 ===
数据库是具有一定加密的,需要通过特定方法解开加密,才能得到可以被阅读的数据,解密的方法为加密的逆向。数据库是具有一定加密的,需要通过特定方法解开加密,才能得到可以被阅读的数据,加密的方法为解密的逆向。
==== 交换比特 ====
首先,加密是以字节为单位进行的。每个字节有8个比特,解密的第一步是还原比特顺序,将这8个比特的高位3比特和低位5比特交换位置,完成解密的第一步。如下图:首先,解密是以字节为单位进行的。每个字节有8个比特,解密的第一步是还原比特顺序,将这8个比特的高位3比特和低位5比特交换位置,完成解密的第一步。如下图:
<code>BIT_1 BIT_2 BIT_3 BIT_4 BIT_5 BIT_6 BIT_7 BIT_8</code>经过变换后得到<code>BIT_4 BIT_5 BIT_6 BIT_7 BIT_8 BIT_1 BIT_2 BIT_3</code>
可通过代码(<nowiki>C#</nowiki>)实现:<code>j = (byte)(-(j ^ 0xAF));</code>
=== 文件结构 Virtools Array ===
加密解开后,文件内部的结构将可以被人类勉强阅读,下面将介绍文件中各部分的结构。橙色字表示此处并不确定。再进一步叙述内容之前,您需要先对Virtools Array有一个初步的了解。 Virtools Array与您常见的Excel表格类似,就是一种表格,每一个单元格都可以存储数据。行和列限制了这个表格的大小。每个Virtools Array都具有一个表头,表头记录了某一列的'''表头名称'''以及这一列的单元格是何种'''数据类型'''。每一行都可以记录数据。 如果您了解数据库,那么就更好理解了,表头分别记录了每一个字段的字段名和类型,而每一行就是一个记录。 如果您需要找寻示例,您可以使用[[Virtools]]打开位于<code>3D Entities</code>文件夹下的[[Balls.nmo]]或者其他NMO文件,然后在Level Manager中展开到表格部分,随便打开一个就是一个实例。 === 存储格式 === 既然已经了解了Virtools Array,那么现在可以直接说,Database.tdb在解码之后就是'''一个个Virtools Array首尾相接存储'''而成。下面将介绍每一个Virtools Array是如何存储的。 {| class="wikitable"|-! 助记符 !! 数据类型<ref>此数据类型指的是数据如何被存储在文件中,与上文表头数据类型无关</ref> !! 注释|-| SheetHeader || String || 表名,Virtools Array的名称|-| ChunkSize || Int32 || 区块大小,即从<code>Columns</code>到<code>Cells</code>的长度|-| Columns || Int32 || 该表共有多少列|-| Rows || Int32 || 该表共有多少行|-| {{color|Separator|orange}} || - || 为定值:<code>0xFF, 0xFF, 0xFF, 0xFF</code>,疑似充当分隔符|-| Header || - || 表头列表存储|-| Cells || - || 单元格列表存储|} ==== 表头列表 ==== 表头列表是由左侧表头向右侧表头逐个写入,且每个表头写入规则如下表:
{| class="wikitable"
|-
! 助记符 !! 长度 !! 类型 数据类型 !! 注释
|-
| Highscore_01 HeaderName || 可变 String || HIGHSCORE || 第1关高分榜表头名称
|-
| Highscore_02 FieldType || 可变 Int32 || HIGHSCORE 表明表头存储的数据类型(表头对应列的数据类型):<br />* <code>1</code>:Int32* <code>2</code>:Float* <code>3</code>:String* <code>4</code><ref>未验证,由Virtools内部的布置猜测</ref>:Object(解析时不会用到)* <code>5</code><ref>未验证,由Virtools内部的布置猜测</ref>:Parameter(解析时不会用到)|} ==== 单元格列表 ==== 单元格从左上角开始存储,与大多数人的通常认知不同,单元格遵循先自增行数,待一列存储完毕,切到下一列从上至下逐行存储的模式,即先行后列。每个数据存储的时候'''根据其对应类型'''首尾相接直接写入即可。 == 被存储的表 == 通过上面的了解,您应该了解,Database.tdb存储了一系列表,那么Database.tdb到底存储了哪些表呢?Database.tdb存储的表格如下表所列,请注意表的存储先后是需要注意的。 {| 第2关高分榜class="wikitable"
|-
| Highscore_03 || 可变 || HIGHSCORE || 第3关高分榜! 表名 !! 注释
|-
| Highscore_04 DB_Highscore_Lv01 || 可变 || HIGHSCORE || 第4关高分榜第1关高分榜
|-
| Highscore_05 DB_Highscore_Lv02 || 可变 || HIGHSCORE || 第5关高分榜第2关高分榜
|-
| Highscore_06 DB_Highscore_Lv03 || 可变 || HIGHSCORE || 第6关高分榜第3关高分榜
|-
| Highscore_07 DB_Highscore_Lv04 || 可变 || HIGHSCORE || 第7关高分榜第4关高分榜
|-
| Highscore_08 DB_Highscore_Lv05 || 可变 || HIGHSCORE || 第8关高分榜第5关高分榜
|-
| Highscore_09 DB_Highscore_Lv06 || 可变 || HIGHSCORE || 第9关高分榜第6关高分榜
|-
| Highscore_10 DB_Highscore_Lv07 || 可变 || HIGHSCORE || 第10关高分榜第7关高分榜
|-
| Highscore_11 DB_Highscore_Lv08 || 可变 || HIGHSCORE || 第11关高分榜第8关高分榜
|-
| Highscore_12 DB_Highscore_Lv09 || 可变 || HIGHSCORE || 第12关高分榜第9关高分榜
|-
| Freischaltung DB_Highscore_Lv10 || 定值 || FREISCHALTUNG || 各个关卡是否被开启的描述区块第10关高分榜
|-
| Options DB_Highscore_Lv11 || 定值 || OPTIONS || 游戏部分设置的存储区块第11关高分榜
|-
| Highscore_13 DB_Highscore_Lv12 || 可变 || HIGHSCORE || 第13关高分榜第12关高分榜
|-
| Highscore_14 DB_Levelfreischaltung || 可变 || HIGHSCORE || 第14关高分榜(无用处)关卡激活(Freischaltung为德语激活的意思)
|-
| Highscore_15 DB_Options || 可变 || HIGHSCORE || 第15关高分榜(无用处)游戏设置
|-
| Highscore_16 DB_Highscore_Lv13 || 可变 || HIGHSCORE || 第16关高分榜(无用处)第13关高分榜
|-
| Highscore_17 DB_Highscore_Lv14 || 可变 || HIGHSCORE || 第17关高分榜(无用处)第14关高分榜(无用处)
|-
| Highscore_18 DB_Highscore_Lv15 || 可变 || HIGHSCORE || 第18关高分榜(无用处)第15关高分榜(无用处)
|-
| Highscore_19 DB_Highscore_Lv16 || 可变 || HIGHSCORE || 第19关高分榜(无用处)第16关高分榜(无用处)
|-
| Highscore_20 DB_Highscore_Lv17 || 可变 第17关高分榜(无用处)|-| HIGHSCORE DB_Highscore_Lv18 || 第18关高分榜(无用处)|-| DB_Highscore_Lv19 || 第19关高分榜(无用处)|-| DB_Highscore_Lv20 || 第20关高分榜(无用处)
|}
其中,''第13关高分榜''至''第20关高分榜(无用处)''在1需要注意的是表<code>DB_Highscore_Lv13</code>至表<code>DB_Highscore_Lv20</code>在v1.0版本文件格式中不存在。0版本Ballance的Database.tdb中不存在
==== HIGHSCORE ====下面将叙述这些表的格式,将直接使用Wiki的表格进行描述,Wiki表格的表头即为Virtools Array的表头,第一行为名称,第二行为数据类型。表格中的数据是随便填写的(主要是对列数和行数有一个直观展示,会使得下面见到的表和在Virtools编辑器中见到的表格几乎完全一致),如果有需要叙述的会用''斜体字''标明。
HIGHSCORE是高分榜结构,每个HIGHSCORE结构负责存储一关的高分榜数据,共记录十组用户名与成绩数据。以上这些表被定义在[[base.cmo]]中。
==== FREISCHALTUNG =DB_Highscore ===
FREISCHALTUNG(德语:激活)记录了每一关的激活情况。DB_Highscore类型的表共有20个,分别代表每一关的高分榜,每一个表都遵循如下格式:
{| class="wikitable"
|-
! 助记符 Playername<br />{{color|String|green}} !! 长度 !! 类型 !! 注释Points<br />{{color|Int32|green}}
|-
| Head Mr. Default || 16字节 || 字节数组 || 表头,默认为<code>DB_Levelfreischaltung</code>序列化后再附加一个<code>0x00</code>组成0
|-
| {{colorMr. Default |Unknow_1|orange}} || 20字节 || 字节数组 || 未知,疑似为描述字符以及一些偏移量记录,恒为<code>0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x46, 0x72, 0x65, 0x69, 0x67, 0x65, 0x73, 0x63, 0x68, 0x61, 0x6C, 0x74, 0x65, 0x74, 0x3F, 0x00</code>0
|-
| Active_01 Mr. Default || 4字节 || 布尔 || 标明第1关是否解锁,true(即1)为解锁,false(即0)为不解锁0
|-
| Active_02 Mr. Default || 4字节 || 布尔 || 标明第2关是否解锁0
|-
| Active_03 Mr. Default || 4字节 || 布尔 || 标明第3关是否解锁0
|-
| Active_04 Mr. Default || 4字节 || 布尔 || 标明第4关是否解锁0
|-
| Active_05 Mr. Default || 4字节 || 布尔 || 标明第5关是否解锁0
|-
| Active_06 Mr. Default || 4字节 || 布尔 || 标明第6关是否解锁0
|-
| Active_07 Mr. Default || 4字节 || 布尔 || 标明第7关是否解锁0
|-
| Active_08 Mr. Default || 4字节 0|} === DB_Levelfreischaltung === DB_Levelfreischaltung记录了前12关的解锁信息。遵循如下格式: {| 布尔 || 标明第8关是否解锁class="wikitable"
|-
! Freigeschaltet?<br />{{color| Active_09 Boolean|| 4字节 || 布尔 || 标明第9关是否解锁green}}<ref>这里有一个隐式类型转换,Int32的1相当于True,0相当于False,后文不再标记</ref>
|-
| Active_10 || 4字节 || 布尔 || 标明第10关是否解锁1
|-
| Active_11 || 4字节 || 布尔 || 标明第11关是否解锁0
|-
| Active_12 || 4字节 || 布尔 || 标明第12关是否解锁0
|-
| Active_13 0|-| 4字节 0|-| 布尔 0|-| 标明第13关是否解锁0|-| 0|-| 0|-| 0|-| 0|-| 0|} === DB_Options === DB_Options存储了游戏的一些常用设置。遵循如下格式: {| class="wikitable"|-! style="min-width: 4em" | Volume<br />{{color|Float|green}} !! style="min-width: 4em" | Synch to Screen?<br />{{color|Boolean|green}} !! style="min-width: 4em" | Key Forward<br />{{color|Int32|green}} !! style="min-width: 4em" | Key Backward<br />{{color|Int32|green}} !! style="min-width: 4em" | Key Left<br />{{color|Int32|green}} !! style="min-width: 4em" | Key Right<br />{{color|Int32|green}} !! style="min-width: 4em" | Key Rotate Cam<br />{{color|Int32|green}} !! style="min-width: 4em" | Key Lift Cam<br />{{color|Int32|green}} !! style="min-width: 4em" | Invert Cam Rotation?<br />{{color|Boolean|green}} !! style="min-width: 4em" | LastPlayer<br />{{color|String|green}} !! style="min-width: 4em" | CloudLayer?<br />{{color|Boolean|green}}|-| ''音量,从0-1取值'' || ''是否垂直同步'' || ''前进按键'' || ''后退按键'' || ''左行按键'' || ''右行按键'' || ''旋转摄像机按键'' || ''提升摄像机按键'' || ''是否反转摄像机旋转'' || ''最近在高分榜姓名处输入的名称'' || ''是否开启云层''
|}
对于按键,遵循以下代码(C#): <pre>private static readonly List<string> keys =new List<string>() {"1","2","3","4","5","6","7","8","9","0","-","=","BackSpace","Tab","Q","W","E","R","T","Y","U","I","O","P", "[","]","Ctrl","A","S","D","F","G","H","J","K","L",";","'","`","Shift","\\","Z","X","C","V","B","N","M",",",".","/", "Right Shift","Alt","Space","Num 7","Num 8","Num 9","Num -","Num 4","Num 5","Num 6","Num +","Num 1","Num 2","Num 3","Num 0","Num Del","<","Up","Down","Left","Right"};</pre> 按键在此数组中的序号即为需要存储的数据。 == OPTIONS ==注释 ==
OPTIONS记录了游戏中部分设置。<references />
[[Category:游戏文件]]
1,136
个编辑

导航菜单