private static ISkillDamageStat CalculateSkillPowerPrimary(IClassDefinition classInfo)
        {
            var skillDamageStat = new DamageSkillStat(1, 1, 1);

            var fibonacciLine = new List <int> {
                1, 2, 3, 5, 8, 13, 21, 34, 55
            };
            var squareRootLine = new List <int> {
                1, 4, 9, 16, 25, 36, 49
            };

            var from       = fibonacciLine.IndexOf(fibonacciLine.FirstOrDefault(c => c > classInfo.Level));
            var skillBonus = Convert.ToInt32(Math.Sqrt(squareRootLine.IndexOf(squareRootLine.FirstOrDefault(c => c > classInfo.Level))));

            if (classInfo.ClassType == ClassTypeEnum.Sorceress)
            {
                skillBonus += Convert.ToInt32(Math.Sqrt(1 + skillBonus));
            }

            skillDamageStat.From  = from;
            skillDamageStat.To    = from + skillBonus;
            skillDamageStat.Level = classInfo.Level;

            return(skillDamageStat);
        }
        public static DamageSkillStat CalculateHitData(IClassDefinition classInfo)
        {
            var data = CalculateHitDamageLevels(classInfo).FirstOrDefault(x => x.Level == classInfo.Level);

            var selected = new DamageSkillStat(data.From, data.To, 0, 0, 0, 0);

            selected.Level = classInfo.Level;
            return(selected);
        }
        public DamageSkillStat CalculateHitData(Interfaces.IClassDefinition classInfo)
        {
            this.Cost    = 0;
            this.CD      = 0;
            this.Charges = 0;

            var data     = SpellCalculator.CalculateHitData(classInfo);
            var selected = new DamageSkillStat(data.From, data.To, this.Tier, this.Cost, this.CD, this.Charges);

            selected.Level = this.Level;
            return(selected);
        }
        public DamageSkillStat CalculateSkillPower(int level)
        {
            var data = SpellCalculator.CalculateSkillDamageLevels(this).FirstOrDefault(x => x.Level == level);

            this.From = data.From;
            this.To   = data.To;

            var selected = new DamageSkillStat(this.From, this.To, this.Tier, this.Cost, this.CD, this.Charges);

            selected.Level = level;
            return(selected);
        }
        public DamageSkillStat CalculateSkillCosts(int level)
        {
            var costIncreaseRate = level * (this.Tier <= 1 ? 1 : this.Tier == 2 ? 2 : this.Tier == 3 ? 3 : 5);

            this.Cost = this.Cost == 0 && this.CD == 0 ? this.Tier * 4 : this.Cost;
            if (this.Cost != 0)
            {
                this.Cost += costIncreaseRate;
            }

            this.CD      = this.CD;
            this.Charges = Math.Max(this.Charges, 1);

            var selected = new DamageSkillStat(this.From, this.To, this.Tier, this.Cost, this.CD, this.Charges);

            selected.Level = level;
            return(selected);
        }
        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;
        }
