AI计划文档

0 点赞
Battlezone: Combat Commander
转载

《战斗区域:战斗指挥官》2.0.185版本.AIP文件设置详细说明 AIP概述 什么是AIP文件? AI计划(AIP)文件决定了队伍的建造、攻击行为以及战略AI规划器的整体策略。这是使得IA/MPI模式下的CPU队伍能够运作的关键。AIP文件包含多个部分,本指南将对其进行介绍,并列出默认值(如有)。 AIP文件格式 AIP文件的格式与ODF文件相同。文件中包含带括号的特定标题名称,每个标题类型下有特定参数。有关标题的更多信息,请参阅ODF文档指南。 以下是各个有效标题的列表: [Start] [IdleDispatcher] [Match] [Cheat] [Plan1]...[Plan1024] 开始 描述: 每次加载此AIP计划时,都会运行“开始”部分。 AIP参数: [开始] CheckProvides = true 如果此值为false,则在检查条件时,不会使用对象中的任何provideName#条目。 DLLCanSwitch = true 如果此值为false,那么一旦为该队伍加载了此计划,任务脚本就无法更改它。但仍可通过SwitchAIP planType进行更改。 scavClass = "" 当使用CollectField/CollectPool计划时,此AIP查找的默认拾荒者/拾荒者H类ODF。 consClass = "" 当使用BaseBuild/BaseBuildMinimus计划时,此AIP查找的默认建造者ODF。 groupPriority1...groupPriority# = 0 groupType1...groupType# = "loop" 有效值包括: loop // 循环执行组内所有计划,直到满足条件。HisMaxCurPower = -9999 执行此计划所需的敌方队伍最大当前能量值。 计划条件 条件是计划条件检查中进行比较的一组条件。每个【计划#】最多可设置16个条件。 如果只有一个计划条件,它会查找编号或非编号版本。 AIP参数: 【计划#】 planCondition1 ... planCondition16 = "" 条件类型。用于在适用时与planConditionCount(数量)进行比较。有效值如下: 存在 比较同一队伍中是否存在planConditionClass的数量。 友方存在 比较友方队伍中是否存在planConditionClass的数量。 我方资源 比较当前队伍的碎片是否大于等于该数量。我的单位:比较同队中planConditionClass的单位数量是否大于等于指定数量。 友方单位:比较友方队伍中planConditionClass的单位数量是否大于等于指定数量。 不存在:比较同队中planConditionClass的数量是否不存在。 友方不存在:比较友方队伍中planConditionClass的数量是否不存在。 非我方资源:比较本队当前的碎片是否不大于等于指定数量。 非我的单位:比较同队中planConditionClass的单位数量是否不大于等于指定数量。 非友方单位:比较友方队伍中planConditionClass的单位数量是否不大于等于指定数量。 敌方存在:比较敌方队伍中是否存在planConditionClass的指定数量。 敌方资源:比较敌方队伍当前的碎片是否大于等于指定数量。友方单位 比较敌方队伍中planConditionClass的单位数量是否大于等于指定数量。 非敌方存在 比较敌方队伍中不存在指定数量的planConditionClass。 非敌方资源 比较敌方队伍当前的废料是否不大于等于指定数量。 非敌方单位 比较敌方队伍中planConditionClass的单位数量是否不大于等于指定数量。 路径建筑存在 比较此路径点上是否有建筑。 非路径建筑存在 比较此路径点上是否没有建筑。 路径存在 比较路径是否存在。 非路径存在 比较路径是否不存在。 Lua 仅在非编号的planCondition版本上指定。如果已指定,这是在AIP中运行的唯一条件,它会改为运行对应Lua文件计划中的条件语句并使用其返回值。 Lua文件名必须与AIP文件名完全匹配。例如,“foo123.aip”将仅读取“foo123.lua”。 当AIP加载时,它会运行相应的Lua函数“InitAIPLua”。 注意:AIP Lua函数与Lua任务脚本函数完全分离。 如果指定了此条件,它会读取: LuaFunction = "" 这是用于条件检查的Lua函数名称。它应返回一个true/false值。例如:LuaFunction = "Plan1Condition"将调用lua中的函数“function Plan1Condition(team, time)” planConditionClass1...planConditionClass16 = "" 计划的游戏对象类别用于比较。可以是ODF名称,或者如果planConditionClassProvided#为true,则可以是provideName#条目。 planConditionCount1...planConditionCount16 = 1 用于比较的数量。 planConditionPath1...planConditionPath16 = "" 建造位置的路径点名称(如适用)。 planCompare1...planCompare16 = "==" 计划比较类型。有效值包括: == // 等于 != // 不等于 < // 小于 <= // 小于等于 > // 大于 >= // 大于等于 planConditionClassProvided1...planConditionClassProvided16 = false 如果为true,则读取该计划条件的provideName#条目。 planConditionOr1...planConditionOr16 = false 若此值为真,则后续条件将被视为“或”关系。 注意:条件将按数字顺序逐个检查,且针对各个独立计划。因此,首个满足条件的“或”判断会跳过其余检查。此外,若“或”判断前的“与”判断失败,整体判断将失败并跳过后续所有检查。 计划Lua条件 Lua条件 在AIP的Lua文件中,存在以下回调函数。AIP Lua函数支持两个返回值:第一个是布尔值(true或false),用于表示条件是否满足;第二个是可选字符串,用于输出到AIP日志。 function InitAIPLua(team) 此函数在AIP首次加载且对应Lua文件首次运行时被调用。其中,team参数为该AIP运行所在的队伍编号。函数 Plan1Condition(team, time) end 这是一个Lua函数示例,函数名称可以自定义,但它接受两个参数。Team表示此AIP运行的队伍编号,Time表示任务启动后的秒数。 AIPUtil.print(team, str) 用于在AIP日志中打印字符串。 AIPUtil.GetScrap(team, bCheckAllied) AIPUtil.GetMaxScrap(team, bCheckAllied) AIPUtil.GetPower(team, bCheckAllied) AIPUtil.GetMaxPower(team, bCheckAllied) 这些函数返回指定队伍当前或最大的废料/电力值。如果bCheckAllied为true,还会计算同盟队伍的数值。 AIPUtil.CountUnits(team, classStr, teamMatchStr, useProvides) AIPUtil.CountCraft(team, classStr, teamMatchStr) 这些函数返回指定游戏对象类别的数量。CountUnits()函数需要类字符串,而CountCraft()函数可以使用空字符串来统计所有单位。 若UseProvides为true,该函数还会检查provideName#条目。 teamMatchStr用作团队筛选条件,且必须为以下值之一: "sameteam" "friendly" "enemy" AIPUtil.PathExists(pathnameStr) 若路径点存在,则返回true。 AIPUtil.PathBuildingExists(pathnameStr) 若路径不存在,则返回nil;若该位置存在建筑,则返回true。Lua中的计划条件示例: function Plan1Condition(team, time) if(time > 60) then return true, "已超过1分钟" else return false, "未超过1分钟" end end 另一个示例: function Plan1Condition(team, time) -- 将我方废料存入局部变量。 local myScrap = AIPUtil.GetScrap(team, true) if(myScrap > 60) then AIPUtil.print(team, "队伍" .. team .. "的废料 = " .. myScrap) end local gspir1Exists = AIPUtil.PathExists("gspir1") local cpuHasFactory = AIPUtil.CountUnits(team, "VIRTUAL_CLASS_FACTORY", 'sameteam', true) local humanHasBomber = AIPUtil.CountCraft(1, "ivbomb", 'sameteam') if(((cpuHasFactory >= 1) and (humanHasBomber >= 1)) or (myScrap > 90) or (not gspir1Exists)) then return true, "Plan1Condition true" else return false, "Plan1Condition false. hasFact=" .. tostring(cpuHasFactory) .. " hasBomber= " .. tostring(humanHasBomber) end end 攻击者 planType = "Attacker" 描述: 命令单位攻击目标。 AI参数: [计划编号] buildIfNoIdle = false 若为真,当没有足够闲置等待单位时将建造单位。 若为真且没有有效目标类型,将随机选择一个敌方目标进行攻击。 CheckProvides = [Start]::CheckProvides 若为真,将使用provideName#条目来寻找目标类型。select // 已弃用,无任何作用。 normal // 一次执行一个计划。 scrapCount = 保持当前数值不变。 若设置了此数值,当首次加载此AIP时,会将该队伍的废料数量设为此值。 idleAllCraft = true 若设为true,当首次加载此AIP时,会停止所有当前单位的指令,若它们正执行来自前一个AIP/Lua/DLL的指令,会被中断。若ODF中指定[CraftClass]::CanAIPForceIdle = false,则该单位会被跳过。 baseLoc = "" 若指定此参数,当CPU回收载具不在玩家控制的队伍时,它会在此路径点部署。其方向会根据该路径点相对于地图中心(0, 0, 0)的位置自动确定。attackMode = -1 若设置此参数,且攻击者为可部署单位,则会设定该单位的攻击模式。-1 = 自动,0 = 未部署,1 = 已部署。 ForceStagePoint = -1 若此值 >= 0,则设定使用特定阶段点。若为 -1,则随机选择一个阶段点。 注意:阶段路径点仅限于“stage1”……“stage32” pickTargetType = 1 选择目标的方式。有效值如下: 0 = 最优先(最早出现) 1 = 最近 2 = 随机 searchRadius = 400.0f 围绕其基地或阶段路径点搜索目标的半径。最大值为400.0f maxAttacks = 3 此攻击计划可执行的最大次数。0 = 无限次。 targetType = "" 要攻击的目标对象。也可以是下方列出的带编号版本。若同时列出targetType和targetType1,则两者均会被使用。 targetType1……targetType# = "" 用于此次攻击的目标类型。 attackType1 ... attackType# 用于攻击目标的对象。 useScrapCost1 ... useScrapCost# = true 对于相应的attackType#,告知计划将该单位的废料成本纳入考虑。如果最小总废料低于设置为true的attackType#列表中最高的废料成本,则用该单位的废料成本覆盖最小总废料。 BaseBuildLoop planType = "BaseBuildLoop" 描述: 使用建造机器人循环建造基地建筑。 建造循环会进行X次尝试来建造buildItem(s)。 AI参数: [Plan#] buildIfNoIdle = false 如果周围没有建造单位,则建造建造单位。 consClass = [Start]::consClass 要使用的建造单位ODF。 buildType1 ... buildType# 要建造的物品列表。 buildCount1 ...buildCount# 每个建造项目的建造数量。 maxLoops = 2147483647 尝试循环的最大次数。 loopDelay = 0 循环尝试之间的时间(以秒为单位)。 buildHeading = -1 此计划建造的建筑的朝向。有效值为: -2 = 使用【Start】::baseDir。 -1 = 默认值。(0) 0 = 北 1 = 东 2 = 南 3 = 西 BaseBuildMinimums planType = "BaseBuildMinimums" 描述: 用建造者建造一座建筑。 检查每个项目的buildCount#是否存在,如果存在的数量小于buildCount,则建造更多。 AIP参数: 【Plan#】 buildIfNoIdle = false 如果周围没有建造者,则建造建造者。 consClass = 【Start】::consClass 要使用的建造者ODF。 buildType1 ... buildType# 要建造的项目列表。 buildCount1 ...buildCount# 每个建造项目的建造数量。 buildLoc1 ... buildLoc# 每个建筑的路径点位置。 pathpointsCanBeMissing = false 若为true,则buildLoc路径点可以缺失。 buildHeading = -1 此计划所建造建筑的朝向。有效值如下: -2 = 使用【Start】::baseDir。 -1 = 默认值。(0) 0 = 北方 1 = 东方 2 = 南方 3 = 西方 BuildLoop planType = "BuildLoop" 描述: 从工厂建造对象(若工厂存在),否则从回收厂建造。 BuildLoop会尝试X次建造建造项目。 AIP参数: 【Plan#】 buildType1 ... buildType# 建造项目列表。 buildCount1 ... buildCount# 每个建造项目的建造数量。 maxLoops = 2147483647 尝试的最大循环次数。loopDelay = 0 循环尝试间隔时间(以秒为单位)。 BuildMinimums planType = "BuildMinimums" 描述: 从工厂建造对象(若工厂存在),否则从回收厂建造。 检查每个项目的buildCount#是否存在,若现有数量小于buildCount,则建造更多。 AIP参数: [Plan#] buildType1 ... buildType# 要建造的项目列表。 buildCount1 ... buildCount# 每个建造项目的数量。 ClearArea / DefendArea / Defender planType = "ClearArea" 或 planType = "DefendArea" 或 planType = "Defender" 描述: 派遣单位清理/防御一片区域。攻击附近的敌人,使用匹配部分中的条目来选择攻击者/目标组合。AIP参数: [计划#] buildIfNoIdle = false 若为true,则在单位缺失时建造单位。 searchRadius = 400.0f 目标搜索半径。最大值为400.0f。 MaxUnits = 0 派遣单位的最大数量。 targetType = "" 需要清理或防御的目标区域。 注:若未指定此项,则使用ibscav。 注:若此项为ibrecy或fbrecy,在多人游戏中会自动在名称后添加_m并尝试查找该目标。 pickTargetType = 1 选择目标的方式。有效值如下: 0 = 最旧目标 1 = 最近目标 2 = 随机目标 CheckProvides = [Start]::CheckProvides 若为true,在寻找目标时将使用provideName#条目。 ResendAttackersTimeout = 60.0f 重新下达攻击命令前的时间(秒)。设为0将禁用重新发送攻击命令。CheckEngageRange = true 若为true,则遵循单位的攻击范围值;若为false,则会命令单位攻击目标,即使目标在其攻击范围之外。 CollectField / CollectPool planType = "CollectField" 或 planType = "CollectPool" 描述: 派遣拾荒者去收集散落的废料/资源池。 AI属性: [计划#] scavClass = [开始]::scavClass 若已指定,则这是用于此计划的拾荒者ODF。 buildIfNoIdle = false 若为true,当没有闲置拾荒者时会建造一个。 maxTimes = 0 尝试派遣单位到该集结点的最大次数。 注意:若未指定此项,也会尝试读取maxTries参数。 CheckProvides = [开始]::CheckProvides 若为true,则读取拾荒者对象的provideName#条目。 defendType1 ...defendType# = "" 要派遣去防御此拾荒者的单位类型。 defendCount1 ... defendCount# = 1 每种defendType要派遣的数量。 部署者 planType = "Deployer" 描述: 命令一个物体进行部署。用于让可部署物体在某个位置部署。通常用于部署建筑及其衍生单位,但应该对任何可部署的物体都有效。 AI参数: [计划#] buildLoc = "" 要部署的路径点。 DeployClass = "" 要派去那里部署的物体。 单位分配 planType = "DistributeUnits" 描述: 此计划会派遣单位去防御资源点。包括回收厂、萃取器、2-9号基地插槽,以及所有按重要性排序的关键基地建筑。AIP参数: [计划#] buildIfNoIdle = false 若为true,当缺少单位时将建造单位。 探索者 计划类型 = "探索者" 描述: 派遣一个单位去探索地图。随机选择四个角落之一或地图中心,并在该位置半张地图范围内寻找一个随机目标点前往。 AIP参数: [计划#] unitType = "" 用于探索的单位类型。 CheckProvides 检查该单位类型是否具备特定功能。 驻守 计划类型 = "驻守" 描述: 派遣一个单位前往路径点并意图驻守在那里。 AIP参数: [计划#] maxTimes = 0 尝试向该驻守点派遣单位的最大次数。 注:若未指定此参数,系统也会尝试读取maxTries参数。CheckProvides = [开始]::CheckProvides 若此为真,它也会读取holdType的provideName#条目。 buildIfNoIdle = false 若单位不存在,则建造该单位。 holdPoint = "" 停留的路径点。 holdType1 ... holdType# = "" 要发送到此停留点的单位。 holdCount1 ... holdCount# = 1 要发送到该点的holdType单位数量。 维修/回收 planType = "Service" 或 planType = "Recover" 描述: 将单位送往维修站,或派遣维修车修理某物。 AI参数: [计划#] buildIfNoIdle = false 若为真,当维修单位不存在时建造serviceUnit。 serviceUnit = "" 要使用的维修单位的ODF。 CheckProvides = [开始]CheckProvides 若此计划为serviceUnit使用provideName#条目。 MinWreckAmmo = 0若未指定,将部署在最近的有效地形区域。 baseDir = -1 若指定此参数,可设置基地建造计划和迷你基地建造计划的建筑方向。 若“buildHeading”设为-2,则使用此方向作为建筑朝向。 [作弊] moneyAmount = 0 每隔moneyDelay时间给予的废料数量。 moneyDelay = 1 向队伍给予moneyAmount数量废料的时间间隔(以秒为单位)。 闲置调度器 描述: 闲置调度器用于派遣长时间闲置且在特定时间内未收到AIP或Lua/DLL脚本指令的单位。通过闲置调度器被派往攻击的单位会选择随机目标。它们会接到直接攻击指令,因此不会使用阶段#路径点集结后再攻击。考虑维修单位的最低弹药比例。 MinWreckHealth = 0.25f 考虑维修单位的最低生命值比例。 MaxWreckAmmo = 0.8f 停止维修单位前的最高弹药比例。 MaxWreckHealth = 0.8f 停止维修单位前的最高生命值比例。 RepairTime = 20.0f 维修单位后继续移动前的耗时。 MaxWreckDist = 30.0f 进行维修所需接近的距离。 unitType1 ... unitType99 = "" 待维修单位/维修单位的维修目标。 注意:如果是ibrecy或fbrecy,在多人游戏中会自动在名称后添加_m并尝试查找。 SwitchAIP planType = "SwitchAIP" 描述: 在指定时间后切换到不同的AIP(人工智能计划),前提是满足条件。AIP参数: [计划编号] NextAIP = "" 要切换到的下一个AIP文件。 注意:必须包含文件类型扩展名,例如"foo.aip" MissionTime = -1.0f 如果此值>=0,则必须达到该最小任务游玩时间才能切换到此计划。 升级 planType = "Upgrade" 描述: 命令建造机器人升级某个物体。 AIP属性: [计划编号] consClass = [Start]::ConsClass 要使用的建造机器人类型。 unitType = "" 要升级的物体。如果[Start]::CheckProvides为true,则使用provideName#。AIP参数: [闲置调度器] 拾荒者闲置秒数 = 25.0f 拾荒者被派遣去拾荒前的秒数。 单位闲置秒数 = 120.0f 进攻单位被派遣去攻击前的秒数。 轰炸机闲置秒数 = 120.0f 轰炸机被派遣去轰炸前的秒数。 最小攻击兵力 = 3 一次派出的进攻单位最小数量。 最大攻击兵力 = 99 一次派出的进攻单位最大数量。 最小任务秒数 = 360.0f 这是闲置调度器启用前必须经过的最小任务时间。 最大目标数 = 4 派遣进攻单位攻击时,将从中选择的最大目标数量。目标按距离排序,它将从最近的目标中随机选择一个,数量不超过最大目标数。MaxBomberTargets = 8 轰炸机执行攻击任务时可选择的最大目标数量。目标将按距离排序,并从最近的目标中随机选择一个。 sendAllUnitsOnStartup = false 若设为true,当此AI计划首次运行时,会立即派遣所有单位执行IdleDispatch(闲置调度)以随机攻击目标。 CraftTeamIsPilotTeam = false 若设为true,本队伍的单位在被狙击或被敌方人员驾驶后,不会保留该载具原所属队伍的感知阵营。本队伍的AI会在敌方人员进入其载具时立即将其识别为敌人。 匹配 描述: AIP中的匹配部分用于ClearArea(清理区域)/DefendArea(防御区域)/Defender(防御者)计划选择要匹配的目标。 AIP参数: [匹配] targetType1 ...targetType99 = "" 每个有效的目标类型。 每个目标类型可设置8个匹配项来指派单位对其发起攻击,其中#代表对应的目标类型编号。 attackType#_1 ... attackType#_8 = "" 指派用于攻击对应目标类型#的有效单位。若[Start] CheckProvides为true,则这些匹配项将使用提供的单位。 计划 描述: 每个Plan#标题部分包含以下设置。计划标题必须按数字顺序排列。单个AIP文件中最多可包含1024个计划。 AIP参数: [Plan#] planType = "" 此Plan#所使用的行为类型。此字符串必须为以下值之一: 攻击者 建造循环 建造最低要求 基地建造循环 基地建造最低要求 资源采集区 资源池采集 清理区域 防御区域 单位分配 防御者 部署者 探索者 坚守 恢复 维修 切换AI程序 升级每个计划类型在其章节中均有描述。 计划优先级 = 0 这是控制AI程序运行此计划顺序的优先级。优先级较高的计划会在优先级较低的计划之前运行。 即使失败也继续 = false 如果此项为真,当该计划的条件失败时,AI程序将继续执行下一个计划。如果为假,它将循环重试直到成功。 资源条件:如果这些值大于0,则会进行检查。如果为0,则忽略这些条件。MinTtlScrap = 0 执行此计划所需的本队最低总废料持有量。 注:攻击计划需要至少拥有攻击类型条目中列出的最昂贵单位。 MaxTtlScrap = 0 执行此计划所需的本队最高总废料持有量。 MinCurScrap = 0 执行此计划所需的本队最低当前废料量。 MaxCurScrap = 0 执行此计划所需的本队最高当前废料量。 HisMinTtlScrap = 0 执行此计划所需的敌方队伍最低总废料持有量。 HisMaxTtlScrap = 0 执行此计划所需的敌方队伍最高总废料持有量。 HisMinCurScrap = 0 执行此计划所需的敌方队伍最低当前废料量。 HisMaxCurScrap = 0 执行此计划所需的敌方队伍最高当前废料量能量条件:若数值不等于-9999,则会进行检查;若为-9999,则忽略该条件。 MinTtlPower = -9999 执行此计划时本队所需的最小总能量。 MaxTtlPower = -9999 执行此计划时本队所需的最大总能量。 MinCurPower = -9999 执行此计划时本队所需的最小当前能量。 MaxCurPower = -9999 执行此计划时本队所需的最大当前能量。 HisMinTtlPower = -9999 执行此计划时敌方队伍所需的最小总能量。 HisMaxTtlPower = -9999 执行此计划时敌方队伍所需的最大总能量。 HisMinCurPower = -9999 执行此计划时敌方队伍所需的最小当前能量。