帝国时代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的转移字符形势<,否则会被视为标签,导致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>
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>
<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("_Trigger_X");" VarType="string"><--<--<--/*</Param> <Param name="Txet6" dispName=" trEcho("Trigger disabling rule Trigger_0");" VarType="string"></Param> <Param name="Txet7" dispName=" }" VarType="string">Please create a new trigger.</Param> <Param name="Txet8" dispName="}" VarType="string">And use the "Rule-2 */" or "*Rule-2 */ }}" 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 "Rule-2 }}".</Param> <Param name="Txet7" dispName=" {" VarType="string"></Param> <Param name="Txet8" dispName=" */xsDisableSelf();" VarType="string"><--<--<--*/</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"><--<--<--*/</Param> <Param name="Txet7" dispName=" }" VarType="string"></Param> <Param name="Txet8" dispName="}" VarType="string">Now you can create rule by "*Rule-3 Create"</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 "*Rule-3 Create"</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 "*Rule-B Create" 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>
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 那个触发,上面那三个语句可以从输出文件删掉。 ----------------------------------- 不过除了展示技术外,好像没有什么作用。 |
|||||