From afa64787452ed12d0c17c97989fb201d9a5b8b17 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Wed, 9 May 2018 18:57:03 +0300 Subject: [PATCH] Horsemen can now move after attacking --- android/assets/jsons/Units.json | 1 - core/src/com/unciv/logic/battle/Battle.kt | 23 +++++++++++-------- core/src/com/unciv/logic/map/MapUnit.kt | 5 ++++ .../unciv/logic/map/UnitMovementAlgorithms.kt | 6 ++--- core/src/com/unciv/models/gamebasics/Unit.kt | 2 -- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/android/assets/jsons/Units.json b/android/assets/jsons/Units.json index cf69bb4927..0ffbd5b05e 100644 --- a/android/assets/jsons/Units.json +++ b/android/assets/jsons/Units.json @@ -42,7 +42,6 @@ strength:5, rangedStrength:7, cost: 40, - uniques:["Penalty vs City 33%"] hurryCostModifier:20 }, { diff --git a/core/src/com/unciv/logic/battle/Battle.kt b/core/src/com/unciv/logic/battle/Battle.kt index 55c9599380..8b699e3965 100644 --- a/core/src/com/unciv/logic/battle/Battle.kt +++ b/core/src/com/unciv/logic/battle/Battle.kt @@ -6,6 +6,7 @@ import com.unciv.logic.map.TileInfo import com.unciv.logic.map.UnitType import java.util.* import kotlin.collections.HashMap +import kotlin.math.max /** * Damage calculations according to civ v wiki and https://steamcommunity.com/sharedfiles/filedetails/?id=170194443 @@ -14,7 +15,7 @@ class Battle(val gameInfo:GameInfo) { - fun getGeneralModifiers(combatant: ICombatant, enemy: ICombatant): HashMap { + private fun getGeneralModifiers(combatant: ICombatant, enemy: ICombatant): HashMap { val modifiers = HashMap() if (combatant is MapUnitCombatant) { val uniques = combatant.unit.getBaseUnit().uniques @@ -27,8 +28,8 @@ class Battle(val gameInfo:GameInfo) { val modificationAmount = regexResult.groups[3]!!.value.toFloat() / 100 // if it says 15%, that's 0.15f in modification if (enemy.getUnitType() == vsType) { if (regexResult.groups[1]!!.value == "Bonus") - modifiers.put("Bonus vs $vsType", modificationAmount) - else modifiers.put("Penalty vs $vsType", -modificationAmount) + modifiers["Bonus vs $vsType"] = modificationAmount + else modifiers["Penalty vs $vsType"] = -modificationAmount } } } @@ -52,22 +53,22 @@ class Battle(val gameInfo:GameInfo) { fun getDefenceModifiers(attacker: ICombatant, defender: ICombatant): HashMap { val modifiers = getGeneralModifiers(defender, attacker) - if (!(defender is MapUnitCombatant && defender.unit.getBaseUnit().hasUnique("No defensive terrain bonus"))) { + if (!(defender is MapUnitCombatant && defender.unit.hasUnique("No defensive terrain bonus"))) { val tileDefenceBonus = defender.getTile().getDefensiveBonus() if (tileDefenceBonus > 0) modifiers["Terrain"] = tileDefenceBonus } return modifiers } - fun modifiersToMultiplicationBonus(modifiers: HashMap): Float { + private fun modifiersToMultiplicationBonus(modifiers: HashMap): Float { // modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss var modifier = 1f for (m in modifiers.values) modifier *= (1 + m) return modifier } - fun getHealthDependantDamageRatio(combatant: ICombatant): Float { - if (combatant.getUnitType() == UnitType.City) return 1f; + private fun getHealthDependantDamageRatio(combatant: ICombatant): Float { + if (combatant.getUnitType() == UnitType.City) return 1f return 1 / 2f + combatant.getHealth() / 200f // Each point of health reduces damage dealt by 0.5% } @@ -132,7 +133,7 @@ class Battle(val gameInfo:GameInfo) { } - fun postBattleAction(attacker: ICombatant, defender: ICombatant, attackedTile:TileInfo){ + private fun postBattleAction(attacker: ICombatant, defender: ICombatant, attackedTile:TileInfo){ if (defender.getCivilization().isPlayerCivilization()) { val whatHappenedString = @@ -155,7 +156,11 @@ class Battle(val gameInfo:GameInfo) { if (defender.isDefeated() && attacker.isMelee()) (attacker as MapUnitCombatant).unit.moveToTile(attackedTile) - if(attacker is MapUnitCombatant) attacker.unit.currentMovement = 0f + if(attacker is MapUnitCombatant) { + if (attacker.unit.hasUnique("Can move after attacking")) + attacker.unit.currentMovement = max(0f, attacker.unit.currentMovement - 1) + else attacker.unit.currentMovement = 0f + } } private fun conquerCity(city: CityInfo, attacker: ICombatant) { diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index e9be197f6c..6ec674867c 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -102,4 +102,9 @@ class MapUnit { doPreTurnAction(tile) } + fun hasUnique(unique:String): Boolean { + val baseUnit = getBaseUnit() + return baseUnit.uniques!=null && baseUnit.uniques!!.contains(unique) + } + } \ No newline at end of file diff --git a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt index b7b24f2baa..67769ca5ba 100644 --- a/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt +++ b/core/src/com/unciv/logic/map/UnitMovementAlgorithms.kt @@ -12,9 +12,9 @@ class UnitMovementAlgorithms(val tileMap: TileMap){ if(unit.civInfo.tech.isResearched("Machinery")) return 1/3f else return 1/2f } - if(unit.getBaseUnit().hasUnique("Ignores terrain cost")) return 1f; + if(unit.hasUnique("Ignores terrain cost")) return 1f - if(unit.getBaseUnit().hasUnique("Rough terrain penalty") + if(unit.hasUnique("Rough terrain penalty") && (to.baseTerrain=="Hill" || to.terrainFeature=="Forest" || to.terrainFeature=="Jungle")) return 4f @@ -35,7 +35,7 @@ class UnitMovementAlgorithms(val tileMap: TileMap){ && neighbor.isCityCenter()) continue // Enemy city, can't move through it! - var distanceBetweenTiles = getMovementCostBetweenAdjacentTiles(tileToCheck,neighbor,unit) + val distanceBetweenTiles = getMovementCostBetweenAdjacentTiles(tileToCheck,neighbor,unit) var totalDistanceToTile = distanceToTiles[tileToCheck]!! + distanceBetweenTiles if (!distanceToTiles.containsKey(neighbor) || distanceToTiles[neighbor]!! > totalDistanceToTile) { diff --git a/core/src/com/unciv/models/gamebasics/Unit.kt b/core/src/com/unciv/models/gamebasics/Unit.kt index 9cd086bd2d..ad39a662bb 100644 --- a/core/src/com/unciv/models/gamebasics/Unit.kt +++ b/core/src/com/unciv/models/gamebasics/Unit.kt @@ -57,8 +57,6 @@ class Unit : INamed, IConstruction, ICivilopedia { return unit } - fun hasUnique(unique:String) = uniques!=null && uniques!!.contains(unique) - override fun getProductionCost(adoptedPolicies: HashSet): Int = cost override fun getGoldCost(adoptedPolicies: HashSet): Int {