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
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<String, Float>) = CityResources.getResourcesGeneratedByCity(this, civResourceModifiers)
fun getAvailableResourceAmount(resourceName: String) = CityResources.getAvailableResourceAmount(this, resourceName)
fun isGrowing() = foodForNextTurn() > 0

View File

@ -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<String, Float>()
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<String, Float>): ResourceSupplyList {
val cityResources = getResourcesGeneratedByCityNotIncludingBuildings(city, resourceModifiers)
addCityResourcesGeneratedFromUniqueBuildings(city, cityResources, resourceModifiers)
return cityResources
}

View File

@ -490,6 +490,14 @@ class Civilization : IsPartOfGameInfoSerialization {
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 {
var resourceModifier = 1f
for (unique in getMatchingUniques(UniqueType.DoubleResourceProduced))

View File

@ -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)
}
}

View File

@ -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

View File

@ -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)