﻿# AI-vs-AI battle resolver.

bdp_ai_vs_ai_clear_current_battle_state_effect = {
	if = {
		limit = { has_character_flag = bdp_ai_vs_ai_added_already_fighting }
		remove_character_flag = bdp_ai_vs_ai_added_already_fighting
		if = {
			limit = { NOT = { has_variable = engaged_in_single_combat } }
			remove_character_flag = already_fighting
		}
	}
	remove_character_flag = bdp_ai_vs_ai_registered_current_battle
	remove_character_flag = bdp_ai_vs_ai_resolved_current_battle
	remove_character_flag = bdp_ai_vs_ai_human_participant_current_battle
	remove_character_flag = bdp_multiplayer_refusal_paid_current_battle
	remove_character_flag = bdp_multiplayer_duel_active
	remove_character_flag = bdp_ai_vs_ai_used_current_battle
	remove_character_flag = bdp_ai_vs_ai_chronicle_participant
	remove_variable = bdp_ai_vs_ai_opposing_coordinator
	remove_variable = bdp_ai_vs_ai_dragon_wait_days
	remove_variable = bdp_ai_vs_ai_human_wait_days
}

# Old saves may still have the retired watcher queued.
bdp_ai_vs_ai_clear_legacy_watcher_state_effect = {
	remove_character_flag = bdp_ai_vs_ai_registered_current_battle
	remove_variable = bdp_ai_vs_ai_opposing_coordinator
	remove_variable = bdp_ai_vs_ai_dragon_wait_days
	remove_variable = bdp_ai_vs_ai_human_wait_days
}

# Lock both commanders before anything can end the battle.
bdp_ai_vs_ai_resolve_live_phase_effect = {
	if = {
		# Both sides can pick this at once. The first one through gets the lock.
		limit = {
			OR = {
				bdp_ai_vs_ai_phase_ready_trigger = yes
				bdp_ai_vs_ai_knight_phase_ready_trigger = yes
			}
		}
		scope:combat_side = {
			save_scope_as = bdp_ai_vs_ai_side_a
			enemy_side = { save_scope_as = bdp_ai_vs_ai_side_b }
		}
		clear_saved_scope = bdp_ai_vs_ai_battle_location
		location = { save_scope_as = bdp_ai_vs_ai_battle_location }
		scope:bdp_ai_vs_ai_side_a = {
			side_commander = {
				add_character_flag = { flag = bdp_ai_vs_ai_resolved_current_battle days = 365 }
			}
		}
		scope:bdp_ai_vs_ai_side_b = {
			side_commander = {
				add_character_flag = { flag = bdp_ai_vs_ai_resolved_current_battle days = 365 }
			}
		}
		debug_log = "BDP AI-vs-AI live combat-phase producer fired"
		if = {
			limit = { scope:bdp_ai_vs_ai_phase_producer = flag:bdp_knight_phase }
			debug_log = "BDP AI-vs-AI knight producer won the post-dragon phase"
		}
		else = {
			debug_log = "BDP AI-vs-AI commander producer won the post-dragon phase"
		}
		debug_log_date = yes
		bdp_ai_vs_ai_resolve_registered_battle_effect = yes
	}
}

# Dragon events go first. This catches a battle they end immediately.
bdp_ai_vs_ai_resolve_dragon_combat_end_effect = {
	if = {
		limit = { bdp_ai_vs_ai_dragon_combat_end_ready_trigger = yes }
		scope:combat_side = {
			save_scope_as = bdp_ai_vs_ai_side_a
			enemy_side = { save_scope_as = bdp_ai_vs_ai_side_b }
		}
		clear_saved_scope = bdp_ai_vs_ai_battle_location
		scope:combat_side.combat.location = { save_scope_as = bdp_ai_vs_ai_battle_location }
		scope:bdp_ai_vs_ai_side_a = {
			side_commander = {
				add_character_flag = { flag = bdp_ai_vs_ai_resolved_current_battle days = 365 }
			}
		}
		scope:bdp_ai_vs_ai_side_b = {
			side_commander = {
				add_character_flag = { flag = bdp_ai_vs_ai_resolved_current_battle days = 365 }
			}
		}
		debug_log = "BDP AI-vs-AI dragon combat-end fallback fired after AGOT warfare"
		debug_log_date = yes
		bdp_ai_vs_ai_resolve_registered_battle_effect = yes
	}
}

# Move old caps to 5/10/15/20. Real growth can raise them later.
bdp_ai_vs_ai_prepare_candidate_effect = {
	if = {
		limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_duels } }
		set_variable = { name = bdp_ai_vs_ai_lifetime_duels value = 0 }
	}
	if = {
		limit = { has_variable = bdp_ai_vs_ai_career_ceiling var:bdp_ai_vs_ai_career_ceiling = 16 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 20 }
	}
	else_if = {
		limit = { has_variable = bdp_ai_vs_ai_career_ceiling var:bdp_ai_vs_ai_career_ceiling = 11 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 15 }
	}
	else_if = {
		limit = { has_variable = bdp_ai_vs_ai_career_ceiling var:bdp_ai_vs_ai_career_ceiling = 8 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 10 }
	}
	else_if = {
		limit = { has_variable = bdp_ai_vs_ai_career_ceiling var:bdp_ai_vs_ai_career_ceiling = 6 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 5 }
	}
	if = {
		limit = { NOT = { has_variable = bdp_ai_vs_ai_career_ceiling } }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 5 }
	}
	if = {
		limit = { prowess >= 22 bdp_ai_vs_ai_career_score_value >= 28 var:bdp_ai_vs_ai_career_ceiling < 20 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 20 }
	}
	else_if = {
		limit = { prowess >= 16 bdp_ai_vs_ai_career_score_value >= 21 var:bdp_ai_vs_ai_career_ceiling < 15 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 15 }
	}
	else_if = {
		limit = { prowess >= 12 bdp_ai_vs_ai_career_score_value >= 15 var:bdp_ai_vs_ai_career_ceiling < 10 }
		set_variable = { name = bdp_ai_vs_ai_career_ceiling value = 10 }
	}
}

# Six real wins earn Aspiring. Normal Blademaster XP takes over after that.
bdp_ai_blademaster_add_qualifying_victory_effect = {
	if = {
		limit = {
			is_ai = yes
			NOT = { has_trait = lifestyle_blademaster }
		}
		if = {
			limit = { NOT = { has_variable = bdp_ai_blademaster_qualifying_wins } }
			set_variable = { name = bdp_ai_blademaster_qualifying_wins value = 1 }
		}
		else_if = {
			limit = { var:bdp_ai_blademaster_qualifying_wins >= 5 }
			remove_variable = bdp_ai_blademaster_qualifying_wins
			add_trait = lifestyle_blademaster
		}
		else = {
			change_variable = { name = bdp_ai_blademaster_qualifying_wins add = 1 }
		}
	}
}

