Modding ai files

From Hearts of Iron 2 Wiki
Jump to navigation Jump to search

Hints & Warnings

An ai file does not need to include all variables. Only the variables included will modify whatever existing variable values are in usage.

A scenario will load the ai file with TAG_year.ai if no other file is specified in the .INC file for that nation. In order to specify a custom ai file in the .INC file of a nation, you have to add an

ai = "nameoffile.ai"

inside the "country = {...}" section.

This can result in confusing problems. For example if you have a GER_1936.ai file and a GER_1938.ai file by default the 1938 campaign will load the GER_1938.ai file without ever having loaded the GER_1936.ai file. So if the GER_1938.ai file is not a complete ai file you might not realize that many variables won't be initialized. This occurs in Paradox v1.2 1938 campaign where Spain and USA load partial files without the base 1936 ai info thus leaving screwed up default values (like neutrality!).

None of the existing ai files use the "max_redeploying" variable so this is an easy one to overlook. All nations will have the default of 25%. Reducing this value may help avoid the strategic redeployment shuffle issues that nations like Russia have.

Paradox Docs

Note: This is straight from the ai_file_doc.txt in the Docs folder in the HoI2 directory. I'm still playing around with these settings to get a feel for them, but I figured I would post this here, if for nothing more than for people to be able to reference them when they are not at their normal computer (work or something). Feel free to comment and discuss these things (all you guys at DAIM!)

From the beginning. I'll work my way through this as I get more competent in modding AI files, but I'm still working on it. Feel free to comment or edit.

 switch = [yes/no]			

As the note says next to this, if it is set to "no" then it will not look for a new file at the beginning of each year. However, it will still switch if an event causes it (ai_switches.txt events, for example). For some countries, like the US, that would mean they would never gear up for war, etc. Be careful. However, if you modify this and you want it to stay this way, then use a no here and remove any switch events from the ai_switches.txt event file to prevent it from change.


# Inter-Agent distribution variables

flags = {
  	testflag = yes
  	invade_albania = no
  	assist_finland = no
    }

# Modifier to chance that country will accept a demand for territory.
claim_acceptance = X 

# The countries we will demand territory from if we have claims on them.
demand_claims = {
	EST
	LAT
	ROM
	LIT
	FIN
}

# The countries we will set free if we control their territory.
liberate = {
	LIT
	FIN
} 
 

# Special resistance against "influence" by the listed nations. Value range = [0 - 10]
resistance = { 
	ROM = 8
 }

Here, as the note says, is how much harder it is for nations to influence this nation. This setting is handy if you don't want the US to get too friendly with Germany or Japan (or the Confederates, if they exist). A setting of 0 means that there isn't any resistance, ie treated normally (I believe).

# Country tags listed with a value specifying how much we want to destroy them.
combat = {
	ENG = 60
	FRA = 70
}

Again, as the note says, this is how much you want to destroy them. After playing around with this, if you set it to 100, the nation will basically avoid all others to try and destroy this. It also goes after those nations in descending order. So, in this case, France will be the first nation it targets, and after defeating France, it will face off with England.

 # Countries listed here are considered withing our 'sphere of influence'. We will strive to guarantee their independence.
protect = {
	TUR = 100
	DAN = 100
}

Now, if you look at the US ai file, you'll notice this is much longer. This is the nations that the ai will guarantee. Also, I believe the higher the value, the more likely the ai will actually intervene militarily in the attack.

# Countries listed here are considered our natural allies. We will try to influence them and ally with them.
befriend = { 
       TUR = 100
	DAN = 100
}

Lets say you want Canada to not join the allies? Then remove the allied tags from its ai file. Again, higher number means priority. I haven't checked to see how the ai deals with a GER and FRA both at 100. I'll report once I know.

# Provinces with an assigned priority. These are strategic goals for the AI (it will try to take them in wars and demand them in peace treaties.)
target = {
	324 = 50 # 1 - 100
}

This is something that you can mess with and totally change the ai's actions. If you change the province ID to one deep in their territory, the ai will fight to that point. However, if only on the borders, the AI might not continue the advance. Handy if you want the ai to only seize sea provinces, etc.

upgrading = 0.1		#max % of ic used on this slider.
reinforcement = 0.1	#max % of ic used on this slider.

Basically self explainatory...

desperation = 0.3	#If more than this % of ic is occupied by enemy, panic and build militia hordes.

This is one of those thing that you can also do to set the ai to change its actions. Be careful though. If too low, the AI will build militia and it can very well be a death knell. However, too high and the AI won't have enough time to build them (or the IC). Good for making a small nation pull its population to fight (ie the Swiss, for example). Can be very funny to watch suddenly 10 divisions pop up.


# The ETA at which the AI uses strat. redeploy.
strat_redeploy_threshold = [days]

# Proportion of divisions that may be strategically redeploying at the same time. Default: 0.25
max_redeploying = X

Self explainatory...

# The "war monger" value affects the propensity of a country for declaring wars:
war = 50 

This is fun to play with. The higher, the more likely it will declare war. This is something that the switches tend to change, as well as a few others below. A setting of 100 means they are just itching for a fight.

