红警DIY论坛
标题: 【AI篇】遭遇战加入新单位 [打印本页]
作者: 6522748 时间: 2010-12-27 20:03
标题: 【AI篇】遭遇战加入新单位
本帖最后由 6522748 于 2010-12-31 14:32 编辑
之前的不完整 不能实现功能,下面更新了`
本教程所涉及的文件全部在代码的SkirmishAI文件夹里
现在先说说AI的实现过程,红警3遭遇战里AI行为为:指挥官AI从通用规则里选取兵种和难度组合,创造出自己的风格,比如日本指挥官直美喜欢造海军,那个指挥官贤治却喜欢造机器人。
经过测试得出,指挥官喜欢造什么,是由指挥官的特有AI文件来决定,但是指挥官能不能造某些东西,就是由通用规则来决定,我们现在希望某个单位能在游戏里出现,那么就是要重点解决能不能造的问题,剩下的比如指挥官喜欢造几个显得并不重要,下面的内容我将具体说怎么修改能造。
全部阵营都修改的话,涉及以下文件:
1. { AlliedBaseStates.xml SovietBaseStates.xml JapanBaseStates.xmlBasePersonality.xml CoopBasePersonality.xml AlliedCoopBasePersonality.xmlAlliedCoopBaseSkirmishPersonality.xml JapanCoopBasePersonality.xml JapanCoopBaseSkirmishPersonality.xmlSovietCoopBasePersonality.xml SovietCoopBaseSkirmishPersonality.xml
}这些文件为通用文件。
2.红警3遭遇战里每个阵营3个指挥官,那么一共9个指挥官,他们的特有AI文件为下面9个:AlliedBalanced.xml AlliedSpecialForces.xml AlliedSquadronLeader.xmlJapanBalanced.xml JapanFleetCommand.xml JapanMechaWarfare.xmlSovietAirMarshall.xml SovietBalanced.xml SovietShockSpecialist.xml 打开这些文件都可以看到一句PersonalityUIName 后面写的就是指挥官的姓名。
3.实际使用时是套用到每张地图,故我们还需要弄一些东西:
你的MOD文件夹\ Data\AdditionalMaps目录下新建一个MapMetaData_Mod.xml文件,里面写上代码:
- <AIPersonalityDefinition
- id="1AlliedBalanced"
- PersonalityType="1AlliedBalanced">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="2AlliedSquadronLeader"
- PersonalityType="2AlliedSquadronLeader">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="3AlliedSpecialForces"
- PersonalityType="3AlliedSpecialForces">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="1JapanBalanced"
- PersonalityType="1JapanBalanced">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="2JapanMechaWarfare"
- PersonalityType="2JapanMechaWarfare">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="3JapanFleetCommand"
- PersonalityType="3JapanFleetCommand">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
-
- <AIPersonalityDefinition
- id="1SovietBalanced"
- PersonalityType="1SovietBalanced">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="2SovietShockSpecialist"
- PersonalityType="2SovietShockSpecialist">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
- <AIPersonalityDefinition
- id="3SovietAirMarshall"
- PersonalityType="3SovietAirMarshall">
- <CountAsStructureForBuildPurposesFilter/>
- </AIPersonalityDefinition>
复制代码
上面的代码为定义每个指挥官的建造过滤器。这个代码一定要写。
作者: 6522748 时间: 2010-12-27 20:16
本帖最后由 6522748 于 2010-12-31 14:28 编辑
代码预处理:看到这么多代码文件可能要晕了,不过实际上有些文件不用修改,只是为了让别人继承属性,有些文件修改很少,下面我介绍我的做法:
1.新建一个文件夹命名为AI,并把上述所有代码文件复制到这个文件夹里,全部在一个目录下哟`
2.BasePersonality.xml CoopBasePersonality.xml 这2个文件不用修改,就放在那里,因为是让通用文件来继承它们的属性
3.全部9个指挥官特有AI的ID都需要修改,以免和系统冲突,放在那里等下去调用通用文件的部分属性,{ID修改实例:比如盟军温伦指挥官是这个文件AlliedBalanced.xml
打开这个文件把id="1AlliedBalanced"中的1AlliedBalanced改成别的名字,比如4AlliedBalanced,其余代码不能修改。}
所以现在我们只要重点处理通用文件的代码,修改到能够实现造新单位的功能
1.通用文件的大概内容
『AlliedBaseStates.xml SovietBaseStates.xml JapanBaseStates.xml』的内容:
a.登记AI需要建造的单位的名字,比如时空坦克;
b.各种建造方法:有2种分法,按照场地来分,比如船厂能造什么/兵营能造什么;按照部队属性来分,比如能够造哪些空军/能够造哪些两栖部队;它们对应的是简单和中等以上难度的建造方式
c.建造期望值:也有2种期望值,分别对应简单和中等以上难度,简单难度的期望值是固定的,每种兵种的百分比固定;中等以上难度采用代码判定,决定更喜欢出什么兵种
『AlliedCoopBasePersonality.xml
JapanCoopBasePersonality.xmlSovietCoopBasePersonality.xml』 管理兵种侵略性/防御性
『AlliedCoopBaseSkirmishPersonality.xmlJapanCoopBaseSkirmishPersonality.xml SovietCoopBaseSkirmishPersonality.xml 』管理难度组合
2.以盟军的超时空坦克为例,讲解如何加入新单位并让电脑造,盟军的修改文件为
AlliedBaseStates.xmlAlliedCoopBasePersonality.xml AlliedCoopBaseSkirmishPersonality.xml
--------------------------------------------------------------------------------------------------------------------------
AlliedBaseStates.xml的修改
首先要了解这个单位的属性:英文ID,什么阵营的(日本、盟军、苏联);什么类型的(比如陆军、两栖、空军);打算在哪里建造(比如装甲车工厂、兵营、飞机场),我这个时空坦克是盟军单位,陆军非两栖,打算在装甲车工厂建造,英文ID为AlliedChronoVehicle。
我先在简单难度的建造序列里添加它,简单难度是按照兵种在哪里建造分类的,那么时空坦克应该在装甲车工厂序列里添加建造,这个建造序列ID为AlliedBaseStates.xml里的AlliedWarFactoryBuildState_RANDOM,这些序列均不能在原始基础上修改,必须新建序列,我们把这个AlliedWarFactoryBuildState_RANDOM整个建造序列复制出来并改名为AlliedWarFactoryBuildState_RANDOM_Elwin(这个名称随便改不和别的冲突就行),然后在某个地方插入时空坦克的代码,比如我在AlliedAntiVehicleVehicleTech1(多功能步兵车)和AlliedAntiVehicleVehicleTech1(守护者坦克)之间插入一句
<BuildEntryBuild="AlliedChronoVehicle" Heuristic="RANDOM_UNIT"PercentLow="50" PercentHigh="60"/>,整体代码为
- <AIBuildStateDefinition
- id="AlliedWarFactoryBuildState_RANDOM_Elwin">
- <Heuristic>
- <ConstantHeuristic/>
- </Heuristic>
- <BuildEntry Build="AlliedAntiInfantryVehicle_Ground"
- Heuristic="RANDOM_UNIT" PercentLow="0" PercentHigh="15"/>
- <BuildEntry Build="AlliedAntiVehicleVehicleTech1"
- Heuristic="RANDOM_UNIT" PercentLow="15" PercentHigh="25"/>
- <BuildEntry Build="AlliedChronoVehicle" Heuristic="RANDOM_UNIT" PercentLow="25" PercentHigh="50"/>
- <BuildEntry Build="AlliedAntiAirVehicleTech1"
- Heuristic="RANDOM_UNIT" PercentLow="50" PercentHigh="60"/>
- <BuildEntry Build="AlliedAntiVehicleVehicleTech3"
- Heuristic="RANDOM_UNIT" PercentLow="60" PercentHigh="80"/>
- <BuildEntry Build="AlliedAntiStructureVehicle"
- Heuristic="RANDOM_UNIT" PercentLow="80" PercentHigh="100"/>
- <BuildEntry Build="AlliedMiner" Heuristic="HARVESTER"/>
-
- </AIBuildStateDefinition>
复制代码
要点:1.插入的单位的最低百分比要对应它之前单位的最高百分比;插入单位的最高百分比要对应它之后单位的最低百分比
中等以上难度就不是按照兵种在哪里建造来分了,它是按照兵种是什么属性来分,比如
时空坦克是陆地的属性,那么在AlliedBaseStates.xml里找到这个ID:AlliedLandUnitBuildState
把整段这个ID的代码复制出来,另取名为AlliedLandUnitBuildState_Elwin,仿制幻影坦克写
一段话,最终代码为:
- <AIBuildStateDefinition id="AlliedLandUnitBuildState_Elwin"> <Heuristic> <ObjectOfTypeExistsHeuristic PassIfExists="true" Location="Land"> <ObjectFilter Relationship="ENEMIES" Rule="ALL" > </ObjectFilter> </ObjectOfTypeExistsHeuristic> <PathToTargetHeuristic Surface="Land"PathExists="true"ObjectTypeToUseForTest="AlliedAntiInfantryInfantry"LocomotorConditionToUseForTest="NORMAL" /> </Heuristic> <BuildEntry Build="AlliedWarFactory"Heuristic="FACTORY"/> <BuildEntry Build="AlliedAntiInfantryInfantry" Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>AlliedScoutInfantry</IncludeThing> <IncludeThing>SovietScoutInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedAntiVehicleInfantry"Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>AlliedScoutInfantry</IncludeThing> <IncludeThing>SovietScoutInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedAntiVehicleVehicleTech1"Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>SovietHeavyAntiVehicleInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedChronoVehicle"Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>SovietHeavyAntiVehicleInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedAntiAirVehicleTech1"Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>SovietHeavyAntiVehicleInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedAntiVehicleVehicleTech3"Heuristic="BEST_UNIT_EXPECTED"> <BlockIfThingNearFactory Rule="ANY"Relationship="ENEMIES"> <IncludeThing>SovietHeavyAntiVehicleInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> <BuildEntry Build="AlliedAntiStructureVehicle"Heuristic="BEST_UNIT_WEIGHTED"> <BlockIfThingNearFactory Rule="ANY" Relationship="ENEMIES"> <IncludeThing>SovietHeavyAntiVehicleInfantry</IncludeThing> </BlockIfThingNearFactory> </BuildEntry> </AIBuildStateDefinition>
复制代码
要点: BEST_UNIT_WEIGHTEDBEST_UNIT_EXPECTED 这些语句是对某些兵种的不同的预期值,可以仿着修改。
作者: 6522748 时间: 2010-12-27 20:25
本帖最后由 6522748 于 2011-1-1 10:52 编辑
登记需要建造的新单位的ID,相关代码段为AlliedNeededUnits,这段代码里登记了很多单位,不能直接在上面修改,复制出来并修改ID,比如我修改为AlliedNeededUnits_Elwin
添加时空坦克的ID后最终代码为
- <AIBuildStateDefinition id="AlliedNeededUnits_Elwin"> <Heuristic> <ConstantHeuristic/> </Heuristic> <BuildEntry Build="AlliedEngineer"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedScoutInfantry"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiInfantryInfantry" Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiVehicleInfantry"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedInfiltrationInfantry"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedCommandoTech1"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedMiner"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiAirVehicleTech1"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiInfantryVehicle_Ground"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiVehicleVehicleTech1"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedChronoVehicle"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiVehicleVehicleTech3"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiStructureVehicle" Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedMCV"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedMiner_Naval"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiInfantryVehicle"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiNavalScout"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiNavyShipTech1"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiAirShip"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiStructureShip"Heuristic="NEEDED_UNIT"/> <BuildEntryBuild="AlliedMCV_Naval" Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedFighterAircraft"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedSupportAircraft"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedAntiGroundAircraft"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedBomberAircraft"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedPowerPlant"Heuristic="NEEDED_UNIT"/> <BuildEntry Build="AlliedRefinery"Heuristic="NEEDED_UNIT"/> </AIBuildStateDefinition>
复制代码
要点:记得修改ID
2.仿制别的兵种写一段代码登记
本部分代码修改小技巧:这个AlliedBaseStates.xm里很多内容是用不到的,是不能在原来的基础上修改的,必须复制出来改ID,相当于新建,这个文件中代码较多,但是我们实际复制出来的很少,故可以新建一个XML空文件并把需要的代码复制到这个空文件,修改好后就使用这个文件,把原来的AlliedBaseStates.xm删了。
-------------------------------------------------------------------------------------------------------------------------------
AlliedCoopBasePersonality.xml的修改
首先修改之前的登记ID号码,找到这段
<BuildStateid="AlliedNeededUnits" State="AlliedNeededUnits"
Difficulty="EASY MEDIUM HARDBRUTAL"/>
这段话引用的是旧的登记ID,我们刚才新建了新的登记ID,名称为AlliedNeededUnits_Elwin,修改这句话(在原来的基础上改,不要新建)变为:
<BuildStateid="AlliedNeededUnits_Elwin"State="AlliedNeededUnits_Elwin"
Difficulty="EASY MEDIUM HARDBRUTAL"/>
之后为时空坦克添加侵略性和防御性数值:仿制别的写一句
<UnitModifierUnit="AlliedChronoVehicle" OffensiveModifier="6.0"DefensiveModifier="2.0"/>
要点:1.船不用写侵略性和防御性的数值
---------------------------------------------------------------------------------------------------------------------------------
AlliedCoopBaseSkirmishPersonality.xml的修改
找到这句AlliedWarFactoryBuildState_RANDOM,可以看到这句话是简单的敌人使用的代码,我们修改为(不用复制新建)
<BuildState id="AlliedWarFactoryBuildState_RANDOM_Elwin"State="AlliedWarFactoryBuildState_RANDOM_Elwin"Difficulty="EASY"/>
再找到这句AlliedLandUnitBuildState,可以看到这句话是中等以上敌人使用的代码,修改为
<BuildStateid="AlliedLandUnitBuildState_Elwin"State="AlliedLandUnitBuildState_Elwin" Difficulty="MEDIUM HARDBRUTAL"/>
---------------------------------------------------------------------------------------------------------------------------------
这样子就完成了,等下编译的时候我们只需加载AlliedBalanced.xmlAlliedSpecialForces.xml AlliedSquadronLeader.xml这3个盟军指挥官的文件还有我们新建的AlliedBaseStates.xml文件。
- <Include type="all" source="AlliedBaseStates.xml"/> <Include type="all" source="AlliedBalanced.xml"/> <Include type="all"source="AlliedSpecialForces.xml" /> <Include type="all"source="AlliedSquadronLeader.xml" />
复制代码
别的阵营要添加新单位就请仿造上面的过程,需要注意的是在中等以上难度时,兵种要写对地方,比如平定者要写在两栖的代码里而不是陆军。
作者: 牧星 时间: 2010-12-28 08:08
呵呵,收下了哈。以后就不用再瞎搞了。
作者: yangqs 时间: 2010-12-28 08:51
各种AI教程都出来了,呵呵
这个似乎更易理解
作者: 6522748 时间: 2010-12-28 10:40
本帖最后由 6522748 于 2010-12-31 17:47 编辑
之前的没有经过测试 这次的没有问题了`
作者: a59039335 时间: 2011-1-1 22:24
感谢大师这篇好帖,真是简单实用,我如法炮制给高达MOD盟军方高达加上了对战AI,此贴在2011年到来之际真的很给力!
作者: 牧星 时间: 2011-1-23 02:01
楼主的AI是针对在原版上修改而写的,如果要加新的阵营要注意一点,像楼主在顶楼说的那句:你的MOD文件夹\ Data\AdditionalMaps目录下新建一个MapMetaData_Mod.xml文件,里面写上代码:、、、,这一段里把原版的所有指挥官都写在MapMetaData_Mod.xml里,这样做就需要把所有的原版的AI全部重新命名来用,如果是单独添加新阵营的话就什么都不用写上去,如果添加了,你 又不去改原版的AI的话,当打包进入游戏中时的AI全都是空白的了,进游戏时会崩溃强行退出的。如果有写新阵营AI的DIYER要注意啦,我就是在这点上耗了一天了,浪费时间啊。
作者: 6522748 时间: 2011-1-23 11:10
主要是要联系在一起,指挥官的AI引用要和MapMetaData_Mod.xml中的一致,比如要引用盟军指挥官温伦的AI,那么文件为:AlliedBalanced.xml,其中的PersonalityType="1AlliedBalanced"要和MapMetaData_Mod.xml中的一致,要修改的话必须同时修改。
作者: 牧星 时间: 2011-1-23 15:22
本帖最后由 牧星 于 2011-1-23 15:30 编辑
不能引用,一用什么都是空白的,就等于没有AI了,只能把ID名字重新命名,如:
<AIPersonalityDefinition
id="1ChinaBalanced"-------原来为1AlliedBalanced的,重新命名这个。
PersonalityType="1AlliedBalanced"
inheritFrom="AlliedCoopBaseSkirmishPersonality"
在MapMetaData_Mod.xml中就什么指挥官都不要打上,那进游戏就正常了,如果你在MapMetaData_Mod.xml全都打上原版的指挥官,就等于禁用了,那进游戏时因没有AI,你选电脑对战时就崩溃退出了。
还有原版中的所有AI模块也是一样,都要重新改个ID名才能用,一用原版的都出错的。我的经历告诉我的。yangs那篇AI教程也是这样子说的。
从欣来过兄弟,你的AI对战是正常 的?
我的不正常,按你的去做的话,直接进不了游戏哦。
作者: yangqs 时间: 2011-1-24 12:59
如果有写新阵营AI的DIYER要注意啦,我就是在这点上耗了一天了,浪费时间啊。
牧星 发表于 2011-1-23 02:01 
话说新阵营AI不会受到原来游戏的干扰,几乎全部推倒重新建立,直接写。
作者: 6522748 时间: 2011-1-26 18:08
本帖最后由 6522748 于 2011-1-26 18:17 编辑
回复牧星:我的MOD是不搞新阵营的,上面的AI分析方法我一直用了几个月了,玩游戏时电脑能造新东西也不跳出,没有问题额`只不过这次要单独写出教程,所以我没有想到它的局限性,也许他不适用于新阵营系列的MOD吧。我还不懂搞新阵营,但是从我分析的流程来看,首先就是要写清楚新阵营指挥官的代码,当然这里也就容易出错了。
作者: 牧星 时间: 2011-1-26 18:20
唔,明白。还是要看各人的用法了。呵呵。不过知道过程结果也就明了。
作者: 32111 时间: 2013-2-6 14:31
非常感谢教程的提供,大致弄清楚是咋么一回事了。
作者: LQC83343479 时间: 2013-2-9 13:49
围观高手啊
作者: 2582 时间: 2016-5-30 19:56
惊现牧大
作者: fakacdq 时间: 2016-7-7 14:16
测试下是否可以回复帖子
| 欢迎光临 红警DIY论坛 (https://bbs.ra2diy.com/) |
Powered by Discuz! X3.5 |