• 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
  • 有任何意见、建议、求助、反馈都可以在 讨论板 提出
  • THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正

脚本对照表/其他

From THBWiki
Jump to navigation Jump to search
本页是整理东方Project
相关资料的词条

概述

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 未知