# The tendency of a nation to create and accept alliances, and accept military access.
# The higher the value, the more "neutral" the nation.
# NOTE: this does not affect the tendency of a nation to start wars.
neutrality = 0 # Total neutrality at about 100 to 150

Self explainatory, expect for one thing. If the neutrality is over 100, the nation basically will never join alliances. This effect can be seen directly if you change it and then reload the scenario and ask for an alliance (the chance of acceptance, ie).

Actual neutrality is a combination of this value and the value of the Interventionism vs Isolationism government slider and the current "relations". I recommend in general neutrality should never be less than 100 or it will be too easy to form alliances. At neutrality = 150 all other factors are ignored and you have guaranteed neutrality. For more details see my webpage [1] on creating alliances. Some nations like Argentina have government leaders that create exceptional situations. - Mithel

max_front_ratio			= X		# The max wanted friendly-to-enemy division ratio along the front. Default is 4.0.
max_front_ratios = { 			# Override the default against specific countries. Ignored against humans.
	FIN = 2.0  
	... 
}

This is very handy for creating a good front. I tend to prefer (as a human player) at least 2:1 over my enemies, but if there is a higher tech nation on the border, you might want to change the specific front (the second section) to 6:1 or even higher. One big note, this doesn't mean that the AI will build divisions, but rather try to deploy them in this fashion.

# Proportion of our land divisions that we are prepared to relinquish control over.
# NOTE: Do not set too low - the AI must be allowed to give over control of its forces in "allied war zones". Default: 0.75.
exp_force_ratio		 	= 0.75
# Will never send exp. forces _overseas_ to these countries:
# NOTE: May still give some to neighboring allies though.
no_exp_forces_to = {
	TAG
	...
}

This setting will modify how likely they are to send troops to allies. As the note says, don't set to low. The second section is just as important, because if they can't get transports over there to get them back... well, you can see what would be wrong with that.

max_garrison_prop		= [0.0-1.0] 	# The war-time desired proportion of troops allocated to garrison duty
min_garrison_prop		= [0.0-1.0] 	# The war-time minimum proportion of troops allocated to garrison duty
# NOTE: In areas without fronts, _all_ land units are controlled by the Garrison AI (except forces preparing for an invasion.)

Self explainitory...

construction = {
	max_factor			= [0.0-1.0]		# Proportion of Production IC that should be used for province  buildings.

	AA_batteries	 	= [yes/no/atwar/not_atwar]	# yes = all the time, no = none, atwar = build during wars,  not_atwar = build during peace
	max_AA_level		= X				# Don't improve beyond this level.
	AA_provs			= { ... }		# List of prioritized provinces

	coastal_fort 		= [yes/no/atwar/not_atwar]
	max_coastal_level	= X				# Don't improve beyond this level.
	coastal_fort_provs	= { ... }		# List of prioritized provinces

	radar_station 		= [yes/no/atwar/not_atwar]
	max_radar			= X				# Don't improve beyond this level.
	radar_provs			= { ... }		# List of prioritized provinces

	air_base 			= [yes/no/atwar/not_atwar]
	max_air_base		= X				# Don't improve beyond this level.
	air_base_provs		= { ... }		# List of prioritized provinces

	naval_base 			= [yes/no/atwar/not_atwar]
	max_naval_base		= X				# Don't improve beyond this level.
	naval_base_provs		= { ... }	# List of prioritized provinces

	land_fort			= [yes/no/atwar/not_atwar]
	max_land_level		= X				# Don't improve land forts beyond this level.
	fort_borders = {					# Build land forts along these borders
		GER,
		ITA,
		...
	}
	fort_provs		= { ... }	# List of prioritized provinces

	ic_at_war			= [yes/no] 		# Normally, we always build IC if there is a large resource  surplus. The exception could be during wars.
	force_ic_until		= X				# Ignore presence of a resource surplus and build IC anyway,  until year X. (Useful for countries anticipating expansion.)
	ic_end_year			= X				# Stop building IC at the end of year X.
	IC_provs			= { ... }		# List of prioritized provinces
}

These control settings control how the AI builds province buildings. Most of the comments are pretty self-explanitory.
In the _provs sections, you should put province IDs in the field.

