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

脚本对照表/ECL

来自THBWiki
< 脚本对照表
YukariM讨论 | 贡献2020年9月18日 (五) 21:16的版本 →‎系统和运算
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索
本页是整理东方Project
相关资料的词条

概述[编辑]

ECL文件是所有Zun正作内部的脚本文件,包涵了如何出怪,弹幕形式,符卡等等. 使用touhou toolkit的可以将.ECL文件解压从dat文件中出来并翻译成一种可阅读的编程语言。 下面就是这种语言参考

分类[编辑]

ECL总大体来讲,可以分成四个世代。

第一世代ecl脚本红妖永花,文花帖.

    此世代脚本资料甚少,国内暂时没有人破译这方面内容。
    网上唯一一个有关这部分的参考请看这里

第二世代ecl脚本对应风神录和地灵殿

第三世代ecl脚本对应星莲船,文花帖DS以及大战争

第四世代ecl脚本对应神灵庙,辉针城,天邪鬼,绀珠传,天空璋,鬼形兽


二三四代开始ECL文件的格式基本被固定下来,各世代的差异只有instruction的数量以及编号的差异

ECL文件由各个sub 和instruction构成, 可以将sub理解为一个模块,instruction理解为一个函数或者命令 每个sub 都要包含若干instruction。 由不同的instruction来实现游戏内不同的事件

一些基本符号[编辑]

Var 定义变量

A,B,C 局部变量

1,2,3 .. 整数常量

1.0f,3.14159265f 浮点数常量

$ 使用变量时加在变量前表示此变量为整数的符号

% 使用变量时加在变量前表示此变量为浮点数的符号

_SS ins_11和ins_15 传递整数参数是使用

_ff ins_11和ins_15 传递浮点数参数是使用

_Sf ins_11和ins_15 传递参数时强制转换浮点为整数时使用

_fS ins_11和ins_15 传递参数时强制转换整数为浮点时使用

!EWX
   1;
!NWX
   2;
!HWX
   3;
!LW
   4;
 一种根据难度选择的switch,

xxxxx:

 若xxxx为纯数字,则此为时间值,代表进行该行的帧数
 若xxxx为英文,则此为标签,配合goto使用


[-1],指向当前堆栈顶的整数,[-2]的话就是第二个整数 [-1.0f] 指向当前堆栈顶的浮点数

[-99XX] 一些全局或本地变量(相对ECL脚本的)

Instruction表[编辑]

  Instruction有 ins_xx(arg1,arg2,arg3.。。。) 表示,其中xx代表Instruction的编号,不同编号有不同的功能,
  每个Instruction需要的参数也不同/

下表展示了各种Instruction的功能

  Instruction大致可以分为 5大类
  即运算和系统,贴图和创建单位, 移动,单位属性,弹幕相关
  每一做的运算和系统部分基本相同,其他部分请参考各世代的独立的页面
  第二世代
  第三世代
  第四世代
  以下部分,黑字为从风神录就开始存在
  蓝色部分是地灵殿新增
  紫色部分是星莲船新增
  棕色部分是文花帖DS新增
  青色部分是妖精大战争新增
  绿色部分是神灵庙新增

系统和运算[编辑]

0() 空指令,main开始调用一次

1() 大return,会清除当前单位

10() 小return,返回到调用这个过程的地方,不清除当前单位

11(CString Subroutine,member 1,member 2.....)

 调用过程,若有需要传递参数,必须要在整数前加上_SS,浮点数前加上_ff,在子线程结束后返回

12(label,int b),

13(label,int b),

14(label,int b),

 12-14三者皆为goto 到对应label处,b为时间值。
 12为无条件goto
 13 if条件用goto
 判断当前栈顶是否为0 如果是0,则执行,不是0则不执行.
 14 循环用goto 判断当前栈顶是否为1,如果是1,就执行
 

15(CString Subroutine,member 1,member 2.....)

 在当前单位创建一个ID为-1的子线程,并行运行

16(CString Subroutine,int id)

 在当前单位创建一个子线程,并行运行

