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

脚本对照表/MUAECL/MUAECL基本规范

来自THBWiki
跳到导航 跳到搜索

MUAecl2.0基本句法结构

声明

对于一个包含子ecl或者调用anm文件的ecl,开头要声明包含关系。

 #anm<enemy.anm>
 #anm<st01enm.anm>
 #anm "st01menm.anm"
 #ecl<default.ecl>
 #ecl "st01bs.ecl"
 #ecl<st01mbs.ecl>

声明之后,即表明这个ecl文件可以直接调用子ecl文件内的子程序,以及可以使用指令加载anm文件里的贴图。

类似C++。例如:

 #define Add(a, b) a = a + (b)

子程序

一个ecl文件由多个sub组成。

 sub MainSub00(int A, float B)
 {
   //此处为函数体,下述
 }

括号里为函数输入参数。有int:整型和float:浮点型两种。

变量名遵循规则下述。

顺序结构

顺序结构语句以分号结尾。中间可以换行或适当加空格。可以两句话放在同一行里,只要用分号隔开。

声明变量

 int Int_1, A;
 float AB_2, THis3, rotateAngle;

此为声明变量的语句。

声明的变量名必须以字母开始,中间只可包含字母、数字、下划线。变量名不可为程序关键字或保留关键字,也不可为函数表中有的任何函数名,或变量表中有的任何变量名。

变量名对大小写敏感。

变量声明没有作用域一说。在任何位置声明都会被提前。

程序关键字:

ecli anim sub int float
if else elsif for while
Jmp Jz Jnz MUA_* STACK_*

注意不可使用以MUA_,STACK_开头的所有变量名。

保留关键字:

var goto do loop break
continue this - - -

另外,同一个变量名不可重复声明成整型和浮点型。


可以使用

 float r=0;

来赋初值。

使用

 int max=19:32:40:48;

来分难度赋初值。

可以混杂使用,例如

 float r=1: 2: 3: 4, r1 = 0, r2;

赋值语句

。。。还用说么)

 A=3*B-2;

左端为变量,右端为表达式。可以使用+=, -=, *=, /=。可以使用冒号分难度赋值。

+=系列赋值中不要使用冒号。

表达式

表达式中允许使用的运算符如下:

 一元运算符:-, !
 二元运算符:+, -, *, /, %, ==, !=, >, >=, <, <=, &&, ||, &, |, ^
 括号:(, )
 常量:pi
 一元函数:sin, cos, sqrt, _f, _S</poem>

这里的&&与||代表逻辑与或,&与|代表按位与或,^为按位异或。

_f(A)和_S(A)分别代表将A强制转换成浮点数,和将A强制转换成整数。

表达式中允许使用所有定义过的变量。

 A=_S(100*sin(X*2+10));

同一个二元运算符两端如果包含不同类型的数,则整数会被隐式转换成浮点数。

最好不要在表达式里进行过多的常数运算,可能会爆炸(作者懒得做太多了)。能手算的尽量手算。(比如sqrt(2)会报错,请写sqrt(2.))

不允许直接在表达式后加分号来代替入栈语句。堆栈操作请好好使用Push。 没有特殊要求请最好不要使用堆栈。

难度选择

难度选择语句为

 !E; / !N; / !H; / !L;

多难度相同则为:

 !EN; / !ENH;

退出为

 !ENHL;

执行语句

执行语句即为执行某些功能的语句。

执行语句必须以函数表中有的一函数名开头,后面可用括号带输入参数。输入参数个数必须与函数表中一致。输入参数可以使用表达式。不一致的参数类型会被强制转换。

 time_reset();
 interrupt(0, 1500, 2100, "BossCard1");
 lifebar(0, 1500, color_red);
 star(1);
 playSE(54);
 wait(60);

请不要在一行中间用tab 。。。

在某些ins里,比如wait里面,也可以使用冒号来分难度使用不同的值。

在某些ins里,可以使用一些符号常量,比如弹幕类型,弹幕颜色之类的。

一些执行语句已经被集成到一个句子当中,比如创建弹幕,开始符卡。下面有详细叙述。

可以使用STACK_I1,STACK_F2这种变量,当做直接取堆栈顶第一个数(整数),第二个数(浮点数),以此类推

弹幕变换语句

弹幕变换语句即为可以让弹幕进行特殊运动的语句。

