Resolved #12245 - Cannot have 2 research agreements at once due to counteroffers

This commit is contained in:
yairm210 2024-09-28 21:57:36 +03:00
parent f65f869836
commit a905ddebcb
4 changed files with 26 additions and 12 deletions

View File

@ -42,11 +42,15 @@ object Constants {
const val barbarianEncampment = "Barbarian encampment" const val barbarianEncampment = "Barbarian encampment"
const val cityCenter = "City center" const val cityCenter = "City center"
// Treaties
const val peaceTreaty = "Peace Treaty" const val peaceTreaty = "Peace Treaty"
const val researchAgreement = "Research Agreement" const val researchAgreement = "Research Agreement"
const val openBorders = "Open Borders"
const val defensivePact = "Defensive Pact" const val defensivePact = "Defensive Pact"
// Agreements
const val openBorders = "Open Borders"
/** Used as origin in StatMap or ResourceSupplyList, or the toggle button in DiplomacyOverviewTab */ /** Used as origin in StatMap or ResourceSupplyList, or the toggle button in DiplomacyOverviewTab */
const val cityStates = "City-States" const val cityStates = "City-States"
/** Used as origin in ResourceSupplyList */ /** Used as origin in ResourceSupplyList */
@ -105,7 +109,7 @@ object Constants {
const val defaultSkin = "Minimal" const val defaultSkin = "Minimal"
/** /**
* Use this to determine whether a [MapUnit][com.unciv.logic.map.MapUnit]'s movement is exhausted * Use this to determine whether a [MapUnit][com.unciv.logic.map.mapunit.MapUnit]'s movement is exhausted
* (currentMovement <= this) if and only if a fuzzy comparison is needed to account for Float rounding errors. * (currentMovement <= this) if and only if a fuzzy comparison is needed to account for Float rounding errors.
* _Most_ checks do compare to 0! * _Most_ checks do compare to 0!
*/ */

View File

@ -117,7 +117,7 @@ object DiplomacyAutomation {
&& it.hasUnique(UniqueType.EnablesOpenBorders) && it.hasUnique(UniqueType.EnablesOpenBorders)
&& !civInfo.getDiplomacyManager(it)!!.hasOpenBorders && !civInfo.getDiplomacyManager(it)!!.hasOpenBorders
&& !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedOpenBorders) && !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedOpenBorders)
&& !isTradeBeingOffered(civInfo, it, Constants.openBorders) && !areWeOfferingTrade(civInfo, it, Constants.openBorders)
}.sortedByDescending { it.getDiplomacyManager(civInfo)!!.relationshipLevel() }.toList() }.sortedByDescending { it.getDiplomacyManager(civInfo)!!.relationshipLevel() }.toList()
for (otherCiv in civsThatWeCanOpenBordersWith) { for (otherCiv in civsThatWeCanOpenBordersWith) {
@ -159,7 +159,7 @@ object DiplomacyAutomation {
.filter { .filter {
civInfo.diplomacyFunctions.canSignResearchAgreementsWith(it) civInfo.diplomacyFunctions.canSignResearchAgreementsWith(it)
&& !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedResearchAgreement) && !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedResearchAgreement)
&& !isTradeBeingOffered(civInfo, it, Constants.researchAgreement) && !areWeOfferingTrade(civInfo, it, Constants.researchAgreement)
} }
.sortedByDescending { it.stats.statsForNextTurn.science } .sortedByDescending { it.stats.statsForNextTurn.science }
@ -183,7 +183,7 @@ object DiplomacyAutomation {
civInfo.diplomacyFunctions.canSignDefensivePactWith(it) civInfo.diplomacyFunctions.canSignDefensivePactWith(it)
&& !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedDefensivePact) && !civInfo.getDiplomacyManager(it)!!.hasFlag(DiplomacyFlags.DeclinedDefensivePact)
&& civInfo.getDiplomacyManager(it)!!.opinionOfOtherCiv() < 70f * civInfo.getPersonality().inverseModifierFocus(PersonalityValue.Aggressive, .2f) && civInfo.getDiplomacyManager(it)!!.opinionOfOtherCiv() < 70f * civInfo.getPersonality().inverseModifierFocus(PersonalityValue.Aggressive, .2f)
&& !isTradeBeingOffered(civInfo, it, Constants.defensivePact) && !areWeOfferingTrade(civInfo, it, Constants.defensivePact)
} }
for (otherCiv in canSignDefensivePactCiv) { for (otherCiv in canSignDefensivePactCiv) {
@ -370,10 +370,9 @@ object DiplomacyAutomation {
} }
} }
private fun isTradeBeingOffered(civInfo: Civilization, otherCiv: Civilization, offerName: String): Boolean { private fun areWeOfferingTrade(civInfo: Civilization, otherCiv: Civilization, offerName: String): Boolean {
return civInfo.tradeRequests.filter { request -> request.requestingCiv == otherCiv.civName } return otherCiv.tradeRequests.filter { request -> request.requestingCiv == civInfo.civName }
.any { trade -> trade.trade.ourOffers.any { offer -> offer.name == offerName } } .any { trade -> trade.trade.ourOffers.any { offer -> offer.name == offerName }
|| civInfo.tradeRequests.filter { request -> request.requestingCiv == otherCiv.civName } || trade.trade.theirOffers.any { offer -> offer.name == offerName } }
.any { trade -> trade.trade.theirOffers.any { offer -> offer.name == offerName } }
} }
} }

