From 5ae9b221fc40165f39f62dafe047bef354322d45 Mon Sep 17 00:00:00 2001 From: Xander Lenstra <71121390+xlenstra@users.noreply.github.com> Date: Thu, 15 Sep 2022 15:01:10 +0200 Subject: [PATCH] Starting in later eras triggers era uniques in all previous eras (#7787) --- core/src/com/unciv/logic/GameStarter.kt | 23 ++++++++++--------- .../unciv/logic/civilization/TechManager.kt | 9 +++++--- .../ruleset/unique/UniqueTriggerActivation.kt | 3 ++- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/core/src/com/unciv/logic/GameStarter.kt b/core/src/com/unciv/logic/GameStarter.kt index eadfd1f344..9d1b0a26ca 100644 --- a/core/src/com/unciv/logic/GameStarter.kt +++ b/core/src/com/unciv/logic/GameStarter.kt @@ -88,6 +88,11 @@ object GameStarter { } } + if (tileMap.continentSizes.isEmpty()) // Probably saved map without continent data + runAndMeasure("assignContinents") { + tileMap.assignContinents(TileMap.AssignContinentsMode.Ensure) + } + runAndMeasure("setTransients") { tileMap.setTransients(ruleset) // if we're starting from a map with pre-placed units, they need the civs to exist first tileMap.setStartingLocationsTransients() @@ -97,24 +102,20 @@ object GameStarter { gameInfo.setTransients() // needs to be before placeBarbarianUnit because it depends on the tilemap having its gameInfo set } - runAndMeasure("Techs and Stats") { - addCivTechs(gameInfo, ruleset, gameSetupInfo) - - addCivStats(gameInfo) + runAndMeasure("addCivStartingUnits") { + addCivStartingUnits(gameInfo) } runAndMeasure("Policies") { addCivPolicies(gameInfo, ruleset) } - if (tileMap.continentSizes.isEmpty()) // Probably saved map without continent data - runAndMeasure("assignContinents") { - tileMap.assignContinents(TileMap.AssignContinentsMode.Ensure) - } + runAndMeasure("Techs and Stats") { + addCivTechs(gameInfo, ruleset, gameSetupInfo) + } - runAndMeasure("addCivStartingUnits") { - // and only now do we add units for everyone, because otherwise both the gameInfo.setTransients() and the placeUnit will both add the unit to the civ's unit list! - addCivStartingUnits(gameInfo) + runAndMeasure("Starting stats") { + addCivStats(gameInfo) } // remove starting locations once we're done diff --git a/core/src/com/unciv/logic/civilization/TechManager.kt b/core/src/com/unciv/logic/civilization/TechManager.kt index b64e2a8fd7..5693b05774 100644 --- a/core/src/com/unciv/logic/civilization/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/TechManager.kt @@ -333,9 +333,12 @@ class TechManager : IsPartOfGameInfoSerialization { civInfo.addNotification("[" + policyBranch.name + "] policy branch unlocked!", NotificationIcon.Culture) } // Note that if you somehow skip over an era, its uniques aren't triggered - for (unique in currentEra.uniqueObjects) { - UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo) - } + val erasPassed = getRuleset().eras.values + .filter { it.eraNumber > previousEra.eraNumber && it.eraNumber <= currentEra.eraNumber } + .sortedBy { it.eraNumber } + for (era in erasPassed) + for (unique in era.uniqueObjects) + UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo) } } diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt index aa9526cb56..5d113890cd 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueTriggerActivation.kt @@ -26,7 +26,7 @@ object UniqueTriggerActivation { tile: TileInfo? = null, notification: String? = null ): Boolean { - val timingConditional = unique.conditionals.firstOrNull{it.type == ConditionalTimedUnique} + val timingConditional = unique.conditionals.firstOrNull { it.type == ConditionalTimedUnique } if (timingConditional != null) { civInfo.temporaryUniques.add(TemporaryUnique(unique, timingConditional.params[0].toInt())) return true @@ -486,6 +486,7 @@ object UniqueTriggerActivation { val spyName = otherCiv.espionageManager.addSpy() otherCiv.espionageManager.erasSpyEarnedFor.add(currentEra) if (otherCiv == civInfo || otherCiv.knows(civInfo)) + // We don't tell which civilization entered the new era, as that is done in the notification directly above this one otherCiv.addNotification("We have recruited [${spyName}] as a spy!", NotificationIcon.Spy) else otherCiv.addNotification("After an unknown civilization entered the [${currentEra}], we have recruited [${spyName}] as a spy!", NotificationIcon.Spy)