# Check Prowess before consequences can change it.
bdp_ai_blademaster_record_live_opponent_victory_effect = {
	if = {
		limit = {
			is_ai = yes
			NOT = { has_trait = lifestyle_blademaster }
			$OPPONENT$ = { prowess >= 10 }
		}
		bdp_ai_blademaster_add_qualifying_victory_effect = yes
	}
}

# Human duels save that Prowess check before combat.
bdp_ai_blademaster_record_snapshotted_victory_effect = {
	if = {
		limit = {
			is_ai = yes
			NOT = { has_trait = lifestyle_blademaster }
			has_character_flag = bdp_ai_blademaster_qualifying_opponent_snapshot
		}
		bdp_ai_blademaster_add_qualifying_victory_effect = yes
	}
	if = {
		limit = { has_trait = lifestyle_blademaster has_variable = bdp_ai_blademaster_qualifying_wins }
		remove_variable = bdp_ai_blademaster_qualifying_wins
	}
	remove_character_flag = bdp_ai_blademaster_qualifying_opponent_snapshot
}

# Synthetic duels copy AGOT's XP without double-dipping the sixth win.
bdp_ai_blademaster_award_synthetic_victory_xp_effect = {
	if = {
		limit = {
			is_ai = yes
			has_trait = lifestyle_blademaster
		}
		if = {
			limit = { has_variable = bdp_ai_blademaster_qualifying_wins }
			remove_variable = bdp_ai_blademaster_qualifying_wins
		}
		add_trait_xp = {
			trait = lifestyle_blademaster
			value = lifestyle_blademaster_xp_gain_minor_value
		}
	}
}

bdp_ai_vs_ai_prepare_side_candidates_effect = {
	scope:bdp_ai_vs_ai_side_a = {
		save_scope_as = combat_side
		every_side_knight = { limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_side_commander = { limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
	}
	scope:bdp_ai_vs_ai_side_b = {
		save_scope_as = combat_side
		every_side_knight = { limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_side_commander = { limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
	}

	# Knights first. The hatred pool is the only duke-or-higher exception.
	scope:bdp_ai_vs_ai_side_a = {
		save_scope_as = combat_side
		every_side_knight = {
			limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_side_a_all
			if = {
				limit = { bdp_ai_vs_ai_normal_rank_trigger = yes }
				add_to_temporary_list = bdp_ai_vs_ai_side_a_normal
			}
		}
	}
	scope:bdp_ai_vs_ai_side_b = {
		save_scope_as = combat_side
		every_side_knight = {
			limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_side_b_all
			if = {
				limit = { bdp_ai_vs_ai_normal_rank_trigger = yes }
				add_to_temporary_list = bdp_ai_vs_ai_side_b_normal
			}
		}
	}

	# Commanders fill in when a side has no eligible knight.
	if = {
		limit = { NOT = { any_in_list = { list = bdp_ai_vs_ai_side_a_normal count >= 1 } } }
		scope:bdp_ai_vs_ai_side_a = {
			save_scope_as = combat_side
			every_side_commander = {
				limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
				if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_side_a_all } } add_to_temporary_list = bdp_ai_vs_ai_side_a_all }
				if = { limit = { bdp_ai_vs_ai_normal_rank_trigger = yes } add_to_temporary_list = bdp_ai_vs_ai_side_a_normal }
			}
		}
	}
	if = {
		limit = { NOT = { any_in_list = { list = bdp_ai_vs_ai_side_b_normal count >= 1 } } }
		scope:bdp_ai_vs_ai_side_b = {
			save_scope_as = combat_side
			every_side_commander = {
				limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
				if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_side_b_all } } add_to_temporary_list = bdp_ai_vs_ai_side_b_all }
				if = { limit = { bdp_ai_vs_ai_normal_rank_trigger = yes } add_to_temporary_list = bdp_ai_vs_ai_side_b_normal }
			}
		}
	}
}

# Reserve present protectors tied to a Manual Seek target.
bdp_ai_vs_ai_reserve_present_protector_chain_effect = {
	save_scope_as = bdp_ai_vs_ai_substitution_ward
	every_relation = {
		type = bodyguard
		limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
		if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } } add_to_temporary_list = bdp_ai_vs_ai_manual_reserved }
	}
	every_relation = {
		type = agot_squire
		limit = { age >= 16 bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
		if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } } add_to_temporary_list = bdp_ai_vs_ai_manual_reserved }
	}
	every_court_position_holder = {
		type = bodyguard_court_position
		limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
		if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } } add_to_temporary_list = bdp_ai_vs_ai_manual_reserved }
	}
	every_court_position_holder = {
		type = household_guard_court_position
		limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
		if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } } add_to_temporary_list = bdp_ai_vs_ai_manual_reserved }
	}
}

# Keep the player's two best Manual Seek targets out of AI duels.
bdp_ai_vs_ai_reserve_manual_targets_effect = {
	clear_saved_scope = bdp_ai_vs_ai_player_commander
	if = {
		limit = { scope:bdp_ai_vs_ai_side_a = { any_side_commander = { is_ai = no } } }
		scope:bdp_ai_vs_ai_side_a = { random_side_commander = { limit = { is_ai = no } save_scope_as = bdp_ai_vs_ai_player_commander } }
		scope:bdp_ai_vs_ai_side_b = { save_scope_as = combat_side save_scope_as = bdp_ai_vs_ai_substitution_side }
		every_in_list = { list = bdp_ai_vs_ai_side_b_all limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes } add_to_temporary_list = bdp_ai_vs_ai_manual_target_pool }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_side_b = { any_side_commander = { is_ai = no } } }
		scope:bdp_ai_vs_ai_side_b = { random_side_commander = { limit = { is_ai = no } save_scope_as = bdp_ai_vs_ai_player_commander } }
		scope:bdp_ai_vs_ai_side_a = { save_scope_as = combat_side save_scope_as = bdp_ai_vs_ai_substitution_side }
		every_in_list = { list = bdp_ai_vs_ai_side_a_all limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes } add_to_temporary_list = bdp_ai_vs_ai_manual_target_pool }
	}

	if = {
		limit = { exists = scope:bdp_ai_vs_ai_player_commander any_in_list = { list = bdp_ai_vs_ai_manual_target_pool count >= 1 } }
		ordered_in_list = {
			list = bdp_ai_vs_ai_manual_target_pool
			limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } }
			order_by = bdp_ai_vs_ai_manual_reservation_value
			position = 0
			save_scope_as = bdp_ai_vs_ai_manual_reserve_1
		}
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_manual_reserve_1 }
			scope:bdp_ai_vs_ai_manual_reserve_1 = {
				add_to_temporary_list = bdp_ai_vs_ai_manual_reserved
				bdp_ai_vs_ai_reserve_present_protector_chain_effect = yes
			}
		}
	}
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_player_commander any_in_list = { list = bdp_ai_vs_ai_manual_target_pool count >= 1 NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } } }
		ordered_in_list = {
			list = bdp_ai_vs_ai_manual_target_pool
			limit = { NOT = { is_in_list = bdp_ai_vs_ai_manual_reserved } }
			order_by = bdp_ai_vs_ai_manual_reservation_value
			position = 0
			save_scope_as = bdp_ai_vs_ai_manual_reserve_2
		}
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_manual_reserve_2 }
			scope:bdp_ai_vs_ai_manual_reserve_2 = {
				add_to_temporary_list = bdp_ai_vs_ai_manual_reserved
				bdp_ai_vs_ai_reserve_present_protector_chain_effect = yes
			}
		}
	}
}