garrison = {

	# OVERSEAS GARRISONING:
	defend_overseas_beaches = [yes/no] # "no" is default

	# Basic need is X divisions per area where X is: number of provinces - attrition provinces
	home_multiplier = X # In home area, multiply basic need by X. Default: 0.5
	overseas_multiplier = X # In other area, multiply basic need by X. Default: 0.3333
	home_peace_cap = X # If at peace, we need at most X divisions in our capital area.
	war_zone_odds = X  # Default: 2.0 (strive to transport in 2x enemy nr of divisions)
	area_multiplier = { # If an area contains a specific province, multiply the basic need by value (overrides  overseas_multiplier, but if it is the home area it is ignored.)
		155 = 1.5
		....
	}

These control the AI defense priority. Once again, Pretty Self-explainitory.
Incase you're wondering how the area multiplier works, you just place ProvinceID = Multiplier Inbetween the brackets. You can place multiple province multiplies in the same area multiplier, It's not limited to just one.
These settings can really make or break an AI, If this is your first time modding an AI file, It is recommended to go with the default values, lest the AI can really get screwed up.

	# PRIORITIES:

	beach = 50					# Beach prio
	capital = 100				# Our capital
	human_border = 210			# Ignored for allied human players
	war_target = 100			# The next country targeted for attack by this AI

	reserves = 20	# bonus for provinces just behind a frontline.

	opposing_alliance = 100		# For neutrals, all alliances are "opposing"
	claim_threat = 100			# If we are neutral, countries with claims on us get this
	unstable_border	= 50		# Bordering countries at war with someone else get this

	# Borders with specific countries
	country_priorities = {
		ENG = 30
		FRA = -1	 # Override "opposing_alliance", "claim_threat" and "unstable_border" values and set to 0.
		...
		...
	}

	# Specific provinces
	province_priorities = {
		527 = 50 	# Province 527 has prio 50
		1123 = -1	# Negative value will override _all_ other priorities and set to 0.
		...
	}
	
	ignore = {
		1123	#Will set prio to 0...
	}

	key_point_prio_mult		= [Value]	# Value * key point value in a province = prio for that province
}

These are also deciding factors in AI priorities. For fields mentioning provinces, you place Province ID = Priority. The only difference between most of these and the garrison priority is that these also affect AI offensives.

front = {
	river = 		x   	(What to multiply attacking power with if crossing a river. < 1.0 is an advantage..)

	# the following modifies the odds-strength for defender.   (1.0 = no difference.)
	largefort 	= x #for forts above level 6.
	smallfort	= x #for forts 6 and below
	occupied	= x #for surrounded pocket at enemy territory
	owned		= x #for surrounded pocket at own territory

	#Odds modifiying variables
	# the following is to reduce odds-strength for attacker.
	frozen_attack 	= 0.50
	snow_attack 	= 0.50
	blizzard_attack = 0.25
	storm_attack 	= 0.60
	muddy_attack 	= 0.75

	#reduces the size of odds in total.. (1.0 = no difference, 0.5 = halved.)
	jungle_attack 	= 0.85
	mountain_attack	= 0.60
	swamp_attack 	= 0.60
	forest_attack 	= 0.85
	hill_attack 	= 0.75
	urban_attack 	= 0.40
	
	# Proportion of divisions in a front province that may be used to support the defense of neighboring provinces. Default  0.33

As of 1.2, these particular fields are all outdated and no longer have any effect.

	support_defense_prop = X

	recklessness 		= 	[0-3]
	
	# Even - Distribute forces evenly along the whole front.
	# Reactive - Try to match enemy troop concentrations.
	# Defensive - More troops in strategically important provinces (IC, Victory Points, Oil, etc)
	# Offensive - Concentrate more troops where the enemy us weak
	# Operational Defensive - The fewer avenues of escape, the less troops (to avoid encirclement.)
	distrib_vs_ai 		= 	[even/reactive/defensive/offensive/op_defensive]
	distrib_vs_human 	= 	[even/reactive/defensive/offensive/op_defensive]

Support defense determines how many troops the AI will send to try to support a province under attack
Recklessness determines how many risky attacks the AI will try to pull off, Settting it low will mean that the AI won't take any risks, Setting it too high makes the AI suicidal.

The distribution fields must have said values in them. even/reactive/defensive/offensive/op_defensive. You can look at the above comments to see what each does.

	# Countries we do not counter-attack for a certain number of days
	enemy_handicap = {
		# NOTE: These values are ignored for human-controlled enemies.
		# CAUTION: Values apply for _every_new_ war with a set nation.
		ENG = 100
		FRA = 120
		...
		...
	}

	passivity = { # Against specified enemies.
		# Valid values: 0-100 (%)
		ENG = 0
		FRA = 50
		...
		...
	}
	
	province_priorities = {
		527 = 0.2	#Only assign 20% of desired forces to cover the province 527
		...
	}

The first field is pretty self-explanitory, just a note for those of you wondering. Those values aren't the actual amount of days before another attack :P.
The next field, Passivity, automatically makes the AI stop conducting attacks against that country unless they have good odds. The higher this value is, the slower the AI will tend to advance. As an example, once Japan has taken most of northeastern china, Their passivity for all the chinas is set to 90+.
The last line is another province priority modifier(Getting kinda redundant huh?). This one can be used to set values for certain provinces lower then normal(IE 0.X)

 	reserve_prop			= 	[0.0-1.0]	# Maximum proportion of total divisions in a front allowed to   remain behind the front line ( HQs and divisions needing to recover.)
 
	panic_ratio_vs_ai		=	X	# Front requests more troops if outnumbered by this factor. NOTE: this  results in troops being drawn from garrison duties, etc, so set HIGH.
	panic_ratio_vs_human	=	X	# Front requests more troops if outnumbered by this factor. NOTE: this results  in troops being drawn from garrison duties, etc, so set HIGH.

	enemy_reinf_days 		= 	X	# Count enemy units less than X days from a target province in odds  calculations

	base_attack_odds		=	X	# Will attack at X odds or better
	min_attack_odds			=	X	# If stalemated for a long period, may go as low as these attack odds
	max_attack_odds			=	X	# Don't use more force than necessary to reach these odds
	reinforce_odds			=	X 	# Send in more troops if the attacking force is at these odds
	withdraw_odds			= 	X	# Break off attacks and withdraw at these odds
	# NOTE: the calculations for retreating from _defensive_ positions are too complex to condense to a few variables
	# NOTE: will _also_ retreat if the average organization is too low
}

