diff --git a/android/Images/TileSets/FantasyHex/Tiles/Manufactory.png b/android/Images/TileSets/FantasyHex/Tiles/Manufactory.png new file mode 100644 index 0000000000..e1885961e2 Binary files /dev/null and b/android/Images/TileSets/FantasyHex/Tiles/Manufactory.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 21a4c4effc..f46d506e28 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -2671,65 +2671,72 @@ TileSets/FantasyHex/Tiles/Lakes orig: 32, 28 offset: 0, 0 index: -1 +TileSets/FantasyHex/Tiles/Manufactory + rotate: false + xy: 2010, 82 + size: 32, 28 + orig: 32, 28 + offset: 0, 0 + index: -1 TileSets/FantasyHex/Tiles/Mountain rotate: false - xy: 1592, 2 + xy: 1992, 44 size: 32, 36 orig: 32, 36 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Ocean rotate: false - xy: 1660, 13 + xy: 1992, 14 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains rotate: false - xy: 1958, 52 + xy: 2026, 52 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+City rotate: false - xy: 1992, 45 + xy: 2026, 15 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Customs house rotate: false - xy: 1958, 22 + xy: 1592, 13 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Farm rotate: false - xy: 1992, 15 + xy: 1626, 13 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Forest rotate: false - xy: 2026, 47 + xy: 1660, 8 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Jungle rotate: false - xy: 2026, 10 + xy: 2044, 112 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Jungle+Trading post rotate: false - xy: 2044, 112 + xy: 2078, 114 size: 32, 35 orig: 32, 35 offset: 0, 0 @@ -2743,119 +2750,119 @@ TileSets/FantasyHex/Tiles/Plains+Mine index: -1 TileSets/FantasyHex/Tiles/Plains+Plantation rotate: false - xy: 2060, 52 + xy: 2078, 84 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Plains+Trading post rotate: false - xy: 2060, 22 + xy: 2060, 52 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-Bottom rotate: false - xy: 2078, 89 + xy: 2094, 52 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomLeft rotate: false - xy: 2112, 124 + xy: 2094, 20 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-BottomRight rotate: false - xy: 2112, 92 + xy: 2112, 124 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-Top rotate: false - xy: 2094, 57 + xy: 2112, 92 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-TopLeft rotate: false - xy: 2094, 25 + xy: 1694, 10 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/River-TopRight rotate: false - xy: 2128, 60 + xy: 1728, 10 size: 32, 30 orig: 32, 30 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra rotate: false - xy: 2126, 438 + xy: 2126, 348 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Camp rotate: false - xy: 2126, 408 + xy: 2126, 318 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+City rotate: false - xy: 2126, 371 + xy: 2126, 281 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Customs house rotate: false - xy: 2126, 341 + xy: 2126, 251 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest rotate: false - xy: 2126, 307 + xy: 2130, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Forest+Camp rotate: false - xy: 2126, 273 + xy: 2130, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Mine rotate: false - xy: 1796, 10 + xy: 2128, 62 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tiles/Tundra+Trading post rotate: false - xy: 1830, 10 + xy: 2128, 32 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/TopBorder rotate: false - xy: 2124, 498 + xy: 2126, 408 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3037,35 +3044,35 @@ TileSets/FantasyHex/Units/Longswordsman index: -1 TileSets/FantasyHex/Units/Mechanized Infantry rotate: false - xy: 2010, 82 + xy: 1958, 52 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Musketman rotate: false - xy: 1626, 13 + xy: 1958, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Rifleman rotate: false - xy: 2078, 121 + xy: 2060, 22 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Scout rotate: false - xy: 2128, 30 + xy: 1762, 12 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Spearman rotate: false - xy: 1694, 12 + xy: 2124, 498 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3079,28 +3086,28 @@ TileSets/FantasyHex/Units/Submarine index: -1 TileSets/FantasyHex/Units/Swordsman rotate: false - xy: 1728, 12 + xy: 2124, 468 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Tank rotate: false - xy: 1762, 12 + xy: 2126, 438 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/Trebuchet rotate: false - xy: 2124, 468 + xy: 2126, 378 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Units/War Elephant rotate: false - xy: 1864, 10 + xy: 2128, 2 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -3114,7 +3121,7 @@ TileSets/FantasyHex/Units/WaterUnit index: -1 TileSets/FantasyHex/Units/Work Boats rotate: false - xy: 2128, 2 + xy: 1796, 2 size: 32, 26 orig: 32, 26 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index d2d71a53d4..396651996f 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 8a8a8ceb56..eb31564491 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -17,24 +17,34 @@ import com.unciv.ui.utils.center import com.unciv.ui.utils.centerX + open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) : Group() { val groupSize = 54f /* Layers: - Base image + overlay + Base image (+ overlay) Feature overlay / city overlay Misc: Units, improvements, resources, border Circle, Crosshair, Fog layer City name */ val baseLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) } - protected var tileBaseImage: Image = ImageGetter.getImage(tileSetStrings.hexagon) - var currentTileBaseImageLocation = "" + protected var tileBaseImages: ArrayList = ArrayList() + /** List of ;-delimited image locations comprising the layers - + * for instance, "desert+flood plains" might have an improvment for which there is a certain image eg "desert+flood plains+farm" + * or it might use a generic image, in which case you'd have the "desert+flood plains;academy" + * Easier to save and compare than with lists */ + var tileImagesIdentifier = "" + + // This is for OLD tiles - the "mountain" symbol on mountains for instance protected var baseTerrainOverlayImage: Image? = null protected var baseTerrain: String = "" + val terrainFeatureLayerGroup = Group().apply { isTransform = false; setSize(groupSize, groupSize) } + + // These are for OLD tiles - for instance the "forest" symbol on the forest protected var terrainFeatureOverlayImage: Image? = null protected var terrainFeature: String? = null protected var cityImage: Image? = null @@ -120,37 +130,51 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) crosshairImage.isVisible = true } - fun getTileBaseImageLocation(isRevealed: Boolean): String { - if (!isRevealed) return tileSetStrings.hexagon + + fun getTileBaseImageLocations(isRevealed: Boolean): List{ + if (!isRevealed) return listOf(tileSetStrings.hexagon) if (tileInfo.isCityCenter()) { val terrainAndCity = tileSetStrings.getCityTile(tileInfo.baseTerrain) if (ImageGetter.imageExists(terrainAndCity)) - return terrainAndCity + return listOf(terrainAndCity) if (ImageGetter.imageExists(tileSetStrings.cityTile)) - return tileSetStrings.cityTile + return listOf(tileSetStrings.cityTile) } - val baseTerrainTileLocation = tileSetStrings.getBaseTerrainTile(tileInfo.baseTerrain) + val shouldShowImprovement = tileInfo.improvement!=null && UnCivGame.Current.settings.showPixelImprovements + val baseTerrainTileLocation = tileSetStrings.getTile(tileInfo.baseTerrain) if (tileInfo.terrainFeature != null) { val baseTerrainAndFeatureTileLocation = "$baseTerrainTileLocation+${tileInfo.terrainFeature}" - if(tileInfo.improvement!=null && UnCivGame.Current.settings.showPixelImprovements){ + if(shouldShowImprovement){ val basefeatureAndImprovementTileLocation = "$baseTerrainAndFeatureTileLocation+${tileInfo.improvement}" if (ImageGetter.imageExists(basefeatureAndImprovementTileLocation)) - return basefeatureAndImprovementTileLocation + return listOf(basefeatureAndImprovementTileLocation) } - if (ImageGetter.imageExists(baseTerrainAndFeatureTileLocation)) - return baseTerrainAndFeatureTileLocation + if (ImageGetter.imageExists(baseTerrainAndFeatureTileLocation)) { + if(shouldShowImprovement){ + val improvementImageLocation = tileSetStrings.getTile(tileInfo.improvement!!) + if(ImageGetter.imageExists(improvementImageLocation)) + return listOf(baseTerrainAndFeatureTileLocation, improvementImageLocation) + } + return listOf(baseTerrainAndFeatureTileLocation) + } } - if(tileInfo.improvement != null && UnCivGame.Current.settings.showPixelImprovements){ + if(shouldShowImprovement){ val baseTerrainAndImprovement = "$baseTerrainTileLocation+${tileInfo.improvement}" - if (ImageGetter.imageExists(baseTerrainAndImprovement)) - return baseTerrainAndImprovement + return listOf(baseTerrainAndImprovement) } - if (ImageGetter.imageExists(baseTerrainTileLocation)) return baseTerrainTileLocation - return tileSetStrings.hexagon + if (ImageGetter.imageExists(baseTerrainTileLocation)){ + if(shouldShowImprovement){ + val improvementImageLocation = tileSetStrings.getTile(tileInfo.improvement!!) + if(ImageGetter.imageExists(improvementImageLocation)) + return listOf(baseTerrainTileLocation, improvementImageLocation) + } + return listOf(baseTerrainTileLocation) + } + return listOf(tileSetStrings.hexagon) } // Used for both the underlying tile and unit overlays, perhaps for other things in the future @@ -164,16 +188,20 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) } private fun updateTileImage(isRevealed: Boolean) { - val tileBaseImageLocation = getTileBaseImageLocation(isRevealed) - if (tileBaseImageLocation == currentTileBaseImageLocation) return + val tileBaseImageLocations = getTileBaseImageLocations(isRevealed) + val identifier = tileBaseImageLocations.joinToString(";") + if (identifier == tileImagesIdentifier) return - tileBaseImage.remove() - tileBaseImage = ImageGetter.getImage(tileBaseImageLocation) - currentTileBaseImageLocation = tileBaseImageLocation - - baseLayerGroup.addActor(tileBaseImage) - setHexagonImageSize(tileBaseImage) - tileBaseImage.toBack() + for(image in tileBaseImages) image.remove() + tileBaseImages.clear() + for(location in tileBaseImageLocations.reversed()) { // reversed because we send each one to back + val image = ImageGetter.getImage(location) + tileBaseImages.add(image) + baseLayerGroup.addActor(image) + setHexagonImageSize(image) + image.toBack() + } + tileImagesIdentifier = identifier } fun showMilitaryUnit(viewingCiv: CivilizationInfo) = showEntireMap @@ -187,7 +215,7 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) hideCircle() if (viewingCiv != null && !showEntireMap && !viewingCiv.exploredTiles.contains(tileInfo.position)) { - tileBaseImage.color = Color.DARK_GRAY + tileBaseImages.firstOrNull()?.color = Color.DARK_GRAY return } @@ -354,12 +382,13 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings) } private fun updateTileColor(isViewable: Boolean) { - tileBaseImage.color = - if (ImageGetter.imageExists(tileSetStrings.getBaseTerrainTile(tileInfo.baseTerrain))) + var color = + if (ImageGetter.imageExists(tileSetStrings.getTile(tileInfo.baseTerrain))) Color.WHITE // no need to color it, it's already colored else tileInfo.getBaseTerrain().getColor() - if (!isViewable) tileBaseImage.color = tileBaseImage.color.lerp(Color.BLACK, 0.6f) + if (!isViewable) color =color.cpy().lerp(Color.BLACK, 0.6f) + tileBaseImages.firstOrNull()?.color = color } private fun updateTerrainFeatureImage() { diff --git a/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt b/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt index 10f3de8065..90eec91238 100644 --- a/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt +++ b/core/src/com/unciv/ui/tilegroups/TileSetStrings.kt @@ -23,7 +23,7 @@ class TileSetStrings { val waterUnit = unitsLocation+"WaterUnit" private val baseTerrainToTile = HashMap() - fun getBaseTerrainTile(baseTerrain:String): String { + fun getTile(baseTerrain:String): String { if(!baseTerrainToTile.containsKey(baseTerrain)) baseTerrainToTile[baseTerrain] = "$tilesLocation$baseTerrain" return baseTerrainToTile[baseTerrain]!!