AI文件说明

0000 10月前 1759

开个贴随便写点东西。

欢迎一起讨论。

1

[未完成]

这块可以跳过和主题无关。从2开始。

如果有萌新的话。。。先熟悉一下代码的样子好了。

1.1
	<a a1="" a2=""/>
1.2
	<a
		a1=""
		a2=""
		a3="">
		
		<aa aa1="" aa2=""/>
		
		<ab>
		</ab>
	</a>
	
例子
	<AIMicroManagerData id="HarvesterMicroManager000A"/>
	
	<AIMicroManagerData
		id="HarvesterMicroManager000A"
		UpdateTime="0.5s"
		MaxTeamIdleTime="10s"
		EnemySearchDistanceVisionMultiplier="0.5"
		EngageHostileTargets="true"
		EngagePassiveTargets="true"
		EngageTacticalTarget="false"
		RetreatPowerAdvantage="0"
		RetreatMinDistanceFromBase="1000"
		RetreatMinDistanceToFallback="0.0"
		IsHarvesterManager="true"
		MaxUnitIdleDistanceChange="20.0"
		Crush="false">
		<IgnoreTargets>
		</IgnoreTargets>
	</AIMicroManagerData>
	<!--Crush="false"不碾压附近小兵。且即使="true"也不会碾压工兵。EnemySearchDistanceVisionMultiplier="0.5" 可以调范围-->
	
1.3
注意原版的AIIncludes.xml里的注释说不要在那里include game object

1.4
有些东西要按顺序摆放,比如后面会提到的AIStrategicStateDefinition里面的Tactic里的TeamTemplate里的CreateUnits和ObjectFilter



2

这里不考虑加新阵营的情况。

AI是分开放在许多文件里的,文件内容主要有

AIPersonalityDefinition

AIBudgetStateDefinition

SkirmishOpeningMove

AIBuildStateDefinition

AIStrategicStateDefinition

AITargetingHeuristic

AIMicroManagerData

如果有其他东西以后再加。

更新。

单位文件的SkirmishAIInformation会影响AI出兵。建筑摆位也在这个SkirmishAIInformation里调。像冷冻,妈妈船,间谍这样武器比较特别的单位的这个模块也会有特别的参数。

2.1

AI使用单位技能的设置在LogicCommand里的AISpecialPowerInfo中。

切换武器的技能同理,在ToggleState加入SkirmishAiInfo模块来调整AI使用技能。




添加AI用到的是AIPersonalityDefinition

AI的资金分配AIBudgetStateDefinition

AI开局SkirmishOpeningMove

AI出兵和操作

AIBuildStateDefinition

AIStrategicStateDefinition

AITargetingHeuristic

AIMicroManagerData

2.2

AI文件的位置。和说明。

SageXml\SkirmishAI

这里可以看到原版AI的代码。

Schemas\xsd

这里也有个SkirmishAI文件夹。可以当作教程看。

2.3

屏蔽原版AI

Data\AdditionalMaps\MapMetaData_Mod

加入类似这样的东西,总共9个

	<AIPersonalityDefinition
		id="1AlliedBalanced"
		PersonalityType="1AlliedBalanced">
			<CountAsStructureForBuildPurposesFilter/>
	</AIPersonalityDefinition>

3.0AI的摆放结构。

什么东西放在什么位置看xsd就知道了,不需要特别说明。

这里是说明一下原版的AI的分层。

比如一个盟军AI从BasePersonality

到AlliedBalanced

后一个文件inheritFrom前一个文件。

BasePersonality

CoopBasePersonality

AlliedCoopBasePersonality

AlliedCoopBaseSkirmishPersonality

AlliedBalanced


Include的时候只Include最后一个就好了,也就是SkirmishPersonality="true" AIPersonalityDefinition


不建议全部放在同一AIPersonalityDefinition里。

自己做AI的时候根据自己喜好摆放吧,方便阅读。


3.1.0

AIPersonalityDefinition内容简介。

看过原版的AI之后,我们知道

AIBuildStateDefinition

AIStrategicStateDefinition

都是要在这个AIPersonalityDefinition里用到的。比如这样

    <BuildState id="awsl" State="awsl" Difficulty="MEDIUM HARD BRUTAL"/>
    <StrategicState id="smdx" State="zmhs" Difficulty="MEDIUM HARD BRUTAL"/>

 

注意为了方便阅读最好让id和State保持一致,上面StrategicState的id和State不同这样是不合适的。

还有AI播放的电影,声音也在这里。其他的看xsd好了不列举了。

然后列举一下常用的说明。

id 不解释
PersonalityType 排序用的。重复会导致崩溃或其他不明bug。(1)
PersonalityUIName 游戏中显示的AI名称,需要csf之类的显示名称的文件配合。
CommanderPortrait AI头像(应该是游戏中左上角那个)。
SkirmishPersonality ="true"可以在游戏中选择此AI。
CoopPersonality ="true" 和AI一队进入游戏时左上有此队友AI的头像和命令框。否则没有。我还不确定和多个AI一队会显示谁的。
SecondsTillTargetsExpire 未知
DesiredExcessPowerBuffer
用来调整AI自主控制的时候造电站的习惯。比如="100"的时候,AI认为75/150,125/200这样的情况是缺电,会造电站,同理="200" 的时候AI认为75/250,125/300这样的情况是缺电,75/300,125/350就不出多余的电站。总之数太大就会多花很多钱造多余的电站,="0"就是卡电才造电站。这里AI造电站是Heuristic="power"造的(在BuildState,后面会详细说明)。不考虑强制造建筑的那种。顺便,盟军造电站会一次造2个,我猜可能是因为造完电站不会立刻供电导致的。
BaseCompactness 
DefaultThreatFindRadius 未知
        <xs:attribute name="UnitBuilderEnemyNearbyDistance" type="SageReal" default="800.0" />
        <xs:attribute name="UnitBuilderEnemyNearbyMultiplier" type="SageUnsignedInt" default="4" />
应该是和出兵相关。不方便测试所以不确定。
可以理解为,AI若判断需要一些单位克制在距离D内的敌方单位,则这些单位的生产优先度*M。距离为敌方单位到自己家建筑的距离。
        <xs:attribute name="BuildTechEfficiencyThreshold" type="xs:float" default="0.5" />
        <xs:attribute name="BuildTechMinPowerAdvantage" type="xs:float" default="1.1" />
未知。这2个应该是和升科技相关的。但是,具体有没有用因为没试过不确定。
        <xs:attribute name="BuildExtraFactoryMinTime" type="Time" default="240s" />
未知。这个应该是和多出兵建筑相关的。但是,具体有没有用因为没试过不确定。
ResourceNodeSearchRadius 未知。我曾经认为和放矿场有关,然而经过各种测试都没发现有什么影响。
ResourceNodeValueRemainingForExpansion 未知
RefineryPlacementStartDistanceDelta 未知
RefineryPlacementIncreaseTickAmount 未知
RefineryPlacementNumberOfIncreaseTicksBeforeGivingUp 未知
都是矿场相关。没试出具体有什么用。而且我认为即使上面那个giveUp有用,也会因为矿场有BaseBuildingLocation="NEAR_RESOURCE_NODE" 放在矿脉旁边不会取消。
ReactiveDefenseRadius 未知
EmergencyManagerHandleNoPowerAtDifficulty" type="AIDifficultyBitFlags" default="" />未知
EmergencyManagerHandleNoIncomeAtDifficulty" type="AIDifficultyBitFlags" default="" />未知(看起来是缺钱的时候卖东西,没检验过)
EmergencyManagerHandleNoConyardAtDifficulty" type="AIDifficultyBitFlags" default="" />估计是主机没了优先补MCV。虽然没试过。
EmergencyManagerHandleUnderAttackAtDifficulty" type="AIDifficultyBitFlags" default="" /> AI建筑被打的时候会取消造了一半的矿就是这个东西导致的。
EmergencyManagerHandleConyardInDangerAtDifficulty" type="AIDifficultyBitFlags" default="" /> 
ConyardInDangerEmergencyUnderAttackTime" type="Time" default="10s" />
ConyardInDangerEmergencyHealthPercent" type="Percentage" default="50%" />
ConyardInDangerEmergencyEngineerDistance" type="SageReal" default="200.0" />
这3个是收主机的。1是会不会收主机。2是主机挨打时间。3是主机剩余血量。4是工兵距离,建议125。(1000000的话,就是很远地方的工兵会导致收主机,0的话就是工兵贴到主机上都不收,因为工兵是在主机边缘无法走到主机中心,但是,从空中飞过也算的,比如用牛蛙弹。)2,3合起来控制挨打收主机。
	<xs:attribute name="EnemyResortingTime" type="Time" default="15s" />未知
	<xs:attribute name="CleanupRefineries" type="xs:boolean" default="false" />未知
        <xs:attribute name="CanBuildInAlliedBuildRadii" type="xs:boolean" default="false" /> 看起来是可以在队友范围内建造
        <xs:attribute name="MaxStrategicTargets" type="xs:int" default="32" /> 看起来可以增加AI同时使用的StrategyState数量,但是毕竟没有实际检验过。
        <xs:attribute name="AssaultBeaconRadius" type="xs:float" default="300.0" /> 看起来是CoopAI的命令信标范围。
MaxWallDestroyTimeToCountAsGoThroughWalls 去xsd看注释



[未完待续]

