AI modding

本页面适用于最新的版本(1.14)。
秋起.讨论 | 贡献2024年11月2日 (六) 23:27的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

《钢铁雄心IV》中的AI能够操纵国家许多方面的事物。其包括变更国家的国策或科技走向,决定国家应该生产多少单位或建筑,以及国家应该生产什么样的模板,应该集中力量在哪里,决定使用哪些模板或变体等等。 以下是AI的mod文件路径:

  • /Hearts of Iron IV/common/ai_areas
  • /Hearts of Iron IV/common/ai_focuses
  • /Hearts of Iron IV/common/ai_peace
  • /Hearts of Iron IV/common/ai_strategy
  • /Hearts of Iron IV/common/ai_strategy_plans
  • /Hearts of Iron IV/common/ai_templates
  • /Hearts of Iron IV/common/ai_attitudes.txt
  • /Hearts of Iron IV/common/ai_personalities.txt

许多其他给玩家提供选择的地方应附有 AI 倾向来表达 AI 对各选项的权衡,这些地方使用ai_will_do。

MTTH 代码块

MTTH 块,在游戏内命名为 /Hearts of Iron IV/common/mtth/,是一种为某些块分配动态值的方法,无论是 country = { ... } in a focus tree to assign which countries can get it,动态变化的变量值(如在 /Hearts of Iron IV/common/mtth/ 中),还是事件的mean-time-to-happen value for an event值等。由于 MTTH 块分布在整个游戏中,了解其工作原理极为重要。然而,它最常见的应用是为数据库条目(例如国策或科研)分配基本的 AI 权重。

大多数情况下,它会被标记为 ai_will_do,游戏采用的方法是生成一个介于 0 和 ai_will_do 块的值之间的十进制数字,然后选择具有最高值的条目。在 ai_will_do 值之后还可以应用其他修正,例如在 AI strategy plans 中针对国策和科研应用的修正值。或the ones that get defined within Defines。它会与已经获值进行相乘。这可以包括不同的 `ai_will_do` 值,例如与国家领袖特质以及使用这些特质的idea或角色相关的内容。
事件选项则使用 `ai_chance`。即probability-proportional-to-size sampling。它采用与大小成比例的概率抽样,用一个虚拟的 d00 掷骰结果作为最终决定因素。因此,最终事件选项的概率不能不是 1/100 的倍数,尽管每个选项权重的总和可以与 100 有很大区别。换句话说,如果一个选项的值为 1,而另一个选项的值为 999,则第一个选项被选择的概率将是 1%,而不是 0.1%。

MTTH 块的初始值为 1。从该值出发进行进一步操作。这里可以对三个值进行参数更改,分别是: add, basefactor,例:可以这样factor = 0.3, base = 10, or add = 5add将指定参数加到该值上,factor乘以该值,而 base 通常在任何更改之前进行,建议将其设置为完全不同的参数,如乘以 0 并加上这个数。 为了使操作条件适用,使用 modifier = { ... } block。其起到的作用于 trigger block相似,默认作用域下(因此也是 ROOT)是评估 MTTH 块的国家。根据 MTTH 块, there may be additional scopes marked with FROM or FROM.FROM other than the default.可能还有其他标记为 FROM 的范围或 FROM.FROM 以外的默认范围。值修改参数作为常规参数使用(值修改参数和普通参数一样,拥有相同的使用方式和特性。这种设计可以使得函数在处理输入时具有更大的灵活性。),可以几乎没有区别的放置在 modifier = { ... } block中的任何位置,无论是在结束时、开始时,还是在trigger触发块之间。

Variables 也可以在值修改参数中使用。如果使用在 modifier = { ... } 触发块中定义的临时变量,为了变量能够按定义应用,那么修正值的值修改参数必须放在变量定义之后。变量也可以在 modifier = { ... } 块之外使用,也可直接放在 MTTH 块内部。

示例

ai_will_do = {
    base = 10.5

    # If the country is Germany, set the value to 0,
    # causing an early end of the evaluation.
    modifier = { tag = GER factor = 0 }
    modifier = { is_major = yes add = 1 }
    modifier = {
        factor = 3
        add = 2.5
        tag = FRA
    }
    factor = 2

    modifier = {
        set_temp_variable = { t = num_of_civilian_factories }
        add_to_temp_variable = { t = num_of_military_factories }
        divide_temp_variable = { t = 10 }
        round_temp_variable = t
        add = t
    }
}

假设GER和FRA是主要国家,结果是

  • 德国为0 即[math]\displaystyle{ 10.5 \cdot 0 = 0 }[/math]
  • 法国是74 即[math]\displaystyle{ ((10.5 + 1) \cdot 3 + 2.5) \cdot 2 = 74 }[/math]
  • 其他主要国家为23 即[math]\displaystyle{ (10.5 + 1) \cdot 2 = 23 }[/math]
  • 其他非主要国家为21 即[math]\displaystyle{ 10.5 \cdot 2 = 21 }[/math]

计算出该值后,该国民用和军用工厂的总数除以10并四舍五入,将计入得分。例如,如果法国在开局游戏中总共有43家民用和军用工厂,那么这将导致在之前的数值74基础上增加4,总共78。

AI 策略

AI strategies,AI策略,是为了让AI更愿意或更讨厌去采取某些行动。比如开战、保独、志愿军等外交行动,海陆军军事力量的战略部署权重,建造和生产的队列分配,以及抵抗运动抵抗运动 DLC中情报系统的运用。
AI strategies中的 value (值)可正可负,正值会增加AI采取行动的倾向,反之则会减少。

