Fixed combat for embarked units

This commit is contained in:
Yair Morgenstern 2018-10-23 22:08:30 +03:00
parent 7cd903c6b9
commit 230031e9f5
5 changed files with 17 additions and 8 deletions

View File

@ -21,8 +21,8 @@ android {
applicationId "com.unciv.game" applicationId "com.unciv.game"
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 26 targetSdkVersion 26
versionCode 149 versionCode 150
versionName "2.9.2" versionName "2.9.3"
} }
buildTypes { buildTypes {
release { release {

View File

@ -6,7 +6,6 @@ import com.unciv.logic.battle.Battle
import com.unciv.logic.battle.BattleDamage import com.unciv.logic.battle.BattleDamage
import com.unciv.logic.battle.MapUnitCombatant import com.unciv.logic.battle.MapUnitCombatant
import com.unciv.logic.city.CityInfo import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.civilization.DiplomaticStatus
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
@ -127,17 +126,21 @@ class UnitAutomation{
} }
} }
fun containsAttackableEnemy(tile: TileInfo, civInfo: CivilizationInfo): Boolean { fun containsAttackableEnemy(tile: TileInfo, unit: MapUnit): Boolean {
val tileCombatant = Battle(civInfo.gameInfo).getMapCombatantOfTile(tile) if(unit.isEmbarked()){
if(unit.baseUnit.unitType.isRanged()) return false
if(tile.getBaseTerrain().type==TerrainType.Water) return false // can't attack water units while embarked, only land
}
val tileCombatant = Battle(unit.civInfo.gameInfo).getMapCombatantOfTile(tile)
if(tileCombatant==null) return false if(tileCombatant==null) return false
return tileCombatant.getCivilization()!=civInfo && civInfo.isAtWarWith(tileCombatant.getCivilization()) return tileCombatant.getCivilization()!=unit.civInfo && unit.civInfo.isAtWarWith(tileCombatant.getCivilization())
} }
class AttackableTile(val tileToAttackFrom:TileInfo, val tileToAttack:TileInfo) class AttackableTile(val tileToAttackFrom:TileInfo, val tileToAttack:TileInfo)
fun getAttackableEnemies(unit: MapUnit, unitDistanceToTiles: HashMap<TileInfo, Float>): ArrayList<AttackableTile> { fun getAttackableEnemies(unit: MapUnit, unitDistanceToTiles: HashMap<TileInfo, Float>): ArrayList<AttackableTile> {
val tilesWithEnemies = unit.civInfo.getViewableTiles() val tilesWithEnemies = unit.civInfo.getViewableTiles()
.filter { containsAttackableEnemy(it,unit.civInfo) } .filter { containsAttackableEnemy(it,unit) }
val rangeOfAttack = unit.getRange() val rangeOfAttack = unit.getRange()
@ -162,7 +165,7 @@ class UnitAutomation{
private fun tryAdvanceTowardsCloseEnemy(unit: MapUnit): Boolean { private fun tryAdvanceTowardsCloseEnemy(unit: MapUnit): Boolean {
// this can be sped up if we check each layer separately // this can be sped up if we check each layer separately
var closeEnemies = unit.getTile().getTilesInDistance(5) var closeEnemies = unit.getTile().getTilesInDistance(5)
.filter{ containsAttackableEnemy(it, unit.civInfo) && unit.movementAlgs().canReach(it)} .filter{ containsAttackableEnemy(it, unit) && unit.movementAlgs().canReach(it)}
if(unit.baseUnit().unitType.isRanged()) if(unit.baseUnit().unitType.isRanged())
closeEnemies = closeEnemies.filterNot { it.isCityCenter() && it.getCity()!!.health==1 } closeEnemies = closeEnemies.filterNot { it.isCityCenter() && it.getCity()!!.health==1 }

View File

@ -84,6 +84,9 @@ class BattleDamage{
modifiers["Flanking"] = 0.1f * (numberOfAttackersSurroundingDefender-1) //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php modifiers["Flanking"] = 0.1f * (numberOfAttackersSurroundingDefender-1) //https://www.carlsguides.com/strategy/civilization5/war/combatbonuses.php
} }
if(attacker is MapUnitCombatant && attacker.unit.isEmbarked())
modifiers["Landing"] = -0.5f
return modifiers return modifiers
} }

View File

@ -23,6 +23,7 @@ class MapUnitCombatant(val unit: MapUnit) : ICombatant {
} }
override fun getDefendingStrength(attacker: ICombatant): Int { // todo remove attacker override fun getDefendingStrength(attacker: ICombatant): Int { // todo remove attacker
if(unit.isEmbarked()) return 0
return unit.baseUnit().strength return unit.baseUnit().strength
} }

View File

@ -158,7 +158,9 @@ class MapUnit {
return range return range
} }
fun isEmbarked(): Boolean { fun isEmbarked(): Boolean {
if(!baseUnit.unitType.isLandUnit()) return false
return currentTile.baseTerrain=="Ocean"||currentTile.baseTerrain=="Coast" return currentTile.baseTerrain=="Ocean"||currentTile.baseTerrain=="Coast"
} }