Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
 public bool ShouldCritical(BattleCharacter attacker, BattleCharacter defender, SkillEffect effect)
 {
     var critChance = attacker.GetStatWithModifiers(Const.Stats.Critical, effect.StatsModifiers);
     return this.IsRandomCheckSuccess(critChance.Value);
 }