perf: Calculate resource modifiers *once* when calculating resources

This commit is contained in:
yairm210 2024-07-04 00:02:14 +03:00
parent b6414aef9d
commit d9deb12df9
6 changed files with 18 additions and 13 deletions

View File

@ -90,7 +90,7 @@ class City : IsPartOfGameInfoSerialization, INamed {
} }
var cityAIFocus: String = CityFocus.NoFocus.name 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 } fun setCityFocus(cityFocus: CityFocus){ cityAIFocus = cityFocus.name }
@ -194,7 +194,7 @@ class City : IsPartOfGameInfoSerialization, INamed {
fun getRuleset() = civ.gameInfo.ruleset fun getRuleset() = civ.gameInfo.ruleset
fun getResourcesGeneratedByCity() = CityResources.getResourcesGeneratedByCity(this) fun getResourcesGeneratedByCity(civResourceModifiers: HashMap<String, Float>) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers)
fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName) fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName)
fun isGrowing() = foodForNextTurn() > 0 fun isGrowing() = foodForNextTurn() > 0

View File

@ -9,14 +9,9 @@ import com.unciv.models.ruleset.unique.UniqueType
object CityResources { object CityResources {
/** Returns ALL resources, city-wide and civ-wide */ /** Returns ALL resources, city-wide and civ-wide */
fun getResourcesGeneratedByCity(city: City): ResourceSupplyList { fun getResourcesGeneratedByCity(city: City, resourceModifiers: HashMap<String, Float>): ResourceSupplyList {
val resourceModifers = HashMap<String, Float>() val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifiers)
for (resource in city.civ.gameInfo.ruleset.tileResources.values) addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifiers)
resourceModifers[resource.name] = city.civ.getResourceModifier(resource)
val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifers)
addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifers)
return cityResources return cityResources
} }

View File

@ -490,6 +490,14 @@ class Civilization : IsPartOfGameInfoSerialization {
return getCivResourcesByName()[resourceName] ?: 0 return getCivResourcesByName()[resourceName] ?: 0
} }
/** Gets modifiers for ALL resources */
fun getResourceModifiers(): HashMap<String, Float> {
val resourceModifers = HashMap<String, Float>()
for (resource in gameInfo.ruleset.tileResources.values)
resourceModifers[resource.name] = getResourceModifier(resource)
return resourceModifers
}
fun getResourceModifier(resource: TileResource): Float { fun getResourceModifier(resource: TileResource): Float {
var resourceModifier = 1f var resourceModifier = 1f
for (unique in getMatchingUniques(UniqueType.DoubleResourceProduced)) for (unique in getMatchingUniques(UniqueType.DoubleResourceProduced))

View File

@ -722,9 +722,10 @@ class CityStateFunctions(val civInfo: Civilization) {
fun getCityStateResourcesForAlly() = ResourceSupplyList().apply { fun getCityStateResourcesForAlly() = ResourceSupplyList().apply {
// TODO: City-states don't give allies resources from civ-wide uniques! // TODO: City-states don't give allies resources from civ-wide uniques!
val civResourceModifiers = civInfo.getResourceModifiers()
for (city in civInfo.cities) { for (city in civInfo.cities) {
// IGNORE the fact that they consume their own resources - #4769 // IGNORE the fact that they consume their own resources - #4769
addPositiveByResource(city.getResourcesGeneratedByCity(), Constants.cityStates) addPositiveByResource(city.getResourcesGeneratedByCity(civResourceModifiers), Constants.cityStates)
} }
} }

View File

@ -316,7 +316,8 @@ class CivInfoTransientCache(val civInfo: Civilization) {
fun updateCivResources() { fun updateCivResources() {
val newDetailedCivResources = ResourceSupplyList() 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) { if (!civInfo.isCityState) {
// First we get all these resources of each city state separately // First we get all these resources of each city state separately

View File

@ -154,7 +154,7 @@ class ResourceTests {
tile.improvement = "Mine" tile.improvement = "Mine"
// when // when
val cityResources = city.getResourcesGeneratedByCity() val cityResources = city.getResourcesGeneratedByCity(civInfo.getResourceModifiers())
// then // then
assertEquals(1, cityResources.size) assertEquals(1, cityResources.size)