弹幕变换语句用@开始。

 @eff(0, EX_SIMU, 1);
 @spddown(0, EX_SIMU);
 @not_out(0, 2, EX_SIMU, 10000, 0);
 @not_clear(0, 3, EX_SIMU, 10000);
 @delay(0, 4, EX_WAIT, 60);
 @change(0, 5, EX_WAIT, 5, 7);
 @shoot(0, 6, EX_WAIT, 1, 1, 2, 2, 3, 3, 4, 4);
 @shoot_par(0, 7, EX_WAIT, 5, 5, 6, 6, 7, 7, 8, 8);//这几个参数是瞎写的请不要参照

第一个参数是弹幕编号,后面可以选择性加上变换序号。

EX_SIMU代表同时,EX_WAIT代表顺序。

最后带参数。

变换序号

 变换从变换序号0开始依次执行,
 标不标序号,实际都存在
 例如
 @xxx(弹幕编号,.......)
 @xxx(弹幕编号,.......)
 @xxx(弹幕编号,2,.......)
 @xxx(弹幕编号,3,.......)
 这里虽然前两个变换未省略了序号,实际系统会认为他们分别是0和1
 除非使用特别mode,这些变换不能跳过
 例如
 @xxx(弹幕编号,.......)
 @xxx(弹幕编号,.......)
 @xxx(弹幕编号,3,.......)
 @xxx(弹幕编号,4,.......)
 这里少了序号2,所以后面两个不会执行
 可以控制跳跃执行的有8192,32768,65536
 除了用特殊可控序号的mode以外,标不标,有个最大的区别就是可以放心写进循环当中
 倘若不标编号就写入循环里,则每个循环都要执行一次,都会额外添加一次变换,这样会列出非常多的变换导致bug
 而如标了变换序号,即使反复执行,也只会覆盖之前的变换,不会产生新的变换
 

通道

 当通道为EX_WAIT的时候变换都是一个完成后执行下一个
 而同道为EX_SIMU的变换则会同时进行.
 对于64弹墙和4096穿越若使用同一个通道则4096完全失效
 使用不同通道时,弹墙优先于穿越
 通道可以不只是这两个(0和1),具体待考

调用子程序/线程

 MainSub00b(1,pi);

线程名在前面,括号里为输入参数。

如欲子程序返回后主程序再继续运行,则为

 MainSub00b(WAIT,1,pi);

可以调用default.ecl里面的子程序,default.ecl的子程序列表请录入在default.ini里。

使用default.ecl里的子程序时请自行注意参数数量;浮点数与整数等问题。

标签

设置标签语句即为

 SetLabel(自定义标签名);

可在Jmp系语句用。

自定义标签名不可以MUA_开头。

不能连续使用两个标签。

没有特殊要求请最好不要使用标签或者跳转语句,容易出bug。 (比如说,请不要在if elsif块或循环块后面,或循环块结尾前面,或一整个if块最后一个右大括号的前面或后面紧接着使用设置标签语句,因为会导致连续的两个标签)

流程控制语句

选择分支语句

与C++等高级语言的if类似,if后括号里表达式为要执行下面大括号内语句的条件。默认1为真,0为假。

可以使用else或者elsif。

即使只有一句话也要使用大括号。

 if(A<0){
   obj("GirlBlueA01", A, -16, 140, 1000, 1);
 }
 elsif(A<100){
   obj("GirlBlueA01", A-100, -16, 140, 1000, 1);
 }
 else{
   obj("GirlBlueA01", -A, -16, 140, 1000, 1);
 }

循环语句

循环语句分为for和while。while和C++等高级语言类似,while后括号里表达式为如果条件为1则继续循环。默认1为真,0为假。

 while(1){
   wait(1000);
 }//这是个死循环

for后括号内表达式为for循环的循环次数,需为整数。整个循环只在循环开始时读取一次表达式的值。(并且不会改变for后括号内变量)

 for(B){
   obj("GirlRedA01", A, -16, 140, 1000, 1);
 }

跳转语句

跳转语句为Jmp, Jz, Jnz。后空格加标签。

Jmp为无条件跳转,Jz为判断如果堆栈内值为0则跳转,Jnz为判断如果堆栈内值不为0则跳转。

 SetLabel(Abc);
 wait(1000);
 dec(A);//dec的作用在对照表里有解释,将A自减并塞入堆栈。
 Jnz Abc;

注释

单行注释使用//...

多行注释使用/*...*/。