#9098 - getKnownCivs returns sequence

This commit is contained in:
Yair Morgenstern 2023-04-03 14:09:56 +03:00
parent a37391781a
commit d6f5e0badb
8 changed files with 14 additions and 14 deletions

View File

@ -199,9 +199,11 @@ class GameInfo : IsPartOfGameInfoSerialization, HasGameInfoSerializationVersion
} }
} }
@delegate:Transient
val civMap by lazy { civilizations.associateBy { it.civName } }
/** Get a civ by name /** Get a civ by name
* @throws NoSuchElementException if no civ of that name is in the game (alive or dead)! */ * @throws NoSuchElementException if no civ of that name is in the game (alive or dead)! */
fun getCivilization(civName: String) = civilizations.first { it.civName == civName } fun getCivilization(civName: String) = civMap.getValue(civName)
fun getCurrentPlayerCivilization() = currentPlayerCiv fun getCurrentPlayerCivilization() = currentPlayerCiv
fun getCivilizationsAsPreviews() = civilizations.map { it.asPreview() }.toMutableList() fun getCivilizationsAsPreviews() = civilizations.map { it.asPreview() }.toMutableList()
/** Get barbarian civ /** Get barbarian civ

View File

@ -303,7 +303,7 @@ object NextTurnAutomation {
if (!civInfo.isCityState()) { if (!civInfo.isCityState()) {
val potentialAllies = civInfo.getKnownCivs().filter { it.isCityState() } val potentialAllies = civInfo.getKnownCivs().filter { it.isCityState() }
if (potentialAllies.isNotEmpty()) { if (potentialAllies.any()) {
val cityState = val cityState =
potentialAllies.maxByOrNull { valueCityStateAlliance(civInfo, it) }!! potentialAllies.maxByOrNull { valueCityStateAlliance(civInfo, it) }!!
if (cityState.getAllyCiv() != civInfo.civName && valueCityStateAlliance(civInfo, cityState) > 0) { if (cityState.getAllyCiv() != civInfo.civName && valueCityStateAlliance(civInfo, cityState) > 0) {
@ -793,7 +793,7 @@ object NextTurnAutomation {
// If the AI declares war on a civ without knowing the location of any cities, it'll just keep amassing an army and not sending it anywhere, // If the AI declares war on a civ without knowing the location of any cities, it'll just keep amassing an army and not sending it anywhere,
// and end up at a massive disadvantage // and end up at a massive disadvantage
if (enemyCivs.isEmpty()) return if (enemyCivs.none()) return
val civWithBestMotivationToAttack = enemyCivs val civWithBestMotivationToAttack = enemyCivs
.map { Pair(it, motivationToAttack(civInfo, it)) } .map { Pair(it, motivationToAttack(civInfo, it)) }
@ -1014,7 +1014,7 @@ object NextTurnAutomation {
} }
if (highestOpinion == null) null if (highestOpinion == null) null
else knownMajorCivs.filter { civInfo.getDiplomacyManager(it).opinionOfOtherCiv() == highestOpinion}.random().civName else knownMajorCivs.filter { civInfo.getDiplomacyManager(it).opinionOfOtherCiv() == highestOpinion}.toList().random().civName
} else { } else {
civInfo.getAllyCiv() civInfo.getAllyCiv()

View File

@ -489,7 +489,7 @@ class WorkerAutomation(
val enemyCivs = civInfo.getKnownCivs() val enemyCivs = civInfo.getKnownCivs()
.filterNot { it == civInfo || it.cities.isEmpty() || !civInfo.getDiplomacyManager(it).canAttack() } .filterNot { it == civInfo || it.cities.isEmpty() || !civInfo.getDiplomacyManager(it).canAttack() }
// no potential enemies // no potential enemies
if (enemyCivs.isEmpty()) return false if (enemyCivs.none()) return false
val threatMapping: (Civilization) -> Int = { val threatMapping: (Civilization) -> Int = {
// the war is already a good nudge to build forts // the war is already a good nudge to build forts
@ -507,7 +507,7 @@ class WorkerAutomation(
civInfo, civInfo,
it) <= threatMapping(it) } it) <= threatMapping(it) }
// no threat, let's not build fort // no threat, let's not build fort
if (enemyCivsIsCloseEnough.isEmpty()) return false if (enemyCivsIsCloseEnough.none()) return false
// make list of enemy cities as sources of threat // make list of enemy cities as sources of threat
val enemyCities = mutableListOf<Tile>() val enemyCities = mutableListOf<Tile>()

View File

@ -310,7 +310,7 @@ class Civilization : IsPartOfGameInfoSerialization {
fun getProximity(civName: String) = proximity[civName] ?: Proximity.None fun getProximity(civName: String) = proximity[civName] ?: Proximity.None
/** Returns only undefeated civs, aka the ones we care about */ /** Returns only undefeated civs, aka the ones we care about */
fun getKnownCivs() = diplomacy.values.map { it.otherCiv() }.filter { !it.isDefeated() } fun getKnownCivs() = diplomacy.values.asSequence().map { it.otherCiv() }.filter { !it.isDefeated() }
fun knows(otherCivName: String) = diplomacy.containsKey(otherCivName) fun knows(otherCivName: String) = diplomacy.containsKey(otherCivName)
fun knows(otherCiv: Civilization) = knows(otherCiv.civName) fun knows(otherCiv: Civilization) = knows(otherCiv.civName)

