From e4fd6ff0698b462d12463ae4ac7b423433987e83 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Wed, 18 Jan 2023 15:57:26 +0200 Subject: [PATCH] chore: More civinfo cleanup --- core/src/com/unciv/logic/GameInfo.kt | 4 +- .../logic/civilization/CivilizationInfo.kt | 39 +------------------ .../diplomacy/DiplomacyManager.kt | 2 +- .../civilization/managers/TurnManager.kt | 33 +++++++++++++++- .../transients/CivInfoTransientCache.kt | 6 +++ core/src/com/unciv/ui/options/DebugTab.kt | 4 +- 6 files changed, 43 insertions(+), 45 deletions(-) diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 8fa736e025..0fc79e618c 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -294,7 +294,7 @@ class GameInfo : IsPartOfGameInfoSerialization, HasGameInfoSerializationVersion TurnManager(player).startTurn() // Automation done here - player.doTurn() + TurnManager(player).automateTurn() // Do we need to break if player won? if (simulateUntilWin && player.victoryManager.hasWon()) { @@ -540,7 +540,7 @@ class GameInfo : IsPartOfGameInfoSerialization, HasGameInfoSerializationVersion }) { for (unit in civInfo.getCivUnits()) unit.updateVisibleTiles(false) // this needs to be done after all the units are assigned to their civs and all other transients are set - civInfo.updateSightAndResources() // only run ONCE and not for each unit - this is a huge performance saver! + civInfo.cache.updateSightAndResources() // only run ONCE and not for each unit - this is a huge performance saver! // Since this depends on the cities of ALL civilizations, // we need to wait until we've set the transients of all the cities before we can run this. diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index a24864b0ca..f2f1638ff0 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -7,9 +7,7 @@ import com.unciv.json.HashMapVector2 import com.unciv.logic.GameInfo import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.UncivShowableException -import com.unciv.logic.VictoryData import com.unciv.logic.automation.ai.TacticalAI -import com.unciv.logic.automation.civilization.NextTurnAutomation import com.unciv.logic.automation.unit.WorkerAutomation import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.diplomacy.CityStateFunctions @@ -226,7 +224,7 @@ class CivilizationInfo : IsPartOfGameInfoSerialization { val passableImpassables = HashSet() // For Carthage-like uniques // For Aggressor, Warmonger status - private var numMinorCivsAttacked = 0 + internal var numMinorCivsAttacked = 0 var totalCultureForContests = 0 var totalFaithForContests = 0 @@ -915,41 +913,6 @@ class CivilizationInfo : IsPartOfGameInfoSerialization { } - fun updateSightAndResources() { - cache.updateViewableTiles() - cache.updateHasActiveEnemyMovementPenalty() - cache.updateCivResources() - } - - fun changeMinorCivsAttacked(count: Int) { - numMinorCivsAttacked += count - } - - fun doTurn() { - - // Defeated civs do nothing - if (isDefeated()) - return - - // Do stuff - NextTurnAutomation.automateCivMoves(this) - - // Update barbarian camps - if (isBarbarian() && !gameInfo.gameParameters.noBarbarians) - gameInfo.barbarians.updateEncampments() - } - - fun updateWinningCiv(){ - if (gameInfo.victoryData == null) { - val victoryType = victoryManager.getVictoryTypeAchieved() - if (victoryType != null) { - gameInfo.victoryData = VictoryData(civName, victoryType, gameInfo.turns) - - for (civInfo in gameInfo.civilizations) - civInfo.popupAlerts.add(PopupAlert(AlertType.GameHasBeenWon, civName)) - } - } - } fun addFlag(flag: String, count: Int) = flagsCountdown.set(flag, count) fun removeFlag(flag: String) = flagsCountdown.remove(flag) diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 9796e99b2b..00f2057119 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -686,7 +686,7 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization { if (otherCiv.isCityState() && !indirectCityStateAttack) { otherCivDiplomacy.setInfluence(-60f) - civInfo.changeMinorCivsAttacked(1) + civInfo.numMinorCivsAttacked += 1 otherCiv.cityStateFunctions.cityStateAttacked(civInfo) // You attacked your own ally, you're a right bastard diff --git a/core/src/com/unciv/logic/civilization/managers/TurnManager.kt b/core/src/com/unciv/logic/civilization/managers/TurnManager.kt index fee6f9f229..48dc573d10 100644 --- a/core/src/com/unciv/logic/civilization/managers/TurnManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TurnManager.kt @@ -1,12 +1,15 @@ package com.unciv.logic.civilization.managers import com.unciv.UncivGame +import com.unciv.logic.VictoryData import com.unciv.logic.automation.civilization.NextTurnAutomation +import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.CivFlags import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.NotificationCategory import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.PlayerType +import com.unciv.logic.civilization.PopupAlert import com.unciv.logic.map.TileInfo import com.unciv.logic.trade.TradeEvaluation import com.unciv.models.ruleset.ModOptionsConstants @@ -66,7 +69,7 @@ class TurnManager(val civInfo: CivilizationInfo) { } } - civInfo.updateWinningCiv() + updateWinningCiv() } @@ -266,7 +269,33 @@ class TurnManager(val civInfo: CivilizationInfo) { civInfo.cachedMilitaryMight = -1 // Reset so we don't use a value from a previous turn - civInfo.updateWinningCiv() // Maybe we did something this turn to win + updateWinningCiv() // Maybe we did something this turn to win + } + + fun updateWinningCiv(){ + if (civInfo.gameInfo.victoryData != null) return // Game already won + + val victoryType = civInfo.victoryManager.getVictoryTypeAchieved() + if (victoryType != null) { + civInfo.gameInfo.victoryData = + VictoryData(civInfo.civName, victoryType, civInfo.gameInfo.turns) + + for (civInfo in civInfo.gameInfo.civilizations) + civInfo.popupAlerts.add(PopupAlert(AlertType.GameHasBeenWon, civInfo.civName)) + } + } + + fun automateTurn() { + // Defeated civs do nothing + if (civInfo.isDefeated()) + return + + // Do stuff + NextTurnAutomation.automateCivMoves(civInfo) + + // Update barbarian camps + if (civInfo.isBarbarian() && !civInfo.gameInfo.gameParameters.noBarbarians) + civInfo.gameInfo.barbarians.updateEncampments() } } diff --git a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt index 3a18ecfd1b..5575d30a3d 100644 --- a/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt +++ b/core/src/com/unciv/logic/civilization/transients/CivInfoTransientCache.kt @@ -16,6 +16,12 @@ import com.unciv.models.ruleset.unique.UniqueType /** CivInfo class was getting too crowded */ class CivInfoTransientCache(val civInfo: CivilizationInfo) { + fun updateSightAndResources() { + updateViewableTiles() + updateHasActiveEnemyMovementPenalty() + updateCivResources() + } + // This is a big performance fun updateViewableTiles() { setNewViewableTiles() diff --git a/core/src/com/unciv/ui/options/DebugTab.kt b/core/src/com/unciv/ui/options/DebugTab.kt index 00218897d8..d1fff3501c 100644 --- a/core/src/com/unciv/ui/options/DebugTab.kt +++ b/core/src/com/unciv/ui/options/DebugTab.kt @@ -88,7 +88,7 @@ fun debugTab() = Table(BaseScreen.skin).apply { curGameInfo.getCurrentPlayerCivilization().popupAlerts.removeLastOrNull() } } - curGameInfo.getCurrentPlayerCivilization().updateSightAndResources() + curGameInfo.getCurrentPlayerCivilization().cache.updateSightAndResources() if (worldScreen != null) worldScreen.shouldUpdate = true } add(unlockTechsButton).colspan(2).row() @@ -106,7 +106,7 @@ fun debugTab() = Table(BaseScreen.skin).apply { // If this becomes a problem, check if such an improvement exists and otherwise plop down a great improvement or so tile.changeImprovement(resource.getImprovements().first()) } - curGameInfo.getCurrentPlayerCivilization().updateSightAndResources() + curGameInfo.getCurrentPlayerCivilization().cache.updateSightAndResources() if (worldScreen != null) worldScreen.shouldUpdate = true } add(giveResourcesButton).colspan(2).row()