红警DIY论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16832|回复: 16

【AI篇】遭遇战加入新单位

[复制链接]
发表于 2010-12-27 20:03:48 | 显示全部楼层 |阅读模式
本帖最后由 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文件,里面写上代码:


  1. <AIPersonalityDefinition
  2. id="1AlliedBalanced"
  3. PersonalityType="1AlliedBalanced">
  4. <CountAsStructureForBuildPurposesFilter/>
  5. </AIPersonalityDefinition>

  6. <AIPersonalityDefinition
  7. id="2AlliedSquadronLeader"
  8. PersonalityType="2AlliedSquadronLeader">
  9. <CountAsStructureForBuildPurposesFilter/>
  10. </AIPersonalityDefinition>

  11. <AIPersonalityDefinition
  12. id="3AlliedSpecialForces"
  13. PersonalityType="3AlliedSpecialForces">
  14. <CountAsStructureForBuildPurposesFilter/>
  15. </AIPersonalityDefinition>


  16. <AIPersonalityDefinition
  17. id="1JapanBalanced"
  18. PersonalityType="1JapanBalanced">
  19. <CountAsStructureForBuildPurposesFilter/>
  20. </AIPersonalityDefinition>

  21. <AIPersonalityDefinition
  22. id="2JapanMechaWarfare"
  23. PersonalityType="2JapanMechaWarfare">
  24. <CountAsStructureForBuildPurposesFilter/>
  25. </AIPersonalityDefinition>

  26. <AIPersonalityDefinition
  27. id="3JapanFleetCommand"
  28. PersonalityType="3JapanFleetCommand">
  29. <CountAsStructureForBuildPurposesFilter/>
  30. </AIPersonalityDefinition>

  31. <AIPersonalityDefinition
  32. id="1SovietBalanced"
  33. PersonalityType="1SovietBalanced">
  34. <CountAsStructureForBuildPurposesFilter/>
  35. </AIPersonalityDefinition>

  36. <AIPersonalityDefinition
  37. id="2SovietShockSpecialist"
  38. PersonalityType="2SovietShockSpecialist">
  39. <CountAsStructureForBuildPurposesFilter/>
  40. </AIPersonalityDefinition>

  41. <AIPersonalityDefinition
  42. id="3SovietAirMarshall"
  43. PersonalityType="3SovietAirMarshall">
  44. <CountAsStructureForBuildPurposesFilter/>
  45. </AIPersonalityDefinition>
复制代码

上面的代码为定义每个指挥官的建造过滤器。这个代码一定要写。

评分

参与人数 1威严 +3 DIY币 +5 收起 理由
yangqs + 3 + 5 精品文章

查看全部评分

 楼主| 发表于 2010-12-27 20:16:20 | 显示全部楼层
本帖最后由 6522748 于 2010-12-31 14:28 编辑

代码预处理:看到这么多代码文件可能要晕了,不过实际上有些文件不用修改,只是为了让别人继承属性,有些文件修改很少,下面我介绍我的做法:


1.新建一个文件夹命名为AI,并把上述所有代码文件复制到这个文件夹里,全部在一个目录下哟`


2.BasePersonality.xml CoopBasePersonality.xml 2个文件不用修改,就放在那里,因为是让通用文件来继承它们的属性


3.全部9个指挥官特有AIID都需要修改,以免和系统冲突,放在那里等下去调用通用文件的部分属性,{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,什么阵营的(日本、盟军、苏联);什么类型的(比如陆军、两栖、空军);打算在哪里建造(比如装甲车工厂、兵营、飞机场),我这个时空坦克是盟军单位,陆军非两栖,打算在装甲车工厂建造,英文IDAlliedChronoVehicle

我先在简单难度的建造序列里添加它,简单难度是按照兵种在哪里建造分类的,那么时空坦克应该在装甲车工厂序列里添加建造,这个建造序列IDAlliedBaseStates.xml里的AlliedWarFactoryBuildState_RANDOM,这些序列均不能在原始基础上修改,必须新建序列,我们把这个AlliedWarFactoryBuildState_RANDOM整个建造序列复制出来并改名为AlliedWarFactoryBuildState_RANDOM_Elwin(这个名称随便改不和别的冲突就行),然后在某个地方插入时空坦克的代码,比如我在AlliedAntiVehicleVehicleTech1(多功能步兵车)和AlliedAntiVehicleVehicleTech1(守护者坦克)之间插入一句
<BuildEntryBuild="AlliedChronoVehicle" Heuristic="RANDOM_UNIT"PercentLow="50" PercentHigh="60"/>,整体代码为

  1. <AIBuildStateDefinition
  2.                 id="AlliedWarFactoryBuildState_RANDOM_Elwin">
  3.                 <Heuristic>  
  4.                           <ConstantHeuristic/>
  5.                 </Heuristic>
  6.                 <BuildEntry Build="AlliedAntiInfantryVehicle_Ground"
  7.                           Heuristic="RANDOM_UNIT" PercentLow="0"      PercentHigh="15"/>  
  8.                <BuildEntry Build="AlliedAntiVehicleVehicleTech1"
  9.                           Heuristic="RANDOM_UNIT" PercentLow="15" PercentHigh="25"/>
  10.               <BuildEntry Build="AlliedChronoVehicle"                     Heuristic="RANDOM_UNIT" PercentLow="25" PercentHigh="50"/>
  11.              <BuildEntry Build="AlliedAntiAirVehicleTech1"
  12.                          Heuristic="RANDOM_UNIT" PercentLow="50" PercentHigh="60"/>

  13.             <BuildEntry Build="AlliedAntiVehicleVehicleTech3"
  14.                          Heuristic="RANDOM_UNIT" PercentLow="60" PercentHigh="80"/>

  15.            <BuildEntry Build="AlliedAntiStructureVehicle"
  16.                          Heuristic="RANDOM_UNIT" PercentLow="80" PercentHigh="100"/>

  17.           <BuildEntry Build="AlliedMiner" Heuristic="HARVESTER"/>


  18. </AIBuildStateDefinition>
复制代码


要点:1.插入的单位的最低百分比要对应它之前单位的最高百分比;插入单位的最高百分比要对应它之后单位的最低百分比



中等以上难度就不是按照兵种在哪里建造来分了,它是按照兵种是什么属性来分,比如

时空坦克是陆地的属性,那么在AlliedBaseStates.xml里找到这个IDAlliedLandUnitBuildState

把整段这个ID的代码复制出来,另取名为AlliedLandUnitBuildState_Elwin,仿制幻影坦克写

一段话,最终代码为:


  1.     <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 这些语句是对某些兵种的不同的预期值,可以仿着修改。

 楼主| 发表于 2010-12-27 20:25:02 | 显示全部楼层
本帖最后由 6522748 于 2011-1-1 10:52 编辑

登记需要建造的新单位的ID,相关代码段为AlliedNeededUnits,这段代码里登记了很多单位,不能直接在上面修改,复制出来并修改ID,比如我修改为AlliedNeededUnits_Elwin

添加时空坦克的ID后最终代码为



  1.    <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.xml3个盟军指挥官的文件还有我们新建的AlliedBaseStates.xml文件。




  1.       <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:20 | 显示全部楼层
呵呵,收下了哈。以后就不用再瞎搞了。{:3_48:}
发表于 2010-12-28 08:51:01 | 显示全部楼层
各种AI教程都出来了,呵呵

这个似乎更易理解
 楼主| 发表于 2010-12-28 10:40:40 | 显示全部楼层
本帖最后由 6522748 于 2010-12-31 17:47 编辑

之前的没有经过测试 这次的没有问题了`
发表于 2011-1-1 22:24:49 | 显示全部楼层
感谢大师这篇好帖,真是简单实用,我如法炮制给高达MOD盟军方高达加上了对战AI,此贴在2011年到来之际真的很给力!
发表于 2011-1-23 02:01:27 | 显示全部楼层
楼主的AI是针对在原版上修改而写的,如果要加新的阵营要注意一点,像楼主在顶楼说的那句:你的MOD文件夹\ Data\AdditionalMaps目录下新建一个MapMetaData_Mod.xml文件,里面写上代码:、、、,这一段里把原版的所有指挥官都写在MapMetaData_Mod.xml里,这样做就需要把所有的原版的AI全部重新命名来用,如果是单独添加新阵营的话就什么都不用写上去,如果添加了,你 又不去改原版的AI的话,当打包进入游戏中时的AI全都是空白的了,进游戏时会崩溃强行退出的。如果有写新阵营AI的DIYER要注意啦,我就是在这点上耗了一天了,浪费时间啊。{:3_58:}
 楼主| 发表于 2011-1-23 11:10:15 | 显示全部楼层
主要是要联系在一起,指挥官的AI引用要和MapMetaData_Mod.xml中的一致,比如要引用盟军指挥官温伦的AI,那么文件为:AlliedBalanced.xml,其中的PersonalityType="1AlliedBalanced"要和MapMetaData_Mod.xml中的一致,要修改的话必须同时修改。
发表于 2011-1-23 15:22:43 | 显示全部楼层
本帖最后由 牧星 于 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对战是正常 的?

我的不正常,按你的去做的话,直接进不了游戏哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|手机版|管理员邮箱|红警DIY官方论坛

GMT+8, 2024-3-29 14:21 , Processed in 0.048607 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表