tankant 发表于 2013-9-4 00:28:40

【大唐复兴】AORT AI计划与直播贴

本帖最后由 tankant 于 2013-9-8 13:09 编辑

大家好,我是tankant。

鉴于AORT的数据工作趋于完善,现在开始着眼于AI的制作。本帖动态更新。希望能激发更多人对AI的兴趣。
借此机会,完善自己的AI代码生成工具对UserPatch1.3和AORT的支持。
我会把我用到的技术毫无保留的奉献给大家,让大家共同进步。
编辑此帖的目的,是希望自己的思路保存到这里,分享经验。

当然,这里有部分技术可能是一些比较难以掌握的技术(比如vi编辑器的使用和后期会涉及到的Linux的shell命令),我不会有时间和精力去一一详解,具体请百度相关文章。使用这些技术的原因不是为了卖弄,而是为了劳动果实的重用性。我将利用这些工具,打造可以直接将AOFE的AI转化为AORT的AI的程序代码。该代码也附带转化AOFE的AI代码之后的修改记录。这也就是搞图像跟编程序的不同之处。图像不可以投机取巧,只能一点点来,然而程序总可以想到更少的方法,创造更多的价值。当我完成之后,会把直接将AOFE的AI转化为AORT的AI的程序代码的使用方法总结出来并公布。

工欲善其事,必先利其器。我在做的工作是打造一系列有利于日后工作的工具以及规范。你可以想象,为了简略AI的开发与单元测试难度,我开发过这个
https://www.hawkaoe.net/bbs/forum.php?mod=viewthread&tid=108858
可以证明我对AI的热爱。
虽然这个当初并不是特意为AORT打造的(因为当时也没有AORT),但是现在有意去兼容。

相信我的努力能吸引到更多的人加入到大唐复兴MOD的制作当中。

以下是具体工作:

tankant 发表于 2013-9-4 00:39:16

本帖最后由 tankant 于 2013-9-14 14:54 编辑


总体计划方案:移植AOFE的AI代码,在此基础上修改,并设计AI代码生成工具。

移植AOFE的AI代码
==================
第一步,也是最基础的一步,研究AOFE的AI的框架(文件布局,代码风格),构思AORT的单位的名称并与ID建立联系。之后完成defconst语句。野猪填表的方式并非我预期的那样易懂,需要好好理解。

第二步,通过vi(或者vim/Gvim)等纯文本编辑器编辑,利用正则表达式做出相应的替换,增加新的rule。重点工作在于完善AI脚本更改的过程代码。之所以使用vi,是因为AOFE的AI不断在更新。为了留有余地,有必要保存AI修改的方法。该方法程序写好后,可以不用担心AOFE的AI最新升级。因为利用该程序就可以完成瞬间升级。重复工作从此说拜拜。

移植AOFE的AI代码的基础上修改
==================
这一步需要资深的有经验的对战者的参与,我一个人肯定无法完成。重点在于新兵种的运用。由于新兵种消耗资源种类和数量的创新,合理的设计这些士兵的使用就是个很大的课题。

设计AI代码生成工具
==================
预计重新设计以下表:
unit表
building表
等。。。。。








tankant 发表于 2013-9-4 00:39:41

本帖最后由 tankant 于 2013-9-7 19:27 编辑


这期间做抽样测试,Barbarian_2.0不可用,Crusade 4.42可以直接用(原id兵种可以正常生产,部分兵种不可以生产,比如投矛骑兵,象兵,陌刀兵。设计多个统一的系列兵种还是挨个设计行为模式有待商榷。其他运行时的问题有待测试。不过发现部分问题,比如玛雅代替剑士的步兵一个也没有生产,这个可能不是bug。不知道别的AI是否也是这样的。不能让图像白白制作,得让他们都有出场机会。这是我的目标。)
standard ai也能用。这个AI很像1.0C原版ai,一开始就建造城墙,部分AI主动对计算机玩家中立。具体是不是原版ai还是其增强版,有待进一步测试。
Principality不可用

