Last active
March 17, 2023 12:14
-
-
Save enriquesaid/46c2a13d63e73d505c7ef6a86fcadd4a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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