Skip to content

Instantly share code, notes, and snippets.

@enriquesaid
Last active March 17, 2023 12:14
Show Gist options
  • Save enriquesaid/46c2a13d63e73d505c7ef6a86fcadd4a to your computer and use it in GitHub Desktop.
Save enriquesaid/46c2a13d63e73d505c7ef6a86fcadd4a to your computer and use it in GitHub Desktop.
enum Achievement { achievementName }
class Level {
const Level(this.label, this.necessaryPoints, this.index);
final String label;
final int necessaryPoints;
final int index;
Level next(List<Level> levels) {
final nextIndex = index + 1;
if (nextIndex == levels.length) return levels.last;
return levels.elementAt(nextIndex);
}
}
class AchievementData {
const AchievementData({
required this.scoresByLevel,
required this.currentScore,
});
final Map<int, int> scoresByLevel;
final int currentScore;
}
const data = {
Achievement.achievementName: AchievementData(
currentScore: 10,
scoresByLevel: {
1: 0,
2: 11,
3: 51,
4: 101,
5: 201,
},
),
};
AchievementData getData(Achievement achievement) {
return data[achievement]!;
}
final achievements = {
for (var i = 0; i < Achievement.values.length; i++)
...generateLevels(Achievement.values.elementAt(i))
};
List<Level> getLevels(Achievement achievement) {
return achievements[achievement]!;
}
Map<Achievement, List<Level>> generateLevels(Achievement achievement) {
final p = getData(achievement).scoresByLevel;
return {
achievement: [
for (var l = 1; l < p.length + 1; l++) Level('Nível $l', p[l]!, l - 1)
]
};
}
Level getLevel(Achievement achievement) {
return getLevels(achievement).reduce((current, next) {
if (getData(achievement).currentScore >= next.necessaryPoints) return next;
return current;
});
}
int getGoalScore(Achievement achievement) {
final next = getLevel(achievement).next(getLevels(achievement));
return next.necessaryPoints - 1;
}
double getProgress(Achievement achievement) {
final level = getLevel(achievement);
final next = level.next(getLevels(achievement));
final score = getData(achievement).currentScore - (level.necessaryPoints - 1);
final necessaryPoints = next.necessaryPoints - level.necessaryPoints;
return necessaryPoints == 0 ? 1.0 : score / necessaryPoints;
}
void main() {
final levels = getLevels(Achievement.achievementName);
final level = getLevel(Achievement.achievementName);
print('Score: ${getData(Achievement.achievementName).currentScore}');
print('Current: ${level.label}');
print('Goal: ${getGoalScore(Achievement.achievementName)}');
print('Next: ${level.next(levels).label}');
print('Progress: ${getProgress(Achievement.achievementName)}');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment