剧情编辑器-自定义触发程序


帝国时代3中剧情编辑器的触发程序都是可以自己使用TR、KB、XS命令写的,写效果与条件的时候要遵循c++语法,只要有稍微一点问题就会导致整个剧情的整体触发程序失效,例如少加一个"}";帝国3命令规定使用Int数值,你却搞了个string值等都会导致整个触发程序失效。
帝国时代3的触发程序在trigger3文件夹的typetest.xml里面。 在这个xml里面,<Conditions>此处省略几百个条件。</Conditions>中间是用来放触发程序条件的;<Effects>此处省略几百个效果。</Effects>中间是用来放触发效果的。
放到xml中要加上<Command></Command>,如果是条件判断的话,要加上<Expression></Expression>。
也许你看不懂,但是换一种说法你应该会懂了: “<Command></Command>”相当于一行语句,“<Expression></Expression>”相当于c++的if,当然你也可以在<Command></Command>直接使用if,例如<Command>for(i=0;<15){}if(i<=15){这里填写效果语句。}</Command>;另外,触发语句的小于号"<"需要改成xml的转移字符形势&lt;,否则会被视为标签,导致xml语法错误,整个xml无效。







    <Condition name="条件名称">
      <Param name="选项调用名" dispName="$$22534$$显示名称,在前面加上$$xxxxx$$表示调用stringtabley.xml的名称" VarType="player">1</Param>
      <Param name="选项调用名" dispName="$$25424$$显示名称" VarType="kbstat">预设值</Param>
      <Param name="选项调用名" dispName="$$32954$$显示名称" varType="string">预设值</Param>
      <Param name="选项调用名" dispName="$$22297$$显示名称" varType="operator">预设值</Param>
      <Param name="选项调用名" dispName="Value" VarType="float">预设值</Param>
      <Expression>此处输入条件(触发程序),自行参考kb或者tr命令表可以使用%选项调用名%调用上面的选项值</Expression>
    </Condition>



    <Effect name="效果名称">
      <Param name="选项调用名" dispName="$$22348$$显示名称,在前面加上$$xxxxx$$表示调用stringtabley.xml的名称" VarType="group">default</Param>
      <Param name="选项调用名" dispName="$$22434$$ProtoName" varType="protounit">预设值</Param>
      <Param name="选项调用名" dispName="显示名称" varType="area">预设值</Param>
      <Param name="选项调用名" dispName="显示名称" VarType="string">预设值</Param>
      <Param name="选项调用名" dispName="显示名称" varType="long">预设值</Param>
      <Param name="选项调用名" dispName="显示名称" varType="bool">预设值</Param>
      <Command>此处输入触发程序,自行参考kb或者tr命令表,可以使用%选项调用名%调用上面的选项值</Command>
    </Effect>





varType自己研究:
varType 描述 返回值 varType 描述 返回值
bool
返回true或false
true、false camerainfo
选择一个位置。
n个Vector坐标(X,Y,Z)
area
选取一个位置。
Vector坐标(X,Y,Z) civilization
选择一个国家。
返回值为civ国家调用名。
civ国家调用名
unit
选择一个单位。
返回unitID,游戏开局后第一个创建的单位的ID为0
unitID culture
选择一个文化。
返回值为文化调用名。
文化调用名
long
输入数值框,只能输入数值。
所输入的值 kbstat
选择一个stat值。
statID
float
输入数值框,只能输入数值。
所输入的值 pufield
选择一个field值。
fieldID
string
输入框,可输入任何ANSI字符,无法输入中文。
输入中文后将会导致所有触发失效。
所输入的值 tech
选择一个科技调用名。
TechID
stringid
输入框,可输入任何ANSI字符,无法输入中文。
输入中文后将会导致所有触发失效。
所输入的值 techstatus
选择一个科技状态。
0-Unobtainable,1-Obtainable,2-active
0、1、2
stringnonloc
输入框,可输入任何ANSI字符,无法输入中文。
输入中文后将会导致所有触发失效。
所输入的值 protounit
选择一个单位调用名。
返回值为单位调用名。
sound
左边输入路径,但这个选项的输出值应该有BUG。
这个BUG应该会导致所有触发程序失效。
路径","X unittype
选择一个单位标签。
unittype调用名
group
选取一个军队,选择单位按Make可以创建军队。
X,Y(玩家ID,军队编号) alliance
选择一个外交状态?
可以选择Ally、Enemy、Neutral。
Ally、Enemy、Neutral
operator
返回一个值,可以选择"<","<=","==",">=",">"
"<"、"<="、"=="、">="、">" unitstance
选择一个单位立场?
可以选择Aggressive、Defensive、Passive。
Aggressive、Defensive、Passive
traderoute
选择一个贸易路线。
返回值为贸易路线ID,第一个贸易路线ID为1
贸易路线ID uicategory
选择一个Command。
CommandID
event
选择一个触发程序。
返回值为触发程序ID,第一个触发程序ID为0
触发程序ID godpower
选择一个技能。
无法使用,中文字导致所有触发程序失效,stringtabley不相同联机将会不同步。
技能String名称
objective
选择一个目标。
返回值为目标ID,第一个目标ID为1
目标ID player
选择一个玩家ID,范围0-10。
0-10
camtrack
选择一个视觉追踪设定。
视觉追踪所设定的名称。 resource
选择一个资源调用名。
资源调用名。
    <Effect name="*Advanced Info Test1">
      <Param name="bool" dispName="bool" VarType="bool"></Param>
      <Param name="area" dispName="area" VarType="area"></Param>
      <Param name="unit" dispName="unit" varType="unit"></Param>
      <Param name="long" dispName="long" VarType="long"></Param>
      <Param name="float" dispName="float" VarType="float"></Param>
      <Param name="string" dispName="string" VarType="string"></Param>
      <Param name="stringid" dispName="stringid" varType="stringid"></Param>
      <Param name="stringnonloc" dispName="stringnonloc" varType="stringnonloc"></Param>
      <Command>trChatSend(0, "bool:%bool%\narea:%area%\nunit:%unit%\nlong:%long%\nfloat:%float%\nstring:"+"%string%"+"\nstringid:"+"%stringid%"+"\nstringnonloc:"+"%stringnonloc%");</Command>
    </Effect>
    <Effect name="*Advanced Info Test2">
      <Param name="sound" dispName="sound" VarType="sound"></Param>
      <Param name="group" dispName="group" VarType="group"></Param>
      <Param name="operator" dispName="operator" varType="operator"></Param>
      <Param name="traderoute" dispName="traderoute" VarType="traderoute"></Param>
      <Param name="event" dispName="event" VarType="event"></Param>
      <Param name="objective" dispName="objective" VarType="objective"></Param>
      <Param name="camtrack" dispName="camtrack" VarType="camtrack"></Param>
      <Param name="camerainfo" dispName="camerainfo" VarType="camerainfo"></Param>
      <Command>trChatSend(0, "group:%group%\noperator:"+"%operator%\ntraderoute:%traderoute%"+"\nevent:%event%\nobjective:%objective%"+"\ncamtrack:%camtrack%/*\ncamerainfo:"+"%camerainfo*/%"+"\n");/*%sound%*/</Command>
    </Effect>
    <Effect name="*Advanced Info Test3">
      <Param name="civilization" dispName="civilization" VarType="civilization"></Param>
      <Param name="culture" dispName="culture" varType="culture"></Param>
      <Param name="kbstat" dispName="kbstat" VarType="kbstat"></Param>
      <Param name="pufield" dispName="pufield" varType="pufield"></Param>
      <Param name="tech" dispName="tech" VarType="tech"></Param>
      <Param name="techstatus" dispName="techstatus" VarType="techstatus"></Param>
      <Param name="protounit" dispName="protounit" VarType="protounit"></Param>
      <Param name="unittype" dispName="unittype" varType="unittype"></Param>
      <Command>trChatSend(0, "civilization:%civilization%\nculture:%culture%\nkbstat:%kbstat%"+"\npufield:%pufield%\ntech:%tech%\ntechstatus:%techstatus%\nprotounit:%protounit%\nunittype:%unittype%");</Command>
    </Effect>
    <Effect name="*Advanced Info Test4">
      <Param name="alliance" dispName="alliance" VarType="alliance"></Param>
      <Param name="unitstance" dispName="unitstance" VarType="unitstance"></Param>
      <Param name="uicategory" dispName="uicategory" VarType="uicategory"></Param>
      <Param name="godpower" dispName="godpower" VarType="godpower"></Param>
      <Param name="player" dispName="player" VarType="player"></Param>
      <Param name="resource" dispName="resource" VarType="resource"></Param>
      <Command>trChatSend(0, "alliance:%alliance%\nunitstance:%unitstance%\nuicategory:"+"%uicategory%\ngodpower:%godpower%\nplayer:%player%\nresource:%resource%");</Command>
    </Effect>















自己编写触发程序

Quest Var Get Stat 判断玩家Stat数值统计(杀死当然数量、摧毁建筑物那些)是否大于、小于或等于quest var的值 <Condition name="Quest Var Get Stat"> <Param name="PlayerID" dispName="$$22534$$Fake Player" VarType="player">1</Param> <Param name="StatID" dispName="$$25424$$Stat Type" VarType="kbstat">0</Param> <Param name="QuestVar" dispName="$$32954$$Var Name" varType="string">QV1</Param> <Param name="Op" dispName="$$22297$$Operator" VarType="operator">==</Param> <Param name="Value" dispName="Value" VarType="float">1</Param> <Expression>trGetStatValue(%PlayerID%, %StatID%) %Op% trQuestVarGet("%QuestVar%") + %Value%</Expression> </Condition>


斗兽场那个+钱币的触发条件就是像上面那样,然后用官方已有的触发就可以了:if(杀敌数>Quest Var值){进贡钱币;Quest Var值+1},因为Quest Var+1了,所以if条件不成立了,所以当杀敌数再次>Quest Var会再次执行,从而达到无数次效果。


Army Deploy Get quest var
根据set quest var的值大小来定义创建军队的单位数量

    <Effect name="Army Deploy Get quest var">
      <Param name="SrcArmy" dispName="$$22348$$Army" VarType="group">default</Param>
      <Param name="ProtoName" dispName="$$22434$$ProtoName" varType="protounit">Villager</Param>
      <Param name="Location" dispName="" varType="area">0,0,0</Param>
      <Param name="QVName" dispName="$$32954$$Var Name" VarType="string">QV1</Param>
      <Param name="Heading" dispName="$$22432$$Heading" varType="long">0</Param>
      <Param name="Clear" dispName="$$22464$$Clear Existing Units:" varType="bool">true</Param>
      <Command>trArmyDispatch("%SrcArmy%", "%ProtoName%", trQuestVarGet("%QVName%"), %Location%, %Heading%, %Clear%);</Command>
    </Effect>





自定义rule

非专业人员、没有地图触发基础、没有编写触发程序基础请勿尝试。
<Effect name="*Rule-1 /*"> <Param name="Txet1" dispName="rule _Trigger_X" VarType="string">The option is not working.</Param> <Param name="Txet2" dispName="active" VarType="string"></Param> <Param name="Txet3" dispName="{" VarType="string"></Param> <Param name="Txet4" dispName=" if (tempExp)" VarType="string"></Param> <Param name="Txet5" dispName=" { /* xsDisableRule(&quot;_Trigger_X&quot;);" VarType="string">&lt;--&lt;--&lt;--/*</Param> <Param name="Txet6" dispName=" trEcho(&quot;Trigger disabling rule Trigger_0&quot;);" VarType="string"></Param> <Param name="Txet7" dispName=" }" VarType="string">Please create a new trigger.</Param> <Param name="Txet8" dispName="}" VarType="string">And use the &quot;Rule-2 */&quot; or &quot;*Rule-2 */ }}&quot; in new trigger.</Param> <Command>/*</Command> </Effect> <Effect name="*Rule-2 */"> <Param name="Txet1" dispName="rule _Trigger_X+1" VarType="string">The option is not working.</Param> <Param name="Txet2" dispName="active" VarType="string"></Param> <Param name="Txet3" dispName="{" VarType="string"></Param> <Param name="Txet4" dispName=" bool bVar0 = (true);" VarType="string"></Param> <Param name="Txet5" dispName=" bool tempExp = (bVar0);" VarType="string"></Param> <Param name="Txet6" dispName=" if (tempExp)" VarType="string">Please add a new effect &quot;Rule-2 }}&quot;.</Param> <Param name="Txet7" dispName=" {" VarType="string"></Param> <Param name="Txet8" dispName=" */xsDisableSelf();" VarType="string">&lt;--&lt;--&lt;--*/</Param> <Command>*/xsDisableSelf();</Command> </Effect> <Effect name="*Rule-2 */ }}"> <Param name="Txet1" dispName="rule _Trigger_X+1" VarType="string">The option is not working.</Param> <Param name="Txet2" dispName="active" VarType="string"></Param> <Param name="Txet3" dispName="{ bool bVar0 = (true);" VarType="string"></Param> <Param name="Txet4" dispName=" bool tempExp = (bVar0);" VarType="string"></Param> <Param name="Txet5" dispName=" if (tempExp)" VarType="string"></Param> <Param name="Txet6" dispName=" {*/xsDisableSelf();" VarType="string">&lt;--&lt;--&lt;--*/</Param> <Param name="Txet7" dispName=" }" VarType="string"></Param> <Param name="Txet8" dispName="}" VarType="string">Now you can create rule by &quot;*Rule-3 Create&quot;</Param> <Command>*/xsDisableSelf();}</Command> <Command>}</Command> </Effect> <Effect name="*Rule-2 }}"> <Param name="Txet1" dispName=" }" VarType="string">The option is not working.</Param> <Param name="Txet2" dispName="}" VarType="string">The option is not working.</Param> <Param name="Txet3" dispName=" " VarType="string">Now you can create rule by &quot;*Rule-3 Create&quot;</Param> <Param name="Txet4" dispName=" " VarType="string">If you have been create a rule, you can add this effect,</Param> <Param name="Txet5" dispName=" " VarType="string">and add &quot;*Rule-B Create&quot; to create a new rule.</Param> <Command>}</Command> <Command>}</Command> </Effect> <Effect name="*Rule-3 Create"> <Param name="Rule" dispName="rule _" VarType="string"></Param> <Param name="active" dispName="active" VarType="string">active</Param> <Param name="runImmediately" dispName="runImmediately" VarType="string">runImmediately</Param> <Param name="RuleEffect1" dispName="Effect1" VarType="string"></Param> <Param name="RuleEffect2" dispName="Effect2" VarType="string"></Param> <Param name="RuleEffect3" dispName="Effect3" VarType="string"></Param> <Param name="RuleEffect4" dispName="Effect4" VarType="string"></Param> <Param name="RuleEffect5" dispName="Effect5" VarType="string"></Param> <Command>rule _%Rule%</Command> <Command>/**/ %active%</Command> <Command>/**/ %runImmediately%</Command> <Command>{</Command> <Command>bool bVar0 = (true);</Command> <Command>bool tempExp = (bVar0);</Command> <Command>if (tempExp)</Command> <Command>{</Command> <Command>/**/ %RuleEffect1%</Command> <Command>/**/ %RuleEffect2%</Command> <Command>/**/ %RuleEffect3%</Command> <Command>/**/ %RuleEffect4%</Command> <Command>/**/ %RuleEffect5%</Command> </Effect> <Effect name="*Rule-4 Effect"> <Param name="Effect1" dispName="Effect1" VarType="string"></Param> <Param name="Effect2" dispName="Effect2" VarType="string"></Param> <Param name="Effect3" dispName="Effect3" VarType="string"></Param> <Param name="Effect4" dispName="Effect4" VarType="string"></Param> <Param name="Effect5" dispName="Effect5" VarType="string"></Param> <Param name="Effect6" dispName="Effect6" VarType="string"></Param> <Param name="Effect7" dispName="Effect7" VarType="string"></Param> <Param name="Effect8" dispName="Effect8" VarType="string"></Param> <Command>/**/ %Effect1%</Command> <Command>/**/ %Effect2%</Command> <Command>/**/ %Effect3%</Command> <Command>/**/ %Effect4%</Command> <Command>/**/ %Effect5%</Command> <Command>/**/ %Effect6%</Command> <Command>/**/ %Effect7%</Command> <Command>/**/ %Effect8%</Command> </Effect> <Effect name="*Rule-5 Disable Self"> <Command>xsDisableSelf();</Command> </Effect> <Effect name="*Rule-5 Disable Rule"> <Param name="Rule" dispName="Rule_" VarType="string"></Param> <Command>xsDisableRule("_%Rule%");</Command> </Effect> <Effect name="*Rule-5 Enable Rule"> <Param name="Rule" dispName="Rule_" VarType="string"></Param> <Command>xsEnableRule("_%Rule%");</Command> </Effect>



