diff --git a/android/build.gradle b/android/build.gradle index cefebf5a0b..f400f989ec 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,8 @@ android { applicationId "com.unciv.game" minSdkVersion 9 targetSdkVersion 25 - versionCode 18 - versionName "1.0" + versionCode 19 + versionName "1.1.0" } buildTypes { release { diff --git a/core/src/com/unciv/civinfo/CivilizationTech.java b/core/src/com/unciv/civinfo/CivilizationTech.java index f6e5dc8347..43f61c8921 100644 --- a/core/src/com/unciv/civinfo/CivilizationTech.java +++ b/core/src/com/unciv/civinfo/CivilizationTech.java @@ -76,7 +76,7 @@ public class CivilizationTech{ } } } - + } } diff --git a/core/src/com/unciv/civinfo/MapUnit.java b/core/src/com/unciv/civinfo/MapUnit.java index 9c99d520cc..0338e90043 100644 --- a/core/src/com/unciv/civinfo/MapUnit.java +++ b/core/src/com/unciv/civinfo/MapUnit.java @@ -56,7 +56,7 @@ public class MapUnit{ return tile.improvement==null && tile.canBuildImprovement(GameBasics.TileImprovements.get(chooseImprovement(tile))) && tile.hasViewableResource() - && CivilizationInfo.current().tileMap.getTilesAtDistance(tile.position,1).any(new Predicate() { + && tile.getNeighbors().any(new Predicate() { @Override public boolean evaluate(TileInfo arg0) { return arg0.owner!=null; diff --git a/core/src/com/unciv/civinfo/TileInfo.java b/core/src/com/unciv/civinfo/TileInfo.java index f65d1ab510..f1c93fd8af 100644 --- a/core/src/com/unciv/civinfo/TileInfo.java +++ b/core/src/com/unciv/civinfo/TileInfo.java @@ -167,4 +167,8 @@ public class TileInfo otherTile.unit = unit; unit = null; } + + public LinqCollection getNeighbors(){ + return CivilizationInfo.current().tileMap.getTilesAtDistance(position,1); + } } \ No newline at end of file diff --git a/core/src/com/unciv/civinfo/TileMap.java b/core/src/com/unciv/civinfo/TileMap.java index 25365ab7ca..53d0eca4dc 100644 --- a/core/src/com/unciv/civinfo/TileMap.java +++ b/core/src/com/unciv/civinfo/TileMap.java @@ -124,17 +124,6 @@ public class TileMap{ return distanceToTiles; } - public class BfsInfo{ - - final TileInfo parent; - final int totalDistance; - - public BfsInfo(TileInfo parent, int totalDistance) { - this.parent = parent; - this.totalDistance = totalDistance; - } - } - public LinqCollection getShortestPath(Vector2 origin, Vector2 destination, float currentMovement, int maxMovement){ LinqCollection toCheck = new LinqCollection(get(origin)); LinqHashMap parents = new LinqHashMap(); @@ -183,5 +172,33 @@ public class TileMap{ }).unit = GameBasics.Units.get(unit).getMapUnit(); // And if there's none, then kill me. } + public int getTileHeight(TileInfo tileInfo){ + int height=0; + if(new LinqCollection("Forest","Jungle").contains(tileInfo.terrainFeature)) height+=1; + if("Hill".equals(tileInfo.baseTerrain)) height+=2; + return height; + } + + public LinqCollection getViewableTiles(Vector2 position, int sightDistance){ + final LinqCollection tiles = getTilesInDistance(position,1); + if(get(position).baseTerrain.equals("Hill")) sightDistance+=1; + for (int i = 0; i <= sightDistance; i++) { + LinqCollection tilesForLayer = new LinqCollection(); + for (final TileInfo tile : getTilesAtDistance(position, i)) + if (tile.getNeighbors().any(new Predicate() { + @Override + public boolean evaluate(TileInfo arg0) { + if (!tiles.contains(arg0)) + return false; // Basically, if there's a viewable neighbor which is either flatlands, or I'm taller than him + int tileHeight = getTileHeight(arg0); + return tileHeight == 0 || getTileHeight(tile) > tileHeight; + } + })) tilesForLayer.add(tile); + tiles.addAll(tilesForLayer); + } + + return tiles; + } + } diff --git a/core/src/com/unciv/game/TileGroup.java b/core/src/com/unciv/game/TileGroup.java index 5d9b259774..5660964027 100644 --- a/core/src/com/unciv/game/TileGroup.java +++ b/core/src/com/unciv/game/TileGroup.java @@ -107,7 +107,7 @@ public class TileGroup extends Group { } if(tileInfo.roadStatus != RoadStatus.None){ - for (TileInfo neighbor : CivilizationInfo.current().tileMap.getTilesAtDistance(tileInfo.position,1)) { + for (TileInfo neighbor : tileInfo.getNeighbors()) { if (neighbor.roadStatus == RoadStatus.None) continue; if (!roadImages.containsKey(neighbor.position.toString())) { Image image = ImageGetter.getImage(ImageGetter.WhiteDot); diff --git a/core/src/com/unciv/game/WorldScreen.java b/core/src/com/unciv/game/WorldScreen.java index 1c7b2e3c46..2e65d5ef3a 100644 --- a/core/src/com/unciv/game/WorldScreen.java +++ b/core/src/com/unciv/game/WorldScreen.java @@ -701,8 +701,8 @@ public class WorldScreen extends CameraStageBaseScreen { return arg0.unit != null; } })) - for (Vector2 vector : HexMath.GetVectorsInDistance(tile.position, 2)) - ViewableVectorStrings.add(vector.toString()); + for (TileInfo tileInfo : game.civInfo.tileMap.getViewableTiles(tile.position,2)) + ViewableVectorStrings.add(tileInfo.position.toString()); for (String string : ViewableVectorStrings) if (tileGroups.containsKey(string))