These are used to determine the AI's actual combat priority. All of these use the stand proportion values (0.5/1.0/2.0) and not word values (Low/High) incase the panic_ratio_vs_ confused you.
For enemy_reinf_days the AI will look behind the frontline and look for enemy units that are coming to reinforce the front line, then move it's troops accordingly. Example: Setting this value at double(2.0) will have the AI try to bring twice as many troops as the enemy is bringing in reinforcements.
withdraw_odds,base_attack_odds,min_attack_odds,max_attack_odds, and reinforce_odds are based on combat effectiveness. Example: If you set withdraw_odds to 2.0, when the AI comes under attack and the enemy has twice as much combat effectiveness, the AI order a retreat.

military = {
	relative_build_scheme 	= [yes/no]	# Should the AI strive to maintain a relative balance between unit types [yes]  or simply allocate percentages (see below) of the total production [no]. Default: yes

	max_batch_peace = 800					# Max production run length in DAYS while at peace
	max_batch_war = 500			 			# Max production run length in DAYS while at war with  no home front
	max_batch_home_front = 190				# Max production run length in DAYS while at war with home  fronts
	# NOTE: AI production run size is also limited by other factors, such as Total IC capacity, days until end of scenario,  and desperation.

# Example Build scheme:
	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 %
# NOTE: The sum _must_ be exactly 100%!


# Brigade preferences:
# (% of eligible division types that should be built with a certain brigade type)
# Land types:
	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
# Sum of these should be <= 100

# Naval types:
	cag				=	100
# Sum of these should be <= 100
}

First off, Paradox made a mistake. While the default for relative_build_scheme is yes, it should always be No. (per Phil K "relative_build_scheme = no" is known to be broken and was supposed to be fixed in 1.2 but did not get fixed! Hopefully it will be fixed in v1.3. - Mithel) Not a single AI file has it set to yes, and for good reason, an AI with relative_build_scheme set to yes is a very bad idea. It will try to produce the same amount of everything! Can you imagine the USSR building a battleship for every single infantry divison?

Well, Enough of that, Let's get down to business.
Max_batch refers the the longest amount of time the AI will set something serial run, the number being the maximum amount of days.
Home_front refers to times when the AI has been pushed into their core territories(IE: When the soviets are pushing into german homeland).

Now, The actual build scheme. These are very important for making a good AI, try to gauge how much of each unit the AI would actually need. One of the main reasons that the 1.1 AI was so bad was that Lothos(Creator of the hoi2 AI files) had most of the Major powers overproducing garrison units(This was fixed in 1.2). So be careful of what you do here.

Also, These are not the actual amount of units the AI will produce, but merely the proportion of their industry they will assign to making that unit type.
As stated, together the values for all land, air, and sea units must equal 100.

Brigades work the same way as unit build schemes, except the total value is not limited, but merely suggested.

I disagree, relative_build_scheme = yes has some valuable usage. Prior to war it really doesn't matter much (depending on the state of the initial OOBs!) but once war breaks out then relative_build_scheme = yes allows the AI to react to losses. If it's navy is wiped out then it will concentrate on rebuilding the navy, etc. This can be a bad thing in some situations! For example if the Italian navy is wiped out in 1942 we do not want Italy to spend the next two to four years building nothing but navy! Another example of where relative = yes will mess you up is if the initial OOB doesn't match the desired balance of units specified in the AI file. For example England may start off with a large navy but due to the AI file may build only ground units (and air) to achieve the specified balance before it starts building navy again. With relative = no the AI is braindead and unable to react to losses - Mithel

I don't want to delete the comments of whomever is suggesting to use relative_build_scheme = no but I've done over a dozen tests and as far as I can determine it does not work (v1.2). You should only use relative_build_scheme = yes. - Mithel

# bomber is now obsolete and NOT USED AT ALL replace and use Air Marshal instead