bdp_ai_vs_ai_resolve_registered_battle_effect = {
	clear_saved_scope = bdp_ai_vs_ai_any_duel_resolved
	bdp_ai_vs_ai_prepare_side_candidates_effect = yes
	bdp_ai_vs_ai_reserve_manual_targets_effect = yes

	# The rule changes the extra duel slots. All the usual safeguards still decide who can fight.
	if = {
		limit = { has_game_rule = agot_battlefield_duel_ai_vs_ai_disabled }
	}
	else_if = {
		limit = { has_game_rule = agot_battlefield_duel_ai_vs_ai_occasional }
		random_list = {
			50 = { bdp_ai_vs_ai_attempt_duel_slot_effect = yes }
			50 = { }
		}
	}
	else_if = {
		limit = { has_game_rule = agot_battlefield_duel_ai_vs_ai_frequent }
		bdp_ai_vs_ai_attempt_duel_slot_effect = yes
		random_list = {
			50 = {
				bdp_ai_vs_ai_attempt_duel_slot_effect = yes
				if = {
					limit = { exists = scope:bdp_ai_vs_ai_slot_resolved }
					random_list = {
						25 = { bdp_ai_vs_ai_attempt_duel_slot_effect = yes }
						75 = { }
					}
				}
			}
			50 = { }
		}
	}
	else_if = {
		limit = { has_game_rule = agot_battlefield_duel_ai_vs_ai_very_frequent }
		bdp_ai_vs_ai_attempt_duel_slot_effect = yes
		random_list = {
			75 = {
				bdp_ai_vs_ai_attempt_duel_slot_effect = yes
				if = {
					limit = { exists = scope:bdp_ai_vs_ai_slot_resolved }
					random_list = {
						50 = { bdp_ai_vs_ai_attempt_duel_slot_effect = yes }
						50 = { }
					}
				}
			}
			25 = { }
		}
	}
	else_if = {
		limit = { has_game_rule = agot_battlefield_duel_ai_vs_ai_maximum }
		bdp_ai_vs_ai_attempt_duel_slot_effect = yes
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_slot_resolved }
			bdp_ai_vs_ai_attempt_duel_slot_effect = yes
			if = {
				limit = { exists = scope:bdp_ai_vs_ai_slot_resolved }
				bdp_ai_vs_ai_attempt_duel_slot_effect = yes
			}
		}
	}
	else = {
		bdp_ai_vs_ai_attempt_duel_slot_effect = yes
		random_list = {
			25 = {
				bdp_ai_vs_ai_attempt_duel_slot_effect = yes
				if = {
					limit = { exists = scope:bdp_ai_vs_ai_slot_resolved }
					random_list = {
						10 = { bdp_ai_vs_ai_attempt_duel_slot_effect = yes }
						90 = { }
					}
				}
			}
			75 = { }
		}
	}
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_any_duel_resolved }
		debug_log = "BDP AI-vs-AI resolver completed at least one duel"
	}
	else = {
		debug_log = "BDP AI-vs-AI phase fired but no duel resolved"
	}
}

# Rivals and nemeses get first shot, including the duke-or-higher exception.
bdp_ai_vs_ai_select_normal_pair_effect = {
	clear_saved_scope = bdp_ai_vs_ai_ward_a
	clear_saved_scope = bdp_ai_vs_ai_ward_b
	scope:bdp_ai_vs_ai_side_a = { save_scope_as = combat_side }
	random_in_list = {
		list = bdp_ai_vs_ai_side_a_normal
		limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
		weight = { modifier = { add = bdp_ai_vs_ai_soft_capped_candidate_weight_value } }
		save_scope_as = bdp_ai_vs_ai_ward_a
	}
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_ward_a }
		scope:bdp_ai_vs_ai_side_b = { save_scope_as = combat_side }
		random_in_list = {
			list = bdp_ai_vs_ai_side_b_normal
			limit = { bdp_ai_vs_ai_candidate_eligible_trigger = yes }
			weight = { modifier = { add = bdp_ai_vs_ai_soft_capped_candidate_weight_value } }
			save_scope_as = bdp_ai_vs_ai_ward_b
		}
	}
}

bdp_ai_vs_ai_select_hatred_pair_effect = {
	clear_saved_scope = bdp_ai_vs_ai_ward_a
	clear_saved_scope = bdp_ai_vs_ai_ward_b
	scope:bdp_ai_vs_ai_side_a = { save_scope_as = combat_side }
	random_in_list = {
		list = bdp_ai_vs_ai_side_a_all
		limit = {
			bdp_ai_vs_ai_candidate_eligible_trigger = yes
			OR = {
				any_relation = { type = rival is_in_list = bdp_ai_vs_ai_side_b_all }
				any_relation = { type = nemesis is_in_list = bdp_ai_vs_ai_side_b_all }
			}
		}
		weight = {
			modifier = { add = bdp_ai_vs_ai_soft_capped_candidate_weight_value }
			modifier = {
				factor = 2
				any_relation = { type = nemesis is_in_list = bdp_ai_vs_ai_side_b_all }
			}
		}
		save_scope_as = bdp_ai_vs_ai_ward_a
	}
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_ward_a }
		scope:bdp_ai_vs_ai_side_b = { save_scope_as = combat_side }
		random_in_list = {
			list = bdp_ai_vs_ai_side_b_all
			limit = {
				bdp_ai_vs_ai_candidate_eligible_trigger = yes
				OR = {
					has_relation_rival = scope:bdp_ai_vs_ai_ward_a
					has_relation_nemesis = scope:bdp_ai_vs_ai_ward_a
				}
			}
			weight = {
				modifier = { add = bdp_ai_vs_ai_soft_capped_candidate_weight_value }
				modifier = { factor = 2 has_relation_nemesis = scope:bdp_ai_vs_ai_ward_a }
			}
			save_scope_as = bdp_ai_vs_ai_ward_b
		}
	}
}

