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; }
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)); }