diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 6c4ad3e199..899b5dbb40 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -185,7 +185,7 @@ class BattleDamage{ private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): HashMap { val modifiers = HashMap() val isFriendlyTerritory = tile.getOwner()!=null && !unit.getCivInfo().isAtWarWith(tile.getOwner()!!) - if(isFriendlyTerritory && unit.getCivInfo().getBuildingUniques().contains("+15% combat strength for units fighting in friendly territory")) + if(isFriendlyTerritory && unit.getCivInfo().containsBuildingUnique("+15% combat strength for units fighting in friendly territory")) modifiers["Himeji Castle"] = 0.15f if(!isFriendlyTerritory && unit.unit.hasUnique("+20% bonus outside friendly territory")) modifiers["Foreign Land"] = 0.2f diff --git a/core/src/com/unciv/logic/battle/CityCombatant.kt b/core/src/com/unciv/logic/battle/CityCombatant.kt index f3b885cd90..b7678ad12f 100644 --- a/core/src/com/unciv/logic/battle/CityCombatant.kt +++ b/core/src/com/unciv/logic/battle/CityCombatant.kt @@ -53,7 +53,7 @@ class CityCombatant(val city: CityInfo) : ICombatant { strength += cityTile.militaryUnit!!.baseUnit().strength * cityTile.militaryUnit!!.health/100f var buildingsStrength = city.cityConstructions.getBuiltBuildings().sumBy{ it.cityStrength }.toFloat() - if(getCivInfo().getBuildingUniques().contains("Defensive buildings in all cities are 25% more effective")) + if(getCivInfo().containsBuildingUnique("Defensive buildings in all cities are 25% more effective")) buildingsStrength*=1.25f strength += buildingsStrength diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 5c7b12d093..13b9710bb5 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -102,7 +102,7 @@ class CityConstructions { throw NotBuildingOrUnitException("$constructionName is not a building or a unit!") } - internal fun getBuiltBuildings(): List = builtBuildingObjects // toList os to avoid concurrency problems + internal fun getBuiltBuildings(): List = builtBuildingObjects fun containsBuildingOrEquivalent(building: String): Boolean = isBuilt(building) || getBuiltBuildings().any{it.replaces==building} diff --git a/core/src/com/unciv/logic/city/CityExpansionManager.kt b/core/src/com/unciv/logic/city/CityExpansionManager.kt index e2a3470b30..5dd317a7ee 100644 --- a/core/src/com/unciv/logic/city/CityExpansionManager.kt +++ b/core/src/com/unciv/logic/city/CityExpansionManager.kt @@ -27,9 +27,9 @@ class CityExpansionManager { fun getCultureToNextTile(): Int { val numTilesClaimed = cityInfo.tiles.size - 7 var cultureToNextTile = 6 * Math.pow(numTilesClaimed + 1.4813, 1.3) - if (cityInfo.civInfo.getBuildingUniques().contains("Cost of acquiring new tiles reduced by 25%")) + if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%")) cultureToNextTile *= 0.75 //Speciality of Angkor Wat - if(cityInfo.getBuildingUniques().contains("Culture and Gold costs of acquiring new tiles reduced by 25% in this city")) + if(cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city")) cultureToNextTile *= 0.75 // Specialty of Krepost if (cityInfo.civInfo.policies.isAdopted("Tradition")) cultureToNextTile *= 0.75 return Math.round(cultureToNextTile).toInt() @@ -49,9 +49,9 @@ class CityExpansionManager { val distanceFromCenter = tileInfo.arialDistanceTo(cityInfo.getCenterTile()) var cost = baseCost * (distanceFromCenter-1) + numTilesClaimed*5.0 - if (cityInfo.civInfo.getBuildingUniques().contains("Cost of acquiring new tiles reduced by 25%")) + if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%")) cost *= 0.75 //Speciality of Angkor Wat - if(cityInfo.getBuildingUniques().contains("Culture and Gold costs of acquiring new tiles reduced by 25% in this city")) + if(cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city")) cost *= 0.75 // Specialty of Krepost if(cityInfo.civInfo.getNation().unique=="All land military units have +1 sight, 50% discount when purchasing tiles") diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index b40ffa830f..415184a760 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -123,7 +123,7 @@ class CityInfo { amountToAdd *= 2 } if(resource.resourceType == ResourceType.Luxury - && getBuildingUniques().contains("Provides 1 extra copy of each improved luxury resource near this City")) + && containsBuildingUnique("Provides 1 extra copy of each improved luxury resource near this City")) amountToAdd*=2 cityResources.add(resource, amountToAdd, "Tiles") @@ -140,6 +140,7 @@ class CityInfo { } fun getBuildingUniques(): List = cityConstructions.getBuiltBuildings().flatMap { it.uniques } + fun containsBuildingUnique(unique:String) = cityConstructions.getBuiltBuildings().any { it.uniques.contains(unique) } fun getGreatPersonMap():HashMap{ val stats = HashMap() @@ -159,7 +160,7 @@ class CityInfo { if (civInfo.policies.isAdopted("Entrepreneurship")) entry.value.gold *= 1.25f - if (civInfo.getBuildingUniques().contains("+33% great person generation in all cities")) + if (civInfo.containsBuildingUnique("+33% great person generation in all cities")) stats[entry.key] = stats[entry.key]!!.times(1.33f) if (civInfo.policies.isAdopted("Freedom")) stats[entry.key] = stats[entry.key]!!.times(1.25f) diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 1241bfaf8c..8bee352f40 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -39,7 +39,7 @@ class CityStats { var goldFromTradeRoute = civInfo.getCapital().population.population * 0.15 + cityInfo.population.population * 1.1 - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5) if(civInfo.getNation().unique=="+1 Gold from each Trade Route, Oil resources provide double quantity") goldFromTradeRoute += 1 if (civInfo.policies.isAdopted("Trade Unions")) goldFromTradeRoute += 2 - if (civInfo.getBuildingUniques().contains("Gold from all trade routes +25%")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality + if (civInfo.containsBuildingUnique("Gold from all trade routes +25%")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality stats.gold += goldFromTradeRoute.toFloat() } return stats @@ -52,7 +52,7 @@ class CityStats { "Gold" -> stats.gold += production / 4 "Science" -> { var scienceProduced = production / 4 - if (cityInfo.civInfo.getBuildingUniques().contains("Production to science conversion in cities increased by 33%")) + if (cityInfo.civInfo.containsBuildingUnique("Production to science conversion in cities increased by 33%")) scienceProduced *= 1.33f if (cityInfo.civInfo.policies.isAdopted("Rationalism")) scienceProduced *= 1.33f stats.science += scienceProduced @@ -182,7 +182,7 @@ class CityStats { var unhappinessFromCitizens = cityInfo.population.population.toFloat() if (civInfo.policies.isAdopted("Democracy")) unhappinessFromCitizens -= cityInfo.population.getNumberOfSpecialists() * 0.5f - if (civInfo.getBuildingUniques().contains("Unhappiness from population decreased by 10%")) + if (civInfo.containsBuildingUnique("Unhappiness from population decreased by 10%")) unhappinessFromCitizens *= 0.9f if (civInfo.policies.isAdopted("Meritocracy")) unhappinessFromCitizens *= 0.95f @@ -206,7 +206,7 @@ class CityStats { val happinessFromBuildings = cityInfo.cityConstructions.getStats().happiness.toInt().toFloat() newHappinessList ["Buildings"] = happinessFromBuildings - if(civInfo.getBuildingUniques().contains("+1 happiness in each city")) + if(civInfo.containsBuildingUnique("+1 happiness in each city")) newHappinessList["Wonders"] = 1f // we don't want to modify the existing happiness list because that leads @@ -221,7 +221,7 @@ class CityStats { if (policies.contains("Commerce Complete")) stats.gold += 1 if (policies.contains("Secularism")) stats.science += 2 - if(cityInfo.getBuildingUniques().contains("+1 Production from specialists")) + if(cityInfo.containsBuildingUnique("+1 Production from specialists")) stats.production += 1 return stats } @@ -268,19 +268,18 @@ class CityStats { private fun getStatPercentBonusesFromBuildings(): Stats { val stats = cityInfo.cityConstructions.getStatPercentBonuses() - val civUniques = cityInfo.civInfo.getBuildingUniques() - if (civUniques.contains("Culture in all cities increased by 25%")) stats.culture += 25f + if (cityInfo.civInfo.containsBuildingUnique("Culture in all cities increased by 25%")) stats.culture += 25f val currentConstruction = cityInfo.cityConstructions.getCurrentConstruction() if(currentConstruction is Building && currentConstruction.uniques.contains("Spaceship part")){ - if(civUniques.contains("Increases production of spaceship parts by 25%")) + if(cityInfo.civInfo.containsBuildingUnique("Increases production of spaceship parts by 25%")) stats.production += 25 - if(cityInfo.getBuildingUniques().contains("Increases production of spaceship parts by 50%")) + if(cityInfo.containsBuildingUnique("Increases production of spaceship parts by 50%")) stats.production += 50 } if(currentConstruction is BaseUnit && currentConstruction.unitType==UnitType.Mounted - && cityInfo.getBuildingUniques().contains("+15% Production when building Mounted Units in this city")) + && cityInfo.containsBuildingUnique("+15% Production when building Mounted Units in this city")) stats.production += 15 return stats diff --git a/core/src/com/unciv/logic/city/PopulationManager.kt b/core/src/com/unciv/logic/city/PopulationManager.kt index 8c9d940481..f2a6ecd488 100644 --- a/core/src/com/unciv/logic/city/PopulationManager.kt +++ b/core/src/com/unciv/logic/city/PopulationManager.kt @@ -62,8 +62,8 @@ class PopulationManager { // growth! { foodStored -= getFoodToNextPopulation() - if (cityInfo.getBuildingUniques().contains("40% of food is carried over after a new citizen is born")) foodStored += (0.4f * getFoodToNextPopulation()).toInt() // Aqueduct special - if (cityInfo.getBuildingUniques().contains("25% of food is carried over after a new citizen is born")) foodStored += (0.25f * getFoodToNextPopulation()).toInt() // Medical Lab special + if (cityInfo.containsBuildingUnique("40% of food is carried over after a new citizen is born")) foodStored += (0.4f * getFoodToNextPopulation()).toInt() // Aqueduct special + if (cityInfo.containsBuildingUnique("25% of food is carried over after a new citizen is born")) foodStored += (0.25f * getFoodToNextPopulation()).toInt() // Medical Lab special population++ autoAssignPopulation() cityInfo.civInfo.addNotification("["+cityInfo.name + "] has grown!", cityInfo.location, Color.GREEN) diff --git a/core/src/com/unciv/logic/civilization/CivInfoStats.kt b/core/src/com/unciv/logic/civilization/CivInfoStats.kt index 2eb8d9d9cc..6b14ef4a44 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoStats.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoStats.kt @@ -37,10 +37,15 @@ class CivInfoStats(val civInfo: CivilizationInfo){ private fun getTransportationUpkeep(): Int { var transportationUpkeep = 0 - for (it in civInfo.cities.flatMap { it.getTiles() }.filter{ !it.isCityCenter() }) { - when(it.roadStatus) { - RoadStatus.Road -> transportationUpkeep += 1 - RoadStatus.Railroad -> transportationUpkeep += 2 + // we no longer use .flatMap, because there are a lot of tiles and keeping them all in a list + // just to go over them once is a waste of memory - there are low-end phones who don't have much ram + for (city in civInfo.cities) { + for (tile in city.getTiles()) { + if (tile.isCityCenter()) continue + when (tile.roadStatus) { + RoadStatus.Road -> transportationUpkeep += 1 + RoadStatus.Railroad -> transportationUpkeep += 2 + } } } if (civInfo.policies.isAdopted("Trade Unions")) transportationUpkeep *= (2 / 3f).toInt() @@ -108,7 +113,7 @@ class CivInfoStats(val civInfo: CivilizationInfo){ } } - if (civInfo.getBuildingUniques().contains("Provides 1 happiness per social policy")) { + if (civInfo.containsBuildingUnique("Provides 1 happiness per social policy")) { if(!statMap.containsKey("Policies")) statMap["Policies"]=0f statMap["Policies"] = statMap["Policies"]!! + civInfo.policies.getAdoptedPolicies().count { !it.endsWith("Complete") }.toFloat() diff --git a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt index cb0a73a3a6..1e9215e430 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt @@ -67,7 +67,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo){ fun updateHasActiveGreatWall(){ civInfo.hasActiveGreatWall = !civInfo.tech.isResearched("Dynamite") && - civInfo.getBuildingUniques().contains("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)") + civInfo.containsBuildingUnique("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)") } fun setCitiesConnectedToCapitalTransients(){ diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 271de66d0f..143f8a0508 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -161,7 +161,7 @@ class CivilizationInfo { fun hasResource(resourceName:String): Boolean = getCivResourcesByName()[resourceName]!!>0 - fun getBuildingUniques(): List = cities.flatMap { it.getBuildingUniques()}.distinct() + fun containsBuildingUnique(unique:String) = cities.any { it.containsBuildingUnique(unique) } fun getCivUnits(): List = units diff --git a/core/src/com/unciv/logic/civilization/GoldenAgeManager.kt b/core/src/com/unciv/logic/civilization/GoldenAgeManager.kt index fb99797389..eda21bbe78 100644 --- a/core/src/com/unciv/logic/civilization/GoldenAgeManager.kt +++ b/core/src/com/unciv/logic/civilization/GoldenAgeManager.kt @@ -26,7 +26,7 @@ class GoldenAgeManager{ fun enterGoldenAge() { var turnsToGoldenAge = 10.0 - if (civInfo.getBuildingUniques().contains("Golden Age length increases +50%")) turnsToGoldenAge *= 1.5 + if (civInfo.containsBuildingUnique("Golden Age length increases +50%")) turnsToGoldenAge *= 1.5 if (civInfo.policies.isAdopted("Freedom Complete")) turnsToGoldenAge *= 1.5 turnsLeftForCurrentGoldenAge += turnsToGoldenAge.toInt() civInfo.addNotification("You have entered a golden age!", null, Color.GOLD) diff --git a/core/src/com/unciv/logic/civilization/PolicyManager.kt b/core/src/com/unciv/logic/civilization/PolicyManager.kt index c978180041..6e531077b1 100644 --- a/core/src/com/unciv/logic/civilization/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/PolicyManager.kt @@ -25,7 +25,7 @@ class PolicyManager { var cityModifier = 0.3 * (civInfo.cities.size - 1) if (isAdopted("Representation")) cityModifier *= (2 / 3f).toDouble() if (isAdopted("Piety Complete")) baseCost *= 0.9 - if (civInfo.getBuildingUniques().contains("Culture cost of adopting new Policies reduced by 10%")) baseCost *= 0.9 + if (civInfo.containsBuildingUnique("Culture cost of adopting new Policies reduced by 10%")) baseCost *= 0.9 val cost: Int = Math.round(baseCost * (1 + cityModifier)).toInt() return cost - (cost % 5) } diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 3418f690c2..86a6500597 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -88,7 +88,7 @@ class MapUnit { movement += getUniques().count{it=="+1 Movement"} if(type.isWaterUnit() && !type.isCivilian() - && civInfo.getBuildingUniques().contains("All military naval units receive +1 movement and +1 sight")) + && civInfo.containsBuildingUnique("All military naval units receive +1 movement and +1 sight")) movement += 1 if(type.isWaterUnit() && civInfo.getNation().unique=="+2 movement for all naval units") @@ -136,7 +136,7 @@ class MapUnit { if (civInfo.getNation().unique == "All land military units have +1 sight, 50% discount when purchasing tiles") visibilityRange += 1 if (type.isWaterUnit() && !type.isCivilian() - && civInfo.getBuildingUniques().contains("All military naval units receive +1 movement and +1 sight")) + && civInfo.containsBuildingUnique("All military naval units receive +1 movement and +1 sight")) visibilityRange += 1 val tile = getTile() if (tile.baseTerrain == Constants.hill && type.isLandUnit()) visibilityRange += 1 @@ -230,7 +230,7 @@ class MapUnit { var goldCostOfUpgrade = (unitToUpgradeTo.cost - baseUnit().cost) * 2 + 10 if (civInfo.policies.isAdopted("Professional Army")) goldCostOfUpgrade = (goldCostOfUpgrade * 0.66f).toInt() - if(civInfo.getBuildingUniques().contains("Gold cost of upgrading military units reduced by 33%")) + if(civInfo.containsBuildingUnique("Gold cost of upgrading military units reduced by 33%")) goldCostOfUpgrade = (goldCostOfUpgrade * 0.66f).toInt() return goldCostOfUpgrade } diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 218ae31d73..0544ba8514 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -128,7 +128,7 @@ open class TileInfo { var stats = getBaseTerrain().clone() if((baseTerrain== Constants.ocean||baseTerrain==Constants.coast) && city!=null - && city.getBuildingUniques().contains("+1 food from Ocean and Coast tiles")) + && city.containsBuildingUnique("+1 food from Ocean and Coast tiles")) stats.food += 1 if (terrainFeature != null) { @@ -139,10 +139,10 @@ open class TileInfo { stats.add(terrainFeatureBase) if (terrainFeature == Constants.jungle && city != null - && city.getBuildingUniques().contains("Jungles provide +2 science")) + && city.containsBuildingUnique("Jungles provide +2 science")) stats.science += 2f if(terrainFeature=="Oasis" && city!=null - && city.getBuildingUniques().contains("+2 Gold for each source of Oil and oasis")) + && city.containsBuildingUnique("+2 Gold for each source of Oil and oasis")) stats.gold += 2 } @@ -156,12 +156,12 @@ open class TileInfo { && observingCiv.getNation().unique=="Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity") stats.production+=1 if(resource.name=="Oil" && city!=null - && city.getBuildingUniques().contains("+2 Gold for each source of Oil and oasis")) + && city.containsBuildingUnique("+2 Gold for each source of Oil and oasis")) stats.gold += 2 if(city!=null && isWater){ - if(city.getBuildingUniques().contains("+1 production from all sea resources worked by the city")) + if(city.containsBuildingUnique("+1 production from all sea resources worked by the city")) stats.production+=1 - if(city.getBuildingUniques().contains("+1 production and gold from all sea resources worked by the city")){ + if(city.containsBuildingUnique("+1 production and gold from all sea resources worked by the city")){ stats.production+=1 stats.gold+=1 } @@ -182,7 +182,7 @@ open class TileInfo { stats.add(improvement) // again, for the double effect } - if(city!=null && isWater && city.getBuildingUniques().contains("+1 gold from worked water tiles in city")) + if(city!=null && isWater && city.containsBuildingUnique("+1 gold from worked water tiles in city")) stats.gold += 1 if (isCityCenter()) { diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index c210fab861..330b2081fc 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -153,7 +153,7 @@ class Building : NamedStats(), IConstruction{ stats.happiness += 1 if (baseBuildingName == "Castle" - && civInfo.getBuildingUniques().contains("+1 happiness, +2 culture and +3 gold from every Castle")){ + && civInfo.containsBuildingUnique("+1 happiness, +2 culture and +3 gold from every Castle")){ stats.happiness+=1 stats.culture+=2 stats.gold+=3 @@ -199,7 +199,7 @@ class Building : NamedStats(), IConstruction{ } else { cost = Math.pow((30 * getProductionCost(civInfo.policies.adoptedPolicies)).toDouble(), 0.75) * (1 + hurryCostModifier / 100) if (civInfo.policies.adoptedPolicies.contains("Mercantilism")) cost *= 0.75 - if (civInfo.getBuildingUniques().contains("-15% to purchasing items in cities")) cost *= 0.85 + if (civInfo.containsBuildingUnique("-15% to purchasing items in cities")) cost *= 0.85 if (civInfo.policies.adoptedPolicies.contains("Patronage") && listOf("Monument", "Temple", "Opera House", "Museum", "Broadcast Tower") .map{civInfo.getEquivalentBuilding(it).name}.contains(name)) @@ -293,7 +293,7 @@ class Building : NamedStats(), IConstruction{ } if ("Spaceship part" in uniques) { - if (!civInfo.getBuildingUniques().contains("Enables construction of Spaceship parts")) return "Apollo project not built!" + if (!civInfo.containsBuildingUnique("Enables construction of Spaceship parts")) return "Apollo project not built!" if (civInfo.victoryManager.unconstructedSpaceshipParts()[name] == 0) return "Don't need to build any more of these!" } return "" diff --git a/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt b/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt index d18366cb63..254840cc00 100644 --- a/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt +++ b/core/src/com/unciv/models/gamebasics/tile/TileImprovement.kt @@ -19,7 +19,7 @@ class TileImprovement : NamedStats(), ICivilopedia { private val turnsToBuild: Int = 0 // This is the base cost. fun getTurnsToBuild(civInfo: CivilizationInfo): Int { var realTurnsToBuild = turnsToBuild.toFloat() - if (civInfo.getBuildingUniques().contains("Worker construction increased 25%")) + if (civInfo.containsBuildingUnique("Worker construction increased 25%")) realTurnsToBuild *= 0.75f if (civInfo.policies.isAdopted("Citizenship")) realTurnsToBuild *= 0.75f diff --git a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt index 9779554f52..d59d7fbdf3 100644 --- a/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/gamebasics/unit/BaseUnit.kt @@ -106,7 +106,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { if (!baseCost) { if(civInfo.policies.adoptedPolicies.contains("Mercantilism")) cost *= 0.75 if(civInfo.policies.adoptedPolicies.contains("Militarism")) cost *= 0.66f - if (civInfo.getBuildingUniques().contains("-15% to purchasing items in cities")) cost *= 0.85 + if (civInfo.containsBuildingUnique("-15% to purchasing items in cities")) cost *= 0.85 } return (cost / 10).toInt() * 10 // rounded down o nearest ten } @@ -151,8 +151,7 @@ class BaseUnit : INamed, IConstruction, ICivilopedia { unit.promotions.XP += 15 if(unit.type in listOf(UnitType.Melee,UnitType.Mounted,UnitType.Armor) - && construction.cityInfo.getBuildingUniques() - .contains("All newly-trained melee, mounted, and armored units in this city receive the Drill I promotion")) + && construction.cityInfo.containsBuildingUnique("All newly-trained melee, mounted, and armored units in this city receive the Drill I promotion")) unit.promotions.addPromotion("Drill I", isFree = true) } diff --git a/core/src/com/unciv/models/stats/Stats.kt b/core/src/com/unciv/models/stats/Stats.kt index 9ee97c26fc..fd38be1e25 100644 --- a/core/src/com/unciv/models/stats/Stats.kt +++ b/core/src/com/unciv/models/stats/Stats.kt @@ -86,6 +86,15 @@ open class Stats() { happiness=hashMap[Stat.Happiness]!! science=hashMap[Stat.Science]!! } + + fun equals(otherStats: Stats):Boolean{ + return culture==otherStats.culture + && gold==otherStats.gold + && production==otherStats.production + && food==otherStats.food + && happiness==otherStats.happiness + && science==otherStats.science + } } class StatMap:LinkedHashMap(){ diff --git a/core/src/com/unciv/ui/VictoryScreen.kt b/core/src/com/unciv/ui/VictoryScreen.kt index 4bbd55a5b9..2be70065df 100644 --- a/core/src/com/unciv/ui/VictoryScreen.kt +++ b/core/src/com/unciv/ui/VictoryScreen.kt @@ -109,7 +109,7 @@ class VictoryScreen : PickerScreen() { fun scienceVictoryColumn():Table{ val t = Table() t.defaults().pad(5f) - t.add(getMilestone("Built Apollo Program".tr(),playerCivInfo.getBuildingUniques().contains("Enables construction of Spaceship parts"))).row() + t.add(getMilestone("Built Apollo Program".tr(),playerCivInfo.containsBuildingUnique("Enables construction of Spaceship parts"))).row() val victoryManager= playerCivInfo.victoryManager diff --git a/core/src/com/unciv/ui/cityscreen/YieldGroup.kt b/core/src/com/unciv/ui/cityscreen/YieldGroup.kt index 96d269ece3..b92a7524c6 100644 --- a/core/src/com/unciv/ui/cityscreen/YieldGroup.kt +++ b/core/src/com/unciv/ui/cityscreen/YieldGroup.kt @@ -12,7 +12,11 @@ class YieldGroup : HorizontalGroup() { isTransform = false // performance helper - nothing here is rotated or scaled } + var currentStats=Stats() + fun setStats(stats: Stats) { + if(currentStats.equals(stats)) return // don't need to update - this is a memory and time saver! + currentStats = stats clearChildren() for (entry in stats.toHashMap().filter { it.value > 0 }) { addActor(getStatIconsTable(entry.key.toString(), entry.value.toInt())) diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 68daf2bf21..aa2115c726 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -128,8 +128,9 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { if(ImageGetter.imageExists(tileSetLocation+"City")) return tileSetLocation+"City" } - val baseTerrainTileLocation = tileSetLocation+tileInfo.baseTerrain - val baseTerrainAndFeatureTileLocation = baseTerrainTileLocation+"+"+tileInfo.terrainFeature + // these are templates because apparently chain appending is faster or something? + val baseTerrainTileLocation = "$tileSetLocation${tileInfo.baseTerrain}" + val baseTerrainAndFeatureTileLocation = "$baseTerrainTileLocation+${tileInfo.terrainFeature}" if(tileInfo.terrainFeature!=null && ImageGetter.imageExists(baseTerrainAndFeatureTileLocation)) return baseTerrainAndFeatureTileLocation if(ImageGetter.imageExists(baseTerrainTileLocation)) return baseTerrainTileLocation @@ -221,7 +222,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { baseTerrainOverlayImage=null } - val imagePath = tileSetLocation + tileInfo.baseTerrain + "Overlay" + val imagePath = "$tileSetLocation${tileInfo.baseTerrain}Overlay" if (!ImageGetter.imageExists(imagePath)) return baseTerrainOverlayImage = ImageGetter.getImage(imagePath) baseTerrainOverlayImage!!.run { diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index 1403f3ef97..cfbcc1301d 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -34,7 +34,7 @@ class WorldTileGroup(internal val worldScreen: WorldScreen, tileInfo: TileInfo) && city!!.civInfo.isPlayerCivilization()) addPopulationIcon() - val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() + val currentPlayerCiv = worldScreen.currentPlayerCiv if (UnCivGame.Current.viewEntireMapForDebug || currentPlayerCiv.exploredTiles.contains(tileInfo.position)) updateCityButton(city, isViewable || UnCivGame.Current.viewEntireMapForDebug) // needs to be before the update so the units will be above the city button diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index 35750aaab1..9f3cfc1899 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -367,7 +367,7 @@ class WorldScreen : CameraStageBaseScreen() { && currentPlayerCiv.exploredTiles.asSequence().map { gameInfo.tileMap[it] } .any { it.isCityCenter() && it.getOwner()!=currentPlayerCiv }) displayTutorials("EnemyCity") - if("Enables construction of Spaceship parts" in currentPlayerCiv.getBuildingUniques()) + if(currentPlayerCiv.containsBuildingUnique("Enables construction of Spaceship parts")) displayTutorials("ApolloProgram") if(currentPlayerCiv.getCivUnits().any { it.type == UnitType.Siege }) displayTutorials("SiegeUnitTrained")