3.1.1添加一个空AI。

	
	<AIPersonalityDefinition
		id="BasePersonality"
		PersonalityType="BasePersonality"
		SkirmishPersonality="false"
		<CountAsStructureForBuildPurposesFilter
			Rule="ANY"
			Include="STRUCTURE UNPACKS_INTO_BUILDING" >
			<ExcludeThing>AlliedMiner</ExcludeThing>
			<ExcludeThing>SovietSurveyor</ExcludeThing>
			<ExcludeThing>JapanRefineryEgg</ExcludeThing>
		</CountAsStructureForBuildPurposesFilter>
	</AIPersonalityDefinition>
	<AIPersonalityDefinition
		id="01A"
		PersonalityType="01A"
		inheritFrom="BasePersonality"
		SkirmishPersonality="true"
		PersonalityUIName="Personality:AI显示名字"
		CommanderPortrait="AI头像">
		<Side>阵营</Side>
	</AIPersonalityDefinition>

先加一个带有CountAsStructureForBuildPurposesFilter

的AIPersonalityDefinition

(就像原版的BasePersonality那样),

然后加另一个AIPersonalityDefinition

并且inheritFrom之前的那个,并且SkirmishPersonality="true"

设置AI阵营。

<Side></Side>

后加的那个AIPersonalityDefinition就算是得到一个新AI了,带有CountAsStructureForBuildPurposesFilter的那个只是作为基础文件。


啊后来发现好像放在一个AIPersonalityDefinition也可以。就是xs:element 的顺序要和xsd顺序一样。像原版那样分开放在不同的AIPersonalityDefinition里,方便调整共同点和不同点。


3.1.2 给之前的空白AI设置PersonalityUIName。然后就可以显示AI的名字啦。(记得勾选。复制额外文件。)

3.1.3 添加充数的复读AI。inheritFrom一个原有的可以正常玩的AI,PersonalityType改新的。完成。得到一个ai的复制品。这个操作可以用来补充空位使各阵营ai数量一致,防止萌新玩家选到不存在的ai(比如,先选择盟军第二个AI然后把阵营换成苏联,如果苏联只有一个ai,进入游戏的时候就会因为无法加载苏联第二个ai崩溃)。


3.2 AIBuildStateDefinition

这个东西可以用来出建筑。

3.2.1

在不用一些神秘操作的情况下,最普通的AI可以用造防御塔的模块造围墙,这样ai会随机摆放围墙可能需要一段时间才连起来。


3.2.2

那么。来一个让AI出多个出兵建筑的模块吧。

首先找几个原版的AIBuildStateDefinition看看里面都有啥。也许你注意到了类似这样的东西。

<BuildEntry Build="SovietFighterAircraft" Heuristic="BEST_UNIT_EXPECTED"/>

那么我们在xsd搜索一下这个BEST_UNIT_EXPECTED吧。

然后我们就找到了一大坨类似的选项,之后注意到一个比较特别的东西BUILD_TEST。

于是我们把它装到盟军机场上。就得到了一个不停出机场的模块。


4.1

没想好。


0.1

注意事项

(1)PersonalityType

排序用的。重复会导致崩溃或其他不明bug。

(2)CountAsStructureForBuildPurposesFilter

(3)BuildState和StrategyState不要写混了,尤其改帝国AI的时候。会有warning提示。

(4)RegisteredObjectSet的type不是KindOf。

(5)xs:element要按顺序摆放。否则可能出错。

(6)如果一个AIPersonalityDefinition是inheritFrom另一个AIPersonalityDefinition,这个AIPersonalityDefinition里的SpecificUnitCap可能会和前一个冲突导致无效。


总之看看xsd,需要什么能用什么。