图片中的触发程序最终输出为(那个Rule-4 Effect那里我忘记截图了,这个触发写了trChatSend(0,"Test6、7、8")):
  My Games/Age of Empires 3/Trigger3/trigtemp.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
//==============================================================================
// TEST TRIGGER SCRIPT
//==============================================================================


void main(void)
{
}

rule _Trigger_2
minInterval 4
active
{
   bool bVar0 = (true);


   bool tempExp = (bVar0);
   if (tempExp)
   {
      /*
      xsDisableRule("_Trigger_2");
      trEcho("Trigger disabling rule Trigger_2");
   }
}

rule _Trigger_3
minInterval 4
active
{
   bool bVar0 = (true);


   bool tempExp = (bVar0);
   if (tempExp)
   {
      */xsDisableSelf();
      }
      }
      rule _test
      /**/ active
      /**/ runImmediately
      {
      bool bVar0 = (true);
      bool tempExp = (bVar0);
      if (tempExp)
      {
      /**/ trChatSend(0,"Test1");
      /**/ trChatSend(0,"Test2");
      /**/ trChatSend(0,"Test3");
      /**/ trChatSend(0,"Test4");
      /**/ trChatSend(0,"Test5");
      /**/ trChatSend(0,"Test6");
      /**/ trChatSend(0,"Test7");
      /**/ trChatSend(0,"Test8");
      /**/ 
      /**/ 
      /**/ 
      /**/ 
      /**/ 
      xsDisableSelf();
      xsDisableRule("_Trigger_3");
      trEcho("Trigger disabling rule Trigger_3");
   }
}



------------------------------------
      bool bVar0 = (true);
      bool tempExp = (bVar0);
      if (tempExp)
如果再稍微改下rule creater 那个触发,上面那三个语句可以从输出文件删掉。


-----------------------------------
不过除了展示技术外,好像没有什么作用。