所有AI不会杀野猪。不能使用的AI报错也都跟UserPatch1.3的函数、策略有关。
目前怀疑没有安装UserPatch1.3。
安装UserPatch1.3。安装提示成功,但是实际1000人口没有打上,ai错误依旧。郁闷中。。。。


xp虚拟机上运行成功,AOFE的所有脚本运行正常可以调试AI了。
看来问题的原因是Ubuntu系统的wine没有识别出UserPatch1.3
所有的AI都能选择了。并且AI可以自行杀猪,很兴奋。
下一步就是测试AI是否随机选取AI的测试。

gdzjlzh说,如果想让电脑随机选取ai,需要最后把ai放到drs文件里。这是最后要做的。

tankant 发表于 2013-9-4 00:45:47

正在编辑

本帖最后由 tankant 于 2013-9-8 21:19 编辑

根据野猪填的单位id对照表,我整理出自己能够看懂的表。
经过抽样测试,锁定几个变量不能定义到新id上:

my-unique-unit
my-elite-unique-unit
my-unique-unit-line

解决方案就是定义6个新变量:

my-unique-unit1
my-elite-unique-unit1
my-unique-unit-line1

my-unique-unit2
my-elite-unique-unit2
my-unique-unit-line2

#!/usr/bin/env python
import os,re
file_list=[]
def get_all_file(floder_path):
    file_list=[]
    if floder_path is None:
      raise Exception("floder_path is None")
    for dirpath, dirnames, filenames in os.walk(floder_path):
      for name in filenames:
            file_list.append(dirpath + '/' + name)
    return file_list
file_list_result=get_all_file("/media/926bfa98-9eb6-414d-ab62-88b3fd1ba801/geli/HawKAoC/AI")
for i in file_list_result:
    i=re.sub(r'\s+','\\ ',i)
    stmt="sed -i 's/my-unique-unit-line/aort-my-unique-unit-line1/g' "+i
    stmt2="sed -i 's/my-unique-unit/aort-my-unique-unit1/g' "+i
    os.system(stmt)
    os.system(stmt2)

对应每个民族的新特色兵种。
这样就应该把所有AOFE原来的变量名利用#load-if-define来定义my-unique-unit1等变量的值


然后替换原来的my-unique-unit-line等变量。
以my-unique-unit-line为例,运行自己写的查找脚本:
import os

def is_file_contain_word(file_list, query_word):
    for _file in file_list:
      if query_word in open(_file).read():
            print _file
            #os.system('notepad '+_file)

    print("Finish searching.")
    #www.orayes.com
def get_all_file(floder_path):
    file_list = []
    if floder_path is None:
      #www.orayes.com
      raise Exception("floder_path is None")
    for dirpath, dirnames, filenames in os.walk(floder_path):
      for name in filenames:
            file_list.append(dirpath + '/' + name)
    return file_list
    #www.orayes.com
while 1:
    query_word = raw_input("Please input the key word that you want to search:")
    basedir = raw_input("Please input the directory:")
    is_file_contain_word(get_all_file(basedir), query_word)
    raw_input("Press Enter to quit.")

定位结果如下:

Please input the key word that you want to search:my-unique-unit-line
Please input the directory:.
./Principality.ai
./Principality.per
./Barbarian.per
./The Horde.per
./STD AI DM FIX/elite petersen deathmatch.per
./STD AI DM FIX/elite petersen full tech.per
./STD AI DM FIX/elite petersen supplement.per
./Barbarian_2.0/Castles.per
./Barbarian_2.0/RaidTheCamps.per
./Barbarian_2.0/MonksAndTrebs.per
./Barbarian_2.0/WallAndBoom.per
./Barbarian_2.0/HeavySkirms.per
./Barbarian_2.0/OnlyMeso.per
./Barbarian_2.0/WonderAssault.per
./Barbarian_2.0/DeathMatch.per
./Barbarian_2.0/TheGrowlOfTheJaguar.per
./Barbarian_2.0/Strategies/MONGOLBOOM.per
./Barbarian_2.0/Strategies/CASTLESLING.per
./Crusade 4.42/Army Selection.per
./tools/AORT的AI代码生成工具雏形/t/orayes.db3
./tools/附件/帝国时代2征服者AI脚本官方文档/1.0c官方文档数据整理/parameter/unit.csv
./tools/代码/t/orayes.db3
Finish searching.
Press Enter to quit.

