From 4f344b65f84632344da5a464797aa7695bd99859 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 6 Nov 2020 11:43:49 +0200 Subject: [PATCH] We now remove resources and improvements that are not in the ruleset from the map when loading the game --- core/src/com/unciv/logic/GameInfo.kt | 83 +++------------------- core/src/com/unciv/ui/utils/ImageGetter.kt | 19 +++-- 2 files changed, 18 insertions(+), 84 deletions(-) diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index de46164f58..192f730666 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -254,17 +254,14 @@ class GameInfo { throw UncivShowableException("Missing mods: [$missingMods]") } - // TODO: Scheduled for removal 3.10.14 - // Renames as of version 3.1.8, because of translation conflicts with the property "Range" and the difficulty "Immortal" - // Needs to be BEFORE tileMap.setTransients, because the units' setTransients is called from there -// for (tile in tileMap.values) -// for (unit in tile.getUnits()) { -// if (unit.name == "Immortal") unit.name = "Persian Immortal" -// if (unit.promotions.promotions.contains("Range")) { -// unit.promotions.promotions.remove("Range") -// unit.promotions.promotions.add("Extended Range") -// } -// } + // Mods can change, leading to things on the map that are no longer defined in the mod. + // So we remove them so the game doesn't crash when it tries to access them. + for (tile in tileMap.values) { + if (tile.resource != null && !ruleSet.tileResources.containsKey(tile.resource!!)) + tile.resource = null + if (tile.improvement != null && !ruleSet.tileImprovements.containsKey(tile.improvement!!)) + tile.improvement = null + } tileMap.setTransients(ruleSet) @@ -290,69 +287,7 @@ class GameInfo { } - // This doesn't HAVE to go here, but why not. - // As of version 3.1.3, trade offers of "Declare war on X" and "Introduction to X" were changed to X, - // with the extra text being added only on UI display (solved a couple of problems). - // TODO: Scheduled for removal 3.10.14 -// for (trade in civInfo.tradeRequests.map { it.trade }) { -// for (offer in trade.theirOffers.union(trade.ourOffers)) { -// offer.name = offer.name.removePrefix("Declare war on ") -// offer.name = offer.name.removePrefix("Introduction to ") -// } -// } - - // TODO: Scheduled for removal 3.10.14 - // As of 3.4.9 cities are referenced by id, not by name - // So try to update every tradeRequest (if there are no conflicting names) -// for (tradeRequest in civInfo.tradeRequests) { -// val trade = tradeRequest.trade -// val toRemove = ArrayList() -// for (offer in trade.ourOffers) { -// if (offer.type == TradeType.City) { -// val countNames = civInfo.cities.count { it.name == offer.name } -// -// if (countNames == 1) -// offer.name = civInfo.cities.first { it.name == offer.name }.id -// // There are conflicting names: we can't guess what city was being offered -// else if (countNames > 1) -// toRemove.add(offer) -// } -// } -// -// trade.ourOffers.removeAll(toRemove) -// toRemove.clear() -// -// val themCivInfo = getCivilization(tradeRequest.requestingCiv) -// for (offer in trade.theirOffers) { -// if (offer.type == TradeType.City) { -// val countNames = themCivInfo.cities.count { it.name == offer.name } -// -// if (countNames == 1) -// offer.name = themCivInfo.cities.first { it.name == offer.name }.id -// // There are conflicting names: we can't guess what city was being offered -// else if (countNames > 1) -// toRemove.add(offer) -// } -// } -// -// trade.theirOffers.removeAll(toRemove) -// } - - // TODO: Scheduled for removal 3.10.14 - // As of 3.4.9 cities are referenced by id, not by name -// val toRemove = ArrayList() -// for (popupAlert in civInfo.popupAlerts.filter { it.type == AlertType.CityConquered }) { -// val countNames = getCities().count { it.name == popupAlert.value } -// -// if (countNames == 1) -// popupAlert.value = getCities().first { it.name == popupAlert.value }.id -// else if (countNames > 1) { -// // Sorry again, conflicting names: who knows what city you conquered? -// toRemove.add(popupAlert) -// } -// } -// civInfo.popupAlerts.removeAll(toRemove) -// } + // This doesn't HAVE to go here, but why not. for (civInfo in civilizations) civInfo.setNationTransient() for (civInfo in civilizations) civInfo.setTransients() diff --git a/core/src/com/unciv/ui/utils/ImageGetter.kt b/core/src/com/unciv/ui/utils/ImageGetter.kt index 9d6c79cc0f..8d0a15f90a 100644 --- a/core/src/com/unciv/ui/utils/ImageGetter.kt +++ b/core/src/com/unciv/ui/utils/ImageGetter.kt @@ -201,29 +201,28 @@ object ImageGetter { } - fun getImprovementIcon(improvementName:String, size:Float=20f):Actor{ - if(improvementName.startsWith("Remove") || improvementName == Constants.cancelImprovementOrder) + fun getImprovementIcon(improvementName:String, size:Float=20f):Actor { + if (improvementName.startsWith("Remove") || improvementName == Constants.cancelImprovementOrder) return getImage("OtherIcons/Stop") - if(improvementName.startsWith("StartingLocation ")){ + if (improvementName.startsWith("StartingLocation ")) { val nationName = improvementName.removePrefix("StartingLocation ") val nation = ruleset.nations[nationName]!! - return getNationIndicator(nation,size) + return getNationIndicator(nation, size) } val iconGroup = getImage("ImprovementIcons/$improvementName").surroundWithCircle(size) val improvement = ruleset.tileImprovements[improvementName] - if(improvement==null) - throw Exception("No improvement $improvementName found in ruleset!") - iconGroup.circle.color = getColorFromStats(improvement) + if (improvement != null) + iconGroup.circle.color = getColorFromStats(improvement) return iconGroup } fun getConstructionImage(construction: String): Image { - if(ruleset.buildings.containsKey(construction)) return getImage("BuildingIcons/$construction") - if(ruleset.units.containsKey(construction)) return getUnitIcon(construction) - if(construction=="Nothing") return getImage("OtherIcons/Sleep") + if (ruleset.buildings.containsKey(construction)) return getImage("BuildingIcons/$construction") + if (ruleset.units.containsKey(construction)) return getUnitIcon(construction) + if (construction == "Nothing") return getImage("OtherIcons/Sleep") return getStatIcon(construction) }