mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-27 13:55:54 -04:00
Resolved #2819 - units no longer gain XP from attacking already defeated cities
This commit is contained in:
parent
e848d0b8b8
commit
04f0ba945e
@ -43,27 +43,63 @@ object Battle {
|
|||||||
}
|
}
|
||||||
val attackedTile = defender.getTile()
|
val attackedTile = defender.getTile()
|
||||||
|
|
||||||
if(attacker is MapUnitCombatant && attacker.getUnitType().isAirUnit()){
|
if(attacker is MapUnitCombatant && attacker.getUnitType().isAirUnit()) {
|
||||||
tryInterceptAirAttack(attacker,defender)
|
tryInterceptAirAttack(attacker, defender)
|
||||||
if(attacker.isDefeated()) return
|
if (attacker.isDefeated()) return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Withdraw from melee ability
|
// Withdraw from melee ability
|
||||||
if (attacker is MapUnitCombatant && attacker.isMelee() && defender is MapUnitCombatant ) {
|
if (attacker is MapUnitCombatant && attacker.isMelee() && defender is MapUnitCombatant ) {
|
||||||
val withdraw = defender.unit.getUniques().firstOrNull { it.startsWith("May withdraw before melee")}
|
val withdraw = defender.unit.getUniques().firstOrNull { it.startsWith("May withdraw before melee")}
|
||||||
if (withdraw != null) {
|
if (withdraw != null && doWithdrawFromMeleeAbility(attacker, defender, withdraw)) return
|
||||||
if (doWithdrawFromMeleeAbility(attacker, defender, withdraw))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val isAlreadyDefeatedCity = defender is CityCombatant && defender.isDefeated()
|
||||||
|
|
||||||
|
takeDamage(attacker, defender)
|
||||||
|
|
||||||
|
postBattleNotifications(attacker, defender, attackedTile)
|
||||||
|
|
||||||
|
tryHealAfterAttacking(attacker, defender)
|
||||||
|
|
||||||
|
postBattleNationUniques(defender, attackedTile, attacker)
|
||||||
|
|
||||||
|
// This needs to come BEFORE the move-to-tile, because if we haven't conquered it we can't move there =)
|
||||||
|
if (defender.isDefeated() && defender is CityCombatant && attacker.isMelee())
|
||||||
|
conquerCity(defender.city, attacker)
|
||||||
|
|
||||||
|
// we're a melee unit and we destroyed\captured an enemy unit
|
||||||
|
postBattleMoveToAttackedTile(attacker, defender, attackedTile)
|
||||||
|
|
||||||
|
reduceAttackerMovementPointsAndAttacks(attacker, defender)
|
||||||
|
|
||||||
|
if(!isAlreadyDefeatedCity) postBattleAddXp(attacker, defender)
|
||||||
|
|
||||||
|
// Add culture when defeating a barbarian when Honor policy is adopted (can be either attacker or defender!)
|
||||||
|
tryGetCultureFromHonor(attacker, defender)
|
||||||
|
tryGetCultureFromHonor(defender, attacker)
|
||||||
|
|
||||||
|
if (defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian()
|
||||||
|
&& attacker.getCivInfo().policies.isAdopted("Honor Complete"))
|
||||||
|
attacker.getCivInfo().gold += defender.unit.baseUnit.getProductionCost(attacker.getCivInfo()) / 10
|
||||||
|
|
||||||
|
if (attacker is MapUnitCombatant) {
|
||||||
|
if (attacker.getUnitType()==UnitType.Missile) {
|
||||||
|
attacker.unit.destroy()
|
||||||
|
} else if (attacker.unit.action != null
|
||||||
|
&& attacker.unit.action!!.startsWith("moveTo")) {
|
||||||
|
attacker.unit.action = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun takeDamage(attacker: ICombatant, defender: ICombatant) {
|
||||||
var damageToDefender = BattleDamage.calculateDamageToDefender(attacker, attacker.getTile(), defender)
|
var damageToDefender = BattleDamage.calculateDamageToDefender(attacker, attacker.getTile(), defender)
|
||||||
var damageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, attacker.getTile(), defender)
|
var damageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, attacker.getTile(), defender)
|
||||||
|
|
||||||
if(defender.getUnitType().isCivilian() && attacker.isMelee()){
|
if (defender.getUnitType().isCivilian() && attacker.isMelee()) {
|
||||||
captureCivilianUnit(attacker,defender)
|
captureCivilianUnit(attacker, defender)
|
||||||
}
|
} else if (attacker.isRanged()) {
|
||||||
else if (attacker.isRanged()) {
|
|
||||||
defender.takeDamage(damageToDefender) // straight up
|
defender.takeDamage(damageToDefender) // straight up
|
||||||
} else {
|
} else {
|
||||||
//melee attack is complicated, because either side may defeat the other midway
|
//melee attack is complicated, because either side may defeat the other midway
|
||||||
@ -81,50 +117,8 @@ object Battle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
postBattleAction(attacker,defender,attackedTile)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun postBattleAction(attacker: ICombatant, defender: ICombatant, attackedTile:TileInfo) {
|
|
||||||
|
|
||||||
postBattleNotifications(attacker, defender, attackedTile)
|
|
||||||
|
|
||||||
tryHealAfterAttacking(attacker, defender)
|
|
||||||
|
|
||||||
postBattleNationUniques(defender, attackedTile, attacker)
|
|
||||||
|
|
||||||
// This needs to come BEFORE the move-to-tile, because if we haven't conquered it we can't move there =)
|
|
||||||
if (defender.isDefeated() && defender is CityCombatant && attacker.isMelee())
|
|
||||||
conquerCity(defender.city, attacker)
|
|
||||||
|
|
||||||
// we're a melee unit and we destroyed\captured an enemy unit
|
|
||||||
postBattleMoveToAttackedTile(attacker, defender, attackedTile)
|
|
||||||
|
|
||||||
reduceAttackerMovementPointsAndAttacks(attacker, defender)
|
|
||||||
|
|
||||||
postBattleAddXp(attacker, defender)
|
|
||||||
|
|
||||||
// Add culture when defeating a barbarian when Honor policy is adopted (can be either attacker or defender!)
|
|
||||||
tryGetCultureFromHonor(attacker, defender)
|
|
||||||
tryGetCultureFromHonor(defender, attacker)
|
|
||||||
|
|
||||||
if (defender.isDefeated() && defender is MapUnitCombatant && !defender.getUnitType().isCivilian()
|
|
||||||
&& attacker.getCivInfo().policies.isAdopted("Honor Complete"))
|
|
||||||
attacker.getCivInfo().gold += defender.unit.baseUnit.getProductionCost(attacker.getCivInfo()) / 10
|
|
||||||
|
|
||||||
if (attacker is MapUnitCombatant && attacker.unit.action != null
|
|
||||||
&& attacker.unit.action!!.startsWith("moveTo"))
|
|
||||||
attacker.unit.action = null
|
|
||||||
|
|
||||||
if (attacker is MapUnitCombatant) {
|
|
||||||
if (attacker.getUnitType()==UnitType.Missile) {
|
|
||||||
attacker.unit.destroy()
|
|
||||||
} else if (attacker.unit.action != null
|
|
||||||
&& attacker.unit.action!!.startsWith("moveTo")) {
|
|
||||||
attacker.unit.action = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun postBattleNotifications(attacker: ICombatant, defender: ICombatant, attackedTile: TileInfo) {
|
private fun postBattleNotifications(attacker: ICombatant, defender: ICombatant, attackedTile: TileInfo) {
|
||||||
if (attacker.getCivInfo() != defender.getCivInfo()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function
|
if (attacker.getCivInfo() != defender.getCivInfo()) { // If what happened was that a civilian unit was captures, that's dealt with in the CaptureCilvilianUnit function
|
||||||
|
Loading…
x
Reference in New Issue
Block a user