public virtual decimal GetAttackScore(ICombatObject attacker, ICombatObject target, uint round) { decimal attackBonus = attacker.AttackBonus(target); decimal modifier = (decimal)GetDmgModifier(attacker, target, round); return(modifier * (1 + attackBonus)); }
public virtual decimal GetAttackerDmgToDefender(ICombatObject attacker, ICombatObject target, uint round) { decimal atk = attacker.Stats.Atk; decimal rawDmg = (atk * attacker.Count); decimal attackBonus = attacker.AttackBonus(target); decimal defenseBonus = target.DefenseBonus(attacker); decimal modifier = (decimal)GetDmgModifier(attacker, target, round); rawDmg = modifier * rawDmg * (1 + attackBonus) / (1 + defenseBonus); return(rawDmg > ushort.MaxValue ? ushort.MaxValue : rawDmg); }
public void GetAttackScore_ShouldCalculateCorrectScore( [FrozenMock] UnitModFactory unitModFactory, ICombatObject attacker, ICombatObject target, BattleFormulas battleFormulas) { attacker.AttackBonus(target).Returns(0.2m); attacker.Stats.Base.Weapon.Returns(WeaponType.Bow); target.Stats.Base.Armor.Returns(ArmorType.Machine); attacker.Type.Returns <ushort>(1); target.Type.Returns <ushort>(2); unitModFactory.GetModifier(1, 2).Returns(1.25); var score = battleFormulas.GetAttackScore(attacker, target, 1); score.Should().Be(1.5m); }