From eedc0e30f2a891370de2905729e162261365da98 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Thu, 4 Jul 2019 19:54:51 +0300 Subject: [PATCH] Bonus as Attacker problem fixed --- .../com/unciv/logic/battle/BattleDamage.kt | 4 +- core/src/com/unciv/logic/map/TileInfo.kt | 11 +++--- .../src/com/unciv/ui/tilegroups/CityButton.kt | 3 +- .../com/unciv/ui/worldscreen/TileMapHolder.kt | 37 ++++++++++++++++--- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index 903813e774..7d014a4d6e 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -57,7 +57,7 @@ class BattleDamage{ if(combatant.getCivInfo().policies.isAdopted("Discipline") && combatant.isMelee() && combatant.getTile().neighbors.flatMap { it.getUnits() } - .any { it.civInfo==combatant.getCivInfo() && !it.type.isCivilian()}) + .any { it.civInfo==combatant.getCivInfo() && !it.type.isCivilian() && !it.type.isAirUnit()}) modifiers["Discipline"] = 0.15f val requiredResource = combatant.unit.baseUnit.requiredResource @@ -108,7 +108,7 @@ class BattleDamage{ } for (ability in attacker.unit.getUniques()) { - val regexResult = Regex("""Bonus as Attacker (\d*)%""").matchEntire(ability) //to do: extend to defender, and penalyy + val regexResult = Regex("""Bonus as Attacker [(\d*)]%""").matchEntire(ability) //to do: extend to defender, and penalyy if (regexResult == null) continue val bonus = regexResult.groups[1]!!.value.toFloat() / 100 if (modifiers.containsKey("Attacker Bonus")) diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index 423dba7b3b..218ae31d73 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -40,6 +40,7 @@ open class TileInfo { val toReturn = TileInfo() if(militaryUnit!=null) toReturn.militaryUnit=militaryUnit!!.clone() if(civilianUnit!=null) toReturn.civilianUnit=civilianUnit!!.clone() + for(airUnit in airUnits) toReturn.airUnits.add(airUnit.clone()) toReturn.position=position.cpy() toReturn.baseTerrain=baseTerrain toReturn.terrainFeature=terrainFeature @@ -62,12 +63,14 @@ open class TileInfo { } //region pure functions + + /** Returns military, civilian and air units in tile */ fun getUnits(): List { val list = ArrayList(2) if(militaryUnit!=null) list.add(militaryUnit!!) if(civilianUnit!=null) list.add(civilianUnit!!) + list.addAll(airUnits) return list - // this used to be "return listOf(militaryUnit,civilianUnit).filterNotNull()" but profiling revealed that that took considerably longer } fun getCity(): CityInfo? = owningCity @@ -293,10 +296,8 @@ open class TileInfo { isLand = getBaseTerrain().type==TerrainType.Land isOcean = baseTerrain == Constants.ocean - if(militaryUnit!=null) militaryUnit!!.currentTile = this - if(civilianUnit!=null) civilianUnit!!.currentTile = this - for (unit in getUnits()) { + unit.currentTile = this unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner),false) unit.setTransients() } @@ -311,7 +312,7 @@ open class TileInfo { val unitsInTile = getUnits() if (unitsInTile.isEmpty()) return false if (!unitsInTile.first().civInfo.isPlayerCivilization() && - unitsInTile.firstOrNull {it.isInvisible() == true} != null) { + unitsInTile.firstOrNull { it.isInvisible() } != null) { return true } return false diff --git a/core/src/com/unciv/ui/tilegroups/CityButton.kt b/core/src/com/unciv/ui/tilegroups/CityButton.kt index f8fef5c5f6..aefd7f46dd 100644 --- a/core/src/com/unciv/ui/tilegroups/CityButton.kt +++ b/core/src/com/unciv/ui/tilegroups/CityButton.kt @@ -63,7 +63,7 @@ class CityButton(val city: CityInfo, internal val tileGroup: WorldTileGroup, ski if (UnCivGame.Current.viewEntireMapForDebug || city.civInfo.isCurrentPlayer()) { // So you can click anywhere on the button to go to the city - touchable = Touchable.enabled + touchable = Touchable.childrenOnly // clicking swings the button a little down to allow selection of units there. // this also allows to target selected units to move to the city tile from elsewhere. @@ -91,6 +91,7 @@ class CityButton(val city: CityInfo, internal val tileGroup: WorldTileGroup, ski private fun getIconTable(): Table { val secondaryColor = city.civInfo.getNation().getSecondaryColor() val iconTable = Table() + iconTable.touchable=Touchable.enabled iconTable.background = ImageGetter.getDrawable("OtherIcons/civTableBackground.png") .tint(city.civInfo.getNation().getColor()) diff --git a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt index 13b255616f..752332c992 100644 --- a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt @@ -7,8 +7,10 @@ import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.InputEvent +import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.actions.FloatAction import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane +import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener import com.unciv.Constants import com.unciv.UnCivGame @@ -52,6 +54,10 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: } }) + + tileGroup.cityButtonLayerGroup.onClick("") { + showAircraft(tileGroup.tileInfo.getCity()!!) + } } actor = allTiles @@ -90,9 +96,10 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: unitActionOverlay?.remove() selectedTile = tileInfo - val previousSelectedUnit = worldScreen.bottomBar.unitTable.selectedUnit - worldScreen.bottomBar.unitTable.tileSelected(tileInfo) - val newSelectedUnit = worldScreen.bottomBar.unitTable.selectedUnit + val unitTable = worldScreen.bottomBar.unitTable + val previousSelectedUnit = unitTable.selectedUnit + unitTable.tileSelected(tileInfo) + val newSelectedUnit = unitTable.selectedUnit if (previousSelectedUnit != null && previousSelectedUnit.getTile() != tileInfo && previousSelectedUnit.canMoveTo(tileInfo) && previousSelectedUnit.movementAlgs().canReach(tileInfo)) { @@ -100,6 +107,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: moveHere(previousSelectedUnit, tileInfo) } + if(newSelectedUnit==null || newSelectedUnit.type==UnitType.Civilian){ val unitsInTile = selectedTile!!.getUnits() if(unitsInTile.isNotEmpty() && unitsInTile.first().civInfo.isAtWarWith(worldScreen.currentPlayerCiv)){ @@ -108,7 +116,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: .filter { it.isCityCenter() }.map { it.getCity()!! } .filter { !it.attackedThisTurn } if(citiesThatCanBombard.isNotEmpty()) - worldScreen.bottomBar.unitTable.citySelected(citiesThatCanBombard.first()) + unitTable.citySelected(citiesThatCanBombard.first()) } } @@ -191,7 +199,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: actor.center(group) actor.x+=group.x actor.y+=group.y - group.parent.addActor(actor) + group.parent.addActor(actor) // Add the overlay to the TileGroupMap - it's what actually displays all the tiles actor.toFront() actor.y += actor.height @@ -287,6 +295,25 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: } } + private fun showAircraft(city:CityInfo){ + if (city.getCenterTile().airUnits.isEmpty()) return + val airUnitsTable = Table().apply { defaults().pad(10f) } + for(unit in city.getCenterTile().airUnits){ + val unitGroup = UnitGroup(unit,60f).surroundWithCircle(80f) + unitGroup.circle.color = Color.GRAY.cpy().apply { a=0.5f } + unitGroup.touchable=Touchable.enabled + unitGroup.onClick { + worldScreen.bottomBar.unitTable.selectedUnit=unit + worldScreen.shouldUpdate=true + unitGroup.circle.color = Color.WHITE + } + airUnitsTable.add(unitGroup) + } + airUnitsTable.height=60f + unitActionOverlay?.remove() + addOverlayOnTileGroup(city.getCenterTile(),airUnitsTable) + } + fun setCenterPosition(vector: Vector2, immediately: Boolean = false, selectUnit: Boolean = true) { val tileGroup = tileGroups.values.first { it.tileInfo.position == vector } selectedTile = tileGroup.tileInfo