最后于 10天前 被0000编辑 ,原因:
最新回复 (13)
  • Czarguard 10月前
    0 引用 2
    听说困难ai的智商是最聪明的,这是真的吗?
  • zyb123 10月前
    1 引用 3
    Czarguard 听说困难ai的智商是最聪明的,这是真的吗?
    差不多吧 反正其实都差不多。。
  • Ngen 10月前
    0 引用 4
    这是什么编辑器?叼哇!
  • 0000 10月前
    0 引用 5
    Ngen 这是什么编辑器?叼哇!
    Microsoft Visual Studio
  • 0000 9月前
    0 引用 6

      

    <xs:complexType name="AIStrategicStateDefinition" xas:runtimeWrapper="::AIStrategicState" xas:typeGroup="Xml">


    id 不解释。

    <xs:attribute name="MaxTargets" type="xs:unsignedInt" default="1" />使用的数量

    <xs:attribute name="MaxRunningCopies" type="xs:unsignedInt" use="optional" />

    <xs:attribute name="MaxInactiveCopies" type="xs:unsignedInt" use="optional" />这个原版的出扩展车开矿用了。

    <xs:attribute name="PathfindingCheckType" type="PathfindingCheckType" use="optional" />见xsd说明

    <xs:attribute name="CannotAttackTargetReaction" type="AICannotAttackTargetReaction" use="optional" />忽略

    <xs:attribute name="TeamGatherBeginFeedbackKey" type="StringHash" use="optional" />忽略

    <xs:attribute name="ExecutionBeginFeedbackKey" type="StringHash" use="optional" />忽略

    <xs:attribute name="ExecutionCanceledFeedbackKey" type="StringHash" use="optional" />忽略

    <xs:attribute name="ExecutionCompleteFeedbackKey" type="StringHash" use="optional" />忽略

      <xs:element name="Heuristic" type="HeuristicChoice" minOccurs="1" maxOccurs="1">触发条件,选择需要的。

      <xs:element name="TargetHeuristic" type="StateTargetHeuristic" minOccurs="0" maxOccurs="unbounded"/>这个,AI寻找目标用的。没有的话。。。就不会用。比如通过过滤,让ai找到没有伪装的敌方间谍让维护去炸。但是没法指定地图上的一个点。只是过滤出需要的单位/建筑。

      <xs:element name="Tactic" type="AIStateTactic" minOccurs="0" maxOccurs="unbounded" />看起来可以写多个tactic,没试过。


    最后于 5月前 被0000编辑 ,原因:
  • 0000 6月前
    0 引用 7
    有没有人知道
    SortByDistance="false"
    这个有什么效果?
  • zyb123 6月前
    0 引用 8
    0000 有没有人知道 SortByDistance="false" 这个有什么效果?
    字面上翻译是按距离排序..
  • 0000 6月前
    0 引用 9

    但是这并不能提供足够的信息啊。

    假设是距离的话,会有很多种情况。

    先提出几个猜想

    1

    距离目标单位x内的部队参与策略。

    距离目标单位x内的部队不参与策略。

    2

    所有部队根据距离目标的距离优先选择最近的部队执行策略。

    所有部队根据距离目标的距离优先选择最远的部队执行策略。

    3

    将距离当前部队较近的单位加入当前部队。


    猜想1是因为Tactic里有一个Distance。所以猜测可能是判断是否在距离内。

    猜想2。猜测Tactic中的Distance和这个是不相关的,且猜测距离是和目标位置有关。

    猜想3。因为SortByDistance这个本身是TeamTemplate里的所以猜测是构建部队的时候考虑单位和自己部队的距离,加入或减少执行当前策略的部队/单位。


    然后感觉设计实验检验挺困难的。



    最后于 5月前 被0000编辑 ,原因:
  • 0000 6月前
    0 引用 10

    更新一下我遇到的暂时没有解决问题。20190530
    工兵往距离远的油井跑。试着改了AITargetingHeuristic没什么效果。后来解决了,是和触发造工兵时的兵营的位置有关。
    苏联工兵地堡技能。
    超时空技能。(好像没救了)
    撤退问题,想做出退一点之后再回去打那种。不是很懂pullback和retreat的具体机制。感觉retreat就是退到基地不回来的那种。
    TR。
    建筑相关
    使用建筑技能。
    限制建筑数量。
    卖东西。



    还有一些已完成的操作,以后有空更新。
    帝国核心去油井展开。
    帝国3开卖兵营开局。(仅仅只是一个特别的开局)
    攻击冰冻/缩小的目标。(存在送死的问题,需要更多测试)
    不让AI的标枪进IFV。需要丢弃原版策略写新的。为了不让AI把标枪和IFV编进同一个策略。
    修被zz钻的MCV。或者补新的。
    工兵世纪,工兵车偷窃。
    卫星车开盾。
    矿车不压小兵。
    出5机场等。

    最后于 14天前 被0000编辑 ,原因:
  • 0 引用 11
    也就是EA异想天开用XML写ai文件,真看得难受···
  • 0000 14天前
    0 引用 12
    讨论一个AI神秘的现象。
    盟军AI的出兵建筑会自己升级科技,升级时出兵建筑有进度条,进度条走完之后科技灯同步变化。有没有人讨论一下是什么原理?
  • zyb123 14天前
    0 引用 13
    erisamael 也就是EA异想天开用XML写ai文件,真看得难受···
    mod基本都是xml文件 便于存储和传输 这跟ai无关。。
  • zyb123 14天前
    0 引用 14
    0000 讨论一个AI神秘的现象。 盟军AI的出兵建筑会自己升级科技,升级时出兵建筑有进度条,进度条走完之后科技灯同步变化。有没有人讨论一下是什么原理?
    感觉像是单位、建筑本身的ai段所带给的,而不是ai的xml。
    • RAT红警社区
      15
        登录 注册 QQ登录(不可用)
返回