diff options
Diffstat (limited to 'Malmstone/Utils/MalmstoneXPCalculator.cs')
| -rw-r--r-- | Malmstone/Utils/MalmstoneXPCalculator.cs | 88 |
1 files changed, 72 insertions, 16 deletions
diff --git a/Malmstone/Utils/MalmstoneXPCalculator.cs b/Malmstone/Utils/MalmstoneXPCalculator.cs index 4834def..85ecadf 100644 --- a/Malmstone/Utils/MalmstoneXPCalculator.cs +++ b/Malmstone/Utils/MalmstoneXPCalculator.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Malmstone.Utils { - public static class MalmstoneXPCalculator + public class MalmstoneXPCalculator { private static readonly int[] PvpLevels = { 0, 2000, 2000, 2000, 2000, 3000, 3000, 3000, 3000, 3000, 4000, 4000, 4000, 4000, 4000, 5500, 5500, 5500, 5500, 5500, @@ -22,11 +22,20 @@ namespace Malmstone.Utils private const int RivalWingsWinExp = 1250; private const int RivalWingsLoseExp = 750; - public class XpCalculationResult + public struct XpCalculationResult { - public int RemainingXp { get; set; } - public int TargetLevel { get; set; } - public Dictionary<string, int> ActivityCounts { get; set; } = new(); + public int RemainingXp; + public int TargetLevel; + public int CrystallineConflictWin; + public int CrystallineConflictLose; + public int FrontlineWin; + public int FrontlineLose2nd; + public int FrontlineLose3rd; + public int FrontlineDailyWin; + public int FrontlineDailyLose2nd; + public int FrontlineDailyLose3rd; + public int RivalWingsWin; + public int RivalWingsLose; } public static XpCalculationResult CalculateXp(int currentLevel, int goalLevel, int currentProgress) @@ -56,22 +65,68 @@ namespace Malmstone.Utils { RemainingXp = remainingXp, TargetLevel = goalLevel, + CrystallineConflictWin = CalculateActivityCount(remainingXp, CrystallineWinExp), + CrystallineConflictLose = CalculateActivityCount(remainingXp, CrystallineLoseExp), + FrontlineWin = CalculateActivityCount(remainingXp, FrontlineWinExp), + FrontlineLose2nd = CalculateActivityCount(remainingXp, FrontlineLose2Exp), + FrontlineLose3rd = CalculateActivityCount(remainingXp, FrontlineLoseExp), + FrontlineDailyWin = CalculateActivityCount(remainingXp, FrontlineDailyWinExp), + FrontlineDailyLose2nd = CalculateActivityCount(remainingXp, FrontlineDailyLose2Exp), + FrontlineDailyLose3rd = CalculateActivityCount(remainingXp, FrontlineDailyLoseExp), + RivalWingsWin = CalculateActivityCount(remainingXp, RivalWingsWinExp), + RivalWingsLose = CalculateActivityCount(remainingXp, RivalWingsLoseExp) }; - result.ActivityCounts["Crystalline Conflict Win"] = CalculateActivityCount(remainingXp, CrystallineWinExp); - result.ActivityCounts["Crystalline Conflict Lose"] = CalculateActivityCount(remainingXp, CrystallineLoseExp); - result.ActivityCounts["Frontline Win"] = CalculateActivityCount(remainingXp, FrontlineWinExp); - result.ActivityCounts["Frontline Lose 2nd"] = CalculateActivityCount(remainingXp, FrontlineLose2Exp); - result.ActivityCounts["Frontline Lose 3rd"] = CalculateActivityCount(remainingXp, FrontlineLoseExp); - result.ActivityCounts["Frontline Daily Win"] = CalculateActivityCount(remainingXp, FrontlineDailyWinExp); - result.ActivityCounts["Frontline Daily Lose 2nd"] = CalculateActivityCount(remainingXp, FrontlineDailyLose2Exp); - result.ActivityCounts["Frontline Daily Lose 3rd"] = CalculateActivityCount(remainingXp, FrontlineDailyLoseExp); - result.ActivityCounts["Rival Wings Win"] = CalculateActivityCount(remainingXp, RivalWingsWinExp); - result.ActivityCounts["Rival Wings Lose"] = CalculateActivityCount(remainingXp, RivalWingsLoseExp); + return result; + } + + public static XpCalculationResult CalculateCrystallineConflictMatches(int currentLevel, int goalLevel, int currentProgress) + { + var baseResult = CalculateXp(currentLevel, goalLevel, currentProgress); + var result = new XpCalculationResult + { + RemainingXp = baseResult.RemainingXp, + TargetLevel = baseResult.TargetLevel, + CrystallineConflictWin = CalculateActivityCount(baseResult.RemainingXp, CrystallineWinExp), + CrystallineConflictLose = CalculateActivityCount(baseResult.RemainingXp, CrystallineLoseExp) + }; + + return result; + } + + public static XpCalculationResult CalculateFrontlineMatches(int currentLevel, int goalLevel, int currentProgress) + { + var baseResult = CalculateXp(currentLevel, goalLevel, currentProgress); + var result = new XpCalculationResult + { + RemainingXp = baseResult.RemainingXp, + TargetLevel = baseResult.TargetLevel, + FrontlineWin = CalculateActivityCount(baseResult.RemainingXp, FrontlineWinExp), + FrontlineLose2nd = CalculateActivityCount(baseResult.RemainingXp, FrontlineLose2Exp), + FrontlineLose3rd = CalculateActivityCount(baseResult.RemainingXp, FrontlineLoseExp), + FrontlineDailyWin = CalculateActivityCount(baseResult.RemainingXp, FrontlineDailyWinExp), + FrontlineDailyLose2nd = CalculateActivityCount(baseResult.RemainingXp, FrontlineDailyLose2Exp), + FrontlineDailyLose3rd = CalculateActivityCount(baseResult.RemainingXp, FrontlineDailyLoseExp) + }; + + return result; + } + + public static XpCalculationResult CalculateRivalWingsMatches(int currentLevel, int goalLevel, int currentProgress) + { + var baseResult = CalculateXp(currentLevel, goalLevel, currentProgress); + var result = new XpCalculationResult + { + RemainingXp = baseResult.RemainingXp, + TargetLevel = baseResult.TargetLevel, + RivalWingsWin = CalculateActivityCount(baseResult.RemainingXp, RivalWingsWinExp), + RivalWingsLose = CalculateActivityCount(baseResult.RemainingXp, RivalWingsLoseExp) + }; return result; } + private static int CalculateRemainingXp(int currentLevel, int goalLevel, int currentProgress) { int remainingXp = 0; @@ -101,7 +156,8 @@ namespace Malmstone.Utils private static int CalculateActivityCount(int remainingXp, int activityXp) { - return (int)Math.Ceiling((double)remainingXp / activityXp); + // Should always be greater than 0 + return Math.Max(1, (int)Math.Ceiling((double)remainingXp / activityXp)); } } } |
