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