17(int id)

 关闭16的子线程

21() 关闭所有子线程(未核实) 22 zun debug用,release版本是空指令

23(int) 自神灵庙起,代替原ins_83作为等待使用

27 参数暂时不明,最后一个float与速度有关,花中经常调用

30 空指令

31 空指令

40(int size)

 分配局部变量用,等价于Var

41 销毁40分配的局部变量

42(int)

 整数写入堆栈顶,可省略如 ins_42(5);等价于 5;//push

43(int)

 将运算结果储存到变量中。相当于等号,//pop
 即 
 5;
 ins_43($C)
 等价于
 $C=5;
 等价于
 $C=[-1]
    

44(float) 42的浮点数版本

45(float) 43的浮点数版本

运算符号表 ins_50 开始至ins_69为各种基础运算,相同功能的一对中,第一个为整数版本,第二个为浮点数版本

ins_ 作用 ins_ 作用 ins_ 作用 ins_ 作用
50 + 51 + 52 - 53 -
54 * 55 * 56 / 57 /
58 mod - - 59 == 60 ==
61 != 62 != 63 < 64 <
65 <= 66 <= 67 > 68 >
69 >= 70 >= - - - -

71() 逻辑not

72() 逻辑not浮点

73() 逻辑or

74() 逻辑and

75() 按位xor

76() 按位or

77() 按位and

78(int i), 循环i次后返回1,用于控制循环次数。

79() sin

80() cos

81(float A,float B,float x,float y)

  A=ycosx ,B=ysinx

82(float A) +-2π的整数倍以至于A落入(-π,π)这个区间

加减的次数有限制,最多34次(见th15 sub_403920),例如当a=2000时,ins_82(%a) 则a变为1786.3710而非1.94707

在地灵殿四面道中二非有使用这一技巧(弹幕先有序排列,随后变得无序) *发现:YukariM


83(int fps) 等待xx帧数


84() 负号

85() 负号,浮点数


86(float %A,float x,float y)

     A=x平方+y平方

**********注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!************

**********自神灵庙起,83为原84, 84为原85,85为原86,86改为A平方=根号(X平方+y平方)************

87(float %A,float x1,float y1,float x2,float y2,)

     计算点(x1,y1)至点(x2,y2)的方向并存入浮点变量A中

88() 将堆栈的第一个数字进行根号处理

89(float %A, float x float y)

   A=y-x


90(float %A,float %B,float x,float y,float z)

  将点(x,y)旋转z度之后获得坐标(x1,y1);(%A,%B)=(x1,y1)

91(int A,float %B,int T int d,float a,float b)

执行代码之后的T帧内,将%B由a变化到b(也可能是根据b变化),缓动曲线的类型为d,A为slot,一个变量占用一个slot,每个单位有0-7的八个可用slot
以下是所有类型的描述,其中8和17与ins_92有关,函数表达式yn(a,b,t)中t∈[0,1],为该变换已经进行的时刻与总时间的比;此外所有函数均为拟合所得,不保证一定准确

注意:d=22及以后的凹凸性是对a<b时描述的,a>b时凹凸性相反