View File

@ -416,7 +416,7 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization {
} }
/** Returns the [civilizations][Civilization] that know about both sides ([civInfo] and [otherCiv]) */ /** Returns the [civilizations][Civilization] that know about both sides ([civInfo] and [otherCiv]) */
fun getCommonKnownCivs(): Set<Civilization> = civInfo.getKnownCivs().intersect(otherCiv().getKnownCivs().toSet()) fun getCommonKnownCivs(): Set<Civilization> = civInfo.getKnownCivs().toSet().intersect(otherCiv().getKnownCivs().toSet())
/** Returns true when the [civInfo]'s territory is considered allied for [otherCiv]. /** Returns true when the [civInfo]'s territory is considered allied for [otherCiv].
* This includes friendly and allied city-states and the open border treaties. * This includes friendly and allied city-states and the open border treaties.

View File

@ -3,7 +3,6 @@ package com.unciv.logic.civilization.managers
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.Constants import com.unciv.Constants
import com.unciv.GUI import com.unciv.GUI
import com.unciv.UncivGame
import com.unciv.logic.GameInfo import com.unciv.logic.GameInfo
import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.civilization.CivFlags import com.unciv.logic.civilization.CivFlags
@ -779,8 +778,8 @@ class QuestManager : IsPartOfGameInfoSerialization {
val civilizationsToFind = challenger.getKnownCivs() val civilizationsToFind = challenger.getKnownCivs()
.filter { it.isAlive() && it.isMajorCiv() && !challenger.hasMetCivTerritory(it) } .filter { it.isAlive() && it.isMajorCiv() && !challenger.hasMetCivTerritory(it) }
if (civilizationsToFind.isNotEmpty()) if (civilizationsToFind.any())
return civilizationsToFind.random() return civilizationsToFind.toList().random()
return null return null
} }
@ -798,7 +797,7 @@ class QuestManager : IsPartOfGameInfoSerialization {
val validTargets = civInfo.getKnownCivs().filter { it.isCityState() && challenger.knows(it) val validTargets = civInfo.getKnownCivs().filter { it.isCityState() && challenger.knows(it)
&& civInfo.proximity[it.civName] == closestProximity } && civInfo.proximity[it.civName] == closestProximity }
return validTargets.randomOrNull() return validTargets.toList().randomOrNull()
} }
/** Returns a [Civilization] of the civ that most recently bullied [civInfo]. /** Returns a [Civilization] of the civ that most recently bullied [civInfo].

View File

@ -92,7 +92,7 @@ class TurnManager(val civInfo: Civilization) {
if (flag == CivFlags.CityStateGreatPersonGift.name) { if (flag == CivFlags.CityStateGreatPersonGift.name) {
val cityStateAllies: List<Civilization> = val cityStateAllies: List<Civilization> =
civInfo.getKnownCivs().filter { it.isCityState() && it.getAllyCiv() == civInfo.civName } civInfo.getKnownCivs().filter { it.isCityState() && it.getAllyCiv() == civInfo.civName }.toList()
val givingCityState = cityStateAllies.filter { it.cities.isNotEmpty() }.randomOrNull() val givingCityState = cityStateAllies.filter { it.cities.isNotEmpty() }.randomOrNull()
if (cityStateAllies.isNotEmpty()) civInfo.flagsCountdown[flag] = civInfo.flagsCountdown[flag]!! - 1 if (cityStateAllies.isNotEmpty()) civInfo.flagsCountdown[flag] = civInfo.flagsCountdown[flag]!! - 1

View File

@ -97,7 +97,6 @@ open class Tile : IsPartOfGameInfoSerialization {
private set private set
@Transient @Transient
/** Saves a sequence of a list */
lateinit var lastTerrain: Terrain lateinit var lastTerrain: Terrain
private set private set