Fixed crash entering trade from overview on other player's turn

When entering trade from overview when other player's turn (multiplayer), no longer takes "current player" as trade partner, instead takes "viewing civ"
This commit is contained in:
Yair Morgenstern 2024-03-15 11:02:34 +02:00
parent 307b717006
commit 16f506cdd6
2 changed files with 13 additions and 14 deletions

View File

@ -5,7 +5,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.SplitPane
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.Align
import com.unciv.Constants
import com.unciv.GUI import com.unciv.GUI
import com.unciv.UncivGame import com.unciv.UncivGame
import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.Civilization
@ -211,9 +210,9 @@ class DiplomacyScreen(
//region Major Civ Diplomacy //region Major Civ Diplomacy
internal fun setTrade(civ: Civilization): TradeTable { internal fun setTrade(otherCiv: Civilization): TradeTable {
rightSideTable.clear() rightSideTable.clear()
val tradeTable = TradeTable(civ, this) val tradeTable = TradeTable(viewingCiv, otherCiv, this)
rightSideTable.add(tradeTable) rightSideTable.add(tradeTable)
return tradeTable return tradeTable
} }

View File

@ -13,23 +13,23 @@ import com.unciv.ui.components.input.onClick
import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.basescreen.BaseScreen
class TradeTable( class TradeTable(
private val civ: Civilization,
private val otherCivilization: Civilization, private val otherCivilization: Civilization,
diplomacyScreen: DiplomacyScreen diplomacyScreen: DiplomacyScreen
): Table(BaseScreen.skin) { ): Table(BaseScreen.skin) {
private val currentPlayerCiv = otherCivilization.gameInfo.getCurrentPlayerCivilization() internal val tradeLogic = TradeLogic(civ, otherCivilization)
internal val tradeLogic = TradeLogic(currentPlayerCiv, otherCivilization) internal val offerColumnsTable = OfferColumnsTable(tradeLogic, diplomacyScreen , civ, otherCivilization) { onChange() }
internal val offerColumnsTable = OfferColumnsTable(tradeLogic, diplomacyScreen , currentPlayerCiv, otherCivilization) { onChange() }
// This is so that after a trade has been traded, we can switch out the offersToDisplay to start anew - this is the easiest way // This is so that after a trade has been traded, we can switch out the offersToDisplay to start anew - this is the easiest way
private val offerColumnsTableWrapper = Table() private val offerColumnsTableWrapper = Table()
val offerTradeText = "{Offer trade}\n({They'll decide on their turn})" val offerTradeText = "{Offer trade}\n({They'll decide on their turn})"
private val offerButton = offerTradeText.toTextButton() private val offerButton = offerTradeText.toTextButton()
private fun isTradeOffered() = otherCivilization.tradeRequests.any { it.requestingCiv == currentPlayerCiv.civName } private fun isTradeOffered() = otherCivilization.tradeRequests.any { it.requestingCiv == civ.civName }
private fun retractOffer() { private fun retractOffer() {
otherCivilization.tradeRequests.removeAll { it.requestingCiv == currentPlayerCiv.civName } otherCivilization.tradeRequests.removeAll { it.requestingCiv == civ.civName }
currentPlayerCiv.cache.updateCivResources() civ.cache.updateCivResources()
offerButton.setText(offerTradeText.tr()) offerButton.setText(offerTradeText.tr())
} }
@ -39,7 +39,7 @@ class TradeTable(
val lowerTable = Table().apply { defaults().pad(10f) } val lowerTable = Table().apply { defaults().pad(10f) }
val existingOffer = otherCivilization.tradeRequests.firstOrNull { it.requestingCiv == currentPlayerCiv.civName } val existingOffer = otherCivilization.tradeRequests.firstOrNull { it.requestingCiv == civ.civName }
if (existingOffer != null) { if (existingOffer != null) {
tradeLogic.currentTrade.set(existingOffer.trade.reverse()) tradeLogic.currentTrade.set(existingOffer.trade.reverse())
offerColumnsTable.update() offerColumnsTable.update()
@ -57,10 +57,10 @@ class TradeTable(
// If not lets add an extra gold offer to satisfy this. // If not lets add an extra gold offer to satisfy this.
// 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 = currentPlayerCiv.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 == TradeType.Gold }?.amount ?: 0
val otherCivOfferedGold = tradeLogic.currentTrade.theirOffers.firstOrNull { it.type == TradeType.Gold }?.amount ?: 0 val otherCivOfferedGold = tradeLogic.currentTrade.theirOffers.firstOrNull { it.type == TradeType.Gold }?.amount ?: 0
val newCurrentPlayerGold = currentPlayerCiv.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) {
@ -74,8 +74,8 @@ class TradeTable(
} }
} }
otherCivilization.tradeRequests.add(TradeRequest(currentPlayerCiv.civName, tradeLogic.currentTrade.reverse())) otherCivilization.tradeRequests.add(TradeRequest(civ.civName, tradeLogic.currentTrade.reverse()))
currentPlayerCiv.cache.updateCivResources() civ.cache.updateCivResources()
offerButton.setText("Retract offer".tr()) offerButton.setText("Retract offer".tr())
} }