From 82c42e85285c0e08608dac5193a243db13729e24 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 30 Jul 2018 13:30:13 +0300 Subject: [PATCH] Trade classes re now separate files --- android/assets/OtherIcons/Railroad.png | Bin 1506 -> 932 bytes .../unciv/logic/automation/UnitAutomation.kt | 2 +- .../logic/civilization/CivilizationInfo.kt | 7 + .../logic/civilization/DiplomacyManager.kt | 10 +- core/src/com/unciv/logic/trade/OffersList.kt | 44 ++++++ core/src/com/unciv/logic/trade/Trade.kt | 27 ++++ .../com/unciv/logic/trade/TradeOffersList.kt | 17 +++ core/src/com/unciv/logic/trade/TradeType.kt | 11 ++ core/src/com/unciv/ui/EmpireOverviewScreen.kt | 3 +- core/src/com/unciv/ui/TradeScreen.kt | 126 +++++------------- 10 files changed, 146 insertions(+), 101 deletions(-) create mode 100644 core/src/com/unciv/logic/trade/OffersList.kt create mode 100644 core/src/com/unciv/logic/trade/Trade.kt create mode 100644 core/src/com/unciv/logic/trade/TradeOffersList.kt create mode 100644 core/src/com/unciv/logic/trade/TradeType.kt diff --git a/android/assets/OtherIcons/Railroad.png b/android/assets/OtherIcons/Railroad.png index f3e980d295c84e0dc8d64f9a9258e1390cc51d48..c932d8f3d84388756fcc880903f9eefac3371690 100644 GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yu@pObhHwBu4M$1`kk42gEakt5%>1)-Y(%l z3AP6-c1PTds9-MJc5RXQf~gPq!_2bYZtb{rx@l1dN7CwR+p5^J6Vn$zcwb(YcJhtd z&u2bnjOpJiAEf#veNue0Cr#ab1}D%e5>%VVLQkP7t+#LCJ&+~~<{>q=zN{VMZ zJ8N-GZu(c_O&4{7pPKHUoqB4|&oJBd-=4?$ZIEhDz1Pz$_9Xm?%M;Hhv6YJ+hdoK! zJSWHPRQB%~=3CEII{P13Y?S}>6#tSxs_);~+JBvF z@ms+e&W;KT6($4-cxZ5_h_DDb?~~Wty~TW%YR|3i6Iat_N(W826&oedysEg~!|{~b zl|>-V)_3dDcW*IZYc9VYyTmzZX8gtn1}m(-x7Re~Y@^$GqHHc#}P_^w*c z-Rq>Ci``UpD?OKUrl;p#zq;eH+*#xG$BaIo`g(lziQ9ACv!Cq`_n&$Fef@m%!>(2! zS8y?LvNpCfIXIy@j&k9)J56tko_H3-amER|xx9+dv(e&8)@!`re&c)wMiU2bUd^+!;nw;4 z(q3HG`C8dMoAUz0?(mfF_8-#c_Sfz_(erCw>aQ&?YI~UF^lcd}(z#Mz z`*y##-1~dszW<8ronJ3Z-gm5+wQg4D5D~$K<{aJSXY}%n(&T$_MlY3h zuTAr*@>Z)|ay08CQ1|7F*>n43%QM?W+uzAvF61+H>t^g`Wk;!vOvFbBR(k6Q5>(Bf$Q7qeAZLjKN zyGu!1LAqbQ*y?w@Z}*nNUC!V8URtzEEk4>b2_7H9GfQTcs6E>k9r3$*f}+t&&n*$w z`jhvZdbs9W)QKgZ!`39uzW(hk&pd^I0Bop0Ec?CZI&~G5$>((LACFvfd%DjrkM6Bs zA6^o+Fb4TQ%v&v1ZEj!O>ykG+ysg(*l)RtOSG>Y7N=HLeKtn@7BVx&Rvx%P5J=2rk z?QY$=pIuUE@;sOBt;&=2CZFRZY`MQ$t-spbHlM2MlS}%yL_{0C)CGmWYE__qKlk;e zR%LgV%7)48D)%{Vc|}53YzidKbS_2D2F0ea;rF|TZryL@nds@i=;$qwL!Pr-+i*7f zcNv>M*nL1Jq9Kd!t?HBasZaKER@=Kb<&t~U8laWHROQiqbrMkj^2IbtR<|a5-k#B>+Q)U?@undJb@ZX%f_)RPVJ{k`*ySWBJ-=~9=3Mje_Hs;{`A6{zpGCyDdxW_ z{N#ezN9SK!`E^Y#_PtA8Uo8)>Pj6 x!u;%?$EU|dmuLM@JbC{k^Fv5E$ Unit) : ScrollPane(null) { + val table= Table(CameraStageBaseScreen.skin).apply { defaults().pad(5f) } + init { + update() + } + + + fun update() { + table.clear() + for(offer in offers.sortedBy { it.type }) { + var buttonText = offer.name + if(offer.type !in listOf(TradeType.Technology, TradeType.City)) buttonText+=" ("+offer.amount+")" + if(offer.duration>1) buttonText+="\n"+offer.duration+" {turns}".tr() + val tb = TextButton(buttonText, CameraStageBaseScreen.skin) + val amountPerClick = + if(offer.type== TradeType.Gold) 50 + else 1 + if(offer.amount>0) + tb.addClickListener { + val amountTransferred = min(amountPerClick, offer.amount) + offers += offer.copy(amount = -amountTransferred) + correspondingOffers += offer.copy(amount = amountTransferred) + onChange() + update() + } + else tb.disable() // for instance we have negative gold + table.add(tb).row() + } + widget = table + } + +} \ No newline at end of file diff --git a/core/src/com/unciv/logic/trade/Trade.kt b/core/src/com/unciv/logic/trade/Trade.kt new file mode 100644 index 0000000000..eefa0d5595 --- /dev/null +++ b/core/src/com/unciv/logic/trade/Trade.kt @@ -0,0 +1,27 @@ +package com.unciv.logic.trade + +class Trade{ + fun reverse(): Trade { + val newTrade = Trade() + newTrade.theirOffers+=ourOffers.map { it.copy() } + newTrade.ourOffers+=theirOffers.map { it.copy() } + return newTrade + } + + + val theirOffers = TradeOffersList() + val ourOffers = TradeOffersList() + + fun equals(trade: Trade):Boolean{ + if(trade.ourOffers.size!=ourOffers.size + || trade.theirOffers.size!=theirOffers.size) return false + + for(offer in trade.ourOffers) + if(ourOffers.none { it.equals(offer)}) + return false + for(offer in trade.theirOffers) + if(theirOffers.none { it.equals(offer)}) + return false + return true + } +} \ No newline at end of file diff --git a/core/src/com/unciv/logic/trade/TradeOffersList.kt b/core/src/com/unciv/logic/trade/TradeOffersList.kt new file mode 100644 index 0000000000..8f8fb6ad2e --- /dev/null +++ b/core/src/com/unciv/logic/trade/TradeOffersList.kt @@ -0,0 +1,17 @@ +package com.unciv.logic.trade + +import com.unciv.ui.TradeOffer +import java.util.* + +class TradeOffersList: ArrayList(){ + override fun add(element: TradeOffer): Boolean { + val equivalentOffer = firstOrNull { it.name==element.name&&it.type==element.type } + if(equivalentOffer==null){ + super.add(element) + return true + } + equivalentOffer.amount += element.amount + if(equivalentOffer.amount==0) remove(equivalentOffer) + return true + } +} \ No newline at end of file diff --git a/core/src/com/unciv/logic/trade/TradeType.kt b/core/src/com/unciv/logic/trade/TradeType.kt new file mode 100644 index 0000000000..15922415ed --- /dev/null +++ b/core/src/com/unciv/logic/trade/TradeType.kt @@ -0,0 +1,11 @@ +package com.unciv.logic.trade + +enum class TradeType{ + Luxury_Resource, + Strategic_Resource, + Gold, + Gold_Per_Turn, + City, + Technology, + Treaty +} \ No newline at end of file diff --git a/core/src/com/unciv/ui/EmpireOverviewScreen.kt b/core/src/com/unciv/ui/EmpireOverviewScreen.kt index 3c5ac89f36..9b69b75da9 100644 --- a/core/src/com/unciv/ui/EmpireOverviewScreen.kt +++ b/core/src/com/unciv/ui/EmpireOverviewScreen.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.utils.Align import com.unciv.UnCivGame +import com.unciv.logic.trade.Trade import com.unciv.ui.utils.* import kotlin.math.max import kotlin.math.roundToInt @@ -79,7 +80,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ return tradesTable } - private fun createTradeTable(trade:Trade, civName:String): Table { + private fun createTradeTable(trade: Trade, civName:String): Table { val table = Table(skin) table.background = ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK,0.5f)) table.defaults().pad(10f) diff --git a/core/src/com/unciv/ui/TradeScreen.kt b/core/src/com/unciv/ui/TradeScreen.kt index fde0c20424..8421254945 100644 --- a/core/src/com/unciv/ui/TradeScreen.kt +++ b/core/src/com/unciv/ui/TradeScreen.kt @@ -1,28 +1,22 @@ package com.unciv.ui import com.badlogic.gdx.scenes.scene2d.ui.Label -import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.UnCivGame import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.logic.trade.OffersList +import com.unciv.logic.trade.Trade +import com.unciv.logic.trade.TradeOffersList +import com.unciv.logic.trade.TradeType +import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.ui.utils.* -import java.util.* -import kotlin.math.min -enum class TradeType{ - Luxury_Resource, - Strategic_Resource, - Gold, - Gold_Per_Turn, - City -} +data class TradeOffer(var name:String, var type: TradeType, var duration:Int, var amount:Int) { -data class TradeOffer(var name:String, var type:TradeType, var duration:Int, var amount:Int) { - - constructor() : this("",TradeType.Gold,0,0) // so that the json deserializer can work + constructor() : this("", TradeType.Gold,0,0) // so that the json deserializer can work fun equals(offer:TradeOffer): Boolean { return offer.name==name @@ -31,50 +25,12 @@ data class TradeOffer(var name:String, var type:TradeType, var duration:Int, var } } -class TradeOffersList:ArrayList(){ - override fun add(element: TradeOffer): Boolean { - val equivalentOffer = firstOrNull { it.name==element.name&&it.type==element.type } - if(equivalentOffer==null){ - super.add(element) - return true - } - equivalentOffer.amount += element.amount - if(equivalentOffer.amount==0) remove(equivalentOffer) - return true - } -} - -class Trade{ - fun reverse(): Trade { - val newTrade = Trade() - newTrade.theirOffers+=ourOffers.map { it.copy() } - newTrade.ourOffers+=theirOffers.map { it.copy() } - return newTrade - } - - val theirOffers = TradeOffersList() - val ourOffers = TradeOffersList() - - fun equals(trade:Trade):Boolean{ - if(trade.ourOffers.size!=ourOffers.size - || trade.theirOffers.size!=theirOffers.size) return false - - for(offer in trade.ourOffers) - if(ourOffers.none { it.equals(offer)}) - return false - for(offer in trade.theirOffers) - if(theirOffers.none { it.equals(offer)}) - return false - return true - } -} - class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScreen(){ val civInfo = UnCivGame.Current.gameInfo.getPlayerCivilization() - val ourAvailableOffers = getAvailableOffers(civInfo) - val theirAvailableOffers = getAvailableOffers(otherCivilization) + val ourAvailableOffers = getAvailableOffers(civInfo,otherCivilization) + val theirAvailableOffers = getAvailableOffers(otherCivilization,civInfo) val currentTrade = Trade() val table = Table(skin) @@ -88,10 +44,10 @@ class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScre tradeText.setText("What do you have in mind?".tr()) } - val ourAvailableOffersTable = OffersList(ourAvailableOffers, currentTrade.ourOffers) {onChange()} - val ourOffersTable = OffersList(currentTrade.ourOffers, ourAvailableOffers) {onChange()} - val theirOffersTable = OffersList(currentTrade.theirOffers, theirAvailableOffers) {onChange()} - val theirAvailableOffersTable = OffersList(theirAvailableOffers, currentTrade.theirOffers) {onChange()} + val ourAvailableOffersTable = OffersList(ourAvailableOffers, currentTrade.ourOffers) { onChange() } + val ourOffersTable = OffersList(currentTrade.ourOffers, ourAvailableOffers) { onChange() } + val theirOffersTable = OffersList(currentTrade.theirOffers, theirAvailableOffers) { onChange() } + val theirAvailableOffersTable = OffersList(theirAvailableOffers, currentTrade.theirOffers) { onChange() } init { val closeButton = TextButton("Close".tr(), skin) @@ -123,16 +79,22 @@ class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScre // instant transfers for(offer in currentTrade.theirOffers){ - if(offer.type==TradeType.Gold){ + if(offer.type== TradeType.Gold){ civInfo.gold += offer.amount otherCivilization.gold -= offer.amount } + if(offer.type== TradeType.Technology){ + civInfo.tech.techsResearched.add(offer.name) + } } for(offer in currentTrade.ourOffers){ - if(offer.type==TradeType.Gold){ + if(offer.type== TradeType.Gold){ civInfo.gold -= offer.amount otherCivilization.gold += offer.amount } + if(offer.type== TradeType.Technology){ + otherCivilization.tech.techsResearched.add(offer.name) + } } val newTradeScreen = TradeScreen(otherCivilization) @@ -171,19 +133,24 @@ class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScre theirOffersTable.update() } - fun getAvailableOffers(civInfo: CivilizationInfo): TradeOffersList { + fun getAvailableOffers(civInfo: CivilizationInfo, otherCivilization: CivilizationInfo): TradeOffersList { val offers = TradeOffersList() for(entry in civInfo.getCivResources().filterNot { it.key.resourceType == ResourceType.Bonus }) { val resourceTradeType = if(entry.key.resourceType==ResourceType.Luxury) TradeType.Luxury_Resource else TradeType.Strategic_Resource offers.add(TradeOffer(entry.key.name, resourceTradeType, 30, entry.value)) } - offers.add(TradeOffer("Gold".tr(),TradeType.Gold,0,civInfo.gold)) - offers.add(TradeOffer("Gold per turn".tr(),TradeType.Gold_Per_Turn,30,civInfo.getStatsForNextTurn().gold.toInt())) + for(entry in civInfo.tech.techsResearched + .filterNot { otherCivilization.tech.isResearched(it) } + .filter { otherCivilization.tech.canBeResearched(it) }){ + offers.add(TradeOffer(entry, TradeType.Technology,0,1)) + } + offers.add(TradeOffer("Gold".tr(), TradeType.Gold,0,civInfo.gold)) + offers.add(TradeOffer("Gold per turn".tr(), TradeType.Gold_Per_Turn,30,civInfo.getStatsForNextTurn().gold.toInt())) return offers } - fun isTradeAcceptable(trade:Trade): Boolean { + fun isTradeAcceptable(trade: Trade): Boolean { val sumOfTheirOffers = trade.theirOffers.map { evaluateOffer(it,false) }.sum() val sumOfOurOffers = trade.ourOffers.map { evaluateOffer(it,true)}.sum() return sumOfOurOffers >= sumOfTheirOffers @@ -199,6 +166,7 @@ class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScre value += 400 return value } + TradeType.Technology -> return GameBasics.Technologies[offer.name]!!.cost // gold cost is science cost TradeType.Strategic_Resource -> return 50 * offer.amount // Dunno what this is? else -> return 1000 @@ -206,35 +174,3 @@ class TradeScreen(val otherCivilization: CivilizationInfo) : CameraStageBaseScre } } -class OffersList(val offers: TradeOffersList, val correspondingOffers: TradeOffersList, - val onChange: () -> Unit) : ScrollPane(null) { - val table= Table(CameraStageBaseScreen.skin).apply { defaults().pad(5f) } - init { - update() - } - - - fun update() { - table.clear() - for(offer in offers.sortedBy { it.type }) { - var buttonText = offer.name+" ("+offer.amount+")" - if(offer.duration>1) buttonText+="\n"+offer.duration+" {turns}".tr() - val tb = TextButton(buttonText, CameraStageBaseScreen.skin) - val amountPerClick = - if(offer.type==TradeType.Gold) 50 - else 1 - if(offer.amount>0) - tb.addClickListener { - val amountTransferred = min(amountPerClick, offer.amount) - offers += offer.copy(amount = -amountTransferred) - correspondingOffers += offer.copy(amount = amountTransferred) - onChange() - update() - } - else tb.disable() // for instance we have negative gold - table.add(tb).row() - } - widget = table - } - -} \ No newline at end of file