AI 脚本与触发
此页面列出了所有 Phobos 引入的 AI 脚本与地图触发相关的修改。
Bug 修复与杂项
- 动作脚本
移动到单元格现在遵守 YR 的单元格计算规则。使用1000 * Y + X获取单元格值。(先前使用遗留自 RA1 的128 * Y + X) - 现在游戏可以读取的路径点范围拓展到了 [0, 2147483647]。(先前为 [0,701])
- 地图触发结果
41 播放动画在...现在可以更完善地创建可以播放音效、造成杀伤以及使用设置了TiberiumChainReaction参数的动画(需要 修改FAData.ini)。 - 地图触发结果
125 将建筑建于...现在可以设置是否播放建造动画(需要修改FAData.ini)。 - 全局变量(
rulesmd.ini中的VariableNames)和局部变量(地图中的VariableNames)现在都没有数量限制了。 - 动作脚本
部署现在会让拥有DeploysInto的载具自动寻找空地以进行部署,而不再是直接呆住。 - 由触发结果 7、80、107 生成的小队现在可以正常使用 IFV 和 OpenTopped 逻辑。
- 如果预先放置了拥有
NaturalParticleSystem的建筑,它总是在游戏开始时被创建。这一行为已被移除。 - 用于 AI 动作脚本的超级武器
56 超时空传送至建筑、57 超时空传送至目标和10104 超时空传送至敌方基地现在可以通过[General] -> AIChronoSphereSW和AIChronoWarpSW分别明确设置。如果设置了AIChronoSphereSW但没有设置AIChronoWarpSW,那么游戏会检查前者指定的SW.PostDependent来获取关联的超级武器。如果也没有设置那么会分别使用[SuperWeaponTypes]列表中最后一个Type=ChronoSphere和Type=ChronoWarp的超级武器。 - 修复了 AI 小队招募数量与生产计划不一致导致不足以建立小队的问题。
更高的覆盖物数量上限
现在可以让地图包含索引上限高达 65535 的覆盖物。
在地图文件中设置
[Basic] -> NewINIFormat=5以启用该功能。
Note
使用此功能的地图 无法 被原版游戏加载。
Warning
并非所有工具都完全支持此功能,它们可能会崩溃或损坏地图。我们推荐在使用此功能时使用 World-Altering Editor 地图编辑器。
单人任务地图
基地节点修复
- 在单人战役中你可以决定 AI 是否修复由 Deliver 超武(Ares 功能)提供的基地节点/建筑。
- 你可以通过设置
[Basic] -> RepairBaseNodes来全局控制,或者在特定地图文件的[Some House]中设置同名标签。局部标签会覆盖全局。
- 你可以通过设置
在 rulesmd.ini:
[Basic]
RepairBaseNodes=false ; boolean在地图文件:
[Country House]
RepairBaseNodes= ; List of 3 booleans indicating whether AI repair basenodes in Easy / Normal / Difficult game diffculty.默认载入图与简报位置
- 现在可以为单人战役地图的载入图像素偏移值和载入图图像以及色盘设置默认值,如果地图自身没有定义这些或载入图与色盘丢失那么会将其作为默认值使用。
在 missionmd.ini:
[Defaults]
DefaultLS640BriefLocX=0 ; integer
DefaultLS640BriefLocY=0 ; integer
DefaultLS800BriefLocX=0 ; integer
DefaultLS800BriefLocY=0 ; integer
DefaultLS640BkgdName= ; filename - including the .shp extension.
DefaultLS800BkgdName= ; filename - including the .shp extension.
DefaultLS800BkgdPal= ; filename - including the .pal extensionNote
尽管标签名为 DefaultLS800BkgdPal,但实际上就像原本游戏中的 LS800BkgdPal 那样适用于两种情况。
基地车重新部署
- 现在你可以通过设置
[Basic] -> MCVRedeploys来决定单人战役中的基地车能否重部署。这会覆盖[MultiplayerDialogSettings] -> MCVRedeploys但仅生效于单人战役地图中。
在地图文件:
[Basic]
MCVRedeploys= ; boolean在 missionmd.ini 中设置最佳时间和相关字符串条目
- 默认情况下单人战役地图的最佳通关时间和消息文本是在地图文件自身的
[Ranking]小节中定义的。现在也可以在missionmd.ini的地图文件小节中设置这些值,并且这些值会优先于地图文件中的设置,若未设置则使用地图文件中的内容为默认值。
在 missionmd.ini:
[SOMEMISSION] ; Filename of mission map
Ranking.ParTimeEasy= ; time string (hh:mm:ss)
Ranking.ParTimeMedium= ; time string (hh:mm:ss)
Ranking.ParTimeHard= ; time string (hh:mm:ss)
Ranking.UnderParTitle= ; CSF entry key
Ranking.UnderParMessage= ; CSF entry key
Ranking.OverParTitle= ; CSF entry key
Ranking.OverParMessage= ; CSF entry key启动时显示简报对话框
- 现在你可以通过在地图文件的
[Basic]小节或missionmd.ini(前者优先)中设置ShowBriefing为 true 来使简报对话框在单人战役地图启动时显示。用户可以通过在RA2MD.INI中设置ShowBriefing为 false 来禁用这一功能。BriefingTheme(按优先级从高到低的顺序为:地图文件、missionmd.ini、rulesmd.ini中的阵营条目)可以用来定义在简报界面播放的自定义主题。若未设置则载入图主题会一直播放直至游戏场景实际开始。- 可以分别通过设置
ShowBriefingResumeButtonLabel和ShowBriefingResumeButtonStatusLabel来自定义启动简报对话框界面恢复按钮的字符串标签以及按钮的状态文本。它们默认为在其他情况下打开简报对话框界面时使用相同的标签
在 missionmd.ini:
[SOMEMISSION] ; Filename of mission map
ShowBriefing= ; boolean
BriefingTheme= ; Theme name在地图文件:
[Basic]
ShowBriefing=false ; boolean
BriefingTheme= ; Theme name在 rulesmd.ini:
[SOMESIDE] ; Side
BriefingTheme= ; Theme name在 uimd.ini:
[UISettings]
ShowBriefingResumeButtonLabel=GUI:Resume ; CSF entry key
ShowBriefingResumeButtonStatusLabel=STT:BriefingButtonReturn ; CSF entry key在 RA2MD.INI:
[Phobos]
ShowBriefing=true ; boolean动作脚本
10000-10999 游戏内行为
10000-10049 攻击行为
- 这些行为通过第二个参数指示小队类型使用特遣部队接近并攻击目标,该参数是一个通用预定义组的索引。请参阅下表以了解可能的行为(第一个参数)和参量(第二个参数值)。
- 基于威胁值的攻击行为会考虑
rulesmd.ini中的TargetSpecialThreatCoefficientDefault和EnemyHouseThreatBonus标签。 - 所有攻击其他空中单位的战机在执行此脚本时会直接将其结束。由于如果没有这一效果那么战机类在开发此功能时存在一些无法修复的 Bug 因此这种行为是故意的
AITargetTypes动作通过第二个参数指示小队类型使用特遣部队接近并攻击目标,该参数是AITargetTypes中一个由 modder 自行定义的组的索引。请参阅下表以了解可能的行为(第一个参数)和参量(第二个参数值)。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=i,n ; For i values check the next table| 行为 | 参数 | 重复 | 目标优先级 | 描述 |
|---|---|---|---|---|
| 10000 | 目标类型 # | Yes | Closer | |
| 10001 | 目标类型 # | No | Closer | 当一个小队成员击杀指定目标时结束 |
| 10002 | AITargetTypes 索引 # | Yes | Closer | |
| 10003 | AITargetTypes 索引 # | No | Closer | 当一个小队成员击杀指定目标时结束 |
| 10004 | AITargetTypes 索引 # | Yes | Closer | 从列表中选取 1 个随机目标 |
| 10005 | 目标类型 # | Yes | Farther | |
| 10006 | 目标类型 # | No | Farther | 当一个小队成员击杀指定目标时结束 |
| 10007 | AITargetTypes 索引 # | Yes | Farther | |
| 10008 | AITargetTypes 索引 # | No | Farther | 当一个小队成员击杀指定目标时结束 |
| 10009 | AITargetTypes 索引 # | Yes | Farther | 从列表中选取 1 个随机目标 |
| 10010 | 目标类型 # | Yes | 较近且威胁较高 | |
| 10011 | 目标类型 # | No | 较近且威胁较高 | 当一个小队成员击杀指定目标时结束 |
| 10012 | AITargetTypes 索引 # | Yes | 较近且威胁较高 | |
| 10013 | AITargetTypes 索引 # | No | 较近且威胁较高 | 当一个小队成员击杀指定目标时结束 |
| 10014 | 目标类型 # | Yes | 较远且威胁较高 | |
| 10015 | 目标类型 # | No | 较远且威胁较高 | 当一个小队成员击杀指定目标时结束 |
| 10016 | AITargetTypes 索引 # | Yes | 较远且威胁较高 | |
| 10017 | AITargetTypes 索引 # | No | 较远且威胁较高 | 当一个小队成员击杀指定目标时结束 |
- 下列值为可用于新攻击动作脚本第二个参数的 目标类型 # 参数:
- 「被视为载具的建筑」意为那些同时设置了
UndeploysInto和Foundation=1x1且没有设置ConsideredVehicle或者设置了ConsideredVehicle=true的建筑。
- 「被视为载具的建筑」意为那些同时设置了
| 值 | 目标类型 | 描述 |
|---|---|---|
| 1 | Anything | 任何敌方 载具类型、战机类型、步兵类型 和 建筑类型 |
| 2 | Structures | 任何敌方不被视为载具的 建筑类型。 |
| 3 | 矿车 | 任何敌方拥有 Harvester=yes 或 ResourceGatherer=yes 的载具类型、拥有 ResourceGatherer=yes 的建筑类型。 |
| 4 | Infantry | 任何地方步兵类型 |
| 5 | Vehicles | 任何敌方载具类型或被视为载具的建筑 |
| 6 | Factories | 任何敌方拥有 Factory= 设置的建筑类型 |
| 7 | 基地防御 | 任何敌方拥有 IsBaseDefense=yes 的建筑类型 |
| 8 | 所属方威胁 | 任何瞄准小队所属方单位或任何接近小队队长的敌人。 |
| 9 | 电厂 | 任何敌方拥有正值 Power= 的建筑类型 |
| 10 | Occupied | 任何敌方拥有步兵驻扎的建筑类型 |
| 11 | 科技建筑 | 任何拥有 Capturable=yes 和 NeedsEngineer=yes 的建筑类型 |
| 12 | Refinery | 任何敌方拥有 Refinery=yes 或 ResourceGatherer=yes 的建筑类型、拥有 ResourceGatherer=yes 且 Harvester=no 的载具类型(即奴隶矿车) |
| 13 | 心灵控制者 | 任何武器使用 MindControl=yes 弹头的载具类型、战机类型、步兵类型和建筑类型 |
| 14 | 空中单位(包括降落的) | 任何敌方战机类型和拥有 Jumpjet=yes 的载具类型或步兵类型,包括已经降落的和任何其他当前仍在空中的单位 |
| 15 | Naval | 任何敌方拥有 Naval=yes 的建筑类型和载具类型,以及任何在水上单元格的载具类型、战机类型、步兵类型 |
| 16 | Disruptors | 任何敌方拥有正值 InhibitorRange=、正值 RadarJamRadius=、CloakGenerator=yes 或 GapGenerator=yes 的对象 |
| 17 | 地面载具 | 任何敌方没有 Naval=yes 的载具类型、降落的战机类型或被视为载具的建筑类型 |
| 18 | Economy | 任何敌方拥有 Harvester=yes 或 ResourceGatherer=yes 的载具类型、拥有 Refinery=yes、ResourceGatherer=yes 或 OrePurifier=yes 的建筑类型 |
| 19 | 兵营 | 任何敌方拥有 Factory=InfantryType 的建筑类型 |
| 20 | 重工 | 任何敌方拥有 Naval=no 和 Factory=UnitType 的建筑类型 |
| 21 | 机场 | 任何敌方拥有 Factory=AircraftType 的建筑类型 |
| 22 | Radar | 任何敌方拥有 Radar=yes 或 SpySat=yes 的建筑类型 |
| 23 | 高科 | 任何敌方位于 [AI]>BuildTech= 列表中的建筑类型 |
| 24 | 船坞 | 任何敌方拥有 Naval=yes 和 Factory=UnitType 的建筑类型 |
| 25 | 超武 | 任何敌方拥有 SuperWeapon=、SuperWeapon2= 或 SuperWeapons= 的建筑类型 |
| 26 | 建造厂 | 任何敌方拥有 ConstructionYard=yes 和 Factory=BuildingType 的建筑类型 |
| 27 | Neutrals | 任何中立(平民)对象 |
| 28 | Generators | 任何敌方拥有 CloakGenerator=yes 或 GapGenerator=yes 的建筑类型 |
| 29 | 雷达干扰器 | 任何敌方拥有正值 RadarJamRadius= 的对象 |
| 30 | Inhibitors | 任何敌方拥有正值 InhibitorRange= 的对象 |
| 31 | 海军单位 | 任何敌方拥有 Naval=yes 的载具类型或任何在水上单元格的载具类型、战机类型、步兵类型 |
| 32 | 机动单位 | 任何载具类型、战机类型和步兵类型 |
| 33 | Capturable | 任何拥有 Capturable=yes 的建筑或任何拥有 BridgeRepairHut=yes 且与断桥关联的建筑 |
| 34 | 区域威胁 | 任何敌方处于小队队长警戒区域内的对象 |
| 35 | 重工与船坞 | 任何敌方拥有 Factory=UnitType 的建筑类型 |
| 36 | 非防御建筑 | 任何敌方拥有 IsBaseDefense=no 的建筑类型 |
| 37 | 桥梁维修小屋 | 任何拥有 BridgeRepairHut=yes 且与断桥关联的建筑 |
- 第二个参数是
AITargetTypes小节中从 0 开始的索引用于指定可选的载具类型、战机类型、步兵类型和建筑类型。 AITargetTypes索引 # 值在新的AITargetTypes小节中获取,该小节必须在rulesmd.ini中声明:
在 rulesmd.ini:
[AITargetTypes] ; List of TechnoType lists
0=SOMETECHNOTYPE,SOMEOTHERTECHNOTYPE,SAMPLETECHNOTYPE
1=ANOTHERTECHNOTYPE,YETANOTHERTECHNOTYPE
...10050-10099 移动小队至科技类型位置行为
- 这些行为通过第二个参数指示小队类型使用特遣部队接近由其指定的目标。请参阅下表以了解可能的行为(第一个参数值)。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=i,n ; For i values check the next table| 行为 | 参数 | 目标所属 | 目标优先级 | 描述 |
|---|---|---|---|---|
| 10050 | 目标类型 # | Enemy | 较近且威胁较高 | |
| 10051 | [AITargetType] 索引 # | Enemy | 较近且威胁较高 | |
| 10052 | [AITargetType] 索引 # | Enemy | Closer | 在选中列表中选取 1 个随机目标 |
| 10053 | 目标类型 # | Friendly | Closer | |
| 10054 | [AITargetType] 索引 # | Friendly | Closer | |
| 10055 | [AITargetType] 索引 # | Friendly | Closer | 在选中列表中选取 1 个随机目标 |
| 10056 | 目标类型 # | Enemy | 较远且威胁较高 | |
| 10057 | [AITargetType] 索引 # | Enemy | 较远且威胁较高 | |
| 10058 | [AITargetType] 索引 # | Enemy | Farther | 在选中列表中选取 1 个随机目标 |
| 10059 | 目标类型 # | Friendly | Farther | |
| 10060 | [AITargetType] 索引 # | Friendly | Farther | |
| 10061 | [AITargetType] 索引 # | Friendly | Farther | 在选中列表中选取 1 个随机目标 |
10100-10999 一般用途
10100 时效性区域警戒
- 可以让特遣部队中的单位一定时间内进入区域警戒模式。与原本只能待在运抵进行基本的警戒命令(
5,n)不同:它可以更主动地攻击入侵附近区域的目标或保护需要保护的单位。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=10100,n ; integer, time in ingame seconds10101 等待弹药满载
- 如果特遣部队中包含使用弹药的单位那么在这些单位弹药满载前脚本不会继续。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=10101,010102 向小队队长集结
- 将特遣部队围绕小队队长(该单位在此期间几乎保持不动)进入区域警戒模式给定的事件值。默认的半径是
[General] -> CloseEnough且单位不会离开此区域。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=10102,n10103 装载入运输载具
- 如果特遣部队中包含可以被同一特遣部队的运输工具装载的单位,那么该行为会让这些单位进入运输工具。在单人任务地图中,下一个操作必须是等待到满载(
43,0)否则脚本将不会继续执行。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=10103,010104 超时空传送至敌方基地
- 使用第一个可用的
Type=ChronoSphere超级武器将小队类型的成员超时空传送到敌方基地附近[General] -> AISafeDistance(加上参数中定义的可为负值的额外距离)格的位置。超级武器必须先加载到[General] -> AIMinorSuperReadyPercent所指定百分比才能被此行为考虑。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=10104,n ; integer, additional distance in cells12000-12999 补充/设定预设动作。
12000 无目标情况下等待
- 当在例如新的
通用目标类型攻击动作和AITargetTypes 攻击动作脚本执行前小队类型会考虑如果未选择目标则必须等待 1 秒。第二个参数是一个用于指定未找到目标时充实多少次然后才放弃新的攻击动作脚本并跳转到下一行的参数。默认值0表示无限次重试。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=12000,n ; integer n=012001 修改目标距离
- 默认情况下,
移动小队至科技类型位置在队长抵达rulesmd.ini中声明的CloseEnough距离时结束。当该行为在移动小队至科技类型位置前执行时会覆盖CloseEnough值。这一行为仅对接下来的第一次执行效果有影响而之后再下一次移动时仍会继续使用CloseEnough。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=12001,n12002 设置移动结束参数
- 设置移动动作结束并跳转到下一行的方式。此操作仅在第一次执行时有效,下次移动时仍会恢复使用
CloseEnough。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=12002,n- 可选参数有:
| 参数 | 动作结束于... |
|---|---|
| 0 | 小队队长抵达最小距离 |
| 1 | 一个单位抵达最小距离 |
| 2 | 所有小队成员抵达最小距离 |
14000-14999 工具行为
14000 设置小队权重奖励
- 当在例如新的
通用目标类型攻击动作和AITargetTypes 攻击动作脚本执行前小队类型会考虑如果小队目标被小队成员杀死则必须奖励增加 AI 触发的当前权重。当前权重不会超过AI触发最小权重和最大权重的限制。第二个参数是一个正整数。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=14000,n ; integer n=014001 增加AI触发权重
- 当执行此行为时增加 AI 触发的当前权重。当前权重永远不会超过AI触发最小权重和最大权重的限制。注意所有同一 AI 触发的小队类型最后都会更新 AI 触发当前权重。第二个参数是一个正整数。注意原版游戏在 AI 触发周期结束时会使用两个小队中的第一个来计算 AI 触发当前权重,此行为不检查小队是 AI 触发中的第一个还是第二个并在执行行为时计算当前权重。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=14001,n14002 降低AI触发权重
- 当执行此行为时减少 AI 触发的当前权重。细则同上。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=14002,n14003 撤销小队成功
- 与动作脚本
49,0相反的效果。类似小队失败。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=14003,014004 为 Phobos 新增的攻击/移动脚本强制全局更改小队中的 OnlyTargetHouseEnemy 值
- 全局性地强制为小队上的
OnlyTargetHouseEnemy标签设置一个值。仅适用于 Phobos 新增的攻击/移动脚本。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=14004,n ; integer- 可选参数有:
| 参数 | 描述 |
|---|---|
| -1 | 默认值,不强制更改 OnlyTargetHouseEnemy 标签全局值。 |
| 0 | 强制 OnlyTargetHouseEnemy 为 false |
| 1 | 强制 OnlyTargetHouseEnemy 为 true |
| 2 | 强制随机布尔值 |
16000-16999 流程控制
16000 定时跳转至同一行
- 当计时器结束时当前动作脚本结束并重新开始同一动作。计时器会会一直重复跳转(无限循环)直到被
16002号结果打断或小队被摧毁。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16000,n ; integer n=0, in ingame seconds16001 定时跳转至下一行
- 当计时器结束时当前动作脚本结束并开始脚本类型列表中下一个动作。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16001,n ; integer n=0, in ingame seconds16002 停止定时跳转
- 如果激活了定时跳转则该动作将停止进程。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16002,016003 随机跳过下一行
- 执行该动作时会挑选一个在 1 和 100 之间的随机数,如果数值小于等于第二个参数则跳过下一个动作。第二个参数为 0 表示永远不会跳过下一个动作而 100 表示永远跳过下一个动作。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16003,n ; where 0 > n <= 10016004 随机选取脚本
- 当执行此行为时会随机选取一个新的脚本类型并替换当前脚本。第二个参数是新的
AIScriptsList小节下从 0 开始的索引。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16004,n第二个参数是 AIScriptsList 小节下从 0 开始的索引,该小节必须在 rulesmd.ini 中声明才能使此脚本生效:
在 rulesmd.ini:
[AIScriptsList] ; List of ScriptType lists
0=SOMESCRIPTTYPE,SOMEOTHERSCRIPTTYPE,SAMPLESCRIPTTYPE
1=ANOTHERSCRIPTTYPE,YETANOTHERSCRIPTTYPE
...16005 跳回上一个脚本
- 在由
94号动作选择的随机脚本中使用可以使其跳回到上一个脚本,并继续执行x=94,n之后的行。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=16005,018000-18999 变量操作
18000-18023 编辑变量
- 计算一个变量值。
- 变量值由于某些原因在触发行为中值类型为 int16 而非 int32,这表示它的范围是从 -2^15 到 2^15-1。
- 任何超出此范围限制的数值都可能导致无法预测的结果!
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=i,n ; where 18000 <= i <= 18023, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the param value.18024 - 18047 使用局部变量编辑变量
- 使用局部变量的值来操作变量的值。
- 类似于
18000-18023,但用于操作值的数字是从局部变量中读取的。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=i,n ; where 18024 <= i <= 18047, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the local variable index.18000 - 18071 使用全局变量编辑变量
- 使用全局变量的值来操作变量的值。
- 类似于
18000-18023,但用于操作值的数字是从全局变量中读取的。
在 aimd.ini:
[SOMESCRIPTTYPE] ; ScriptType
x=i,n ; where 18048 <= i <= 18071, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the global variable index.19000-19999 杂项/未分类
此类别目前为空。
触发结果
500 单人任务存档
- 立即保存当前游戏。
Note
要让此结果用于多人游戏,你必须使用支持多人存档后的 YRpp spawner 版本。
- 这些原有 CSF 条目将会被使用:
TXT_SAVING_GAME、TXT_GAME_WAS_SAVED和TXT_ERROR_SAVING_GAME。 - 存档描述将会类似
地图描述名称 - CSF文本。 - 例如:
盟军战役25: 僵僵の钱 - 钱全被偷光了!。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],500,4,[CSFKey],0,0,0,0,A,[ActionX]
...501 编辑变量
- 计算一个变量值。
- 变量值为 int32,这表示它的范围是从 -2^31 到 2^31-1。
- 任何超出此范围限制的数值都可能导致无法预测的结果!
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],501,0,[VariableIndex],[Operation],[Number],[IsGlobalVariable],0,A,[ActionX]
...| 操作 | 描述 |
|---|---|
| 0 | 当前值 = 数字 |
| 1 | 当前值 = 当前值 + 数字 |
| 2 | 当前值 = 当前值 - 数字 |
| 3 | 当前值 = 当前值 * 数字 |
| 4 | 当前值 = 当前值/数字 |
| 5 | 当前值 = 当前值 % 数字 |
| 6 | 当前值 = 当前值 左移 数字 位 |
| 7 | 当前值 = 当前值 右移 数字 位 |
| 8 | 当前值 = 当前值 按位取反 |
| 9 | 当前值 = 当前值 异或 数字 |
| 10 | 当前值 = 当前值 位或 数字 |
| 11 | 当前值 = 当前值 位与 数字 |
502 生成随机数
- 在 [Min, Max] 范围内生成一个随机整数并存入给定变量。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],502,0,[VariableIndex],[Min],[Max],[IsGlobalVariable],0,A,[ActionX]
...503 输出变量的值
- 输出变量值至消息列表。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],503,0,[VariableIndex],[IsGlobalVariable],0,0,0,A,[ActionX]
...504 变量间计算
- 将两个变量的值进行计算。
- 类似
501,但计算数值读取自另一变量。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],504,0,[VariableIndex],[Operation],[VariableForOperationIndex],[IsGlobalVariable],[IsOperationGlobalVariable],A,[ActionX]
...Operation 可以见上 501 号动作。
505 在坐标释放超级武器
- 谨慎使用
- 在指定位置发射
[SuperWeaponTypes]列表中的超级武器。 HouseIndex可取以下值:
| 所属方索引 | 描述 |
|---|---|
| >= 0 | 地图上当前所属方的索引 |
| 4475-4482 | 类似范围 0-7 的索引 |
| -1 | 选择一个非中立的随机所属方 |
| -2 | 选择第一个中立所属方 |
| -3 | 选择随机人类玩家 |
- 坐标的 X 和 Y 可以使用正数值或使用 -1 来表示在可视区域内随机。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],505,0,0,[SuperWeaponTypesIndex],[HouseIndex],[CoordinateX],[CoordinateY],A,[ActionX]
...506 在路径点释放超级武器
- 谨慎使用
- 在指定路径点发射
[SuperWeaponTypes]列表中的超级武器。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],506,0,0,[SuperWeaponTypesIndex],[HouseIndex],[WaypointIndex],0,A,[ActionX]
...510 切换基地重新部署设定
- 通过设置第三个参数强制基地车能否重部署。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],510,0,0,[MCVRedeploy],0,0,0,A,[ActionX]
...511 反部署建筑至路径点
- 反部署特定建筑类型为载具并移动至一个特定路径点。
- 若将此处建筑类型设为
<All>则反部署所有建筑。
- 若将此处建筑类型设为
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],511,-10,[BuildingTypesID],[HouseIndex],0,0,0,[WaypointIndex],[ActionX]
...606 编辑仇恨值
- 编辑触发所属方对指定所属方的仇恨值。
- -1为 所有国家。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],606,0,[HouseIndex],[Operation],[Number],0,0,A,[ActionX]
...| 操作 | 描述 |
|---|---|
| 0 | 当前值 = 数字 |
| 1 | 当前值 = 当前值 + 数字 |
| 2 | 当前值 = 当前值 - 数字 |
| 3 | 当前值 = 当前值 * 数字 |
| 4 | 当前值 = 当前值/数字 |
| 5 | 当前值 = 当前值 % 数字 |
| 6 | 当前值 = 当前值 左移 数字 位 |
| 7 | 当前值 = 当前值 右移 数字 位 |
| 8 | 当前值 = 当前值 按位取反 |
| 9 | 当前值 = 当前值 异或 数字 |
| 10 | 当前值 = 当前值 位或 数字 |
| 11 | 当前值 = 当前值 位与 数字 |
607 清除仇恨值
- 清空触发所属方对指定所属方的仇恨值。
- -1为 所有国家。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],607,0,[HouseIndex],0,0,0,0,A,[ActionX]
...608 强制宣战
- 强制和指定所属方成为敌人且不会因任何因素发生改变。
- -1 会解除强制宣战。
- -2 则强制没有敌人。
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],608,0,0,[HouseIndex],0,0,0,A,[ActionX]
...609 设置雷达模式
- 更改触发所属方的当前雷达模式
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],609,0,0,[RadarMode],0,0,0,A,[ActionX]
...- 可选参数有:
| 参数 | 描述 |
|---|---|
| 0 | 常规模式,需要提供雷达的建筑并且电力充足。 |
| 1 | 改为 FreeRadar 模式 |
| 2 | 强制开启雷达 |
| 3 | 强制关闭雷达 |
610 设置所属方的 TeamDelays 值
- 设置触发所属方的
TeamDelays值。- 若该值小于 0 则使用
[General] -> TeamDelays的值。
- 若该值小于 0 则使用
在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],610,0,0,[Number],0,0,0,A,[ActionX]
...800-802 显示横幅
- 在屏幕固定位置显示一个“横幅”。
- 结果
800将会创建一个新的横幅或替换掉拥有相同 Banner ID 的旧有横幅。显示文本横幅时将使用 局部 变量的值。 - 结果
801将会创建一个新的横幅或替换掉拥有相同 Banner ID 的旧有横幅。显示文本横幅时将使用 全局 变量的值。 - 结果
802将会删除与设定 Banner ID 相同的横幅。
- 结果
- 使用该功能前需在 ini 文件中配置
BannerType属性。横幅支持使用一个 PCX 文件,一个 SHP 文件,或一个 CSF 条目。若多项同时设置则同样按此处所列的优先级顺序生效。SHP.Palette控制绘制 SHP 横幅时所使用的色盘。CSF.Color控制使用 CSF 条目横幅时的文本颜色CSF.Background控制使用 CSF 条目横幅时是否具有黑色底色。CSF.VariableFormat控制使用 CSF 条目横幅时的变量显示方式。none- 不显示变量。variable- 仅显示变量,并忽略 CSF 条目文本。prefix/prefixed- 变量在其他文本 前 显示。suffix/suffixed- 变量在其他文本 后 显示。
Duration决定横幅的显示时长。负值代表会在被删除前一直显示。横幅自身不会在不显示时被删除。Delay决定横幅因一个正值Duration而结束显示后多久才会再次显示。负值代表不会再次显示。- 一个
SHP横幅会在再次显示时从上次结束时的帧开始。这可以通过SHP.RefreshAfterDelay=true更改为从头开始。
- 一个
在 rulesmd.ini:
[BannerTypes]
0=SOMEBANNER
[SOMEBANNER] ; BannerType
PCX= ; filename - including the .pcx extension
SHP= ; filename - including the .shp extension
SHP.Palette=palette.pal ; filename - including the .pal extension
SHP.RefreshAfterDelay=false ; boolean
CSF= ; CSF entry key
CSF.Color= ; integer - Red,Green,Blue, defaults to MessageTextColor of the owner Side
CSF.Background=false ; boolean
CSF.VariableFormat=none ; List of Variable Format Enumeration (none|variable|prefix/prefixed|surfix/surfixed)
Duration=-1 ; integer
Delay=-1 ; integer在 mycampaign.map:
[Actions]
...
ID=ActionCount,[Action1],800,4,[SOMEBANNER],[Unique ID],[Horizontal position],[Vertical position],[VariableIndex],A,[ActionX]
ID=ActionCount,[Action1],801,4,[SOMEBANNER],[Unique ID],[Horizontal position],[Vertical position],[VariableIndex],A,[ActionX]
ID=ActionCount,[Action1],802,0,[Unique ID],0,0,0,0,A,[ActionX]
...触发条件
500-511 变量比较
- 比较变量值与给定值。
在 mycampaign.map:
[Events]
...
ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[Param],[EventX]
...| 条件 ID | 描述 | 全局 |
|---|---|---|
| 500 | 当前值 > 数字 | No |
| 501 | 当前值 < 数字 | No |
| 502 | 当前值 = 数字 | No |
| 503 | 当前值 >= 数字 | No |
| 504 | 当前值 <= 数字 | No |
| 505 | 当前值 & 数字 != 0 | No |
| 506 | 当前值 > 数字 | Yes |
| 507 | 当前值 < 数字 | Yes |
| 508 | 当前值 = 数字 | Yes |
| 509 | 当前值 >= 数字 | Yes |
| 510 | 当前值 <= 数字 | Yes |
| 511 | 当前值 & 数字 != 0 | Yes |
512-523 变量与局部变量比较
- 比较变量值与给定局部变量值。
在 mycampaign.map:
[Events]
...
ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[LocalVariableIndex],[EventX]
...| 条件 ID | 描述 | 全局 |
|---|---|---|
| 512 | 当前值 > 局部变量值 | No |
| 513 | 当前值 < 局部变量值 | No |
| 514 | 当前值 = 局部变量值 | No |
| 515 | 当前值 >= 局部变量值 | No |
| 516 | 当前值 <= 局部变量值 | No |
| 517 | 当前值 & 局部变量值 != 0 | No |
| 518 | 当前值 > 局部变量值 | Yes |
| 519 | 当前值 < 局部变量值 | Yes |
| 520 | 当前值 = 局部变量值 | Yes |
| 521 | 当前值 >= 局部变量值 | Yes |
| 522 | 当前值 <= 局部变量值 | Yes |
| 523 | 当前值 & 局部变量值 != 0 | Yes |
524-535 变量与全局变量比较
- 比较变量值与给定全局变量值。
在 mycampaign.map:
[Events]
...
ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[GlobalVariableIndex],[EventX]
...| 条件 ID | 描述 | 全局 |
|---|---|---|
| 524 | 当前值 > 全局变量值 | No |
| 525 | 当前值 < 全局变量值 | No |
| 526 | 当前值 = 全局变量值 | No |
| 527 | 当前值 >= 全局变量值 | No |
| 528 | 当前值 <= 全局变量值 | No |
| 529 | 当前值 & 全局变量值 != 0 | No |
| 530 | 当前值 > 全局变量值 | Yes |
| 531 | 当前值 < 全局变量值 | Yes |
| 532 | 当前值 = 全局变量值 | Yes |
| 533 | 当前值 >= 全局变量值 | Yes |
| 534 | 当前值 <= 全局变量值 | Yes |
| 535 | 当前值 & 全局变量值 != 0 | Yes |
600 对象护盾被摧毁
在 mycampaign.map:
[Events]
...
ID=EventCount,...,600,2,0,0,...
...601-602 检查所属方是否有/无科技类型
601:当指定所属方至少拥有一个设定的科技类型时触发。602:当指定所属方没有任何一个设定的科技类型时触发。- 多人游戏所属方(索引 4475 至 4482)支持。
在 mycampaign.map:
[Events]
...
ID=EventCount,...,[EVENTID],2,[HouseIndex],[TechnoType],...
...Note
与 Ares 的 81 & 82 号条件不同,这里的所属方使用触发条件中的所属方参数而不是触发自身的所有者。
604-605 检查特定科技类型进入单元格
604:检查进入单元格的科技类型是否与条件中指定的 ID相同。605:检查进入单元格的科技类型是否出现在选定的AITargetTypes列表中。HouseIndex可以自定义为指定所属方。
在 mycampaign.map:
[Events]
...
ID=EventCount,...,604,2,[HouseIndex],[TechnoType],...
ID=EventCount,...,605,2,[HouseIndex],[AITargetTypes index#],...
...
| 所属方索引 | 描述 |
|---|---|
| >= 0 | 地图上当前所属方的索引 |
| -1 | 该值将被忽略(任何所属方均有效) |
| -2 | 选择地图触发的所有者 |
606 AttachEffect 已被附加到单位
- 检查一个
AttachEffectType是否已附加到某个单位上。不适用于触发器启动前就已附加的 Attach Effect。 - 具体而言,该条件将在下述情况被满足:
- 初始 AE:初始赋予时(在
AttachEffect.InitialDelays帧后)、重新创建时(在AttachEffect.Delays或AttachEffect.RecreationDelays帧后)。 - 外源 AE:赋予时、对同一单位赋予同一 AE 使其刷新时。
- 初始 AE:初始赋予时(在
在 mycampaign.map:
[Events]
...
ID=EventCount,...,606,2,0,[AttachEffectType],...
...