From 261c3d6cedeea6dddd6defe802dd3df6d16ee653 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sat, 1 Feb 2020 20:26:27 +0200 Subject: [PATCH] Resolved #1820 - Fixed a crashing bug with the AI trying to ally with defeated city states, as well as many other minor bugs All caused by the fact that getKnownCivs didn't filter out defeated civs Also some minor code cleanup --- .../logic/automation/NextTurnAutomation.kt | 24 +++++++++---------- .../civilization/CivInfoTransientUpdater.kt | 8 +++---- .../logic/civilization/CivilizationInfo.kt | 7 ++++-- .../unciv/logic/civilization/TechManager.kt | 3 ++- .../diplomacy/DiplomacyManager.kt | 1 - .../com/unciv/ui/worldscreen/WorldScreen.kt | 2 +- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 192b069701..5efd98ee71 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -35,10 +35,10 @@ class NextTurnAutomation{ adoptPolicy(civInfo) } else { getFreeTechForCityStates(civInfo) + updateDiplomaticRelationshipForCityStates(civInfo) } chooseTechToResearch(civInfo) - updateDiplomaticRelationship(civInfo) declareWar(civInfo) automateCityBombardment(civInfo) useGold(civInfo) @@ -401,20 +401,18 @@ class NextTurnAutomation{ } } - private fun updateDiplomaticRelationship(civInfo: CivilizationInfo) { + private fun updateDiplomaticRelationshipForCityStates(civInfo: CivilizationInfo) { // Check if city-state invaded by other civs - if (civInfo.isCityState()) { - for (otherCiv in civInfo.getKnownCivs().filter { it.isMajorCiv() }) { - if(civInfo.isAtWarWith(otherCiv)) continue - val diplomacy = civInfo.getDiplomacyManager(otherCiv) + for (otherCiv in civInfo.getKnownCivs().filter { it.isMajorCiv() }) { + if(civInfo.isAtWarWith(otherCiv)) continue + val diplomacy = civInfo.getDiplomacyManager(otherCiv) - val unitsInBorder = otherCiv.getCivUnits().count { !it.type.isCivilian() && it.getTile().getOwner() == civInfo } - if (unitsInBorder > 0 && diplomacy.relationshipLevel() < RelationshipLevel.Friend) { - diplomacy.influence -= 10f - if (!diplomacy.hasFlag(DiplomacyFlags.BorderConflict)) { - otherCiv.popupAlerts.add(PopupAlert(AlertType.BorderConflict,civInfo.civName)) - diplomacy.setFlag(DiplomacyFlags.BorderConflict,10) - } + val unitsInBorder = otherCiv.getCivUnits().count { !it.type.isCivilian() && it.getTile().getOwner() == civInfo } + if (unitsInBorder > 0 && diplomacy.relationshipLevel() < RelationshipLevel.Friend) { + diplomacy.influence -= 10f + if (!diplomacy.hasFlag(DiplomacyFlags.BorderConflict)) { + otherCiv.popupAlerts.add(PopupAlert(AlertType.BorderConflict,civInfo.civName)) + diplomacy.setFlag(DiplomacyFlags.BorderConflict,10) } } } diff --git a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt index e0e1257f23..5fadf325fd 100644 --- a/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt +++ b/core/src/com/unciv/logic/civilization/CivInfoTransientUpdater.kt @@ -200,11 +200,9 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo){ for (city in civInfo.cities) newDetailedCivResources.add(city.getCityResources()) if (!civInfo.isCityState()) { - for (otherCiv in civInfo.getKnownCivs()) { - if (otherCiv.getAllyCiv() == civInfo.civName) { - for (city in otherCiv.cities) { - newDetailedCivResources.add(city.getCityResourcesForAlly()) - } + for (otherCiv in civInfo.getKnownCivs().filter { it.getAllyCiv() == civInfo.civName }) { + for (city in otherCiv.cities) { + newDetailedCivResources.add(city.getCityResourcesForAlly()) } } } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 3f6d6edad4..ff9b7356be 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -133,7 +133,8 @@ class CivilizationInfo { fun getDiplomacyManager(civInfo: CivilizationInfo) = getDiplomacyManager(civInfo.civName) fun getDiplomacyManager(civName: String) = diplomacy[civName]!! - fun getKnownCivs() = diplomacy.values.map { it.otherCiv() } + /** Returns only undefeated civs, aka the ones we care about */ + fun getKnownCivs() = diplomacy.values.map { it.otherCiv() }.filter { !it.isDefeated() } fun knows(otherCivName: String) = diplomacy.containsKey(otherCivName) fun knows(otherCiv: CivilizationInfo) = knows(otherCiv.civName) @@ -530,7 +531,9 @@ class CivilizationInfo { fun updateAllyCivForCityState() { var newAllyName = "" if (!isCityState()) return - val maxInfluence = diplomacy.filter{ !it.value.otherCiv().isCityState() && !it.value.otherCiv().isDefeated() }.maxBy { it.value.influence } + val maxInfluence = diplomacy + .filter{ !it.value.otherCiv().isCityState() && !it.value.otherCiv().isDefeated() } + .maxBy { it.value.influence } if (maxInfluence != null && maxInfluence.value.influence >= 60) { newAllyName = maxInfluence.key } diff --git a/core/src/com/unciv/logic/civilization/TechManager.kt b/core/src/com/unciv/logic/civilization/TechManager.kt index ac79445a74..431e65e044 100644 --- a/core/src/com/unciv/logic/civilization/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/TechManager.kt @@ -183,7 +183,8 @@ class TechManager { scienceFromResearchAgreements = 0 } if (overflowScience != 0){ // https://forums.civfanatics.com/threads/the-mechanics-of-overflow-inflation.517970/ - val techsResearchedKnownCivs = civInfo.getKnownCivs().count { it.isMajorCiv() && it.tech.isResearched(currentTechnologyName()!!) } + val techsResearchedKnownCivs = civInfo.getKnownCivs() + .count { it.isMajorCiv() && it.tech.isResearched(currentTechnologyName()!!) } val undefeatedCivs = UncivGame.Current.gameInfo.civilizations.count { it.isMajorCiv() && !it.isDefeated() } techsInProgress[currentTechnology] = techsInProgress[currentTechnology]!! + ((1 + techsResearchedKnownCivs / undefeatedCivs.toFloat() * 0.3f)* overflowScience).toInt() overflowScience = 0 diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index 2a0476ebc6..2e6beb9811 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -442,7 +442,6 @@ class DiplomacyManager() { if (!otherCiv.isCityState()) { for (thirdCiv in otherCiv.getKnownCivs()) { if (thirdCiv.isCityState() && thirdCiv.getAllyCiv() == otherCiv.civName - && !thirdCiv.isDefeated() && thirdCiv.knows(civInfo) && thirdCiv.getDiplomacyManager(civInfo).canDeclareWar()) { thirdCiv.getDiplomacyManager(civInfo).declareWar() diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index 2d570f1ef3..da9e1f240e 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -290,7 +290,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { private fun updateDiplomacyButton(civInfo: CivilizationInfo) { diplomacyButtonWrapper.clear() if(!civInfo.isDefeated() && civInfo.getKnownCivs() - .filterNot { it.isDefeated() || it==viewingCiv || it.isBarbarian() } + .filterNot { it==viewingCiv || it.isBarbarian() } .any()) { displayTutorial(Tutorial.OtherCivEncountered) val btn = TextButton("Diplomacy".tr(), skin)