Resolve #7438 -Can no longer receive negative gold offers from AI (#7451)

* Can no longer receive negative gold offers from AI

* Function over field

* Correct checking for tradable offers in AI counteroffer
This commit is contained in:
Yair Morgenstern
2022-07-18 17:57:36 +03:00
committed by GitHub
parent 0ba7a457c4
commit f1a72e9611
3 changed files with 29 additions and 9 deletions

View File

@ -7,7 +7,13 @@ import com.unciv.logic.battle.MapUnitCombatant
import com.unciv.logic.city.CityInfo
import com.unciv.logic.city.INonPerpetualConstruction
import com.unciv.logic.city.PerpetualConstruction
import com.unciv.logic.civilization.*
import com.unciv.logic.civilization.AlertType
import com.unciv.logic.civilization.CityStateType
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.civilization.PlayerType
import com.unciv.logic.civilization.PopupAlert
import com.unciv.logic.civilization.ReligionState
import com.unciv.logic.civilization.diplomacy.DiplomacyFlags
import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers
import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
@ -15,9 +21,20 @@ import com.unciv.logic.civilization.diplomacy.RelationshipLevel
import com.unciv.logic.map.BFS
import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo
import com.unciv.logic.trade.*
import com.unciv.logic.trade.Trade
import com.unciv.logic.trade.TradeEvaluation
import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeRequest
import com.unciv.logic.trade.TradeType
import com.unciv.models.Counter
import com.unciv.models.ruleset.*
import com.unciv.models.ruleset.Belief
import com.unciv.models.ruleset.BeliefType
import com.unciv.models.ruleset.MilestoneType
import com.unciv.models.ruleset.ModOptionsConstants
import com.unciv.models.ruleset.Policy
import com.unciv.models.ruleset.PolicyBranch
import com.unciv.models.ruleset.Victory
import com.unciv.models.ruleset.tech.Technology
import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.unique.UniqueType
@ -135,10 +152,10 @@ object NextTurnAutomation {
val counterofferGifts = ArrayList<TradeOffer>()
for (offer in tradeLogic.theirAvailableOffers) {
if (offer.type == TradeType.Gold && tradeRequest.trade.ourOffers.any { it.type == TradeType.Gold } ||
offer.type == TradeType.Gold_Per_Turn && tradeRequest.trade.ourOffers.any { it.type == TradeType.Gold_Per_Turn })
if ((offer.type == TradeType.Gold || offer.type == TradeType.Gold_Per_Turn)
&& tradeRequest.trade.ourOffers.any { it.type == offer.type })
continue // Don't want to counteroffer straight gold for gold, that's silly
if (offer.amount == 0)
if (!offer.isTradable())
continue // For example resources gained by trade or CS
if (offer.type == TradeType.City)
continue // Players generally don't want to give up their cities, and they might misclick
@ -203,7 +220,7 @@ object NextTurnAutomation {
delta = (delta * 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
for (ourGold in tradeLogic.ourAvailableOffers
.filter { it.type == TradeType.Gold || it.type == TradeType.Gold_Per_Turn }
.filter { it.isTradable() && (it.type == TradeType.Gold || it.type == TradeType.Gold_Per_Turn) }
.sortedByDescending { it.type.ordinal }) {
if (tradeLogic.currentTrade.theirOffers.none { it.type == ourGold.type } &&
counterofferAsks.keys.none { it.type == ourGold.type } ) {

View File

@ -3,10 +3,10 @@ package com.unciv.logic.trade
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.trade.TradeType.TradeTypeNumberType
import com.unciv.models.ruleset.Speed
import com.unciv.models.translations.tr
import com.unciv.ui.utils.Fonts
import com.unciv.logic.trade.TradeType.TradeTypeNumberType
data class TradeOffer(val name: String, val type: TradeType, var amount: Int = 1, var duration: Int) : IsPartOfGameInfoSerialization {
@ -32,6 +32,8 @@ data class TradeOffer(val name: String, val type: TradeType, var amount: Int = 1
&& offer.amount == amount
}
fun isTradable() = amount > 0
fun getOfferText(untradable: Int = 0): String {
var offerText = when(type){
TradeType.WarDeclaration -> "Declare war on [$name]"

View File

@ -104,7 +104,8 @@ class OffersListScroll(
val amountPerClick =
if (offer.type == Gold) 50
else 1
if (offer.amount > 0 && offer.name != Constants.peaceTreaty && // can't disable peace treaty!
if (offer.isTradable() && offer.name != Constants.peaceTreaty && // can't disable peace treaty!
offer.name != Constants.researchAgreement) {
// highlight unique suggestions