绿色的都是带有my-unique-unit-line字样的文件,必须全部替换成my-unique-unit-line1和my-unique-unit-line2。由于一个关键词替换成2个,无法用批量替换脚本orayes.sh。这时候必须手动翻看这些文件然后一一处理。

原来不需要的单位也应该替换成新单位:

包含诸葛弩的文件:
Please input the key word that you want to search:chu-ko-nu
Please input the directory:.
./Barbarian.per
./The Horde.per
./STD AI DM FIX/elite petersen upgrades.per
./STD AI DM FIX/elite petersen deathmatch.per
./STD AI DM FIX/elite petersen supplement.per
./STD AI DM FIX/elite wonder kill.per
./Barbarian_2.0/SuicidalKnightRush.per
./Barbarian_2.0/MonksAndTrebs.per
./Barbarian_2.0/Strategies1v1.per
./Barbarian_2.0/StrategiesTG.per
./Barbarian_2.0/DeathMatch.per
./Barbarian_2.0/TheGrowlOfTheJaguar.per
./Barbarian_2.0/Strategies/WarGalleys.per
./Crusade 4.42/Unit Training.per
./Crusade 4.42/Main Upgrades.per
./Crusade 4.42/Threat rules.per
./tools/AORT的AI代码生成工具雏形/t/orayes.db3
./tools/附件/帝国时代2征服者AI脚本官方文档/1.0c官方文档数据整理/parameter/unit.csv
./tools/附件/帝国时代2征服者AI脚本官方文档/1.0c官方文档数据整理/parameter/research_item.csv
./tools/代码/t/orayes.db3
Finish searching.
Press Enter to quit.

批量替换诸葛弩为陌刀兵的脚本:
#!/usr/bin/env python
import os,re
file_list=[]
def get_all_file(floder_path):
    file_list=[]
    if floder_path is None:
      raise Exception("floder_path is None")
    for dirpath, dirnames, filenames in os.walk(floder_path):
      for name in filenames:
            file_list.append(dirpath + '/' + name)
    return file_list
file_list_result=get_all_file("/media/926bfa98-9eb6-414d-ab62-88b3fd1ba801/HawKAoC/AI")
for i in file_list_result:
    i=re.sub(r'\s+','\\ ',i)
    stmt="sed -i 's/chu-ko-nu/modaobing/g' "+i
    os.system(stmt)

运行成功,再次运行搜索脚本,结果如下

Please input the key word that you want to search:chu-ko-nu
Please input the directory:.

./empires2.EXE
./Data/gamedata_x1.drs
./Data/gamedata.drs
./age2_x1a/age2_x1.exe
./age2_x1/age2_x1.exe_bak
./age2_x1/aom.exe
./age2_x1/age2_x1.exe.setupaoc.backup
./age2_x1/age2_x1.exe
Finish searching.
Press Enter to quit.

发现确实诸葛弩chu-ko-nu确实都替换掉了。顺便发现,嵌入AI的drs文件应该在./Data/gamedata_x1.drs或者./Data/gamedata.drs里面。

以下是已经包含陌刀兵modaobing的文件:

