触发转换工具

函数设定:

输出结果

使用说明

将源代码触发程序镶嵌到自定函数里面,或反向转换,因程序员技术有限,不保证转换结果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!\",\"<color=0,1,1>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,\"<color=1,1,0>https://<color=0,1,1>www.aoebbs.net\");xsDisableSelf();}}"); 如果不封装函数将变回 rmCreateTrigger("About8 active runImmediately{if(trTime()>=1){for(m=0;<9){trChatSend(0,\" \");}trChatSendSpoofed(0,\"Forum:\");"+"trChatSendSpoofed(0,\"<color=1,1,0>https://<color=0,1,1>www.aoebbs.net\");xsDisableSelf();}}/*"); rmCreateTrigger("*/rule _About8End"); rmSetTriggerActive(false);