Пример #1
0
        public decimal CalculateRegen(IClassDefinition classInfo)
        {
            // var life = CalculateAmount(level, classType);
            var totalRegen = Convert.ToDouble(BasicRegen + BonusRegen);

            return(DecimalHelper.RoundToDecimals(totalRegen * Convert.ToDouble(1 + BonusRegenPercentage), 2));
        }
        public SelfEmpowerHitProc CalculateProcAmount(IClassDefinition classInfo)
        {
            var baseProcRate  = DecimalHelper.RoundToDecimals((classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 10 : 6) / 100, 3);
            var bonusProcRate = DecimalHelper.RoundToDecimals(0.66 * classInfo.DemonicPower * (classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 0.6 : 0.5), 3);
            var procAmount    = DecimalHelper.RoundToDecimals(Convert.ToDouble(baseProcRate + bonusProcRate), 2);

            var resourceReturnProc = new SelfEmpowerHitProc {
                ProcPercentage = 1, ProcAmount = procAmount, Duration = 0
            };

            return(resourceReturnProc);
        }
Пример #3
0
        public Life(IClassDefinition classInfo, CharacterClass classData)
        {
            var baseAmt = (classInfo.ClassType == ClassTypeEnum.Sorceress ? 45 : 55);

            BasicAmount = classData.HP + classInfo.Level * 1;
            BonusAmount = classInfo.AngelicPower * 4;
            TotalAmount = CalculateAmount(classInfo);
            var regenCoeff = DecimalHelper.RoundToDecimals(Math.Pow(Convert.ToDouble(1.05), classInfo.Level / 2), 3);

            BasicRegen = Math.Round(0.024m * classData.HPRegen, 3);
            var ratio = Math.Round((decimal)BonusAmount / classData.HP, 3);

            BonusRegen = Math.Round(regenCoeff * ratio, 2);
            TotalRegen = CalculateRegen(classInfo);
        }
Пример #4
0
        public Stamina(IClassDefinition classInfo, CharacterClass classData)
        {
            var baseAmt = classInfo.ClassType == ClassTypeEnum.Druid ? 60 : classInfo.ClassType == ClassTypeEnum.Barbarian ? 50 : 35;

            BasicAmount = classData.Stamina + classInfo.Level * 1;
            BonusAmount = classInfo.AncestralPower * 4;
            TotalAmount = CalculateAmount(classInfo);
            var regenCoeff = DecimalHelper.RoundToDecimals(Math.Pow(Convert.ToDouble(1.05), classInfo.Level / 2), 3);
            var classCoeff = Math.Round((classInfo.ClassType == ClassTypeEnum.Druid ? 0.050m : 0.040m) * baseAmt, 3);

            BasicRegen = Math.Round(classCoeff * classData.StaminaRegen, 3);
            var ratio = Math.Round((decimal)BonusAmount / classData.Stamina, 3);

            BonusRegen = Math.Round(regenCoeff * ratio, 2);
            TotalRegen = CalculateRegen(classInfo);
        }