bdp_ai_vs_ai_select_pair_effect = {
	if = {
		limit = {
			any_in_list = {
				list = bdp_ai_vs_ai_side_a_all
				OR = {
					any_relation = { type = rival is_in_list = bdp_ai_vs_ai_side_b_all }
					any_relation = { type = nemesis is_in_list = bdp_ai_vs_ai_side_b_all }
				}
			}
		}
		if = {
			limit = {
				any_in_list = { list = bdp_ai_vs_ai_side_a_normal count >= 1 }
				any_in_list = { list = bdp_ai_vs_ai_side_b_normal count >= 1 }
			}
			random_list = {
				75 = { bdp_ai_vs_ai_select_hatred_pair_effect = yes }
				25 = { bdp_ai_vs_ai_select_normal_pair_effect = yes }
			}
		}
		else = { bdp_ai_vs_ai_select_hatred_pair_effect = yes }
	}
	else = { bdp_ai_vs_ai_select_normal_pair_effect = yes }

	# If the hatred pick disappears, use the normal pool.
	if = {
		limit = {
			OR = {
				NOT = { exists = scope:bdp_ai_vs_ai_ward_a }
				NOT = { exists = scope:bdp_ai_vs_ai_ward_b }
			}
		}
		bdp_ai_vs_ai_select_normal_pair_effect = yes
	}
}

# Adult squires: 5%. Prodigies: 2%.
bdp_ai_vs_ai_select_squire_for_a_effect = {
	clear_saved_scope = bdp_ai_vs_ai_selected_squire_a
	scope:bdp_ai_vs_ai_ward_a = {
		save_scope_as = bdp_ai_vs_ai_substitution_ward
		every_relation = { type = agot_squire limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_relation = {
			type = agot_squire
			limit = { age >= 16 bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_squire_adult_a
		}
		every_relation = {
			type = agot_squire
			limit = { bdp_ai_vs_ai_prodigy_substitute_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_squire_prodigy_a
		}
	}
	ordered_in_list = { list = bdp_ai_vs_ai_squire_adult_a order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_squire_adult_a }
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_strongest_squire_adult_a }
		random_list = {
			5 = {
				random_in_list = {
					list = bdp_ai_vs_ai_squire_adult_a
					limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_squire_adult_a.prowess }
					save_scope_as = bdp_ai_vs_ai_selected_squire_a
				}
			}
			95 = { }
		}
	}
	if = {
		limit = { NOT = { exists = scope:bdp_ai_vs_ai_selected_squire_a } }
		ordered_in_list = { list = bdp_ai_vs_ai_squire_prodigy_a order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_squire_prodigy_a }
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_strongest_squire_prodigy_a }
			random_list = {
				2 = {
					random_in_list = {
						list = bdp_ai_vs_ai_squire_prodigy_a
						limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_squire_prodigy_a.prowess }
						save_scope_as = bdp_ai_vs_ai_selected_squire_a
					}
				}
				98 = { }
			}
		}
	}
}

bdp_ai_vs_ai_select_squire_for_b_effect = {
	clear_saved_scope = bdp_ai_vs_ai_selected_squire_b
	scope:bdp_ai_vs_ai_ward_b = {
		save_scope_as = bdp_ai_vs_ai_substitution_ward
		every_relation = { type = agot_squire limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_relation = {
			type = agot_squire
			limit = { age >= 16 bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_squire_adult_b
		}
		every_relation = {
			type = agot_squire
			limit = { bdp_ai_vs_ai_prodigy_substitute_eligible_trigger = yes }
			add_to_temporary_list = bdp_ai_vs_ai_squire_prodigy_b
		}
	}
	ordered_in_list = { list = bdp_ai_vs_ai_squire_adult_b order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_squire_adult_b }
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_strongest_squire_adult_b }
		random_list = {
			5 = {
				random_in_list = {
					list = bdp_ai_vs_ai_squire_adult_b
					limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_squire_adult_b.prowess }
					save_scope_as = bdp_ai_vs_ai_selected_squire_b
				}
			}
			95 = { }
		}
	}
	if = {
		limit = { NOT = { exists = scope:bdp_ai_vs_ai_selected_squire_b } }
		ordered_in_list = { list = bdp_ai_vs_ai_squire_prodigy_b order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_squire_prodigy_b }
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_strongest_squire_prodigy_b }
			random_list = {
				2 = {
					random_in_list = {
						list = bdp_ai_vs_ai_squire_prodigy_b
						limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_squire_prodigy_b.prowess }
						save_scope_as = bdp_ai_vs_ai_selected_squire_b
					}
				}
				98 = { }
			}
		}
	}
}

# Bodyguards and Sworn Shields step in 35% of the time.
bdp_ai_vs_ai_select_professional_for_a_effect = {
	clear_saved_scope = bdp_ai_vs_ai_selected_professional_a
	scope:bdp_ai_vs_ai_ward_a = {
		save_scope_as = bdp_ai_vs_ai_substitution_ward
		every_relation = { type = bodyguard limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_court_position_holder = { type = bodyguard_court_position limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_court_position_holder = { type = household_guard_court_position limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_relation = {
			type = bodyguard
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_a } } add_to_temporary_list = bdp_ai_vs_ai_professional_a }
		}
		every_court_position_holder = {
			type = bodyguard_court_position
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_a } } add_to_temporary_list = bdp_ai_vs_ai_professional_a }
		}
		every_court_position_holder = {
			type = household_guard_court_position
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_a } } add_to_temporary_list = bdp_ai_vs_ai_professional_a }
		}
	}
	ordered_in_list = { list = bdp_ai_vs_ai_professional_a order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_professional_a }
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_strongest_professional_a }
		random_list = {
			35 = {
				random_in_list = {
					list = bdp_ai_vs_ai_professional_a
					limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_professional_a.prowess }
					save_scope_as = bdp_ai_vs_ai_selected_professional_a
				}
			}
			65 = { }
		}
	}
}