Exemple #7
0
        public static SkillPowerAffixData GetPowerAffixesForSkill(PowerTypesEnum powerType, List <CastTypesEnum> castTypes, List <DamageTypesEnum> damageTypes, DamageSkillStat skillData, List <AffixMetadataEnum> skillMetadata)
        {
            var skillPowerAffixData = new SkillPowerAffixData();
            var level = (powerType == PowerTypesEnum.AngelicPower) ? skillData.AngelicPower
            : (powerType == PowerTypesEnum.DemonicPower) ? skillData.DemonicPower
            : skillData.AncestralPower;

            var selectedPowerData = new SkillAffixProcStat();
            var selectedAffix     = string.Empty;
            var isCC       = skillData.IsCC;
            var rand       = SkillStatHelper.GetRNG(powerType);
            var isHighTier = skillData.Tier > 2;
            var procsBuff  = false;
            var procChance = SkillStatHelper.GetProcChance(level, powerType, isHighTier, castTypes, skillMetadata);

            if (!isHighTier)
            {
                if (isCC)
                {
                    selectedAffix = calculateAffix2(powerType, skillMetadata, rand, ref selectedPowerData);
                }
                else
                {
                    selectedAffix = calculateAffix1(powerType, skillMetadata, rand, ref selectedPowerData);
                }
            }
            else
            {
                if (isCC)
                {
                    selectedAffix = calculateAffix4(powerType, skillMetadata, rand, ref selectedPowerData);
                }
                else
                {
                    selectedAffix = calculateAffix3(powerType, skillMetadata, rand, ref selectedPowerData);
                }
            }

            if (selectedAffix == EnumHelper.GetName <LBsEnum>(LBsEnum.RandomShoutOrCry))
            {
                procsBuff = true;
            }
            if (selectedAffix == EnumHelper.GetName <LBsEnum>(LBsEnum.OtherRandomLPROnDeathForX))
            {
                var isProjectile = skillMetadata.Contains(AffixMetadataEnum.Projectile);
                var isDoT        = skillMetadata.Contains(AffixMetadataEnum.HasDoT);
                var isUltimate   = skillMetadata.Contains(AffixMetadataEnum.Ultimate);

                var apRand = isProjectile ? 12 : isDoT ? 10 : 9;// : isDoA ? 9 : 10;
                selectedAffix = EnumHelper.GetName <LPRsEnum>((LPRsEnum)rand.Next(0, apRand));
                if (isUltimate)
                {
                    procChance += 0.1m;
                    selectedPowerData.Stackable = true;
                }
                procsBuff = true;
            }
            if (selectedAffix == EnumHelper.GetName <LDBsEnum>(LDBsEnum.LowPercCastRandomEP))
            {
                selectedAffix = EnumHelper.GetName <EPs_HighDBsEnum>((EPs_HighDBsEnum)rand.Next(0, isHighTier ? 7 : 3));
                if (!isHighTier)
                {
                    procChance -= 0.05m;
                }
            }
            if (selectedAffix == EnumHelper.GetName <EPs_HighDBsEnum>(EPs_HighDBsEnum.RandomCC))
            {
                selectedAffix = EnumHelper.GetName <CCsEnum>((CCsEnum)rand.Next(0, isHighTier ? 4 : 2));
            }
            if (selectedAffix == EnumHelper.GetName <EPs_HighDBsEnum>(EPs_HighDBsEnum.RandomCurse))
            {
                selectedAffix = EnumHelper.GetName <CursesEnum>((CursesEnum)rand.Next(0, isHighTier ? 9 : 3));
            }
            if (selectedAffix == EnumHelper.GetName <EPs_HighDBsEnum>(EPs_HighDBsEnum.RandomTotemOrBanner))
            {
                selectedAffix = EnumHelper.GetName <CursesEnum>((CursesEnum)rand.Next(0, isHighTier ? 9 : 3));
                if (!isHighTier)
                {
                    procChance -= 0.10m;
                }
            }

            if (procsBuff)
            {
                skillMetadata.Add(AffixMetadataEnum.ProcsBuff);
            }

            skillPowerAffixData.PowerData = new SkillAffixProcStat(procChance, powerType, selectedAffix, skillData, skillMetadata);
            var skillUp = skillData;

            if (powerType == PowerTypesEnum.AngelicPower)
            {
                skillUp.AngelicPower += 1;
            }
            else if (powerType == PowerTypesEnum.DemonicPower)
            {
                skillUp.DemonicPower += 1;
            }
            else if (powerType == PowerTypesEnum.AncestralPower)
            {
                skillUp.AncestralPower += 1;
            }

            skillPowerAffixData.PowerUp = new SkillAffixProcStat(procChance, powerType, selectedAffix, skillUp, skillMetadata);

            return(skillPowerAffixData);
        }
Exemple #8
0
        internal static SkillPowerAffixData RecalculatePowerAffixesForSkill(PowerTypesEnum powerType, CastTypesEnum castType, ISkillAffixProcStat affixStat, DamageSkillStat skillData, List <AffixMetadataEnum> md)
        {
            var empoweredAffixData = new SkillPowerAffixData();
            var level = powerType == PowerTypesEnum.AngelicPower ? skillData.AngelicPower : powerType == PowerTypesEnum.DemonicPower ? skillData.DemonicPower : skillData.AncestralPower;

            var rng        = SkillStatHelper.GetRNG(powerType);
            var affix      = new SkillAffixProcStat();
            var isHighTier = skillData.Tier > 2;
            var procChance = affixStat.ProcChance;
            // var procBonus = SkillStatHelper.GetProcChance(level, powerType, isHighTier, castType, md);
            // procChance += procBonus;

            var selectedAffix = affixStat.SelectedAffix;

            empoweredAffixData.PowerData            = new SkillAffixProcStat(procChance, powerType, selectedAffix, skillData, md);
            empoweredAffixData.PowerData.ProcAmount = affixStat.ProcAmount;
            var skillUp = skillData;

            if (powerType == PowerTypesEnum.AngelicPower)
            {
                skillUp.AngelicPower += 1;
            }
            else if (powerType == PowerTypesEnum.DemonicPower)
            {
                skillUp.DemonicPower += 1;
            }
            else if (powerType == PowerTypesEnum.AncestralPower)
            {
                skillUp.AncestralPower += 1;
            }

            empoweredAffixData.PowerUp = new SkillAffixProcStat(procChance, powerType, selectedAffix, skillUp, md);

            return(empoweredAffixData);
        }