diff --git a/android/assets/jsons/Translations/Diplomacy,Trade,Nations.json b/android/assets/jsons/Translations/Diplomacy,Trade,Nations.json index f24afc55e8..9edc483d90 100644 --- a/android/assets/jsons/Translations/Diplomacy,Trade,Nations.json +++ b/android/assets/jsons/Translations/Diplomacy,Trade,Nations.json @@ -184,7 +184,7 @@ Simplified_Chinese:"我们遇到了城邦--[name]!" Russian:"Мы обнаружили город-государство [name]!" } - + // Friendship declaration flavor texts "Declare Friendship ([numberOfTurns] turns)":{ Italian:"Dichiarazione di Amicizia ([numberOfTurns] turni)" diff --git a/android/build.gradle b/android/build.gradle index 873d6946ca..dac08e9c7e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.app" minSdkVersion 14 targetSdkVersion 29 - versionCode 295 - versionName "3.0.2" + versionCode 296 + versionName "3.0.3" } // Had to add this crap for Travis to build, it wanted to sign the app diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 0f9e476376..b02eb5c2a3 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -12,6 +12,7 @@ import com.unciv.logic.civilization.diplomacy.DiplomacyManager import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo +import com.unciv.logic.trade.TradeEvaluation import com.unciv.logic.trade.TradeRequest import com.unciv.models.gamebasics.* import com.unciv.models.gamebasics.tech.TechEra @@ -56,6 +57,8 @@ class CivilizationInfo { var diplomacy = HashMap() var notifications = ArrayList() val popupAlerts = ArrayList() + + //** for trades here, ourOffers is the current civ's offers, and theirOffers is what the requesting civ offers */ val tradeRequests = ArrayList() // if we only use lists, and change the list each time the cities are changed, @@ -332,6 +335,14 @@ class CivilizationInfo { for (city in cities) city.startTurn() getCivUnits().toList().forEach { it.startTurn() } + + for(tradeRequest in tradeRequests.toList()) { // remove trade requests where one of the sides can no longer supply + val offeringCiv = gameInfo.getCivilization(tradeRequest.requestingCiv) + if (offeringCiv.isDefeated() || !TradeEvaluation().isTradeValid(tradeRequest.trade,this, offeringCiv)) { + tradeRequests.remove(tradeRequest) + offeringCiv.addNotification("Our proposed trade is no longer relevant!", Color.GOLD) + } + } } fun endTurn() { diff --git a/core/src/com/unciv/logic/trade/TradeEvaluation.kt b/core/src/com/unciv/logic/trade/TradeEvaluation.kt index 7e3f3d4ccc..f9b7aaffc8 100644 --- a/core/src/com/unciv/logic/trade/TradeEvaluation.kt +++ b/core/src/com/unciv/logic/trade/TradeEvaluation.kt @@ -11,6 +11,38 @@ import kotlin.math.min import kotlin.math.sqrt class TradeEvaluation{ + + fun isTradeValid(trade:Trade, offerer:CivilizationInfo, tradePartner: CivilizationInfo): Boolean { + for(offer in trade.ourOffers) + if(!isOfferValid(offer,offerer)) + return false + for(offer in trade.theirOffers) + if(!isOfferValid(offer,tradePartner)) + return false + return true + } + + private fun isOfferValid(tradeOffer: TradeOffer, offerer:CivilizationInfo): Boolean { + + fun hasResource(tradeOffer: TradeOffer): Boolean { + val resourcesByName = offerer.getCivResourcesByName() + return resourcesByName.containsKey(tradeOffer.name) && resourcesByName[tradeOffer.name]!! >= tradeOffer.amount + } + + when(tradeOffer.type){ + TradeType.Gold -> return true // even if they go negative it's okay + TradeType.Gold_Per_Turn -> return true // even if they go negative it's okay + TradeType.Treaty -> return true + TradeType.Agreement -> return true + TradeType.Luxury_Resource -> return hasResource(tradeOffer) + TradeType.Strategic_Resource -> return hasResource(tradeOffer) + TradeType.Technology -> return true + TradeType.Introduction -> return true + TradeType.WarDeclaration -> return true + TradeType.City -> return offerer.cities.any { it.name==tradeOffer.name } + } + } + fun isTradeAcceptable(trade: Trade, evaluator: CivilizationInfo, tradePartner: CivilizationInfo): Boolean { var sumOfTheirOffers = trade.theirOffers.asSequence() .filter { it.type!= TradeType.Treaty } // since treaties should only be evaluated once for 2 sides