bdp_ai_vs_ai_select_professional_for_b_effect = {
	clear_saved_scope = bdp_ai_vs_ai_selected_professional_b
	scope:bdp_ai_vs_ai_ward_b = {
		save_scope_as = bdp_ai_vs_ai_substitution_ward
		every_relation = { type = bodyguard limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_court_position_holder = { type = bodyguard_court_position limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_court_position_holder = { type = household_guard_court_position limit = { is_ai = yes } bdp_ai_vs_ai_prepare_candidate_effect = yes }
		every_relation = {
			type = bodyguard
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_b } } add_to_temporary_list = bdp_ai_vs_ai_professional_b }
		}
		every_court_position_holder = {
			type = bodyguard_court_position
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_b } } add_to_temporary_list = bdp_ai_vs_ai_professional_b }
		}
		every_court_position_holder = {
			type = household_guard_court_position
			limit = { bdp_ai_vs_ai_present_substitute_eligible_trigger = yes }
			if = { limit = { NOT = { is_in_list = bdp_ai_vs_ai_professional_b } } add_to_temporary_list = bdp_ai_vs_ai_professional_b }
		}
	}
	ordered_in_list = { list = bdp_ai_vs_ai_professional_b order_by = prowess position = 0 save_scope_as = bdp_ai_vs_ai_strongest_professional_b }
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_strongest_professional_b }
		random_list = {
			35 = {
				random_in_list = {
					list = bdp_ai_vs_ai_professional_b
					limit = { this.prowess = scope:bdp_ai_vs_ai_strongest_professional_b.prowess }
					save_scope_as = bdp_ai_vs_ai_selected_professional_b
				}
			}
			65 = { }
		}
	}
}

bdp_ai_vs_ai_apply_substitutions_effect = {
	clear_saved_scope = bdp_ai_vs_ai_squire_a
	clear_saved_scope = bdp_ai_vs_ai_squire_b
	scope:bdp_ai_vs_ai_ward_a = { save_scope_as = bdp_ai_vs_ai_actual_a }
	scope:bdp_ai_vs_ai_ward_b = { save_scope_as = bdp_ai_vs_ai_actual_b }

	scope:bdp_ai_vs_ai_side_a = {
		save_scope_as = combat_side
		save_scope_as = bdp_ai_vs_ai_substitution_side
	}
	bdp_ai_vs_ai_select_squire_for_a_effect = yes
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_selected_squire_a }
		scope:bdp_ai_vs_ai_ward_a = { add_character_flag = { flag = bdp_ai_vs_ai_used_current_battle days = 30 } }
		scope:bdp_ai_vs_ai_selected_squire_a = {
			save_scope_as = bdp_ai_vs_ai_actual_a
			save_scope_as = bdp_ai_vs_ai_squire_a
		}
	}
	else = {
		bdp_ai_vs_ai_select_professional_for_a_effect = yes
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_selected_professional_a }
			scope:bdp_ai_vs_ai_ward_a = { add_character_flag = { flag = bdp_ai_vs_ai_used_current_battle days = 30 } }
			scope:bdp_ai_vs_ai_selected_professional_a = { save_scope_as = bdp_ai_vs_ai_actual_a }
		}
	}

	scope:bdp_ai_vs_ai_side_b = {
		save_scope_as = combat_side
		save_scope_as = bdp_ai_vs_ai_substitution_side
	}
	bdp_ai_vs_ai_select_squire_for_b_effect = yes
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_selected_squire_b }
		scope:bdp_ai_vs_ai_ward_b = { add_character_flag = { flag = bdp_ai_vs_ai_used_current_battle days = 30 } }
		scope:bdp_ai_vs_ai_selected_squire_b = {
			save_scope_as = bdp_ai_vs_ai_actual_b
			save_scope_as = bdp_ai_vs_ai_squire_b
		}
	}
	else = {
		bdp_ai_vs_ai_select_professional_for_b_effect = yes
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_selected_professional_b }
			scope:bdp_ai_vs_ai_ward_b = { add_character_flag = { flag = bdp_ai_vs_ai_used_current_battle days = 30 } }
			scope:bdp_ai_vs_ai_selected_professional_b = { save_scope_as = bdp_ai_vs_ai_actual_b }
		}
	}
}

# Only the real fighters spend exposure and write Chronicle leaves.
bdp_ai_vs_ai_mark_actual_fighter_effect = {
	bdp_ai_vs_ai_prepare_candidate_effect = yes
	change_variable = { name = bdp_ai_vs_ai_lifetime_duels add = 1 }
	save_temporary_scope_as = bdp_ai_vs_ai_exposure_candidate
	if = {
		limit = { exists = scope:combat_side.combat.combat_war }
		scope:combat_side.combat.combat_war = {
			if = {
				limit = {
					is_target_in_variable_list = {
						name = bdp_ai_vs_ai_second_exposure
						target = scope:bdp_ai_vs_ai_exposure_candidate
					}
				}
				add_to_variable_list = {
					name = bdp_ai_vs_ai_third_exposure
					target = scope:bdp_ai_vs_ai_exposure_candidate
				}
			}
			else_if = {
				limit = {
					is_target_in_variable_list = {
						name = bdp_ai_vs_ai_first_exposure
						target = scope:bdp_ai_vs_ai_exposure_candidate
					}
				}
				add_to_variable_list = {
					name = bdp_ai_vs_ai_second_exposure
					target = scope:bdp_ai_vs_ai_exposure_candidate
				}
			}
			else = {
				add_to_variable_list = {
					name = bdp_ai_vs_ai_first_exposure
					target = scope:bdp_ai_vs_ai_exposure_candidate
				}
			}
		}
	}
	add_character_flag = { flag = bdp_ai_vs_ai_personal_cooldown days = 60 }
	add_character_flag = { flag = bdp_ai_vs_ai_used_current_battle days = 30 }
	add_character_flag = { flag = bdp_ai_vs_ai_chronicle_participant days = 2 }
	if = {
		limit = { NOT = { has_character_flag = already_fighting } }
		add_character_flag = { flag = bdp_ai_vs_ai_added_already_fighting days = 30 }
		add_character_flag = { flag = already_fighting days = 30 }
	}
}

bdp_ai_vs_ai_select_outcome_profile_effect = {
	clear_saved_scope = bdp_ai_vs_ai_outcome_profile
	if = {
		limit = { scope:bdp_ai_vs_ai_winner = { has_trait = sadistic } }
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:sadistic }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_winner = { has_trait = vengeful } }
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:vengeful }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_winner = { has_trait = wrathful } }
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:wrathful }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_winner = { has_trait = callous } }
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:callous }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_winner = { has_trait = arbitrary } }
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:arbitrary }
	}
	else_if = {
		limit = {
			scope:bdp_ai_vs_ai_winner = {
				OR = {
					has_trait = greedy
					AND = {
						ai_rationality >= 25
						scope:bdp_ai_vs_ai_loser = { is_landed = yes }
					}
				}
			}
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:pragmatic }
	}
	else_if = {
		limit = {
			scope:bdp_ai_vs_ai_winner = {
				OR = {
					has_trait = compassionate
					has_trait = forgiving
					has_trait = trusting
					has_trait = humble
					has_trait = calm
				}
			}
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:peaceful }
	}
	else = {
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome_profile value = flag:default }
	}
}

