naming: TradeType -> TradeOfferType

This commit is contained in:
yairm210
2024-06-27 23:18:16 +03:00
parent 432f2fad89
commit c9bcf10f2a
19 changed files with 155 additions and 155 deletions

View File

@ -6,7 +6,7 @@ import com.unciv.logic.civilization.diplomacy.RelationshipLevel
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeRequest import com.unciv.logic.trade.TradeRequest
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.ui.screens.victoryscreen.RankingType import com.unciv.ui.screens.victoryscreen.RankingType
object DeclareWarTargetAutomation { object DeclareWarTargetAutomation {
@ -60,8 +60,8 @@ object DeclareWarTargetAutomation {
// Send them an offer // Send them an offer
val tradeLogic = TradeLogic(civInfo, thirdCiv) val tradeLogic = TradeLogic(civInfo, thirdCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeType.WarDeclaration)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(target.civName, TradeType.WarDeclaration)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration))
thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))
@ -89,7 +89,7 @@ object DeclareWarTargetAutomation {
// Send them an offer // Send them an offer
val tradeLogic = TradeLogic(civInfo, thirdCiv) val tradeLogic = TradeLogic(civInfo, thirdCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeType.WarDeclaration)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(target.civName, TradeOfferType.WarDeclaration))
// TODO: Maybe add in payment requests in some situations // TODO: Maybe add in payment requests in some situations
thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) thirdCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))

View File

@ -15,7 +15,7 @@ import com.unciv.logic.trade.TradeEvaluation
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeRequest import com.unciv.logic.trade.TradeRequest
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.nation.PersonalityValue import com.unciv.models.ruleset.nation.PersonalityValue
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
@ -125,8 +125,8 @@ object DiplomacyAutomation {
if ((1..10).random() < 7) continue if ((1..10).random() < 7) continue
if (wantsToOpenBorders(civInfo, otherCiv)) { if (wantsToOpenBorders(civInfo, otherCiv)) {
val tradeLogic = TradeLogic(civInfo, otherCiv) val tradeLogic = TradeLogic(civInfo, otherCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeType.Agreement)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.openBorders, TradeType.Agreement)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement))
otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))
} else { } else {
@ -168,8 +168,8 @@ object DiplomacyAutomation {
if ((1..10).random() <= 5 * civInfo.getPersonality().modifierFocus(PersonalityValue.Science, .3f)) continue if ((1..10).random() <= 5 * civInfo.getPersonality().modifierFocus(PersonalityValue.Science, .3f)) continue
val tradeLogic = TradeLogic(civInfo, otherCiv) val tradeLogic = TradeLogic(civInfo, otherCiv)
val cost = civInfo.diplomacyFunctions.getResearchAgreementCost(otherCiv) val cost = civInfo.diplomacyFunctions.getResearchAgreementCost(otherCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.researchAgreement, TradeType.Treaty, cost)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.researchAgreement, TradeType.Treaty, cost)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, cost))
otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))
} }
@ -192,8 +192,8 @@ object DiplomacyAutomation {
if (wantsToSignDefensivePact(civInfo, otherCiv)) { if (wantsToSignDefensivePact(civInfo, otherCiv)) {
//todo: Add more in depth evaluation here //todo: Add more in depth evaluation here
val tradeLogic = TradeLogic(civInfo, otherCiv) val tradeLogic = TradeLogic(civInfo, otherCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.defensivePact, TradeType.Treaty)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.defensivePact, TradeType.Treaty)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty))
otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) otherCiv.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))
} else { } else {
@ -319,8 +319,8 @@ object DiplomacyAutomation {
// pay for peace // pay for peace
val tradeLogic = TradeLogic(civInfo, enemy) val tradeLogic = TradeLogic(civInfo, enemy)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
if (enemy.isMajorCiv()) { if (enemy.isMajorCiv()) {
var moneyWeNeedToPay = -TradeEvaluation().evaluatePeaceCostForThem(civInfo, enemy) var moneyWeNeedToPay = -TradeEvaluation().evaluatePeaceCostForThem(civInfo, enemy)
@ -330,13 +330,13 @@ object DiplomacyAutomation {
moneyWeNeedToPay = civInfo.gold // As much as possible moneyWeNeedToPay = civInfo.gold // As much as possible
} }
tradeLogic.currentTrade.ourOffers.add( tradeLogic.currentTrade.ourOffers.add(
TradeOffer("Gold".tr(), TradeType.Gold, moneyWeNeedToPay) TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyWeNeedToPay)
) )
} else if (moneyWeNeedToPay < -100) { } else if (moneyWeNeedToPay < -100) {
val moneyTheyNeedToPay = abs(moneyWeNeedToPay).coerceAtMost(enemy.gold) val moneyTheyNeedToPay = abs(moneyWeNeedToPay).coerceAtMost(enemy.gold)
if (moneyTheyNeedToPay > 0) { if (moneyTheyNeedToPay > 0) {
tradeLogic.currentTrade.theirOffers.add( tradeLogic.currentTrade.theirOffers.add(
TradeOffer("Gold".tr(), TradeType.Gold, moneyTheyNeedToPay) TradeOffer("Gold".tr(), TradeOfferType.Gold, moneyTheyNeedToPay)
) )
} }
} }
@ -362,7 +362,7 @@ object DiplomacyAutomation {
val tradeLogic = TradeLogic(civInfo, civToAsk) val tradeLogic = TradeLogic(civInfo, civToAsk)
// TODO: add gold offer here // TODO: add gold offer here
tradeLogic.currentTrade.theirOffers.add(TradeOffer(enemyCiv.civName, TradeType.WarDeclaration)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(enemyCiv.civName, TradeOfferType.WarDeclaration))
civToAsk.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse())) civToAsk.tradeRequests.add(TradeRequest(civInfo.civName, tradeLogic.currentTrade.reverse()))
} }
} }

View File

