Exemple #1
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);
        }
        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 #3
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);
        }
        public IActionResult GetAll([FromQuery] int classType)
        {
            var skills = new SkillList();

            try {
                // var selectedSkillset = getClassSkills((ClassTypeEnum)classType);
                var skillSeedData    = this.getSkillData();
                var selectedSkillset = classType != 0 ? skillSeedData.Where(s => s.ClassType == classType).GroupBy(t => t.SkillData.Tier) : skillSeedData.GroupBy(t => t.SkillData.Tier);

                var tier       = 0;
                var skillCount = 0;
                foreach (var tierSet in selectedSkillset)
                {
                    tier       = tierSet.FirstOrDefault().SkillData.Tier;
                    skillCount = 0;
                    foreach (var skill in tierSet)
                    {
                        var skillTier  = skill.SkillData.Tier;
                        var skillLevel = 1;               // levelRand.Next(1, randMax);
                        var skillData  = skill.SkillData; //getRandomSkillData(selectedClassType, tier);
                        skillData.Level = skillLevel;
                        var scs  = new SkillCostStat(skillData);
                        var data = new SimpleSkillDamageAffixData();
                        data.PowerData = skill.SkillData;
                        var sd              = new SkillDTO(skill.Id, skill.Name, skill.Description, skillLevel, data, scs, skill.AttackTypes, skill.DamageTypes, skill.SkillMetadata, skill.SkillClassification, skillData.IsCC);
                        var skillToAdd      = new Skill(skill.Id, sd, scs);
                        var castTypesData   = "CastTypes: [" + string.Join(", ", skillToAdd.Data.CastTypes.Select(t => EnumHelper.GetName <CastTypesEnum>(t))) + "]";
                        var damageTypesData = "EmpoweredByDamageTypes: [" + string.Join(", ", skillToAdd.Data.DamageTypes.Select(t => EnumHelper.GetName <DamageTypesEnum>(t))) + "]";
                        // [" + string.Join(", ", skillToAdd.Data.SkillCategoriesMetadata.Select(t => EnumHelper.GetName<SkillCategoriesEnum>(t))) + "]";

                        var descriptionWithDetails = skillToAdd.Description + "<br/>" + "<br/>" + castTypesData + "<br/>" + damageTypesData + "<br/>";
                        skillToAdd.Description      = descriptionWithDetails;
                        skillToAdd.Data.Description = descriptionWithDetails;

                        var skillMetadata = skill.SkillMetadata; //SkillStatHelper.GetSkillMetadata(PowerTypesEnum.AngelicPower, (ClassTypeEnum)skill.ClassType, skillToAdd.Data);
                        var PoDAng        = SkillStatHelper.GetRNG(PowerTypesEnum.AngelicPower).Next(1, 18) % 5 == 0;
                        var PoDDem        = SkillStatHelper.GetRNG(PowerTypesEnum.DemonicPower).Next(1, 18) % 4 == 0;
                        var PoDAnc        = SkillStatHelper.GetRNG(PowerTypesEnum.AncestralPower).Next(1, 18) % 3 == 0;

                        var md1 = new List <AffixMetadataEnum>(); md1.AddRange(skillMetadata);
                        var md2 = new List <AffixMetadataEnum>(); md2.AddRange(skillMetadata);
                        var md3 = new List <AffixMetadataEnum>(); md3.AddRange(skillMetadata);
                        if (PoDAng)
                        {
                            md1.Add(AffixMetadataEnum.ProcsOnDeath);
                        }
                        if (PoDDem)
                        {
                            md2.Add(AffixMetadataEnum.ProcsOnDeath);
                        }
                        if (PoDAnc)
                        {
                            md3.Add(AffixMetadataEnum.ProcsOnDeath);
                        }

                        skillToAdd.ClassId             = skill.ClassType;// classType;
                        skillToAdd.ClassName           = EnumHelper.GetName <ClassTypeEnum>((ClassTypeEnum)skill.ClassType);
                        skillToAdd.Data.AngelicAffix   = SpellPowerDataCalculator.GetPowerAffixesForSkill(PowerTypesEnum.AngelicPower, skill.AttackTypes ?? new List <CastTypesEnum>(), skill.DamageTypes, skillToAdd.Data.SkillData.PowerData, md1);
                        skillToAdd.Data.DemonicAffix   = SpellPowerDataCalculator.GetPowerAffixesForSkill(PowerTypesEnum.DemonicPower, skill.AttackTypes ?? new List <CastTypesEnum>(), skill.DamageTypes, skillToAdd.Data.SkillData.PowerData, md2);
                        skillToAdd.Data.AncestralAffix = SpellPowerDataCalculator.GetPowerAffixesForSkill(PowerTypesEnum.AncestralPower, skill.AttackTypes ?? new List <CastTypesEnum>(), skill.DamageTypes, skillToAdd.Data.SkillData.PowerData, md3);

                        skills.Skills.Add(skillToAdd);
                        skillCount++;
                    }
                }
            }
            catch (Exception ex) {
                var exMessage = ex.Message;
                if ((ex.InnerException?.Message ?? "").Length != 0)
                {
                    exMessage += ex.InnerException.Message;
                }
                return(BadRequest(ex.Message));
            }

            return(Ok(skills));
        }