bdp_ai_vs_ai_roll_outcome_effect = {
	bdp_ai_vs_ai_select_outcome_profile_effect = yes
	clear_saved_scope = bdp_ai_vs_ai_outcome
	random_list = {
		0 = {
			modifier = { add = bdp_ai_vs_ai_outcome_defeat_weight_value }
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:defeat }
		}
		0 = {
			modifier = { add = bdp_ai_vs_ai_outcome_mercy_weight_value }
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:mercy }
		}
		0 = {
			modifier = { add = bdp_ai_vs_ai_outcome_capture_weight_value }
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:capture }
		}
		0 = {
			trigger = {
				scope:bdp_ai_vs_ai_loser = {
					OR = {
						NOT = { has_trait = one_legged }
						NOT = { has_trait = disfigured }
						NOT = { has_trait = one_eyed }
						NOT = { has_trait = maimed }
						NOT = { has_trait = half_blind has_inactive_trait = halfblind_scar }
					}
				}
			}
			modifier = { add = bdp_ai_vs_ai_outcome_maim_weight_value }
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:maim }
		}
		0 = {
			modifier = { add = bdp_ai_vs_ai_outcome_death_weight_value }
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:death }
		}
	}
}

bdp_ai_vs_ai_apply_capture_effect = {
	clear_saved_scope = bdp_ai_vs_ai_imprisoner
	if = {
		limit = { scope:bdp_ai_vs_ai_winner = { is_landed = yes } }
		scope:bdp_ai_vs_ai_winner = { save_scope_as = bdp_ai_vs_ai_imprisoner }
	}
	else_if = {
		limit = { exists = scope:bdp_ai_vs_ai_winner.liege_or_court_owner }
		scope:bdp_ai_vs_ai_winner.liege_or_court_owner = { save_scope_as = bdp_ai_vs_ai_imprisoner }
	}
	if = {
		limit = {
			OR = {
				NOT = { exists = scope:bdp_ai_vs_ai_imprisoner }
				scope:bdp_ai_vs_ai_imprisoner = {
					OR = { is_alive = no is_landed = no }
				}
			}
			exists = scope:combat_side.side_primary_participant
			scope:combat_side.side_primary_participant = { is_alive = yes is_landed = yes }
		}
		scope:combat_side.side_primary_participant = { save_scope_as = bdp_ai_vs_ai_imprisoner }
	}
	if = {
		limit = {
			exists = scope:bdp_ai_vs_ai_imprisoner
			scope:bdp_ai_vs_ai_imprisoner = { is_alive = yes is_landed = yes }
			scope:bdp_ai_vs_ai_loser = { is_alive = yes is_imprisoned = no }
			NOT = { scope:bdp_ai_vs_ai_imprisoner = scope:bdp_ai_vs_ai_loser }
		}
		# Direct house arrest is safe here. The scheme helper is not.
		scope:bdp_ai_vs_ai_imprisoner = {
			imprison = {
				target = scope:bdp_ai_vs_ai_loser
				type = house_arrest
			}
		}
		if = {
			limit = {
				scope:bdp_ai_vs_ai_loser = {
					is_imprisoned_by = scope:bdp_ai_vs_ai_imprisoner
				}
			}
			scope:bdp_ai_vs_ai_loser = {
				bdp_battlefield_chronicle_mark_latest_defeat_outcome_effect = {
					OUTCOME = captured
					OPPONENT = scope:bdp_ai_vs_ai_winner
				}
			}
			scope:bdp_ai_vs_ai_winner = {
				bdp_battlefield_chronicle_mark_latest_victory_outcome_effect = {
					OUTCOME = captured
					OPPONENT = scope:bdp_ai_vs_ai_loser
				}
			}
		}
		else = {
			# If capture fails, count a normal defeat.
			save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:defeat }
			scope:bdp_ai_vs_ai_winner = { remove_variable = bdp_chronicle_pending_outcome_memory }
			scope:bdp_ai_vs_ai_loser = { remove_variable = bdp_chronicle_pending_defeat_outcome_memory }
		}
	}
	else = {
		# No valid captor means a normal defeat.
		save_scope_value_as = { name = bdp_ai_vs_ai_outcome value = flag:defeat }
		scope:bdp_ai_vs_ai_winner = { remove_variable = bdp_chronicle_pending_outcome_memory }
		scope:bdp_ai_vs_ai_loser = { remove_variable = bdp_chronicle_pending_defeat_outcome_memory }
	}
}

# Write reputation and Chronicle first, then run the full consequence pass.
bdp_ai_vs_ai_apply_outcome_effect = {
	if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:mercy }
		scope:bdp_ai_vs_ai_winner = {
			battlefield_duel_spare_stress_effect = yes
			bdp_battlefield_chronicle_mark_latest_victory_outcome_effect = {
				OUTCOME = spared
				OPPONENT = scope:bdp_ai_vs_ai_loser
			}
		}
		scope:bdp_ai_vs_ai_loser = {
			bdp_battlefield_chronicle_mark_latest_defeat_outcome_effect = {
				OUTCOME = spared
				OPPONENT = scope:bdp_ai_vs_ai_winner
			}
		}
		scope:bdp_ai_vs_ai_loser = { add_character_flag = { flag = battlefiel_duel_recipient_spare days = 360 } }
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:capture }
		bdp_ai_vs_ai_apply_capture_effect = yes
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:maim }
		scope:bdp_ai_vs_ai_loser = {
			bdp_battlefield_chronicle_mark_latest_defeat_outcome_effect = {
				OUTCOME = maimed
				OPPONENT = scope:bdp_ai_vs_ai_winner
			}
		}
		scope:bdp_ai_vs_ai_loser = { maimed_in_battle_effect = yes }
		scope:bdp_ai_vs_ai_winner = {
			bdp_battlefield_chronicle_mark_latest_victory_outcome_effect = {
				OUTCOME = maimed
				OPPONENT = scope:bdp_ai_vs_ai_loser
			}
		}
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:death }
		# Save totals before death turns the loser into a weak scope.
		bdp_ai_vs_ai_update_lifetime_totals_effect = yes
		save_scope_value_as = { name = bdp_ai_vs_ai_totals_recorded value = yes }
		scope:bdp_ai_vs_ai_loser = {
			bdp_battlefield_chronicle_mark_latest_defeat_outcome_effect = {
				OUTCOME = slain
				OPPONENT = scope:bdp_ai_vs_ai_winner
			}
		}
		scope:bdp_ai_vs_ai_winner = {
			battlefield_duel_weapon_execution_resolution_effect = {
				KILL_EFFECT = battlefield_duel_kill_effect
			}
		}
	}
	else = {
		scope:bdp_ai_vs_ai_winner = { remove_variable = bdp_chronicle_pending_outcome_memory }
		scope:bdp_ai_vs_ai_loser = { remove_variable = bdp_chronicle_pending_defeat_outcome_memory }
	}
}

