From d9deb12df97cd3462c38af12106fd6ec746eb452 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Thu, 4 Jul 2024 00:02:14 +0300 Subject: [PATCH] perf: Calculate resource modifiers *once* when calculating resources --- core/src/com/unciv/logic/city/City.kt | 4 ++-- core/src/com/unciv/logic/city/CityResources.kt | 11 +++-------- core/src/com/unciv/logic/civilization/Civilization.kt | 8 ++++++++ .../civilization/diplomacy/CityStateFunctions.kt | 3 ++- .../civilization/transients/CivInfoTransientCache.kt | 3 ++- tests/src/com/unciv/uniques/ResourceTests.kt | 2 +- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/core/src/com/unciv/logic/city/City.kt b/core/src/com/unciv/logic/city/City.kt index 08178cf5d2..777a14c091 100644 --- a/core/src/com/unciv/logic/city/City.kt +++ b/core/src/com/unciv/logic/city/City.kt @@ -90,7 +90,7 @@ class City : IsPartOfGameInfoSerialization, INamed { } var cityAIFocus: String = CityFocus.NoFocus.name - fun getCityFocus() = CityFocus.values().firstOrNull { it.name == cityAIFocus } ?: CityFocus.NoFocus + fun getCityFocus() = CityFocus.entries.firstOrNull { it.name == cityAIFocus } ?: CityFocus.NoFocus fun setCityFocus(cityFocus: CityFocus){ cityAIFocus = cityFocus.name } @@ -194,7 +194,7 @@ class City : IsPartOfGameInfoSerialization, INamed { fun getRuleset() = civ.gameInfo.ruleset - fun getResourcesGeneratedByCity() = CityResources.getResourcesGeneratedByCity(this) + fun getResourcesGeneratedByCity(civResourceModifiers: HashMap) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers) fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName) fun isGrowing() = foodForNextTurn() > 0 diff --git a/core/src/com/unciv/logic/city/CityResources.kt b/core/src/com/unciv/logic/city/CityResources.kt index cefe6de50e..5a4118eb30 100644 --- a/core/src/com/unciv/logic/city/CityResources.kt +++ b/core/src/com/unciv/logic/city/CityResources.kt @@ -9,14 +9,9 @@ import com.unciv.models.ruleset.unique.UniqueType object CityResources { /** Returns ALL resources, city-wide and civ-wide */ - fun getResourcesGeneratedByCity(city: City): ResourceSupplyList { - val resourceModifers = HashMap() - for (resource in city.civ.gameInfo.ruleset.tileResources.values) - resourceModifers[resource.name] = city.civ.getResourceModifier(resource) - - val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifers) - addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifers) - + fun getResourcesGeneratedByCity(city: City, resourceModifiers: HashMap): ResourceSupplyList { + val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifiers) + addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifiers) return cityResources } diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 2d4f42b74f..4983cb593f 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -490,6 +490,14 @@ class Civilization : IsPartOfGameInfoSerialization { return getCivResourcesByName()[resourceName] ?: 0 } + /** Gets modifiers for ALL resources */ + fun getResourceModifiers(): HashMap { + val resourceModifers = HashMap() + for (resource in gameInfo.ruleset.tileResources.values) + resourceModifers[resource.name] = getResourceModifier(resource) + return resourceModifers + } + fun getResourceModifier(resource: TileResource): Float { var resourceModifier = 1f for (unique in getMatchingUniques(UniqueType.DoubleResourceProduced)) diff --git a/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt b/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt index e1dd4422c2..f2d7234b27 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt @@ -722,9 +722,10 @@ class CityStateFunctions(val civInfo: Civilization) { fun getCityStateResourcesForAlly() = ResourceSupplyList().apply { // TODO: City-states don't give allies resources from civ-wide uniques! + val civResourceModifiers = civInfo.getResourceModifiers() for (city in civInfo.cities) { // IGNORE the fact that they consume their own resources - #4769 - addPositiveByResource(city.getResourcesGeneratedByCity(), Constants.cityStates) + addPositiveByResource(city.getResourcesGeneratedByCity(civResourceModifiers), Constants.cityStates) } } diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 9692f5267d..53224d393c 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -316,7 +316,8 @@ class CivInfoTransientCache(val civInfo: Civilization) { fun updateCivResources() { val newDetailedCivResources = ResourceSupplyList() - for (city in civInfo.cities) newDetailedCivResources.add(city.getResourcesGeneratedByCity()) + val resourceModifers = civInfo.getResourceModifiers() + for (city in civInfo.cities) newDetailedCivResources.add(city.getResourcesGeneratedByCity(resourceModifers)) if (!civInfo.isCityState) { // First we get all these resources of each city state separately diff --git a/tests/src/com/unciv/uniques/ResourceTests.kt b/tests/src/com/unciv/uniques/ResourceTests.kt index 153372b46e..4e3c077fec 100644 --- a/tests/src/com/unciv/uniques/ResourceTests.kt +++ b/tests/src/com/unciv/uniques/ResourceTests.kt @@ -154,7 +154,7 @@ class ResourceTests { tile.improvement = "Mine" // when - val cityResources = city.getResourcesGeneratedByCity() + val cityResources = city.getResourcesGeneratedByCity(civInfo.getResourceModifiers()) // then assertEquals(1, cityResources.size)