Damage in battle table is now the average damage done (#6176)

* Damage in battle table is now the average damage done

* Trailing comma's

* Fixed typo
This commit is contained in:
Xander Lenstra 2022-02-19 18:34:46 +01:00 committed by GitHub
parent 402a9ba825
commit a8be359ed2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 8 deletions

View File

@ -286,7 +286,8 @@ object BattleDamage {
fun calculateDamageToAttacker( fun calculateDamageToAttacker(
attacker: ICombatant, attacker: ICombatant,
tileToAttackFrom: TileInfo?, tileToAttackFrom: TileInfo?,
defender: ICombatant defender: ICombatant,
ignoreRandomness: Boolean = false,
): Int { ): Int {
if (attacker.isRanged()) return 0 if (attacker.isRanged()) return 0
if (defender.isCivilian()) return 0 if (defender.isCivilian()) return 0
@ -295,13 +296,14 @@ object BattleDamage {
attacker, attacker,
defender defender
) )
return (damageModifier(ratio, true, attacker) * getHealthDependantDamageRatio(defender)).roundToInt() return (damageModifier(ratio, true, attacker, ignoreRandomness) * getHealthDependantDamageRatio(defender)).roundToInt()
} }
fun calculateDamageToDefender( fun calculateDamageToDefender(
attacker: ICombatant, attacker: ICombatant,
tileToAttackFrom: TileInfo?, tileToAttackFrom: TileInfo?,
defender: ICombatant defender: ICombatant,
ignoreRandomness: Boolean = false,
): Int { ): Int {
val ratio = val ratio =
getAttackingStrength(attacker, defender) / getDefendingStrength( getAttackingStrength(attacker, defender) / getDefendingStrength(
@ -309,13 +311,14 @@ object BattleDamage {
defender defender
) )
if (defender.isCivilian()) return 40 if (defender.isCivilian()) return 40
return (damageModifier(ratio, false, attacker) * getHealthDependantDamageRatio(attacker)).roundToInt() return (damageModifier(ratio, false, attacker, ignoreRandomness) * getHealthDependantDamageRatio(attacker)).roundToInt()
} }
private fun damageModifier( private fun damageModifier(
attackerToDefenderRatio: Float, attackerToDefenderRatio: Float,
damageToAttacker: Boolean, damageToAttacker: Boolean,
attacker: ICombatant // for the randomness attacker: ICombatant, // for the randomness
ignoreRandomness: Boolean = false,
): Float { ): Float {
// https://forums.civfanatics.com/threads/getting-the-combat-damage-math.646582/#post-15468029 // https://forums.civfanatics.com/threads/getting-the-combat-damage-math.646582/#post-15468029
val strongerToWeakerRatio = val strongerToWeakerRatio =
@ -324,7 +327,9 @@ object BattleDamage {
if (damageToAttacker && attackerToDefenderRatio > 1 || !damageToAttacker && attackerToDefenderRatio < 1) // damage ratio from the weaker party is inverted if (damageToAttacker && attackerToDefenderRatio > 1 || !damageToAttacker && attackerToDefenderRatio < 1) // damage ratio from the weaker party is inverted
ratioModifier = ratioModifier.pow(-1) ratioModifier = ratioModifier.pow(-1)
val randomSeed = attacker.getCivInfo().gameInfo.turns * attacker.getTile().position.hashCode() // so people don't save-scum to get optimal results val randomSeed = attacker.getCivInfo().gameInfo.turns * attacker.getTile().position.hashCode() // so people don't save-scum to get optimal results
val randomCenteredAround30 = 24 + 12 * Random(randomSeed.toLong()).nextFloat() val randomCenteredAround30 = 24 +
if (ignoreRandomness) 6f
else 12 * Random(randomSeed.toLong()).nextFloat()
return randomCenteredAround30 * ratioModifier return randomCenteredAround30 * ratioModifier
} }
} }

View File

@ -171,8 +171,8 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
row() row()
} }
var damageToDefender = BattleDamage.calculateDamageToDefender(attacker,null,defender) var damageToDefender = BattleDamage.calculateDamageToDefender(attacker, null, defender, true)
var damageToAttacker = BattleDamage.calculateDamageToAttacker(attacker,null,defender) var damageToAttacker = BattleDamage.calculateDamageToAttacker(attacker, null, defender, true)
if (damageToAttacker>attacker.getHealth() && damageToDefender>defender.getHealth()) // when damage exceeds health, we don't want to show negative health numbers if (damageToAttacker>attacker.getHealth() && damageToDefender>defender.getHealth()) // when damage exceeds health, we don't want to show negative health numbers