mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-28 20:55:44 +00:00
Fix lone faction leader validation (#8691)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user