Fix lone faction leader validation (#8691)

This commit is contained in:
2026-07-17 19:51:18 -07:00
committed by GitHub
parent 8cce072614
commit 1bea610232
2 changed files with 48 additions and 6 deletions
@@ -35,7 +35,7 @@ import net.eagle0.eagle.model.state.command.common.{DiplomacyOptionType, Improve
import net.eagle0.eagle.model.state.command.selected.CombatUnit
import net.eagle0.eagle.model.state.command.selected.SelectedCommand.{DiplomacySelected, MarchSelected, ReconSelected}
import net.eagle0.eagle.model.state.date.Date.given
import net.eagle0.eagle.model.state.faction.FactionRelationship as FactionRelationshipC
import net.eagle0.eagle.model.state.faction.{FactionRelationship as FactionRelationshipC, FactionT}
import net.eagle0.eagle.model.state.game_state.GameState
import net.eagle0.eagle.model.state.province.ProvinceT
import net.eagle0.eagle.model.view.battalion.BattalionView as BattalionViewC
@@ -45,17 +45,22 @@ object MidGameAIClient {
private val SmallFactionProvinceCountForBorderDevelopment = 2
private val BorderDefenseConfidenceRatio = 1.0
private[ai] def hasLoneFactionLeader(
province: ProvinceT,
factions: Vector[FactionT]
): Boolean =
province.rulingFactionHeroIds match {
case Vector(heroId) => FactionUtils.isFactionLeader(heroId, factions)
case _ => false
}
private def validateNoFactionLeaderAlone(
gs: GameState,
factionId: FactionId
): Unit =
FactionUtils
.provinces(factionId, gs.provinces.values.toVector)
.filter { province =>
province.rulingFactionHeroIds.forall(
FactionUtils.isFactionLeader(_, gs.factions.values.toVector)
)
}
.filter(hasLoneFactionLeader(_, gs.factions.values.toVector))
.foreach { province =>
val currentDate = gs.currentDate
println(
@@ -66,6 +66,43 @@ class MidGameAIClientTest extends AnyFlatSpec with Matchers with BeforeAndAfterE
val leaderId = 58
val hubProvinceId = 4
"hasLoneFactionLeader" should "only match a province containing exactly one faction leader" in {
val faction = FactionC(
id = factionId,
factionHeadId = leaderId,
name = "",
leaderIds = Vector(leaderId, leaderId + 1)
)
def provinceWithHeroes(heroIds: HeroId*): ProvinceC =
ProvinceC(id = hubProvinceId, rulingFactionHeroIds = heroIds.toVector)
MidGameAIClient
.hasLoneFactionLeader(
provinceWithHeroes(),
Vector(faction)
)
.shouldBe(false)
MidGameAIClient
.hasLoneFactionLeader(
provinceWithHeroes(leaderId),
Vector(faction)
)
.shouldBe(true)
MidGameAIClient
.hasLoneFactionLeader(
provinceWithHeroes(leaderId, leaderId + 1),
Vector(faction)
)
.shouldBe(false)
MidGameAIClient
.hasLoneFactionLeader(
provinceWithHeroes(leaderId + 2),
Vector(faction)
)
.shouldBe(false)
}
// Helper methods to create maps from objects
private def mapifyProvinces(provinces: ProvinceT*): Map[ProvinceId, ProvinceT] =
provinces.map(p => p.id -> p).toMap