From b183297a5f0f183cd5eb8d59d0af70727ae59167 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Wed, 11 Jan 2023 12:24:00 +0200 Subject: [PATCH] Show numbers on attack damage --- .../ui/worldscreen/bottombar/BattleTable.kt | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt index 39a8beda19..cd37da0e29 100644 --- a/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt +++ b/core/src/com/unciv/ui/worldscreen/bottombar/BattleTable.kt @@ -186,25 +186,30 @@ class BattleTable(val worldScreen: WorldScreen): Table() { row() } - var damageToDefender = BattleDamage.calculateDamageToDefender(attacker, defender, 0.5f) - var damageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, defender, 0.5f) + val maxDamageToDefender = BattleDamage.calculateDamageToDefender(attacker, defender, 1f) + val minDamageToDefender = BattleDamage.calculateDamageToDefender(attacker, defender, 0f) + var expectedDamageToDefenderForHealthbar = (maxDamageToDefender + minDamageToDefender) / 2 - if (damageToAttacker > attacker.getHealth() && damageToDefender > defender.getHealth()) { + val maxDamageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, defender, 1f) + val minDamageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, defender, 0f) + var expectedDamageToAttackerForHealthbar = (maxDamageToAttacker + minDamageToAttacker) / 2 + + if (expectedDamageToAttackerForHealthbar > attacker.getHealth() && expectedDamageToDefenderForHealthbar > defender.getHealth()) { // when damage exceeds health, we don't want to show negative health numbers // Also if both parties are supposed to die it's not indicative of who is more likely to win // So we "normalize" the damages until one dies - if (damageToDefender * attacker.getHealth() > damageToAttacker * defender.getHealth()) { // defender dies quicker ie first + if (expectedDamageToDefenderForHealthbar * attacker.getHealth() > expectedDamageToAttackerForHealthbar * defender.getHealth()) { // defender dies quicker ie first // Both damages *= (defender.health/damageToDefender) - damageToDefender = defender.getHealth() - damageToAttacker *= (defender.getHealth() / damageToDefender.toFloat()).toInt() + expectedDamageToDefenderForHealthbar = defender.getHealth() + expectedDamageToAttackerForHealthbar *= (defender.getHealth() / expectedDamageToDefenderForHealthbar.toFloat()).toInt() } else { // attacker dies first // Both damages *= (attacker.health/damageToAttacker) - damageToAttacker = attacker.getHealth() - damageToDefender *= (attacker.getHealth() / damageToAttacker.toFloat()).toInt() + expectedDamageToAttackerForHealthbar = attacker.getHealth() + expectedDamageToDefenderForHealthbar *= (attacker.getHealth() / expectedDamageToAttackerForHealthbar.toFloat()).toInt() } } - else if (damageToAttacker > attacker.getHealth()) damageToAttacker = attacker.getHealth() - else if (damageToDefender > defender.getHealth()) damageToDefender = defender.getHealth() + else if (expectedDamageToAttackerForHealthbar > attacker.getHealth()) expectedDamageToAttackerForHealthbar = attacker.getHealth() + else if (expectedDamageToDefenderForHealthbar > defender.getHealth()) expectedDamageToDefenderForHealthbar = defender.getHealth() if (attacker.isMelee() && (defender.isCivilian() || defender is CityCombatant && defender.isDefeated())) { @@ -216,8 +221,11 @@ class BattleTable(val worldScreen: WorldScreen): Table() { } add(defeatedText.toLabel()) } else { - add(getHealthBar(attacker.getHealth(), attacker.getMaxHealth(), damageToAttacker)) - add(getHealthBar(defender.getHealth(), defender.getMaxHealth(), damageToDefender)) + add(getHealthBar(attacker.getHealth(), attacker.getMaxHealth(), expectedDamageToAttackerForHealthbar)) + add(getHealthBar(defender.getHealth(), defender.getMaxHealth(), expectedDamageToDefenderForHealthbar)).row() + if (maxDamageToAttacker == 0) add("${attacker.getHealth()}".toLabel()) + else add("${attacker.getHealth()} → ${attacker.getHealth()-maxDamageToAttacker}-${attacker.getHealth()-minDamageToAttacker}".toLabel()) + add("${defender.getHealth()} → ${defender.getHealth()-maxDamageToDefender}-${defender.getHealth()-minDamageToDefender}".toLabel()) } row().pad(5f) @@ -247,7 +255,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() { attackButton.label.color = Color.GRAY } else { attackButton.onClick(UncivSound.Silent) { // onAttackButtonClicked will do the sound - onAttackButtonClicked(attacker, defender, attackableTile, damageToAttacker, damageToDefender) + onAttackButtonClicked(attacker, defender, attackableTile, expectedDamageToAttackerForHealthbar, expectedDamageToDefenderForHealthbar) } }