mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-23 06:08:46 +07:00
Split map into layers for base image, features, overlays, and fog
Added Marsh and Lakes images IT LOOKS SO GOOD NOW DAMN
This commit is contained in:
@ -11,7 +11,7 @@ class GameSettings {
|
||||
var hasCrashedRecently = false
|
||||
var soundEffectsVolume = 0.5f
|
||||
var turnsBetweenAutosaves = 1
|
||||
var tileSet:String = "Default"
|
||||
var tileSet:String = "FantasyHex"
|
||||
|
||||
fun save(){
|
||||
GameSaver().setGeneralSettings(this)
|
||||
|
@ -17,7 +17,7 @@ class UnCivGame : Game() {
|
||||
* This exists so that when debugging we can see the entire map.
|
||||
* Remember to turn this to false before commit and upload!
|
||||
*/
|
||||
val viewEntireMapForDebug = false
|
||||
val viewEntireMapForDebug = true
|
||||
|
||||
// For when you need to test something in an advanced game and don't have time to faff around
|
||||
val superchargedForDebug = false
|
||||
|
@ -26,7 +26,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
Layers:
|
||||
Base image + overlay
|
||||
Feature overlay / city overlay
|
||||
Units, improvements, resources, border
|
||||
Misc: Units, improvements, resources, border
|
||||
Circle, Crosshair, Fog layer
|
||||
City name
|
||||
*/
|
||||
@ -51,7 +51,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
protected var civilianUnitImage: UnitGroup? = null
|
||||
protected var militaryUnitImage: UnitGroup? = null
|
||||
|
||||
|
||||
val circleCrosshairFogLayerGroup = Group().apply { isTransform=false }
|
||||
private val circleImage = ImageGetter.getCircle() // for blue and red circles on the tile
|
||||
private val crosshairImage = ImageGetter.getImage("OtherIcons/Crosshair.png") // for when a unit is targete
|
||||
protected val fogImage = ImageGetter.getImage(tileSetLocation+"CrosshatchHexagon")
|
||||
@ -68,6 +68,10 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
val groupSize = 54f
|
||||
init {
|
||||
this.setSize(groupSize, groupSize)
|
||||
this.addActor(baseLayerGroup)
|
||||
this.addActor(featureLayerGroup)
|
||||
this.addActor(miscLayerGroup)
|
||||
this.addActor(circleCrosshairFogLayerGroup)
|
||||
|
||||
updateTileImage(false)
|
||||
|
||||
@ -82,7 +86,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
circleImage.width = 50f
|
||||
circleImage.height = 50f
|
||||
circleImage.center(this)
|
||||
addActor(circleImage)
|
||||
circleCrosshairFogLayerGroup.addActor(circleImage)
|
||||
circleImage.isVisible = false
|
||||
}
|
||||
|
||||
@ -92,7 +96,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
fogImage.setOrigin(Align.center)
|
||||
fogImage.center(this)
|
||||
fogImage.color = Color.WHITE.cpy().apply { a = 0.2f }
|
||||
addActor(fogImage)
|
||||
circleCrosshairFogLayerGroup.addActor(fogImage)
|
||||
}
|
||||
|
||||
private fun addCrosshairImage() {
|
||||
@ -101,7 +105,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
crosshairImage.center(this)
|
||||
crosshairImage.isVisible = false
|
||||
crosshairImage.color = Color.WHITE.cpy().apply { a = 0.5f }
|
||||
addActor(crosshairImage)
|
||||
circleCrosshairFogLayerGroup.addActor(crosshairImage)
|
||||
}
|
||||
|
||||
fun showCrosshair() {
|
||||
@ -134,11 +138,10 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
|
||||
tileBaseImage.y = -groupSize/6
|
||||
tileBaseImage.toBack()
|
||||
addActor(tileBaseImage)
|
||||
baseLayerGroup.addActor(tileBaseImage)
|
||||
}
|
||||
|
||||
fun addAcquirableIcon(){
|
||||
this.
|
||||
populationImage = ImageGetter.getStatIcon("Acquire")
|
||||
populationImage!!.run {
|
||||
color = Color.GREEN.cpy().lerp(Color.BLACK, 0.5f)
|
||||
@ -146,7 +149,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
center(this@TileGroup)
|
||||
x += 20 // right
|
||||
}
|
||||
addActor(populationImage)
|
||||
miscLayerGroup.addActor(populationImage)
|
||||
}
|
||||
|
||||
fun addPopulationIcon() {
|
||||
@ -158,7 +161,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
center(this@TileGroup)
|
||||
x += 20 // right
|
||||
}
|
||||
addActor(populationImage)
|
||||
miscLayerGroup.addActor(populationImage)
|
||||
}
|
||||
|
||||
protected fun removePopulationIcon() {
|
||||
@ -219,13 +222,13 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
setSize(40f, 40f)
|
||||
center(this@TileGroup)
|
||||
}
|
||||
addActor(baseTerrainOverlayImage)
|
||||
baseLayerGroup.addActor(baseTerrainOverlayImage)
|
||||
}
|
||||
|
||||
private fun updateCityImage() {
|
||||
if (cityImage == null && tileInfo.isCityCenter()) {
|
||||
cityImage = ImageGetter.getImage("OtherIcons/City.png")
|
||||
addActor(cityImage)
|
||||
featureLayerGroup.addActor(cityImage)
|
||||
cityImage!!.run {
|
||||
setSize(60f, 60f)
|
||||
center(this@TileGroup)
|
||||
@ -287,7 +290,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
image.moveBy(relativeWorldPosition.y * i * 4, -relativeWorldPosition.x * i * 4)
|
||||
|
||||
image.color = civColor
|
||||
addActor(image)
|
||||
miscLayerGroup.addActor(image)
|
||||
images.add(image)
|
||||
}
|
||||
}
|
||||
@ -331,7 +334,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
image.setOrigin(0f, 1f) // This is so that the rotation is calculated from the middle of the road and not the edge
|
||||
|
||||
image.rotation = (180 / Math.PI * Math.atan2(relativeWorldPosition.y.toDouble(), relativeWorldPosition.x.toDouble())).toFloat()
|
||||
addActor(image)
|
||||
featureLayerGroup.addActor(image)
|
||||
}
|
||||
|
||||
|
||||
@ -355,7 +358,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
val terrainFeatureOverlayLocation = tileSetLocation +"$terrainFeature"+"Overlay"
|
||||
if(!ImageGetter.imageExists(terrainFeatureOverlayLocation)) return
|
||||
terrainFeatureOverlayImage = ImageGetter.getImage(terrainFeatureOverlayLocation)
|
||||
addActor(terrainFeatureOverlayImage)
|
||||
featureLayerGroup.addActor(terrainFeatureOverlayImage)
|
||||
terrainFeatureOverlayImage!!.run {
|
||||
setSize(30f, 30f)
|
||||
setColor(1f, 1f, 1f, 0.5f)
|
||||
@ -373,7 +376,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
|
||||
if (tileInfo.improvement != null && showResourcesAndImprovements) {
|
||||
improvementImage = ImageGetter.getImprovementIcon(tileInfo.improvement!!)
|
||||
addActor(improvementImage)
|
||||
miscLayerGroup.addActor(improvementImage)
|
||||
improvementImage!!.run {
|
||||
setSize(20f, 20f)
|
||||
center(this@TileGroup)
|
||||
@ -403,7 +406,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
resourceImage!!.center(this)
|
||||
resourceImage!!.x = resourceImage!!.x - 22 // left
|
||||
resourceImage!!.y = resourceImage!!.y + 10 // top
|
||||
addActor(resourceImage!!)
|
||||
miscLayerGroup.addActor(resourceImage!!)
|
||||
}
|
||||
}
|
||||
|
||||
@ -419,7 +422,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
|
||||
newImage.blackSpinningCircle = ImageGetter.getCircle()
|
||||
.apply { rotation= oldUnitGroup.blackSpinningCircle!!.rotation}
|
||||
}
|
||||
addActor(newImage)
|
||||
miscLayerGroup.addActor(newImage)
|
||||
newImage.center(this)
|
||||
newImage.y += yFromCenter
|
||||
|
||||
|
@ -17,7 +17,6 @@ class TileGroupMap<T: TileGroup>(tileGroups:Collection<T>, padding:Float): Group
|
||||
tileGroup.setPosition(positionalVector.x * 0.8f * groupSize.toFloat(),
|
||||
positionalVector.y * 0.8f * groupSize.toFloat())
|
||||
|
||||
addActor(tileGroup)
|
||||
topX = Math.max(topX, tileGroup.x + groupSize)
|
||||
topY = Math.max(topY, tileGroup.y + groupSize)
|
||||
bottomX = Math.min(bottomX, tileGroup.x)
|
||||
@ -28,8 +27,25 @@ class TileGroupMap<T: TileGroup>(tileGroups:Collection<T>, padding:Float): Group
|
||||
group.moveBy(-bottomX + padding, -bottomY + padding)
|
||||
}
|
||||
|
||||
for(group in tileGroups.sortedByDescending { it.tileInfo.position.x + it.tileInfo.position.y })
|
||||
group.toFront()
|
||||
val baseLayers = ArrayList<Group>()
|
||||
val featureLayers = ArrayList<Group>()
|
||||
val miscLayers = ArrayList<Group>()
|
||||
val circleCrosshairFogLayers = ArrayList<Group>()
|
||||
|
||||
for(group in tileGroups.sortedByDescending { it.tileInfo.position.x + it.tileInfo.position.y }){
|
||||
// now, we steal the subgroups from all the tilegroups, that's how we form layers!
|
||||
baseLayers.add(group.baseLayerGroup.apply { setPosition(group.x,group.y) })
|
||||
featureLayers.add(group.featureLayerGroup.apply { setPosition(group.x,group.y) })
|
||||
miscLayers.add(group.miscLayerGroup.apply { setPosition(group.x,group.y) })
|
||||
circleCrosshairFogLayers.add(group.circleCrosshairFogLayerGroup.apply { setPosition(group.x,group.y) })
|
||||
}
|
||||
for(group in baseLayers) addActor(group)
|
||||
for(group in featureLayers) addActor(group)
|
||||
for(group in miscLayers) addActor(group)
|
||||
for(group in circleCrosshairFogLayers) addActor(group)
|
||||
|
||||
for(group in tileGroups) addActor(group) // The above layers are for the visual layers, this is for the clicks
|
||||
|
||||
|
||||
// there are tiles "below the zero",
|
||||
// so we zero out the starting position of the whole board so they will be displayed as well
|
||||
|
@ -179,7 +179,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
|
||||
tileGroup.update(canSeeTile, showSubmarine)
|
||||
|
||||
val unitsInTile = tileGroup.tileInfo.getUnits()
|
||||
val canSeeEnemy = unitsInTile.isNotEmpty() && !unitsInTile.first().civInfo.isPlayerCivilization()
|
||||
val canSeeEnemy = unitsInTile.isNotEmpty() && unitsInTile.first().civInfo.isAtWarWith(civInfo)
|
||||
&& (showSubmarine || unitsInTile.firstOrNull {!it.isInvisible()}!=null)
|
||||
if(canSeeTile && canSeeEnemy)
|
||||
tileGroup.showCircle(Color.RED) // Display ALL viewable enemies with a red circle so that users don't need to go "hunting" for enemy units
|
||||
|
Reference in New Issue
Block a user