d description function
0 线性变换 y0=(b-a)*t+a
1 二次函数,变化率增大 y1=(b-a)*t²+a
2 三次函数,变化率增大 y2=(b-a)*t³+a
3 四次函数,变化率增大 y3=(b-a)*t4+a
4 二次函数,变化率减小 y4=(a-b)*(1-t²)+b
5 三次函数,变化率减小 y5=(a-b)*(1-t³)+b
6 四次函数,变化率减小 y6=(a-b)*(1-t4)+b
7 一次函数 y7=bx+a
8 特定贝塞尔曲线 见下方ins_92
9 双二次函数(变化率先增大后减小) y9=y1(a,(a+b)/2,2*t)(其中t<0.5);y9=y4((a+b)/2,b,2*t-1)(其中t>=0.5)
10 双三次函数(变化率先增大后减小) y10=y2(a,(a+b)/2,2*t)(其中t<0.5);y10=y5((a+b)/2,b,2*t-1)(其中t>=0.5)
11 双四次函数(变化率先增大后减小) y11=y3(a,(a+b)/2,2*t)(其中t<0.5);y11=y6((a+b)/2,b,2*t-1)(其中t>=0.5)
12 双二次函数(变化率先增大后减小) y12=y4(a,(a+b)/2,2*t)(其中t<0.5);y12=y1((a+b)/2,b,2*t-1)(其中t>=0.5)
13 双三次函数(变化率先增大后减小) y13=y5(a,(a+b)/2,2*t)(其中t<0.5);y13=y2((a+b)/2,b,2*t-1)(其中t>=0.5)
14 双四次函数(变化率先增大后减小) y14=y6(a,(a+b)/2,2*t)(其中t<0.5);y14=y3((a+b)/2,b,2*t-1)(其中t>=0.5)
15 常函数 y15=a
16 常函数 y16=b
17 特定二次函数 y=bt²/2+a
18 三角函数,变化率减小 sin(t*π/2)*(b-a)+a;
19 三角函数,变化率增大 (1-cos(t*π/2))*(b-a)+a;
20 双三角函数(变化率先减小后增大) y20=y18(a,(a+b)/2,2*t)(其中t<0.5);y20=y19((a+b)/2,b,2*t-1)(其中t>=0.5)
21 双三角函数(变化率先增大后减小) y21=y19(a,(a+b)/2,2*t)(其中t<0.5);y20=y18((a+b)/2,b,2*t-1)(其中t>=0.5)
22 二次凹函数(插值最低-1/8) y22=(2t²-t)*(b-a)+a
23 二次凹函数(插值最低-9/40) y23=(2.5t²-1.5t)*(b-a)+a
24 二次凹函数(插值最低-25/56) y24=(3.5t²-2.5t)*(b-a)+a
25 二次凹函数(插值最低-169/272) y25=(4.25t²-3.25t)*(b-a)+a
26 二次凹函数(插值最低-289/336) y26=(5.25t²-4.25t)*(b-a)+a
27 二次凸函数(插值最高9/8) y27=(-2t²+3t)*(b-a)+a
28 二次凸函数(插值最高49/40) y28=(-2.5t²+3.5t)*(b-a)+a
29 二次凸函数(插值最高81/56) y29=(-3.5t²+4.5t)*(b-a)+a
30 二次凸函数(插值最高441/272) y30=(-4.25t²+5.25t)*(b-a)+a
31 二次凸函数(插值最高625/336) y31=(-5.25t²+6.25t)*(b-a)+a


92(int A,float %B,int T int d,float a,float b,float m,float n)

  自定义缓动曲线
  多了两个参数m,n,除了「mode=8需要m,n;mode17需要n」外与ins_91相同
  当mode=8时,记曲线中点的坐标为(t,y),(其中s∈[0,1]为经过的时间/总时间,y为%B在该时刻的值),则该曲线为一个贝塞尔曲线,起点p0(0,a),终点p3(1,b),两锚点为p1(1/3,a+m/3),p2(2/3,b-n/3)
  当mode=17时,Δ²y=b,Δy|(t=0)=n,y|(t=0)=a

93(float &x,float &y,float r1,float r2)

  (float &A,float &B,float x,float y) 生成(A,B)为从半径为y的圆边上开始生成的16条顺时针旋转的触手内均匀分布的随机点,x大于y则向外生长,x小于y则向内生长,x过小(如=0.0f)可能长过圆心
  上面那个不要看,看下面这个解释
  记R=rnd(-1,1)*(r2-r1)+r1 ,则返回x=cos(rnd(-pi,pi))*R;y=sin(rnd(-pi,pi))*R
  也就是对于一个环面,环面的中位圆的半径为r1,最大半径为r2,在这个环内内随机获取点(x,y)返回
  备注:产生触手的原因是2un的伪随机数(zundom)特性
  原理如下:zundom函数中两个相邻随机数之间具有很强的相关性;具体来说,对于两个定义域为[0,1]的相邻随机数r[n]和r[n+1],有
  r[n+1]≈-r[n]/16.05 - floor(-r[n]/16.05)
  因此如果先取随机角度,则距离也就大约确定,就产生了"触手"
  可以通过先去距离再取角度(此时距离随机性减少),或在两次取随机值的中间加入一个无用随机量更新随机数等方法增强随机性(但是ins_93的代码是确定的,没法这么做)

