相关资料的词条
- 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
- 有任何意见、建议、求助、反馈都可以在 讨论板 提出
- THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正
脚本对照表/其他
相关资料的词条
概述
ZUN的dat包解包后除了ECL脚本以及ANM贴图文件以外还有几种重要的文件 下面就是这些文件内容的分析
MSG文件
MSG文件是对话剧情相关,格式例子如下
entry 0 (256) ' @34
10;1
29;0
28;112.0f;270.0f
17;HEY,how are you
11;600
最开始的entry x(256) 代表 该文件的x号对话,对应ECL读取对话文件ins的序号(如XLC中为ins_418(x).神开始为ins_518(x)) @后面的数字为时间值 ";" 前边的是instruction号, 后面的是改instruction的参数 下面是 目前发现的ins表,此表暂时只对关卡内对话有效,可能对ed以及staff无效
城:
0() 结束对话
1(int a) a=0时自机立绘登场
1() 绀珠传之后为开始对话
2(int a) a号boss立绘登场
号码a与立绘的对应关系储存位置未知。一般情况下均为0,城ex道中双boss时为1和2
3() xlc里显示文本的框
4() player立绘淡出(对话结束时用)
5(int a) a号boss立绘淡出(对话结束时用)
6() 删除对话框(对话结束时用)
7() 将player立绘浮上来(其他在场立绘加阴影)
8(int a) a号时boss立绘浮上来(其他在场立绘加阴影)
9() (地灵殿)将增援人物立绘浮上来(增援人物有立绘吗?)(其他在场立绘加阴影)这才是真正的作用
10(int a) a=1时可以ctrl跳,a=0时不可ctrl跳
11(int a) 等待a帧,可以跳过
12() 继续执行ins_519()后面的ecl内容直到下一个ins_519()。一般用于城里boss的登场。
13(int a) 选择player 立绘的表情
14(int a,int b) 选择b号boss 立绘的表情为a(这个表情的顺序可以直接查阅description文件得到,按照ENTRY的顺序,第一个表情为0号,从上往下递增,dummy为空白表情,占位用)
17(Ctring x) 对话内容 ,可以使用 |起始位置,字距,文本 来插入一行上标(小型)文本
18() ???可能和对话框和内部文字的位置兼容有关
19() 切换为boss BGM
20(int a) 浮现出a号boss的名字称号等的那个ename01.png
21() 进入下一面
22() boss BGM淡出(当面结束时用)
25(int a) (地灵殿)选择增援人物立绘的表情 然而增援并没有立绘,更别说表情了
27(float t) 在星莲船三面出现,有淡出当前BGM的效果,附带的参数是淡出过程持续的秒数
28(float x,float y) 对话框位置
29(int a) 选择对话框样式。0为正常的圆角矩形,1为带尖刺的矩形,2为浅灰色云朵状思考框,3为类似云朵的说话框。4-7在鬼形兽中是自机被动物灵附身后的红色对话框,样式与一般对话框相同,例如4与0均为圆角矩形
30() ???(当面结束时用)
32(int a) a=0时使对话框向右,a=1时使对话框向左(一般boss对话框向左,自机对话框向右)
36() (虹龙洞)显示商店界面
42() (兽王园) 对战结束后胜者立绘浮上来
43() (兽王园) 对战结束后败者立绘浮上来
50() (兽王园) 自机立绘提前淡出
51() (兽王园) 敌机立绘提前淡出
55 (兽王园) 敌机点阵图出现
56 (兽王园) 背景逐渐变黑
SHT文件
SHT是储存机体火力数据的文件,此文件单纯储存数据.不包含命令
这部分各版本差异较大,下方结构定义并无代表性,建议参考sht-webedit的代码:struct,以下内容保留展示。
文件开头 header
typedef struct { WORD unknown1; WORD unknown2 float unknown3; float unknown4; float unknown5; float horizontal_vertical_speed;//高速 速度 float horizontal_vertical_focused_speed;//低速速度 float unknown6; float unknown7; WORD unknown8; WORD Maxpower;//单发子弹最高伤害 float thsht_option_positions[];//1-4p 子机的坐标 UNKNOWN //地开始子机位置和offset之间间有大片无用数据 thsht_offset_t offsets[];//火力的offset thsht_shot_type_t shots[];//具体每一way火力的数据 } thsht_header_t;
火力
typedef struct { BYTE rate;//发弹间隔 BYTE delay;//发弹时间点 WORD power;//每发子弹的威力 float x; float y;//发弹点相对坐标 float hitbox_x; float hitbox_y;//子弹判定的长和宽 float angle;//发射方向 float speed;//发射速度 BYTE Option;//子机号, 0即为主炮 BYTE Unknown;// WORD ANM1; //子弹贴图 WORD ANM2;. //击中贴图 DWORD Nothing; //分割用 ,一般是0xFFFFFFFF WORD flags[8];//一些flag, 设置是否为诱导什么的, } thsht_shot_type_t;
POS文件
POS 文件是仅在红魔乡中使用的用来记录bgm循环点的文件。
文件结构以C语言结构体表示为:
typedef struct { DWORD loopStartSample; // 循环开始点 DWORD loopEndSample; // 循环结束点,也是曲目结束点 } th06_pos_t;
两个循环点的取值为 对应时间点*采样率。
FMT文件
FMT 文件是从妖妖梦起用来记录bgm的文件名、开始点、循环点以及fmtChunk的文件。
比如妖妖梦的
th07_01.wav 16 27028956 1217280 16545568 1 2 44100 176400 4 16
th07_02.wav 16545584 30733968 2858880 15499264 1 2 44100 176400 4 16
...
文件结构:
typedef struct { thfmt_t fmtList[]; ... //无用bytes,一般共17字节,均填充为0 } thfmt_body_t;
其中thfmt_t为:
typedef struct { char fileName[16]; //文件名,例如th08_09.wav,多余部分填充为0 unsigned startOffsetInBytes; //PCM开始在thbgm.dat的偏移量 unsigned unknown1; //th13及以后与`loopEndOffsetInBytes`恒等,以往前作意义不明 unsigned loopStartOffsetInBytes; //循环开始相对于startOffset的偏移量 unsigned loopEndOffsetInBytes; //循环结束相对于startOffset的偏移量,也就是一首完整bgm的PCM长度 /*以下结构即为对应wav文件fmt chunk*/ unsigned short format; //1为PCM unsigned short channels; //声道 unsigned sampleRate; //一般是44100,神灵庙部分有改变。 unsigned bytesPerSecend; //frameSize*sampleRate; unsigned short frameSize; //一般为4, (bitsPerSample/8)*channels unsigned short bitsPerSample; //一般为16。 int zero; //无用,填充为0 } thfmt_t;
STD文件
STD文件是控制3d背景的文件
结构
STD文件头:
word data_count word 就是参数第二个是0x1c(28)的那个语句的数量 dword address_moredata (打包器自动计算) dword address_script (打包器自动计算) dword unknown string anm (进单面时重载)
data地址(从90开始):
dword data_address_01 dword data_address_02 ……(个数以实际为准)
data(即std中的object)(从anm中使用script号在std创建对象):
[data 0](script空间)
word std_object_id(一般和data号一样)
word anm_script_id(应该不是anm编号,很迷)
float x
float y
float z
float width
float height
float depth
以下紧跟上段(每句长32),且有时以下这段(每句长28)会在同一data中出现多次(script分布)
word 0(0 means a quad, 0xffff means the end 不是很懂.jpg)
word 1Ch
dword anm_script_id
float x
float y
float z(均为左上角坐标)
float width
float height(如果不为0,将覆盖anm中贴图的长宽,否则使用anm中的信息)
……
dword FFFF 0400
[data 1]
……
more data(将data中设置好的对象放到整个空间对应的位置):
[more data] word std_object_id word 100h float x float y float z ……(每句长)
script(指令区):
…… FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
std script指令
指令名 | 指令码(ins号+指令长度) | 参数 | 作用 |
---|---|---|---|
jump | 0100 1000(16) | dword 字节数, dword 时间值 | 跳转到某个时间的某个字节处 |
setCamPos | 0200 1400(20) | float x, float y, float z | 设置相机坐标 |
moveCamPos | 0300 1C00(28) | dword time, dword mode, float x, float y, float z | 变化setCamPos |
setCamTarget | 0400 1400(20) | float x, float y, float z | 设置相机所对目标点相对于相机的坐标 |
moveCamTarget | 0500 1C00(28) | dword time, dword mode, float x, float y, float z | 变化setCamTarget |
setCamForward | 0600 1400(20) | float x, float y, float z | 设置相机方向(通常为(0.0f,1.0f,0.0f)) |
setCamFOV | 0700 0C00(12) | float angle | 设置视场大小 |
setFog | 0800 1400(20) | [byte R, byte G, byte B], byte alpha, float start_z, float end_z | 在start_z~end_z区域内设置指定颜色和alpha值的迷雾 |
changeFog | 0900 1C00(28) | dword time, dword mode, [byte R, byte G, byte B], byte alpha, float start_z, float end_z | 变化setFog |
setFlag | 0C00(12) 0C00(12) | dword flag | 根据flag给予背景一种效果,已知天空璋中1是相机位置左右横跳,2是背景从0.0f方向逆时针旋转(tkz6面),3是相机时高时低、方向时左时右,4是背景顺时针旋转 |
未知 | 0D00(13) 0C00(12) | dword unknown | 未知 |
未知 | 0E00(14) 1400(20) | dword unknown_00, dword unknown_01, dword unknown_02(fsl中为dword unknown_00, dword unknown_01) | 未知 |
connectEcl | 1000(16) 0C00(12) | dword a | 配合ecl中的ins_630(int a)(第四世代,其它世代自己查)使用,当ins_630执行时,std将跳转到ins_16(即1000 0C00)(int a)处执行 |
未知 | 1100(17) 0C00(12) | dword unknown | tkz一面使用,参数为1,屏幕下方会扭曲 |
moveCamForward | 1200(18) 1C00(28) | dword time, dword mode, float x, float y, float z | setCamForward变化版 |
未知 | 1300(19) 0C00(12) | dword unknown | 未知 |