尤里mod吧 关注:3,664贴子:78,891
  • 11回复贴,共1

【教程】我自己写的TS平台AI(MD).ini教程!

取消只看楼主收藏回复



删除|1楼2010-03-31 23:33回复
           科技等级     :如果电脑玩家的科技等级低于该水平那么这个AI触发就不会被激活。
                       * 在原版遭遇战中这个是没有意义的,因为所有玩家的科技级别都是上限10;但是在任务地图以及用NP开启了调节科技等级功能的Mod里,
                         这个就有必要认真考虑了。具体我会在后文说明。
           触发条件     :可以为0-7的任何一个值,这八个值的意思分别是:
                         0 目标敌方单位满足条件……
                         1 本方单位满足条件……
                         2 敌方电力黄
                         3 敌方电力红
                         4 目标敌方金钱大于或等于……
                         5 本方铁幕装置就绪
                         6 本方超时空传送就绪
                         7 平民单位满足条件……
           条件单位名   :指定在触发条件里评估什么单位。
           触发条件参数:必须是一个64位长的16进制数字。目前只有前两位和第十位有用,其余作用不明。
                         前两位:用十六进制表示0-255之间的一个数字,指定在触发条件中衡量的数量为多少。其中作战单位评估其数量,金钱则除以1000后和该数值比较。
                         第十位:控制触发条件用何种算法来比较。可以为0-5的任何一个值,这六个值的意思分别是小于、小于或等于、等于、大于或等于、大于和不等于。
           基础分量     :指定该触发在没有被执行时候的分量。据说只能用5000,500,70,50,40,20,10七个值(未验证,但是原版只有这七个值),个人以为这种东西稳健一些好。
                       * 分量就是AI在随机选择应该执行哪条触发的时候考虑的权重。AI在选择触发时,将所有满足条件的触发构成一个集合,然后加权随机抽取一个启动之。
                         如果该小队成功执行了脚本中的小队任务完成动作,则视为完成目的,将分量提升一些;反之,在完成目的之前该小队单位被全部摧毁,则视为失败,
                         将分量减小一些。
                         有关设置请在RulesMD.ini中查找AITriggerSuccessWeightDelta以及AITriggerFailureWeightDelta。
           分量下限     :指定该触发反复失败的所能减小到的分量下限。
           分量上限     :指定该触发反复成功执行的所能增加到的分量上限。
           遭遇战有效   :该触发在遭遇战中是否允许启动,疑似无效,建议使用1。
           未知         :作用不明,建议使用0。
           所属方       :哪个作战方可以启动该AI触发。1代表盟军,2代表苏联,3代表尤里,4、5、6分别代表第四、五、六阵营。
           基地防御     :已废弃,改为使用作战小队中的IsBaseDefense参数。此处建议使用0。
           简单敌人允许:是否允许简单的敌人启动该AI触发。
           中等敌人允许:是否允许中等的敌人启动该AI触发。
           冷酷敌人允许:是否允许冷酷的敌人启动该AI触发。
    


    删除|3楼2010-03-31 23:35
    回复
      ⑵作战小队:AI触发激活之后执行相应任务的小队。作战小队需要在[TeamTypes]中注册。以上面的作战小队1为例说明:
      例:[TeamTypes]
           …………
           39=08DA125C-G             ; 注册
           …………
           [08DA125C-G]             ;      注册ID
           Name=Allied Anti-Nuke Team - 1     ;      名称(注释用)
           VeteranLevel=1             ; ! x 兵种等级
           MindControlDecision=0         ; !    遭心灵控制后的动作,0=自动,1=加入控制者作战小队,2=送入部队回收厂,3=送入生化反应炉,4=搜索敌人,5=什么也不做
           Loadable=no                 ; !    可装载
           Full=no                 ; ! x 创建小队成员的时候,如果小队中有运载工具,其他成员是否应该位于运载工具的内部
           Annoyance=no             ; !    烦恼效果,作用不明
           GuardSlower=no             ; !    降低反应速度,作用不明
           House=<none>             ; ! x 创建小队成员时的所属作战方
           Recruiter=no             ;      强制重组优先级较低的小队的成员,如果它们是可以重组的
           Autocreate=yes             ; !    自动建造
           Prebuild=no                 ; !    预先建造,作用不明
           Reinforce=no             ; ! x 增援部队
           Droppod=no                 ; ! x 使用空降舱进入战区
           UseTransportOrigin=no         ; !    使用原始的运载工具
           Whiner=yes                 ; !    哀叫效果,作用不明
           LooseRecruit=no             ; !    解散新兵,作用不明
      


      删除|4楼2010-03-31 23:35
      回复
             Aggressive=no             ;      侵略性的,电脑在防御达到一定数量之后再开始建造该小队
             ѕuicide=yes                 ;      自毁式攻击,受到攻击不允许还击
             Priority=5                 ;      优先级
             Max=1                 ;      同一作战方至多允许同时存在的该类型小队个数
             TechLevel=0                 ; ! x 科技等级,疑似无效
             Group=-1                 ; !    分组,等同于人类玩家按下Ctrl+数字键组建的小队
             OnTransOnly=no             ; !    只能运输,作用不明
             AvoidThreats=yes             ;      规避威胁,小队成员在移动的过程中将会试图规避途中可能遭遇的敌方单位
             IonImmune=no             ; ! x 离子风暴免疫
             TransportsReturnOnUnload=yes     ;      运载工具卸载后返回基地
             AreTeamMembersRecruitable=no     ;      小队成员是否允许重组
             IsBaseDefense=no             ;      基地防御小队
             OnlyTargetHouseEnemy=no         ; !    只攻击敌方单位,作用不明
             Script=0A6E54EC-G             ;      指定脚本
             TaskForce=0617909C-G         ;      指定特遣部队
             注:! 一般实际作用不明,建议使用这里的值,不要随便更改
                 x 在AI中理论上是无效的语句
        ⑶特遣部队:对于一个作战小队,告诉电脑玩家这个小队中包含什么单位,应该建造什么。特遣部队需要在[TaskForces]中注册。以上面的特遣部队为例说明:
        例:[TaskForces]
             …………
             16=0617909C-G                 ; 注册
             …………
             [0617909C-G]                 ; 注册ID
             Name=1 Tanya, 3 GI, 1 Blackhawk, 1 Guard     ; 名称(注释用)
             0=1,TANY                     ; 单位列表,格式为[ID=数量,单位类型]
             1=3,E1
             2=1,SHAD
             3=1,GGI
             Group=-1                     ; 分组,建议保留原始值-1
        


        删除|5楼2010-03-31 23:35
        回复
          ⑷脚本:告诉电脑玩家控制特遣部队做什么样的动作。
          例:[ScriptTypes]
               …………
               25=0A6E54EC-G             ; 注册
               …………
               [0A6E54EC-G]             ; 注册ID
               Name=Allied Anti-Nuke Transport     ; 名称(注释用)
               0=54,0                 ; 脚本序列,格式为[ID=动作,参数]
               1=14,0
               2=43,0
               3=47,54
               4=8,2
               5=49,0
               6=46,54
               7=0,2
               8=0,1
               AI在遭遇战中实际可用的脚本动作是有限的。下面给出一个列表,无用的省略:
               动作         动作说明                   参数             参数说明
                 0      攻击最接近的敌方目标            1           可攻击的任何目标。
                                                      2           敌方建筑物。
                                                      3           敌方资源单位,就是矿车和矿场。
                                                      4           敌方步兵。
                                                      5           敌方载具。
                                                      6           敌方工厂,包括建造场、兵营、战车工厂、空指部和造船厂。
          


          删除|6楼2010-03-31 23:37
          回复
                                                        7           敌方基地防御。
                                                        8           基地威胁,目标在本方基地范围内的敌方单位。
                                                                 * 这个脚本不能用于战机,否则战机不会等装弹完毕就起飞了,当然无法投弹,再返回、再起飞……
                                                        9           敌方发电厂。
                                                        10          可以驻守的平民建筑物。
                                                        11          可以占领的平民科技建筑物。
                   5      原地待命                       时间         命令单位处于Guard状态一段时间,时间单位是6x秒,就是说1=6秒,2=12秒,等等。
                   6      转到行                         行号         跳至该脚本的指定行处继续执行,一般用于创建不断循环的脚本。
                                                                 * 行号一般应为序列ID+1,即0=的行其行号是1,不要搞错。
                   8      运载工具卸载                    1           运载工具和卸出的单位都仍然是该小队的成员。
                                                        2           运载工具仍然是该小队的成员,卸出的单位不再属于该小队(成为新兵)。
                                                        3           运载工具不再属于该小队(成为新兵),卸出的单位仍然是该小队的成员。
                                                        4           运载工具和卸出的单位都不再属于该小队(成为新兵)。
                   9      部署                            0           命令小队中可以部署的成员(美国大兵、基地车等,不包括武装直升机)部署。
            


            删除|7楼2010-03-31 23:37
            回复
                     11     进入状态                        5           原地待命。
                                                          6           原地永久驻扎。
                                                          10          采矿。
                                                          11          警戒。
                                                          15          搜索敌人。
                     14     装载到运载工具中                0           命令小队成员依次装载到运载工具中。
                     43     等待直到运载工装满              0           暂停脚本,直到运载工装满,然后继续。
                                                                   * 14和43一般应该连用。TS平台对装载逻辑的处理有两个问题:
                                                                     1.如果小队中有两个以上的运载工具,游戏在装载时,可能会先尝试将其中一个装载至另一个里。
                                                                       这样脚本就会在43处永久暂停而无法继续。
              


              删除|8楼2010-03-31 23:37
              回复
                现在我们考虑一些特殊情况:
                ⑴补兵       :一旦某个小队开始执行脚本,AI就不再对其补兵,除非该小队全灭并且经过了DissolveUnfilledTeamDelay的时间,AI取消该小队的编制。
                ⑵被心灵控制:被心灵控制的单位解除控制后将成为新兵,并且是Guard状态(原地待命)。如果AI再次建立新的小队这些单位也不会加入。
                ⑶海军的问题:海军不会把陆军当做目标,除非是像驱逐舰这样的单位,能够主动攻击,而敌方的单位恰好在射程内。要让海军单位攻击敌方基地,只能用46号动作。
                ⑷弹头比率1%:除非使用46号动作或者遭到攻击还击,AI不会主动攻击某个单位,如果该小队中有任何一个成员对目标单位装甲的伤害比率是1%。也就是说,
                               电脑用鲍里斯只能看家。
                【第二章】AI拔高教程——AI的设计
                AI无疑是让很多中级甚至高级的Modder们头疼的一件事。不仅是AI(MD).ini中几乎没有任何注释,而且那些随机的数字ID让人头昏眼花。
                制作AI不像修改Rules那样简单。制作AI要有一个整体的意识,同时还要有足够的耐心和谨慎。
                §2.1 设计AI的基本步骤
                首先,作为Modder,和设计Mod一样,设计AI必须要把握好整体战略。这点可以从对战中得到经验。从初期到末期,AI应该用什么样的套路进攻,都要考虑完全。
                然后,列出一个提纲,这个提纲从上到下,是AI从有了兵营开始一直到最后拥有高科的过程中作战小队的改变。这些是AI的主攻部队。
                再然后,艺术作品当让少不了修饰。AI的主攻部队还需要一些辅攻作支持。比如,战机,或者是间谍,工程师+履带车,等等。
                再再然后,还要考虑AI面对敌方应该如何应对。由于AI要隔一段时间才能启动一个AI触发,应当使某一时刻可能被启动的AI触发数量尽可能的少,以避免AI由于
                造了许多防御性小队反而没有造攻击性小队的情况。比如,如果敌方造了基洛夫,AI将造一些多功能步兵车防御;但是如果敌方没有造基洛夫,就不用造这些步兵车。
                最后,才是正式地编写AI。
                有了提纲的帮助,编写AI将变得简单许多。但是有一点是应当忌讳的,就是总觉得AI触发的分量不够,比如开始是50,后来觉得正在写的触发
                总该比之前的该重要吧,就加到了70;再写,又总觉得触发越写越不可少,结果写完了发现从前往后触发分量有增无减,越写越大,从50到70、100、150、200……
                这种情况,多是由于心切导致的。AI的编写是一份需要细致耐心的工作,绝不能图快而放弃了质量。分量不均衡的AI只能是失败的作品。
                §2.2 设计AI的要点
                ⑴合理分配分量
                对AI触发分量要有一个合理的理解。虽然分量上限可以达到5000,但是绝对不能以为分量可以随意设置,比如重要的给4000,中等重要的给500,不重要的给30。
                应该说,使用5000分量的AI触发,启动的概率非常大,一般只有两种情况才可以使用:一是危急情况,比如补基地车;二是Rush型AI,比如犀牛海,初期杀伤很大,
                后期对于AI的作用大幅下降,条件是本方没有高科;一旦本方建造了高科,触发条件不再满足,分量自然也就失去了意义。
                对于一般的攻击,70的分量已经很高了。如果希望电脑造更多的小队,既不应该盲目提升AI触发分量,也不能肆意增加作战小队的Max值,而应该增加AI触发,
                赋予一个不同的作战小队,这个作战小队的和那个作战小队特遣部队可以相同,但是脚本尽量不要用相同的,这样可以是AI进攻风格多变化。
                


                删除|11楼2010-03-31 23:38
                回复
                  ⑵合理安排进攻次序
                  原版的AI很笨,因为它集结了大量的单位,全部瞄准我们的工厂,而半路全被光棱塔解决(甚至是秒杀)了。因此,合理安排攻击次序很关键。
                  攻击的次序安排要考虑AI进攻小队的单位种类、数量等。比如电脑有6光棱,就应该攻击敌方基地防御;如果电脑有20光棱,就应该攻击任何目标;
                  如果电脑有20 V3,就应该攻击敌方发电厂和超级武器;如果敌方有20天启,就应该直接攻击敌方建筑物;等等。
                  攻击动作参数里面有一个8,即基地威胁。这个参数使用得好可以使AI防御更强。方法就是提升基洛夫、幽浮等空中单位的威胁值,然后指定含有坦克杀手、
                  磁能坦克之类的小队攻击基地威胁。这样,有防空能力的,比如步兵车和盖特将优先攻击基洛夫;没有防空能力的犀牛幻影等等将攻击敌方来犯的天启。
                  如此一来将使得AI相当难对付。
                  ⑶养成脚本中添加49号动作的习惯
                  AI小队不同于地图小队,这个完成任务的触发是必不可少的。否则,触发分量只会下降不会上升,最终将导致AI触发失衡。
                  ⑷优先级的选取
                  从目前做出的测试中来看,优先级起到的作用主要有三个:
                  ①优先级低的小队建造的倾向大,优先级高的小队重组的倾向大;
                  ②优先级高的小队如果指定了Recruiter=yes,并且优先级低的小队指定了AreTeamMembersRecruitable=yes,
                     高优先级的小队建立时将强制重组低优先级的小队中的成员;
                  ③AI向小队中填充新兵时,优先填充优先级较高的小队。
                  如果以上三条都成立,那么我们可以得出以下结论:AI根据优先级较低的小队的要求建造单位,但是首先填充到优先级最高的小队中。
                  这样看起来不合情理但是原因是明白的:如果高优先级小队由于某些原因被解散(触发条件不再满足等),其成员可以立即重新加入低优先级的小队,
                  以避免类似于电脑造了贪造高优先级小队突然高科被毁导致大量单位积压家中的情况。
                  如果以上推测都成立,优先级就应该这样设定:Rush型AI的优先级应当比较低,后期大部队的优先级比较高;特殊部队比如补充基地车,
                  由于没有其他小队拥有同样的单位,优先级应当低一些。
                  * 优先级低于SuspendPriority(在Rules中,默认为1)的小队,在电脑建造基地防御类小队时将会被挂起,不推荐使用这个优先级。推荐的优先级下限是5。
                  ⑸注意TechLevel
                  TechLevel,即科技等级,是用于调节某作战方在一场战役中所能建造的部队的。比如生死斗的科技等级就比较低,普通遭遇战就很高。对于电脑来讲,
                  如果AI触发的科技等级低于该作战方的科技等级,那么这个AI触发就有可能被激活;如果该小队中的某个成员科技等级却高于该作战方的科技等级,
                  那么这个电脑玩家就无法建造这种单位,进而导致这个小队永远无法建立,白白浪费CPU资源。
                  为了避免这种情况,基本的要求是,AI触发的科技等级不应该低于AI触发中所有特遣部队中的所有单位的科技等级
                  


                  删除|12楼2010-03-31 23:38
                  回复
                    “您的帖子过长需要审核”……熊审核的真慢……上面是一些审核出来的“尾巴”,全部抽掉了。


                    删除|32楼2010-04-01 12:02
                    回复


                      删除|34楼2010-04-01 14:50
                      回复
                        回复:36楼


                        删除|38楼2010-04-01 21:53
                        回复