@ -11,7 +11,7 @@ import com.unciv.logic.trade.TradeEvaluation
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeRequest import com.unciv.logic.trade.TradeRequest
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import kotlin.math.min import kotlin.math.min
object TradeAutomation { object TradeAutomation {
@ -67,17 +67,17 @@ object TradeAutomation {
val counterofferGifts = ArrayList<TradeOffer>() val counterofferGifts = ArrayList<TradeOffer>()
for (offer in tradeLogic.theirAvailableOffers) { for (offer in tradeLogic.theirAvailableOffers) {
if ((offer.type == TradeType.Gold || offer.type == TradeType.Gold_Per_Turn) if ((offer.type == TradeOfferType.Gold || offer.type == TradeOfferType.Gold_Per_Turn)
&& tradeRequest.trade.ourOffers.any { it.type == offer.type }) && tradeRequest.trade.ourOffers.any { it.type == offer.type })
continue // Don't want to counteroffer straight gold for gold, that's silly continue // Don't want to counteroffer straight gold for gold, that's silly
if (!offer.isTradable()) if (!offer.isTradable())
continue // For example resources gained by trade or CS continue // For example resources gained by trade or CS
if (offer.type == TradeType.City) if (offer.type == TradeOfferType.City)
continue // Players generally don't want to give up their cities, and they might misclick continue // Players generally don't want to give up their cities, and they might misclick
if (tradeLogic.currentTrade.theirOffers.any { it.type == offer.type && it.name == offer.name }) if (tradeLogic.currentTrade.theirOffers.any { it.type == offer.type && it.name == offer.name })
continue // So you don't get double offers of open borders declarations of war etc. continue // So you don't get double offers of open borders declarations of war etc.
if (offer.type == TradeType.Treaty) if (offer.type == TradeOfferType.Treaty)
continue // Don't try to counter with a defensive pact or research pact continue // Don't try to counter with a defensive pact or research pact
val value = evaluation.evaluateBuyCostWithInflation(offer, civInfo, otherCiv, tradeRequest.trade) val value = evaluation.evaluateBuyCostWithInflation(offer, civInfo, otherCiv, tradeRequest.trade)
@ -105,7 +105,7 @@ object TradeAutomation {
} }
// Only ask for enough of each resource to get maximum price // Only ask for enough of each resource to get maximum price
for (ask in counterofferAsks.keys.filter { it.type == TradeType.Luxury_Resource || it.type == TradeType.Strategic_Resource }) { for (ask in counterofferAsks.keys.filter { it.type == TradeOfferType.Luxury_Resource || it.type == TradeOfferType.Strategic_Resource }) {
// Remove 1 amount as long as doing so does not change the price // Remove 1 amount as long as doing so does not change the price
val originalValue = counterofferAsks[ask]!! val originalValue = counterofferAsks[ask]!!
while (ask.amount > 1 while (ask.amount > 1
@ -119,7 +119,7 @@ object TradeAutomation {
// Adjust any gold asked for // Adjust any gold asked for
val toRemove = ArrayList<TradeOffer>() val toRemove = ArrayList<TradeOffer>()
for (goldAsk in counterofferAsks.keys for (goldAsk in counterofferAsks.keys
.filter { it.type == TradeType.Gold_Per_Turn || it.type == TradeType.Gold } .filter { it.type == TradeOfferType.Gold_Per_Turn || it.type == TradeOfferType.Gold }
.sortedByDescending { it.type.ordinal }) { // Do GPT first .sortedByDescending { it.type.ordinal }) { // Do GPT first
val valueOfOne = evaluation.evaluateBuyCostWithInflation(TradeOffer(goldAsk.name, goldAsk.type, 1, goldAsk.duration), civInfo, otherCiv, tradeRequest.trade) val valueOfOne = evaluation.evaluateBuyCostWithInflation(TradeOffer(goldAsk.name, goldAsk.type, 1, goldAsk.duration), civInfo, otherCiv, tradeRequest.trade)
val amountCanBeRemoved = deltaInOurFavor / valueOfOne val amountCanBeRemoved = deltaInOurFavor / valueOfOne
@ -137,7 +137,7 @@ object TradeAutomation {
deltaInOurFavor = (deltaInOurFavor * 2) / 3 // Only compensate some of it though, they're the ones asking us deltaInOurFavor = (deltaInOurFavor * 2) / 3 // Only compensate some of it though, they're the ones asking us
// First give some GPT, then lump sum - but only if they're not already offering the same // First give some GPT, then lump sum - but only if they're not already offering the same
for (ourGold in tradeLogic.ourAvailableOffers for (ourGold in tradeLogic.ourAvailableOffers
.filter { it.isTradable() && (it.type == TradeType.Gold || it.type == TradeType.Gold_Per_Turn) } .filter { it.isTradable() && (it.type == TradeOfferType.Gold || it.type == TradeOfferType.Gold_Per_Turn) }
.sortedByDescending { it.type.ordinal }) { .sortedByDescending { it.type.ordinal }) {
if (tradeLogic.currentTrade.theirOffers.none { it.type == ourGold.type } && if (tradeLogic.currentTrade.theirOffers.none { it.type == ourGold.type } &&
counterofferAsks.keys.none { it.type == ourGold.type } ) { counterofferAsks.keys.none { it.type == ourGold.type } ) {
@ -196,18 +196,18 @@ object TradeAutomation {
private fun potentialLuxuryTrades(civInfo: Civilization, otherCivInfo: Civilization): ArrayList<Trade> { private fun potentialLuxuryTrades(civInfo: Civilization, otherCivInfo: Civilization): ArrayList<Trade> {
val tradeLogic = TradeLogic(civInfo, otherCivInfo) val tradeLogic = TradeLogic(civInfo, otherCivInfo)
val ourTradableLuxuryResources = tradeLogic.ourAvailableOffers val ourTradableLuxuryResources = tradeLogic.ourAvailableOffers
.filter { it.type == TradeType.Luxury_Resource && it.amount > 1 } .filter { it.type == TradeOfferType.Luxury_Resource && it.amount > 1 }
val theirTradableLuxuryResources = tradeLogic.theirAvailableOffers val theirTradableLuxuryResources = tradeLogic.theirAvailableOffers
.filter { it.type == TradeType.Luxury_Resource && it.amount > 1 } .filter { it.type == TradeOfferType.Luxury_Resource && it.amount > 1 }
val weHaveTheyDont = ourTradableLuxuryResources val weHaveTheyDont = ourTradableLuxuryResources
.filter { resource -> .filter { resource ->
tradeLogic.theirAvailableOffers tradeLogic.theirAvailableOffers
.none { it.name == resource.name && it.type == TradeType.Luxury_Resource } .none { it.name == resource.name && it.type == TradeOfferType.Luxury_Resource }
} }
val theyHaveWeDont = theirTradableLuxuryResources val theyHaveWeDont = theirTradableLuxuryResources
.filter { resource -> .filter { resource ->
tradeLogic.ourAvailableOffers tradeLogic.ourAvailableOffers
.none { it.name == resource.name && it.type == TradeType.Luxury_Resource } .none { it.name == resource.name && it.type == TradeOfferType.Luxury_Resource }
}.sortedBy { civInfo.cities.count { city -> city.demandedResource == it.name } } // Prioritize resources that get WLTKD }.sortedBy { civInfo.cities.count { city -> city.demandedResource == it.name } } // Prioritize resources that get WLTKD
val trades = ArrayList<Trade>() val trades = ArrayList<Trade>()
for (i in 0..min(weHaveTheyDont.lastIndex, theyHaveWeDont.lastIndex)) { for (i in 0..min(weHaveTheyDont.lastIndex, theyHaveWeDont.lastIndex)) {

View File

@ -12,7 +12,7 @@ import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
@ -222,15 +222,15 @@ class CityConquestFunctions(val city: City) {
foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv) foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv)
.addModifier(DiplomaticModifiers.CapturedOurCities, respectForLiberatingOurCity) .addModifier(DiplomaticModifiers.CapturedOurCities, respectForLiberatingOurCity)
val openBordersTrade = TradeLogic(foundingCiv, conqueringCiv) val openBordersTrade = TradeLogic(foundingCiv, conqueringCiv)
openBordersTrade.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeType.Agreement)) openBordersTrade.currentTrade.ourOffers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement))
openBordersTrade.acceptTrade(false) openBordersTrade.acceptTrade(false)
} else { } else {
//Liberating a city state gives a large amount of influence, and peace //Liberating a city state gives a large amount of influence, and peace
foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv).setInfluence(90f) foundingCiv.getDiplomacyManagerOrMeet(conqueringCiv).setInfluence(90f)
if (foundingCiv.isAtWarWith(conqueringCiv)) { if (foundingCiv.isAtWarWith(conqueringCiv)) {
val tradeLogic = TradeLogic(foundingCiv, conqueringCiv) val tradeLogic = TradeLogic(foundingCiv, conqueringCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
tradeLogic.acceptTrade(false) tradeLogic.acceptTrade(false)
} }
} }

View File

@ -10,7 +10,7 @@ import com.unciv.logic.trade.Trade
import com.unciv.logic.trade.TradeEvaluation import com.unciv.logic.trade.TradeEvaluation
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.tile.ResourceSupplyList import com.unciv.models.ruleset.tile.ResourceSupplyList
import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueTriggerActivation
@ -401,9 +401,9 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization {
fun goldPerTurn(): Int { fun goldPerTurn(): Int {
var goldPerTurnForUs = 0 var goldPerTurnForUs = 0
for (trade in trades) { for (trade in trades) {
for (offer in trade.ourOffers.filter { it.type == TradeType.Gold_Per_Turn }) for (offer in trade.ourOffers.filter { it.type == TradeOfferType.Gold_Per_Turn })
goldPerTurnForUs -= offer.amount goldPerTurnForUs -= offer.amount
for (offer in trade.theirOffers.filter { it.type == TradeType.Gold_Per_Turn }) for (offer in trade.theirOffers.filter { it.type == TradeOfferType.Gold_Per_Turn })
goldPerTurnForUs += offer.amount goldPerTurnForUs += offer.amount
} }
return goldPerTurnForUs return goldPerTurnForUs
@ -414,7 +414,7 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization {
val newResourceSupplyList = ResourceSupplyList() val newResourceSupplyList = ResourceSupplyList()
val resourcesMap = civInfo.gameInfo.ruleset.tileResources val resourcesMap = civInfo.gameInfo.ruleset.tileResources
val isResourceFilter: (TradeOffer) -> Boolean = { val isResourceFilter: (TradeOffer) -> Boolean = {
(it.type == TradeType.Strategic_Resource || it.type == TradeType.Luxury_Resource) (it.type == TradeOfferType.Strategic_Resource || it.type == TradeOfferType.Luxury_Resource)
&& resourcesMap.containsKey(it.name) && resourcesMap.containsKey(it.name)
&& !resourcesMap[it.name]!!.isStockpiled() && !resourcesMap[it.name]!!.isStockpiled()
} }
@ -478,8 +478,8 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization {
// Make the peace treaty so that the civ can't declare war immedietly // Make the peace treaty so that the civ can't declare war immedietly
val tradeLogic = TradeLogic(thirdCiv, otherCiv) val tradeLogic = TradeLogic(thirdCiv, otherCiv)
tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.ourOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) tradeLogic.currentTrade.theirOffers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
thirdCivDiplo.trades.add(tradeLogic.currentTrade) thirdCivDiplo.trades.add(tradeLogic.currentTrade)
thirdCivDiplo.otherCivDiplomacy().trades.add(tradeLogic.currentTrade.reverse()) thirdCivDiplo.otherCivDiplomacy().trades.add(tradeLogic.currentTrade.reverse())
} }

View File

@ -6,7 +6,7 @@ import com.unciv.logic.civilization.NotificationCategory
import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.trade.Trade import com.unciv.logic.trade.Trade
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.components.extensions.toPercent import com.unciv.ui.components.extensions.toPercent
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@ -34,7 +34,7 @@ object DiplomacyTurnManager {
.filter { it.amount < 0 && !it.resource.isStockpiled() }.map { it.resource.name } .filter { it.amount < 0 && !it.resource.isStockpiled() }.map { it.resource.name }
for (offer in trade.ourOffers) { for (offer in trade.ourOffers) {
if (offer.type in listOf(TradeType.Luxury_Resource, TradeType.Strategic_Resource) if (offer.type in listOf(TradeOfferType.Luxury_Resource, TradeOfferType.Strategic_Resource)
&& (offer.name in negativeCivResources || !civInfo.gameInfo.ruleset.tileResources.containsKey(offer.name)) && (offer.name in negativeCivResources || !civInfo.gameInfo.ruleset.tileResources.containsKey(offer.name))
) { ) {
@ -64,10 +64,10 @@ object DiplomacyTurnManager {
private fun DiplomacyManager.remakePeaceTreaty(durationLeft: Int) { private fun DiplomacyManager.remakePeaceTreaty(durationLeft: Int) {
val treaty = Trade() val treaty = Trade()
treaty.ourOffers.add( treaty.ourOffers.add(
TradeOffer(Constants.peaceTreaty, TradeType.Treaty, duration = durationLeft) TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, duration = durationLeft)
) )
treaty.theirOffers.add( treaty.theirOffers.add(
TradeOffer(Constants.peaceTreaty, TradeType.Treaty, duration = durationLeft) TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty, duration = durationLeft)
) )
trades.add(treaty) trades.add(treaty)
otherCiv().getDiplomacyManager(civInfo)!!.trades.add(treaty) otherCiv().getDiplomacyManager(civInfo)!!.trades.add(treaty)
@ -242,7 +242,7 @@ object DiplomacyTurnManager {
civInfo.updateStatsForNextTurn() // if they were bringing us gold per turn civInfo.updateStatsForNextTurn() // if they were bringing us gold per turn
if (trade.theirOffers.union(trade.ourOffers) // if resources were involved if (trade.theirOffers.union(trade.ourOffers) // if resources were involved
.any { it.type == TradeType.Luxury_Resource || it.type == TradeType.Strategic_Resource }) .any { it.type == TradeOfferType.Luxury_Resource || it.type == TradeOfferType.Strategic_Resource })
civInfo.cache.updateCivResources() civInfo.cache.updateCivResources()
} }
} }

View File

@ -47,7 +47,7 @@ class Trade : IsPartOfGameInfoSerialization {
theirOffers.addAll(trade.theirOffers) theirOffers.addAll(trade.theirOffers)
} }
fun isPeaceTreaty() = ourOffers.any { it.type == TradeType.Treaty && it.name == Constants.peaceTreaty } fun isPeaceTreaty() = ourOffers.any { it.type == TradeOfferType.Treaty && it.name == Constants.peaceTreaty }
} }
@ -56,8 +56,8 @@ class TradeRequest : IsPartOfGameInfoSerialization {
val requestingCivInfo = decliningCiv.gameInfo.getCivilization(requestingCiv) val requestingCivInfo = decliningCiv.gameInfo.getCivilization(requestingCiv)
val requestingCivDiploManager = requestingCivInfo.getDiplomacyManager(decliningCiv)!! val requestingCivDiploManager = requestingCivInfo.getDiplomacyManager(decliningCiv)!!
// the numbers of the flags (20,5) are the amount of turns to wait until offering again // the numbers of the flags (20,5) are the amount of turns to wait until offering again
if (trade.ourOffers.all { it.type == TradeType.Luxury_Resource } if (trade.ourOffers.all { it.type == TradeOfferType.Luxury_Resource }
&& trade.theirOffers.all { it.type == TradeType.Luxury_Resource }) && trade.theirOffers.all { it.type == TradeOfferType.Luxury_Resource })
requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedLuxExchange,5 - (requestingCivInfo.getPersonality()[PersonalityValue.Commerce] / 2).toInt()) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedLuxExchange,5 - (requestingCivInfo.getPersonality()[PersonalityValue.Commerce] / 2).toInt())
if (trade.ourOffers.any { it.name == Constants.researchAgreement }) if (trade.ourOffers.any { it.name == Constants.researchAgreement })
requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedResearchAgreement,15 - requestingCivInfo.getPersonality()[PersonalityValue.Science].toInt()) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedResearchAgreement,15 - requestingCivInfo.getPersonality()[PersonalityValue.Science].toInt())
@ -65,9 +65,9 @@ class TradeRequest : IsPartOfGameInfoSerialization {
requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedDefensivePact,10) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedDefensivePact,10)
if (trade.ourOffers.any { it.name == Constants.openBorders }) if (trade.ourOffers.any { it.name == Constants.openBorders })
requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedOpenBorders, if (decliningCiv.isAI()) 5 else 10) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedOpenBorders, if (decliningCiv.isAI()) 5 else 10)
if (trade.theirOffers.any { it.type == TradeType.WarDeclaration }) if (trade.theirOffers.any { it.type == TradeOfferType.WarDeclaration })
requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedJoinWarOffer, if (decliningCiv.isAI()) 5 else 10) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedJoinWarOffer, if (decliningCiv.isAI()) 5 else 10)
if (trade.ourOffers.any { it.type == TradeType.WarDeclaration }) if (trade.ourOffers.any { it.type == TradeOfferType.WarDeclaration })
requestingCivDiploManager.otherCivDiplomacy().setFlag(DiplomacyFlags.DeclinedJoinWarOffer, if (decliningCiv.isAI()) 5 else 10) requestingCivDiploManager.otherCivDiplomacy().setFlag(DiplomacyFlags.DeclinedJoinWarOffer, if (decliningCiv.isAI()) 5 else 10)
if (trade.isPeaceTreaty()) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedPeace, 3) if (trade.isPeaceTreaty()) requestingCivDiploManager.setFlag(DiplomacyFlags.DeclinedPeace, 3)

View File

@ -25,8 +25,8 @@ class TradeEvaluation {
// Edge case time! Guess what happens if you offer a peace agreement to the AI for all their cities except for the capital, // Edge case time! Guess what happens if you offer a peace agreement to the AI for all their cities except for the capital,
// and then capture their capital THAT SAME TURN? It can agree, leading to the civilization getting instantly destroyed! // and then capture their capital THAT SAME TURN? It can agree, leading to the civilization getting instantly destroyed!
if (trade.ourOffers.count { it.type == TradeType.City } == offerer.cities.size if (trade.ourOffers.count { it.type == TradeOfferType.City } == offerer.cities.size
|| trade.theirOffers.count { it.type == TradeType.City } == tradePartner.cities.size) || trade.theirOffers.count { it.type == TradeOfferType.City } == tradePartner.cities.size)
return false return false
for (offer in trade.ourOffers) for (offer in trade.ourOffers)
@ -46,16 +46,16 @@ class TradeEvaluation {
} }
return when (tradeOffer.type) { return when (tradeOffer.type) {
TradeType.Gold -> true // even if they go negative it's okay TradeOfferType.Gold -> true // even if they go negative it's okay
TradeType.Gold_Per_Turn -> true // even if they go negative it's okay TradeOfferType.Gold_Per_Turn -> true // even if they go negative it's okay
TradeType.Treaty -> true TradeOfferType.Treaty -> true
TradeType.Agreement -> true TradeOfferType.Agreement -> true
TradeType.Luxury_Resource -> hasResource(tradeOffer) TradeOfferType.Luxury_Resource -> hasResource(tradeOffer)
TradeType.Strategic_Resource -> hasResource(tradeOffer) TradeOfferType.Strategic_Resource -> hasResource(tradeOffer)
TradeType.Technology -> true TradeOfferType.Technology -> true
TradeType.Introduction -> !tradePartner.knows(tradeOffer.name) // You can't introduce them to someone they already know! TradeOfferType.Introduction -> !tradePartner.knows(tradeOffer.name) // You can't introduce them to someone they already know!
TradeType.WarDeclaration -> offerer.getDiplomacyManager(tradeOffer.name)!!.canDeclareWar() TradeOfferType.WarDeclaration -> offerer.getDiplomacyManager(tradeOffer.name)!!.canDeclareWar()
TradeType.City -> offerer.cities.any { it.id == tradeOffer.name } TradeOfferType.City -> offerer.cities.any { it.id == tradeOffer.name }
} }
} }
@ -64,14 +64,14 @@ class TradeEvaluation {
} }
fun getTradeAcceptability(trade: Trade, evaluator: Civilization, tradePartner: Civilization, includeDiplomaticGifts:Boolean = false): Int { fun getTradeAcceptability(trade: Trade, evaluator: Civilization, tradePartner: Civilization, includeDiplomaticGifts:Boolean = false): Int {
val citiesAskedToSurrender = trade.ourOffers.count { it.type == TradeType.City } val citiesAskedToSurrender = trade.ourOffers.count { it.type == TradeOfferType.City }
val maxCitiesToSurrender = ceil(evaluator.cities.size.toFloat() / 5).toInt() val maxCitiesToSurrender = ceil(evaluator.cities.size.toFloat() / 5).toInt()
if (citiesAskedToSurrender > maxCitiesToSurrender) { if (citiesAskedToSurrender > maxCitiesToSurrender) {
return Int.MIN_VALUE return Int.MIN_VALUE
} }
val sumOfTheirOffers = trade.theirOffers.asSequence() val sumOfTheirOffers = trade.theirOffers.asSequence()
.filter { it.type != TradeType.Treaty } // since treaties should only be evaluated once for 2 sides .filter { it.type != TradeOfferType.Treaty } // since treaties should only be evaluated once for 2 sides
.map { evaluateBuyCostWithInflation(it, evaluator, tradePartner, trade) }.sum() .map { evaluateBuyCostWithInflation(it, evaluator, tradePartner, trade) }.sum()
var sumOfOurOffers = trade.ourOffers.sumOf { evaluateSellCostWithInflation(it, evaluator, tradePartner, trade) } var sumOfOurOffers = trade.ourOffers.sumOf { evaluateSellCostWithInflation(it, evaluator, tradePartner, trade) }
@ -95,7 +95,7 @@ class TradeEvaluation {
} }
fun evaluateBuyCostWithInflation(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int { fun evaluateBuyCostWithInflation(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int {
if (offer.type != TradeType.Gold && offer.type != TradeType.Gold_Per_Turn) if (offer.type != TradeOfferType.Gold && offer.type != TradeOfferType.Gold_Per_Turn)
return (evaluateBuyCost(offer, civInfo, tradePartner, trade) / getGoldInflation(civInfo)).toInt() return (evaluateBuyCost(offer, civInfo, tradePartner, trade) / getGoldInflation(civInfo)).toInt()
return evaluateBuyCost(offer, civInfo, tradePartner, trade) return evaluateBuyCost(offer, civInfo, tradePartner, trade)
} }
@ -105,10 +105,10 @@ class TradeEvaluation {
*/ */
private fun evaluateBuyCost(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int { private fun evaluateBuyCost(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int {
when (offer.type) { when (offer.type) {
TradeType.Gold -> return offer.amount TradeOfferType.Gold -> return offer.amount
// GPT loses 1% of value for each 'future' turn, meaning: gold now is more valuable than gold in the future // GPT loses 1% of value for each 'future' turn, meaning: gold now is more valuable than gold in the future
TradeType.Gold_Per_Turn -> return (1..offer.duration).sumOf { offer.amount * 0.99.pow(it) }.toInt() TradeOfferType.Gold_Per_Turn -> return (1..offer.duration).sumOf { offer.amount * 0.99.pow(it) }.toInt()
TradeType.Treaty -> { TradeOfferType.Treaty -> {
return when (offer.name) { return when (offer.name) {
// Since it will be evaluated twice, once when they evaluate our offer and once when they evaluate theirs // Since it will be evaluated twice, once when they evaluate our offer and once when they evaluate theirs
Constants.peaceTreaty -> evaluatePeaceCostForThem(civInfo, tradePartner) Constants.peaceTreaty -> evaluatePeaceCostForThem(civInfo, tradePartner)
@ -118,7 +118,7 @@ class TradeEvaluation {
} }
} }
TradeType.Luxury_Resource -> { TradeOfferType.Luxury_Resource -> {
if (civInfo.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.ResourceTradesCutShort)) if (civInfo.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.ResourceTradesCutShort))
return 0 // We don't trust you for resources return 0 // We don't trust you for resources
@ -132,7 +132,7 @@ class TradeEvaluation {
} else 0 } else 0
} }
TradeType.Strategic_Resource -> { TradeOfferType.Strategic_Resource -> {
if (civInfo.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.ResourceTradesCutShort)) if (civInfo.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.ResourceTradesCutShort))
return 0 // We don't trust you for resources return 0 // We don't trust you for resources
@ -151,14 +151,14 @@ class TradeEvaluation {
return 50 * amountToBuyInOffer return 50 * amountToBuyInOffer
} }
TradeType.Technology -> // Currently unused TradeOfferType.Technology -> // Currently unused
return (sqrt(civInfo.gameInfo.ruleset.technologies[offer.name]!!.cost.toDouble()) return (sqrt(civInfo.gameInfo.ruleset.technologies[offer.name]!!.cost.toDouble())
* civInfo.gameInfo.speed.scienceCostModifier).toInt() * 20 * civInfo.gameInfo.speed.scienceCostModifier).toInt() * 20
TradeType.Introduction -> return introductionValue(civInfo.gameInfo.ruleset) TradeOfferType.Introduction -> return introductionValue(civInfo.gameInfo.ruleset)
TradeType.WarDeclaration -> { TradeOfferType.WarDeclaration -> {
val civToDeclareWarOn = civInfo.gameInfo.getCivilization(offer.name) val civToDeclareWarOn = civInfo.gameInfo.getCivilization(offer.name)
if (trade.theirOffers.any { it.type == TradeType.WarDeclaration && it.name == offer.name } if (trade.theirOffers.any { it.type == TradeOfferType.WarDeclaration && it.name == offer.name }
&& trade.ourOffers.any {it.type == TradeType.WarDeclaration && it.name == offer.name}) { && trade.ourOffers.any {it.type == TradeOfferType.WarDeclaration && it.name == offer.name}) {
// Team war is handled in the selling method // Team war is handled in the selling method
return 0 return 0
} else if (civInfo.isAtWarWith(civToDeclareWarOn)) { } else if (civInfo.isAtWarWith(civToDeclareWarOn)) {
@ -169,7 +169,7 @@ class TradeEvaluation {
return 0 return 0
} }
} }
TradeType.City -> { TradeOfferType.City -> {
val city = tradePartner.cities.firstOrNull { it.id == offer.name } val city = tradePartner.cities.firstOrNull { it.id == offer.name }
?: throw Exception("Got an offer for city id "+offer.name+" which does't seem to exist for this civ!") ?: throw Exception("Got an offer for city id "+offer.name+" which does't seem to exist for this civ!")
val stats = city.cityStats.currentCityStats val stats = city.cityStats.currentCityStats
@ -179,7 +179,7 @@ class TradeEvaluation {
val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food + surrounded val sumOfStats = stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food + surrounded
return sumOfStats.toInt() * 100 return sumOfStats.toInt() * 100
} }
TradeType.Agreement -> { TradeOfferType.Agreement -> {
if (offer.name == Constants.openBorders) return 100 if (offer.name == Constants.openBorders) return 100
throw Exception("Invalid agreement type!") throw Exception("Invalid agreement type!")
} }
@ -213,16 +213,16 @@ class TradeEvaluation {
fun evaluateSellCostWithInflation(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int { fun evaluateSellCostWithInflation(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int {
if (offer.type != TradeType.Gold && offer.type != TradeType.Gold_Per_Turn) if (offer.type != TradeOfferType.Gold && offer.type != TradeOfferType.Gold_Per_Turn)
return (evaluateSellCost(offer, civInfo, tradePartner, trade) / getGoldInflation(civInfo)).toInt() return (evaluateSellCost(offer, civInfo, tradePartner, trade) / getGoldInflation(civInfo)).toInt()
return evaluateSellCost(offer, civInfo, tradePartner, trade) return evaluateSellCost(offer, civInfo, tradePartner, trade)
} }
private fun evaluateSellCost(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int { private fun evaluateSellCost(offer: TradeOffer, civInfo: Civilization, tradePartner: Civilization, trade: Trade): Int {
when (offer.type) { when (offer.type) {
TradeType.Gold -> return offer.amount TradeOfferType.Gold -> return offer.amount
TradeType.Gold_Per_Turn -> return offer.amount * offer.duration TradeOfferType.Gold_Per_Turn -> return offer.amount * offer.duration
TradeType.Treaty -> { TradeOfferType.Treaty -> {
return when (offer.name) { return when (offer.name) {
// Since it will be evaluated twice, once when they evaluate our offer and once when they evaluate theirs // Since it will be evaluated twice, once when they evaluate our offer and once when they evaluate theirs
Constants.peaceTreaty -> evaluatePeaceCostForThem(civInfo, tradePartner) Constants.peaceTreaty -> evaluatePeaceCostForThem(civInfo, tradePartner)
@ -233,7 +233,7 @@ class TradeEvaluation {
//Todo:AddDefensiveTreatyHere //Todo:AddDefensiveTreatyHere
} }
} }
TradeType.Luxury_Resource -> { TradeOfferType.Luxury_Resource -> {
return when { return when {
civInfo.getResourceAmount(offer.name) > 1 -> 250 // fair price civInfo.getResourceAmount(offer.name) > 1 -> 250 // fair price
civInfo.hasUnique(UniqueType.RetainHappinessFromLuxury) -> // If we retain 50% happiness, value at 375 civInfo.hasUnique(UniqueType.RetainHappinessFromLuxury) -> // If we retain 50% happiness, value at 375
@ -242,7 +242,7 @@ class TradeEvaluation {
else -> 500 // you want to take away our last lux of this type?! else -> 500 // you want to take away our last lux of this type?!
} }
} }
TradeType.Strategic_Resource -> { TradeOfferType.Strategic_Resource -> {
if (civInfo.gameInfo.spaceResources.contains(offer.name) && if (civInfo.gameInfo.spaceResources.contains(offer.name) &&
(civInfo.hasUnique(UniqueType.EnablesConstructionOfSpaceshipParts) || (civInfo.hasUnique(UniqueType.EnablesConstructionOfSpaceshipParts) ||
tradePartner.hasUnique(UniqueType.EnablesConstructionOfSpaceshipParts)) tradePartner.hasUnique(UniqueType.EnablesConstructionOfSpaceshipParts))
@ -273,12 +273,12 @@ class TradeEvaluation {
} }
return totalCost return totalCost
} }
TradeType.Technology -> return sqrt(civInfo.gameInfo.ruleset.technologies[offer.name]!!.cost.toDouble()).toInt() * 20 TradeOfferType.Technology -> return sqrt(civInfo.gameInfo.ruleset.technologies[offer.name]!!.cost.toDouble()).toInt() * 20
TradeType.Introduction -> return introductionValue(civInfo.gameInfo.ruleset) TradeOfferType.Introduction -> return introductionValue(civInfo.gameInfo.ruleset)
TradeType.WarDeclaration -> { TradeOfferType.WarDeclaration -> {
val civToDeclareWarOn = civInfo.gameInfo.getCivilization(offer.name) val civToDeclareWarOn = civInfo.gameInfo.getCivilization(offer.name)
if (trade.theirOffers.any { it.type == TradeType.WarDeclaration && it.name == offer.name } if (trade.theirOffers.any { it.type == TradeOfferType.WarDeclaration && it.name == offer.name }
&& trade.ourOffers.any {it.type == TradeType.WarDeclaration && it.name == offer.name}) { && trade.ourOffers.any {it.type == TradeOfferType.WarDeclaration && it.name == offer.name}) {
// Only accept if the war will benefit us, or if they pay us enough // Only accept if the war will benefit us, or if they pay us enough
// We shouldn't want to pay them for us to declare war (no negative values) // We shouldn't want to pay them for us to declare war (no negative values)
return (-20 * DeclareWarPlanEvaluator.evaluateTeamWarPlan(civInfo, civToDeclareWarOn, tradePartner, null)).toInt().coerceAtLeast(0) return (-20 * DeclareWarPlanEvaluator.evaluateTeamWarPlan(civInfo, civToDeclareWarOn, tradePartner, null)).toInt().coerceAtLeast(0)
@ -291,7 +291,7 @@ class TradeEvaluation {
} }
} }
TradeType.City -> { TradeOfferType.City -> {
val city = civInfo.cities.firstOrNull { it.id == offer.name } val city = civInfo.cities.firstOrNull { it.id == offer.name }
?: throw Exception("Got an offer to sell city id " + offer.name + " which does't seem to exist for this civ!") ?: throw Exception("Got an offer to sell city id " + offer.name + " which does't seem to exist for this civ!")
@ -301,7 +301,7 @@ class TradeEvaluation {
stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food + distanceBonus stats.culture + stats.gold + stats.science + stats.production + stats.happiness + stats.food + distanceBonus
return (sumOfStats.toInt() * 100).coerceAtLeast(1000) return (sumOfStats.toInt() * 100).coerceAtLeast(1000)
} }
TradeType.Agreement -> { TradeOfferType.Agreement -> {
if (offer.name == Constants.openBorders) { if (offer.name == Constants.openBorders) {
return when (civInfo.getDiplomacyManager(tradePartner)!!.relationshipIgnoreAfraid()) { return when (civInfo.getDiplomacyManager(tradePartner)!!.relationshipIgnoreAfraid()) {
RelationshipLevel.Unforgivable -> 10000 RelationshipLevel.Unforgivable -> 10000

View File

@ -21,37 +21,37 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
val offers = TradeOffersList() val offers = TradeOffersList()
if (civInfo.isCityState() && otherCivilization.isCityState()) return offers if (civInfo.isCityState() && otherCivilization.isCityState()) return offers
if (civInfo.isAtWarWith(otherCivilization)) if (civInfo.isAtWarWith(otherCivilization))
offers.add(TradeOffer(Constants.peaceTreaty, TradeType.Treaty)) offers.add(TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty))
if (!otherCivilization.getDiplomacyManager(civInfo)!!.hasOpenBorders if (!otherCivilization.getDiplomacyManager(civInfo)!!.hasOpenBorders
&& !otherCivilization.isCityState() && !otherCivilization.isCityState()
&& civInfo.hasUnique(UniqueType.EnablesOpenBorders) && civInfo.hasUnique(UniqueType.EnablesOpenBorders)
&& otherCivilization.hasUnique(UniqueType.EnablesOpenBorders)) { && otherCivilization.hasUnique(UniqueType.EnablesOpenBorders)) {
offers.add(TradeOffer(Constants.openBorders, TradeType.Agreement)) offers.add(TradeOffer(Constants.openBorders, TradeOfferType.Agreement))
} }
if (civInfo.diplomacyFunctions.canSignResearchAgreementNoCostWith(otherCivilization)) if (civInfo.diplomacyFunctions.canSignResearchAgreementNoCostWith(otherCivilization))
offers.add(TradeOffer(Constants.researchAgreement, TradeType.Treaty, civInfo.diplomacyFunctions.getResearchAgreementCost(otherCivilization))) offers.add(TradeOffer(Constants.researchAgreement, TradeOfferType.Treaty, civInfo.diplomacyFunctions.getResearchAgreementCost(otherCivilization)))
if (civInfo.diplomacyFunctions.canSignDefensivePactWith(otherCivilization)) if (civInfo.diplomacyFunctions.canSignDefensivePactWith(otherCivilization))
offers.add(TradeOffer(Constants.defensivePact, TradeType.Treaty)) offers.add(TradeOffer(Constants.defensivePact, TradeOfferType.Treaty))
for (entry in civInfo.getCivResourcesWithOriginsForTrade() for (entry in civInfo.getCivResourcesWithOriginsForTrade()
.filterNot { it.resource.resourceType == ResourceType.Bonus } .filterNot { it.resource.resourceType == ResourceType.Bonus }
.filter { it.origin == Constants.tradable } .filter { it.origin == Constants.tradable }
) { ) {
val resourceTradeType = if (entry.resource.resourceType == ResourceType.Luxury) TradeType.Luxury_Resource val resourceTradeOfferType = if (entry.resource.resourceType == ResourceType.Luxury) TradeOfferType.Luxury_Resource
else TradeType.Strategic_Resource else TradeOfferType.Strategic_Resource
offers.add(TradeOffer(entry.resource.name, resourceTradeType, entry.amount)) offers.add(TradeOffer(entry.resource.name, resourceTradeOfferType, entry.amount))
} }
offers.add(TradeOffer("Gold", TradeType.Gold, civInfo.gold)) offers.add(TradeOffer("Gold", TradeOfferType.Gold, civInfo.gold))
offers.add(TradeOffer("Gold per turn", TradeType.Gold_Per_Turn, civInfo.stats.statsForNextTurn.gold.toInt())) offers.add(TradeOffer("Gold per turn", TradeOfferType.Gold_Per_Turn, civInfo.stats.statsForNextTurn.gold.toInt()))
if (!civInfo.isOneCityChallenger() && !otherCivilization.isOneCityChallenger() if (!civInfo.isOneCityChallenger() && !otherCivilization.isOneCityChallenger()
&& !civInfo.isCityState() && !otherCivilization.isCityState()) { && !civInfo.isCityState() && !otherCivilization.isCityState()) {
for (city in civInfo.cities.filterNot { it.isCapital() || it.isInResistance() }) for (city in civInfo.cities.filterNot { it.isCapital() || it.isInResistance() })
offers.add(TradeOffer(city.id, TradeType.City)) offers.add(TradeOffer(city.id, TradeOfferType.City))
} }
val otherCivsWeKnow = civInfo.getKnownCivs() val otherCivsWeKnow = civInfo.getKnownCivs()
@ -61,7 +61,7 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
val civsWeKnowAndTheyDont = otherCivsWeKnow val civsWeKnowAndTheyDont = otherCivsWeKnow
.filter { !otherCivilization.diplomacy.containsKey(it.civName) && !it.isDefeated() } .filter { !otherCivilization.diplomacy.containsKey(it.civName) && !it.isDefeated() }
for (thirdCiv in civsWeKnowAndTheyDont) { for (thirdCiv in civsWeKnowAndTheyDont) {
offers.add(TradeOffer(thirdCiv.civName, TradeType.Introduction)) offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.Introduction))
} }
} }
@ -72,7 +72,7 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
val civsWeArentAtWarWith = civsWeBothKnow val civsWeArentAtWarWith = civsWeBothKnow
.filter { civInfo.getDiplomacyManager(it)!!.canDeclareWar() } .filter { civInfo.getDiplomacyManager(it)!!.canDeclareWar() }
for (thirdCiv in civsWeArentAtWarWith) { for (thirdCiv in civsWeArentAtWarWith) {
offers.add(TradeOffer(thirdCiv.civName, TradeType.WarDeclaration)) offers.add(TradeOffer(thirdCiv.civName, TradeOfferType.WarDeclaration))
} }
} }
@ -95,14 +95,14 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
// instant transfers // instant transfers
fun transferTrade(from: Civilization, to: Civilization, offer: TradeOffer) { fun transferTrade(from: Civilization, to: Civilization, offer: TradeOffer) {
when (offer.type) { when (offer.type) {
TradeType.Gold -> { TradeOfferType.Gold -> {
to.addGold(offer.amount) to.addGold(offer.amount)
from.addGold(-offer.amount) from.addGold(-offer.amount)
} }
TradeType.Technology -> { TradeOfferType.Technology -> {
to.tech.addTechnology(offer.name) to.tech.addTechnology(offer.name)
} }
TradeType.City -> { TradeOfferType.City -> {
val city = from.cities.first { it.id == offer.name } val city = from.cities.first { it.id == offer.name }
city.moveToCiv(to) city.moveToCiv(to)
city.getCenterTile().getUnits().toList() city.getCenterTile().getUnits().toList()
@ -124,7 +124,7 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
) // can't liberate if it's our city ) // can't liberate if it's our city
to.popupAlerts.add(PopupAlert(AlertType.CityTraded, city.id)) to.popupAlerts.add(PopupAlert(AlertType.CityTraded, city.id))
} }
TradeType.Treaty -> { TradeOfferType.Treaty -> {
// Note: Treaties are not transfered from both sides due to notifications and double signing // Note: Treaties are not transfered from both sides due to notifications and double signing
if (offer.name == Constants.peaceTreaty) to.getDiplomacyManager(from)!!.makePeace() if (offer.name == Constants.peaceTreaty) to.getDiplomacyManager(from)!!.makePeace()
if (offer.name == Constants.researchAgreement) { if (offer.name == Constants.researchAgreement) {
@ -137,11 +137,11 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
} }
if (offer.name == Constants.defensivePact) to.getDiplomacyManager(from)!!.signDefensivePact(offer.duration) if (offer.name == Constants.defensivePact) to.getDiplomacyManager(from)!!.signDefensivePact(offer.duration)
} }
TradeType.Introduction -> to.diplomacyFunctions.makeCivilizationsMeet(to.gameInfo.getCivilization(offer.name)) TradeOfferType.Introduction -> to.diplomacyFunctions.makeCivilizationsMeet(to.gameInfo.getCivilization(offer.name))
TradeType.WarDeclaration -> { TradeOfferType.WarDeclaration -> {
val nameOfCivToDeclareWarOn = offer.name val nameOfCivToDeclareWarOn = offer.name
val warType = if (currentTrade.theirOffers.any { it.type == TradeType.WarDeclaration && it.name == nameOfCivToDeclareWarOn } val warType = if (currentTrade.theirOffers.any { it.type == TradeOfferType.WarDeclaration && it.name == nameOfCivToDeclareWarOn }
&& currentTrade.ourOffers.any {it.type == TradeType.WarDeclaration && it.name == nameOfCivToDeclareWarOn}) && currentTrade.ourOffers.any {it.type == TradeOfferType.WarDeclaration && it.name == nameOfCivToDeclareWarOn})
WarType.TeamWar WarType.TeamWar
else WarType.JoinWar else WarType.JoinWar
@ -165,13 +165,13 @@ class TradeLogic(val ourCivilization: Civilization, val otherCivilization: Civil
} }
// Transfer of cities needs to happen before peace treaty, to avoid our units teleporting out of areas that soon will be ours // Transfer of cities needs to happen before peace treaty, to avoid our units teleporting out of areas that soon will be ours
for (offer in currentTrade.theirOffers.filterNot { it.type == TradeType.Treaty }) for (offer in currentTrade.theirOffers.filterNot { it.type == TradeOfferType.Treaty })
transferTrade(otherCivilization, ourCivilization, offer) transferTrade(otherCivilization, ourCivilization, offer)
for (offer in currentTrade.ourOffers.filterNot { it.type == TradeType.Treaty }) for (offer in currentTrade.ourOffers.filterNot { it.type == TradeOfferType.Treaty })
transferTrade(ourCivilization, otherCivilization, offer) transferTrade(ourCivilization, otherCivilization, offer)
// Transfter of treaties should only be done from one side to avoid double signing and notifying // Transfter of treaties should only be done from one side to avoid double signing and notifying
for (offer in currentTrade.theirOffers.filter { it.type == TradeType.Treaty }) for (offer in currentTrade.theirOffers.filter { it.type == TradeOfferType.Treaty })
transferTrade(otherCivilization, ourCivilization, offer) transferTrade(otherCivilization, ourCivilization, offer)
ourCivilization.cache.updateCivResources() ourCivilization.cache.updateCivResources()

View File

@ -3,16 +3,16 @@ package com.unciv.logic.trade
import com.unciv.Constants import com.unciv.Constants
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.trade.TradeType.TradeTypeNumberType import com.unciv.logic.trade.TradeOfferType.TradeTypeNumberType
import com.unciv.models.ruleset.Speed import com.unciv.models.ruleset.Speed
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.fonts.Fonts import com.unciv.ui.components.fonts.Fonts
data class TradeOffer(val name: String, val type: TradeType, var amount: Int = 1, var duration: Int) : IsPartOfGameInfoSerialization { data class TradeOffer(val name: String, val type: TradeOfferType, var amount: Int = 1, var duration: Int) : IsPartOfGameInfoSerialization {
constructor( constructor(
name: String, name: String,
type: TradeType, type: TradeOfferType,
amount: Int = 1, amount: Int = 1,
speed: Speed = UncivGame.Current.gameInfo!!.speed speed: Speed = UncivGame.Current.gameInfo!!.speed
) : this(name, type, amount, duration = -1) { ) : this(name, type, amount, duration = -1) {
@ -23,7 +23,7 @@ data class TradeOffer(val name: String, val type: TradeType, var amount: Int = 1
} }
} }
constructor() : this("", TradeType.Gold, duration = -1) // so that the json deserializer can work constructor() : this("", TradeOfferType.Gold, duration = -1) // so that the json deserializer can work
@Suppress("CovariantEquals", "WrongEqualsTypeParameter") // This is an overload, not an override of the built-in equals(Any?) @Suppress("CovariantEquals", "WrongEqualsTypeParameter") // This is an overload, not an override of the built-in equals(Any?)
fun equals(offer: TradeOffer): Boolean { fun equals(offer: TradeOffer): Boolean {
@ -36,9 +36,9 @@ data class TradeOffer(val name: String, val type: TradeType, var amount: Int = 1
fun getOfferText(untradable: Int = 0): String { fun getOfferText(untradable: Int = 0): String {
var offerText = when(type) { var offerText = when(type) {
TradeType.WarDeclaration -> "Declare war on [$name]" TradeOfferType.WarDeclaration -> "Declare war on [$name]"
TradeType.Introduction -> "Introduction to [$name]" TradeOfferType.Introduction -> "Introduction to [$name]"
TradeType.City -> { TradeOfferType.City -> {
val city = val city =
UncivGame.Current.gameInfo!!.getCities().firstOrNull { it.id == name } UncivGame.Current.gameInfo!!.getCities().firstOrNull { it.id == name }
city?.run { "{$name} (${population.population})" } ?: "Non-existent city" city?.run { "{$name} (${population.population})" } ?: "Non-existent city"

View File

@ -5,7 +5,7 @@ package com.unciv.logic.trade
* @param isImmediate Trade is a one-time effect without duration * @param isImmediate Trade is a one-time effect without duration
*/ */
@Suppress("EnumEntryName") // We do want the underscores in our names @Suppress("EnumEntryName") // We do want the underscores in our names
enum class TradeType(val numberType: TradeTypeNumberType, val isImmediate: Boolean) { enum class TradeOfferType(val numberType: TradeTypeNumberType, val isImmediate: Boolean) {
Gold (TradeTypeNumberType.Gold, true), Gold (TradeTypeNumberType.Gold, true),
Gold_Per_Turn (TradeTypeNumberType.Gold, false), Gold_Per_Turn (TradeTypeNumberType.Gold, false),
/** Treaties are shared by both sides - like peace treaty and defensive pact */ /** Treaties are shared by both sides - like peace treaty and defensive pact */

View File

@ -17,7 +17,7 @@ import com.unciv.logic.civilization.diplomacy.RelationshipLevel
import com.unciv.logic.civilization.managers.AssignedQuest import com.unciv.logic.civilization.managers.AssignedQuest
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.Quest import com.unciv.models.ruleset.Quest
import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
@ -251,13 +251,13 @@ class CityStateDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) {
tradeLogic.currentTrade.ourOffers.add( tradeLogic.currentTrade.ourOffers.add(
TradeOffer( TradeOffer(
Constants.peaceTreaty, Constants.peaceTreaty,
TradeType.Treaty TradeOfferType.Treaty
) )
) )
tradeLogic.currentTrade.theirOffers.add( tradeLogic.currentTrade.theirOffers.add(
TradeOffer( TradeOffer(
Constants.peaceTreaty, Constants.peaceTreaty,
TradeType.Treaty TradeOfferType.Treaty
) )
) )
tradeLogic.acceptTrade() tradeLogic.acceptTrade()

View File

@ -13,7 +13,7 @@ import com.unciv.logic.civilization.diplomacy.DiplomacyManager
import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.logic.civilization.diplomacy.RelationshipLevel import com.unciv.logic.civilization.diplomacy.RelationshipLevel
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.addSeparator
@ -106,7 +106,7 @@ class MajorCivDiplomacyTable(private val diplomacyScreen: DiplomacyScreen) {
val negotiatePeaceButton = "Negotiate Peace".toTextButton() val negotiatePeaceButton = "Negotiate Peace".toTextButton()
negotiatePeaceButton.onClick { negotiatePeaceButton.onClick {
val tradeTable = diplomacyScreen.setTrade(otherCiv) val tradeTable = diplomacyScreen.setTrade(otherCiv)
val peaceTreaty = TradeOffer(Constants.peaceTreaty, TradeType.Treaty) val peaceTreaty = TradeOffer(Constants.peaceTreaty, TradeOfferType.Treaty)
tradeTable.tradeLogic.currentTrade.theirOffers.add(peaceTreaty) tradeTable.tradeLogic.currentTrade.theirOffers.add(peaceTreaty)
tradeTable.tradeLogic.currentTrade.ourOffers.add(peaceTreaty) tradeTable.tradeLogic.currentTrade.ourOffers.add(peaceTreaty)
tradeTable.offerColumnsTable.update() tradeTable.offerColumnsTable.update()

View File

@ -6,7 +6,7 @@ import com.unciv.logic.civilization.Civilization
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeOffersList import com.unciv.logic.trade.TradeOffersList
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.addSeparator import com.unciv.ui.components.extensions.addSeparator
import com.unciv.ui.components.extensions.surroundWithCircle import com.unciv.ui.components.extensions.surroundWithCircle
@ -25,7 +25,7 @@ class OfferColumnsTable(
fun addOffer(offer: TradeOffer, offerList: TradeOffersList, correspondingOfferList: TradeOffersList) { fun addOffer(offer: TradeOffer, offerList: TradeOffersList, correspondingOfferList: TradeOffersList) {
offerList.add(offer.copy()) offerList.add(offer.copy())
if (offer.type == TradeType.Treaty) correspondingOfferList.add(offer.copy()) if (offer.type == TradeOfferType.Treaty) correspondingOfferList.add(offer.copy())
onChange() onChange()
} }
@ -37,8 +37,8 @@ class OfferColumnsTable(
civ: Civilization civ: Civilization
) { ) {
when (offer.type) { when (offer.type) {
TradeType.Gold -> openGoldSelectionPopup(offer, list, civ.gold) TradeOfferType.Gold -> openGoldSelectionPopup(offer, list, civ.gold)
TradeType.Gold_Per_Turn -> openGoldSelectionPopup(offer, list, civ.stats.statsForNextTurn.gold.toInt()) TradeOfferType.Gold_Per_Turn -> openGoldSelectionPopup(offer, list, civ.stats.statsForNextTurn.gold.toInt())
else -> addOffer(if (invert) offer.copy(amount = -offer.amount) else offer, list, counterList) else -> addOffer(if (invert) offer.copy(amount = -offer.amount) else offer, list, counterList)
} }
} }
@ -122,7 +122,7 @@ class OfferColumnsTable(
icon = ImageGetter.getStatIcon("Gold").surroundWithCircle(80f), icon = ImageGetter.getStatIcon("Gold").surroundWithCircle(80f),
defaultValue = offer.amount.toString(), defaultValue = offer.amount.toString(),
amountButtons = amountButtons =
if (offer.type == TradeType.Gold) listOf(50, 500) if (offer.type == TradeOfferType.Gold) listOf(50, 500)
else listOf(5, 15), else listOf(5, 15),
bounds = IntRange(0, maxGold), bounds = IntRange(0, maxGold),
actionOnOk = { userInput -> actionOnOk = { userInput ->

View File

@ -8,18 +8,18 @@ import com.unciv.UncivGame
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeOffersList import com.unciv.logic.trade.TradeOffersList
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.logic.trade.TradeType.Agreement import com.unciv.logic.trade.TradeOfferType.Agreement
import com.unciv.logic.trade.TradeType.City import com.unciv.logic.trade.TradeOfferType.City
import com.unciv.logic.trade.TradeType.Gold import com.unciv.logic.trade.TradeOfferType.Gold
import com.unciv.logic.trade.TradeType.Gold_Per_Turn import com.unciv.logic.trade.TradeOfferType.Gold_Per_Turn
import com.unciv.logic.trade.TradeType.Introduction import com.unciv.logic.trade.TradeOfferType.Introduction
import com.unciv.logic.trade.TradeType.Luxury_Resource import com.unciv.logic.trade.TradeOfferType.Luxury_Resource
import com.unciv.logic.trade.TradeType.Strategic_Resource import com.unciv.logic.trade.TradeOfferType.Strategic_Resource
import com.unciv.logic.trade.TradeType.Technology import com.unciv.logic.trade.TradeOfferType.Technology
import com.unciv.logic.trade.TradeType.Treaty import com.unciv.logic.trade.TradeOfferType.Treaty
import com.unciv.logic.trade.TradeType.WarDeclaration import com.unciv.logic.trade.TradeOfferType.WarDeclaration
import com.unciv.logic.trade.TradeType.values import com.unciv.logic.trade.TradeOfferType.values
import com.unciv.models.ruleset.tile.ResourceSupplyList import com.unciv.models.ruleset.tile.ResourceSupplyList
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.disable import com.unciv.ui.components.extensions.disable
@ -43,7 +43,7 @@ class OffersListScroll(
val table = Table(BaseScreen.skin).apply { defaults().pad(5f) } val table = Table(BaseScreen.skin).apply { defaults().pad(5f) }
private val expanderTabs = HashMap<TradeType, ExpanderTab>() private val expanderTabs = HashMap<TradeOfferType, ExpanderTab>()
init { init {
fadeScrollBars=false fadeScrollBars=false

View File

@ -5,7 +5,7 @@ import com.unciv.Constants
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeRequest import com.unciv.logic.trade.TradeRequest
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.isEnabled import com.unciv.ui.components.extensions.isEnabled
import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.components.extensions.toTextButton
@ -58,18 +58,18 @@ class TradeTable(
// There must be enough gold to add to the offer to satisfy this, otherwise the research agreement button would be disabled // There must be enough gold to add to the offer to satisfy this, otherwise the research agreement button would be disabled
if (tradeLogic.currentTrade.ourOffers.any { it.name == Constants.researchAgreement}) { if (tradeLogic.currentTrade.ourOffers.any { it.name == Constants.researchAgreement}) {
val researchCost = civ.diplomacyFunctions.getResearchAgreementCost(otherCivilization) val researchCost = civ.diplomacyFunctions.getResearchAgreementCost(otherCivilization)
val currentPlayerOfferedGold = tradeLogic.currentTrade.ourOffers.firstOrNull { it.type == TradeType.Gold }?.amount ?: 0 val currentPlayerOfferedGold = tradeLogic.currentTrade.ourOffers.firstOrNull { it.type == TradeOfferType.Gold }?.amount ?: 0
val otherCivOfferedGold = tradeLogic.currentTrade.theirOffers.firstOrNull { it.type == TradeType.Gold }?.amount ?: 0 val otherCivOfferedGold = tradeLogic.currentTrade.theirOffers.firstOrNull { it.type == TradeOfferType.Gold }?.amount ?: 0
val newCurrentPlayerGold = civ.gold + otherCivOfferedGold - researchCost val newCurrentPlayerGold = civ.gold + otherCivOfferedGold - researchCost
val newOtherCivGold = otherCivilization.gold + currentPlayerOfferedGold - researchCost val newOtherCivGold = otherCivilization.gold + currentPlayerOfferedGold - researchCost
// Check if we require more gold from them // Check if we require more gold from them
if (newCurrentPlayerGold < 0) { if (newCurrentPlayerGold < 0) {
offerColumnsTable.addOffer( tradeLogic.theirAvailableOffers.first { it.type == TradeType.Gold } offerColumnsTable.addOffer( tradeLogic.theirAvailableOffers.first { it.type == TradeOfferType.Gold }
.copy(amount = -newCurrentPlayerGold), tradeLogic.currentTrade.theirOffers, tradeLogic.currentTrade.ourOffers) .copy(amount = -newCurrentPlayerGold), tradeLogic.currentTrade.theirOffers, tradeLogic.currentTrade.ourOffers)
} }
// Check if they require more gold from us // Check if they require more gold from us
if (newOtherCivGold < 0) { if (newOtherCivGold < 0) {
offerColumnsTable.addOffer( tradeLogic.ourAvailableOffers.first { it.type == TradeType.Gold } offerColumnsTable.addOffer( tradeLogic.ourAvailableOffers.first { it.type == TradeOfferType.Gold }
.copy(amount = -newOtherCivGold), tradeLogic.currentTrade.ourOffers, tradeLogic.currentTrade.theirOffers) .copy(amount = -newOtherCivGold), tradeLogic.currentTrade.ourOffers, tradeLogic.currentTrade.theirOffers)
} }
} }

View File

@ -8,7 +8,7 @@ import com.unciv.UncivGame
import com.unciv.logic.city.City import com.unciv.logic.city.City
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.tile.Tile import com.unciv.logic.map.tile.Tile
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.ruleset.tile.ResourceSupplyList import com.unciv.models.ruleset.tile.ResourceSupplyList
import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.tile.TileResource import com.unciv.models.ruleset.tile.TileResource
@ -271,7 +271,7 @@ class ResourcesOverviewTab(
for (otherCiv in viewingPlayer.getKnownCivs()) { for (otherCiv in viewingPlayer.getKnownCivs()) {
// Show resources received through trade // Show resources received through trade
for (trade in otherCiv.tradeRequests.filter { it.requestingCiv == viewingPlayer.civName }) for (trade in otherCiv.tradeRequests.filter { it.requestingCiv == viewingPlayer.civName })
for (offer in trade.trade.theirOffers.filter { it.type == TradeType.Strategic_Resource || it.type == TradeType.Luxury_Resource }) for (offer in trade.trade.theirOffers.filter { it.type == TradeOfferType.Strategic_Resource || it.type == TradeOfferType.Luxury_Resource })
newResourceSupplyList.add(gameInfo.ruleset.tileResources[offer.name]!!, ExtraInfoOrigin.TradeOffer.name, offer.amount) newResourceSupplyList.add(gameInfo.ruleset.tileResources[offer.name]!!, ExtraInfoOrigin.TradeOffer.name, offer.amount)
// Show resources your city-state allies have left unimproved // Show resources your city-state allies have left unimproved

View File

@ -7,7 +7,7 @@ import com.unciv.logic.civilization.NotificationCategory
import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.pad import com.unciv.ui.components.extensions.pad
import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toLabel
@ -57,7 +57,7 @@ class TradePopup(worldScreen: WorldScreen) : Popup(worldScreen) {
fun getOfferText(offer:TradeOffer): String { fun getOfferText(offer:TradeOffer): String {
var tradeText = offer.getOfferText() var tradeText = offer.getOfferText()
if (offer.type == TradeType.Luxury_Resource || offer.type == TradeType.Strategic_Resource) if (offer.type == TradeOfferType.Luxury_Resource || offer.type == TradeOfferType.Strategic_Resource)
tradeText += "\n" + "Owned by you: [${ourResources[offer.name]}]".tr() tradeText += "\n" + "Owned by you: [${ourResources[offer.name]}]".tr()
return tradeText return tradeText
} }

View File

@ -4,7 +4,7 @@ import com.unciv.logic.civilization.diplomacy.DiplomacyTurnManager.nextTurn
import com.unciv.logic.trade.TradeEvaluation import com.unciv.logic.trade.TradeEvaluation
import com.unciv.logic.trade.TradeLogic import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeOfferType
import com.unciv.testing.GdxTestRunner import com.unciv.testing.GdxTestRunner
import com.unciv.testing.TestGame import com.unciv.testing.TestGame
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@ -100,7 +100,7 @@ class GoldGiftingTests {
a.addGold(1000) a.addGold(1000)
assertEquals(0, bDiplomacy.getGoldGifts()) assertEquals(0, bDiplomacy.getGoldGifts())
val tradeOffer = TradeLogic(a,b) val tradeOffer = TradeLogic(a,b)
tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeType.Gold }) tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeOfferType.Gold })
assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade.reverse(), b,a,false) > 0) assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade.reverse(), b,a,false) > 0)
tradeOffer.acceptTrade() tradeOffer.acceptTrade()
assertEquals(0, aDiplomacy.getGoldGifts()) assertEquals(0, aDiplomacy.getGoldGifts())
@ -113,11 +113,11 @@ class GoldGiftingTests {
// Therefore we only test for 90% // Therefore we only test for 90%
a.addGold(1000) a.addGold(1000)
val tradeOffer = TradeLogic(a,b) val tradeOffer = TradeLogic(a,b)
tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeType.Gold }) tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeOfferType.Gold })
tradeOffer.acceptTrade() tradeOffer.acceptTrade()
bDiplomacy.nextTurn() bDiplomacy.nextTurn()
val tradeOffer2 = TradeLogic(a,b) val tradeOffer2 = TradeLogic(a,b)
tradeOffer2.currentTrade.theirOffers.add(TradeOffer("Gold", TradeType.Gold, 900)) tradeOffer2.currentTrade.theirOffers.add(TradeOffer("Gold", TradeOfferType.Gold, 900))
assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade.reverse(), b,a,false) > 0) assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade.reverse(), b,a,false) > 0)
tradeOffer2.acceptTrade() tradeOffer2.acceptTrade()
assertTrue(bDiplomacy.getGoldGifts() >= 0) // Must not be negative assertTrue(bDiplomacy.getGoldGifts() >= 0) // Must not be negative
@ -127,7 +127,7 @@ class GoldGiftingTests {
fun `Gold gifted impact trade acceptability`() { fun `Gold gifted impact trade acceptability`() {
a.addGold(1000) a.addGold(1000)
val tradeOffer = TradeLogic(a,b) val tradeOffer = TradeLogic(a,b)
tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeType.Gold }) tradeOffer.currentTrade.ourOffers.add(tradeOffer.ourAvailableOffers.first { it.type == TradeOfferType.Gold })
assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade, b,a,true) < 0) assertTrue(TradeEvaluation().getTradeAcceptability(tradeOffer.currentTrade, b,a,true) < 0)
tradeOffer.acceptTrade() tradeOffer.acceptTrade()
val tradeOffer2 = TradeLogic(a,b) val tradeOffer2 = TradeLogic(a,b)