AI文件说明

0000 3月前 394

开个贴随便写点东西。

欢迎一起讨论。

1

[未完成]

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

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

1.1

<模块 内容../>

1.2

<模块>

  内容

  ..

</模块>

1.3

注意<xs:attribute 和<xs:element 的区别。



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


根据我的经验,可以把他们放在同一个文件里,但是只少要有2个AIPersonalityDefinition,

并且其中一个inheritFrom另一个。

自己做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 未知。我认为和放矿场有关(Heuristic="Refinery")

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。

先加一个带有CountAsStructureForBuildPurposesFilter

的AIPersonalityDefinition

(就像原版的BasePersonality那样),

然后加另一个AIPersonalityDefinition

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

设置AI阵营。

<Side></Side>

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

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

3.1.3 添加充数的复读AI。inheritFrom一个原有的可以正常玩的AI,PersonalityType改新的。完成。


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。

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

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


    最后于 12天前 被0000编辑 ,原因:
    • RAT红警社区
      7
        登录 注册 QQ登录(不可用)
返回