From d47d59146f45ec60bb4e6dfd4eace33d32df7131 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Mon, 4 Dec 2017 16:02:27 +0200 Subject: [PATCH] Added movement costs to tiles and computed tiles that unit can travel to, and the distance (including roads) --- android/assets/TerrainIcons/road.png | Bin 0 -> 145 bytes android/assets/jsons/Terrains.json | 10 +++++ core/src/com/unciv/civinfo/TileInfo.java | 5 ++- core/src/com/unciv/civinfo/TileMap.java | 29 ++++++++++++++- core/src/com/unciv/civinfo/Unit.java | 2 +- core/src/com/unciv/game/WorldScreen.java | 35 ++++++++++-------- .../com/unciv/models/gamebasics/Terrain.java | 1 + 7 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 android/assets/TerrainIcons/road.png diff --git a/android/assets/TerrainIcons/road.png b/android/assets/TerrainIcons/road.png new file mode 100644 index 0000000000000000000000000000000000000000..caed4bfb99fb7c2a2adba832ecee22c5a7158a74 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^wm{6y!2~3om4*0#6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?2=RS;(M3{v?36jbwcaSZYBPQDQ-YA14W#qO8gZg+j-O tiles = new LinqHashMap(); @@ -86,6 +84,33 @@ public class TileMap{ return tiles; } + public LinqHashMap getDistanceToTiles(Vector2 origin, float maximumMovement){ + LinqHashMap distanceToTiles = new LinqHashMap(); + distanceToTiles.put(get(origin), 0f); + LinqCollection tilesToCheck = new LinqCollection(); + tilesToCheck.add(get(origin)); + while(!tilesToCheck.isEmpty()){ + LinqCollection updatedTiles = new LinqCollection(); + for(TileInfo tileToCheck : tilesToCheck) + for (TileInfo maybeUpdatedTile : getTilesInDistance(tileToCheck.position,1)) { + float distanceBetweenTiles = maybeUpdatedTile.getLastTerrain().movementCost; + if(tileToCheck.roadStatus!=RoadStatus.None && maybeUpdatedTile.roadStatus!=RoadStatus.None) distanceBetweenTiles = 1/3f; + if(tileToCheck.roadStatus==RoadStatus.Railroad && maybeUpdatedTile.roadStatus==RoadStatus.Railroad) distanceBetweenTiles = 1/10f; + float totalDistanceToTile = distanceToTiles.get(tileToCheck)+ distanceBetweenTiles; + if (!distanceToTiles.containsKey(maybeUpdatedTile) || distanceToTiles.get(maybeUpdatedTile) > totalDistanceToTile) { + + if(totalDistanceToTile values(){return tiles.linqValues();} TileResource GetRandomResource(LinqCollection resources, final ResourceType resourceType) { diff --git a/core/src/com/unciv/civinfo/Unit.java b/core/src/com/unciv/civinfo/Unit.java index d30f68950d..e3a1f194a6 100644 --- a/core/src/com/unciv/civinfo/Unit.java +++ b/core/src/com/unciv/civinfo/Unit.java @@ -3,7 +3,7 @@ package com.unciv.civinfo; public class Unit{ public String Name; public int MaxMovement; - public int CurrentMovement; + public float CurrentMovement; public Unit(){} // for json parsing, we need to have a default constructor diff --git a/core/src/com/unciv/game/WorldScreen.java b/core/src/com/unciv/game/WorldScreen.java index 7f8a7113d2..99c96225a3 100644 --- a/core/src/com/unciv/game/WorldScreen.java +++ b/core/src/com/unciv/game/WorldScreen.java @@ -212,19 +212,21 @@ public class WorldScreen extends CameraStageBaseScreen { group.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { - selectedTile = tileInfo; - if(unitTile != null && group.tileInfo.unit == null ) { - int distance = HexMath.GetDistance(unitTile.position, group.tileInfo.position); - if (distance <= unitTile.unit.CurrentMovement) { - unitTile.unit.CurrentMovement -= distance; - group.tileInfo.unit = unitTile.unit; - unitTile.unit = null; - unitTile = null; - selectedTile = group.tileInfo; - } + selectedTile = tileInfo; + if(unitTile != null && group.tileInfo.unit == null ) { + LinqHashMap distanceToTiles = game.civInfo.tileMap.getDistanceToTiles(unitTile.position,unitTile.unit.CurrentMovement); + if(distanceToTiles.containsKey(selectedTile)) { + unitTile.unit.CurrentMovement -= distanceToTiles.get(selectedTile); + unitTile.unit.CurrentMovement = round(unitTile.unit.CurrentMovement,3); + if(unitTile.unit.CurrentMovement < 0.1) unitTile.unit.CurrentMovement=0; // silly floats which are "almost zero" + group.tileInfo.unit = unitTile.unit; + unitTile.unit = null; + unitTile = null; + selectedTile = group.tileInfo; } + } - update(); + update(); } }); @@ -327,10 +329,9 @@ public class WorldScreen extends CameraStageBaseScreen { // Set all tiles transparent except those in unit range for(TileGroup TG : tileGroups.linqValues()) TG.setColor(0,0,0,0.3f); - for(Vector2 vector : HexMath.GetVectorsInDistance(unitTile.position, unitTile.unit.CurrentMovement)){ - if(tileGroups.containsKey(vector.toString())) - tileGroups.get(vector.toString()).setColor(Color.WHITE); - } + for(TileInfo tile : game.civInfo.tileMap.getDistanceToTiles(unitTile.position,unitTile.unit.CurrentMovement).keySet()){ + tileGroups.get(tile.position.toString()).setColor(Color.WHITE); + } update(); } @@ -456,6 +457,10 @@ public class WorldScreen extends CameraStageBaseScreen { scrollPane.updateVisualScroll(); } + float round(float value, int scale){ + return (float) (Math.round(value * Math.pow(10, scale)) / Math.pow(10, scale)); + } + } diff --git a/core/src/com/unciv/models/gamebasics/Terrain.java b/core/src/com/unciv/models/gamebasics/Terrain.java index 7ed7045313..8016b25934 100644 --- a/core/src/com/unciv/models/gamebasics/Terrain.java +++ b/core/src/com/unciv/models/gamebasics/Terrain.java @@ -30,6 +30,7 @@ public class Terrain extends NamedStats implements ICivilopedia { *For terrain features - which technology alllows removal of this feature */ public String removalTech; + public int movementCost=1; public String rgb;