Bonus as Attacker problem fixed

This commit is contained in:
Yair Morgenstern 2019-07-04 19:54:51 +03:00
parent 185ec10f10
commit eedc0e30f2
4 changed files with 42 additions and 13 deletions

View File

@ -57,7 +57,7 @@ class BattleDamage{
if(combatant.getCivInfo().policies.isAdopted("Discipline") && combatant.isMelee() if(combatant.getCivInfo().policies.isAdopted("Discipline") && combatant.isMelee()
&& combatant.getTile().neighbors.flatMap { it.getUnits() } && 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 modifiers["Discipline"] = 0.15f
val requiredResource = combatant.unit.baseUnit.requiredResource val requiredResource = combatant.unit.baseUnit.requiredResource
@ -108,7 +108,7 @@ class BattleDamage{
} }
for (ability in attacker.unit.getUniques()) { 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 if (regexResult == null) continue
val bonus = regexResult.groups[1]!!.value.toFloat() / 100 val bonus = regexResult.groups[1]!!.value.toFloat() / 100
if (modifiers.containsKey("Attacker Bonus")) if (modifiers.containsKey("Attacker Bonus"))

View File

@ -40,6 +40,7 @@ open class TileInfo {
val toReturn = TileInfo() val toReturn = TileInfo()
if(militaryUnit!=null) toReturn.militaryUnit=militaryUnit!!.clone() if(militaryUnit!=null) toReturn.militaryUnit=militaryUnit!!.clone()
if(civilianUnit!=null) toReturn.civilianUnit=civilianUnit!!.clone() if(civilianUnit!=null) toReturn.civilianUnit=civilianUnit!!.clone()
for(airUnit in airUnits) toReturn.airUnits.add(airUnit.clone())
toReturn.position=position.cpy() toReturn.position=position.cpy()
toReturn.baseTerrain=baseTerrain toReturn.baseTerrain=baseTerrain
toReturn.terrainFeature=terrainFeature toReturn.terrainFeature=terrainFeature
@ -62,12 +63,14 @@ open class TileInfo {
} }
//region pure functions //region pure functions
/** Returns military, civilian and air units in tile */
fun getUnits(): List<MapUnit> { fun getUnits(): List<MapUnit> {
val list = ArrayList<MapUnit>(2) val list = ArrayList<MapUnit>(2)
if(militaryUnit!=null) list.add(militaryUnit!!) if(militaryUnit!=null) list.add(militaryUnit!!)
if(civilianUnit!=null) list.add(civilianUnit!!) if(civilianUnit!=null) list.add(civilianUnit!!)
list.addAll(airUnits)
return list return list
// this used to be "return listOf(militaryUnit,civilianUnit).filterNotNull()" but profiling revealed that that took considerably longer
} }
fun getCity(): CityInfo? = owningCity fun getCity(): CityInfo? = owningCity
@ -293,10 +296,8 @@ open class TileInfo {
isLand = getBaseTerrain().type==TerrainType.Land isLand = getBaseTerrain().type==TerrainType.Land
isOcean = baseTerrain == Constants.ocean isOcean = baseTerrain == Constants.ocean
if(militaryUnit!=null) militaryUnit!!.currentTile = this
if(civilianUnit!=null) civilianUnit!!.currentTile = this
for (unit in getUnits()) { for (unit in getUnits()) {
unit.currentTile = this
unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner),false) unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner),false)
unit.setTransients() unit.setTransients()
} }
@ -311,7 +312,7 @@ open class TileInfo {
val unitsInTile = getUnits() val unitsInTile = getUnits()
if (unitsInTile.isEmpty()) return false if (unitsInTile.isEmpty()) return false
if (!unitsInTile.first().civInfo.isPlayerCivilization() && if (!unitsInTile.first().civInfo.isPlayerCivilization() &&
unitsInTile.firstOrNull {it.isInvisible() == true} != null) { unitsInTile.firstOrNull { it.isInvisible() } != null) {
return true return true
} }
return false return false

View File

@ -63,7 +63,7 @@ class CityButton(val city: CityInfo, internal val tileGroup: WorldTileGroup, ski
if (UnCivGame.Current.viewEntireMapForDebug || city.civInfo.isCurrentPlayer()) { if (UnCivGame.Current.viewEntireMapForDebug || city.civInfo.isCurrentPlayer()) {
// So you can click anywhere on the button to go to the city // 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. // 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. // 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 { private fun getIconTable(): Table {
val secondaryColor = city.civInfo.getNation().getSecondaryColor() val secondaryColor = city.civInfo.getNation().getSecondaryColor()
val iconTable = Table() val iconTable = Table()
iconTable.touchable=Touchable.enabled
iconTable.background = ImageGetter.getDrawable("OtherIcons/civTableBackground.png") iconTable.background = ImageGetter.getDrawable("OtherIcons/civTableBackground.png")
.tint(city.civInfo.getNation().getColor()) .tint(city.civInfo.getNation().getColor())

View File

@ -7,8 +7,10 @@ import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.Actor import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.InputEvent 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.actions.FloatAction
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane 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.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener
import com.unciv.Constants import com.unciv.Constants
import com.unciv.UnCivGame 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 actor = allTiles
@ -90,9 +96,10 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
unitActionOverlay?.remove() unitActionOverlay?.remove()
selectedTile = tileInfo selectedTile = tileInfo
val previousSelectedUnit = worldScreen.bottomBar.unitTable.selectedUnit val unitTable = worldScreen.bottomBar.unitTable
worldScreen.bottomBar.unitTable.tileSelected(tileInfo) val previousSelectedUnit = unitTable.selectedUnit
val newSelectedUnit = worldScreen.bottomBar.unitTable.selectedUnit unitTable.tileSelected(tileInfo)
val newSelectedUnit = unitTable.selectedUnit
if (previousSelectedUnit != null && previousSelectedUnit.getTile() != tileInfo if (previousSelectedUnit != null && previousSelectedUnit.getTile() != tileInfo
&& previousSelectedUnit.canMoveTo(tileInfo) && previousSelectedUnit.movementAlgs().canReach(tileInfo)) { && previousSelectedUnit.canMoveTo(tileInfo) && previousSelectedUnit.movementAlgs().canReach(tileInfo)) {
@ -100,6 +107,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
moveHere(previousSelectedUnit, tileInfo) moveHere(previousSelectedUnit, tileInfo)
} }
if(newSelectedUnit==null || newSelectedUnit.type==UnitType.Civilian){ if(newSelectedUnit==null || newSelectedUnit.type==UnitType.Civilian){
val unitsInTile = selectedTile!!.getUnits() val unitsInTile = selectedTile!!.getUnits()
if(unitsInTile.isNotEmpty() && unitsInTile.first().civInfo.isAtWarWith(worldScreen.currentPlayerCiv)){ 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.isCityCenter() }.map { it.getCity()!! }
.filter { !it.attackedThisTurn } .filter { !it.attackedThisTurn }
if(citiesThatCanBombard.isNotEmpty()) 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.center(group)
actor.x+=group.x actor.x+=group.x
actor.y+=group.y 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.toFront()
actor.y += actor.height 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) { fun setCenterPosition(vector: Vector2, immediately: Boolean = false, selectUnit: Boolean = true) {
val tileGroup = tileGroups.values.first { it.tileInfo.position == vector } val tileGroup = tileGroups.values.first { it.tileInfo.position == vector }
selectedTile = tileGroup.tileInfo selectedTile = tileGroup.tileInfo