aboutsummaryrefslogtreecommitdiffstats
path: root/Malmstone/Utils/MalmstoneXPCalculator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Malmstone/Utils/MalmstoneXPCalculator.cs')
-rw-r--r--Malmstone/Utils/MalmstoneXPCalculator.cs111
1 files changed, 51 insertions, 60 deletions
diff --git a/Malmstone/Utils/MalmstoneXPCalculator.cs b/Malmstone/Utils/MalmstoneXPCalculator.cs
index 85ecadf..ab6fcf9 100644
--- a/Malmstone/Utils/MalmstoneXPCalculator.cs
+++ b/Malmstone/Utils/MalmstoneXPCalculator.cs
@@ -40,28 +40,15 @@ namespace Malmstone.Utils
public static XpCalculationResult CalculateXp(int currentLevel, int goalLevel, int currentProgress)
{
- if (currentLevel < 1 || goalLevel < 1)
- {
- throw new ArgumentOutOfRangeException(nameof(currentLevel), "Levels must be greater than 0.");
- }
-
- int remainingXp = 0;
- if (currentLevel <= PvpLevels.Length && goalLevel <= PvpLevels.Length)
- {
- remainingXp = CalculateRemainingXp(currentLevel, goalLevel, currentProgress);
- }
- else
- {
- remainingXp = CalculateRemainingXpBeyondChart(currentLevel, goalLevel, currentProgress);
- }
+ int remainingXp = CalculateRemainingXpForLevels(currentLevel, goalLevel, currentProgress);
if (remainingXp <= 0)
{
return new XpCalculationResult { RemainingXp = 0, TargetLevel = goalLevel };
}
- var result = new XpCalculationResult
+ return new XpCalculationResult
{
RemainingXp = remainingXp,
TargetLevel = goalLevel,
@@ -72,86 +59,89 @@ namespace Malmstone.Utils
FrontlineLose3rd = CalculateActivityCount(remainingXp, FrontlineLoseExp),
FrontlineDailyWin = CalculateActivityCount(remainingXp, FrontlineDailyWinExp),
FrontlineDailyLose2nd = CalculateActivityCount(remainingXp, FrontlineDailyLose2Exp),
- FrontlineDailyLose3rd = CalculateActivityCount(remainingXp, FrontlineDailyLoseExp),
+ FrontlineDailyLose3rd = CalculateActivityCount(remainingXp, FrontlineLoseExp),
RivalWingsWin = CalculateActivityCount(remainingXp, RivalWingsWinExp),
RivalWingsLose = 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
+ int remainingXp = CalculateRemainingXpForLevels(currentLevel, goalLevel, currentProgress);
+
+ return new XpCalculationResult
{
- RemainingXp = baseResult.RemainingXp,
- TargetLevel = baseResult.TargetLevel,
- CrystallineConflictWin = CalculateActivityCount(baseResult.RemainingXp, CrystallineWinExp),
- CrystallineConflictLose = CalculateActivityCount(baseResult.RemainingXp, CrystallineLoseExp)
+ RemainingXp = remainingXp,
+ TargetLevel = goalLevel,
+ CrystallineConflictWin = CalculateActivityCount(remainingXp, CrystallineWinExp),
+ CrystallineConflictLose = CalculateActivityCount(remainingXp, CrystallineLoseExp)
};
-
- return result;
}
public static XpCalculationResult CalculateFrontlineMatches(int currentLevel, int goalLevel, int currentProgress)
{
- var baseResult = CalculateXp(currentLevel, goalLevel, currentProgress);
- var result = new XpCalculationResult
+ int remainingXp = CalculateRemainingXpForLevels(currentLevel, goalLevel, currentProgress);
+
+ return 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)
+ RemainingXp = remainingXp,
+ TargetLevel = goalLevel,
+ FrontlineWin = CalculateActivityCount(remainingXp, FrontlineWinExp),
+ FrontlineLose2nd = CalculateActivityCount(remainingXp, FrontlineLose2Exp),
+ FrontlineLose3rd = CalculateActivityCount(remainingXp, FrontlineLoseExp),
+ FrontlineDailyWin = CalculateActivityCount(remainingXp, FrontlineDailyWinExp),
+ FrontlineDailyLose2nd = CalculateActivityCount(remainingXp, FrontlineDailyLose2Exp),
+ FrontlineDailyLose3rd = CalculateActivityCount(remainingXp, FrontlineLoseExp)
};
-
- return result;
}
public static XpCalculationResult CalculateRivalWingsMatches(int currentLevel, int goalLevel, int currentProgress)
{
- var baseResult = CalculateXp(currentLevel, goalLevel, currentProgress);
- var result = new XpCalculationResult
+ int remainingXp = CalculateRemainingXpForLevels(currentLevel, goalLevel, currentProgress);
+
+ return new XpCalculationResult
{
- RemainingXp = baseResult.RemainingXp,
- TargetLevel = baseResult.TargetLevel,
- RivalWingsWin = CalculateActivityCount(baseResult.RemainingXp, RivalWingsWinExp),
- RivalWingsLose = CalculateActivityCount(baseResult.RemainingXp, RivalWingsLoseExp)
+ RemainingXp = remainingXp,
+ TargetLevel = goalLevel,
+ RivalWingsWin = CalculateActivityCount(remainingXp, RivalWingsWinExp),
+ RivalWingsLose = CalculateActivityCount(remainingXp, RivalWingsLoseExp)
};
-
- return result;
}
-
- private static int CalculateRemainingXp(int currentLevel, int goalLevel, int currentProgress)
+ private static int CalculateRemainingXpForLevels(int currentLevel, int goalLevel, int currentProgress)
{
int remainingXp = 0;
+ if (currentLevel <= PvpLevels.Length)
+ {
+ int upperBoundLevel = Math.Min(goalLevel, PvpLevels.Length);
+ remainingXp = CalculateRemainingXpWithinChart(currentLevel, upperBoundLevel, currentProgress);
- for (int level = currentLevel; level < goalLevel; level++)
+ if (goalLevel > PvpLevels.Length)
+ {
+ currentLevel = PvpLevels.Length;
+ currentProgress = 0;
+ }
+ }
+ if (goalLevel > PvpLevels.Length)
{
- remainingXp += PvpLevels[level];
+ remainingXp += CalculateRemainingXpBeyondChart(currentLevel, goalLevel);
}
-
- return remainingXp - currentProgress;
+ return remainingXp;
}
- private static int CalculateRemainingXpBeyondChart(int currentLevel, int goalLevel, int currentProgress)
+ private static int CalculateRemainingXpWithinChart(int currentLevel, int goalLevel, int currentProgress)
{
int remainingXp = 0;
-
- if (currentLevel <= PvpLevels.Length)
+ for (int level = currentLevel; level < goalLevel; level++)
{
- remainingXp = CalculateRemainingXp(currentLevel, PvpLevels.Length, currentProgress);
- currentLevel = PvpLevels.Length;
+ remainingXp += PvpLevels[level];
}
+ return remainingXp - currentProgress;
+ }
- remainingXp += (goalLevel - currentLevel) * InfinityLevelExp;
-
- return remainingXp;
+ private static int CalculateRemainingXpBeyondChart(int currentLevel, int goalLevel)
+ {
+ return (goalLevel - currentLevel) * InfinityLevelExp;
}
private static int CalculateActivityCount(int remainingXp, int activityXp)
@@ -159,5 +149,6 @@ namespace Malmstone.Utils
// Should always be greater than 0
return Math.Max(1, (int)Math.Ceiling((double)remainingXp / activityXp));
}
+
}
}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage