Horsemen can now move after attacking

This commit is contained in:
Yair Morgenstern 2018-05-09 18:57:03 +03:00
parent 9625a12ba2
commit afa6478745
5 changed files with 22 additions and 15 deletions

View File

@ -42,7 +42,6 @@
strength:5, strength:5,
rangedStrength:7, rangedStrength:7,
cost: 40, cost: 40,
uniques:["Penalty vs City 33%"]
hurryCostModifier:20 hurryCostModifier:20
}, },
{ {

View File

@ -6,6 +6,7 @@ import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.UnitType import com.unciv.logic.map.UnitType
import java.util.* import java.util.*
import kotlin.collections.HashMap import kotlin.collections.HashMap
import kotlin.math.max
/** /**
* Damage calculations according to civ v wiki and https://steamcommunity.com/sharedfiles/filedetails/?id=170194443 * 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<String, Float> { private fun getGeneralModifiers(combatant: ICombatant, enemy: ICombatant): HashMap<String, Float> {
val modifiers = HashMap<String, Float>() val modifiers = HashMap<String, Float>()
if (combatant is MapUnitCombatant) { if (combatant is MapUnitCombatant) {
val uniques = combatant.unit.getBaseUnit().uniques 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 val modificationAmount = regexResult.groups[3]!!.value.toFloat() / 100 // if it says 15%, that's 0.15f in modification
if (enemy.getUnitType() == vsType) { if (enemy.getUnitType() == vsType) {
if (regexResult.groups[1]!!.value == "Bonus") if (regexResult.groups[1]!!.value == "Bonus")
modifiers.put("Bonus vs $vsType", modificationAmount) modifiers["Bonus vs $vsType"] = modificationAmount
else modifiers.put("Penalty 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<String, Float> { fun getDefenceModifiers(attacker: ICombatant, defender: ICombatant): HashMap<String, Float> {
val modifiers = getGeneralModifiers(defender, attacker) 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() val tileDefenceBonus = defender.getTile().getDefensiveBonus()
if (tileDefenceBonus > 0) modifiers["Terrain"] = tileDefenceBonus if (tileDefenceBonus > 0) modifiers["Terrain"] = tileDefenceBonus
} }
return modifiers return modifiers
} }
fun modifiersToMultiplicationBonus(modifiers: HashMap<String, Float>): Float { private fun modifiersToMultiplicationBonus(modifiers: HashMap<String, Float>): Float {
// modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss // modifiers are like 0.1 for a 10% bonus, -0.1 for a 10% loss
var modifier = 1f var modifier = 1f
for (m in modifiers.values) modifier *= (1 + m) for (m in modifiers.values) modifier *= (1 + m)
return modifier return modifier
} }
fun getHealthDependantDamageRatio(combatant: ICombatant): Float { private fun getHealthDependantDamageRatio(combatant: ICombatant): Float {
if (combatant.getUnitType() == UnitType.City) return 1f; if (combatant.getUnitType() == UnitType.City) return 1f
return 1 / 2f + combatant.getHealth() / 200f // Each point of health reduces damage dealt by 0.5% 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()) { if (defender.getCivilization().isPlayerCivilization()) {
val whatHappenedString = val whatHappenedString =
@ -155,7 +156,11 @@ class Battle(val gameInfo:GameInfo) {
if (defender.isDefeated() && attacker.isMelee()) if (defender.isDefeated() && attacker.isMelee())
(attacker as MapUnitCombatant).unit.moveToTile(attackedTile) (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) { private fun conquerCity(city: CityInfo, attacker: ICombatant) {

View File

@ -102,4 +102,9 @@ class MapUnit {
doPreTurnAction(tile) doPreTurnAction(tile)
} }
fun hasUnique(unique:String): Boolean {
val baseUnit = getBaseUnit()
return baseUnit.uniques!=null && baseUnit.uniques!!.contains(unique)
}
} }

View File

@ -12,9 +12,9 @@ class UnitMovementAlgorithms(val tileMap: TileMap){
if(unit.civInfo.tech.isResearched("Machinery")) return 1/3f if(unit.civInfo.tech.isResearched("Machinery")) return 1/3f
else return 1/2f 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")) && (to.baseTerrain=="Hill" || to.terrainFeature=="Forest" || to.terrainFeature=="Jungle"))
return 4f return 4f
@ -35,7 +35,7 @@ class UnitMovementAlgorithms(val tileMap: TileMap){
&& neighbor.isCityCenter()) && neighbor.isCityCenter())
continue // Enemy city, can't move through it! 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 var totalDistanceToTile = distanceToTiles[tileToCheck]!! + distanceBetweenTiles
if (!distanceToTiles.containsKey(neighbor) || distanceToTiles[neighbor]!! > totalDistanceToTile) { if (!distanceToTiles.containsKey(neighbor) || distanceToTiles[neighbor]!! > totalDistanceToTile) {

View File

@ -57,8 +57,6 @@ class Unit : INamed, IConstruction, ICivilopedia {
return unit return unit
} }
fun hasUnique(unique:String) = uniques!=null && uniques!!.contains(unique)
override fun getProductionCost(adoptedPolicies: HashSet<String>): Int = cost override fun getProductionCost(adoptedPolicies: HashSet<String>): Int = cost
override fun getGoldCost(adoptedPolicies: HashSet<String>): Int { override fun getGoldCost(adoptedPolicies: HashSet<String>): Int {