air_marshal = {
	icxdayscostfactor = 10.0		# How to value true industrial cost when  calculating expect causalties
	manpowercostfactor = 100.0		# How to value manpower cost when calculating  expect causalties
	destructionriskthreashold = 0.2		# when to fear a divisiopn might be destroyed

	airsuperioritydesirability = 10.0	# desirability is a multiplier used when  calcualting the mission desirability
	airsuperioritylosstolerance = 1.0	# tolerance is the required kill:loss ration  expected to do mission, 2.0 accept twice the losses of your enemy, 0.5 accept half
	groundattacklosstolerance = 1.0
	groundattackdesirability = 1.0
	interdictionlosstolerance = 1.5
	inderdictiondesirability = 1.0
	logisticalstrikelosstolerance = 4.5
	logisticalstrikeefficency = 0.01	# efficency is a tweakable param to adjust  according to how much actual damage comes from doing this mission (not to be confused with  desirability)
	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

Placeholder

	# You can have any number of task forces, but if you add one you must add ALL the kinds  you want
	# as then the defaults aren't set.
	
	# The defaults currently are:
	taskforcetype = { 
		name = "Air Superiority" # Name can be anything and is only used to ease debugging
		
		desiredratio = 0.400 # What ratio taskforces of this type should a nation try to  form?		
		
		rangeweight = 10.000 # How important the range for an air divisions in this  taskforce-type?
		airkillpowerweight = 2000.000 # How important is an air divisions ability to kill  air in this taskforce-type?
		hardkillpowerweight = 0.000 
		softkillpowerweight = 0.000  
		navalkillpowerweight = 0.000 
		strategickillpowerweight = 0.000 
		
		transportcapacityweight = -1000000.000 # A huge negative number here keeps  transports out of this taskforce-type
		
		airvulnurabilityweight = -1.000  # How bad is being vulnurable to enemy air   (vulnurable is a mix of cost and defence value)
		surfacevulnurabilityweight = 0.000 
		
		# What AI missions should this task force consider?
		# 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 
		#Others not supported by the "Air Superiority" default taskforce type
		#interdiction
		#ground_attack
		#logistical_strike
		#runway_cratering
		#strategic_bombardment
		#installation_strike
		#naval_strike
		#port_strike
		#convoy_air_raiding
		#airborne_assault
		#air_supply	
	} 
	
	# the other defaults
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 } 

}

Placeholder


#The number of leaders of a given type is equal to the number of units multiplied with the  leader_rartio.
#For example if you have 101 land units and land_field_marsal = 0.02 you will have two field  marshals.
#For example if you have 101 sea units and sea_admiral = 0.06 you will have six admirals.
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



}

Placeholder

#Factors regarding amphibious invasions by ai.
invasion = {
  	#for evaluating specific province target.
	base = 1.0						# Relative modifier. (lower =  specific targets much more important.)
	random = 1.0					# How big a random range.  (1.0 = 1%)
	coastal = 1.0                   # increase to avoid coastal forts more.
	beach = 1.0                     # higher, avoid worst beaches.
	distance = 1.0                  # higher = avoid long distance.
	max_distance = 20.0		# ignore distances at higher distance than this.. 1 =  100km ingame.
	pocket = 1.0                    # prioritise pockets, ie provinces with no adjacent  controlled by same.
	island = 1.0                    # prioritise taking pure islands.
	enemy = 1.0                     # higher = much more wary of troops in province.
	adjacentenemy = 1.0             # higher = much more wary of troops nearby
	air_base	= 0.1   			# add this priority for air bases within  adjacentenemy
	naval_base	= 0.1				# add this priority for naval bases within adjacentenemy
	air_support	= 0.1   			# add this priority for beaches within  reach of air_bases
	ignore = [yes/no]				# Launch invasions even if we have a home  front. Default: no.

	redirect	  = priority/nearest/home   # priority refers to targets in the AI file,
						    				# nearest is the  closest enemy beach where the AI has
						    				# good attack odds and home is to return back to port

	#specific provinces can be targetted to get special bonuses..
	target = {
		898 = 1000 # Invasion of South Sicily (898) has super high priority. Negative  values preclude invasions there.
	}
}

Placeholder

#Factors controlling the naval AI
admiral = {
	#specific provinces can be targetted to get special bonuses..
	target = {
		592 = 200 # patrolling the south north sea have a big priority.
		...
	}

	#This is used to determine that it's a core seazone and its control is important.
	core = {
		592
		...
	}
	
	#Which provinces to use as bases..
	base = {
		592
		...
	}
	
	#Which areas to ignore.
	ignore = {
		#PLEASE NOTE THAT ITS AREAS..  Not province-names
		"northern baltic"
		"southern baltic"
	}

	min_org		= 95%	# NEW: Percent of org gained back before the unit can leave port
	min_dmg		= 95%   # NEW: Percent of dmg gained back before the unit can leave port
	return_org 	= 60% 	# NEW: PERCENT OF ORG LOST BEFORE RETURNING TO PORT applies to all fleets/ships
	return_dmg 	= 50% 	# NEW: PERCENT OF DMG LOST BEFORE RETURNING TO PORT for repairs  applies to all fleets/ships

}

Placeholder

# Factors to modify for technological development.
technology = {
	endgoal = { ... }			#list of endgoals to achieve.
	preference = { ... }		# list of techs to give bonus too.
	ignore = { ... } 			# Techs we will never research

	#preference to weight importance of research in these field.s
	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
}

Placeholder

# Factors to modify Trade Agreements.
trade = {
	favored = {
		TAG = X  	# Preferred Countries to trade resources with.
	}
	embargo = {
		TAG  		# Will not trade resources with these countries.
	}
	
	# A threshold for when the AI should cancel trade agreements. Default is 4.0. A lower  value means the AI will be more eager to cancel bad deals.
	cancel_deal_threshold = X		

	# These override the resource values in "db\resource_values.csv" for this AI unless set  to -1 (default.)
	energy = 			-1
	rare_materials = 	-1
	metal =				-1
	oil = 				-1
	supplies = 			-1
	money = 			-1
}

