.ai文件用来体现电脑操作的国家的思维方式和对玩家行为的判断能力。
当开始一局新游戏时,电脑会启动各个国家的ai文件,该文件以XXX_aaaa.ai,其中XXX为国家id,aaaa为剧本开始年代,比如开始1936年剧本时,电脑会自动为德国开启ger_1936.ai,而对于短剧本,XXX则相对于\Hearts of Iron 2\scenarios里各个短剧本的名字。
调用.ai文件的方法是在事件文件中调用,
type = ai which = [file name] # 通过这条命令来调用一个ai文件,这个ai文件会替换# 原有的ai文件
比如这个事件:
################
# Battle of Britain
#############################################
event = {
id = 24000
random = no
country = ENG
trigger = {
ai = yes
war = { country = GER country = ENG }
NOT = { war = { country = GER country = SOV } }
OR = {
control = { province = 56 data = GER } # Paris
AND = {
# Belgium
control = { province = 45 data = GER }
control = { province = 50 data = GER }
control = { province = 51 data = GER }
control = { province = 52 data = GER }
control = { province = 65 data = GER }
control = { province = 68 data = GER }
control = { province = 69 data = GER }
control = { province = 70 data = GER }
}
}
}
name = "AI_EVENT"
style = 0
date = { day = 1 month = january year = 1936 }
offset = 4
deathdate = { day = 29 month = december year = 1948 }
action_a = {
command = { type = ai which = "switch/ENG_Britain.ai" }
}
}
当英德交战,德苏不交战,德国占领巴黎或者占领了比利时的欧洲部分,英国就会调整自己的ai。
Ai文件的命名方式可以随意,但必须和事件中调用的文件名相同。
ai文件夹里的一堆.ai文件是原版游戏定义的,switch文件夹里的ai文件则由后续的补丁不断补充。
---------------------------一个完整ai文件模型的介绍-----------------------------
#一个完整的ai文件由许多部分组成,但并不意味着一个ai文件需要包含所有的这些部分,
#有时一个ai文件只有几个语句,但它依然是正确的,它将只替换原有文件中的那几个语句。
switch = [yes/no]
#默认是yes,如果用no,则ai不会在每年开始的时候寻找更合适的ai,如果用的是美国,
#则美国不会把他的政策从孤立主义逐渐改变到干涉主义。
#但由事件调用的ai会无视这个语句,还是能改变该国的ai。
#各种政策科研等的调整值,如
# exp_force_ratio = 0.750
#当前设定的flag,事件会设定多个flag,从而之后的事件可以按照flag的情况来判断事件#发生与否。
flags = {
testflag = yes
invade_albania = no
assist_finland = no
}
#调整ai同意索取领土要求的可能性
claim_acceptance = X
#向哪些国家要求领土他们会同意
demand_claims = {
EST
LAT
ROM
LIT
FIN
}
#哪些国家如果我们占领了他们会给与他们独立
liberate = {
LIT
FIN
}
#对列表中的国家难以影响他们以改善关系,x的取值[0-10],0意味着毫无影响。
resistance = {
ROM = x
}
#对列表中的国家有极强的侵略性,如果某个国家对应的数值是100,那么这个国家将不顾一
#切的试图毁灭该国。在本例,德国将首先对付法国,然后对付英国。
combat = {
ENG = 60
FRA = 70
}
#这个国家将保证列表中的国家的独立,这个数值越高,如果相对应的国家受侵略,保护国就
#越容易进行干涉。
protect = {
TUR = 100
DAN = 100
}
#这个国家将尽量和列表中的国家保持良好关系并与之同盟,数值越高可能性越高。
befriend = {
TUR = 100
DAN = 100
}
#xxx表示省份ID,这个语句表示这个国家将尽力在战争中占领这个省份,并尽可能通过和
#平谈判获得这个省份,n越高可能性越高。
target = {
xxx = n# 1 - 100
}
#电脑分配给升级的ic的最大值
upgrading = 0.1
#电脑分配给增援ic的最大值
reinforcement = 0.1
#如果电脑被占据的ic比例超过这个数字,他就会恐慌而开始爆民兵
desperation = 0.3
#开始战略转移消耗的时间
strat_redeploy_threshold = [days]
#进行战略转移部队的最高比例,默认0.25
max_redeploying = X
#影响该国对别国宣战的几率
war = 50
# 完全中立的国家的该值介于100到150
#影响该国接受同盟和军事通行要求的可能性,如果超过100则完全不可能,但这并不影响该
#国宣战的可能性。该值取决于国策的选择和与其他国家的关系。
neutrality = 0
#影响在前线对敌方表示友好的部队的比例,默认是4.0
max_front_ratio = X
#列表中的值将取代面对特定国家时默认的值
ax_front_ratios = {
FIN = 2.0
...
}
#送远征军的比例
#不要设置的太低,必须给AI在同盟军控制的战区放弃己方部队指挥权的机会
exp_force_ratio = 0.75
#AI不会给列表中的国家送远征军,如果它们之间要跨过大洋
#但如果两国邻近,还是会送远征军的
no_exp_forces_to = {
TAG
...
}
#战时分配卫戍责任的陆军最大比例
max_garrison_prop = [0.0-1.0]
#战时分配卫戍责任的陆军最小比例
#所有非前线省份的陆军都有卫戍AI控制(除非这个国家准备进行一场侵略)
min_garrison_prop
#分配给建造基础设施的IC比例
construction = {
max_factor = [0.0-1.0]
# 建造防空炮的设置,yes = 总是建造, no = 不造, atwar = 战时建造, not_atwar =和平时建造
AA_batteries = [yes/no/atwar/not_atwar]
# 超过这个数值则不再建造
max_AA_level = X
# 建造防空炮的省份列表,填入省份的ID,按优先顺序排列
AA_provs = { ... }
# 建造海岸要塞的设置,同上
coastal_fort = [yes/no/atwar/not_atwar]
# 超过这个数值则不再建造
max_coastal_level = X
# 建造海岸要塞的省份列表,按优先顺序排列
coastal_fort_provs = { ... }
# 同上,雷达
radar_station = [yes/no/atwar/not_atwar]
max_radar = X
radar_provs = { ... }
# 同上,机场
air_base = [yes/no/atwar/not_atwar]
max_air_base = X
air_base_provs = { ... }
# 同上,港口
naval_base = [yes/no/atwar/not_atwar]
max_naval_base = X
naval_base_provs = { ... }
# 同上,地堡
land_fort = [yes/no/atwar/not_atwar]
max_land_level = X
# 在这些国家的边界造地堡
fort_borders = {
GER,
ITA,
...
}
# 通常在资源充足的时候不断建造IC,除非是在战时
ic_at_war = [yes/no]
# 无论资源是否充足,不断建造IC,直到X年。(通常用于某国可以预见之后将进行扩张)
force_ic_until = X
# 在这一年结束时停止建造IC
ic_end_year = X
# 建造IC的省份优先权列表
IC_provs = { ... }
}
garrison = {
defend_overseas_beaches = [yes/no] # 是否海外驻军,默认no
# 在下列语句中X是一个基数,这个基数表示每个地区驻扎多少个师,这个基数取决于省#份
# 数量。(ps,这一段我还不大懂,望指点)
home_multiplier = X # 在本土,用这个数乘以基数,默认: 0.5
overseas_multiplier = X # 在其他领土,用这个数乘以基数,默认: 0.3333
home_peace_cap = X #在和平时期,守卫首都地区的最大部队数量.
war_zone_odds = X # 默认: 2.0 (尽量达到地方部队的两倍)
area_multiplier = { # 如果某个地区有一个特殊的省份,则列在表中,并用特殊的值乘以基数
#(可以覆盖海外省份的数值, 但不能覆盖本土省份。)
155 = 1.5
....
}
#驻军优先权设置:
beach = 50 # 海岸省份的优先权
capital = 100 # 首都
human_border = 210 # 忽视人类同盟玩家
war_target = 100 # 这个AI下一个要进攻的国家
reserves = 20 # 前线后的省份
opposing_alliance = 100 # 通常说来,所有的同盟都是对立的
claim_threat = 100 # 如果这个国家中立,这条语句针对可能向他宣战的国家
unstable_border = 50 # 与他国相接的别国被占据领土
# 特别的省份
province_priorities = {
527 = 50 # 省份527 的驻军优先权是50
1123 = -1 #优先权为负数则会覆盖所有其他优先权并设置为0
...
}
ignore = {
1123 #设为0...
}
key_point_prio_mult = [Value] # 把这个省份的优先权设为value(尚有疑问)
}
front = {
river = x #(将用多少部队进行跨河攻击,< 1.0 表示有优势)
#以下数值修正防御方的兵力数量及胜利几率(1.0 = 没有区别)
largefort = x #对于6级及以上地堡
smallfort = x #对于6级以下地堡
occupied = x #被敌方领土包围
owned = x #被本方领土包围
#战斗修正数值
# 以下数值减少进攻方的战斗效率
frozen_attack = 0.50
snow_attack = 0.50
blizzard_attack = 0.25
storm_attack = 0.60
muddy_attack = 0.75
#减少进攻方的完全进攻效率(1.0 = 没有修正, 0.5 = 减半.)
jungle_attack = 0.85
mountain_attack = 0.60
swamp_attack = 0.60
forest_attack = 0.85
hill_attack = 0.75
urban_attack = 0.40
# 前线部队的比例,通常用于防备邻国省份的进攻,默认,0.33。
support_defense_prop = X
recklessness = [0-3]#鲁莽程度,越是高,AI越容易做出冒险的举动
# Even - 将部队均匀分布在前线
# Reactive - 针对对方部队的重点集结部队
# Defensive - 更多的部队防御战略要地(IC, Victory Points, Oil, etc)
# Offensive - 更多的部队集结在对方防御薄弱之处
# Operational Defensive - 撤退的道路越少,部队越少(避免被包饺子.)
distrib_vs_ai = [even/reactive/defensive/offensive/op_defensive]
distrib_vs_human = [even/reactive/defensive/offensive/op_defensive]
#在制定日起内,不会向制定国家宣战。(比如英法队德国侵略波兰时的观望)
enemy_handicap = {
ENG = 100
FRA = 120
...
...
}
passivity = { # 对特定国家的反击
# 取值范围: 0-100 (%)
ENG = 0
FRA = 50
...
...
}
province_priorities = {
527 = 0.2 #分配原本应该分配的20%的部队来防守省份527
...
}
reserve_prop = [0.0-1.0]
# 总兵力中分配给后方部队的最高比例(包括指挥部和其他的师)
panic_ratio_vs_ai = X
# 如果敌方部队的数量超过己方部队这个倍数,则要求更多部队
#注意,这会使得部分部队放弃卫戍责任,所以,设得高一些
panic_ratio_vs_human = X # 同上,针对人类玩家
enemy_reinf_days = X
# 在X天内,计算获胜几率的同时统计进入目标省份的敌军数量
base_attack_odds = X # 如果获胜几率高于X,则攻击
min_attack_odds = X
# 如果战斗发生了僵局,若胜利几率低于这个数值,AI会选择停止战斗或撤退
max_attack_odds = X
# 如果胜利几率高于这个数值,AI不会再派遣援军
reinforce_odds = X
# 如果胜利几率在这个数值,则会派遣援军
withdraw_odds = X
#如果胜利几率低于这个数值,则会放弃进攻或者撤退
# 注意: 计算防御方撤退几率的公式非常复杂,用几个变量来体现很难
# 注意: 如果平均组织度过低,则部队也有可能撤退
}
military = {
relative_build_scheme = [yes/no]
# yes:AI会尽量保持自己的部队种类的比例;no:AI会按照下面的比例来分配自己的生产。默认:yes
max_batch_peace = 800
# 和平时期AI用流水线生产同一单位的最长日期
max_batch_war = 500
# 战争并未蔓延到本国边境时期AI用流水线生产同一单位的最长日期
max_batch_home_front = 190
# 战争已经蔓延到本国边境时期AI用流水线生产同一单位的最长日期
#注意: AI生产单位的数量同时受到其他因素的制约, 比如总的IC限制, 剧本结束时起将要
#到来,以及产生绝望情绪时.
# 生产分配表范例:
infantry = 3
cavalry = 0
motorized = 5
mechanized = 6
light_armor = 0
armor = 10
paratrooper = 0
marine = 6
bergsjaeger = 3
garrison = 0
hq = 2
militia = 0
# 35 %
escort = 5
multi_role = 7
interceptor = 3
strategic_bomber = 4
tactical_bomber = 6
naval_bomber = 5
cas = 5
transport_plane = 0
flying_bomb = 0
flying_rocket = 0
# 35 %
battleship = 2
light_cruiser = 4
heavy_cruiser = 3
battlecruiser = 0
destroyer = 6
carrier = 6
submarine = 4
transport = 5
# 30 %
# 注意:总和必须是100%
# 加强旅生产:
# (每个可以加加强旅的师都有一个合适的加强旅)
#陆军加强旅:
artillery = 15
sp_artillery = 5
rocket_artillery = 0
sp_rocket_artillery = 2
anti_tank = 3
tank_destroyer = 5
light_armor_brigade = 0
heavy_armor = 0
super_heavy_armor = 0
armored_car = 0
anti_air = 5
police = 0
engineer = 5
# 综合必须<= 100
# 海军加强旅:
cag = 100
# 综合必须<= 100
}
#我参考的一篇研究AI的文章里,作者是针对1.2版本的,而现在是1.3版本,不知道是否有变化
#那篇文章的作者指出,relative_build_scheme = [yes/no]这个语句在所有的单独ai文件中,都是
#选no,因为如果选yes,ai会尽力使自己的所有单位在种类上保持一个相同比例,比如苏联会为
#每一个步兵师建造一艘战列舰。而由于开局时海军和陆军比例完全失调,英国和美国会一开始
#暴陆军空军,直到他们的数量和海军相同。而如果意大利在42年被英国消灭了所有海军,他就会
#在接下来的2~4年里只造海军,完全不造陆军。
#我不清楚这句话在1.3里是否有改变,但我建议还是选no,然后按照自己的意思分配ai建造
air_marshal = {
icxdayscostfactor = 10.0 # 如何估算预期将要消耗的真实ic数值
manpowercostfactor = 100.0 # 如何估算预期将要消耗的真实人力资源数值
destructionriskthreashold = 0.2 # 如何评估一个师将要被解散
airsuperioritydesirability = 10.0 # 作为一个乘数参加任务期望的计算
airsuperioritylosstolerance = 1.0 # 什么样的损失比例在任务中是可以接受的,2.0
#表示2倍的损失倍接受, 0.5 表示一半
groundattacklosstolerance = 1.0
groundattackdesirability = 1.0
interdictionlosstolerance = 1.5
inderdictiondesirability = 1.0
logisticalstrikelosstolerance = 4.5
logisticalstrikeefficency = 0.01# 这个数值用来调整在完成任务时遭到的实际损失
logisticalstrikedesirability = 100000.0
runwaycrateringlosstolerance = 1.5
runwaycrateringefficency = 0.01
runwaycrateringdesirability = 20000.0
strategicstriketolerance = 4.5
strategicstrikeefficency = 0.01
strategicstrikedesirability = 1000000.0
installationstriketolerance = 1.5
installationstrikeefficency = 0.01
installationstrikedesirability = 10.0
navalstriketolerance = 1.0
navalstrikedesirability = 10.0
portstriketolerance = 1.0
portstrikedesirability = 9.0
# 你可以设置很多军事计划, 但是如果你想增加一个那就要在所有的种类中都增加,
# 默认状态下并没有设置
# 默认如下:
taskforcetype = {
name = "Air Superiority" # 名字可以随意,便于调试
desiredratio = 0.400 # 这个比率表示这个国家是否希望进行这项计划?
rangeweight = 10.000 # 空军在这项计划中的重要性?
airkillpowerweight = 2000.000 # 在这个计划中空军消灭地方空中实力的重要性?
hardkillpowerweight = 0.000
softkillpowerweight = 0.000
navalkillpowerweight = 0.000
strategickillpowerweight = 0.000
transportcapacityweight = -1000000.000
# 很大的负数表示运输船完全摈弃在这个计划之外
airvulnurabilityweight = -1.000
# 暴露给敌方空军的弱点评估(这个数值是建造成本及其他多种数据的综合考虑)
surfacevulnurabilityweight = 0.000
# ai在完成任务时要考虑哪些问题?
# Idle is the "mission" the AI is on when doing nothing,
# Reorganize is the "mission" the AI is on when trying to reform its
# air OOB to be more optimal. The other missions listed here correspond
# to the standard tactical missions AND a rebase to the best airbase.
# Possible missions are:
idle = yes
reorganize = yes
air_superiority = yes
#其他和"夺取制空权"相违背的默认计划
#interdiction 封锁
#ground_attack 攻击地面部队
#logistical_strike 轰炸补给线
#runway_cratering 轰炸机场
#strategic_bombardment 战略轰炸
#installation_strike 战术轰炸
#naval_strike 舰船轰炸
#port_strike 港口轰炸
#convoy_air_raiding 空中护卫
#airborne_assault 空降突袭
#air_supply 空运补给
}
# 其他默认空军任务
taskforcetype = { name = "Soft Bombing" desiredratio = 0.200 rangeweight = 10.000 airkillpowerweight = 0.000 hardkillpowerweight = 0.000 softkillpowerweight = 2000.000 navalkillpowerweight = 0.000 strategickillpowerweight = 0.000 transportcapacityweight = -1000000.000 airvulnurabilityweight = 0.000 surfacevulnurabilityweight = -1.000 idle = yes reorganize = yes interdiction = yes ground_attack = yes }
taskforcetype = { name = "Hard Bombing" desiredratio = 0.100 rangeweight = 10.000 airkillpowerweight = 0.000 hardkillpowerweight = 2000.000 softkillpowerweight = 0.000 navalkillpowerweight = 0.000 strategickillpowerweight = 0.000 transportcapacityweight = -1000000.000 airvulnurabilityweight = 0.000 surfacevulnurabilityweight = -1.000 idle = yes reorganize = yes interdiction = yes ground_attack = yes }
taskforcetype = { name = "Strategic Bombing" desiredratio = 0.100 rangeweight = 10.000 airkillpowerweight = 0.000 hardkillpowerweight = 0.000 softkillpowerweight = 0.000 navalkillpowerweight = 0.000 strategickillpowerweight = 2000.000 transportcapacityweight = -1000000.000 airvulnurabilityweight = -0.500 surfacevulnurabilityweight = -0.500 idle = yes reorganize = yes logistical_strike = yes runway_cratering = yes strategic_bombardment = yes installation_strike = yes }
taskforcetype = { name = "Naval Bombing" desiredratio = 0.100 rangeweight = 10.000 airkillpowerweight = 0.000 hardkillpowerweight = 0.000 softkillpowerweight = 0.000 navalkillpowerweight = 2000.000 strategickillpowerweight = 0.000 transportcapacityweight = -1000000.000 airvulnurabilityweight = 0.000 surfacevulnurabilityweight = -1.000 idle = yes reorganize = yes naval_strike = yes port_strike = yes convoy_air_raiding = yes }
taskforcetype = { name = "Airlift" desiredratio = 0.100 rangeweight = 10.000 airkillpowerweight = 0.000 hardkillpowerweight = -2000.000 softkillpowerweight = -2000.000 navalkillpowerweight = 0.000 strategickillpowerweight = -2000.000 transportcapacityweight = 1000000.000 airvulnurabilityweight = -1.000 surfacevulnurabilityweight = 0.000 idle = yes reorganize = yes airborne_assault = yes air_supply = yes }
}
#部队的数量乘以leader_rartio便得到实际分配的将领数量.
#如果你有101陆军单位同时land_field_marsal = 0.02 那么你有两个元帅.
leader_ratio = {
land_field_marshal =0.02
land_general =0.031
land_lt_general =0.41
sea_grand_admiral =0.02
sea_admiral =0.061
sea_vice_admiral =0.401
air_marshal =0.02
air_general =0.091
air_lt_General =0.11
}
#AI两栖作战的影响因素
invasion = {
#对于某个特定的省份目标
base = 1.0 # 相对关系修正. (数值低 = 特定的重要省份.)
random = 1.0 # 随机范围大小(1.0 = 1%)
coastal = 1.0 # 数值高则避免登陆有海岸要塞的省份
beach = 1.0 # 数值高则避免难以登陆的海岸.
distance = 1.0 # 数值高 = 避免远距离作战.
max_distance = 20.0 # 如果目标距离超过这个,则忽视之。1 = 100km ingame.
pocket = 1.0 #优先, 比如完全被敌国省份包围的省份.
island = 1.0 #是否优先占领孤岛
enemy = 1.0 #数值高表示警惕敌方有驻军的省份
adjacentenemy = 1.0 # 数值高表示警惕邻近的敌军
air_base = 0.1 # 有机场的省份的优先权
naval_base = 0.1 # 有港口省份的优先权
air_support = 0.1 #敌方空军半径范围内的海岸优先权
ignore = [yes/no] # 发动侵略,看是否和我国有边界. Default: no.
redirect = priority/nearest/home # AI文件中的目标身份的优先权
# 最近的AI有良好的攻击效率并且有机会退防
#部分特定省份有较高优先权
target = {
898 = 1000 # 入侵South Sicily (898) 有着极高的优先权. 负数表示完全不管那里.
}
}
#影响AI对海军控制的因素
admiral = {
#对下列海域的攻击有特别的优先权
target = {
592 = 200 ...
}
#下列海域为核心海域,对它的控制很重要
core = {
592
...
}
#下列省份可被用作港口
base = {
592
...
}
#被忽略的省份
ignore = {
#以下必须是海域,而不是省份ID
"northern baltic"
"southern baltic"
}
min_org = 95% # 在下次出港前必须达到最高组织度的比例
min_dmg = 95% # 在下次出港前必须达到最高人力的比例
return_org = 60% # 低于最高组织度的这个比例将回港
return_dmg = 50% # 低于人力的这个比例将回港
}
# 科研发展的影响因素
technology = {
endgoal = { ... } #将要完成的科技列表,填入科技ID
preference = { ... } # 优先研究的科技列表
ignore = { ... } # 不会研究的科技列表
#优先研究的科研领域
armor = 2.0
infantry = 3.0
industry = 2.5
aircraft = 0.6
naval = 0.1
land_doctrines = 4.0
air_doctrines = 0.9
naval_doctrines = 0.1
secret_weapons = 0.4
}
# 对于贸易协定的影响因素
trade = {
favored = {
TAG = X # 对这些国家有贸易优惠
}
embargo = {
TAG # 不会和这些国家进行交易
}
# 这个数指表示AI取消贸易协定的可能性,默认是 4.0.
#低一些的数值表示这个国家很容易取消不利于他们的贸易协定.
cancel_deal_threshold = X
# 下面的数值将覆盖"db\resource_values.csv" 中AI对各项资源重要性的看法,
#除非设置为 -1 (默认.)
energy = -1
rare_materials = -1
metal = -1
oil = -1
supplies = -1
money = -1
}
# 对科技共享的影响因素
tech_sharing = {
favored = {
TAG = X # 乐于和这些国家分享科技,如果X值较高,则会分享质量较高的科技
...
}
embargo = {
TAG # 不会和这些国家分享科技
...
}
not = {
ID # 不会分享这些科技
...
}
prioritized
ID = X # 优先分享这些科技
...
}
}
posted on 2009-11-05 20:50
飞翔天使 阅读(2424)
评论(0) 编辑 收藏 所属分类:
Game