Пример #5
0
        public LifestealHitProc CalculateProcAmount(IClassDefinition classInfo)
        {
            var mainDps = new DamagePerHit(classInfo);

            var baseProcPerc      = classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 0.05m : 0.03m;
            var procPercAdditives = classInfo.AngelicPower * 0.125 + classInfo.AncestralPower * 0.55;
            var bonusMultiplier   = 0.35 * (Math.Pow(1.04, procPercAdditives));
            var bonusProcPerc     = DecimalHelper.RoundToDecimals(bonusMultiplier * procPercAdditives / 100, 3);
            var baseProcRate      = classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 0.08m : 0.10m;
            var bonusProcRate     = 0.66m * DecimalHelper.RoundToDecimals((classInfo.AngelicPower * 1.4) / 100, 3);

            var average       = DecimalHelper.RoundToDecimals((mainDps.CalculateMinBase(classInfo) + mainDps.CalculateMaxBase(classInfo)) / 2, 3);
            var procAmountVal = DecimalHelper.RoundToDecimals(Convert.ToDouble(baseProcRate) + Convert.ToDouble(bonusProcRate), 3);
            var procAmount    = DecimalHelper.RoundToDecimals(Convert.ToDouble(average) * Convert.ToDouble(procAmountVal), 2);
            var procPerc      = Math.Min(0.45m, DecimalHelper.RoundToDecimals(Convert.ToDouble((baseProcPerc + bonusProcPerc)), 2));

            var lifestealProc = new LifestealHitProc {
                ProcPercentage = procPerc * 100, ProcAmount = procAmount, Duration = 0
            };

            return(lifestealProc);
        }
        public SelfEmpowerHitProc CalculateProcAmount(IClassDefinition classInfo)
        {
            var baseProcPerc      = classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 0.05m : 0.03m;
            var procPercAdditives = classInfo.AncestralPower * 0.55 + classInfo.AngelicPower * 0.11;
            var bonusMultiplier   = 0.45 * (Math.Pow(1.04, procPercAdditives));
            var bonusProcPerc     = DecimalHelper.RoundToDecimals(bonusMultiplier * procPercAdditives / 100, 3);

            var baseProcRate   = classInfo.ClassType == Enums.ClassTypeEnum.Barbarian ? 0.10m : 0.08m;
            var rateMultiplier = (Math.Pow(1.04, classInfo.DemonicPower / 4));
            var bonusProcRate  = DecimalHelper.RoundToDecimals((rateMultiplier * classInfo.AngelicPower * 1.25) / 4, 2);
            var basicDuration  = 1;
            var bonusDuration  = (classInfo.AngelicPower * 6.5) / 100;

            var procAmount = DecimalHelper.RoundToDecimals(Convert.ToDouble(baseProcRate + bonusProcRate), 2);
            var procPerc   = Math.Min(0.45m, DecimalHelper.RoundToDecimals(Convert.ToDouble((baseProcPerc + bonusProcPerc)), 2));

            var resourceReturnProc = new SelfEmpowerHitProc {
                ProcPercentage = procPerc * 100, ProcAmount = procAmount, Duration = DecimalHelper.RoundToDecimals(basicDuration * (1 + bonusDuration), 2)
            };

            return(resourceReturnProc);
        }
        public SkillAffixProcStat(decimal procChance, PowerTypesEnum powerType, string selectedAffix, DamageSkillStat skillData, List <AffixMetadataEnum> md)
        {
            var rand  = SkillStatHelper.GetRNG(powerType);
            var level = powerType == PowerTypesEnum.AngelicPower ? skillData.AngelicPower : powerType == PowerTypesEnum.DemonicPower ? skillData.DemonicPower : skillData.AncestralPower;

            this.Level         = level;
            this.PowerType     = powerType;
            this.SelectedAffix = selectedAffix;
            this.Stackable     = md.Contains(AffixMetadataEnum.Stackable);
            this.IsBuff        = md.Contains(AffixMetadataEnum.BuffDebuff);

            var highTier     = skillData.Tier >= 3;
            var HighCD       = md.Contains(AffixMetadataEnum.HighCD);
            var spender      = md.Contains(AffixMetadataEnum.HighCost);
            var procsOnDeath = md.Contains(AffixMetadataEnum.ProcsOnDeath);

            this.ProcsOnDeath = procsOnDeath;

            // if (procsOnDeath) {
            //     // Probably is a buff if LPR on death as well ?
            //     var isBuff = EnumHelper.Contains<LBsEnum>(selectedAffix);
            // }

            var minBuffOrTotemDur = procsOnDeath ? (!highTier? 75 : 200) : (!highTier? 250 : 400);
            var maxBuffOrTotemDur = procsOnDeath ? (!highTier? 175 : 350) : (!highTier? 350 : 600);
            var minBuffDurIncr    = procsOnDeath ? (!highTier? 10 : 30) : (!highTier? 20 : 50);
            var maxBuffDurIncr    = procsOnDeath ? (!highTier? 30 : 50) : (!highTier? 40 : 100);
            var randDurBonus      = rand.Next(minBuffDurIncr, maxBuffDurIncr) * level;

            var average    = DecimalHelper.RoundToDecimals((skillData.From + skillData.To) / 2, 2);
            var minDPSIncr = procsOnDeath ? (!highTier? 8 : 8) : (!highTier? 20 : 18);
            var maxDPSIncr = procsOnDeath ? (!highTier? 25 : 20) : (!highTier? 40 : 25);
            var randBonus  = rand.Next(minDPSIncr, maxDPSIncr) * level;

            if (md.Contains(AffixMetadataEnum.BuffDebuff) || md.Contains(AffixMetadataEnum.BannerOrTotem))
            {
                this.Duration   = DecimalHelper.RoundToDecimals(randDurBonus / 100, 2);
                this.ProcAmount = DecimalHelper.RoundToDecimalsD(average * (randBonus / 250), 2);
            }
            else if (md.Contains(AffixMetadataEnum.HasDoT))
            {
                this.Duration   = DecimalHelper.RoundToDecimals(randDurBonus / 250, 2);
                this.ProcAmount = DecimalHelper.RoundToDecimalsD(average * (randBonus / 100), 2);
            }
            else if (md.Contains(AffixMetadataEnum.Summon))
            {
                this.Duration   = DecimalHelper.RoundToDecimals(randDurBonus / 50, 2);
                this.ProcAmount = DecimalHelper.RoundToDecimalsD(average * (randBonus / 75), 2);
            }
            // else if (md.Contains(AffixMetadataEnum.Curse))
            // {
            //     this.Duration = DecimalHelper.RoundToDecimals(randDurBonus/125, 2);
            //     this.ProcAmount = DecimalHelper.RoundToDecimalsD(average * (randBonus/75), 2);
            // }
            else
            {
                var durIncr = highTier ? rand.Next(level * 25, level * 45) : rand.Next(level * 15, level * 25);
                this.Duration   = ((skillData.Duration ?? 0) * (1 + durIncr / 100));
                this.ProcAmount = DecimalHelper.RoundToDecimalsD(average * randBonus / 100, 2);
            }

            // TODO: Set procChance upgrades per level, i.e. level
            this.ProcChance = procChance;
        }