Merge pull request #2153 from MartinFournier/fix/sleeves-skill-progress

Fix #2021: Handle sleeves xp in stats overview
This commit is contained in:
hydroflame 2021-12-29 01:54:28 -05:00 committed by GitHub
commit 3c3f482e7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 5 deletions

@ -17,6 +17,17 @@ export function calculateSkillProgress(exp: number, mult = 1): ISkillProgress {
if (nextExperience < 0) nextExperience = 0; if (nextExperience < 0) nextExperience = 0;
const normalize = (value: number): number => ((value - baseExperience) * 100) / (nextExperience - baseExperience); const normalize = (value: number): number => ((value - baseExperience) * 100) / (nextExperience - baseExperience);
let progress = (nextExperience - baseExperience !== 0) ? normalize(exp) : 99.99;
// Clamp progress: When sleeves are working out, the player gets way too much progress
if (progress < 0) progress = 0
if (progress > 100) progress = 100;
// Clamp floating point imprecisions
let currentExperience = exp - baseExperience;
let remainingExperience = nextExperience - exp;
if (currentExperience < 0) currentExperience = 0;
if (remainingExperience < 0) remainingExperience = 0;
return { return {
currentSkill, currentSkill,
@ -24,7 +35,9 @@ export function calculateSkillProgress(exp: number, mult = 1): ISkillProgress {
baseExperience, baseExperience,
experience: exp, experience: exp,
nextExperience, nextExperience,
progress: (nextExperience - baseExperience !== 0) ? normalize(exp) : 99.99 currentExperience,
remainingExperience,
progress
} }
} }
@ -34,6 +47,8 @@ export interface ISkillProgress {
baseExperience: number; baseExperience: number;
experience: number; experience: number;
nextExperience: number; nextExperience: number;
currentExperience: number;
remainingExperience: number;
progress: number; progress: number;
} }
@ -41,6 +56,7 @@ export function getEmptySkillProgress(): ISkillProgress {
return { return {
currentSkill: 0, nextSkill: 0, currentSkill: 0, nextSkill: 0,
baseExperience: 0, experience: 0, nextExperience: 0, baseExperience: 0, experience: 0, nextExperience: 0,
currentExperience: 0, remainingExperience: 0,
progress: 0, progress: 0,
}; };
} }

@ -9,6 +9,7 @@ interface IProgressProps {
min: number; min: number;
max: number; max: number;
current: number; current: number;
remaining: number;
progress: number; progress: number;
color?: React.CSSProperties["color"]; color?: React.CSSProperties["color"];
} }
@ -18,14 +19,14 @@ interface IStatsOverviewCellProps {
color?: React.CSSProperties["color"]; color?: React.CSSProperties["color"];
} }
export function StatsProgressBar({ min, max, current, progress, color }: IProgressProps): React.ReactElement { export function StatsProgressBar({ min, max, current, remaining, progress, color }: IProgressProps): React.ReactElement {
const tooltip = ( const tooltip = (
<Typography sx={{ textAlign: 'right' }}> <Typography sx={{ textAlign: 'right' }}>
<strong>Progress:</strong>&nbsp; <strong>Progress:</strong>&nbsp;
{numeralWrapper.formatExp(current - min)} / {numeralWrapper.formatExp(max - min)} {numeralWrapper.formatExp(current)} / {numeralWrapper.formatExp(max - min)}
<br /> <br />
<strong>Remaining:</strong>&nbsp; <strong>Remaining:</strong>&nbsp;
{numeralWrapper.formatExp(max - current)} ({progress.toFixed(2)}%) {numeralWrapper.formatExp(remaining)} ({progress.toFixed(2)}%)
</Typography> </Typography>
); );
@ -58,7 +59,8 @@ export function StatsProgressOverviewCell({ progress: skill, color }: IStatsOver
<StatsProgressBar <StatsProgressBar
min={skill.baseExperience} min={skill.baseExperience}
max={skill.nextExperience} max={skill.nextExperience}
current={skill.experience} current={skill.currentExperience}
remaining={skill.remainingExperience}
progress={skill.progress} progress={skill.progress}
color={color} color={color}
/> />