音效[编辑]

本表是ECL脚本中播放音效相关函数的参数与实际音效的对应关系表 注意本表是以星莲船为基准的其他做略有差异

参数 音效名 参数 音效名
0 se_plst00.mp3
1 se_plst00.mp3
2 se_pldead00.mp3
3 se_enep00.mp3
4 se_enep00.mp3
5 se_enep01.mp3
6 se_enep02.mp3
7 se_ok00.mp3
8 se_ok00.mp3
9 se_cancel00.mp3
10 se_select00.mp3
11 se_timeout.mp3
12 se_timeout2.mp3
13 se_powerup.mp3
14 se_pause.mp3
15 se_cardget.mp3
16 se_option.mp3
17 se_invalid.mp3
18 se_extend.mp3
19 se_lazer00.mp3
20 se_lazer01.mp3
21 se_lazer02.mp3
22 se_plst00.mp3
23 se_tan01.mp3
24 se_tan02.mp3
25 se_tan00.mp3
26 se_tan01.mp3
27 se_tan02.mp3
28 se_tan00.mp3
29 se_power0.mp3
30 se_power1.mp3
31 se_ch00.mp3
32 se_ch01.mp3
33 se_gun00.mp3
34 se_cat00.mp3
35 se_damage00.mp3
36 se_damage01.mp3
37 se_nodamage.mp3
38 se_item00.mp3
39 se_item01.mp3
40 se_kira00.mp3
41 se_kira01.mp3
42 se_kira02.mp3
43 se_kira00.mp3
44 se_graze.mp3
45 se_graze.mp3
46 se_slash.mp3
47 se_slash.mp3
48 se_cardget.mp3
49 se_bonus.mp3
50 se_bonus2.mp3
51 se_nep00.mp3
}
52 se_timeout.mp3
53 se_timeout2.mp3
54 se_ufoalert.mp3
55 se_piyo.mp3
56 se_boon00.mp3
57 se_boon01.mp3
58 ????

特殊变量表[编辑]

[-9903] (TKZ)副机选择,0为 春,1为夏,以此类推

[-9904] 绀珠传中为miss次数,与9949不同的是该计数不会清零(其他作品暂未测试)

[-9907] 未知全局变量 SLM(4BE7D4) HZC中代表符卡练习模式中的符卡序号

[-9908] 同屏单位数单数不包含还有单位flag.1,16,32的单位

[-9909] 单位未知参数 SLM(11E8) DZZ 11c4

[-9910] boss未知参数,同9969 SLM(128c)

[-9911.0f] boss最终位移的方向,停下后变成0

[-9912] 文花帖DS中有特别意义,SLM之后固定放弃使用为0

[-9913] 文花帖DS中为已拍照张数,SLM之后固定放弃使用为0

[-9914] (SLM以后)该单位的编号(主要在8系ins中使用)

[-9915.0f] 可供随意使用的全局变量

[-9916.0f] 可供随意使用的全局变量

[-9917.0f] 可供随意使用的全局变量

[-9918.0f] 可供随意使用的全局变量

[-9919.0f] 可供随意使用的全局变量

[-9920.0f] 可供随意使用的全局变量

[-9921.0f] 可供随意使用的全局变量

[-9922.0f] 可供随意使用的全局变量

[-9923] 可供随意使用的全局变量

[-9924] 可供随意使用的全局变量

[-9925] 可供随意使用的全局变量

[-9926] 可供随意使用的全局变量

[-9927] SLM:[4C2194] +74==0且 4DCC30 !=0时 为1,否则0

[-9928] 文花帖DS中有特别意义,SLM之后固定放弃使用为0

[-9929] 文花帖DS中有特别意义,SLM之后固定放弃使用为0

