【大唐复兴】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-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-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-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
我要占10楼,都别跟我抢 tankant 发表于 2013-9-4 00:57 static/image/common/back.gif
我要占10楼,都别跟我抢
我要占10楼,都别跟我抢 占楼等编辑 占楼待编辑 占楼待编辑 10楼占满,我去睡觉了。 强烈支持。火钳刘明。。 开学才一个星期,就这么多事了 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等就可以了。 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]