public double CalculateDamage(BattleCharacter attacker, BattleCharacter defender, SkillEffect effect, bool shouldCritical) { var damage = 0d; if (effect.HasStatModifier(Const.Stats.Attack)) { var modifiedAtk = attacker.GetStatWithModifiers(Const.Stats.Attack, effect.StatsModifiers); damage += modifiedAtk.Value - defender.GetStat(Const.Stats.Defense); } if (effect.HasStatModifier(Const.Stats.Wisdom)) { var modifiedWis = attacker.GetStatWithModifiers(Const.Stats.Wisdom, effect.StatsModifiers); damage += modifiedWis.Value - defender.GetStat(Const.Stats.Mind); } if (effect.HasStatModifier(Const.Stats.Mind)) { damage += attacker.GetStatWithModifiers(Const.Stats.Mind, effect.StatsModifiers).Value; } if (shouldCritical) { damage *= Const.CriticalDamageMultiplier; } // damage value needs to be positive or zero at this point so a low atk doesn't heal a high def without going thru affinities damage = Math.Max(0d, damage); damage = ApplyAffinityBonuses(damage, defender, effect.Affinities); return Math.Floor(damage); }
public bool ShouldHit(BattleCharacter attacker, BattleCharacter defender, SkillEffect effect) { var modifiedStat = attacker.GetStatWithModifiers(Const.Stats.Accuracy, effect.StatsModifiers); var hitChance = modifiedStat.Value; var evaChance = modifiedStat.IsAbsolute ? 0d :defender.GetStat(Const.Stats.Evasion); return this.IsRandomCheckSuccess(hitChance - evaChance); }
public bool ShouldCritical(BattleCharacter attacker, BattleCharacter defender, SkillEffect effect) { var critChance = attacker.GetStatWithModifiers(Const.Stats.Critical, effect.StatsModifiers); return this.IsRandomCheckSuccess(critChance.Value); }