bdp_ai_vs_ai_update_lifetime_totals_effect = {
	scope:bdp_ai_vs_ai_winner = {
		if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_victories } } set_variable = { name = bdp_ai_vs_ai_lifetime_victories value = 0 } }
		change_variable = { name = bdp_ai_vs_ai_lifetime_victories add = 1 }
	}
	scope:bdp_ai_vs_ai_loser = {
		if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_defeats } } set_variable = { name = bdp_ai_vs_ai_lifetime_defeats value = 0 } }
		change_variable = { name = bdp_ai_vs_ai_lifetime_defeats add = 1 }
	}
	if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:mercy }
		scope:bdp_ai_vs_ai_winner = {
			if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_mercies } } set_variable = { name = bdp_ai_vs_ai_lifetime_mercies value = 0 } }
			change_variable = { name = bdp_ai_vs_ai_lifetime_mercies add = 1 }
		}
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:capture }
		scope:bdp_ai_vs_ai_winner = {
			if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_captures } } set_variable = { name = bdp_ai_vs_ai_lifetime_captures value = 0 } }
			change_variable = { name = bdp_ai_vs_ai_lifetime_captures add = 1 }
		}
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:maim }
		scope:bdp_ai_vs_ai_winner = {
			if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_maimings } } set_variable = { name = bdp_ai_vs_ai_lifetime_maimings value = 0 } }
			change_variable = { name = bdp_ai_vs_ai_lifetime_maimings add = 1 }
		}
	}
	else_if = {
		limit = { scope:bdp_ai_vs_ai_outcome = flag:death }
		scope:bdp_ai_vs_ai_winner = {
			if = { limit = { NOT = { has_variable = bdp_ai_vs_ai_lifetime_kills } } set_variable = { name = bdp_ai_vs_ai_lifetime_kills value = 0 } }
			change_variable = { name = bdp_ai_vs_ai_lifetime_kills add = 1 }
		}
	}
}

bdp_ai_vs_ai_resolve_selected_duel_effect = {
	scope:bdp_ai_vs_ai_actual_a = { save_scope_as = sc_attacker }
	scope:bdp_ai_vs_ai_actual_b = { save_scope_as = sc_defender }
	bdp_battlefield_reputation_begin_duel_effect = yes

	clear_saved_scope = bdp_ai_vs_ai_winner
	clear_saved_scope = bdp_ai_vs_ai_loser
	random_list = {
		0 = {
			modifier = { add = bdp_ai_vs_ai_side_a_victory_weight_value }
			scope:bdp_ai_vs_ai_actual_a = { save_scope_as = bdp_ai_vs_ai_winner save_scope_as = sc_victor }
			scope:bdp_ai_vs_ai_actual_b = { save_scope_as = bdp_ai_vs_ai_loser save_scope_as = sc_loser }
			scope:bdp_ai_vs_ai_side_a = { save_scope_as = combat_side }
		}
		0 = {
			modifier = { add = bdp_ai_vs_ai_side_b_victory_weight_value }
			scope:bdp_ai_vs_ai_actual_b = { save_scope_as = bdp_ai_vs_ai_winner save_scope_as = sc_victor }
			scope:bdp_ai_vs_ai_actual_a = { save_scope_as = bdp_ai_vs_ai_loser save_scope_as = sc_loser }
			scope:bdp_ai_vs_ai_side_b = { save_scope_as = combat_side }
		}
	}
	scope:bdp_ai_vs_ai_winner = { save_scope_as = actor }
	scope:bdp_ai_vs_ai_loser = { save_scope_as = enemy_knight }

	# The sixth win earns Aspiring without also paying Blademaster XP.
	scope:bdp_ai_vs_ai_winner = {
		bdp_ai_blademaster_award_synthetic_victory_xp_effect = yes
		bdp_ai_blademaster_record_live_opponent_victory_effect = {
			OPPONENT = scope:bdp_ai_vs_ai_loser
		}
	}

	clear_saved_scope = bdp_ai_vs_ai_legendary_pair
	if = {
		limit = {
			scope:bdp_ai_vs_ai_winner = { has_variable = bdp_battlefield_reputation var:bdp_battlefield_reputation >= 60 }
			scope:bdp_ai_vs_ai_loser = { has_variable = bdp_battlefield_reputation var:bdp_battlefield_reputation >= 60 }
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_legendary_pair value = yes }
	}
	clear_saved_scope = bdp_ai_vs_ai_winning_squire
	if = {
		limit = {
			OR = {
				AND = { exists = scope:bdp_ai_vs_ai_squire_a scope:bdp_ai_vs_ai_winner = scope:bdp_ai_vs_ai_squire_a }
				AND = { exists = scope:bdp_ai_vs_ai_squire_b scope:bdp_ai_vs_ai_winner = scope:bdp_ai_vs_ai_squire_b }
			}
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_winning_squire value = yes }
	}
	clear_saved_scope = bdp_ai_vs_ai_winner_below_legend
	if = {
		limit = {
			scope:bdp_ai_vs_ai_winner = {
				OR = {
					NOT = { has_variable = bdp_battlefield_reputation }
					var:bdp_battlefield_reputation < 60
				}
			}
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_winner_below_legend value = yes }
	}

	# AI careers get the Stature award a second time.
	scope:bdp_ai_vs_ai_winner = {
		if = {
			limit = { NOT = { has_variable = bdp_battlefield_reputation } }
			set_variable = { name = bdp_battlefield_reputation value = 0 }
		}
		set_variable = { name = bdp_ai_vs_ai_reputation_before value = var:bdp_battlefield_reputation }
	}
	bdp_battlefield_reputation_finalise_duel_effect = yes
	scope:bdp_ai_vs_ai_winner = {
		set_variable = { name = bdp_ai_vs_ai_reputation_bonus value = var:bdp_battlefield_reputation }
		change_variable = { name = bdp_ai_vs_ai_reputation_bonus subtract = var:bdp_ai_vs_ai_reputation_before }
		change_variable = { name = bdp_battlefield_reputation add = var:bdp_ai_vs_ai_reputation_bonus }
		remove_variable = bdp_ai_vs_ai_reputation_before
		remove_variable = bdp_ai_vs_ai_reputation_bonus
		bdp_battlefield_reputation_refresh_rank_modifier_effect = yes
	}
	clear_saved_scope = bdp_ai_vs_ai_new_legend
	if = {
		limit = {
			exists = scope:bdp_ai_vs_ai_winner_below_legend
			scope:bdp_ai_vs_ai_winner = { has_variable = bdp_battlefield_reputation var:bdp_battlefield_reputation >= 60 }
		}
		save_scope_value_as = { name = bdp_ai_vs_ai_new_legend value = yes }
	}

	bdp_ai_vs_ai_roll_outcome_effect = yes
	debug_log = "BDP AI-vs-AI selected duel resolved"
	# Keep full diagnostics for this rare fallback only.
	if = {
		limit = { scope:bdp_ai_vs_ai_phase_producer = flag:bdp_dragon_combat_end }
		debug_log = "BDP AI-vs-AI dragon combat-end fallback selected duel; scopes follow"
		debug_log_date = yes
		debug_log_scopes = yes
	}
	# Notify before capture, injury, or death can break a scope.
	bdp_ai_vs_ai_send_result_messages_effect = yes
	clear_saved_scope = bdp_ai_vs_ai_totals_recorded
	bdp_ai_vs_ai_apply_outcome_effect = yes
	if = {
		limit = { NOT = { exists = scope:bdp_ai_vs_ai_totals_recorded } }
		bdp_ai_vs_ai_update_lifetime_totals_effect = yes
	}
}

