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

@ -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<String, Float> {
private fun getGeneralModifiers(combatant: ICombatant, enemy: ICombatant): HashMap<String, Float> {
val modifiers = HashMap<String, Float>()
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<String, Float> {
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<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
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) {

View File

@ -102,4 +102,9 @@ class MapUnit {
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
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) {

View File

@ -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<String>): Int = cost
override fun getGoldCost(adoptedPolicies: HashSet<String>): Int {