public double GetDamageOfDoTTick(StatsGroup stats)
        {
            double critRate            = RatingConversions.GetCritChance(stats.CritRating);
            double critMult            = RatingConversions.GetCritDamageMultiplier(stats.CritRating);
            double directHitRate       = RatingConversions.GetDirectHitChance(stats.DirectHitRating);
            double directHitMult       = RatingConversions.GetDirectHitDamageFactor(stats.DirectHitRating);
            double determinationFactor = RatingConversions.GetDeterminationFactor(stats.Determination);
            double tenacityFactor      = RatingConversions.GetTenacityFactor(stats.Tenacity);
            double speedFactor         = RatingConversions.GetSpeedDoTContribution(stats.SpeedRating);

            bool isCrit      = (rng.NextDouble() < critRate);
            bool isDirectHit = (rng.NextDouble() < directHitRate);

            double damage = 1;

            if (isCrit)
            {
                damage *= critMult;
            }
            if (isDirectHit)
            {
                damage *= directHitMult;
            }
            damage *= determinationFactor;
            damage *= tenacityFactor;
            damage *= speedFactor;
            return(damage);
        }
        public double GetDamageOfGCDAttack(StatsGroup stats, out bool isCrit, out bool isDirectHit)
        {
            double critRate            = RatingConversions.GetCritChance(stats.CritRating);
            double critMult            = RatingConversions.GetCritDamageMultiplier(stats.CritRating);
            double directHitRate       = RatingConversions.GetDirectHitChance(stats.DirectHitRating);
            double determinationFactor = RatingConversions.GetDeterminationFactor(stats.Determination);
            double tenacityFactor      = RatingConversions.GetTenacityFactor(stats.Tenacity);

            isCrit      = (rng.NextDouble() < critRate);
            isDirectHit = (rng.NextDouble() < directHitRate);

            double damage = 1;

            if (isCrit)
            {
                damage *= critMult;
            }
            if (isDirectHit)
            {
                damage *= RatingConversions.GetDirectHitDamageFactor(stats.DirectHitRating);
            }
            damage *= determinationFactor;
            damage *= tenacityFactor;

            TotalCrits      += isCrit ? 1 : 0;
            TotalDirectHits += isDirectHit ? 1 : 0;
            TotalAttacks++;

            return(damage);
        }