Multiple performance improvements, especially for memory - should mitigate OutOfMemory exceptions on older phones

This commit is contained in:
Yair Morgenstern
2019-07-23 00:20:00 +03:00
parent 78b9908479
commit db0543468b
23 changed files with 71 additions and 53 deletions

View File

@ -185,7 +185,7 @@ class BattleDamage{
private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): HashMap<String,Float> {
val modifiers = HashMap<String,Float>()
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

View File

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

View File

@ -102,7 +102,7 @@ class CityConstructions {
throw NotBuildingOrUnitException("$constructionName is not a building or a unit!")
}
internal fun getBuiltBuildings(): List<Building> = builtBuildingObjects // toList os to avoid concurrency problems
internal fun getBuiltBuildings(): List<Building> = builtBuildingObjects
fun containsBuildingOrEquivalent(building: String): Boolean =
isBuilt(building) || getBuiltBuildings().any{it.replaces==building}

View File

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

View File

@ -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<String> = cityConstructions.getBuiltBuildings().flatMap { it.uniques }
fun containsBuildingUnique(unique:String) = cityConstructions.getBuiltBuildings().any { it.uniques.contains(unique) }
fun getGreatPersonMap():HashMap<String,Stats>{
val stats = HashMap<String,Stats>()
@ -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)

View File

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

View File

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

View File

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

View File

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

View File

@ -161,7 +161,7 @@ class CivilizationInfo {
fun hasResource(resourceName:String): Boolean = getCivResourcesByName()[resourceName]!!>0
fun getBuildingUniques(): List<String> = cities.flatMap { it.getBuildingUniques()}.distinct()
fun containsBuildingUnique(unique:String) = cities.any { it.containsBuildingUnique(unique) }
fun getCivUnits(): List<MapUnit> = units

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<String,Stats>(){

View File

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

View File

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

View File

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

View File

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

View File

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