ponshu-room-lite/lib/services/level_calculator.dart

61 lines
2.2 KiB
Dart

class LevelCalculator {
static const List<Map<String, dynamic>> _levelTable = [
{'level': 1, 'requiredExp': 0, 'title': '見習い'},
{'level': 2, 'requiredExp': 10, 'title': '歩き飲み'},
{'level': 5, 'requiredExp': 50, 'title': '嗜み人'},
{'level': 10, 'requiredExp': 100, 'title': '呑兵衛'},
{'level': 20, 'requiredExp': 200, 'title': '酒豪'},
{'level': 30, 'requiredExp': 300, 'title': '利き酒師'},
{'level': 50, 'requiredExp': 500, 'title': '日本酒伝道師'},
{'level': 100, 'requiredExp': 1000, 'title': 'ポンシュマスター'},
];
static int getLevel(int totalExp) {
for (var i = _levelTable.length - 1; i >= 0; i--) {
if (totalExp >= (_levelTable[i]['requiredExp'] as int)) {
return _levelTable[i]['level'] as int;
}
}
return 1; // Fallback
}
static String getTitle(int totalExp) {
final level = getLevel(totalExp);
return _levelTable.firstWhere(
(entry) => entry['level'] == level,
orElse: () => _levelTable[0],
)['title'] as String;
}
static double getProgress(int totalExp) {
final currentLevel = getLevel(totalExp);
final currentEntry = _levelTable.firstWhere((e) => e['level'] == currentLevel);
// Find next level entry
final currentIndex = _levelTable.indexOf(currentEntry);
if (currentIndex == _levelTable.length - 1) return 1.0; // Max level
final nextEntry = _levelTable[currentIndex + 1];
final currentLevelExp = currentEntry['requiredExp'] as int;
final nextLevelExp = nextEntry['requiredExp'] as int;
if (nextLevelExp == currentLevelExp) return 1.0;
return (totalExp - currentLevelExp) / (nextLevelExp - currentLevelExp);
}
static int getExpToNextLevel(int totalExp) {
final currentLevel = getLevel(totalExp);
final currentEntry = _levelTable.firstWhere((e) => e['level'] == currentLevel);
// Find next level entry
final currentIndex = _levelTable.indexOf(currentEntry);
if (currentIndex == _levelTable.length - 1) return 0; // Max level
final nextEntry = _levelTable[currentIndex + 1];
return (nextEntry['requiredExp'] as int) - totalExp;
}
}