mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-22 10:54:19 -04:00
Horsemen can now move after attacking
This commit is contained in:
parent
9625a12ba2
commit
afa6478745
@ -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
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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) {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user