From f3129dc0af5bb46cf0d22a1fc151840f827dafc0 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Thu, 8 Aug 2024 12:37:24 +0300 Subject: [PATCH] Send speed for all trade offers, instead of using static - allows for 'next turn' without setting UncivGame.current --- .../DeclareWarTargetAutomation.kt | 6 ++-- .../civilization/DiplomacyAutomation.kt | 30 ++++++++++--------- .../city/managers/CityConquestFunctions.kt | 6 ++-- .../diplomacy/DiplomacyManager.kt | 4 +-- core/src/com/unciv/logic/trade/TradeLogic.kt | 21 ++++++------- core/src/com/unciv/logic/trade/TradeOffer.kt | 2 +- .../CityStateDiplomacyTable.kt | 11 ++----- .../diplomacyscreen/MajorCivDiplomacyTable.kt | 2 +- .../worldscreen/status/NextTurnButton.kt | 5 +--- 9 files changed, 40 insertions(+), 47 deletions(-) diff --git a/core/src/com/unciv/logic/automation/civilization/DeclareWarTargetAutomation.kt b/core/src/com/unciv/logic/automation/civilization/DeclareWarTargetAutomation.kt index 612e6b866e..925b953314 100644 --- a/core/src/com/unciv/logic/automation/civilization/DeclareWarTargetAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/DeclareWarTargetAutomation.kt @@ -60,8 +60,8 @@ object DeclareWarTargetAutomation { // Send them an offer val tradeLogic = TradeLogic(civInfo, thirdCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration, speed = civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration, speed = civInfo.gameInfo.speed)) thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) @@ -89,7 +89,7 @@ object DeclareWarTargetAutomation { // Send them an offer val tradeLogic = TradeLogic(civInfo, thirdCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration, speed = civInfo.gameInfo.speed)) // TODO: Maybe add in payment requests in some situations thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) diff --git a/core/src/com/unciv/logic/automation/civilization/DiplomacyAutomation.kt b/core/src/com/unciv/logic/automation/civilization/DiplomacyAutomation.kt index 5c454c0807..3ccaa6f175 100644 --- a/core/src/com/unciv/logic/automation/civilization/DiplomacyAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/DiplomacyAutomation.kt @@ -125,8 +125,8 @@ object DiplomacyAutomation { if ((1..10).random() < 7) continue if (wantsToOpenBorders(civInfo, otherCiv)) { val tradeLogic = TradeLogic(civInfo, otherCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement, speed = civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement, speed = civInfo.gameInfo.speed)) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) } else { @@ -168,8 +168,8 @@ object DiplomacyAutomation { if ((1..10).random() <= 5 * civInfo.getPersonality().modifierFocus(PersonalityValue.Science, .3f)) continue val tradeLogic = TradeLogic(civInfo, otherCiv) val cost = civInfo.diplomacyFunctions.getResearchAgreementCost(otherCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost, civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost, civInfo.gameInfo.speed)) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) } @@ -192,8 +192,8 @@ object DiplomacyAutomation { if (wantsToSignDefensivePact(civInfo, otherCiv)) { //todo: Add more in depth evaluation here val tradeLogic = TradeLogic(civInfo, otherCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) } else { @@ -293,17 +293,19 @@ object DiplomacyAutomation { internal fun offerPeaceTreaty(civInfo: Civilization) { if (!civInfo.isAtWar() || civInfo.cities.isEmpty() || civInfo.diplomacy.isEmpty()) return - val enemiesCiv = civInfo.diplomacy.filter { it.value.diplomaticStatus == DiplomaticStatus.War } + val enemiesCiv = civInfo.diplomacy.asSequence() + .filter { it.value.diplomaticStatus == DiplomaticStatus.War } .map { it.value.otherCiv() } .filterNot { it == civInfo || it.isBarbarian || it.cities.isEmpty() - || it.getDiplomacyManager(civInfo)!!.hasFlag(DiplomacyFlags.DeclaredWar) - || civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclaredWar) + || it.getDiplomacyManager(civInfo)!!.hasFlag(DiplomacyFlags.DeclaredWar) + || civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclaredWar) }.filter { !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedPeace) } // Don't allow AIs to offer peace to city states allied with their enemies .filterNot { it.isCityState && it.getAllyCiv() != null && civInfo.isAtWarWith(civInfo.gameInfo.getCivilization(it.getAllyCiv()!!)) } // ignore civs that we have already offered peace this turn as a counteroffer to another civ's peace offer .filter { it.tradeRequests.none { tradeRequest -> tradeRequest.requestingCiv == civInfo.civName && tradeRequest.trade.isPeaceTreaty() } } + .toList() for (enemy in enemiesCiv) { if (hasAtLeastMotivationToAttack(civInfo, enemy, 10f) >= 10) { @@ -319,8 +321,8 @@ object DiplomacyAutomation { // pay for peace val tradeLogic = TradeLogic(civInfo, enemy) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) if (enemy.isMajorCiv()) { var moneyWeNeedToPay = -TradeEvaluation().evaluatePeaceCostForThem(civInfo, enemy) @@ -330,13 +332,13 @@ object DiplomacyAutomation { moneyWeNeedToPay = civInfo.gold // As much as possible } tradeLogic.currentTrade.ourOffers.add( - TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyWeNeedToPay) + TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyWeNeedToPay, civInfo.gameInfo.speed) ) } else if (moneyWeNeedToPay < -100) { val moneyTheyNeedToPay = abs(moneyWeNeedToPay).coerceAtMost(enemy.gold) if (moneyTheyNeedToPay > 0) { tradeLogic.currentTrade.theirOffers.add( - TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyTheyNeedToPay) + TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyTheyNeedToPay, civInfo.gameInfo.speed) ) } } @@ -363,7 +365,7 @@ object DiplomacyAutomation { val tradeLogic = TradeLogic(civInfo, civToAsk) // TODO: add gold offer here - tradeLogic.currentTrade.theirOffers.add(TradeOffer(enemyCiv.civName, TradeOfferType.WarDeclaration)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(enemyCiv.civName, TradeOfferType.WarDeclaration, speed = civInfo.gameInfo.speed)) civToAsk.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) } } diff --git a/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt b/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt index 3c4734a281..3f66854ce4 100644 --- a/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/managers/CityConquestFunctions.kt @@ -224,15 +224,15 @@ class CityConquestFunctions(val city: City) { foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv) .addModifier(DiplomaticModifiers.CapturedOurCities, respectForLiberatingOurCity) val openBordersTrade = TradeLogic(foundingCiv, conqueringCiv) - openBordersTrade.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement)) + openBordersTrade.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement, speed = conqueringCiv.gameInfo.speed)) openBordersTrade.acceptTrade(false) } else { //Liberating a city state gives a large amount of influence, and peace foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv).setInfluence(90f) if (foundingCiv.isAtWarWith(conqueringCiv)) { val tradeLogic = TradeLogic(foundingCiv, conqueringCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = conqueringCiv.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = conqueringCiv.gameInfo.speed)) tradeLogic.acceptTrade(false) } } diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 98db14b0dc..2927976c4e 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -482,8 +482,8 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization { // Make the peace treaty so that the civ can't declare war immedietly val tradeLogic = TradeLogic(thirdCiv, otherCiv) - tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) - tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) + tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) + tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) thirdCivDiplo.trades.add(tradeLogic.currentTrade) thirdCivDiplo.otherCivDiplomacy().trades.add(tradeLogic.currentTrade.reverse()) } diff --git a/core/src/com/unciv/logic/trade/TradeLogic.kt b/core/src/com/unciv/logic/trade/TradeLogic.kt index 92ca769d49..d024e331c5 100644 --- a/core/src/com/unciv/logic/trade/TradeLogic.kt +++ b/core/src/com/unciv/logic/trade/TradeLogic.kt @@ -21,20 +21,21 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil val offers = TradeOffersList() if (civInfo.isCityState && otherCivilization.isCityState) return offers if (civInfo.isAtWarWith(otherCivilization)) - offers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)) + offers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) if (!otherCivilization.getDiplomacyManager(civInfo)!!.hasOpenBorders && !otherCivilization.isCityState && civInfo.hasUnique(UniqueType.EnablesOpenBorders) && otherCivilization.hasUnique(UniqueType.EnablesOpenBorders)) { - offers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement)) + offers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement, speed = civInfo.gameInfo.speed)) } if (civInfo.diplomacyFunctions.canSignResearchAgreementNoCostWith(otherCivilization)) - offers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, civInfo.diplomacyFunctions.getResearchAgreementCost(otherCivilization))) + offers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, + civInfo.diplomacyFunctions.getResearchAgreementCost(otherCivilization), civInfo.gameInfo.speed)) if (civInfo.diplomacyFunctions.canSignDefensivePactWith(otherCivilization)) - offers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty)) + offers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty, speed = civInfo.gameInfo.speed)) for (entry in civInfo.getCivResourcesWithOriginsForTrade() .filterNot { it.resource.resourceType == ResourceType.Bonus } @@ -42,17 +43,17 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil ) { val resourceTradeOfferType = if (entry.resource.resourceType == ResourceType.Luxury) TradeOfferType.Luxury_Resource else TradeOfferType.Strategic_Resource - offers.add(TradeOffer(entry.resource.name, resourceTradeOfferType, entry.amount)) + offers.add(TradeOffer(entry.resource.name, resourceTradeOfferType, entry.amount, speed = civInfo.gameInfo.speed)) } - offers.add(TradeOffer("Gold", TradeOfferType.Gold, civInfo.gold)) - offers.add(TradeOffer("Gold per turn", TradeOfferType.Gold_Per_Turn, civInfo.stats.statsForNextTurn.gold.toInt())) + offers.add(TradeOffer("Gold", TradeOfferType.Gold, civInfo.gold, speed = civInfo.gameInfo.speed)) + offers.add(TradeOffer("Gold per turn", TradeOfferType.Gold_Per_Turn, civInfo.stats.statsForNextTurn.gold.toInt(), civInfo.gameInfo.speed)) if (!civInfo.isOneCityChallenger() && !otherCivilization.isOneCityChallenger() && !civInfo.isCityState && !otherCivilization.isCityState ) { for (city in civInfo.cities.filterNot { it.isCapital() || it.isInResistance() }) - offers.add(TradeOffer(city.id, TradeOfferType.City)) + offers.add(TradeOffer(city.id, TradeOfferType.City, speed = civInfo.gameInfo.speed)) } val otherCivsWeKnow = civInfo.getKnownCivs() @@ -62,7 +63,7 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil val civsWeKnowAndTheyDont = otherCivsWeKnow .filter { !otherCivilization.diplomacy.containsKey(it.civName) && !it.isDefeated() } for (thirdCiv in civsWeKnowAndTheyDont) { - offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.Introduction)) + offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.Introduction, speed = civInfo.gameInfo.speed)) } } @@ -73,7 +74,7 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil val civsWeArentAtWarWith = civsWeBothKnow .filter { civInfo.getDiplomacyManager(it)!!.canDeclareWar() } for (thirdCiv in civsWeArentAtWarWith) { - offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.WarDeclaration)) + offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.WarDeclaration, speed = civInfo.gameInfo.speed)) } } diff --git a/core/src/com/unciv/logic/trade/TradeOffer.kt b/core/src/com/unciv/logic/trade/TradeOffer.kt index 2d1e478179..a12a3f3336 100644 --- a/core/src/com/unciv/logic/trade/TradeOffer.kt +++ b/core/src/com/unciv/logic/trade/TradeOffer.kt @@ -14,7 +14,7 @@ data class TradeOffer(val name: String, val type: TradeOfferType, var amount: In name: String, type: TradeOfferType, amount: Int = 1, - speed: Speed = UncivGame.Current.gameInfo!!.speed + speed: Speed ) : this(name, type, amount, duration = -1) { duration = when { type.isImmediate -> -1 // -1 for offers that are immediate (e.g. gold transfer) diff --git a/core/src/com/unciv/ui/screens/diplomacyscreen/CityStateDiplomacyTable.kt b/core/src/com/unciv/ui/screens/diplomacyscreen/CityStateDiplomacyTable.kt index ebda3255c0..78f6c5fd07 100644 --- a/core/src/com/unciv/ui/screens/diplomacyscreen/CityStateDiplomacyTable.kt +++ b/core/src/com/unciv/ui/screens/diplomacyscreen/CityStateDiplomacyTable.kt @@ -32,7 +32,6 @@ import com.unciv.ui.components.input.onClick import com.unciv.ui.components.widgets.ColorMarkupLabel import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.ConfirmPopup -import kotlin.reflect.typeOf class CityStateDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) { val viewingCiv = diplomacyScreen.viewingCiv @@ -250,16 +249,10 @@ class CityStateDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) { ) { val tradeLogic = TradeLogic(viewingCiv, otherCiv) tradeLogic.currentTrade.ourOffers.add( - TradeOffer( - Constants.peaceTreaty, - TradeOfferType.Treaty - ) + TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = viewingCiv.gameInfo.speed) ) tradeLogic.currentTrade.theirOffers.add( - TradeOffer( - Constants.peaceTreaty, - TradeOfferType.Treaty - ) + TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = viewingCiv.gameInfo.speed) ) tradeLogic.acceptTrade() diplomacyScreen.updateLeftSideTable(otherCiv) diff --git a/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt b/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt index a69e23aa08..26eb666c42 100644 --- a/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt +++ b/core/src/com/unciv/ui/screens/diplomacyscreen/MajorCivDiplomacyTable.kt @@ -106,7 +106,7 @@ class MajorCivDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) { val negotiatePeaceButton = "Negotiate Peace".toTextButton() negotiatePeaceButton.onClick { val tradeTable = diplomacyScreen.setTrade(otherCiv) - val peaceTreaty = TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty) + val peaceTreaty = TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, speed = viewingCiv.gameInfo.speed) tradeTable.tradeLogic.currentTrade.theirOffers.add(peaceTreaty) tradeTable.tradeLogic.currentTrade.ourOffers.add(peaceTreaty) tradeTable.offerColumnsTable.update() diff --git a/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt b/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt index e87021fbdc..900c668935 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt @@ -1,6 +1,5 @@ package com.unciv.ui.screens.worldscreen.status -import com.unciv.GUI import com.unciv.logic.civilization.managers.TurnManager import com.unciv.models.translations.tr import com.unciv.ui.components.UncivTooltip.Companion.addTooltip @@ -14,14 +13,12 @@ import com.unciv.ui.images.IconTextButton import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.hasOpenPopups import com.unciv.ui.screens.worldscreen.WorldScreen -import com.unciv.utils.Concurrency class NextTurnButton( private val worldScreen: WorldScreen ) : IconTextButton("", null, 30) { private var nextTurnAction = NextTurnAction.Default init { -// label.setFontSize(30) labelCell.pad(10f) onActivation { nextTurnAction.action(worldScreen) } onRightClick { NextTurnMenu(stage, this, this, worldScreen) } @@ -62,5 +59,5 @@ class NextTurnButton( private fun getNextTurnAction(worldScreen: WorldScreen) = // Guaranteed to return a non-null NextTurnAction because the last isChoice always returns true - NextTurnAction.values().first { it.isChoice(worldScreen) } + NextTurnAction.entries.first { it.isChoice(worldScreen) } }