View File

@ -54,10 +54,12 @@ object NextTurnAutomation {
if (civInfo.gameInfo.isReligionEnabled()) { if (civInfo.gameInfo.isReligionEnabled()) {
ReligionAutomation.spendFaithOnReligion(civInfo) ReligionAutomation.spendFaithOnReligion(civInfo)
} }
DiplomacyAutomation.offerOpenBorders(civInfo) DiplomacyAutomation.offerOpenBorders(civInfo)
DiplomacyAutomation.offerResearchAgreement(civInfo) DiplomacyAutomation.offerResearchAgreement(civInfo)
DiplomacyAutomation.offerDefensivePact(civInfo) DiplomacyAutomation.offerDefensivePact(civInfo)
TradeAutomation.exchangeLuxuries(civInfo) TradeAutomation.exchangeLuxuries(civInfo)
issueRequests(civInfo) issueRequests(civInfo)
adoptPolicy(civInfo) // todo can take a second - why? adoptPolicy(civInfo) // todo can take a second - why?
freeUpSpaceResources(civInfo) freeUpSpaceResources(civInfo)

View File

@ -48,7 +48,16 @@ class TradeEvaluation {
return when (tradeOffer.type) { return when (tradeOffer.type) {
TradeOfferType.Gold -> true // even if they go negative it's okay TradeOfferType.Gold -> true // even if they go negative it's okay
TradeOfferType.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
TradeOfferType.Treaty -> true TradeOfferType.Treaty -> {
// Current automation should prevent these from being offered anyway,
// these are a safeguard against future automation changes
when (tradeOffer.name) {
Constants.peaceTreaty -> offerer.isAtWarWith(tradePartner)
Constants.researchAgreement -> !offerer.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.ResearchAgreement)
Constants.defensivePact -> !offerer.getDiplomacyManager(tradePartner)!!.hasFlag(DiplomacyFlags.DefensivePact)
else -> true // potentional future treaties
}
}
TradeOfferType.Agreement -> true TradeOfferType.Agreement -> true
TradeOfferType.Luxury_Resource -> hasResource(tradeOffer) TradeOfferType.Luxury_Resource -> hasResource(tradeOffer)
TradeOfferType.Strategic_Resource -> hasResource(tradeOffer) TradeOfferType.Strategic_Resource -> hasResource(tradeOffer)