Placeholder

# Factors to modify Tech Sharing
tech_sharing = {
	favored = {
		TAG = X  	# Preferred Countries to trade techs with. Higher value also means better techs.
		...
	}
	embargo = {
		TAG  		# Will not trade techs with these countries.
		...
	}
	not = {
		ID  		# List of techs never to trade.
		...
	}
	prioritized
		ID = X  	# Priority to accepting trades with these techs.
		...
	}
}

Placeholder

Default AI Settings

In case you ommit something the AI will use default settings. The contents below were prepared by supplying an empty .ai file for a selected country and saving the game on the very first hour of 1936 GC in HOI2:DD+Arm 1.1. This is also a good reference for the proper structure of an ai file. Bear in mind that the result is not complete as some variables and lists are ommited by the game if they have their default value or are empty, so I have added them manually and marked that by using italics.

I hope this will help you as the ai_file_doc.txt (and the notes above) are outdated and contain some spelling and number format errors (like sp_rct_artillery/sp_rocket_artillery). On the other hand we can be sure that all the game writes is 100% correct.

switch = no 
flags = { } 
max_front_ratio = 4.0000 
max_front_ratios = { } 
max_garrison_prop = 0.2000 
min_garrison_prop = 0.1000 
evac_islands = yes 
use_offensive_supply = yes 
neutrality = 0.0000 
war = 50 
ferocity = no 
reinforcement = 0.1000 
upgrading = 0.1000 
desperation = 0.3000 
spyprefs = { 
     percentage_on_spies = 0.0000 
     percentage_foreign_mission = 0.0000
     spyprefsdata = {
          country_priorities = 0.0000
          NumberOfSpies = 0.0000
          min_number_of_spies = 0.0000
          steal_blueprint = 0.0000
          minister_assassination = 0.0000
          smear_campaign = 0.0000
          coup = 0.0000
          sabotage_industry = 0.0000
          nuclear_sabotage = 0.0000
          found_partisans = 0.0000
          massmedia = 0.0000
          counter_espionage = 0.0000
          disrupt_techteam = 0.0000
          country = NONE
     }
} 
strat_redeploy_threshold = 5 
max_redeploying = 0.2500 
max_fuel_offensive = 100.0000 
combat = { }
resistance = { }
protect = { }
befriend = { }
demand_claims = { }
claim_acceptance = 0
liberate = { }
target = { }
exp_force_ratio = 0.6600 
exp_force_ratios = { } 
no_exp_forces_to = { }
admiral = { 
     target = { } 
     core = { } 
     base = { } 
     ignore = { } 
     min_org = 100.0000 
     min_dmg = 100.0000 
     return_org = 25.0000 
     return_dmg = 25.0000 
     min_core_attack_fleets = 0.0000 
} 
trade = { 
     embargo = { }
     favored = { }
     cancel_deal_threshold = 4.0000
     oil = -1
     energy = -1
     metal = -1
     rare_materials = -1
     money = -1
     supplies = -1
} 
tech_sharing = {
     embargo = { }
     favored = { }
     prioritized = { }
     not = { }
} 
invasion = { 
     base = 1.0000 
     random = 1.0000 
     coastal = 1.0000 
     beach = 1.0000 
     distance = 1.0000 
     max_distance = 99999.0000 
     max_staging_distance = 10.0000 
     pocket = 1.0000 
     island = 1.0000 
     enemy = 1.0000 
     adjacentenemy = 1.0000 
     air_base = 0.1000 
     naval_base = 0.1000 
     air_support = 0.1000 
     ignore = no 
     invasion = yes 
     help_allies = yes 
     redirect = nearest 
     target = { }
} 
air_marshal = { 
     icxdayscostfactor = 10.0000 
     manpowercostfactor = 100.0000 
     destructionriskthreashold = 0.2000 
     airsuperioritydesirability = 3.0000 
     airsuperioritylosstolerance = 0.8000 
     groundattacklosstolerance = 1.0000 
     groundattackdesirability = 2.0000 
     interdictionlosstolerance = 1.5000 
     inderdictiondesirability = 1.0000 
     logisticalstrikelosstolerance = 1.5000 
     logisticalstrikeefficency = 0.0100 
     logisticalstrikedesirability = 4.0000 
     runwaycrateringlosstolerance = 1.0000 
     runwaycrateringefficency = 0.0100 
     runwaycrateringdesirability = 1.0000 
     strategicstriketolerance = 1.0000 
     strategicstrikeefficency = 0.0100 
     strategicstrikedesirability = 5.0000 
     nukestriketolerance = 1.0000 
     nukestrikedesirability = 5.0000 
     installationstriketolerance = 1.0000 
     installationstrikeefficency = 0.0100 
     installationstrikedesirability = 1.0000 
     navalstriketolerance = 1.0000 
     navalstrikedesirability = 10.0000 
     portstriketolerance = 1.0000 
     portstrikedesirability = 9.0000 
     convoyraidtolerance = 1.0000 
     convoyraiddesirability = 0.0000 
     min_mission_strength_org = 0.5000 
     taskforcetype = { 
          name = "Air Superiority" 
          desiredratio = 0.4000 
          rangeweight = 10.0000 
          airkillpowerweight = 2000.0000 
          hardkillpowerweight = 0.0000 
          softkillpowerweight = 0.0000 
          navalkillpowerweight = 0.0000 
          strategickillpowerweight = 0.0000 
          transportcapacityweight = -1000000.0000 
          airvulnurabilityweight = -1.0000 
          surfacevulnurabilityweight = 0.0000 
          idle = yes 
          reorganize = yes 
          air_superiority = yes 
     } 
     taskforcetype = { 
          name = "Soft Bombing" 
          desiredratio = 0.2000 
          rangeweight = 10.0000 
          airkillpowerweight = 0.0000 
          hardkillpowerweight = 0.0000 
          softkillpowerweight = 2000.0000 
          navalkillpowerweight = 0.0000 
          strategickillpowerweight = 0.0000 
          transportcapacityweight = -1000000.0000 
          airvulnurabilityweight = 0.0000 
          surfacevulnurabilityweight = -1.0000 
          idle = yes 
          reorganize = yes 
          interdiction = yes 
          ground_attack = yes 
     } 
     taskforcetype = { 
          name = "Hard Bombing" 
          desiredratio = 0.1000 
          rangeweight = 10.0000 
          airkillpowerweight = 0.0000 
          hardkillpowerweight = 2000.0000 
          softkillpowerweight = 0.0000 
          navalkillpowerweight = 0.0000 
          strategickillpowerweight = 0.0000 
          transportcapacityweight = -1000000.0000 
          airvulnurabilityweight = 0.0000 
          surfacevulnurabilityweight = -1.0000 
          idle = yes 
          reorganize = yes 
          interdiction = yes 
          ground_attack = yes 
     } 
     taskforcetype = { 
          name = "Strategic Bombing" 
          desiredratio = 0.1000 
          rangeweight = 10.0000 
          airkillpowerweight = 0.0000 
          hardkillpowerweight = 0.0000 
          softkillpowerweight = 0.0000 
          navalkillpowerweight = 0.0000 
          strategickillpowerweight = 2000.0000 
          transportcapacityweight = -1000000.0000 
          airvulnurabilityweight = -0.5000 
          surfacevulnurabilityweight = -0.5000 
          idle = yes 
          reorganize = yes 
          logistical_strike = yes 
          runway_cratering = yes 
          strategic_bombardment = yes 
          installation_strike = yes 
     } 
     taskforcetype = { 
          name = "Naval Bombing" 
          desiredratio = 0.1000 
          rangeweight = 10.0000 
          airkillpowerweight = 0.0000 
          hardkillpowerweight = 0.0000 
          softkillpowerweight = 0.0000 
          navalkillpowerweight = 2000.0000 
          strategickillpowerweight = 0.0000 
          transportcapacityweight = -1000000.0000 
          airvulnurabilityweight = 0.0000 
          surfacevulnurabilityweight = -1.0000 
          idle = yes 
          reorganize = yes 
          naval_strike = yes 
          port_strike = yes 
          convoy_air_raiding = yes 
     } 
     taskforcetype = { 
          name = "Airlift" 
          desiredratio = 0.1000 
          rangeweight = 10.0000 
          airkillpowerweight = 0.0000 
          hardkillpowerweight = -2000.0000 
          softkillpowerweight = -2000.0000 
          navalkillpowerweight = 0.0000 
          strategickillpowerweight = -2000.0000 
          transportcapacityweight = 1000000.0000 
          airvulnurabilityweight = -1.0000 
          surfacevulnurabilityweight = 0.0000 
          idle = yes 
          reorganize = yes 
          airborne_assault = yes 
          air_supply = yes 
     } 
} 
garrison = { 
     defend_overseas_beaches = no 
     key_point_prio_mult = 0.0000 
     revolt_risk_mult = 0.0000 
     beach = 50 
     reserves = 20 
     capital = 100 
     human_border = 200 
     war_target = 100 
     opposing_alliance = 100 
     claim_threat = 100 
     unstable_border = 50 
     war_zone_odds = 2.0000 
     home_multiplier = 0.5000 
     overseas_multiplier = 0.3333 
     home_peace_cap = 10000 
     country_priorities = { } 
     province_priorities = { } 
     area_multiplier = { } 
     ignore = { } 
} 
military = { 
     relative_build_scheme = yes 
     max_batch_peace = 800 
     max_batch_war = 500 
     max_batch_home_front = 190 
     extra_convoys_war = 0.0500 
     extra_convoys_peace = 0.0500 
     infantry = 30.0000 
     cavalry = 5.0000 
     motorized = 10.0000 
     mechanized = 5.0000 
     light_armor = 0.0000 
     armor = 10.0000 
     paratrooper = 0.0000 
     marine = 0.0000 
     bergsjaeger = 0.0000 
     garrison = 0.0000 
     hq = 0.0000 
     militia = 0.0000 
     multi_role = 7.0000 
     interceptor = 10.0000 
     strategic_bomber = 0.0000 
     tactical_bomber = 2.0000 
     naval_bomber = 0.0000 
     cas = 0.0000 
     transport_plane = 0.0000 
     flying_bomb = 0.0000 
     flying_rocket = 0.0000 
     battleship = 0.0000 
     light_cruiser = 2.0000 
     heavy_cruiser = 0.0000 
     battlecruiser = 0.0000 
     destroyer = 5.0000 
     carrier = 0.0000 
     escort_carrier = 0.0000 
     submarine = 5.0000 
     nuclear_submarine = 0.0000 
     transport = 8.0000 
     artillery = 15.0000 
     sp_artillery = 5.0000 
     rocket_artillery = 0.0000 
     sp_rct_artillery = 2.0000 
     anti_tank = 3.0000 
     tank_destroyer = 5.0000 
     light_armor_brigade = 0.0000 
     heavy_armor = 0.0000 
     super_heavy_armor = 0.0000 
     armored_car = 0.0000 
     anti_air = 5.0000 
     police = 0.0000 
     engineer = 5.0000 
     cag = 100.0000 
     escort = 100.0000 
     naval_asw = 20.0000 
     naval_anti_air_s = 20.0000 
     naval_radar_s = 20.0000 
     naval_fire_controll_s = 20.0000 
     naval_improved_hull_s = 10.0000 
     naval_torpedoes_s = 10.0000 
     naval_anti_air_l = 0.0000 
     naval_radar_l = 0.0000 
     naval_fire_controll_l = 0.0000 
     naval_improved_hull_l = 0.0000 
     naval_torpedoes_l = 0.0000 
} 
front = { 
     strength = 1.0000 
     organisation = 1.0000 
     dig_in = 1.0000 
     soft_attack = 1.0000 
     hard_attack = 1.0000 
     ground_defense = 1.0000 
     support_defense_prop = 0.3300 
     river = 1.0000 
     frozen_attack = 1.0000 
     snow_attack = 1.0000 
     blizzard_attack = 1.0000 
     storm_attack = 1.0000 
     muddy_attack = 1.0000 
     largefort = 1.0000 
     smallfort = 1.0000 
     occupied = 0.8000 
     owned = 0.5000 
     jungle_attack = 1.0000 
     mountain_attack = 1.0000 
     swamp_attack = 1.0000 
     forest_attack = 1.0000 
     hill_attack = 1.0000 
     urban_attack = 1.0000 
     recklessness = 1 
     enemy_reinf_days = 6 
     reserve_prop = 0.2000 
     panic_ratio_vs_ai = 3.0000 
     panic_ratio_vs_human = 2.0000 
     base_attack_odds = 2.5000 
     min_attack_odds = 1.0000 
     max_attack_odds = 3.0000 
     reinforce_odds = 1.0000 
     withdraw_odds = 0.5000 
     distrib_vs_ai = op_defensive 
     distrib_vs_human = op_defensive 
     enemy_handicap = { } 
     passivity = { } 
     province_priorities = { } 
} 
construction = { 
     max_factor = 0.2000 
     transports = -1 
     escorts = -1 
     AA_batteries = no 
     max_AA_level = 10 
     AA_provs = { } 
     coastal_fort = no 
     max_coastal_level = 5 
     coastal_fort_provs = { } 
     radar_station = no 
     max_radar = 5 
     radar_provs = { } 
     air_base = no 
     max_air_base = 5 
     air_base_provs = { } 
     naval_base = no 
     max_naval_base = 5 
     naval_base_provs = { } 
     land_fort = no 
     max_land_level = 5 
     fort_borders = { } 
     fort_provs = { } 
     nuclear_reactor = no 
     max_nuclear = 10 
     nuclear_reactor_prov = -1
     rocket_test = no 
     max_rocket = 10 
     rocket_test_prov = -1
     ic_at_war = yes 
     force_ic_until = 1900 
     ic_end_year = 1946 
     IC_provs = { } 
} 
technology = { 
     endgoal = { }
     preference = { }
     ignore = { }
     armor = 1.0000 
     infantry = 1.0000 
     industry = 1.0000 
     aircraft = 1.0000 
     naval = 1.0000 
     land_doctrines = 1.0000 
     secret_weapons = 1.0000 
     air_doctrines = 1.0000 
     naval_doctrines = 1.0000 
} 
leader_ratio = { 
     land_field_marshal = 0.0300 
     land_general = 0.0500 
     land_lt_general = 0.2000 
     sea_grand_admiral = 0.0300 
     sea_admiral = 0.0500 
     sea_vice_admiral = 0.2000 
     air_marshal = 0.0300 
     air_general = 0.0500 
     air_lt_General = 0.2000 
} 

I have reformatted the taskforcetype and spyprefs sections so they would fit nicely on the screen. Also, the spyprefsdata sections are of course not needed at all if you don't plan to tell the AI how to use it's spies but I have listed it here so you could see the proper order of variables etc. Note: don't use the home_defence switch, it seems that it's not working (the section is not stored back into the savegame file).