From 8c7c0a0f919a7a4f81c0d5fddd20cfb89aae7a41 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 1 Apr 2021 22:08:29 +0300 Subject: [PATCH] Added new experimental tile layering - see #3716 --- .../Civ V - Vanilla/TileImprovements.json | 1 + .../logic/civilization/CivilizationInfo.kt | 1 + .../com/unciv/models/metadata/GameSettings.kt | 1 + core/src/com/unciv/ui/tilegroups/TileGroup.kt | 38 ++++++++++++++++++- .../ui/worldscreen/mainmenu/OptionsPopup.kt | 4 ++ .../unciv/ui/worldscreen/unit/UnitActions.kt | 1 + 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/android/assets/jsons/Civ V - Vanilla/TileImprovements.json b/android/assets/jsons/Civ V - Vanilla/TileImprovements.json index 39ce175745..da4ca03c13 100644 --- a/android/assets/jsons/Civ V - Vanilla/TileImprovements.json +++ b/android/assets/jsons/Civ V - Vanilla/TileImprovements.json @@ -211,5 +211,6 @@ { "name": "Ancient ruins" }, { "name": "City ruins" }, + { "name": "City center" }, { "name": "Barbarian encampment" } ] diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 8ed3b13f97..d5da52fd48 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -585,6 +585,7 @@ class CivilizationInfo { fun addCity(location: Vector2) { val newCity = CityInfo(this, location) newCity.cityConstructions.chooseNextConstruction() + } diff --git a/core/src/com/unciv/models/metadata/GameSettings.kt b/core/src/com/unciv/models/metadata/GameSettings.kt index a9d7837234..e1d2f0919a 100644 --- a/core/src/com/unciv/models/metadata/GameSettings.kt +++ b/core/src/com/unciv/models/metadata/GameSettings.kt @@ -40,6 +40,7 @@ class GameSettings { var visualMods = HashSet() var showExperimentalWorldWrap = false + var showExperimentalTileLayering = false init { // 26 = Android Oreo. Versions below may display permanent icon in notification bar. diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 081e9d999a..12054d3563 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -169,6 +169,38 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) crosshairImage.isVisible = true } + fun getTileBaseImageLocationsNew(viewingCiv: CivilizationInfo?): List { + if (viewingCiv == null && !showEntireMap) return listOf(tileSetStrings.hexagon) + + val shouldShowImprovement = tileInfo.improvement != null && UncivGame.Current.settings.showPixelImprovements + val shouldShowResource = UncivGame.Current.settings.showPixelImprovements + && tileInfo.resource != null && + (showEntireMap || viewingCiv == null || tileInfo.hasViewableResource(viewingCiv)) + + var resourceAndImprovementSequence = sequenceOf() + if (shouldShowResource) resourceAndImprovementSequence += sequenceOf(tileInfo.resource) + if (shouldShowImprovement) resourceAndImprovementSequence += sequenceOf(tileInfo.improvement) + resourceAndImprovementSequence = resourceAndImprovementSequence.filterNotNull() + + val allTogether = (sequenceOf(tileInfo.baseTerrain) + tileInfo.terrainFeatures.asSequence() + resourceAndImprovementSequence) + .filterNotNull().joinToString("+").let { tileSetStrings.getTile(it) } + + if (ImageGetter.imageExists(allTogether)) return listOf(allTogether) + else return getTerrainImageLocations() + getImprovementAndResourceImages(resourceAndImprovementSequence) + } + + fun getTerrainImageLocations(): List { + val terrainSequence = sequenceOf(tileInfo.baseTerrain) + tileInfo.terrainFeatures.asSequence() + val allTerrains = terrainSequence.joinToString("+").let { tileSetStrings.getTile(it) } + if (ImageGetter.imageExists(allTerrains)) return listOf(allTerrains) + else return terrainSequence.toList() + } + + fun getImprovementAndResourceImages(resourceAndImprovementSequence: Sequence): List { + val altogether = resourceAndImprovementSequence.joinToString("+").let { tileSetStrings.getTile(it) } + if (ImageGetter.imageExists(altogether)) return listOf(altogether) + else return resourceAndImprovementSequence.toList() + } fun getTileBaseImageLocations(viewingCiv: CivilizationInfo?): List { if (viewingCiv == null && !showEntireMap) return listOf(tileSetStrings.hexagon) @@ -298,9 +330,10 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) } private fun updateTileImage(viewingCiv: CivilizationInfo?) { - val tileBaseImageLocations = getTileBaseImageLocations(viewingCiv) + val tileBaseImageLocations = if (UncivGame.Current.settings.showExperimentalTileLayering) getTileBaseImageLocationsNew(viewingCiv) + else getTileBaseImageLocations(viewingCiv) - if(tileBaseImageLocations.size == tileImageIdentifiers.size) { + if (tileBaseImageLocations.size == tileImageIdentifiers.size) { if (tileBaseImageLocations.withIndex().all { (i, imageLocation) -> tileImageIdentifiers[i] == imageLocation }) return // All image identifiers are the same as the current ones, no need to change anything } @@ -311,6 +344,7 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) for (location in tileBaseImageLocations.reversed()) { // reversed because we send each one to back // Here we check what actual tiles exist, and pick one - not at random, but based on the tile location, // so it stays consistent throughout the game + if (!ImageGetter.imageExists(location)) continue val existingImages = ArrayList() existingImages.add(location) var i = 2 diff --git a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt index b4c0c93e2a..eba636e903 100644 --- a/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/mainmenu/OptionsPopup.kt @@ -132,6 +132,10 @@ class OptionsPopup(val previousScreen:CameraStageBaseScreen) : Popup(previousScr settings.showExperimentalWorldWrap) { settings.showExperimentalWorldWrap = it } + addYesNoRow("Show experimental tile layering\nHIGHLY EXPERIMENTAL - YOU HAVE BEEN WARNED!", + settings.showExperimentalTileLayering) + { settings.showExperimentalTileLayering = it } + addSoundEffectsVolumeSlider() addMusicVolumeSlider() addTranslationGeneration() diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index e54a60cb06..3271fce960 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -125,6 +125,7 @@ object UnitActions { action = { UncivGame.Current.settings.addCompletedTutorialTask("Found city") unit.civInfo.addCity(tile.position) + tile.improvement = "City center" unit.destroy() }.takeIf { unit.currentMovement > 0 && !tile.getTilesInDistance(3).any { it.isCityCenter() } }) }