触发转换工具

函数设定:

输出结果

使用说明

将源代码触发程序镶嵌到自定函数里面,或反向转换,因程序员技术有限,不保证转换结果100%准确;请勿找茬。

不保证转换一定会符合预期结果,因为各种找茬可能会出现bug,例如空格、不换行、内层使用与外层一样的函数名,两行触发拼接,当前测试暂无bug,但不保证完全没有bug。再强调三遍:请勿找茬!请勿找茬!请勿找茬!请规范化编写触发程序。

关于RM、XS、TR名称定义:XS指触发程序源代码(包含XS、KB、TR代码)。但为了方便分辨可以将触发程序源代码成为TR,转换函数后的代码成为XS;实际上两者都统称为XS。RM为地图文件所使用的代码,RM可以通过定义变量方式使XS生成不同的代码。此外由rmCreateTrigger创建的触发程序可以简称为RM(注:如果末尾带有/*则不能称为RM,应当称为XS)。

关于XS层与RM层混用问题,很无奈,我无法完成这种转换,因为无法判断哪个if为RM层,哪个if为XS层,也无法判断哪个双引号要转移成转义字符;只能设定将反向转换的RM层代码前面增加$RM_;"+const+"格式将会转换成$%const%$。

XS触发使用说明:
在xs地图文件的头部[void main(void)上面]声明:
void aoebbs(string xs="") {
rmAddTriggerEffect("SetIdleProcessing");
rmSetTriggerEffectParam("IdleProc", "false); */ "+xs+" /* ");
}

void aoebbsA(string xs="") {
rmAddTriggerEffect("SetIdleProcessing");
rmSetTriggerEffectParam("IdleProc", "false); "+xs+"/* trSetUnitIdleProcessing(false");
}

void aoebbsE(string xs="") {
rmAddTriggerEffect("SetIdleProcessing");
rmSetTriggerEffectParam("IdleProc", "false); */ "+xs+"/* trSetUnitIdleProcessing(false");
}

void aoebbsZ(string xs="") {
rmAddTriggerEffect("SetIdleProcessing");
rmSetTriggerEffectParam("IdleProc", "false); */ "+xs+" trSetUnitIdleProcessing(false");
}

void aoebbsR(string xs1="",string xs2="") {
rmCreateTrigger(xs1+"	"+xs2+"/*");
rmCreateTrigger("*/rule	_"+xs1+"End");
rmSetTriggerActive(false);
}


            然后在void main(void)末尾花括号`}`前面添加
    

//这里的是可选功能,用于踢出踢出中文安装路径玩家
/*因为中文路径会导致地图里面的触发程序失效,还会导致联机不同步;所以设定以下两个触发程序。*/
//原理:中文安装路径的玩家用rmSetTrigger生成的触发是空白的,然后我将触发效果写在了rmCreateTrigger,该触发效果为如果检测不到trQuestVarGet("Path"),使其自己退出游戏,不会造成联机不同步,然后用/*注释掉其他内容,下面再添加一个rmCreateTrigger("*/rule _PathEnd")使其停止注释,这样就可以强行加入触发了,不受中文路径影响,但有限制,最大字符255。

rmCreateTrigger("GameStart");
rmSetTriggerRunImmediately(true);
rmSetTriggerPriority(5);
rmSetTriggerEffectParam("IdleProc","true);trQuestVarSet(\"Path\",1);xsDisableSelf();}}/*");

aoebbs("rule _GameStartEND inactive { if(true){");
aoebbsZ("xsDisableSelf();");

rmCreateTrigger("Path active runImmediately{if(trQuestVarGet(\"Path\")!=1){"+"showSPCNote(\"Error!\",\"Use-the-English-path-to-install-the-Age-of-Empires-III,please.\");"+"uiMessageBox2(20948);trEndGame();trYouWin(true);xsDisableRule(\"_Path\");}}/*");
rmSetTriggerActive(false);
rmSetTriggerPriority(5);
rmCreateTrigger("*/rule _PathEnd");
rmSetTriggerActive(false);




//以下红色字体为必要设定,只需要添加一次,添加一次后,你就可以在CustomTrigger与_Temp之间任意插入xs触发。最后一句必须加上 `aoebbsE("");`,aoebbsE("") 的双引号内可以插入触发程序代码。

rmCreateTrigger("CustomTrigger");
rmSwitchToTrigger(rmTriggerID("CustomTrigger"));
rmSetTriggerRunImmediately(true);
aoebbsA("}}");

//这个是xs触发示例:
aoebbs("rule _1start inactive runImmediately { ");
aoebbs("if((trTime()-cActivationTime) >= 300.00000000){");
aoebbs("trSetLighting(\"New England Start\", 130.00000000);");
aoebbs("xsDisableRule(\"_1start\");");
aoebbs("xsEnableRule(\"_2start\");");
aoebbsE("}} ");

//如果你使用的是aoebbsZ结束函数,那么必须要以aoebbsZ("/*");结尾
aoebbs("rule _1startZ inactive runImmediately { ");
aoebbs("if((trTime()-cActivationTime) >= 300.00000000){");
aoebbs("trSetLighting(\"New England Start\", 130.00000000);");
aoebbs("xsDisableRule(\"_1startZ\");");
aoebbs("xsEnableRule(\"_2start\");");
aoebbsZ("}} /*");

//RM与XS混用,根据RM的设定,生成不同的触发
int PlayerType = rmRandInt(1,2);
aoebbs("rule _2start inactive runImmediately { ");
aoebbs("if((trTime()-cActivationTime) >= 130.00000000){");
if ( PlayerType == 1 )
{
aoebbs("trSetLighting(\"yellow_river\", 140.00000000);");
}
if ( PlayerType == 2 )
{
aoebbs("trSetLighting(\"yukon\", 140.00000000);");
}
aoebbs("xsDisableRule(\"_2start\");");
aoebbs("xsEnableRule(\"_3patagonia\");");
aoebbsE("}} ");


if (rmGetNomadStart()!=true)
{
aoebbs("rule _start active runImmediately { ");
aoebbs("if((trTime()-cActivationTime) >= 1.00000000){");
for(p=1;<=cNumberNonGaiaPlayers)
{
if (rmGetPlayerCiv(p) >= 14 && rmGetPlayerCiv(p) <= 18 )
{
aoebbs("trChatSendToPlayer(0,"+p+",\"{63974}\");");
}
else if (rmGetPlayerCiv(p) >= 19 && rmGetPlayerCiv(p) <= 26 )
{
aoebbs("trChatSendToPlayer(0,"+p+",\"{63973}\");");
}
else
{
aoebbs("trChatSendToPlayer(0,"+p+",\"{31536}\");");
}
}
aoebbs("xsDisableRule(\"_start\");");
aoebbsE("}} ");
}



这里必须要以aoebbsZ结尾,不能用aoebbsE结尾
aoebbs("rule _Temp inactive { if(true){");
aoebbsZ("xsDisableSelf();");

rmCreateTrigger使用说明,利用/**/将触发程序写在rmCreateTrigger中,将不会受到中文路径影响而引起的失效,但最高上限255字符,不能输入空格,只能用tab制表符代替,若输入空格则变成下划线_。
使用方法:当前分了两种转换,一种是封装函数(需要在右上角将aoebbs右边的字母修改成R),建议封装函数,如果不封装函数将会导致在地图中无法使用/**/注释这个触发程序。与上面的触发程序一样,你需要先在头部声明
void aoebbsR(string xs1="",string xs2="") {
rmCreateTrigger(xs1+" "+xs2+"/*");
rmCreateTrigger("*/rule _"+xs1+"End");
rmSetTriggerActive(false);}
然后你可以直接使用aoebbsR(srting 触发程序名,string 触发源代码)调用这种触发程序。
例如
aoebbsR("About8"," active runImmediately{if(trTime()>=1){for(m=0;<9){trChatSend(0,\" \");}trChatSendSpoofed(0,\"Forum:\");"+"trChatSendSpoofed(0,\"https://www.aoebbs.net\");xsDisableSelf();}}");
如果不封装函数将变回
rmCreateTrigger("About8 active runImmediately{if(trTime()>=1){for(m=0;<9){trChatSend(0,\" \");}trChatSendSpoofed(0,\"Forum:\");"+"trChatSendSpoofed(0,\"https://www.aoebbs.net\");xsDisableSelf();}}/*");
rmCreateTrigger("*/rule _About8End");
rmSetTriggerActive(false);