AI Quest Completion Behavior
This document describes which quests the AI attempts to complete proactively to recruit unaffiliated heroes.
Overview
The AI attempts to complete most quests via FulfillQuestsCommandSelector, which is invoked by MidGameAIClient.chosenFulfillEasyQuestsCommand.
Important scope limits:
- The selector only considers quests from unaffiliated heroes in provinces owned by the acting faction.
- It further filters to provinces ruled by that faction's leader.
- It only emits a command when the corresponding command is currently available.
- Handler order is fixed. The first handler that produces a valid command wins.
Quests the AI Actively Completes
This section lists quests with direct QuestCommandChooser handlers in FulfillQuestsCommandSelector.
Diplomacy Quests
| Quest |
Handler |
Conditions |
TruceWithFactionQuest |
TruceWithFactionQuestCommandChooser |
Target faction must meet trust conditions for truce |
TruceCountQuest |
TruceCountQuestCommandChooser |
Picks a random faction that meets trust conditions and isn't already in a truce/alliance |
AllianceQuest |
AllianceQuestCommandChooser |
Target faction must meet trust conditions for alliance and not already be in an alliance |
BetrayAllyQuest |
BetrayAllyQuestCommandChooser |
Break alliance with target faction. Only if factions don't share a border. Sends weakest non-leader hero. |
Province Development Quests
| Quest |
Handler |
Notes |
ImproveAgricultureQuest |
ImproveQuestCommandChooser |
Issues an Improve command with Agriculture type |
ImproveEconomyQuest |
ImproveQuestCommandChooser |
Issues an Improve command with Economy type |
ImproveInfrastructureQuest |
ImproveQuestCommandChooser |
Issues an Improve command with Infrastructure type |
TotalDevelopmentQuest |
TotalDevelopmentQuestCommandChooser |
Improve the lowest stat in the target province |
Resource Giving Quests
| Quest |
Handler |
Notes |
AlmsToProvinceQuest |
AlmsToProvinceQuestCommandChooser |
Gives food to the specified province |
AlmsAcrossRealmQuest |
AlmsAcrossRealmQuestCommandChooser |
Gives food from the province with the largest surplus |
GiveToHeroesInProvinceQuest |
GiveToHeroesInProvinceQuestCommandChooser |
Gives gold to the hero with the lowest loyalty in the specified province |
GiveToHeroesAcrossRealmQuest |
GiveToHeroesAcrossRealmQuestCommandChooser |
Gives gold from the province with the most gold available |
SpendOnFeastsInProvinceQuest |
SpendOnFeastsQuestCommandChooser |
Spend gold on feasts in the quest holder's province |
SpendOnFeastsAcrossRealmQuest |
SpendOnFeastsQuestCommandChooser |
Spend gold on the most expensive currently available feast |
SendSuppliesQuest |
SendSuppliesQuestCommandChooser |
Send food to the target province |
Prisoner Quests
| Quest |
Handler |
Notes |
ReleasePrisonerQuest |
ReleasePrisonerQuestCommandChooser |
Release a specific prisoner |
ExilePrisonerQuest |
ExilePrisonerQuestCommandChooser |
Exile a specific prisoner |
ExecutePrisonerQuest |
ExecutePrisonerQuestCommandChooser |
Execute a specific prisoner |
ReturnPrisonerQuest |
ReturnPrisonerQuestCommandChooser |
Return a prisoner to their faction |
ReleaseAllPrisonersQuest |
ReleaseAllPrisonersQuestCommandChooser |
Release all prisoners |
Province Order Quests
| Quest |
Handler |
Notes |
DevelopProvincesQuest |
DevelopProvincesQuestCommandChooser |
Switches provinces to Develop order. Prefers provinces without hostile neighbors. |
MobilizeProvincesQuest |
MobilizeProvincesQuestCommandChooser |
Switches provinces to Mobilize order. Prefers provinces with hostile neighbors. Skipped if a DevelopProvincesQuest also exists (conflict avoidance). |
Weather/Epidemic Quests
| Quest |
Handler |
Notes |
StartEpidemicQuest |
StartEpidemicQuestCommandChooser |
Start an epidemic in a province. Skipped if the target province belongs to the acting faction. |
StartBlizzardQuest |
ControlWeatherQuestCommandChooser |
Start a blizzard via ControlWeather command. Skipped if the target province belongs to the acting faction. |
StartDroughtQuest |
ControlWeatherQuestCommandChooser |
Start a drought via ControlWeather command. Skipped if the target province belongs to the acting faction. |
Military Quests
| Quest |
Handler |
Notes |
GrandArmyQuest |
GrandArmyQuestCommandChooser |
Uses OrganizeTroops to top off existing battalions and hire Light Infantry. Only executes if resources are sufficient to fully meet the troop target. |
BattalionDiversityQuest |
BattalionDiversityQuestCommandChooser |
Hires one battalion of a missing type to reach 3+ distinct types. Only attempts if the province already has 2+ existing types, has sufficient development (meetsRequirements), and gold/food surplus. |
UpgradeBattalionQuest |
UpgradeBattalionQuestCommandChooser |
Walks a priority tree per turn: arm-completes (with optional Visit Town and/or food sale setup) → train-completes → march in a pre-qualified neighbor battalion → organize/top-off of the target type → march in an unqualified neighbor battalion → develop Economy/Agriculture → train progress → develop Infrastructure → arm progress. Only chooses Visit Town when it directly enables an arm-completes finisher. |
Reconnaissance Quests
| Quest |
Handler |
Notes |
ReconSpecificProvincesQuest |
ReconSpecificProvincesQuestCommandChooser |
Recon specific target provinces. Prefers not-yet-reconned targets. |
ReconProvincesQuest |
ReconProvincesQuestCommandChooser |
Issues a Recon command to reconnoiter a province |
Beast Quests
| Quest |
Handler |
Notes |
FightBeastsAloneQuest |
FightBeastsAloneQuestCommandChooser |
Send an expendable non-leader hero to fight beasts without a battalion. Hero must have power at most MaxExpendableHeroPowerRatio (default 0.75) times the quest-giving hero's power. Picks the weakest eligible hero. |
Special Event Quests
| Quest |
Handler |
Notes |
ApprehendOutlawQuest |
ApprehendOutlawQuestCommandChooser |
Apprehend a specific outlaw hero when present in the province |
Other Quests
| Quest |
Handler |
Conditions |
RestProvinceQuest |
RestProvinceQuestCommandChooser |
Use the Rest command in a specific province |
SwearBrotherhoodWithHeroQuest |
SwearBrotherhoodQuestCommandChooser |
Swear brotherhood with a specific hero |
DismissSpecificVassalQuest |
DismissSpecificVassalCommandChooser |
Only if province has more than 2 heroes AND the unaffiliated hero's power >= target hero's power * RequiredPowerMultiplierForDismiss |
Quests the AI Handles Indirectly
These are not in FulfillQuestsCommandSelector, but other AI command-selection code can still bias toward completing them.
| Quest |
Handler |
Notes |
SuppressRiotByForceQuest |
CommandChoiceHelpers.handleRiotSelectedCommand |
When this quest exists and the faction has battalions, the AI prefers CrackDown over Give when handling riots. |
Quests the AI Does Not Yet Attempt to Complete
The following quests have no handler and must be completed naturally through gameplay. They are listed in rough priority order for future implementation.
Planned for Implementation
None currently planned.
Not Planned
These quests are too situational, passive, or risky to actively pursue. They may be completed naturally through gameplay.
BorderSecurityQuest - Have troops in a border province. Involves taking provinces; better left to organic expansion.
DefeatFactionQuest - Defeat a specific faction. Too risky to pursue proactively.
SpecificExpansionQuest - Conquer a specific province. Too risky.
ExpandToProvincesQuest - Expand to control a certain number of provinces. Too risky.
WinBattleOutnumberedQuest - Win a battle while outnumbered. Can't reliably engineer.
WinBattlesQuest - Win a number of battles. Passive.
RescueImprisonedLeaderQuest - Rescue an imprisoned leader. Complex multi-step.
WealthQuest - Accumulate gold and food. Happens passively.
RepairDevastationQuest - Repair devastation. Happens passively.
Implementation Details
The quest completion logic is located in:
FulfillQuestsCommandSelector.scala - Main entry point, iterates through choosers
quest_command_selectors/ - Individual quest handlers
Each chooser extends either:
QuestCommandChooser - For quests requiring randomness
DeterministicQuestCommandChooser - For quests with deterministic command selection
The AI prioritizes quests in the order they appear in FulfillQuestsCommandSelector.choosers:
- TruceWithFaction
- Improve (Agriculture/Economy/Infrastructure)
- TotalDevelopment
- AlmsToProvince
- GiveToHeroesInProvince
- AlmsAcrossRealm
- GiveToHeroesAcrossRealm
- TruceCount
- DismissSpecificVassal
- ReleasePrisoner
- ExilePrisoner
- ExecutePrisoner
- ReturnPrisoner
- ReleaseAllPrisoners
- ApprehendOutlaw
- SpendOnFeastsInProvince / SpendOnFeastsAcrossRealm
- RestProvince
- DevelopProvinces
- MobilizeProvinces
- SendSupplies
- StartEpidemic
- ControlWeather (StartBlizzard/StartDrought)
- GrandArmy
- FightBeastsAlone
- BattalionDiversity
- UpgradeBattalion
- ReconSpecificProvinces
- ReconProvinces
- SwearBrotherhood
- Alliance
- BetrayAlly