diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index ecf756c4..bb2b94d5 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -12,87 +12,80 @@ class CityStats { @Transient @JvmField var currentCityStats: Stats = Stats() // This is so we won't have to calculate this multiple times - takes a lot of time, especially on phones @Transient lateinit var cityInfo: CityInfo - private val statsFromTiles: Stats - get() { - val stats = Stats() - for (cell in cityInfo.tilesInRange.filter { cityInfo.name == it.workingCity }) - stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo)) - return stats - } + private fun getStatsFromTiles(): Stats { + val stats = Stats() + for (cell in cityInfo.tilesInRange.filter { cityInfo.name == it.workingCity }) + stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo)) + return stats + } private - val statsFromTradeRoute: Stats - get() { - val stats = Stats() - if (!isCapital && isConnectedToCapital(RoadStatus.Road)) { - val civInfo = cityInfo.civInfo - var goldFromTradeRoute = civInfo.capital.population.population * 0.15 + cityInfo.population.population * 1.1 - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) - if (civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute += 2.0 - if (civInfo.buildingUniques.contains("TradeRouteGoldIncrease")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality - stats.gold += goldFromTradeRoute.toFloat() - } - return stats + fun getStatsFromTradeRoute(): Stats { + val stats = Stats() + if (!isCapital && isConnectedToCapital(RoadStatus.Road)) { + val civInfo = cityInfo.civInfo + var goldFromTradeRoute = civInfo.capital.population.population * 0.15 + cityInfo.population.population * 1.1 - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) + if (civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute += 2.0 + if (civInfo.buildingUniques.contains("TradeRouteGoldIncrease")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality + stats.gold += goldFromTradeRoute.toFloat() + } + return stats + } + + + private fun getStatsFromProduction(): Stats { + val stats = Stats() + + if ("Gold" == cityInfo.cityConstructions.currentConstruction) stats.gold += stats.production / 4 + if ("Science" == cityInfo.cityConstructions.currentConstruction) { + var scienceProduced = stats.production / 4 + if (cityInfo.civInfo.buildingUniques.contains("ScienceConversionIncrease")) scienceProduced *= 1.33f + if (cityInfo.civInfo.policies.isAdopted("Rationalism")) scienceProduced *= 1.33f + stats.science += scienceProduced + } + return stats + } + + + private fun getStatPercentBonusesFromRailroad(): Stats { + val stats = Stats() + if (cityInfo.civInfo.tech.isResearched("Combustion") && (isCapital || isConnectedToCapital(RoadStatus.Railroad))) + stats.production += 25f + return stats + } + + private fun getStatPercentBonusesFromMarble(): Stats { + val stats = Stats() + val construction = cityInfo.cityConstructions.getCurrentConstruction() + + if (construction is Building + && construction.isWonder + && cityInfo.civInfo.getCivResources().containsKey(GameBasics.TileResources["Marble"])) + stats.production += 15f + + return stats + } + + private fun getStatPercentBonusesFromComputers(): Stats { + val stats = Stats() + + if (cityInfo.civInfo.tech.isResearched("Computers")) { + stats.production += 10f + stats.science += 10f } + return stats + } - private val statsFromProduction: Stats - get() { - val stats = Stats() - - if ("Gold" == cityInfo.cityConstructions.currentConstruction) stats.gold += stats.production / 4 - if ("Science" == cityInfo.cityConstructions.currentConstruction) { - var scienceProduced = stats.production / 4 - if (cityInfo.civInfo.buildingUniques.contains("ScienceConversionIncrease")) scienceProduced *= 1.33f - if (cityInfo.civInfo.policies.isAdopted("Rationalism")) scienceProduced *= 1.33f - stats.science += scienceProduced - } - return stats - } - - - private val statPercentBonusesFromRailroad: Stats - get() { - val stats = Stats() - if (cityInfo.civInfo.tech.isResearched("Combustion") && (isCapital || isConnectedToCapital(RoadStatus.Railroad))) - stats.production += 25f - return stats - } - - private val statPercentBonusesFromMarble: Stats - get() { - val stats = Stats() - val construction = cityInfo.cityConstructions.getCurrentConstruction() - - if (construction is Building - && construction.isWonder - && cityInfo.civInfo.getCivResources().containsKey(GameBasics.TileResources["Marble"])) - stats.production += 15f - - return stats - } - - private val statPercentBonusesFromComputers: Stats - get() { - val stats = Stats() - - if (cityInfo.civInfo.tech.isResearched("Computers")) { - stats.production += 10f - stats.science += 10f - } - - return stats - } - - private val growthBonusFromPolicies: Float - get() { - var bonus = 0f - if (cityInfo.civInfo.policies.isAdopted("Landed Elite") && isCapital) - bonus += 0.1f - if (cityInfo.civInfo.policies.isAdopted("Tradition Complete")) - bonus += 0.15f - return bonus - } + private fun getGrowthBonusFromPolicies(): Float { + var bonus = 0f + if (cityInfo.civInfo.policies.isAdopted("Landed Elite") && isCapital) + bonus += 0.1f + if (cityInfo.civInfo.policies.isAdopted("Tradition Complete")) + bonus += 0.15f + return bonus + } // needs to be a separate function because we need to know the global happiness state // in order to determine how much food is produced in a city! @@ -197,22 +190,22 @@ class CityStats { stats.science += cityInfo.population.population.toFloat() stats.production += cityInfo.population.freePopulation.toFloat() - stats.add(statsFromTiles) + stats.add(getStatsFromTiles()) stats.add(getStatsFromSpecialists(cityInfo.population.specialists, civInfo.policies.adoptedPolicies)) - stats.add(statsFromTradeRoute) + stats.add(getStatsFromTradeRoute()) stats.add(cityInfo.cityConstructions.getStats()) stats.add(getStatsFromPolicies(civInfo.policies.adoptedPolicies)) val statPercentBonuses = cityInfo.cityConstructions.getStatPercentBonuses() statPercentBonuses.add(getStatPercentBonusesFromGoldenAge(cityInfo.civInfo.goldenAges.isGoldenAge())) statPercentBonuses.add(getStatPercentBonusesFromPolicies(civInfo.policies.adoptedPolicies, cityInfo.cityConstructions)) - statPercentBonuses.add(statPercentBonusesFromRailroad) - statPercentBonuses.add(statPercentBonusesFromMarble) - statPercentBonuses.add(statPercentBonusesFromComputers) + statPercentBonuses.add(getStatPercentBonusesFromRailroad()) + statPercentBonuses.add(getStatPercentBonusesFromMarble()) + statPercentBonuses.add(getStatPercentBonusesFromComputers()) stats.production *= 1 + statPercentBonuses.production / 100 // So they get bonuses for production and gold/science - stats.add(statsFromProduction) + stats.add(getStatsFromProduction()) stats.gold *= 1 + statPercentBonuses.gold / 100 @@ -226,7 +219,7 @@ class CityStats { stats.food += cityInfo.population.numberOfSpecialists.toFloat() if (isUnhappy) stats.food /= 4f // Reduce excess food to 1/4 per the same - stats.food *= 1 + growthBonusFromPolicies + stats.food *= 1 + getGrowthBonusFromPolicies() stats.gold -= cityInfo.cityConstructions.getMaintenanceCosts().toFloat() // this is AFTER the bonus calculation! this.currentCityStats = stats @@ -238,7 +231,7 @@ class CityStats { val capitalTile = cityInfo.civInfo.capital.tile val tilesReached = HashSet() var tilesToCheck : List = listOf(cityInfo.tile) - while (tilesToCheck.any()) { + while (tilesToCheck.isNotEmpty()) { val newTiles = tilesToCheck .flatMap { cityInfo.tileMap.getTilesInDistance(it.position, 1) }.distinct() .filter{ !tilesReached.contains(it) && !tilesToCheck.contains(it) diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index 8dcf4210..99ba1624 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -47,7 +47,9 @@ class RandomMapGenerator { } private fun getRandomResource(resources: List, resourceType: ResourceType): TileResource? { - return resources.filter { it.resourceType == resourceType }.getRandom() + val filtered = resources.filter { it.resourceType == resourceType } + if (filtered.isEmpty()) return null + else return filtered.getRandom() }