From ea2234b9a2b0dd82d9d3a888035ff7d6d4cb99a1 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Wed, 14 Aug 2024 12:04:17 +0300 Subject: [PATCH] Added "don't spread religion to us" demand --- .../jsons/translations/template.properties | 13 +++++-- .../civilization/NextTurnAutomation.kt | 33 ++++++++++++++++- .../unciv/logic/civilization/PopupAlert.kt | 5 +++ .../diplomacy/DiplomacyManager.kt | 26 ++++++++++++++ .../diplomacy/DiplomacyTurnManager.kt | 4 +++ .../diplomacyscreen/MajorCivDiplomacyTable.kt | 35 +++++++++++++++---- .../ui/screens/worldscreen/AlertPopup.kt | 22 ++++++++++++ .../unit/actions/UnitActionsReligion.kt | 5 +++ 8 files changed, 134 insertions(+), 9 deletions(-) diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 0459664e1e..368f9f372d 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -186,6 +186,8 @@ Do you want to break your promise to [leaderName]? = Break promise = We promised not to settle near them ([count] turns remaining) = They promised not to settle near us ([count] turns remaining) = +We promised not to spread religion to them ([count] turns remaining) = +They promised not to spread religion to us ([count] turns remaining) = [civName] is upset that you demanded tribute from [cityState], whom they have pledged to protect! = [civName] is upset that you attacked [cityState], whom they have pledged to protect! = @@ -213,8 +215,13 @@ Demands = Please don't settle new cities near us. = Very well, we shall look for new lands to settle. = We shall do as we please. = -We noticed your new city near our borders, despite your promise. This will have....implications. = -I've been informed that my armies have taken tribute from [civName], a city-state under your protection.\nI assure you, this was quite unintentional, and I hope that this does not serve to drive us apart. = +We noticed your new city near our borders, despite your promise. This will have....implications. = + +Please don't spread your religion to us. = +Very well, we shall spread our faith elsewhere. = +We noticed you have continued spreading your faith, despite your promise. This will have...consequences. = + +I've been informed that my armies have taken tribute from [civName], a city-state under your protection.\nI assure you, this was quite unintentional, and I hope that this does not serve to drive us apart. = We asked [civName] for a tribute recently and they gave in.\nYou promised to protect them from such things, but we both know you cannot back that up. = It's come to my attention that I may have attacked [civName].\nWhile it was not my goal to be at odds with your empire, this was deemed a necessary course of action. = I thought you might like to know that I've launched an invasion of one of your little pet states.\nThe lands of [civName] will make a fine addition to my own. = @@ -1056,6 +1063,8 @@ One of our trades with [nation] has ended = One of our trades with [nation] has been cut short = [nation] agreed to stop settling cities near us! = [nation] refused to stop settling cities near us! = +[nation] agreed to stop spreading religion to us! = +[nation] refused to stop spreading religion to us! = We have allied with [nation]. = We have lost alliance with [nation]. = We have discovered [naturalWonder]! = diff --git a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt index 6d8517ebfe..3d0678b37b 100644 --- a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt @@ -105,6 +105,7 @@ object NextTurnAutomation { } private fun respondToPopupAlerts(civInfo: Civilization) { for (popupAlert in civInfo.popupAlerts.toList()) { // toList because this can trigger other things that give alerts, like Golden Age + if (popupAlert.type == AlertType.DemandToStopSettlingCitiesNear) { // we're called upon to make a decision val demandingCiv = civInfo.gameInfo.getCivilization(popupAlert.value) val diploManager = civInfo.getDiplomacyManager(demandingCiv)!! @@ -112,6 +113,16 @@ object NextTurnAutomation { diploManager.agreeNotToSettleNear() else diploManager.refuseDemandNotToSettleNear() } + + if (popupAlert.type == AlertType.DemandToStopSpreadingReligion) { + val demandingCiv = civInfo.gameInfo.getCivilization(popupAlert.value) + val diploManager = civInfo.getDiplomacyManager(demandingCiv)!! + if (Automation.threatAssessment(civInfo, demandingCiv) >= ThreatLevel.High + || diploManager.isRelationshipLevelGT(RelationshipLevel.Ally)) + diploManager.agreeNotToSpreadReligionTo() + else diploManager.refuseNotToSpreadReligionTo() + } + if (popupAlert.type == AlertType.DeclarationOfFriendship) { val requestingCiv = civInfo.gameInfo.getCivilization(popupAlert.value) val diploManager = civInfo.getDiplomacyManager(requestingCiv)!! @@ -123,7 +134,6 @@ object NextTurnAutomation { diploManager.otherCivDiplomacy().setFlag(DiplomacyFlags.DeclinedDeclarationOfFriendship, 10) requestingCiv.addNotification("[${civInfo.civName}] has denied our Declaration of Friendship!", NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, civInfo.civName) } - } } @@ -534,6 +544,8 @@ object NextTurnAutomation { val diploManager = civInfo.getDiplomacyManager(otherCiv)!! if (diploManager.hasFlag(DiplomacyFlags.SettledCitiesNearUs)) onCitySettledNearBorders(civInfo, otherCiv) + if (diploManager.hasFlag(DiplomacyFlags.SpreadReligionInOurCities)) + onReligionSpreadInOurCity(civInfo, otherCiv) } } @@ -557,6 +569,25 @@ object NextTurnAutomation { diplomacyManager.removeFlag(DiplomacyFlags.SettledCitiesNearUs) } + private fun onReligionSpreadInOurCity(civInfo: Civilization, otherCiv: Civilization){ + val diplomacyManager = civInfo.getDiplomacyManager(otherCiv)!! + when { + diplomacyManager.hasFlag(DiplomacyFlags.IgnoreThemSpreadingReligion) -> {} + diplomacyManager.hasFlag(DiplomacyFlags.AgreedToNotSpreadReligion) -> { + otherCiv.popupAlerts.add(PopupAlert(AlertType.ReligionSpreadDespiteOurPromise, civInfo.civName)) + diplomacyManager.setFlag(DiplomacyFlags.IgnoreThemSpreadingReligion, 100) + diplomacyManager.setModifier(DiplomaticModifiers.BetrayedPromiseToNotSpreadReligionToUs, -20f) + diplomacyManager.removeFlag(DiplomacyFlags.AgreedToNotSpreadReligion) + } + else -> { + val threatLevel = Automation.threatAssessment(civInfo, otherCiv) + if (threatLevel < ThreatLevel.High) // don't piss them off for no reason please. + otherCiv.popupAlerts.add(PopupAlert(AlertType.DemandToStopSpreadingReligion, civInfo.civName)) + } + } + diplomacyManager.removeFlag(DiplomacyFlags.SpreadReligionInOurCities) + } + fun getMinDistanceBetweenCities(civ1: Civilization, civ2: Civilization): Int { return getClosestCities(civ1, civ2)?.aerialDistance ?: Int.MAX_VALUE } diff --git a/core/src/com/unciv/logic/civilization/PopupAlert.kt b/core/src/com/unciv/logic/civilization/PopupAlert.kt index 7a943150e8..86ccefc16e 100644 --- a/core/src/com/unciv/logic/civilization/PopupAlert.kt +++ b/core/src/com/unciv/logic/civilization/PopupAlert.kt @@ -11,8 +11,13 @@ enum class AlertType : IsPartOfGameInfoSerialization { CityConquered, CityTraded, BorderConflict, + DemandToStopSettlingCitiesNear, CitySettledNearOtherCivDespiteOurPromise, + + DemandToStopSpreadingReligion, + ReligionSpreadDespiteOurPromise, + GoldenAge, DeclarationOfFriendship, StartIntro, diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 2927976c4e..f39d47d884 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -52,19 +52,27 @@ enum class DiplomacyFlags { DeclinedJoinWarOffer, ResearchAgreement, BorderConflict, + SettledCitiesNearUs, AgreedToNotSettleNearUs, IgnoreThemSettlingNearUs, + + SpreadReligionInOurCities, + AgreedToNotSpreadReligion, + IgnoreThemSpreadingReligion, + ProvideMilitaryUnit, MarriageCooldown, NotifiedAfraid, RecentlyPledgedProtection, RecentlyWithdrewProtection, AngerFreeIntrusion, + RememberDestroyedProtectedMinor, RememberAttackedProtectedMinor, RememberBulliedProtectedMinor, RememberSidedWithProtectedMinor, + Denunciation, WaryOf, Bullied, @@ -84,7 +92,9 @@ enum class DiplomaticModifiers(val text: String) { Denunciation("You have publicly denounced us!"), DenouncedOurAllies("You have denounced our allies"), RefusedToNotSettleCitiesNearUs("You refused to stop settling cities near us"), + RefusedToNotSpreadReligionToUs("You refused to stop spreading religion to us"), BetrayedPromiseToNotSettleCitiesNearUs("You betrayed your promise to not settle cities near us"), + BetrayedPromiseToNotSpreadReligionToUs("You betrayed your promise to not spread your religion to us"), UnacceptableDemands("Your arrogant demands are in bad taste"), UsedNuclearWeapons("Your use of nuclear weapons is disgusting!"), StealingTerritory("You have stolen our lands!"), @@ -106,6 +116,7 @@ enum class DiplomaticModifiers(val text: String) { DenouncedOurEnemies("You have denounced our enemies"), OpenBorders("Our open borders have brought us closer together."), FulfilledPromiseToNotSettleCitiesNearUs("You fulfilled your promise to stop settling cities near us!"), + FulfilledPromiseToNotSpreadReligion("You fulfilled your promise to stop spreading religion to us!"), GaveUsUnits("You gave us units!"), GaveUsGifts("We appreciate your gifts"), ReturnedCapturedUnits("You returned captured units to us"), @@ -679,6 +690,21 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization { NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, civInfo.civName) } + fun agreeNotToSpreadReligionTo() { + otherCivDiplomacy().setFlag(DiplomacyFlags.AgreedToNotSpreadReligion, 100) + addModifier(DiplomaticModifiers.UnacceptableDemands, -10f) + otherCiv().addNotification("[${civInfo.civName}] agreed to stop spreading religion to us!", + NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, civInfo.civName) + } + + fun refuseNotToSpreadReligionTo() { + addModifier(DiplomaticModifiers.UnacceptableDemands, -20f) + otherCivDiplomacy().setFlag(DiplomacyFlags.IgnoreThemSpreadingReligion, 100) + otherCivDiplomacy().addModifier(DiplomaticModifiers.RefusedToNotSpreadReligionToUs, -15f) + otherCiv().addNotification("[${civInfo.civName}] refused to stop spreading religion to us!", + NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, civInfo.civName) + } + fun sideWithCityState() { otherCivDiplomacy().setModifier(DiplomaticModifiers.SidedWithProtectedMinor, -5f) otherCivDiplomacy().setFlag(DiplomacyFlags.RememberSidedWithProtectedMinor, 25) diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyTurnManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyTurnManager.kt index a81338d77f..98364ba4fa 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyTurnManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyTurnManager.kt @@ -189,6 +189,9 @@ object DiplomacyTurnManager { DiplomacyFlags.AgreedToNotSettleNearUs.name -> { addModifier(DiplomaticModifiers.FulfilledPromiseToNotSettleCitiesNearUs, 10f) } + DiplomacyFlags.AgreedToNotSettleNearUs.name -> { + addModifier(DiplomaticModifiers.FulfilledPromiseToNotSpreadReligion, 10f) + } DiplomacyFlags.RecentlyAttacked.name -> { civInfo.cityStateFunctions.askForUnitGifts(otherCiv()) } @@ -282,6 +285,7 @@ object DiplomacyTurnManager { revertToZero(DiplomaticModifiers.BetrayedDefensivePact, 1 / 16f) // That's an outrageous thing to do revertToZero(DiplomaticModifiers.RefusedToNotSettleCitiesNearUs, 1 / 4f) revertToZero(DiplomaticModifiers.BetrayedPromiseToNotSettleCitiesNearUs, 1 / 8f) // That's a bastardly thing to do + revertToZero(DiplomaticModifiers.BetrayedPromiseToNotSpreadReligionToUs, 1 / 8f) revertToZero(DiplomaticModifiers.UnacceptableDemands, 1 / 4f) revertToZero(DiplomaticModifiers.StealingTerritory, 1 / 4f) revertToZero(DiplomaticModifiers.DenouncedOurAllies, 1 / 4f) diff --git a/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt b/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt index 26eb666c42..b1b7243786 100644 --- a/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt +++ b/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt @@ -175,16 +175,25 @@ class MajorCivDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) { ): Table? { val promisesTable = Table() - // Not for (flag in DiplomacyFlags.values()) - all other flags should result in DiplomaticModifiers or stay internal? - val flag = DiplomacyFlags.AgreedToNotSettleNearUs - if (otherCivDiplomacyManager.hasFlag(flag)) { + if (otherCivDiplomacyManager.hasFlag(DiplomacyFlags.AgreedToNotSettleNearUs)) { val text = - "We promised not to settle near them ([${otherCivDiplomacyManager.getFlag(flag)}] turns remaining)" + "We promised not to settle near them ([${otherCivDiplomacyManager.getFlag(DiplomacyFlags.AgreedToNotSettleNearUs)}] turns remaining)" promisesTable.add(text.toLabel(Color.LIGHT_GRAY)).row() } - if (diplomacyManager.hasFlag(flag)) { + if (diplomacyManager.hasFlag(DiplomacyFlags.AgreedToNotSettleNearUs)) { val text = - "They promised not to settle near us ([${diplomacyManager.getFlag(flag)}] turns remaining)" + "They promised not to settle near us ([${diplomacyManager.getFlag(DiplomacyFlags.AgreedToNotSettleNearUs)}] turns remaining)" + promisesTable.add(text.toLabel(Color.LIGHT_GRAY)).row() + } + + if (otherCivDiplomacyManager.hasFlag(DiplomacyFlags.AgreedToNotSpreadReligion)) { + val text = + "We promised not to spread religion to them ([${otherCivDiplomacyManager.getFlag(DiplomacyFlags.AgreedToNotSpreadReligion)}] turns remaining)" + promisesTable.add(text.toLabel(Color.LIGHT_GRAY)).row() + } + if (diplomacyManager.hasFlag(DiplomacyFlags.AgreedToNotSpreadReligion)) { + val text = + "They promised not to spread religion to us ([${diplomacyManager.getFlag(DiplomacyFlags.AgreedToNotSpreadReligion)}] turns remaining)" promisesTable.add(text.toLabel(Color.LIGHT_GRAY)).row() } @@ -228,6 +237,20 @@ class MajorCivDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) { } demandsTable.add(dontSettleCitiesButton).row() + val dontSpreadReligionButton = "Please don't spread your religion to us.".toTextButton() + if (otherCiv.popupAlerts.any { it.type == AlertType.DemandToStopSpreadingReligion && it.value == viewingCiv.civName }) + dontSettleCitiesButton.disable() + dontSettleCitiesButton.onClick { + otherCiv.popupAlerts.add( + PopupAlert( + AlertType.DemandToStopSpreadingReligion, + viewingCiv.civName + ) + ) + dontSpreadReligionButton.disable() + } + demandsTable.add(dontSpreadReligionButton).row() + demandsTable.add(Constants.close.toTextButton().onClick { diplomacyScreen.updateRightSide(otherCiv) }) return demandsTable } diff --git a/core/src/com/unciv/ui/screens/worldscreen/AlertPopup.kt b/core/src/com/unciv/ui/screens/worldscreen/AlertPopup.kt index f472124946..eaab9fdf50 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/AlertPopup.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/AlertPopup.kt @@ -92,6 +92,8 @@ class AlertPopup( AlertType.BorderConflict -> addBorderConflict() AlertType.DemandToStopSettlingCitiesNear -> addDemandToStopSettlingCitiesNear() AlertType.CitySettledNearOtherCivDespiteOurPromise -> addCitySettledNearOtherCivDespiteOurPromise() + AlertType.DemandToStopSpreadingReligion -> addDemandToStopSpreadingReligion() + AlertType.ReligionSpreadDespiteOurPromise -> addReligionSpreadDespiteOurPromise() AlertType.WonderBuilt -> addWonderBuilt() AlertType.TechResearched -> addTechResearched() AlertType.GoldenAge -> addGoldenAge() @@ -241,6 +243,26 @@ class AlertPopup( } } + private fun addDemandToStopSpreadingReligion() { + val otherciv = getCiv(popupAlert.value) + val playerDiploManager = viewingCiv.getDiplomacyManager(otherciv)!! + addLeaderName(otherciv) + addGoodSizedLabel("Please don't spread religion to us.").row() + addCloseButton("Very well, we shall spread our faith elsewhere.", KeyboardBinding.Confirm) { + playerDiploManager.agreeNotToSpreadReligionTo() + }.row() + addCloseButton("We shall do as we please.", KeyboardBinding.Cancel) { + playerDiploManager.refuseNotToSpreadReligionTo() + } + } + + private fun addReligionSpreadDespiteOurPromise() { + val otherciv = getCiv(popupAlert.value) + addLeaderName(otherciv) + addGoodSizedLabel("We noticed you have continued spreading your faith, despite your promise. This will have....consequences.").row() + addCloseButton("Very well.") + } + private fun addDiplomaticMarriage() { val city = getCity(popupAlert.value) addGoodSizedLabel(city.name.tr() + ": " + "What would you like to do with the city?".tr(), Constants.headingFontSize) // Add name because there might be several cities diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsReligion.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsReligion.kt index 8a597a3a0c..b86fe846ac 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsReligion.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsReligion.kt @@ -1,6 +1,7 @@ package com.unciv.ui.screens.worldscreen.unit.actions import com.unciv.logic.civilization.NotificationCategory +import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.tile.Tile import com.unciv.models.UnitAction @@ -101,6 +102,10 @@ object UnitActionsReligion { city.religion.removeAllPressuresExceptFor(unit.religion!!) UnitActionModifiers.activateSideEffects(unit, newStyleUnique) + + if (city.civ != unit.civ) city.civ.getDiplomacyManager(unit.civ)!! + .setFlag(DiplomacyFlags.SpreadReligionInOurCities, 30) + }.takeIf { unit.civ.religionManager.maySpreadReligionNow(unit) && UnitActionModifiers.canActivateSideEffects(unit, newStyleUnique)} ))