From 5cf05cd7d99c8ca9569ab25d986705d2fa7f4288 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 20 Jun 2019 20:40:23 +0300 Subject: [PATCH] AI now saves up money to use for purchasing city-state influence --- .../logic/automation/NextTurnAutomation.kt | 39 +++++++++++++++++-- .../logic/civilization/CivilizationInfo.kt | 7 ++++ core/src/com/unciv/ui/EmpireOverviewScreen.kt | 2 +- .../src/com/unciv/ui/trade/DiplomacyScreen.kt | 12 ++---- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 36563a2984..8a1eada92a 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -32,7 +32,7 @@ class NextTurnAutomation{ updateDiplomaticRelationship(civInfo) declareWar(civInfo) automateCityBombardment(civInfo) - buyBuildingOrUnit(civInfo) + useGold(civInfo) automateUnits(civInfo) reassignWorkedTiles(civInfo) trainSettler(civInfo) @@ -51,9 +51,42 @@ class NextTurnAutomation{ } } + private fun tryGainInfluence(civInfo: CivilizationInfo, cityState:CivilizationInfo){ + if(civInfo.gold<250) return // save up + if(cityState.getDiplomacyManager(civInfo).influence<20){ + civInfo.giveGoldGift(cityState,250) + return + } + if(civInfo.gold<500) return // it's not worth it to invest now, wait until you have enough for 2 + civInfo.giveGoldGift(cityState,500) + return + } + + /** allow AI to spend money to purchase city-state friendship, buildings & unit */ + private fun useGold(civInfo: CivilizationInfo) { + if(civInfo.victoryType()==VictoryType.Cultural){ + for(cityState in civInfo.gameInfo.civilizations + .filter { it.isCityState() && it.getCityStateType()==CityStateType.Cultured }){ + val diploManager = cityState.getDiplomacyManager(civInfo) + if(diploManager.influence < 40){ // we want to gain influence with them + tryGainInfluence(civInfo,cityState) + return + } + } + } + + if(civInfo.happiness < 5){ + for(cityState in civInfo.gameInfo.civilizations + .filter { it.isCityState() && it.getCityStateType()==CityStateType.Mercantile }){ + val diploManager = cityState.getDiplomacyManager(civInfo) + if(diploManager.influence < 40){ // we want to gain influence with them + tryGainInfluence(civInfo,cityState) + return + } + } + } + - private fun buyBuildingOrUnit(civInfo: CivilizationInfo) { - //allow AI spending money to purchase building & unit for (city in civInfo.cities.sortedByDescending{ it.population.population }) { val construction = city.cityConstructions.getCurrentConstruction() if (construction.canBePurchased() diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 1e2d4e9e0e..419760e762 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -599,5 +599,12 @@ class CivilizationInfo { } } + fun giveGoldGift(otherCiv: CivilizationInfo, giftAmount: Int) { + if(!otherCiv.isCityState()) throw Exception("You can only gain influence with city states!") + val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() + currentPlayerCiv.gold -= giftAmount + otherCiv.getDiplomacyManager(currentPlayerCiv).influence += giftAmount/10 + } + //endregion } diff --git a/core/src/com/unciv/ui/EmpireOverviewScreen.kt b/core/src/com/unciv/ui/EmpireOverviewScreen.kt index 82c590e67c..a223e39608 100644 --- a/core/src/com/unciv/ui/EmpireOverviewScreen.kt +++ b/core/src/com/unciv/ui/EmpireOverviewScreen.kt @@ -58,7 +58,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ val setCurrentTradesButton = TextButton("Trades".tr(),skin) setCurrentTradesButton.onClick { centerTable.clear() - centerTable.add(ScrollPane(getTradesTable())).height(stage.height*0.8f) // so it doesn't cover the naviagation buttons + centerTable.add(ScrollPane(getTradesTable())).height(stage.height*0.8f) // so it doesn't cover the navigation buttons centerTable.pack() } topTable.add(setCurrentTradesButton) diff --git a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt index 0a0b990c70..bc62a14518 100644 --- a/core/src/com/unciv/ui/trade/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/trade/DiplomacyScreen.kt @@ -85,13 +85,6 @@ class DiplomacyScreen:CameraStageBaseScreen() { return tradeTable } - fun giveGoldGift(otherCiv: CivilizationInfo, giftAmount: Int) { - if(!otherCiv.isCityState()) throw Exception("You can only gain influence with city states!") - val currentPlayerCiv = UnCivGame.Current.gameInfo.getCurrentPlayerCivilization() - currentPlayerCiv.gold -= giftAmount - otherCiv.getDiplomacyManager(currentPlayerCiv).influence += giftAmount/10 - updateRightSide(otherCiv) - } private fun getCityStateDiplomacyTable(otherCiv: CivilizationInfo): Table { @@ -131,7 +124,10 @@ class DiplomacyScreen:CameraStageBaseScreen() { val giftAmount = 250 val influenceAmount = giftAmount/10 val giftButton = TextButton("Gift [$giftAmount] gold (+[$influenceAmount] influence)".tr(), skin) - giftButton.onClick{ giveGoldGift(otherCiv,giftAmount ) } + giftButton.onClick{ + currentPlayerCiv.giveGoldGift(otherCiv,giftAmount) + updateRightSide(otherCiv) + } diplomacyTable.add(giftButton).row() if (currentPlayerCiv.gold < giftAmount ) giftButton.disable()