diff --git a/android/Images/StatIcons/Range.png b/android/Images/StatIcons/Range.png new file mode 100644 index 00000000..8d5cee14 Binary files /dev/null and b/android/Images/StatIcons/Range.png differ diff --git a/android/assets/game.atlas b/android/assets/game.atlas index 717421b2..c70034a1 100644 --- a/android/assets/game.atlas +++ b/android/assets/game.atlas @@ -1294,77 +1294,77 @@ PolicyIcons/Protectionism index: -1 PolicyIcons/Reformation rotate: false - xy: 1714, 3 + xy: 1766, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Representation rotate: false - xy: 1766, 3 + xy: 1818, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Republic rotate: false - xy: 1818, 3 + xy: 1870, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Scientific Revolution rotate: false - xy: 1870, 3 + xy: 1922, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Secularism rotate: false - xy: 1922, 3 + xy: 1974, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Sovereignty rotate: false - xy: 1974, 3 + xy: 2026, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Theocracy rotate: false - xy: 2026, 3 + xy: 2078, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Total War rotate: false - xy: 2078, 3 + xy: 2130, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Trade Unions rotate: false - xy: 2130, 3 + xy: 2182, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Universal Suffrage rotate: false - xy: 2182, 3 + xy: 2234, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 PolicyIcons/Warrior Code rotate: false - xy: 2234, 3 + xy: 2286, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 @@ -1642,13 +1642,20 @@ StatIcons/Production orig: 200, 200 offset: 0, 0 index: -1 -StatIcons/RangedStrength +StatIcons/Range rotate: false xy: 1662, 3 size: 50, 50 orig: 50, 50 offset: 0, 0 index: -1 +StatIcons/RangedStrength + rotate: false + xy: 1714, 3 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 StatIcons/Resistance rotate: false xy: 1304, 413 @@ -2337,21 +2344,21 @@ TileSets/FantasyHex/Desert+Oasis index: -1 TileSets/FantasyHex/Grassland rotate: false - xy: 2286, 25 + xy: 2338, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/TopRightBorder rotate: false - xy: 2286, 25 + xy: 2338, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Grassland+Forest rotate: false - xy: 2426, 414 + xy: 2426, 413 size: 31, 29 orig: 31, 29 offset: 0, 0 @@ -2386,7 +2393,7 @@ TileSets/FantasyHex/Hill+Forest index: -1 TileSets/FantasyHex/Lakes rotate: false - xy: 2320, 25 + xy: 2372, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 @@ -2407,56 +2414,56 @@ TileSets/FantasyHex/Ocean index: -1 TileSets/FantasyHex/Plains rotate: false - xy: 2354, 25 + xy: 2406, 25 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+City rotate: false - xy: 2388, 18 + xy: 2426, 580 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+Forest rotate: false - xy: 2438, 1523 + xy: 2426, 545 size: 32, 33 orig: 32, 33 offset: 0, 0 index: -1 TileSets/FantasyHex/Plains+Jungle rotate: false - xy: 2426, 580 + xy: 2426, 508 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/TopBorder rotate: false - xy: 2426, 550 + xy: 2426, 478 size: 32, 28 orig: 32, 28 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra rotate: false - xy: 2426, 516 + xy: 2426, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra+City rotate: false - xy: 2426, 479 + xy: 2438, 1521 size: 32, 35 orig: 32, 35 offset: 0, 0 index: -1 TileSets/FantasyHex/Tundra+Forest rotate: false - xy: 2426, 445 + xy: 1006, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3051,7 +3058,7 @@ UnitPromotionIcons/Boarding_Party_II_(Civ5) index: -1 UnitPromotionIcons/Boarding_Party_I_(Civ5) rotate: false - xy: 2459, 423 + xy: 2459, 422 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -3072,147 +3079,147 @@ UnitPromotionIcons/Bombardment_II_(Civ5) index: -1 UnitPromotionIcons/Bombardment_I_(Civ5) rotate: false - xy: 538, 5 + xy: 2442, 55 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Charge_(Civ5) rotate: false - xy: 1006, 27 + xy: 2338, 3 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_III_(Civ5) rotate: false - xy: 2442, 55 + xy: 458, 669 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_II_(Civ5) rotate: false - xy: 458, 669 + xy: 2440, 33 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Coastal_Raider_I_(Civ5) rotate: false - xy: 2286, 3 + xy: 538, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_II_(Civ5) rotate: false - xy: 2422, 33 + xy: 1172, 1281 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Cover_I_(Civ5) rotate: false - xy: 1172, 1281 + xy: 312, 51 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_III_(Civ5) rotate: false - xy: 312, 51 + xy: 334, 71 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_II_(Civ5) rotate: false - xy: 334, 71 + xy: 281, 1643 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Drill_I_(Civ5) rotate: false - xy: 281, 1643 + xy: 379, 1259 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_II_(Civ5) rotate: false - xy: 379, 1259 + xy: 2360, 3 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Formation_I_(Civ5) rotate: false - xy: 560, 5 + xy: 458, 647 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Heal_Instantly_(Civ5) rotate: false - xy: 458, 647 + xy: 560, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Indirect_Fire_(Civ5) rotate: false - xy: 2308, 3 + xy: 1172, 1259 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Logistics_(Civ5) rotate: false - xy: 1172, 1259 + xy: 312, 29 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/March_(Civ5) rotate: false - xy: 312, 29 + xy: 334, 49 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Medic_(Civ5) rotate: false - xy: 334, 49 + xy: 356, 71 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Medic_II_(Civ5) rotate: false - xy: 334, 49 + xy: 356, 71 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Mobility_(Civ5) rotate: false - xy: 356, 71 + xy: 281, 1621 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Range_(Civ5) rotate: false - xy: 281, 1621 + xy: 379, 1237 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Scouting_III_(Civ5) rotate: false - xy: 379, 1237 + xy: 2382, 3 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -3226,28 +3233,28 @@ UnitPromotionIcons/Scouting_II_(Civ5) index: -1 UnitPromotionIcons/Scouting_I_(Civ5) rotate: false - xy: 2330, 3 + xy: 356, 49 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Sentry_(Civ5) rotate: false - xy: 356, 49 + xy: 378, 71 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Shock_III_(Civ5) rotate: false - xy: 378, 71 + xy: 379, 1215 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Shock_II_(Civ5) rotate: false - xy: 379, 1215 + xy: 2404, 3 size: 20, 20 orig: 20, 20 offset: 0, 0 @@ -3261,63 +3268,63 @@ UnitPromotionIcons/Shock_I_(Civ5) index: -1 UnitPromotionIcons/Siege_(Civ5) rotate: false - xy: 2352, 3 + xy: 378, 49 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_III_(Civ5) rotate: false - xy: 378, 49 + xy: 400, 71 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_II_(Civ5) rotate: false - xy: 400, 71 + xy: 626, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Targeting_I_(Civ5) rotate: false - xy: 626, 5 + xy: 400, 49 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Volley_(Civ5) rotate: false - xy: 400, 49 + xy: 648, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_III_(Civ5) rotate: false - xy: 648, 5 + xy: 670, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_II_(Civ5) rotate: false - xy: 670, 5 + xy: 692, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Wolfpack_I_(Civ5) rotate: false - xy: 692, 5 + xy: 714, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 index: -1 UnitPromotionIcons/Woodsman_(Civ5) rotate: false - xy: 714, 5 + xy: 736, 5 size: 20, 20 orig: 20, 20 offset: 0, 0 diff --git a/android/assets/game.png b/android/assets/game.png index 55977d6f..18e49e07 100644 Binary files a/android/assets/game.png and b/android/assets/game.png differ diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index c04d34a3..3a130e26 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -838,18 +838,20 @@ hurryCostModifier:20, attackSound:"shot" }, - /* + { name:"Triplane", unitType:"AirFighter", movement:1, - strength:34, - cost: 225, + strength:35, + rangedStrength:35, + range:5, + cost: 325, requiredTech:"Flight", hurryCostModifier:20, attackSound:"shot" }, - */ + /* { name:"Norvegian Ski Infantry", diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 81c29a58..74a3bf84 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -129,18 +129,23 @@ class MapUnit { // we need to map all the places that this could change: Unit changes locations, owners, gets promotion? fun updateViewableTiles() { - var visibilityRange = 2 - visibilityRange += getUniques().count{it=="+1 Visibility Range"} - if(hasUnique("Limited Visibility")) visibilityRange-=1 - if(civInfo.getNation().unique=="All land military units have +1 sight, 50% discount when purchasing tiles") - visibilityRange += 1 - if(type.isWaterUnit() && !type.isCivilian() - && civInfo.getBuildingUniques().contains("All military naval units receive +1 movement and +1 sight")) - visibilityRange += 1 - val tile = getTile() - if (tile.baseTerrain == Constants.hill && type.isLandUnit()) visibilityRange += 1 - viewableTiles = tile.getViewableTiles(visibilityRange, type.isWaterUnit()) + if(type.isAirUnit()){ + viewableTiles = getTile().getTilesInDistance(6) // it's that simple + } + else { + var visibilityRange = 2 + visibilityRange += getUniques().count { it == "+1 Visibility Range" } + if (hasUnique("Limited Visibility")) visibilityRange -= 1 + if (civInfo.getNation().unique == "All land military units have +1 sight, 50% discount when purchasing tiles") + visibilityRange += 1 + if (type.isWaterUnit() && !type.isCivilian() + && civInfo.getBuildingUniques().contains("All military naval units receive +1 movement and +1 sight")) + visibilityRange += 1 + val tile = getTile() + if (tile.baseTerrain == Constants.hill && type.isLandUnit()) visibilityRange += 1 + viewableTiles = tile.getViewableTiles(visibilityRange, type.isWaterUnit()) + } civInfo.updateViewableTiles() // for the civ } diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index 1ab5def2..2d28f0f4 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -143,6 +143,11 @@ class UnitMovementAlgorithms(val unit:MapUnit) { val currentTile = unit.getTile() if (currentTile == destination) return currentTile + if(unit.type.isAirUnit()){ + unit.moveToTile(destination) + return destination + } + val distanceToTiles = unit.getDistanceToTiles() val destinationTileThisTurn: TileInfo @@ -174,6 +179,8 @@ class UnitMovementAlgorithms(val unit:MapUnit) { } fun canReach(destination: TileInfo): Boolean { + if(unit.type.isAirUnit()) + return unit.currentTile.arialDistanceTo(destination) <= unit.getRange() return getShortestPath(destination).isNotEmpty() } diff --git a/core/src/com/unciv/models/gamebasics/unit/UnitType.kt b/core/src/com/unciv/models/gamebasics/unit/UnitType.kt index 2cc44a0d..68cb0c28 100644 --- a/core/src/com/unciv/models/gamebasics/unit/UnitType.kt +++ b/core/src/com/unciv/models/gamebasics/unit/UnitType.kt @@ -31,6 +31,7 @@ enum class UnitType{ || this == WaterRanged || this == WaterSubmarine || this == City + || this.isAirUnit() } fun isLandUnit(): Boolean { diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index e00f0829..1403f3ef 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -14,6 +14,7 @@ class WorldTileGroup(internal val worldScreen: WorldScreen, tileInfo: TileInfo) var cityButton: CityButton? = null fun selectUnit(unit: MapUnit) { + if(unit.type.isAirUnit()) return // doesn't appear on map so nothing to select val unitImage = if (unit.type.isCivilian()) civilianUnitImage else militaryUnitImage unitImage?.selectUnit() diff --git a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt index c6a06ccd..8f23a5ef 100644 --- a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt @@ -131,7 +131,8 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: * The only "heavy lifting" that needs to be done is getting the turns to get there, * so that and that alone will be relegated to the concurrent thread. */ - val turnsToGetThere = selectedUnit.movementAlgs().getShortestPath(tileInfo).size // this is what takes the most time, tbh + val turnsToGetThere = if(selectedUnit.type.isAirUnit()) 1 + else selectedUnit.movementAlgs().getShortestPath(tileInfo).size // this is what takes the most time, tbh Gdx.app.postRunnable { if(UnCivGame.Current.settings.singleTapMove && turnsToGetThere==1) { @@ -284,9 +285,14 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: tileGroups[unit.getTile()]!!.selectUnit(unit) - for (tile: TileInfo in unit.getDistanceToTiles().keys) + val isAirUnit = unit.type.isAirUnit() + val tilesInMoveRange = if(isAirUnit) unit.getTile().getTilesInDistance(unit.getRange()) + else unit.getDistanceToTiles().keys + + for (tile: TileInfo in tilesInMoveRange) if (unit.canMoveTo(tile)) - tileGroups[tile]!!.showCircle(Color.WHITE, if (UnCivGame.Current.settings.singleTapMove) 0.7f else 0.3f) + tileGroups[tile]!!.showCircle(Color.WHITE, + if (UnCivGame.Current.settings.singleTapMove || isAirUnit) 0.7f else 0.3f) val unitType = unit.type val attackableTiles: List = when { diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt index 35766e2d..c14f6da7 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt @@ -132,6 +132,11 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){ unitDescriptionTable.add(unit.baseUnit().rangedStrength.toString()).padRight(10f) } + if(unit.type.isRanged()){ + unitDescriptionTable.add(ImageGetter.getStatIcon("Range")).size(20f) + unitDescriptionTable.add(unit.getRange().toString()).padRight(10f) + } + if (!unit.type.isCivilian()) { unitDescriptionTable.add("XP") unitDescriptionTable.add(unit.promotions.XP.toString()+"/"+unit.promotions.xpForNextPromotion())