bdp_ai_vs_ai_attempt_duel_slot_effect = {
	clear_saved_scope = bdp_ai_vs_ai_slot_resolved
	bdp_ai_vs_ai_select_pair_effect = yes
	if = {
		limit = {
			exists = scope:bdp_ai_vs_ai_ward_a
			exists = scope:bdp_ai_vs_ai_ward_b
			NOT = { scope:bdp_ai_vs_ai_ward_a = scope:bdp_ai_vs_ai_ward_b }
		}
		bdp_ai_vs_ai_apply_substitutions_effect = yes
		if = {
			limit = {
				exists = scope:bdp_ai_vs_ai_actual_a
				exists = scope:bdp_ai_vs_ai_actual_b
				NOT = { scope:bdp_ai_vs_ai_actual_a = scope:bdp_ai_vs_ai_actual_b }
				scope:bdp_ai_vs_ai_actual_a = { bdp_ai_vs_ai_actual_fighter_ready_trigger = yes }
				scope:bdp_ai_vs_ai_actual_b = { bdp_ai_vs_ai_actual_fighter_ready_trigger = yes }
			}
			scope:bdp_ai_vs_ai_actual_a = { bdp_ai_vs_ai_mark_actual_fighter_effect = yes }
			scope:bdp_ai_vs_ai_actual_b = { bdp_ai_vs_ai_mark_actual_fighter_effect = yes }
			bdp_ai_vs_ai_resolve_selected_duel_effect = yes
			save_scope_value_as = { name = bdp_ai_vs_ai_slot_resolved value = yes }
			save_scope_value_as = { name = bdp_ai_vs_ai_any_duel_resolved value = yes }
		}
	}
}

bdp_ai_vs_ai_send_realm_popup_effect = {
	every_player = {
		send_interface_message = {
			type = msg_bdp_ai_vs_ai_realm
			title = $TITLE$
			desc = {
				first_valid = {
					triggered_desc = { trigger = { exists = scope:bdp_ai_vs_ai_winning_squire scope:bdp_ai_vs_ai_outcome = flag:death } desc = bdp_ai_vs_ai_squire_death_desc }
					triggered_desc = { trigger = { exists = scope:bdp_ai_vs_ai_winning_squire scope:bdp_ai_vs_ai_outcome = flag:capture } desc = bdp_ai_vs_ai_squire_capture_desc }
					triggered_desc = { trigger = { exists = scope:bdp_ai_vs_ai_winning_squire scope:bdp_ai_vs_ai_outcome = flag:maim } desc = bdp_ai_vs_ai_squire_maim_desc }
					triggered_desc = { trigger = { exists = scope:bdp_ai_vs_ai_winning_squire scope:bdp_ai_vs_ai_outcome = flag:mercy } desc = bdp_ai_vs_ai_squire_mercy_desc }
					triggered_desc = { trigger = { exists = scope:bdp_ai_vs_ai_winning_squire } desc = bdp_ai_vs_ai_squire_defeat_desc }
					triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:death } desc = bdp_ai_vs_ai_result_death_desc }
					triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:capture } desc = bdp_ai_vs_ai_result_capture_desc }
					triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:maim } desc = bdp_ai_vs_ai_result_maim_desc }
					triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:mercy } desc = bdp_ai_vs_ai_result_mercy_desc }
					desc = bdp_ai_vs_ai_result_defeat_desc
				}
			}
			left_icon = scope:bdp_ai_vs_ai_winner
			right_icon = scope:bdp_ai_vs_ai_loser
		}
	}
}

bdp_ai_vs_ai_send_result_messages_effect = {
	debug_log = "BDP AI-vs-AI notification dispatch reached"
	if = {
		limit = { exists = scope:bdp_ai_vs_ai_winning_squire }
		if = {
			limit = { exists = scope:bdp_ai_vs_ai_new_legend }
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_new_legend_title }
		}
		else = {
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_squire_title }
		}
	}
	else_if = {
		limit = { exists = scope:bdp_ai_vs_ai_legendary_pair }
		if = {
			limit = { scope:bdp_ai_vs_ai_outcome = flag:death }
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_legend_death_title }
		}
		else_if = {
			limit = { scope:bdp_ai_vs_ai_outcome = flag:capture }
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_legend_capture_title }
		}
		else_if = {
			limit = { scope:bdp_ai_vs_ai_outcome = flag:maim }
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_legend_maim_title }
		}
		else_if = {
			limit = { scope:bdp_ai_vs_ai_outcome = flag:mercy }
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_legend_mercy_title }
		}
		else = {
			bdp_ai_vs_ai_send_realm_popup_effect = { TITLE = bdp_ai_vs_ai_legend_duel_title }
		}
	}
	else = {
		every_player = {
			limit = { bdp_ai_vs_ai_player_relevance_trigger = yes }
			send_interface_message = {
				type = msg_bdp_ai_vs_ai_result
				title = bdp_ai_vs_ai_ordinary_title
				desc = {
					first_valid = {
						triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:death } desc = bdp_ai_vs_ai_result_death_desc }
						triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:capture } desc = bdp_ai_vs_ai_result_capture_desc }
						triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:maim } desc = bdp_ai_vs_ai_result_maim_desc }
						triggered_desc = { trigger = { scope:bdp_ai_vs_ai_outcome = flag:mercy } desc = bdp_ai_vs_ai_result_mercy_desc }
						desc = bdp_ai_vs_ai_result_defeat_desc
					}
				}
				left_icon = scope:bdp_ai_vs_ai_winner
				right_icon = scope:bdp_ai_vs_ai_loser
			}
		}
	}
}
