mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-11 00:08:58 +07:00
Differentiated attackable from visible tiles per Civ V
This commit is contained in:
@ -68,8 +68,7 @@ object BattleHelper {
|
|||||||
val tilesInAttackRange =
|
val tilesInAttackRange =
|
||||||
if (unit.hasUnique(UniqueType.IndirectFire) || unit.baseUnit.movesLikeAirUnits())
|
if (unit.hasUnique(UniqueType.IndirectFire) || unit.baseUnit.movesLikeAirUnits())
|
||||||
reachableTile.getTilesInDistance(rangeOfAttack)
|
reachableTile.getTilesInDistance(rangeOfAttack)
|
||||||
else reachableTile.getViewableTilesList(rangeOfAttack)
|
else reachableTile.tileMap.getViewableTiles(reachableTile.position, rangeOfAttack, true).asSequence()
|
||||||
.asSequence()
|
|
||||||
|
|
||||||
for (tile in tilesInAttackRange) {
|
for (tile in tilesInAttackRange) {
|
||||||
if (tile in tilesWithEnemies) attackableTiles += AttackableTile(
|
if (tile in tilesWithEnemies) attackableTiles += AttackableTile(
|
||||||
|
@ -329,7 +329,7 @@ class TileMap : IsPartOfGameInfoSerialization {
|
|||||||
data class ViewableTile(val tile:TileInfo, val maxHeightSeenToTile:Int, val isVisible:Boolean, val isAttackable: Boolean)
|
data class ViewableTile(val tile:TileInfo, val maxHeightSeenToTile:Int, val isVisible:Boolean, val isAttackable: Boolean)
|
||||||
|
|
||||||
/** @return List of tiles visible from location [position] for a unit with sight range [sightDistance] */
|
/** @return List of tiles visible from location [position] for a unit with sight range [sightDistance] */
|
||||||
fun getViewableTiles(position: Vector2, sightDistance: Int): List<TileInfo> {
|
fun getViewableTiles(position: Vector2, sightDistance: Int, forAttack:Boolean = false): List<TileInfo> {
|
||||||
val aUnitHeight = get(position).unitHeight
|
val aUnitHeight = get(position).unitHeight
|
||||||
val viewableTiles = mutableListOf(ViewableTile(
|
val viewableTiles = mutableListOf(ViewableTile(
|
||||||
get(position),
|
get(position),
|
||||||
@ -373,6 +373,8 @@ class TileMap : IsPartOfGameInfoSerialization {
|
|||||||
viewableTiles.addAll(tilesToAddInDistanceI)
|
viewableTiles.addAll(tilesToAddInDistanceI)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (forAttack) return viewableTiles.filter { it.isAttackable }.map { it.tile }
|
||||||
|
|
||||||
return viewableTiles.filter { it.isVisible }.map { it.tile }
|
return viewableTiles.filter { it.isVisible }.map { it.tile }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +186,18 @@ class VisibilityTests {
|
|||||||
assert(viewableTiles.contains(beyondSight))
|
assert(viewableTiles.contains(beyondSight))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun canSeeElevation3TilesEvenWithInvisibleIntermediate() {
|
||||||
|
val source = addTile("Grassland", Vector2(0f,0f))
|
||||||
|
addTile(listOf("Grassland", "Hill"), Vector2(1f,0f))
|
||||||
|
val intermediate = addTile(listOf("Grassland", "Hill"), Vector2(2f,0f))
|
||||||
|
val beyondSight = addTile(listOf("Grassland", "Hill", "Forest"), Vector2(3f,0f))
|
||||||
|
|
||||||
|
val viewableTiles = source.getViewableTilesList(2)
|
||||||
|
assert(viewableTiles.contains(beyondSight))
|
||||||
|
assert(!viewableTiles.contains(intermediate))
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun cannotSeeHiddenElevation3Tiles() {
|
fun cannotSeeHiddenElevation3Tiles() {
|
||||||
val source = addTile("Grassland", Vector2(0f,0f))
|
val source = addTile("Grassland", Vector2(0f,0f))
|
||||||
@ -197,4 +209,26 @@ class VisibilityTests {
|
|||||||
assert(!viewableTiles.contains(beyondSight))
|
assert(!viewableTiles.contains(beyondSight))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun canSeeButNotAttackHillForestOverHill() {
|
||||||
|
val grassland = addTile("Grassland", Vector2(0f,0f))
|
||||||
|
addTile(listOf("Grassland", "Hill"), Vector2(1f,0f))
|
||||||
|
val hillForest = addTile(listOf("Grassland", "Hill", "Forest"), Vector2(2f, 0f))
|
||||||
|
val viewableTiles = grassland.getViewableTilesList(2)
|
||||||
|
assert(viewableTiles.contains(hillForest))
|
||||||
|
val attackableTiles = tileMap.getViewableTiles(grassland.position, 2, true)
|
||||||
|
assert(!attackableTiles.contains(hillForest))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun canSeeAndAttackMountainOverHill() {
|
||||||
|
val grassland = addTile("Grassland", Vector2(0f,0f))
|
||||||
|
addTile(listOf("Grassland", "Hill"), Vector2(1f,0f))
|
||||||
|
val mountain = addTile(listOf("Mountain"), Vector2(2f, 0f))
|
||||||
|
val viewableTiles = grassland.getViewableTilesList(2)
|
||||||
|
assert(viewableTiles.contains(mountain))
|
||||||
|
val attackableTiles = tileMap.getViewableTiles(grassland.position, 2, true)
|
||||||
|
assert(attackableTiles.contains(mountain))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user