一般的AI策略存储在/Hearts of Iron IV/common/ai_strategy/*.txt 文件中,但是AI策略也可以在该文件夹之外定义。比如add_ai_strategy effect 语句可以在任何效果域中添加永久ai策略, AI strategy plans中也包含着自己内部定义的AI策略。总之,/Hearts of Iron IV/common/ai_strategy/*.txt 文件中定义/描述的AI策略可以通过满足或不满足条件来自动启用或关闭

/Hearts of Iron IV/common/ai_strategy/*.txt 文件中的每个条目都是一个具有 AI 策略名称的域,就像Effect作用域或Trigger条件域一样。条目名称可以任意定义(但为了防止重复,建议在词条后加一个ai_strategy之类的后缀),甚至允许重复定义:这只会出现在 AI dumps的后台中,玩家是看不到的。如果某个 AI 策略修改了 AI 选择与玩家进行外交行为的权重几率,那么当玩家将鼠标悬停在选项上时,会显示该外交行为的影响因素如下: COUNTRY has strategic reasons to be ...。以下是一个名为 BHR_invade_qatar 的 AI 策略示例:

BHR_invade_qatar = {
    allowed = {
        original_tag = BHR
    }
    enable = {
        country_exists = QAT
    }
    abort = {
        has_war_with = QAT
    }
    abort_when_not_enabled = yes
    ai_strategy = {
        type = invade
        id = QAT
        value = 200
    }
}

参数说明

以下是针对 /Hearts of Iron IV/common/ai_strategy/*.txt 条目(而非其中的 AI 策略条目)的参数说明。

allowed = { ... }是启用域, 该allowed域仅在游戏开始前进行检查,用于永久性地允许或禁止某个 AI 策略。通常这只用于国家检查(例如 tag = OMA)或 DLC 检查,这些检查一旦满足就永远不会失效。

enable = { ... } 是可用域,必须满足该条件才能启用 AI 策略。默认情况下,即使不满足该条件,也 不会 取消 AI 策略。可以通过使用 abort_when_not_enabled = yes 作为单独的参数来改变其是否可用。与 allowed 不同的是,这个条件会被实时判断。

abort = { ... } 是一个条件域,满足该条件就能禁用当前 AI 策略。即使不满足该条件,也会阻止该AI策略在游戏开始时被添加。

ai_strategy = { ... } 内部是要生效的 AI 策略。AI 策略的形式是 type = <AI strategy type>。[[#Types|The rest depends on the AI strategy]。

此外,还有 AI 策略的反转参数。用于有 id = TAG 条件的 AI 策略,以针对特定TAG:该 AI 策略将为满足 enable = { ... } 判断条件的国家启用。并依靠 reversed = yes来生效。 enable_reverse = { ... }意为需要满足域内条件才能反转。反转参数无默认条件域,所以需要条件域具体到某个TAG。

反转 AI 策略的例子如下:

BHR_support_neutrals = {
    allowed = {
        NOT = { original_tag = BHR }
    }
    enable = {
        has_government = neutrality
    }
    enable_reverse = {
        BHR = { has_government = neutrality }
    }
    reversed = yes
    abort_when_not_enabled = yes
    ai_strategy = {
        type = support
        id = BHR
        value = 100
    }
}

如果没有 reversed = yes,该例这将使每个 中立主义中立主义 国家支持 BHR。由于该参数的存在,策略被反转:BHR 将支持每个 中立主义中立主义 国家。

Types

此列表可能已过时。有关每种人工智能策略的列表可以在原版游戏的 /Hearts of Iron IV/common/ai_strategy/documentation.info 文件中找到。

与外交行动相关的AI策略:
名称 参数 示例 描述 备注
结盟 value = <int>
策略的权重。

id = <country>
策略的目标。

ai_strategy = {  
    type = alliance  
    id = USA  
    value = -100  
}
AI会尝试与一个国家结盟,如有可能,将加入同一阵营。
对抗 value = <int>
策略的权重。

id = <country>
策略的目标。

ai_strategy = {  
    type = antagonize  
    id = USA  
    value = -100  
}
AI将会与一个国家对抗,拒绝与其进行大多数的外交行动。
请求外国驻军 value = <int>
策略的权重。

id = <country>
策略的目标。

ai_strategy = {  
    type = asking_foreign_garrison  
    id = USA  
    value = 100  
}
AI将会按照权重请求外国人力支援以满足驻军需求,如果指明了特定国家。 如果未指定id,则将适用于其他所有国家。
交好 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = befriend
    id = USA
    value = 100
}
AI将会与某国家建立友好关系,接受大多数与该国的外交行动。
征服 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = conquer
    id = USA
    value = 100
}
AI将会试图征服某国家,更有可能为之正当化战争目标并宣战。 这并改变AI在与其进行战争时对前线的控制方式。
视为弱国 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = consider_weak
    id = USA
    value = 100
}
AI会将某国视为弱国,减少对其宣战前的踌躇不前,或使与该国结盟的可能性降低。
遏制 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = contain
    id = USA
    value = 100
}
AI将会遏制某个国家,保护他免受任何可能与其敌对国家的侵略。
宣战 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = declare_war
    id = USA
    value = 100
}
AI将会在已有正当化后的宣战借口的情况下对战争目标宣战。
外交行动接受 value = <int>
此策略的权重。

id = <country>
策略的目标国家。
target = <diplomatic action>
要修改的外交行动。

ai_strategy = {
    type = diplo_action_acceptance
    id = USA
    value = 100
    target = join_allies
}
若其他国家请求,AI将接受某项外交行动。 AI被提议不会影响其原有的态度。外交行动的名称通常可以通过用于标题的本地化键找到,大部分情况下位于/Hearts of Iron IV/localisation/english/diplomacy_l_english.yml 文件中:DIPLOMACY_SEND_VOLUNTEERS_TITLE:0 "派遣志愿军"表示派遣志愿军的外交行动名称为send_volunteers
外交行动愿望 value = <int>
此策略的权重。

id = <country>
策略的目标国家。
target = <diplomatic action>
要修改的外交行动。

ai_strategy = {
   type = diplo_action_desire
    id = USA
    value = 100
    target = call_allies
}
AI将会向指定国家请求某项外交行动。 AI不会因为被提议而更改原有态度。外交行动的名称通常可以通过用于标题的本地化键找到,大部分情况下位于/Hearts of Iron IV/localisation/english/diplomacy_l_english.yml文件中:DIPLOMACY_SEND_VOLUNTEERS_TITLE:0 "派遣志愿军"表示派遣志愿军的外交行动名称为send_volunteers
不与...一起参战 value = <int>
此策略的权重。

id = <country>
策略的目标国家。
target_country = <country>
与之参战的国家。

ai_strategy = {
    type = dont_join_wars_with
    id = USA
    value = 100
    target_country = BHR
}
AI将更不可能与指定国家联合对某一特定国家参战。 并不减少AI因“其他”国家召唤导致对目标国家宣战的可能性,即使这会导致与被指定国家一起与目标国家作战。
无视 value = <int>
此策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = ignore
    id = USA
    value = 100
}
AI将更不可能接受或主动与目标国进行任何形式的外交行动。
无视宣称 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = ignore_claim
    id = USA
    value = 1
}
AI将忽视指定国家发起的外交活动。 值为布尔型,仅设定为1。
保护 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = protect
    id = USA
    value = 100
}
AI将保护某一国家,对其进行保障独立或将其拉入同一阵营。 若值为负(综合考虑所有AI策略值)将导致AI不会保障该国家。
支持 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = support
    id = USA
    value = 100
}
AI将在战争中通过起草租借法案、派遣志愿军或远征军支持指定国家。
起草租借法案 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = send_lend_lease_desire
    id = USA
    value = 100
}
AI将向指定国家起草租借法案。
发送志愿军的意愿 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = send_volunteers_desire
    id = USA
    value = 100
}
AI将向指定国家派遣志愿军。
与陆军管理相关的AI策略:
名称 参数 示例 描述 备注
登陆侵略 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = invade
    id = USA
    value = -100
}
AI将对指定国家进行海军入侵。
准备战争 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = prepare_for_war
    id = USA
    value = 100
}
AI将准备对指定国家的战争,并将部队移动到其边界。
区域优先级 value = <int>
策略的权重。

id = <AI area>
要优先考虑的AI area

ai_strategy = {
    type = area_priority
    id = europe
    value = 100
}
推动AI在指定区域内放置更多单位。
不防守盟友边界 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = dont_defend_ally_borders
    id = POL
    value = 10
}
使AI永远不在指定国家与与其交战的国家之间的边界上部署部队。 数值必须是二进制的。如果总值(考虑到每个AI策略)为正,AI将永远不会在边界上放置任何部队。
强制防守盟友边界 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = force_defend_ally_borders
    id = FRA
    value = 100
}
AI将在指定国家与其他国家之间的边界上部署部队。 还接受id中的[[#AI areas|AI areas]。 |
前线装甲分配权重 value = <int>
策略的权重。

id = <country>
策略的目标国家。

ai_strategy = {
    type = front_armor_score
    id = POL
    value = 100
}
AI将为进攻指定国家部署更多装甲单位。
前线控制 state = <state>
目标州。

tag = <country>
目标国家。
strategic_region = <ID>
目标战略区域。
area = <state>
目标AI area
country_trigger = { ... }
目标国家的触发条件块。
state_trigger = { ... }
目标省份的触发条件块。 ratio = <decimal>
指定前线必须具备的前线比例 以启用策略的要求. 默认为0。
priority = <integer>
设置此前线控制策略的优先级。如果存在矛盾的前线控制策略,将遵循优先级更高的策略。
ordertype = <front|invasion>
如果设置,将使AI策略仅适用于陆地前线或海军入侵。
execution_type = <careful|balanced|rush|rush_weak>
如果设置,这将使AI的前线计划拥有设置的执行类型。仅适用于前线。
execute_order = <bool>
如果设置,将使AI强制执行前线命令或强制不执行。
manual_attack = <bool>
如果设置为false,防止AI进行不属于前线计划的小规模交战。默认为true,仅适用于前线。

ai_strategy = {
    type = front_control
    state_trigger = {
        industrial_complex > 1
        is_owned_by = ENG
    }
    ratio = 0.1
    ordertype = front
    execution_type = rush
    manual_attack = no
}
ai_strategy = {
    type = front_control
    area = suez
    priority = 1
    ratio = 0.2
    ordertype = invasion
    execute_order = yes
}
修改AI在指定前线给师团的命令。 可以同时使用多个目标类型,在这种情况下,必须满足每一个。这只改变分配给已经存在的前线的命令,不会改变分配给任何特定前线的单位数量,也不会强制创建任何单位。
前线单位请求 state = <state>
目标省份。

tag = <country>
目标国家。
strategic_region = <ID>
目标战略区域。
area = <state>
目标AI area
country_trigger = { ... }
目标国家的触发条件块。
state_trigger = { ... }
目标省份的触发条件块。 value = <int>
策略的权重。

ai_strategy = {
    type = front_unit_request
    tag = POL
    value = 100
}
ai_strategy = {
    type = front_unit_request
    country_trigger = {
        original_tag = SPR
        has_government = fascism
    }
    value = 100
}
让AI在指定的陆地前线上部署更多单位。 可以同时使用多个目标类型,在这种情况下,必须满足每一个。
入侵单位请求 state = <state>
目标州。

tag = <country>
目标国家。
strategic_region = <ID>
目标战略区域。
area = <state>
目标AI area
country_trigger = { ... }
目标国家的触发条件块。
state_trigger = { ... }
目标省份的触发条件块。 value = <int>
策略的权重。

ai_strategy = {
    type = invasion_unit_request
    state = 123
    value = 100
}
ai_strategy = {
    type = invasion_unit_request
    strategic_region = 42
    value = 100
}
让AI在进行对指定目标的海军入侵中部署更多单位。 可以同时使用多个目标类型,在这种情况下,必须满足每一个。
驻军 value = <int>
策略的权重。
ai_strategy = {
    type = garrison
    value = 10
}
控制用于防守胜利点和港口的单位数量,而不是让这些单位在前线活动。
驻军增援优先级 value = <int>
策略的权重。
ai_strategy = {
    type = garrison_reinforcement_priority
    value = 100
}
| 让AI优先增强驻军单位,以保护胜利点和海军基地。
|
|-id="ignore_army_incompetence"
|忽略军队无能
|<code>value = <int></code><br/>策略的权重。  
|<pre>ai_strategy = {
    type = ignore_army_incompetence
    value = 100
}
让AI在计算中忽略因师级缺乏经验而给予的修正值,从而让AI认为优势在我。
布置单位缓冲区 ratio = <decimal>
用于缓冲单位的数量。

order_id = 2
如果两个布置单位缓冲区策略使用相同的ID,它们的比率将共享,而不是相加。
states = { ... }
可缓冲单位的省份列表。
area = <AI area>
用于缓冲单位的AI区域。
subtract_invasions_from_need = yes
如果为真,区域内的海军入侵将不计入比率,即不防守海军入侵。默认为假。
subtract_fronts_from_need = yes
如果为真,区域内的陆地前线将不计入比率,即不防守前线。默认为假。

ai_strategy = {
    type = put_unit_buffers
    ratio = 0.2
    states = {
        123
        124
        125
        126
    }
    subtract_fronts_from_need = yes
}
让AI在指定区域保持一定比例的师级以进行驻军任务。
备用单位因子 value = <int>
策略的权重。
ai_strategy = {
    type = spare_unit_factor
| AI将使用更多单位来协防盟友。
|-id="theatre_distribution_demand_increase"
|战区分配需求增加
|<code>value = <int></code><br/>策略的权重。<br/>
<code>id = <state></code><br/>策略的目标州。<br/>
|<pre>ai_strategy = {
    type = theatre_distribution_demand_increase
    value = 10
    id = 123
}
让AI在指定省份的战区中投入更多单位。 值为1表示1个单位。
与海军管理相关的 AI 策略:
名称 参数 示例 描述 备注
strike_force_home_base value = <int>
策略的权重。

id = <strategic region>
策略的目标。

ai_strategy = {
    type = strike_force_home_base
    id = 18
    value = 70
}
促使 AI 在指定的战略区域内执行打击舰队任务。
与情报相关的 AI 策略:
名称 参数 示例 描述 备注
agency_ai_base_num_factories_factor value = <int>
策略的权重。
ai_strategy = {
    type = agency_ai_base_num_factories_factor
    value = 70
}
更改AI用于情报系统升级的基准权重。 值为 1 等于相对于 Defines 中规定的基准增加 1%。
agency_ai_per_upgrade_factories_factor value = <int>
策略的权重。
ai_strategy = {
    type = agency_ai_per_upgrade_factories_factor
    value = 70
}
调整用于计算AI情报机构升级所需的工厂数量。 值为 1 等于相对于 Defines 的基线增加 1%。
intelligence_agency_branch_desire_factor value = <int>
策略的权重。

id = <分支>
策略的目标。

ai_strategy = {
    type = intelligence_agency_branch_desire_factor
    id = branch_crypto
    value = 70
}
修改用于计算 AI 进行情报机构升级所需的工厂数量。 分支定义在 /Hearts of Iron IV/common/intelligence_agency_upgrades/*.txt 文件中。
intelligence_agency_usable_factories value = <int>
策略的权重。
ai_strategy = {
    type = intelligence_agency_usable_factories
    value = 8
}
修改 AI 为情报机构使用的工厂数量。
operation_equipment_priority value = <int>
策略的权重。
ai_strategy = {
    type = operation_equipment_priority
    value = 80
}
让 AI 优先为当下特勤行动提供足够的军事装备。
operative_mission value = <int>
策略的权重。

mission = <mission>
优先执行的任务
mission_target = <country>
目标国家
state = <state>
如果有效,则优先考虑目标国内的状态。可选。
priority = <int>
如果定义了矛盾的 AI 策略,则选择优先级最高的策略。

ai_strategy = {
    type = operative_mission
    value = 80
    mission = quiet_intel_network
    state = 123
    state = 321
    mission_target = ENG
}
使 AI 对目标执行指定的任务。 可以定义多个状态,导致其中一个状态被优先考虑。任务名称可以在 /Hearts of Iron IV/localisation/english/operatives_l_english.yml 中查看。例如,OPERATIVE_MISSION_BOOST_IDEOLOGY_TITLE:0 "Boost Ideology" 表示增强意识形态的任务为 boost_ideology。
operative_operation value = <int>
策略的权重。

operation = <mission>
优先执行的任务
operation_target = <country>
目标国家
state = <state>
如果有效,则优先考虑目标国内的状态。可选。
region = <strategic region>
如果有效,则优先考虑目标国内的战略区域。可选。
priority = <int>
如果定义了矛盾的 AI 策略,则选择优先级最高的策略。

ai_strategy = {
    type = operative_operation
    value = 80
    operation = heavy_water_raid
    operation_target = ENG
}
促使 AI 在目标上执行指定的操作。 可以定义多个状态,并使其中一个状态被优先考虑。操作在 /Hearts of Iron IV/common/operations/*.txt 文件中定义。
与生产、建设和招聘相关的 AI 策略:
名称 参数 示例 描述 备注
added_military_to_civilian_factory_ratio value = <int>
策略的权重。
ai_strategy = {
    type = added_military_to_civilian_factory_ratio
    value = 50
}
对 AI 希望保持的军事与民用工厂比例进行修改。 正值意味着更多的军事工厂。
air_factory_balance value = <int>
策略的权重。
ai_strategy = {
    type = air_factory_balance
    value = 50
}
对 AI 希望保持的空军生产与现有工厂的比例进行修改。 正值意味着更多的空军。
dockyard_to_military_factory_ratio value = <int>
策略的权重。
ai_strategy = {
    type = dockyard_to_military_factory_ratio
    value = 50
}
对 AI 希望保持的船坞与军事工厂的比例进行修改。 正值意味着更多的船坞。
railway_gun_divisions_ratio value = <int>
策略的权重。
ai_strategy = {
    type = railway_gun_divisions_ratio
    value = 5
}
对AI 希望保持的列车炮与师的比例进行修改。 基本比例为 Defines 中的 RAILWAY_GUN_PRODUCTION_BASE_DIVISIONS_RATIO_PERCENT,默认值为 0。这将在 0-100 的比例上进行累加。
build_building value = <int>
策略的权重。

id = <building>
策略的目标。
target = <state>
用于建设的省份。

ai_strategy = {
    type = build_building
    id = industrial_complex
    target = 803
    value = 1
}
AI将会在指定省份内建造特定建筑。 值决定了 AI 希望在该省份内同时建造多少座建筑。
building_target value = <int>
策略的权重。

id = <building>
策略的目标。

ai_strategy = {
    type = building_target
    id = industrial_complex
    value = 30
}
使 AI 保持对指定建筑更高的期望目标。
factory_build_score_factor value = <int>
策略的权重。

target = <state>
用于建设的省份。

ai_strategy = {
    type = factory_build_score_factor
    target = 365
    value = 1
}
让AI 在指定省份内建造建筑。
equipment_production_factor value = <int>
策略的权重。

id = <equipment archetype type>
策略的目标。

ai_strategy = {
    type = equipment_production_factor
    id = armor
    value = 30
}
AI 将生产指定类型的装备。 每种装备原型的类型在 /Hearts of Iron IV/common/units/equipment/*.txt 文件中的 types = { ... } 中定义。
equipment_production_min_factories value = <int>
策略的权重。

id = <equipment archetype type>
策略的目标。

ai_strategy = {
    type = equipment_production_min_factories
    id = artillery
    value = 3
}
促使 AI 在指定类型的装备生产线上保持更多的工厂。 值为 1 对应于 1 个军事工厂。每种装备原型的类型在 /Hearts of Iron IV/common/units/equipment/*.txt 文件中的 types = { ... } 中定义。
equipment_variant_production_factor value = <int>
策略的权重。

id = <equipment archetype>
策略的目标。

ai_strategy = {
    type = equipment_variant_production_factor
    id = light_tank_chassis
    value = -100
}
AI 将生产更多指定的军事装备。 军事装备在 /Hearts of Iron IV/common/units/equipment/*.txt 文件中定义。
equipment_stockpile_surplus_ratio value = <int>
策略的权重。
ai_strategy = {
    type = equipment_stockpile_surplus_ratio
    value = 30
}
改变 AI 在库存中保存的装备比例,这将不会使AI立即使用这些装备。
build_army value = <int>
策略的权重。

id = <equipment archetype>
策略的目标。

ai_strategy = {
    type = build_army
    id = suppression
    value = -1000
}
修改 AI 所需的军队编制数量。 使用的目标是AI templates.中的角色。
force_build_armies value = <int>
策略的权重。
ai_strategy = {
    type = force_build_armies
    value = 30
}
这将强制使 AI 建立超过所需数量的师级单位。
production_upgrade_desire_offset value = <int>
策略的权重。

id = <equipment type>
策略的目标。

ai_strategy = {
    type = production_upgrade_desire_offset
    id = artillery_equipment_2
    value = -50
}
将使AI升级生产线至指定的装备类型。 设备类型在 /Hearts of Iron IV/common/units/equipment/*.txt 文件中定义。
value = <int>
策略的权重。
role_ratio value = <int>
策略的权重。

id = <role>
策略的目标。

ai_strategy = {  
    type = role_ratio  
    id = paratroopers  
    value = 30  
}
修改AI为指定职能制作的编制数量。 职能在[[#AI templates|AI templates] 中定义,用于单位编制,而 [[#AI equipment|AI equipment] 中定义船只和坦克变体。
unit_ratio value = <int>
策略的权重。

id = <unit>
策略的目标。

ai_strategy = {  
    type = unit_ratio  
    id = cas  
    value = 30  
}
修改AI使用特种单位编成的编制的数量上限。 单位在 /Hearts of Iron IV/common/units/*.txt 文件中定义,包括空军和海军以及陆军。
min_wanted_supply_trains value = <int>
策略的权重。
ai_strategy = {  
    type = min_wanted_supply_trains  
    value = 300  
}
对AI所需的最低补给火车数量进行更改。
min_wanted_supply_trucks value = <int>
The weight of the strategy.
ai_strategy = {
    type = min_wanted_supply_trucks
    value = 30
}
AI 总体上所需卡车的最低数量。
其他 AI 策略:
名称 参数 例子 描述 备注
scorched_earth_prio value = <int>
策略的权重。

id = <country>
使用焦土政策的国家所有者。
states = { ... }
使用焦土政策的省份列表。

ai_strategy = {
    type = scorched_earth_prio
    value = 100
    id = ENG
    states = {
        123
        124
        125
        126
    }
}
AI 将会在指定省份使用焦土政策。
land_xp_spend_priority value = <int>
策略的权重。

id = <type>
策略的目标。

ai_strategy = {
    type = land_xp_spend_priority
    id = division_template
    value = 30
}
修改 AI 花费陆军经验的优先顺序。 原版游戏使用包括 division_templateupgrade_xp_cutoff
pp_spend_amount value = <int>
策略的权重。

id = <type>
策略的目标。

ai_strategy = {
    type = pp_spend_amount
    id = idea
    value = 100
}
AI 将保留的政治点数。 原版游戏使用包括 ideadecision
pp_spend_priority value = <int>
策略的权重。

id = <type>
策略的目标。

ai_strategy = {
    type = pp_spend_priority
    id = relation
    value = 100
}
对AI 花费政治点数的方向进行更改。 原版游戏使用包括以下内容:
  • admiral
  • guarantee
  • relation
  • decision
research_weight_factor value = <int>
策略的权重。

id = <type>
策略的目标。

ai_strategy = {
    type = research_weight_factor
    id = radio_detection
    value = 2000
}
修改 AI 对科研项目研发的权重(分数)。 value = 50 意味着增加 50%的增速,-30 意味着 30%的减速,等等。

AI 区域

AI区域在 /Hearts of Iron IV/common/ai_areas/*.txt 文件中定义。这些区域用于多种之前列出的AI策略,例如 area_priority。一个省可能属于多个AI区域,也可能不属于任何区域。启用debug调试模式后,鼠标悬停在一个省上将提供该省所属的AI区域的信息(如果有的话)。

每个AI区域在文件中都是一个单独的块,块的名称即为区域的名称。在这些块中,可以添加两项内容:
continents = { ... } 是构成该AI区域的地理区划列表。这在 /Hearts of Iron IV/map/continent.txt 中定义,并在 [[Map modding#Provinces|their definitions]中分配给省份,位置在 /Hearts of Iron IV/map/definition.csv。在AI区域的定义中应使用大陆的全名,而不是省份定义中使用的 ID。
strategic_regions = { ... } 是根据其 ID 号码构成该AI区域的战略区域列表。

如果定义了多个ai区域,省份必须属于其中任何(any)一个。

一个AI区域的代码示例如下:

my_ai_area = {
    continents = {
        europe
        africa
    }
    strategic_regions = {
        53  # Caribbean
        189 # Burma
    }
}

AI 焦点

主条目:AI focuses

AI焦点,定义在/Hearts of Iron IV/common/ai_focuses/*.txt文件,用于让游戏AI根据当前设置目标的焦点选择点哪些科技和国策。

AI 和平谈判

Pre-1.12 AI和平谈判
AI的和平谈判行为在 /Hearts of Iron IV/common/peace_conference/ai_peace/*.txt 文件中定义。
在定义国家使用的和谈AI时,游戏会选择第一个满足前提条件的定义。在这种情况下,文件是根据其文件名按顺序加载的,使用 ASCII character IDs

在评估和平会议时,使用 ROOT(默认作用域)表示当前评估的赢家,使用 FROM 表示当前评估的输家。此外,存在以下 temporary variables

  • taken_states@TAG 是一个数组,包含作为和谈中一部分被国家 TAG 吞并的省份。
  • taken_by@123 是占领指定省份的国家,在此情况下为 123。
  • current_states@TAG 是一个数组,包含在和谈中尚未决定的、处于赢得战争的 TAG 控制下的省份。
  • subject_states@TAG 是一个数组,包含在和谈中设置为转移给被 TAG 统治的国家的省份。
  • subject_countries@TAG 是一个数组,包含在和谈中被设置为受 TAG 统治的国家。
  • subjected_by@123 是设定在和谈中拥有指定省份的国家的宗主国,在此情况下为 123。
  • subjected_by@TAG 是一个数组,包含以 TAG 作为宗主国的国家。
  • liberate_states@TAG 是一个数组,包含将要转移给被 TAG 解放的国家的省份。
  • liberate_countries@TAG 是一个数组,包含被 TAG解放的国家。

enable = { ... } 触发块用于确定AI是否应启用。如果为真且没有其他先前加载的和平会议AI为真,则选择该AI。

游戏中使用的和平选项如下:

  • annex - 国家 FROM 被 ROOT 完全吞并。这仅评估国家。
  • liberate - 国家 FROM 被 ROOT 解放。
  • puppet - 国家 FROM 被 ROOT 作为傀儡。
  • puppet_all - 国家 FROM 被 ROOT 作为傀儡 并且 能够保留其全部的省份。
  • puppet_state - ROOT的省份 被转移到 FROM。FROM,该省份在和平会议中成为 FROM 的一部分。
  • take_states - FROM 的省份被 ROOT 吞并。
  • force_government - 国家 FROM 的意识形态被 ROOT 强制更改。

在评估和谈时,若给定省份的控制者与会议开始原本拥有该地块的国家相同,则所有者则是原所有者。 每个和平会议选项都是文件定义中的一个 MTTH block

代码示例:
my_peace_conference = {
    enable = {
        has_government = my_ideology_group
    }
    annex = {
        base = 500
        modifier = {
            factor = 0
            any_allied_country = {
                any_state = {
                    is_owned_by = FROM
                    is_core_of = PREV
                    NOT = {
                        is_core_of = ROOT
                        is_claimed_by = ROOT
                    }
                }
            }
        }
    }
    puppet = {
        base = 100
        modifier = {
            factor = 0
            FROM = { tag = QAT }
        }
    }
    puppet_all = {
        base = 0
    }
    puppet_state = {
        base = 100
        modifier = {
            factor = 0
            FROM.FROM = { tag = QAT }
        }
        modifier = {
            factor = 0
            any_allied_country = {
                ROOT = {
                    is_core_of = PREV
                    NOT = {
                        is_core_of = FROM.FROM
                        is_claimed_by = FROM.FROM
                    }
                }
            }
        }
    }
    take_states = {
        base = 100
        modifier = {
            factor = 0
            any_allied_country = {
                FROM = {
                    is_core_of = PREV
                    NOT = {
                        is_core_of = ROOT
                        is_claimed_by = ROOT
                    }
                }
            }
        }
    }
}


AI 策略计划

AI策略计划用于根据情况指导AI优先考虑的事项:选择哪些顾问、研究哪些技术、应用哪些AI策略、选择哪个国策等。这些计划比一般的AI策略更为详细,主要用于在游戏的大部分时间内告知一个国家的整体计划。一个国家可以同时定义和执行多个AI策略计划。

AI策略计划在/Hearts of Iron IV/common/ai_strategy_plans/*.txt文件中定义。在这些文件中,新策略计划作为一个新代码块进行定义,其名称必须与计划的内部ID相同。 在该计划中,name = "AI计划名称"desc = "AI计划描述"确定了策略计划的名称和描述。这并不打算向玩家展示,因此不需要将其本地化为不同的语言。相反的,这用于aiview控制台命令中,向开发者提供有关AI希望优先考虑的事项的信息。 allowed = { ... }类似于决议或ideas,是一个触发块,仅在游戏开始时检查。这主要是用来决定要在什么国家和扩展包中使用这个策略计划。 enable = { ... }游戏时间内每天检查一次,看看是否满足allowed条件。如果满足enable = { ... },则该AI策略计划将分配给AI,无论之后enable = { ... }是否变为false。通常情况下, Triggers#has_game_rule用于与自定义游戏规则搭配,以决定AI将选择的路径。is_historical_focus_on 常与默认AI设置一起使用,国家的flags可以通过设置on_startup来实现随机化,使用random_list来设定随机值。 abort = { ... }游戏时间内每天检查一次,以使AI在enable = { ... }条件满足时 停止 使用该AI策略计划。因此,必须是false的情况下,才能使AI策略计划有可能被选择。 ai_national_focuses = { TAG_focus_name_1 TAG_focus_name_2 } 是一个国家国策的列表,以空格分隔,按照 AI 应该采取的顺序排列。在这个例子中,AI 将首先尝试进行 TAG_focus_name_1国策。若 TAG_focus_name_1 已经完成,或无法进行,那么 AI 将尝试进行 TAG_focus_name_2国策。如果这两个国策由于已完成或者未满足前提条件而都无法进行,AI 将转向其他国策,同时考虑 ai_will_do = { ... } 的内容。在按设定好的国策优先进行顺序下,AI 会忽略 ai_will_do = { ... } 的值。 focus_factors = { ... } 为指定国策的 ai_will_do 值分配一个乘数。这个块中的一个条目看起来像 TAG_focus_name = 3。在这种情况下,这将使该国策的 ai_will_do 值乘以 3,假设 AI 策略计划的权重为 1。如果国策项在应用修正因子后具有 4 的 ai_will_do 值,那么在跟随此策略计划时,它将变为 12,并视为这样的处理。当然,因子为 0 将使该国策项在没有在 ai_national_focuses 中指定的情况下永远不会被选择。这可以作为一种更快书写或更随机的方式,使 AI 通过使它不应选择的国策具有 0 值来实现让其遵循某种政治路径。 research = { ... } 为指定科研槽的 ai_will_do 值分配一个乘数。这个块中的一个条目看起来像 artillery = 3。在这种情况下,这将使该类别内每一项科研项的 ai_will_do 值乘以 3,假设 AI 策略计划的权重为 1。其他内置修正因子仍然适用,但这将增加它们的可能性。 其他也分配增益的块还有 ideas = { ... }traits = { ... },格式类似。ideas 块用于单个idea(如法律条例或设计商)或顾问(使用 idea_token 在条目中),而 traits 则用于给ideas/顾问的分配国家领导者特质。 ai_strategy = { ... } 允许在策略计划开启时应用 AI strategyweight = { ... } 是一个 MTTH block ,为计划分配一个整体权重。这使得 AI 策略计划中的每个因子在应用之前都乘以权重。例如,权重为 1.25 将使国策因子 4 变为 5 之后再应用。这可以在某些情况下使 AI 更严格地遵循策略计划,而在其他情况下则执行的相对宽松。

代码示例

BHR_historical = {
    name = "Historical plan for BHR"
    desc = "4 focuses in a specific order"
    allowed = {
        tag = BHR
    }
    enable = {
        OR = {
            AND = {
                is_historical_focus_on = yes
                has_game_rule = {
                    rule = BHR_ai_behavior
                    option = DEFAULT
                }
            }
            has_country_flag = BHR_AI_RANDOM_HISTORICAL # Randomly set in on_actions if BHR_ai_behavior is set to RANDOM. Make sure to set that up!
            has_game_rule = {
                rule = BHR_ai_behavior
                option = HISTORICAL
            }
        }
    }
    abort = {
        OMA = {
            OR = {
                has_government = fascism
                has_government = communism
            }
        }
    }
    ai_national_focuses = {
        BHR_focus_name_1
        BHR_focus_name_2
        BHR_focus_name_3
        BHR_focus_name_4
    }
    ideas = {
        BHR_advisor = 3
    }
    traits = {
        fascist_demagouge = 0
    }
    ai_strategy = {
        type = invade
        id = OMA
        value = 200
    }
}
BHR_alternate = {
    name = "Alternative plan for BHR"
    desc = "AI is just set to never do BHR_focus_name_2 and be more likely to do BHR_focus_name_5, especially if after 1937"
    enable = {
        OR = {
            has_country_flag = BHR_AI_RANDOM_ALTERNATE # Randomly set in on_actions if BHR_ai_behavior is set to RANDOM. Make sure to set that up!
            has_game_rule = {
                rule = BHR_ai_behavior
                option = ALTERNATE
            }
        }
    }
    focus_factors = {
        BHR_focus_name_2 = 0
        BHR_focus_name_5 = 2
    }
    weight = {
        modifier = {
            factor = 2
            date > 1937.1.1
        }
    }
    research = {
        artillery = 2
    }
}

AI 部队编制

/Hearts of Iron IV/common/ai_templates/*.txt 文件用于定义AI在编制编成窗口中所追求的模板。

部队编制被定义为文件夹中任何文件内的一个块,块的名称与部队编制的名称相同。
这些参数用于部队编制本身:

  • roles = { ... } 是编制所包含的部队类型列表。这些可以是任何东西,用于 role_ratio AI strategy。AI将会为所拥有的每个师创建一个编制。
  • available_for = { ... } 在此列表外的国家将不允许使用如下编制。如果未指定,则每个国家都将使用它们。
  • blocked_for = { ... } 在此列表内的国家将不允许使用如下编制。这个参数只有在没有 available_for = { ... } 块时才会被使用。
  • match_to_count = 0.3 是一个在 0-1 的范围内的十进制数,用于判断一个现行部队编制是否符合对应职能编制。默认值设置为 0.5。
  • upgrade_prio = { ... } 是一个 MTTH block ,决定职能编制相对于其他在花费经验进行提升时的“重要性”。如果有多个职能编制具有相同的职能,则优先级最高的编制会被使用。在别的情况下,此条优先级定义会影响其与不同编制相比的概率。

此外,在职能编制中,每个单独的编制被定义为一个其名称是编制的块。它可以是任何名称,只要在文件中没有重名即可。
这些参数在编制定义中使用:

  • upgrade_prio = { ... } 是一个 MTTH block ,决定了该编制相对于职能编制中其他编制在花费经验进行升级时的权重。
  • production_prio = { ... } 是一个 MTTH block ,决定了该编制相对于职能编制中其他编制在实际生产时的权重。
  • replace_with = my_other_template 指定了一个不同的编制,作为该编制的新版本。当创建该新编制成为可能时,AI将尝试转向使用此新的编制。
  • can_upgrade_in_field = { ... } 是一个触发块,决定AI何时尝试升级已分配此编制的部队到将要替换的编制。
  • custom_icon = 10 指定AI为该编制分配的图标。这个代码例将使用 GFX_div_templ_10_largeGFX_div_templ_10_small Sprite为编制分配图标。此项为可选,默认为编制中绝大多数旅的图标。
  • reinforce_prio = 2 指定AI在该编制上设置的装备增援优先级。默认优先级为 1,在游戏中显示为“常规”。0 为“后备”,2 为“精英”。如果未设置,默认为 1。
  • target_width = 20 指定AI针对该编制的目标作战宽度。
  • width_weight = 2.5 指定AI在多大程度上应该专注于目标宽度。权重越高,AI越会避免偏离目标宽度。
  • column_swap_factor = 0.3 指定了AI将整个列交换到不同子单位组以满足编制的可能性。
  • stat_weights = { ... } 是一个十进制值列表。每个值适用于不同的统计数据,并决定AI应该优先考虑什么,以及应该避免什么。与 NDefines.NAI.DIVISION_DESIGN_WEIGHTS in Defines一样,这些统计数据首先是 17 个陆军值,然后是对空攻击,接下来是共同值和特殊值。换句话说,与空军和海军有关的值除对空攻击外都被跳过,对空攻击来自于防空装备。这个值将添加到定义中的默认值:0.00 意味着与默认优先级相同。
  • allowed_types = { ... } 是一个AI可以添加到编制中的营级单位列表。如果某个类型被标注省略,AI将永远不会添加它。这可以用来确保AI不会在编制中放入不同种类的单位,例如在一个移动轻坦克师中放置步兵,从而减缓其速度。
  • target_template = { ... } 指定AI应力求达到的编制。特别地,这些参数放在其中:
    • weight = 0.8 是AI应该多大程度上去靠近这个编制。
    • match_value = 5000 是一个值,决定了如果与目标编制匹配,该编制对AI的价值。
    • support = { ... } 是目标编制内支援连的列表设定。单个定义的格式为 artillery = 1。先确定单位类型,再决定数量。由于只允许一个相同支援连的存在,因此数量不能是其他值,只能是 1。
    • regiments = { ... } 是目标编制内常规营的列表。单个定义的格式为 artillery_brigade = 4。首先确定单位类型,再确定值数量。

相同职能的编制将被汇总为同一个职能组,然后每个可用编制将会进行适应性评分计算,以确定哪个编制在特定的时刻与军事目标应当被使用。

代码示例

armor_BHR = {

    available_for = {
        BHR
    }

    roles = {
        armor
    }

    upgrade_prio = {
        factor = 2.17

        modifier = {
            factor = 7
            OR = {
                has_tech = basic_medium_tank
                has_tech = basic_medium_tank_chassis
            }
        }

        modifier = {
            factor = 2
            OR = {
                has_tech = main_battle_tank
                has_tech = main_battle_tank_chassis
            }
        }
    }

    match_to_count = 0.5

    medium_armor_BHR = {


        upgrade_prio = {
            factor = 2
        }

        target_width = 19.9
        width_weight = 3.0
        column_swap_factor = 0.1

        stat_weights = {
            0.00 #-- default_morale
            1.10 #-- defense
            1.10 #-- breakthrough
            1.60 #-- hardness
            1.00 #-- soft_attack
            2.00 #-- hard_attack
            0.10 #-- recon
            0.01 #-- entrenchment
            0.10 #-- initiative
            0.01 #-- casualty_trickleback
            -0.05 #-- supply_consumption_factor
            -0.01 #-- supply_consumption
            0.00 #-- suppression
            0.00 #-- suppression_factor
            0.01 #-- experience_loss_factor
            0.00 #-- equipment_capture_factor
            0.00 #-- fuel_capacity
            #-- Air Values
            0.02 #-- air_attack
            #-- Common Values
            50.00 #-- max_organisation
            0.80 #-- max_strength
            1.0 #-- maximum_speed
            10.0 #-- armor_value
            0.05 #-- ap_attack
            0.10 #-- reliability
            0.10 #-- reliability_factor
            0.00 #-- weight
            0.00 #-- fuel_consumption
            0.00 #-- fuel_consumption_factor
            0.00 #-- strat_attack
            0.00 #-- carrier_size
            0.00 #-- acc_hot_gain
            0.00 #-- acc_cold_gain
            0.00 #-- build_cost_ic
        }


        target_template = {
            weight = 0.9
            match_value = 7000.0

            support = {
                engineer = 1
                maintenance_company = 1
                logistics_company = 1
            }

            regiments = {
                medium_armor = 6
                motorized = 5
            }
        }

        allowed_types = {
            modern_armor
            medium_armor
            motorized
            mechanized
            infantry

            motorized_rocket_brigade

            engineer
            mot_recon
            armored_car_recon
            light_tank_recon
            signal_company
            maintenance_company
            logistics_company

            anti_tank
            military_police
            artillery
            anti_air
            rocket_artillery
        }

        replace_at_match = 0.8
        replace_with = modern_armor_BHR
        target_min_match = 0.5
    }

    modern_armor_BHR = {

        upgrade_prio = {
            factor = 2

            modifier = {
                factor = 1
            }
        }

        target_width = 19.9
        width_weight = 3.0
        column_swap_factor = 0.1

        stat_weights = {
            0.00 #-- default_morale
            1.10 #-- defense
            1.10 #-- breakthrough
            0.60 #-- hardness
            2.00 #-- soft_attack
            0.00 #-- hard_attack
            0.10 #-- recon
            0.01 #-- entrenchment
            0.10 #-- initiative
            0.01 #-- casualty_trickleback
            -0.05 #-- supply_consumption_factor
            -0.01 #-- supply_consumption
            0.00 #-- suppression
            0.00 #-- suppression_factor
            0.01 #-- experience_loss_factor
            0.00 #-- equipment_capture_factor
            0.00 #-- fuel_capacity
            #-- Air Values
            0.02 #-- air_attack
            #-- Common Values
            50.00 #-- max_organisation
            0.80 #-- max_strength
            10.0 #-- maximum_speed
            0.20 #-- armor_value
            0.05 #-- ap_attack
            0.10 #-- reliability
            0.10 #-- reliability_factor
            0.00 #-- weight
            0.00 #-- fuel_consumption
            0.00 #-- fuel_consumption_factor
            0.00 #-- strat_attack
            0.00 #-- carrier_size
            0.00 #-- acc_hot_gain
            0.00 #-- acc_cold_gain
            0.00 #-- build_cost_ic
        }

        target_template = {
            weight = 0.9
            match_value = 9000.0

            support = {
                engineer = 1
                recon = 1
                maintenance_company = 1
                logistics_company = 1
            }

            regiments = {
                modern_armor = 4
                mechanized = 3
                medium_sp_artillery_brigade = 2
            }
        }


        allowed_types = {
            modern_armor
            mechanized
            motorized_rocket_brigade
            medium_sp_artillery_brigade
            engineer
            recon
            signal_company
            maintenance_company
            logistics_company

            anti_tank
            military_police
            artillery
            anti_air
            rocket_artillery
        }
    }
}

AI 军事装备

/Hearts of Iron IV/common/ai_equipment/*.txt 文件用于定义AI在为坦克或舰船变体分配模块时应该追求的装备变体。

军事装备设计模板定义为文件夹内任何文件中的一个块,其名称与模板的名称相同。
这些参数用于装备模板设计本身:

  • category = <land|naval|air> 决定模板是用于坦克、舰船还是飞机。
  • roles = { ... } 是模板所具有的职能的列表。这些可以是任何内容,用于 role_ratio AI strategy。AI会尝试为他设计的每个职能装备拥有一个变体。
  • available_for = { ... } 处于列表外的国家将不能使用该装备模板。如果未指定,则所有国家均可使用。
  • blocked_for = { ... } 处于列表内的国家将不能使用该装备模板。只有在没有 available_for = { ... } 块时需要此项。
  • priority = { ... } 是一个 MTTH block ,决定该装备模板相对于其他模板在花费军事经验进行升级时的“重要性”。如果有多个装备模板具有相同的职能设计,则使用优先级最高的。除此之外这会决定与不同模板相比后选择的概率。

此外,在装备模板内,其中的独立设计被定义为一个块,名称为设计名称。在没有重复的前提下可以是任何内容。
这些参数用于设计定义中:

  • name = angry_speedboat 对于使该装备能够作为预设使用是必不可少的。若未定义,例如德国的 light_tank_artillery_2 将使用 GER_light_tank_artillery_equipment_2_short 的本地化(如果本地化已定义)。
  • role_icon_index = 2 用于为“舰船”分配特定的职能图标。此部分代码在陆地装备中无效。图标作为 naval_equipment_role = { ... } 的一部分在 /Hearts of Iron IV/gfx/army_icons/army_icons.txt 中定义。
  • priority = { ... } 是一个 MTTH block ,决定该设计相对于装备模板内其他槽位在花费军事经验进行升级时的“重要性”。
  • enable = { ... } 是一个触发块,决定AI何时会专注于达到该设计。
  • allowed_types = { ... } 是一个子单位的列表,AI可以将其添加到设计中。可以通过自定义去除其中的项来让AI不将其编入编制,例如可以使AI不在在机动轻型坦克师中加入步兵,防止师速度因此减慢。
  • target_variant = { ... } 指定AI应该追求的变体。具体来说,有如下参数:
    • match_value = 5000 用于决定如果现有编制匹配该模板,其对于AI的价值权重多少。
    • type = light_tank_chassis_0 是部队编制设计中必须使用的特定装备类型。
    • modules = { ... } 是装备应具备的模块列表,包括:
      • main_armament_slot = tank_flamethrower 决定指定模块槽的要求。该要求可以是模块类别、特定模块或是empty字符使其为空。如果指定为模块,可以使用greater-than(>)或less-than(<)以要求更好或更次的模块:以上根据模块中定义的年份决定。如果指定了更次,AI会倾向于最旧的模块;如果指定了更好,AI会倾向于最新的模块。如果指定为empty即空槽的情况下,使用greater-than(>)可以确保该槽位“不是”空的。
      • main_armament_slot = { ... } 允许为模块槽指定更多细节:
        • module = tank_flamethrower 决定该槽的模块要求。这与之前的 main_armament_slot = tank_flamethrower 完全相同:允许使用模块类别、模块或empty,并且可以以相同的方式使用等号。
        • any_of = { ... } 是一个模块或模块类别的列表。模块槽至少必须有列表中的一项。
        • upgrade = current 确保在将变体升级以匹配该设计时,必须使用与现有装备相同的模块。如果使用大于符号 (>),则还可要求AI对该槽进行部件升级。
    • upgrades = { ... } 是设计应具备的一系列升级,具体包括:
      • tank_nsb_engine_upgrade = 3 决定指定升级应具有的AI优先级,设定为一个固定数字。
      • tank_nsb_engine_upgrade = { ... } 是一个MTTH block,通过动态绑定分配AI对指定部件升级的优先级。
  • requirements = { ... } 是AI“必须”拥有的模块列表。它遵循与目标变体的模块块中指定的模块槽相同的格式:module = tank_flamethrowerany_of = { ... } 等。然而其并不与特定的槽相绑定。
  • allowed_modules = { ... } 是在满足目标变体中的要求后,AI可以使用的模块列表。AI将永远不会选择列表外的模块。首先指定的模块优先级高于后指定的。

代码示例

BHR_light_tanks = {
    category = land

    available_for = {BHR}

    roles = {
        land_light_tank
    }

    priority = {
        factor = 1000
    }

    great_war_tank_default = {
        priority = {
            factor = 1
            modifier = {
                has_tech = basic_light_tank_chassis
                factor = 0 #let's not waste XP here
            }
        }

        target_variant = {
            match_value = 1000
            type = light_tank_chassis_0
            modules = {
                main_armament_slot = tank_heavy_machine_gun
                turret_type_slot = tank_light_one_man_tank_turret
                suspension_type_slot = tank_bogie_suspension
                armor_type_slot = tank_riveted_armor
                engine_type_slot = tank_gasoline_engine
                special_type_slot_1 = empty
                special_type_slot_2 = empty
                special_type_slot_3 = empty
                special_type_slot_4 = empty
            }
            upgrades = {
                tank_nsb_engine_upgrade = 3
                tank_nsb_armor_upgrade = {
                    base = 1
                    modifier = {
                        add = 1
                        has_war = yes
                    }
                }
            }
        }

        allowed_modules = {
            tank_heavy_machine_gun
            tank_light_one_man_tank_turret
            tank_bogie_suspension
            tank_riveted_armor
            tank_gasoline_engine
        }
    }
}