mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-28 21:35:42 +00:00
182 lines
9.6 KiB
Markdown
182 lines
9.6 KiB
Markdown
# 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`:
|
|
1. TruceWithFaction
|
|
2. Improve (Agriculture/Economy/Infrastructure)
|
|
3. TotalDevelopment
|
|
4. AlmsToProvince
|
|
5. GiveToHeroesInProvince
|
|
6. AlmsAcrossRealm
|
|
7. GiveToHeroesAcrossRealm
|
|
8. TruceCount
|
|
9. DismissSpecificVassal
|
|
10. ReleasePrisoner
|
|
11. ExilePrisoner
|
|
12. ExecutePrisoner
|
|
13. ReturnPrisoner
|
|
14. ReleaseAllPrisoners
|
|
15. ApprehendOutlaw
|
|
16. SpendOnFeastsInProvince / SpendOnFeastsAcrossRealm
|
|
17. RestProvince
|
|
18. DevelopProvinces
|
|
19. MobilizeProvinces
|
|
20. SendSupplies
|
|
21. StartEpidemic
|
|
22. ControlWeather (StartBlizzard/StartDrought)
|
|
23. GrandArmy
|
|
24. FightBeastsAlone
|
|
25. BattalionDiversity
|
|
26. UpgradeBattalion
|
|
27. ReconSpecificProvinces
|
|
28. ReconProvinces
|
|
29. SwearBrotherhood
|
|
30. Alliance
|
|
31. BetrayAlly
|