[-9930] 自机当前火力

[-9931] 已经出现单位数量-1,包含main

[-9932.0f] 可供随意使用的每个单位自身的局部变量

[-9933.0f] 可供随意使用的每个单位自身的局部变量

[-9934.0f] 可供随意使用的每个单位自身的局部变量

[-9935.0f] 可供随意使用的每个单位自身的局部变量

[-9936.0f] BOSS的局部变量

[-9937.0f] BOSS的局部变量

[-9938.0f] BOSS的局部变量

[-9939.0f] BOSS的局部变量

[-9940] BOSS的局部变量

[-9941] BOSS的局部变量

[-9942] BOSS的局部变量

[-9943] BOSS的局部变量

[-9944.0f] =单位至自机的距离

[-9945] = 机体序号,0=灵梦a

[-9946] = 同屏单位数,由于隐藏着main和mapleenemy,所以始终比可见的单位数量多出来2个

[-9947] = 判断上1符卡是否收取,收则是1

[-9948] = 已丢的b的数量

[-9949] = 已miss数,与9904不同的是每个章节结束时该值会重置为0

[-9950] = 当难度为L时,为1。否则为0

[-9951] = 当难度为H时,为1。否则为0

[-9952] = 当难度为N时,为1。否则为0

[-9953] = 当难度为E时,为1。否则为0

[-9954] =单位当前血量

单位坐标和速度拥有最终,目前,和相对 三种参考 移动相关ins

[-9955.0f] =单位相对坐标至自机位置的方向

[-9956.0f] =单位绝对至自机位置的方向

[-9957] = 1

[-9958.0f] =单位最终位移的方向,停下后变成0

[-9959] 难度,0123分别为ENHL

[-9960]Rank

[-9961]未知 (地址1120)

[-9962.0f]当前bossy坐标,

[-9963.0f] 当前bossx坐标,

[-9964.0f] 自机y坐标,与9990完全相同

[-9965.0f] 自机x坐标,与9991完全相同

[-9966.0f] 单位相对曲线运动时的运动半径

[-9967.0f] 单位绝对曲线运动时的运动半径

[-9968.0f] 单位相对速度大小

[-9969.0f] 单位绝对速度大小

[-9970.0f] 单位相对移动速度的方向

[-9971.0f] 单位绝对移动速度的方向,

[-9972.0f]=单位相对坐标y 与9992完全相同

[-9973.0f]=单位相对坐标x 与9993完全相同

[-9974.0f]=单位绝对坐标的y值,与9994完全相同

[-9975.0f]=单位绝对坐标的x值,与9995完全相同

[-9976.0f]=单位最终坐标的y值,与9996完全相同

[-9977.0f]=单位最终坐标的x值,与9997完全相同

以下8个变量在创建子单位的时候,子单位将继承 并且某些特殊函数会收这写变量影响

[-9978.0f] 每个单位自身的局部变量

[-9979.0f] 每个单位自身的局部变量

[-9980.0f] 每个单位自身的局部变量

[-9981.0f] 每个单位自身的局部变量

[-9982] 每个单位自身的局部变量

[-9983] 每个单位自身的局部变量

[-9984] 每个单位自身的局部变量

[-9985] 每个单位自身的局部变量

[-9986] 判定是否全避时使用,若不为0则是全避,实际可能有其他含义,经测试并非boss血量

[-9987.0f]=-1.0至1.0之间的随机浮点数

[-9988] 已经过的时间

[-9989.0f]=单位最终坐标至自机位置的方向

[-9990.0f]= 自机y坐标

[-9991.0f]= 自机x坐标

[-9992.0f]=单位相对坐标y

[-9993.0f]=单位相对坐标x

[-9994.0f]=单位绝对坐标的y值

[-9995.0f]=单位绝对坐标的x值

[-9996.0f]=单位最终坐标的y值,

[-9997.0f]=单位最终坐标的x值,

[-9998.0f]=-π至π之间的随机浮点数

[-9999.0f]=0至 1.0之间的随机浮点数

[-10000]=随机整数,范围非常大