diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 932b9a6780..f8131153c8 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -1847,6 +1847,7 @@ Do you want to stage a coup in [civName] with a [percent]% chance of success? = # Spy fleeing city After the city of [cityName] was destroyed, your spy [spyName] has fled back to our hideout. = After the city of [cityName] was conquered, your spy [spyName] has fled back to our hideout. = +After the city of [cityName] was taken over, your spy [spyName] has fled back to our hideout. = Due to the chaos ensuing in [cityName], your spy [spyName] has fled back to our hideout. = # Promotions diff --git a/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt b/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt index 5de8d74e2e..c1fb088cd9 100644 --- a/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt @@ -273,6 +273,10 @@ class CityConquestFunctions(val city: City) { // Remove their free buildings from this city and remove free buildings provided by the city from their cities removeBuildingsOnMoveToCiv() + // catch-all - should ideally not happen as we catch the individual cases with an appropriate notification + city.espionage.removeAllPresentSpies(SpyFleeReason.Other) + + // Place palace for newCiv if this is the only city they have. if (newCiv.cities.size == 1) newCiv.moveCapitalTo(city, null) diff --git a/core/src/com/unciv/logic/city/managers/CityEspionageManager.kt b/core/src/com/unciv/logic/city/managers/CityEspionageManager.kt index 084c53bd76..0bb012d9a1 100644 --- a/core/src/com/unciv/logic/city/managers/CityEspionageManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityEspionageManager.kt @@ -3,13 +3,13 @@ package com.unciv.logic.city.managers import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.city.City import com.unciv.logic.civilization.Civilization -import com.unciv.logic.civilization.NotificationCategory -import com.unciv.logic.civilization.NotificationIcon import com.unciv.models.Spy enum class SpyFleeReason { CityDestroyed, CityCaptured, + CityBought, + CityTakenOverByMarriage, Other } @@ -38,6 +38,7 @@ class CityEspionageManager : IsPartOfGameInfoSerialization { val notificationString = when (reason) { SpyFleeReason.CityDestroyed -> "After the city of [${city.name}] was destroyed, your spy [${spy.name}] has fled back to our hideout." SpyFleeReason.CityCaptured -> "After the city of [${city.name}] was conquered, your spy [${spy.name}] has fled back to our hideout." + SpyFleeReason.CityBought, SpyFleeReason.CityTakenOverByMarriage -> "After the city of [${city.name}] was taken over, your spy [${spy.name}] has fled back to our hideout." else -> "Due to the chaos ensuing in [${city.name}], your spy [${spy.name}] has fled back to our hideout." } spy.addNotification(notificationString) diff --git a/core/src/com/unciv/logic/city/managers/CityTurnManager.kt b/core/src/com/unciv/logic/city/managers/CityTurnManager.kt index 3eb165e011..6e2a690b06 100644 --- a/core/src/com/unciv/logic/city/managers/CityTurnManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityTurnManager.kt @@ -126,7 +126,7 @@ class CityTurnManager(val city: City) { .sumOf { it.params[0].toInt() - 1 } if (city.population.population <= removedPopulation) { - city.espionage.removeAllPresentSpies(SpyFleeReason.CityCaptured) + city.espionage.removeAllPresentSpies(SpyFleeReason.Other) city.civ.addNotification( "[${city.name}] has been razed to the ground!", city.location, NotificationCategory.General, diff --git a/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt b/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt index 600b6f7fad..d31e1a051d 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/CityStateFunctions.kt @@ -3,6 +3,7 @@ package com.unciv.logic.civilization.diplomacy import com.unciv.Constants import com.unciv.logic.automation.civilization.NextTurnAutomation import com.unciv.logic.battle.CityCombatant +import com.unciv.logic.city.managers.SpyFleeReason import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.CivFlags import com.unciv.logic.civilization.Civilization @@ -371,18 +372,22 @@ class CityStateFunctions(val civInfo: Civilization) { return otherCiv.addGold(-getDiplomaticMarriageCost()) + val notificationLocation = civInfo.getCapital()!!.location otherCiv.addNotification("We have married into the ruling family of [${civInfo.civName}], bringing them under our control.", notificationLocation, NotificationCategory.Diplomacy, civInfo.civName, NotificationIcon.Diplomacy, otherCiv.civName) + for (civ in civInfo.gameInfo.civilizations.filter { it != otherCiv }) civ.addNotification("[${otherCiv.civName}] has married into the ruling family of [${civInfo.civName}], bringing them under their control.", notificationLocation, NotificationCategory.Diplomacy, civInfo.civName, NotificationIcon.Diplomacy, otherCiv.civName) + for (unit in civInfo.units.getCivUnits()) unit.gift(otherCiv) + // Make sure this CS can never be liberated civInfo.gameInfo.getCities().filter { @@ -393,6 +398,7 @@ class CityStateFunctions(val civInfo: Civilization) { } for (city in civInfo.cities) { + city.espionage.removeAllPresentSpies(SpyFleeReason.CityTakenOverByMarriage) city.moveToCiv(otherCiv) city.isPuppet = true // Human players get a popup that allows them to annex instead } diff --git a/core/src/com/unciv/logic/trade/TradeLogic.kt b/core/src/com/unciv/logic/trade/TradeLogic.kt index d024e331c5..638fdca4b4 100644 --- a/core/src/com/unciv/logic/trade/TradeLogic.kt +++ b/core/src/com/unciv/logic/trade/TradeLogic.kt @@ -1,6 +1,7 @@ package com.unciv.logic.trade import com.unciv.Constants +import com.unciv.logic.city.managers.SpyFleeReason import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.PopupAlert @@ -106,6 +107,8 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil } TradeOfferType.City -> { val city = from.cities.first { it.id == offer.name } + + city.espionage.removeAllPresentSpies(SpyFleeReason.CityBought) city.moveToCiv(to) city.getCenterTile().getUnits().toList() .forEach { it.movement.teleportToClosestMoveableTile() }