Please input the key word that you want to search:modaobing
Please input the directory:.
./AI/Barbarian.per
./AI/The Horde.per
./AI/STD AI DM FIX/elite petersen upgrades.per
./AI/STD AI DM FIX/elite petersen deathmatch.per
./AI/STD AI DM FIX/elite petersen supplement.per
./AI/STD AI DM FIX/elite wonder kill.per
./AI/Barbarian_2.0/SuicidalKnightRush.per
./AI/Barbarian_2.0/MonksAndTrebs.per
./AI/Barbarian_2.0/Strategies1v1.per
./AI/Barbarian_2.0/StrategiesTG.per
./AI/Barbarian_2.0/DeathMatch.per
./AI/Barbarian_2.0/TheGrowlOfTheJaguar.per
./AI/Barbarian_2.0/Strategies/WarGalleys.per
./AI/Crusade 4.42/Unit Training.per
./AI/Crusade 4.42/Main Upgrades.per
./AI/Crusade 4.42/Threat rules.per
Finish searching.
Press Enter to quit.

我们可以重点研究这些文件
突然发现自己总结的文档也被替换掉了,必须手动修改这些文档然后转移。



以./AI/Barbarian.per为例,
vim ./AI/Barbarian.per:
/modaobing
yypn:s/modaobing/gongjveweidui/g
pn:s/modaobing/sakesunchangqiangbing/g
pn:s/modaobing/beiouchangfubing/g
pn:s/modaobing/buluozhanshi/g
pn:s/modaobing/silafuyongshi/g
pn:s/modaobing/kehanweidui/g
pn:s/modaobing/toumaoqibing/g
pn:s/modaobing/liudima/g
pn:s/modaobing/lunbadenushou/g
pn
:s/modaobing/yinduxiangshe/g
pn
:s/modaobing/gaomianjianuzhanxiang/g
pn
:s/modaobing/hualangsheshou/g
pn
:s/modaobing/falankeqibing/g
pn
:s/modaobing/sashanqibing/g
pn
:s/modaobing/gaoyuanqibing/g
pn
:s/modaobing/subiqibing/g
pn
:s/modaobing/jinlangtuqi/g
pn
:s/modaobing/xuanjiaqibing/g


下一处modaobing的地方就很难批量修改,必须手动改:
#load-if-defined CHINESE-CIV
(defrule
      (up-compare-goal gl-current-age >= gv-feudal-up)
      (unit-type-count-total modaobing-line > 12)
      (strategic-number sn-allow-resource-spending > 2)
      (building-type-count-total archery-range < 1)
      (can-build archery-range)
=>
      (build archery-range)
)
#end-if

很显然,这个rule应该把所有archery-range换成barrack:
n/archery-range
:s/archery-range/barrack/g
n:s/archery-range/barrack/g
n:s/archery-range/barrack/g



脚本发展成:

vim ./AI/Barbarian.per<<EOF
:%s/teutonic-knight/gongjveweidui/g
:%s/jaguar-warrior/war-elephant/g

:%s/chu-ko-nu/modaobing/g
gg/modaobing
yypn:s/modaobing/sakesunchangqiangbing/g
pn:s/modaobing/beiouchangfubing/g
pn:s/modaobing/buluozhanshi/g
pn:s/modaobing/silafuyongshi/g
pn:s/modaobing/toumaoqibing/g
pn:s/modaobing/liudima/g
pn:s/modaobing/lunbadenushou/g
pn:s/modaobing/yinduxiangshe/g
pn:s/modaobing/gaomianjianuzhanxiang/g
pn:s/modaobing/hualangsheshou/g
pn:s/modaobing/falankeqibing/g
pn:s/modaobing/sashanqibing/g
pn:s/modaobing/subiqibing/g
pn:s/modaobing/jinlangtuqi/g
pn:s/modaobing/xuanjiaqibing/g

/#load-if-defined CHINESE-CIV
/modaobing
/archery-range
:s/archery-range/barrack/g
n:s/archery-range/barrack/g
n:s/archery-range/barrack/g

/modaobing
/ri-fletching
:s/ri-fletching/forging/g
/ri-bodkin-arrow
:s/ri-bodkin-arrow/ri-iron-casting/g
/ri-bracer
:s/ri-bracer/ri-blast-furnace/g

/modaobing
/ri-fletching
:s/ri-fletching/forging/g
/ri-bodkin-arrow
:s/ri-bodkin-arrow/ri-iron-casting/g
/ri-bracer
:s/ri-bracer/ri-blast-furnace/g

