DiplomacyManager.flagsCountdown is now a Hashmap<String, Int> because of deserialization bullshit

Solved a silly bug in the Diplomacy overview
This commit is contained in:
Yair Morgenstern 2019-04-29 00:25:02 +03:00
parent c8ea9f1a27
commit 2b8946f5e7
4 changed files with 33 additions and 20 deletions

View File

@ -155,7 +155,7 @@ class NextTurnAutomation{
// B. have a way for the AI to keep track of the "pending offers" - see DiplomacyManager.resourcesFromTrade // B. have a way for the AI to keep track of the "pending offers" - see DiplomacyManager.resourcesFromTrade
for (otherCiv in knownCivs.filter { it.isPlayerCivilization() && !it.isAtWarWith(civInfo) for (otherCiv in knownCivs.filter { it.isPlayerCivilization() && !it.isAtWarWith(civInfo)
&& !civInfo.getDiplomacyManager(it).flagsCountdown.containsKey(DiplomacyFlags.DeclinedLuxExchange)}) { && !civInfo.getDiplomacyManager(it).flagsCountdown.containsKey(DiplomacyFlags.DeclinedLuxExchange.toString())}) {
val trades = potentialLuxuryTrades(civInfo,otherCiv) val trades = potentialLuxuryTrades(civInfo,otherCiv)
for(trade in trades){ for(trade in trades){
val tradeRequest = TradeRequest(civInfo.civName, trade.reverse()) val tradeRequest = TradeRequest(civInfo.civName, trade.reverse())
@ -189,7 +189,7 @@ class NextTurnAutomation{
val enemiesCiv = civInfo.diplomacy.filter{ it.value.diplomaticStatus == DiplomaticStatus.War } val enemiesCiv = civInfo.diplomacy.filter{ it.value.diplomaticStatus == DiplomaticStatus.War }
.map{ it.value.otherCiv() } .map{ it.value.otherCiv() }
.filterNot{ it == civInfo || it.isBarbarianCivilization() || it.cities.isEmpty() } .filterNot{ it == civInfo || it.isBarbarianCivilization() || it.cities.isEmpty() }
.filter { !civInfo.getDiplomacyManager(it).flagsCountdown.containsKey(DiplomacyFlags.DeclinedPeace) } .filter { !civInfo.getDiplomacyManager(it).flagsCountdown.containsKey(DiplomacyFlags.DeclinedPeace.toString()) }
for (enemy in enemiesCiv) { for (enemy in enemiesCiv) {
val enemiesStrength = Automation().evaluteCombatStrength(enemy) val enemiesStrength = Automation().evaluteCombatStrength(enemy)

View File

@ -24,8 +24,10 @@ class DiplomacyManager() {
lateinit var otherCivName:String lateinit var otherCivName:String
var trades = ArrayList<Trade>() var trades = ArrayList<Trade>()
var diplomaticStatus = DiplomaticStatus.War var diplomaticStatus = DiplomaticStatus.War
/** Contains various flags (declared war, promised to not settle, declined luxury trade) and the number of turns in which they will expire */ /** Contains various flags (declared war, promised to not settle, declined luxury trade) and the number of turns in which they will expire.
var flagsCountdown = HashMap<DiplomacyFlags,Int>() * The JSON serialize/deserialize REFUSES to deserialize hashmap keys as Enums, so I'm forced to use strings instead =(
* This is so sad Alexa play Despacito */
var flagsCountdown = HashMap<String,Int>()
fun clone(): DiplomacyManager { fun clone(): DiplomacyManager {
val toReturn = DiplomacyManager() val toReturn = DiplomacyManager()
@ -104,13 +106,23 @@ class DiplomacyManager() {
// for performance reasons we don't want to call this every time we want to see if a unit can move through a tile // for performance reasons we don't want to call this every time we want to see if a unit can move through a tile
fun updateHasOpenBorders(){ fun updateHasOpenBorders(){
hasOpenBorders=false var newHasOpenBorders = false
for(trade in trades) for(trade in trades) {
for(offer in trade.theirOffers) for (offer in trade.theirOffers)
if(offer.name=="Open Borders" && offer.duration > 0){ if (offer.name == "Open Borders" && offer.duration > 0) {
hasOpenBorders=true newHasOpenBorders = true
return break
} }
if(newHasOpenBorders) break
}
if(hasOpenBorders && !newHasOpenBorders){ // borders were closed, get out!
for(unit in civInfo.getCivUnits().filter { it.currentTile.getOwner()?.civName== otherCivName }){
unit.movementAlgs().teleportToClosestMoveableTile()
}
}
hasOpenBorders=newHasOpenBorders
} }
fun nextTurn(){ fun nextTurn(){
@ -157,8 +169,8 @@ class DiplomacyManager() {
otherCiv.popupAlerts.add(PopupAlert(AlertType.WarDeclaration,civInfo.civName)) otherCiv.popupAlerts.add(PopupAlert(AlertType.WarDeclaration,civInfo.civName))
/// AI won't propose peace for 10 turns /// AI won't propose peace for 10 turns
flagsCountdown[DiplomacyFlags.DeclinedPeace]=10 flagsCountdown[DiplomacyFlags.DeclinedPeace.toString()]=10
otherCiv.getDiplomacyManager(civInfo).flagsCountdown[DiplomacyFlags.DeclinedPeace]=10 otherCiv.getDiplomacyManager(civInfo).flagsCountdown[DiplomacyFlags.DeclinedPeace.toString()]=10
} }
//endregion //endregion
} }

View File

@ -285,7 +285,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){
} }
fun playerKnows(civ:CivilizationInfo) = civ.isPlayerCivilization() || fun playerKnows(civ:CivilizationInfo) = civ==currentPlayerCivInfo ||
currentPlayerCivInfo.diplomacy.containsKey(civ.civName) currentPlayerCivInfo.diplomacy.containsKey(civ.civName)
fun createDiplomacyGroup(): Group { fun createDiplomacyGroup(): Group {
@ -293,8 +293,8 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){
val groupSize = 500f val groupSize = 500f
val group = Group() val group = Group()
group.setSize(groupSize,groupSize) group.setSize(groupSize,groupSize)
val civGroups = HashMap<CivilizationInfo,Actor>() val civGroups = HashMap<String, Actor>()
for(i in 0 until relevantCivs.size){ for(i in 0..relevantCivs.lastIndex){
val civ = relevantCivs[i] val civ = relevantCivs[i]
@ -324,15 +324,15 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){
civGroup.center(group) civGroup.center(group)
civGroup.moveBy(vector.x*groupSize/3, vector.y*groupSize/3) civGroup.moveBy(vector.x*groupSize/3, vector.y*groupSize/3)
civGroups[civ]=civGroup civGroups[civ.civName]=civGroup
group.addActor(civGroup) group.addActor(civGroup)
} }
for(civ in relevantCivs.filter { playerKnows(it) && !it.isDefeated() }) for(civ in relevantCivs.filter { playerKnows(it) && !it.isDefeated() })
for(diplomacy in civ.diplomacy.values.filter { !it.otherCiv().isBarbarianCivilization() && playerKnows(it.otherCiv()) && !it.otherCiv().isDefeated()}){ for(diplomacy in civ.diplomacy.values.filter { !it.otherCiv().isBarbarianCivilization() && playerKnows(it.otherCiv()) && !it.otherCiv().isDefeated()}){
val civGroup = civGroups[civ]!! val civGroup = civGroups[civ.civName]!!
val otherCivGroup = civGroups[diplomacy.otherCiv()]!! val otherCivGroup = civGroups[diplomacy.otherCivName]!!
val statusLine = ImageGetter.getLine(civGroup.x+civGroup.width/2,civGroup.y+civGroup.height/2, val statusLine = ImageGetter.getLine(civGroup.x+civGroup.width/2,civGroup.y+civGroup.height/2,
otherCivGroup.x+otherCivGroup.width/2,otherCivGroup.y+otherCivGroup.height/2,3f) otherCivGroup.x+otherCivGroup.width/2,otherCivGroup.y+otherCivGroup.height/2,3f)

View File

@ -58,11 +58,12 @@ class TradePopup(worldScreen: WorldScreen): PopupTable(worldScreen){
addButton("Not this time.".tr()){ addButton("Not this time.".tr()){
currentPlayerCiv.tradeRequests.remove(tradeRequest) currentPlayerCiv.tradeRequests.remove(tradeRequest)
val flagsCountdown = requestingCiv.getDiplomacyManager(currentPlayerCiv).flagsCountdown
if(trade.ourOffers.all { it.type==TradeType.Luxury_Resource } && trade.theirOffers.all { it.type==TradeType.Luxury_Resource }) if(trade.ourOffers.all { it.type==TradeType.Luxury_Resource } && trade.theirOffers.all { it.type==TradeType.Luxury_Resource })
requestingCiv.getDiplomacyManager(currentPlayerCiv).flagsCountdown[DiplomacyFlags.DeclinedLuxExchange]=20 // offer again in 20 turns flagsCountdown[DiplomacyFlags.DeclinedLuxExchange.toString()]=20 // offer again in 20 turns
if(trade.ourOffers.any{ it.type==TradeType.Treaty && it.name=="Peace Treaty" }) if(trade.ourOffers.any{ it.type==TradeType.Treaty && it.name=="Peace Treaty" })
requestingCiv.getDiplomacyManager(currentPlayerCiv).flagsCountdown[DiplomacyFlags.DeclinedPeace]=5 // offer again in 20 turns flagsCountdown[DiplomacyFlags.DeclinedPeace.toString()]=5 // offer again in 20 turns
remove() remove()
worldScreen.shouldUpdate=true worldScreen.shouldUpdate=true