From 36d7b302794af40808dd221b3115b5f2723c1d67 Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Wed, 12 Dec 2018 22:47:49 +0800 Subject: [PATCH] Submarine is invisible now, except to submarines and destroyers. But it still can be aimed by everybody. --- android/assets/jsons/Units.json | 4 ++-- .../com/unciv/logic/civilization/CivilizationInfo.kt | 4 ++++ core/src/com/unciv/logic/map/MapUnit.kt | 6 ++++++ core/src/com/unciv/logic/map/TileInfo.kt | 9 +++++++++ core/src/com/unciv/ui/cityscreen/CityTileGroup.kt | 6 ++++-- core/src/com/unciv/ui/tilegroups/TileGroup.kt | 4 ++-- core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt | 4 ++-- core/src/com/unciv/ui/worldscreen/TileMapHolder.kt | 12 ++++++++++-- 8 files changed, 39 insertions(+), 10 deletions(-) diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index 9bd35b5b62..42c9fc52ac 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -467,7 +467,7 @@ strength:55, cost: 375, requiredTech:"Combustion", - uniques:[], // todo: add interception and bonus vs submarines once we have air and submarine units + uniques:["Can attack submarines"], // todo: add interception and bonus vs submarines once we have air and submarine units hurryCostModifier:20 }, { @@ -491,7 +491,7 @@ rangedStrength: 60, cost: 325, requiredTech:"Refrigeration", - uniques:["Bonus as Attacker 75%", "Invisible to others", "Can Only Attack Water"], //to do: 3 uniques + uniques:["Bonus as Attacker 75%", "Invisible to others", "Can Only Attack Water", "Can attack submarines"], //to do: 3 uniques hurryCostModifier:20 }, { diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 39131a2246..bbad8a3f62 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -33,6 +33,7 @@ class CivilizationInfo { */ @Transient private var units=ArrayList() @Transient var viewableTiles = HashSet() + @Transient var viewableInvisibleUnitsTiles = HashSet() var gold = 0 var happiness = 15 @@ -228,6 +229,9 @@ class CivilizationInfo { newViewableTiles.addAll(getCivUnits().flatMap { it.getViewableTiles()}) viewableTiles = newViewableTiles // to avoid concurrent modification problems + val newViewableInvisibleTiles = HashSet() + newViewableInvisibleTiles.addAll(getCivUnits().filter {it.hasUnique("Can attack submarines")}.flatMap {it.getViewableTiles()}) + viewableInvisibleUnitsTiles = newViewableInvisibleTiles // updating the viewable tiles also affects the explored tiles, obvs val newExploredTiles = HashSet(exploredTiles) diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index fa2bd698cb..708e54f0aa 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -177,6 +177,12 @@ class MapUnit { return currentTile.baseTerrain=="Ocean"||currentTile.baseTerrain=="Coast" } + fun isInvisible(): Boolean { + if(hasUnique("Invisible to others")) + return true + return false + } + fun getEmbarkedMovement(): Int { var movement=2 movement += civInfo.tech.getUniques().count { it == "Increases embarked movement +1" } diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 4b952f2660..16edd89db1 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -281,5 +281,14 @@ open class TileInfo { turnsToImprovement = improvement.getTurnsToBuild(civInfo) } + fun hasEnemySubmarine(): Boolean { + val unitsInTile = getUnits() + if (unitsInTile.isEmpty()) return false + if (!unitsInTile.first().civInfo.isPlayerCivilization() && + unitsInTile.firstOrNull {it.isInvisible() == true} != null) { + return true + } + return false + } //endregion } \ No newline at end of file diff --git a/core/src/com/unciv/ui/cityscreen/CityTileGroup.kt b/core/src/com/unciv/ui/cityscreen/CityTileGroup.kt index 5136aa00cc..90ac763efb 100644 --- a/core/src/com/unciv/ui/cityscreen/CityTileGroup.kt +++ b/core/src/com/unciv/ui/cityscreen/CityTileGroup.kt @@ -23,8 +23,10 @@ class CityTileGroup(private val city: CityInfo, tileInfo: TileInfo) : TileGroup( fun update() { val canSeeTile = UnCivGame.Current.viewEntireMapForDebug || city.civInfo.viewableTiles.contains(tileInfo) - - super.update(canSeeTile,true) + val showSubmarine = UnCivGame.Current.viewEntireMapForDebug + || city.civInfo.viewableInvisibleUnitsTiles.contains(tileInfo) + || (!tileInfo.hasEnemySubmarine()) + super.update(canSeeTile,true, showSubmarine) updatePopulationImage() if (improvementImage != null) improvementImage!!.setColor(1f, 1f, 1f, 0.5f) diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index b065ad5401..16178dc601 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -133,7 +133,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { } - open fun update(isViewable: Boolean, showResourcesAndImprovements:Boolean) { + open fun update(isViewable: Boolean, showResourcesAndImprovements:Boolean, showSubmarine: Boolean) { hideCircle() if (!UnCivGame.Current.viewEntireMapForDebug && !tileInfo.tileMap.gameInfo.getPlayerCivilization().exploredTiles.contains(tileInfo.position)) { @@ -150,7 +150,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { civilianUnitImage = newUnitImage(tileInfo.civilianUnit, civilianUnitImage, isViewable, -20f) - militaryUnitImage = newUnitImage(tileInfo.militaryUnit, militaryUnitImage, isViewable, 20f) + militaryUnitImage = newUnitImage(tileInfo.militaryUnit, militaryUnitImage, isViewable && showSubmarine, 20f) updateRoadImages() updateBorderImages() diff --git a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt index 1c7ab8dd3c..74088d9138 100644 --- a/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/WorldTileGroup.kt @@ -23,7 +23,7 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { } - fun update(isViewable: Boolean) { + fun update(isViewable: Boolean, showSubmarine: Boolean) { val city = tileInfo.getCity() removePopulationIcon() @@ -36,7 +36,7 @@ class WorldTileGroup(tileInfo: TileInfo) : TileGroup(tileInfo) { updateCityButton(city, isViewable || UnCivGame.Current.viewEntireMapForDebug) // needs to be before the update so the units will be above the city button super.update(isViewable || UnCivGame.Current.viewEntireMapForDebug, - UnCivGame.Current.settings.showResourcesAndImprovements) + UnCivGame.Current.settings.showResourcesAndImprovements, showSubmarine) yieldGroup.isVisible = !UnCivGame.Current.settings.showResourcesAndImprovements if (yieldGroup.isVisible) diff --git a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt index caf98fe75e..a22ff36b1a 100644 --- a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt @@ -180,6 +180,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: internal fun updateTiles(civInfo: CivilizationInfo) { val playerViewableTilePositions = civInfo.viewableTiles.map { it.position }.toHashSet() + val playerViewableInvisibleUnitsTilePositions = civInfo.viewableInvisibleUnitsTiles.map { it.position }.toHashSet() cityButtonOverlays.forEach{it.remove()} cityButtonOverlays.clear() @@ -187,9 +188,16 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: for (tileGroup in tileGroups.values){ val canSeeTile = UnCivGame.Current.viewEntireMapForDebug || playerViewableTilePositions.contains(tileGroup.tileInfo.position) - tileGroup.update(canSeeTile) + + val showSubmarine = UnCivGame.Current.viewEntireMapForDebug + || playerViewableInvisibleUnitsTilePositions.contains(tileGroup.tileInfo.position) + || (!tileGroup.tileInfo.hasEnemySubmarine()) + tileGroup.update(canSeeTile, showSubmarine) + val unitsInTile = tileGroup.tileInfo.getUnits() - if(canSeeTile && unitsInTile.isNotEmpty() && !unitsInTile.first().civInfo.isPlayerCivilization()) + val canSeeEnemy = unitsInTile.isNotEmpty() && !unitsInTile.first().civInfo.isPlayerCivilization() + && (showSubmarine || unitsInTile.firstOrNull {!it.isInvisible()}!=null) + if(canSeeTile && canSeeEnemy) tileGroup.showCircle(Color.RED) // Display ALL viewable enemies with a red circle so that users don't need to go "hunting" for enemy units }