Actually load and display the road texture found in FantasyHex (#4699)

* Actually load and display the road texture found in FantasyHex

* Actually load and display the road texture found in FantasyHex - patch1
This commit is contained in:
SomeTroglodyte 2021-08-01 14:36:45 +02:00 committed by GitHub
parent 912a9dbb9d
commit 3cf9191d6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 38 additions and 35 deletions

View File

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 140 B

View File

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 338 B

View File

@ -2111,7 +2111,7 @@ ImprovementIcons/Railroad
orig: 100, 100
offset: 0, 0
index: -1
TileSets/Default/road
TileSets/Default/Road
rotate: false
xy: 1421, 1847
size: 61, 11
@ -4085,7 +4085,7 @@ TileSets/FantasyHex/Units/Worker
orig: 32, 28
offset: 0, 0
index: -1
TileSets/FantasyHex/road
TileSets/FantasyHex/Road
rotate: false
xy: 1121, 1847
size: 61, 11

View File

@ -146,7 +146,7 @@ object HexMath {
val current = origin.cpy().sub(distance.toFloat(), distance.toFloat()) // start at 6 o clock
for (i in 0 until distance) { // From 6 to 8
vectors += current.cpy()
vectors += origin.cpy().scl(2f).sub(current) // Get vector on other side of cloick
vectors += origin.cpy().scl(2f).sub(current) // Get vector on other side of clock
current.add(1f, 0f)
}
for (i in 0 until distance) { // 8 to 10
@ -180,4 +180,17 @@ object HexMath {
else
return (abs(relative_x) + abs(relative_y)).toInt()
}
}
// Statically allocate the Vectors (in World coordinates)
// of the 6 clock directions for border and road drawing in TileGroup
private val clockToWorldVectors: Map<Int,Vector2> = mapOf(
2 to hex2WorldCoords(Vector2(0f, -1f)),
4 to hex2WorldCoords(Vector2(1f, 0f)),
6 to hex2WorldCoords(Vector2(1f, 1f)),
8 to hex2WorldCoords(Vector2(0f, 1f)),
10 to hex2WorldCoords(Vector2(-1f, 0f)),
12 to hex2WorldCoords(Vector2(-1f, -1f)) )
fun getClockDirectionToWorldVector(clockDirection: Int): Vector2 =
clockToWorldVectors[clockDirection] ?: Vector2.Zero
}

View File

@ -159,7 +159,7 @@ class TileMap {
/** Tries to place the [unitName] into the [TileInfo] closest to the given [position]
* @param position where to try to place the unit (or close - max 10 tiles distance)
* @param unitName name of the [BaseUnit] to create and place
* @param unitName name of the [BaseUnit][com.unciv.models.ruleset.unit.BaseUnit] to create and place
* @param civInfo civilization to assign unit to
* @return created [MapUnit] or null if no suitable location was found
* */
@ -335,9 +335,9 @@ class TileMap {
* Returns -1 if not neighbors
*/
fun getNeighborTileClockPosition(tile: TileInfo, otherTile: TileInfo): Int {
var radius = mapParameters.mapSize.radius
if (mapParameters.shape == MapShape.rectangular)
radius = mapParameters.mapSize.width / 2
val radius = if (mapParameters.shape == MapShape.rectangular)
mapParameters.mapSize.width / 2
else mapParameters.mapSize.radius
val xDifference = tile.position.x - otherTile.position.x
val yDifference = tile.position.y - otherTile.position.y
@ -357,6 +357,14 @@ class TileMap {
}
}
/** Convert relative direction of otherTile seen from tile's position into a vector
* in world coordinates of length sqrt(3), so that it can be used to go from tile center to
* the edge of the hex in that direction (meaning the center of the border between the hexes)
*/
fun getNeighborTilePositionAsWorldCoords(tile: TileInfo, otherTile: TileInfo): Vector2 =
HexMath.getClockDirectionToWorldVector(getNeighborTileClockPosition(tile, otherTile))
/**
* Returns the closest position to (0, 0) outside the map which can be wrapped
* to the position of the given vector

View File

@ -2,14 +2,12 @@ package com.unciv.ui.tilegroups
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.Batch
import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.badlogic.gdx.utils.Align
import com.unciv.UncivGame
import com.unciv.logic.HexMath
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.RoadStatus
import com.unciv.logic.map.TileInfo
@ -444,16 +442,7 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings,
}
if (neighborOwner != tileOwner && !borderImages.containsKey(neighbor)) { // there should be a border here but there isn't
val relativeHexPosition = when (tileInfo.tileMap.getNeighborTileClockPosition(tileInfo, neighbor)){
2 -> Vector2(0f,-1f)
4 -> Vector2(1f,0f)
6 -> Vector2(1f,1f)
8 -> Vector2(0f,1f)
10 -> Vector2(-1f,0f)
12 -> Vector2(-1f,-1f)
else -> Vector2.Zero
}
val relativeWorldPosition = HexMath.hex2WorldCoords(relativeHexPosition)
val relativeWorldPosition = tileInfo.tileMap.getNeighborTilePositionAsWorldCoords(tileInfo, neighbor)
// This is some crazy voodoo magic so I'll explain.
val images = mutableListOf<Image>()
@ -487,8 +476,7 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings,
private fun updateRoadImages() {
if (forMapEditorIcon) return
for (neighbor in tileInfo.neighbors) {
if (!roadImages.containsKey(neighbor)) roadImages[neighbor] = RoadImage()
val roadImage = roadImages[neighbor]!!
val roadImage = roadImages[neighbor] ?: RoadImage().also { roadImages[neighbor] = it }
val roadStatus = when {
tileInfo.roadStatus == RoadStatus.None || neighbor.roadStatus === RoadStatus.None -> RoadStatus.None
@ -505,20 +493,10 @@ open class TileGroup(var tileInfo: TileInfo, var tileSetStrings:TileSetStrings,
}
if (roadStatus == RoadStatus.None) continue // no road image
val image = if (roadStatus == RoadStatus.Road) ImageGetter.getDot(Color.BROWN)
else ImageGetter.getImage(tileSetStrings.railroad)
val image = ImageGetter.getImage(tileSetStrings.roadsMap[roadStatus]!!)
roadImage.image = image
val relativeHexPosition = when (tileInfo.tileMap.getNeighborTileClockPosition(neighbor, tileInfo)){
2 -> Vector2(0f,1f)
4 -> Vector2(-1f,0f)
6 -> Vector2(-1f,-1f)
8 -> Vector2(0f,-1f)
10 -> Vector2(1f,0f)
12 -> Vector2(1f,1f)
else -> Vector2.Zero
}
val relativeWorldPosition = HexMath.hex2WorldCoords(relativeHexPosition)
val relativeWorldPosition = tileInfo.tileMap.getNeighborTilePositionAsWorldCoords(tileInfo, neighbor)
// This is some crazy voodoo magic so I'll explain.
image.moveBy(25f, 25f) // Move road to center of tile

View File

@ -1,6 +1,7 @@
package com.unciv.ui.tilegroups
import com.unciv.UncivGame
import com.unciv.logic.map.RoadStatus
import com.unciv.models.tilesets.TileSetCache
import com.unciv.models.tilesets.TileSetConfig
@ -13,7 +14,10 @@ class TileSetStrings {
val hexagon = tileSetLocation + "Hexagon"
val crosshatchHexagon = tileSetLocation + "CrosshatchHexagon"
val cityOverlay = tileSetLocation + "CityOverlay"
val railroad = tileSetLocation + "Railroad"
val roadsMap = RoadStatus.values()
.filterNot { it == RoadStatus.None }
.map { it to tileSetLocation + it.name }
.toMap()
val naturalWonderOverlay = tileSetLocation + "NaturalWonderOverlay"
val tilesLocation = tileSetLocation + "Tiles/"