From 515bfcbb6f6048870eb25ae29c603cf16b1926a2 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 28 Nov 2022 11:16:10 +0200 Subject: [PATCH] Moved updateProximity to civ transient updater --- .../civilization/CivInfoTransientUpdater.kt | 78 ++++++++++++++++++- .../logic/civilization/CivilizationInfo.kt | 74 +----------------- 2 files changed, 78 insertions(+), 74 deletions(-) diff --git a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt index 7ae4b0efd5..4432cdb57b 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt @@ -2,6 +2,7 @@ package com.unciv.logic.civilization import com.unciv.Constants import com.unciv.UncivGame +import com.unciv.logic.map.MapShape import com.unciv.logic.map.TileInfo import com.unciv.models.ruleset.tile.ResourceSupplyList import com.unciv.models.ruleset.unique.UniqueType @@ -70,7 +71,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) { if (civInfo.isSpectator() || UncivGame.Current.viewEntireMapForDebug) { val allTiles = civInfo.gameInfo.tileMap.values.toSet() civInfo.viewableTiles = allTiles - civInfo.addExploredTiles(allTiles.map { it.position }.toHashSet() + civInfo.addExploredTiles(allTiles.asSequence().map { it.position }) civInfo.viewableInvisibleUnitsTiles = allTiles return } @@ -204,4 +205,79 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) { civInfo.updateStatsForNextTurn() // More or less resources = more or less happiness, with potential domino effects } + + + fun updateProximity(otherCiv: CivilizationInfo, preCalculated: Proximity? = null): Proximity { + if (otherCiv == civInfo) return Proximity.None + if (preCalculated != null) { + // We usually want to update this for a pair of civs at the same time + // Since this function *should* be symmetrical for both civs, we can just do it once + civInfo.proximity[otherCiv.civName] = preCalculated + return preCalculated + } + if (civInfo.cities.isEmpty() || otherCiv.cities.isEmpty()) { + civInfo.proximity[otherCiv.civName] = Proximity.None + return Proximity.None + } + + val mapParams = civInfo.gameInfo.tileMap.mapParameters + var minDistance = 100000 // a long distance + var totalDistance = 0 + var connections = 0 + + var proximity = Proximity.None + + for (ourCity in civInfo.cities) { + for (theirCity in otherCiv.cities) { + val distance = ourCity.getCenterTile().aerialDistanceTo(theirCity.getCenterTile()) + totalDistance += distance + connections++ + if (minDistance > distance) minDistance = distance + } + } + + if (minDistance <= 7) { + proximity = Proximity.Neighbors + } else if (connections > 0) { + val averageDistance = totalDistance / connections + val mapFactor = if (mapParams.shape == MapShape.rectangular) + (mapParams.mapSize.height + mapParams.mapSize.width) / 2 + else (mapParams.mapSize.radius * 3) / 2 // slightly less area than equal size rect + + val closeDistance = ((mapFactor * 25) / 100).coerceIn(10, 20) + val farDistance = ((mapFactor * 45) / 100).coerceIn(20, 50) + + proximity = if (minDistance <= 11 && averageDistance <= closeDistance) + Proximity.Close + else if (averageDistance <= farDistance) + Proximity.Far + else + Proximity.Distant + } + + // Check if different continents (unless already max distance, or water map) + if (connections > 0 && proximity != Proximity.Distant && !civInfo.gameInfo.tileMap.isWaterMap() + && civInfo.getCapital()!!.getCenterTile().getContinent() != otherCiv.getCapital()!!.getCenterTile().getContinent() + ) { + // Different continents - increase separation by one step + proximity = when (proximity) { + Proximity.Far -> Proximity.Distant + Proximity.Close -> Proximity.Far + Proximity.Neighbors -> Proximity.Close + else -> proximity + } + } + + // If there aren't many players (left) we can't be that far + val numMajors = civInfo.gameInfo.getAliveMajorCivs().size + if (numMajors <= 2 && proximity > Proximity.Close) + proximity = Proximity.Close + if (numMajors <= 4 && proximity > Proximity.Far) + proximity = Proximity.Far + + civInfo.proximity[otherCiv.civName] = proximity + + return proximity + } + } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 72ccca04e0..dcc831d5f6 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -14,7 +14,6 @@ import com.unciv.logic.civilization.RuinsManager.RuinsManager import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomacyManager import com.unciv.logic.civilization.diplomacy.DiplomaticStatus -import com.unciv.logic.map.MapShape import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo import com.unciv.logic.map.UnitMovementAlgorithms @@ -1321,78 +1320,7 @@ class CivilizationInfo : IsPartOfGameInfoSerialization { ).toInt() } - fun updateProximity(otherCiv: CivilizationInfo, preCalculated: Proximity? = null): Proximity { - if (otherCiv == this) return Proximity.None - if (preCalculated != null) { - // We usually want to update this for a pair of civs at the same time - // Since this function *should* be symmetrical for both civs, we can just do it once - this.proximity[otherCiv.civName] = preCalculated - return preCalculated - } - if (cities.isEmpty() || otherCiv.cities.isEmpty()) { - proximity[otherCiv.civName] = Proximity.None - return Proximity.None - } - - val mapParams = gameInfo.tileMap.mapParameters - var minDistance = 100000 // a long distance - var totalDistance = 0 - var connections = 0 - - var proximity = Proximity.None - - for (ourCity in cities) { - for (theirCity in otherCiv.cities) { - val distance = ourCity.getCenterTile().aerialDistanceTo(theirCity.getCenterTile()) - totalDistance += distance - connections++ - if (minDistance > distance) minDistance = distance - } - } - - if (minDistance <= 7) { - proximity = Proximity.Neighbors - } else if (connections > 0) { - val averageDistance = totalDistance / connections - val mapFactor = if (mapParams.shape == MapShape.rectangular) - (mapParams.mapSize.height + mapParams.mapSize.width) / 2 - else (mapParams.mapSize.radius * 3) / 2 // slightly less area than equal size rect - - val closeDistance = ((mapFactor * 25) / 100).coerceIn(10, 20) - val farDistance = ((mapFactor * 45) / 100).coerceIn(20, 50) - - proximity = if (minDistance <= 11 && averageDistance <= closeDistance) - Proximity.Close - else if (averageDistance <= farDistance) - Proximity.Far - else - Proximity.Distant - } - - // Check if different continents (unless already max distance, or water map) - if (connections > 0 && proximity != Proximity.Distant && !gameInfo.tileMap.isWaterMap() - && getCapital()!!.getCenterTile().getContinent() != otherCiv.getCapital()!!.getCenterTile().getContinent() - ) { - // Different continents - increase separation by one step - proximity = when (proximity) { - Proximity.Far -> Proximity.Distant - Proximity.Close -> Proximity.Far - Proximity.Neighbors -> Proximity.Close - else -> proximity - } - } - - // If there aren't many players (left) we can't be that far - val numMajors = gameInfo.getAliveMajorCivs().size - if (numMajors <= 2 && proximity > Proximity.Close) - proximity = Proximity.Close - if (numMajors <= 4 && proximity > Proximity.Far) - proximity = Proximity.Far - - this.proximity[otherCiv.civName] = proximity - - return proximity - } + fun updateProximity(otherCiv: CivilizationInfo, preCalculated: Proximity? = null): Proximity = transients().updateProximity(otherCiv, preCalculated) /** * Removes current capital then moves capital to argument city if not null