/ri-fletching
:s/ri-fletching/forging/g
/ri-bodkin-arrow
:s/ri-bodkin-arrow/ri-iron-casting/g
/ri-bracer
:s/ri-bracer/ri-blast-furnace/g

/modaobing
/ri-chemistry
:s/ri-chemistry/1070/g
/ri-padded-archer-armor
:s/ri-padded-archer-armor/ri-scale-mail/g
/ri-leather-archer-armor
:s/ri-leather-archer-armor/ri-chain-mail/g
/ri-ring-archer-armor
:s/ri-ring-archer-armor/ri-plate-mail/g

/ri-chemistry
:s/ri-chemistry/1070/g
/ri-padded-archer-armor
:s/ri-padded-archer-armor/ri-scale-mail/g
/ri-leather-archer-armor
:s/ri-leather-archer-armor/ri-chain-mail/g
/ri-ring-archer-armor
:s/ri-ring-archer-armor/ri-plate-mail/g



/modaobing
/ri-ballistics
:s/ri-ballistics/ri-squires/g
/ri-thumb-ring
:s/ri-thumb-ring/ri-tracking/g

/ri-ballistics
:s/ri-ballistics/ri-squires/g
/ri-thumb-ring
:s/ri-thumb-ring/ri-tracking/g




:x
EOF



以下是除了诸葛弩之外的6个不用了的特种兵,马上除去还是最后统一除去待定。
conquistador
jaguar-warrior
janisarry
mangudai
teutonic-knight
woad-raider

打算这样搞:
:%s/teutonic-knight/gongjveweidui/g
:%s/jaguar-warrior/war-elephant/g

:s/conquistador/war-elephant/g
需要修改建筑:
:s/archery-range/stable

:s/mangudai/gaoyuanqibing/g
需要修改建筑
:s/archery-range/stable

:s/janisarry/kehanweidui/g
需要修改建筑
:s/barrack/stable

:s/woad-raider/war-elephant/g
需要修改建筑
:s/barrack/stable






以下四个新单位考虑到其特殊性,以后再安排位置。
gongchengta
yuntiche
yunbingmache
jiangjun




继续找modaobing
/modaobing

tankant 发表于 2013-9-4 00:57:49

我要占10楼,都别跟我抢

tankant 发表于 2013-9-4 01:02:05

tankant 发表于 2013-9-4 00:57 static/image/common/back.gif
我要占10楼,都别跟我抢

我要占10楼,都别跟我抢

tankant 发表于 2013-9-4 01:07:01

占楼等编辑

tankant 发表于 2013-9-4 01:10:51

占楼待编辑

tankant 发表于 2013-9-4 01:18:12

占楼待编辑

tankant 发表于 2013-9-4 01:20:13

10楼占满,我去睡觉了。

阿拉伯野猪 发表于 2013-9-4 17:48:54

强烈支持。火钳刘明。。

gdzjlzh 发表于 2013-9-6 18:56:02

开学才一个星期,就这么多事了

yty 发表于 2013-9-22 23:06:52

tankant 发表于 2013-9-4 00:45 static/image/common/back.gif
根据野猪填的单位id对照表,我整理出自己能够看懂的表。
经过抽样测试,锁定几个变量不能定义到新id上:
...

my-unique-unit
my-elite-unique-unit
my-unique-unit-line
只需要修改mod 的xml文件中的uniqueUnit eliteUniqueUnit uniqueUnitLine等就可以了。

tankant 发表于 2013-10-31 22:28:10

yty 发表于 2013-9-22 23:06 static/image/common/back.gif
my-unique-unit
my-elite-unique-unit
my-unique-unit-line


感谢,不过野猪没有采用UserPatch1.3来新增民族,我也绕开这定义新id的想法,只把同id兵种更换了。尽量避免使用my-unique-unit,my-elite-unique-unit,my-unique-unit-line。
页: [1]
查看完整版本: 【大唐复兴】AORT AI计划与直播贴