- 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
- 有任何意见、建议、求助、反馈都可以在 讨论板 提出
- THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正
脚本对照表/MUAECL/MUAECL基本规范
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;
注释
单行注释使用//...
多行注释使用/*...*/。