diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index e768870cf1..2dda7490ee 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -211,7 +211,10 @@ class GameInfo { for(unit in civInfo.getCivUnits()) unit.updateViewableTiles() // this needs to be done after all the units are assigned to their civs and all other transients are set } + for (civInfo in civilizations){ + // We need to determine the GLOBAL happiness state in order to determine the city stats + for(cityInfo in civInfo.cities) cityInfo.cityStats.updateCityHappiness() for (cityInfo in civInfo.cities) cityInfo.cityStats.update() } } diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index fa56c0b584..0f7c4f6956 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -43,7 +43,7 @@ class Automation { if (stats.food <= 2) rank += (stats.food * 1.2f) //food get more value to keep city growing else rank += (2.4f + (stats.food - 2) / 2) // 1.2 point for each food up to 2, from there on half a point - if (civInfo.gold < 0 && civInfo.getStatsForNextTurn().gold <= 0) rank += stats.gold + if (civInfo.gold < 0 && civInfo.statsForNextTurn.gold <= 0) rank += stats.gold else rank += stats.gold / 2 rank += stats.production @@ -129,7 +129,7 @@ class Automation { .minBy{it.cost} if (goldBuilding!=null) { val choice = ConstructionChoice(goldBuilding.name,1.2f) - if (cityInfo.civInfo.getStatsForNextTurn().gold<0) { + if (cityInfo.civInfo.statsForNextTurn.gold<0) { choice.choiceModifier=3f } relativeCostEffectiveness.add(choice) @@ -151,8 +151,9 @@ class Automation { .minBy{it.cost} if (happinessBuilding!=null) { val choice = ConstructionChoice(happinessBuilding.name,1f) - if (cityInfo.civInfo.happiness > 5) choice.choiceModifier = 1/2f // less desperate - if (cityInfo.civInfo.happiness < 0) choice.choiceModifier = 3f // more desperate + val civHappiness = cityInfo.civInfo.getHappiness() + if (civHappiness > 5) choice.choiceModifier = 1/2f // less desperate + if (civHappiness < 0) choice.choiceModifier = 3f // more desperate relativeCostEffectiveness.add(choice) } @@ -217,7 +218,7 @@ class Automation { } //Army - if((!isAtWar && cityInfo.civInfo.getStatsForNextTurn().gold>0 && militaryUnits0 && militaryUnits -50)) { val militaryUnit = chooseMilitaryUnit(cityInfo) val unitsToCitiesRatio = cities.toFloat() / (militaryUnits + 1) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 8a1eada92a..7fe33a4c37 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -75,7 +75,7 @@ class NextTurnAutomation{ } } - if(civInfo.happiness < 5){ + if(civInfo.getHappiness() < 5){ for(cityState in civInfo.gameInfo.civilizations .filter { it.isCityState() && it.getCityStateType()==CityStateType.Mercantile }){ val diploManager = cityState.getDiplomacyManager(civInfo) @@ -300,7 +300,7 @@ class NextTurnAutomation{ else { if (enemy.victoryType()!=VictoryType.Cultural && enemy.getCivUnits().filter { !it.type.isCivilian() }.size > enemy.cities.size - && enemy.happiness > 0) { + && enemy.getHappiness() > 0) { continue //enemy AI has too large army and happiness. It continues to fight for profit. } tradeLogic.acceptTrade() @@ -334,7 +334,7 @@ class NextTurnAutomation{ if (civInfo.cities.isNotEmpty() && civInfo.diplomacy.isNotEmpty()) { val ourMilitaryUnits = civInfo.getCivUnits().filter { !it.type.isCivilian() }.size - if (!civInfo.isAtWar() && civInfo.happiness > 0 + if (!civInfo.isAtWar() && civInfo.getHappiness() > 0 && ourMilitaryUnits >= civInfo.cities.size) { //evaluate war val ourCombatStrength = Automation().evaluteCombatStrength(civInfo) val enemyCivsByDistanceToOurs = civInfo.getKnownCivs() @@ -404,7 +404,7 @@ class NextTurnAutomation{ if(civInfo.isAtWar()) return // don't train settlers when you could be training troops. if(civInfo.victoryType()==VictoryType.Cultural && civInfo.cities.size >3) return if (civInfo.cities.any() - && civInfo.happiness > civInfo.cities.size + 5 + && civInfo.getHappiness() > civInfo.cities.size + 5 && civInfo.getCivUnits().none { it.name == Constants.settler } && civInfo.cities.none { it.cityConstructions.currentConstruction == Constants.settler }) { diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index dbc8354fee..a3aad83498 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -47,8 +47,9 @@ class BattleDamage{ } //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php - if (combatant.getCivInfo().happiness < 0) - modifiers["Unhappiness"] = max(0.02f * combatant.getCivInfo().happiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units... + val civHappiness = combatant.getCivInfo().getHappiness() + if (civHappiness < 0) + modifiers["Unhappiness"] = max(0.02f * civHappiness,-0.9f) // otherwise it could exceed -100% and start healing enemy units... if(combatant.getCivInfo().policies.isAdopted("Populism") && combatant.getHealth() < 100){ modifiers["Populism"] = 0.25f diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 079b6b3e6f..d2e949c68b 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -17,7 +17,7 @@ class CityConstructions { @Transient lateinit var cityInfo: CityInfo @Transient private var builtBuildingObjects=ArrayList() - var builtBuildings = ArrayList() + var builtBuildings = HashSet() val inProgressConstructions = HashMap() var currentConstruction: String = "Monument" // default starting building! var currentConstructionIsUserSet = false @@ -213,7 +213,9 @@ class CityConstructions { getConstruction(buildingName).postBuildEvent(this) if (currentConstruction == buildingName) cancelCurrentConstruction() + cityInfo.cityStats.update() + cityInfo.civInfo.updateDetailedCivResources() // this building could be a resource-requiring one } fun addCultureBuilding() { diff --git a/core/src/com/unciv/logic/city/CityExpansionManager.kt b/core/src/com/unciv/logic/city/CityExpansionManager.kt index e4f20baca3..e5152e15a6 100644 --- a/core/src/com/unciv/logic/city/CityExpansionManager.kt +++ b/core/src/com/unciv/logic/city/CityExpansionManager.kt @@ -95,6 +95,9 @@ class CityExpansionManager { if(cityInfo.workedTiles.contains(tileInfo.position)) cityInfo.workedTiles = cityInfo.workedTiles.withoutItem(tileInfo.position) tileInfo.owningCity=null + + cityInfo.civInfo.updateDetailedCivResources() + cityInfo.cityStats.update() } fun takeOwnership(tileInfo: TileInfo){ @@ -105,6 +108,7 @@ class CityExpansionManager { cityInfo.tiles = cityInfo.tiles.withItem(tileInfo.position) tileInfo.owningCity = cityInfo cityInfo.population.autoAssignPopulation() + cityInfo.civInfo.updateDetailedCivResources() cityInfo.cityStats.update() for(unit in tileInfo.getUnits()) diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index f14038428e..4731ea9794 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -166,7 +166,7 @@ class CityStats { // 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! // -3 happiness per city - fun getCityHappiness(): LinkedHashMap { + fun updateCityHappiness(){ val civInfo = cityInfo.civInfo val newHappinessList = LinkedHashMap() var unhappinessModifier = civInfo.getDifficulty().unhappinessModifier @@ -212,7 +212,6 @@ class CityStats { // we don't want to modify the existing happiness list because that leads // to concurrency problems if we iterate on it while changing happinessList=newHappinessList - return newHappinessList } fun getStatsOfSpecialist(stat:Stat, policies: HashSet): Stats { @@ -305,7 +304,7 @@ class CityStats { stats.culture += 33f if (policies.contains("Commerce") && cityInfo.isCapital()) stats.gold += 25f - if (policies.contains("Sovereignty") && cityInfo.civInfo.happiness >= 0) + if (policies.contains("Sovereignty") && cityInfo.civInfo.getHappiness() >= 0) stats.science += 15f if (policies.contains("Total War") && currentConstruction is BaseUnit && !currentConstruction.unitType.isCivilian() ) stats.production += 15f @@ -369,6 +368,7 @@ class CityStats { } fun update() { + updateCityHappiness() updateBaseStatList() updateStatPercentBonusList() @@ -389,7 +389,7 @@ class CityStats { newCurrentCityStats.science *= 1 + statPercentBonusesSum.science / 100 newCurrentCityStats.culture *= 1 + statPercentBonusesSum.culture / 100 - val isUnhappy = cityInfo.civInfo.happiness < 0 + val isUnhappy = cityInfo.civInfo.getHappiness() < 0 if (!isUnhappy) // Regular food bonus revoked when unhappy per https://forums.civfanatics.com/resources/complete-guide-to-happiness-vanilla.25584/ newCurrentCityStats.food *= 1 + statPercentBonusesSum.food / 100 @@ -424,6 +424,8 @@ class CityStats { if (cityInfo.resistanceCounter > 0) currentCityStats = Stats().add(Stat.Production,1f) // You get nothing, Jon Snow else currentCityStats = newCurrentCityStats + + cityInfo.civInfo.updateStatsForNextTurn() } private fun updateFoodEaten() { diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 419760e762..63423b6278 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -44,9 +44,10 @@ class CivilizationInfo { /** This is for performance since every movement calculation depends on this, see MapUnit comment */ @Transient var hasActiveGreatWall = false + @Transient var statsForNextTurn = Stats() + @Transient var detailedCivResources = ResourceSupplyList() var gold = 0 - var happiness = 15 @Deprecated("As of 2.11.1") var difficulty = "Chieftain" var playerType = PlayerType.AI var civName = "" @@ -78,7 +79,6 @@ class CivilizationInfo { fun clone(): CivilizationInfo { val toReturn = CivilizationInfo() toReturn.gold = gold - toReturn.happiness = happiness toReturn.playerType = playerType toReturn.civName = civName toReturn.tech = tech.clone() @@ -132,7 +132,9 @@ class CivilizationInfo { else return VictoryType.Neutral } - fun getStatsForNextTurn():Stats = getStatMapForNextTurn().values.toList().reduce{a,b->a+b} + fun updateStatsForNextTurn(){ + statsForNextTurn = getStatMapForNextTurn().values.toList().reduce{a,b->a+b} + } fun getStatMapForNextTurn(): HashMap { val statMap = HashMap() @@ -154,7 +156,7 @@ class CivilizationInfo { } } - for (entry in getHappinessForNextTurn()) { + for (entry in getHappinessBreakdown()) { if (!statMap.containsKey(entry.key)) statMap[entry.key] = Stats() statMap[entry.key]!!.happiness += entry.value @@ -220,7 +222,9 @@ class CivilizationInfo { return transportationUpkeep } - fun getHappinessForNextTurn(): HashMap { + fun getHappiness() = getHappinessBreakdown().values.sum().roundToInt() + + fun getHappinessBreakdown(): HashMap { val statMap = HashMap() statMap["Base happiness"] = getDifficulty().baseHappiness.toFloat() @@ -230,7 +234,7 @@ class CivilizationInfo { .count { it.resourceType === ResourceType.Luxury } * happinessPerUniqueLuxury for(city in cities.toList()){ - for(keyvalue in city.cityStats.getCityHappiness()){ + for(keyvalue in city.cityStats.happinessList){ if(statMap.containsKey(keyvalue.key)) statMap[keyvalue.key] = statMap[keyvalue.key]!!+keyvalue.value else statMap[keyvalue.key] = keyvalue.value @@ -258,23 +262,23 @@ class CivilizationInfo { } /** - * Returns list of all resources and their origin - for most usages you'll want getCivResources().totalSupply(), + * Returns list of all resources and their origin - for most usages you'll want updateDetailedCivResources().totalSupply(), * which unifies al the different sources */ fun getCivResources(): ResourceSupplyList { val newResourceSupplyList=ResourceSupplyList() - for(resourceSupply in getDetailedCivResources()) + for(resourceSupply in detailedCivResources) newResourceSupplyList.add(resourceSupply.resource,resourceSupply.amount,"All") return newResourceSupplyList } - fun getDetailedCivResources(): ResourceSupplyList { - val civResources = ResourceSupplyList() - for (city in cities) civResources.add(city.getCityResources()) - for (dip in diplomacy.values) civResources.add(dip.resourcesFromTrade()) + fun updateDetailedCivResources() { + val newDetailedCivResources = ResourceSupplyList() + for (city in cities) newDetailedCivResources.add(city.getCityResources()) + for (dip in diplomacy.values) newDetailedCivResources.add(dip.resourcesFromTrade()) for(resource in getCivUnits().mapNotNull { it.baseUnit.requiredResource }.map { GameBasics.TileResources[it]!! }) - civResources.add(resource,-1,"Units") - return civResources + newDetailedCivResources.add(resource,-1,"Units") + detailedCivResources = newDetailedCivResources } /** @@ -294,16 +298,24 @@ class CivilizationInfo { fun getCivUnits(): List = units - fun addUnit(mapUnit: MapUnit){ + fun addUnit(mapUnit: MapUnit, updateCivInfo:Boolean=true){ val newList = ArrayList(units) newList.add(mapUnit) units=newList + + if(updateCivInfo) { + // Not relevant when updating tileinfo transients, since some info of the civ itself isn't yet available, + // and in any case it'll be updated once civ info transients are + updateStatsForNextTurn() // unit upkeep + updateDetailedCivResources() + } } fun removeUnit(mapUnit: MapUnit){ val newList = ArrayList(units) newList.remove(mapUnit) units=newList + updateStatsForNextTurn() // unit upkeep } fun getIdleUnits() = getCivUnits().filter { it.isIdle() } @@ -431,6 +443,7 @@ class CivilizationInfo { setCitiesConnectedToCapitalTransients() updateViewableTiles() updateHasActiveGreatWall() + updateDetailedCivResources() } fun updateHasActiveGreatWall(){ @@ -439,6 +452,8 @@ class CivilizationInfo { } fun startTurn(){ + updateStatsForNextTurn() // for things that change when turn passes e.g. golden age, city state influence + // Generate great people at the start of the turn, // so they won't be generated out in the open and vulnerable to enemy attacks before you can control them if (cities.isNotEmpty()) { //if no city available, addGreatPerson will throw exception @@ -450,14 +465,13 @@ class CivilizationInfo { setCitiesConnectedToCapitalTransients() for (city in cities) city.startTurn() - happiness = getHappinessForNextTurn().values.sum().roundToInt() getCivUnits().toList().forEach { it.startTurn() } } fun endTurn() { notifications.clear() - val nextTurnStats = getStatsForNextTurn() + val nextTurnStats = statsForNextTurn policies.endTurn(nextTurnStats.culture.toInt()) @@ -484,7 +498,7 @@ class CivilizationInfo { city.endTurn() } - goldenAges.endTurn(happiness) + goldenAges.endTurn(getHappiness()) getCivUnits().forEach { it.endTurn() } diplomacy.values.forEach{it.nextTurn()} updateHasActiveGreatWall() @@ -604,6 +618,7 @@ class CivilizationInfo { val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() currentPlayerCiv.gold -= giftAmount otherCiv.getDiplomacyManager(currentPlayerCiv).influence += giftAmount/10 + updateStatsForNextTurn() } //endregion diff --git a/core/src/com/unciv/logic/civilization/PolicyManager.kt b/core/src/com/unciv/logic/civilization/PolicyManager.kt index 76188d9f58..c978180041 100644 --- a/core/src/com/unciv/logic/civilization/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/PolicyManager.kt @@ -92,7 +92,7 @@ class PolicyManager { } for (cityInfo in civInfo.cities) - cityInfo.cityStats.update() + cityInfo.cityStats.update() // This ALSO has the side-effect of updating the CivInfo startForNextTurn so we don't need to call it explicitly if(!canAdoptPolicy()) shouldOpenPolicyPicker=false } diff --git a/core/src/com/unciv/logic/civilization/TechManager.kt b/core/src/com/unciv/logic/civilization/TechManager.kt index 1630794b58..cc3818ae62 100644 --- a/core/src/com/unciv/logic/civilization/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/TechManager.kt @@ -61,7 +61,7 @@ class TechManager { fun turnsToTech(techName: String): Int { return Math.ceil( remainingScienceToTech(techName).toDouble() - / civInfo.getStatsForNextTurn().science).toInt() + / civInfo.statsForNextTurn.science).toInt() } fun isResearched(TechName: String): Boolean = techsResearched.contains(TechName) diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index aa4c682971..7cb6de89c4 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -221,8 +221,12 @@ class DiplomacyManager() { for(trade in trades.toList()){ for(offer in trade.ourOffers.union(trade.theirOffers).filter { it.duration>0 }) { offer.duration-- - if(offer.duration==0) - civInfo.addNotification("["+offer.name+"] from [$otherCivName] has ended",null, Color.GOLD) + if(offer.duration==0) { + civInfo.addNotification("[" + offer.name + "] from [$otherCivName] has ended", null, Color.GOLD) + + civInfo.updateStatsForNextTurn() // if they were bringing us gold per turn + civInfo.updateDetailedCivResources() // if they were giving us resources + } } if(trade.ourOffers.all { it.duration<=0 } && trade.theirOffers.all { it.duration<=0 }) { diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index f92c8b5e30..ba775b2ef8 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -522,10 +522,10 @@ class MapUnit { (actions.random())() } - fun assignOwner(civInfo:CivilizationInfo){ + fun assignOwner(civInfo:CivilizationInfo, updateCivInfo:Boolean=true){ owner=civInfo.civName this.civInfo=civInfo - civInfo.addUnit(this) + civInfo.addUnit(this,updateCivInfo) } //endregion diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 5de853ae10..853d9fa3e5 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -296,7 +296,7 @@ open class TileInfo { if(civilianUnit!=null) civilianUnit!!.currentTile = this for (unit in getUnits()) { - unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner)) + unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner),false) unit.setTransients() } } diff --git a/core/src/com/unciv/logic/trade/TradeEvaluation.kt b/core/src/com/unciv/logic/trade/TradeEvaluation.kt index 0a8ea993ee..825251c8c6 100644 --- a/core/src/com/unciv/logic/trade/TradeEvaluation.kt +++ b/core/src/com/unciv/logic/trade/TradeEvaluation.kt @@ -106,7 +106,7 @@ class TradeEvaluation{ TradeType.City -> { val city = tradePartner.cities.first { it.name==offer.name } val stats = city.cityStats.currentCityStats - if(civInfo.happiness + city.cityStats.happinessList.values.sum() < 0) + if(civInfo.getHappiness() + city.cityStats.happinessList.values.sum() < 0) return 0 // we can't really afford to go into negative happiness because of buying a city val sumOfStats = stats.culture+stats.gold+stats.science+stats.production+stats.happiness+stats.food return sumOfStats.toInt() * 100 diff --git a/core/src/com/unciv/logic/trade/TradeLogic.kt b/core/src/com/unciv/logic/trade/TradeLogic.kt index 88d91392b5..00f74775d3 100644 --- a/core/src/com/unciv/logic/trade/TradeLogic.kt +++ b/core/src/com/unciv/logic/trade/TradeLogic.kt @@ -45,7 +45,7 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci } offers.add(TradeOffer("Gold".tr(), TradeType.Gold, 0, civInfo.gold)) - offers.add(TradeOffer("Gold per turn".tr(), TradeType.Gold_Per_Turn, 30, civInfo.getStatsForNextTurn().gold.toInt())) + offers.add(TradeOffer("Gold per turn".tr(), TradeType.Gold_Per_Turn, 30, civInfo.statsForNextTurn.gold.toInt())) if (!civInfo.isCityState() && !otherCivilization.isCityState()) { for (city in civInfo.cities.filterNot { it.isCapital() }) offers.add(TradeOffer(city.name, TradeType.City, 0)) @@ -111,6 +111,8 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci from.getDiplomacyManager(nameOfCivToDeclareWarOn).declareWar() } } + to.updateStatsForNextTurn() + to.updateDetailedCivResources() } transferTrade(ourCivilization,otherCivilization,currentTrade) diff --git a/core/src/com/unciv/ui/EmpireOverviewScreen.kt b/core/src/com/unciv/ui/EmpireOverviewScreen.kt index a223e39608..e9df97b3ed 100644 --- a/core/src/com/unciv/ui/EmpireOverviewScreen.kt +++ b/core/src/com/unciv/ui/EmpireOverviewScreen.kt @@ -89,7 +89,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ centerTable.pack() } topTable.add(setResourcesButton) - if(currentPlayerCivInfo.getDetailedCivResources().isEmpty()) + if(currentPlayerCivInfo.detailedCivResources.isEmpty()) setResourcesButton.disable() topTable.pack() @@ -140,12 +140,12 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ happinessTable.defaults().pad(5f) happinessTable.add("Happiness".toLabel().setFontSize(24)).colspan(2).row() happinessTable.addSeparator() - for (entry in currentPlayerCivInfo.getHappinessForNextTurn()) { + for (entry in currentPlayerCivInfo.getHappinessBreakdown()) { happinessTable.add(entry.key.tr()) happinessTable.add(entry.value.roundToInt().toString()).row() } happinessTable.add("Total".tr()) - happinessTable.add(currentPlayerCivInfo.getHappinessForNextTurn().values.sum().roundToInt().toString()) + happinessTable.add(currentPlayerCivInfo.getHappinessBreakdown().values.sum().roundToInt().toString()) happinessTable.pack() return happinessTable } @@ -349,7 +349,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ private fun getResourcesTable(): Table { val resourcesTable=Table().apply { defaults().pad(10f) } - val resourceDrilldown = currentPlayerCivInfo.getDetailedCivResources() + val resourceDrilldown = currentPlayerCivInfo.detailedCivResources // First row of table has all the icons resourcesTable.add() diff --git a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt index 4c9ae9df26..0f1152b494 100644 --- a/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt +++ b/core/src/com/unciv/ui/cityscreen/CityInfoTable.kt @@ -133,7 +133,7 @@ class CityInfoTable(private val cityScreen: CityScreen) : Table(CameraStageBaseS for(stats in unifiedStatList.values) stats.happiness=0f // add happiness to stat list - for(entry in cityStats.getCityHappiness().filter { it.value!=0f }){ + for(entry in cityStats.happinessList.filter { it.value!=0f }){ if(!unifiedStatList.containsKey(entry.key)) unifiedStatList[entry.key]= Stats() unifiedStatList[entry.key]!!.happiness=entry.value diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index 47ba517ab3..34fd03aa2a 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -106,7 +106,6 @@ class WorldScreen : CameraStageBaseScreen() { gameClone.setTransients() val cloneCivilization = gameClone.getCurrentPlayerCivilization() kotlin.concurrent.thread { - currentPlayerCiv.happiness = gameClone.getCurrentPlayerCivilization().getHappinessForNextTurn().values.sum().toInt() gameInfo.civilizations.forEach { it.setCitiesConnectedToCapitalTransients() } } @@ -336,7 +335,7 @@ class WorldScreen : CameraStageBaseScreen() { && currentPlayerCiv.viewableTiles.any { it.getUnits().any { unit -> unit.civInfo.isBarbarianCivilization() } }) displayTutorials("BarbarianEncountered") if(currentPlayerCiv.cities.size > 2) displayTutorials("SecondCity") - if(currentPlayerCiv.happiness < 0) displayTutorials("Unhappiness") + if(currentPlayerCiv.getHappiness() < 0) displayTutorials("Unhappiness") if(currentPlayerCiv.goldenAges.isGoldenAge()) displayTutorials("GoldenAge") if(gameInfo.turns >= 100) displayTutorials("ContactMe") val resources = currentPlayerCiv.getCivResources() diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt index a381075ebb..68ff55b2aa 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt @@ -128,7 +128,7 @@ class WorldScreenTopBar(val screen: WorldScreen) : Table() { turnsLabel.setText("Turn".tr()+" " + civInfo.gameInfo.turns + " | "+ abs(year)+(if (year<0) " BC" else " AD")) - val nextTurnStats = civInfo.getStatsForNextTurn() + val nextTurnStats = civInfo.statsForNextTurn val goldPerTurn = "(" + (if (nextTurnStats.gold > 0) "+" else "") + Math.round(nextTurnStats.gold) + ")" goldLabel.setText(Math.round(civInfo.gold.toFloat()).toString() + goldPerTurn) @@ -136,7 +136,7 @@ class WorldScreenTopBar(val screen: WorldScreen) : Table() { happinessLabel.setText(getHappinessText(civInfo)) - if (civInfo.happiness < 0) { + if (civInfo.getHappiness() < 0) { happinessLabel.setFontColor(malcontentColor) happinessImage.clearChildren() happinessImage.addActor(malcontentGroup) @@ -160,7 +160,7 @@ class WorldScreenTopBar(val screen: WorldScreen) : Table() { } private fun getHappinessText(civInfo: CivilizationInfo): String { - var happinessText = civInfo.happiness.toString() + var happinessText = civInfo.getHappiness().toString() if (civInfo.goldenAges.isGoldenAge()) happinessText += " "+"GOLDEN AGE".tr()+"(${civInfo.goldenAges.turnsLeftForCurrentGoldenAge})" else