#9098 - rankStatsForCityWork also uses local unique cache

This commit is contained in:
Yair Morgenstern 2023-04-03 14:36:24 +03:00
parent d6f5e0badb
commit 67482f0ebe
2 changed files with 13 additions and 11 deletions

View File

@ -23,12 +23,12 @@ object Automation {
fun rankTileForCityWork(tile: Tile, city: City, cityStats: Stats, localUniqueCache: LocalUniqueCache = LocalUniqueCache(false)): Float { fun rankTileForCityWork(tile: Tile, city: City, cityStats: Stats, localUniqueCache: LocalUniqueCache = LocalUniqueCache(false)): Float {
val stats = tile.stats.getTileStats(city, city.civ, localUniqueCache) val stats = tile.stats.getTileStats(city, city.civ, localUniqueCache)
return rankStatsForCityWork(stats, city, cityStats) return rankStatsForCityWork(stats, city, cityStats, false, localUniqueCache)
} }
fun rankSpecialist(specialist: String, city: City, cityStats: Stats, localUniqueCache: LocalUniqueCache): Float { fun rankSpecialist(specialist: String, city: City, cityStats: Stats, localUniqueCache: LocalUniqueCache): Float {
val stats = city.cityStats.getStatsOfSpecialist(specialist, localUniqueCache) val stats = city.cityStats.getStatsOfSpecialist(specialist, localUniqueCache)
var rank = rankStatsForCityWork(stats, city, cityStats, true) var rank = rankStatsForCityWork(stats, city, cityStats, true, localUniqueCache)
// derive GPP score // derive GPP score
var gpp = 0f var gpp = 0f
if (city.getRuleset().specialists.containsKey(specialist)) { // To solve problems in total remake mods if (city.getRuleset().specialists.containsKey(specialist)) { // To solve problems in total remake mods
@ -40,17 +40,19 @@ object Automation {
return rank return rank
} }
private fun rankStatsForCityWork(stats: Stats, city: City, cityStats: Stats, specialist: Boolean = false): Float { private fun rankStatsForCityWork(stats: Stats, city: City, cityStats: Stats, specialist: Boolean, localUniqueCache: LocalUniqueCache): Float {
val cityAIFocus = city.cityAIFocus val cityAIFocus = city.cityAIFocus
val yieldStats = stats.clone() val yieldStats = stats.clone()
if (specialist) { if (specialist) {
// If you have the Food Bonus, count as 1 extra food production (base is 2food) // If you have the Food Bonus, count as 1 extra food production (base is 2food)
for (unique in city.getMatchingUniques(UniqueType.FoodConsumptionBySpecialists)) for (unique in localUniqueCache.get(UniqueType.FoodConsumptionBySpecialists.name,
city.getMatchingUniques(UniqueType.FoodConsumptionBySpecialists)))
if (city.matchesFilter(unique.params[1])) if (city.matchesFilter(unique.params[1]))
yieldStats.food -= (unique.params[0].toFloat() / 100f) * 2f // base 2 food per Pop yieldStats.food -= (unique.params[0].toFloat() / 100f) * 2f // base 2 food per Pop
// Specialist Happiness Percentage Change 0f-1f // Specialist Happiness Percentage Change 0f-1f
for (unique in city.getMatchingUniques(UniqueType.UnhappinessFromPopulationTypePercentageChange)) for (unique in localUniqueCache.get(UniqueType.UnhappinessFromPopulationTypePercentageChange.name,
city.getMatchingUniques(UniqueType.UnhappinessFromPopulationTypePercentageChange)))
if (city.matchesFilter(unique.params[2]) && unique.params[1] == "Specialists") if (city.matchesFilter(unique.params[2]) && unique.params[1] == "Specialists")
yieldStats.happiness -= (unique.params[0].toFloat() / 100f) // relative val is negative, make positive yieldStats.happiness -= (unique.params[0].toFloat() / 100f) // relative val is negative, make positive
if (city.civ.getHappiness() < 0) yieldStats.happiness *= 2 // double weight for unhappy civilization if (city.civ.getHappiness() < 0) yieldStats.happiness *= 2 // double weight for unhappy civilization

View File

@ -245,13 +245,13 @@ class CityReligionManager : IsPartOfGameInfoSerialization {
addPressure(religionThisIsTheHolyCityOf!!,5 * pressureFromAdjacentCities, false) addPressure(religionThisIsTheHolyCityOf!!,5 * pressureFromAdjacentCities, false)
} }
for (city in city.civ.gameInfo.getCities()) { for (otherCity in city.civ.gameInfo.getCities()) {
if (city == this.city) continue if (otherCity == city) continue
val majorityReligionOfCity = city.religion.getMajorityReligionName() ?: continue val majorityReligionOfCity = otherCity.religion.getMajorityReligionName() ?: continue
if (!this.city.civ.gameInfo.religions[majorityReligionOfCity]!!.isMajorReligion()) continue if (!this.city.civ.gameInfo.religions[majorityReligionOfCity]!!.isMajorReligion()) continue
if (city.getCenterTile().aerialDistanceTo(this.city.getCenterTile()) if (otherCity.getCenterTile().aerialDistanceTo(city.getCenterTile())
> city.religion.getSpreadRange()) continue > otherCity.religion.getSpreadRange()) continue
addPressure(majorityReligionOfCity, city.religion.pressureAmountToAdjacentCities(this.city), false) addPressure(majorityReligionOfCity, otherCity.religion.pressureAmountToAdjacentCities(city), false)
} }
updateNumberOfFollowers() updateNumberOfFollowers()