MIF_E31222389/lib/utils/level_manager.dart

93 lines
2.7 KiB
Dart

import 'package:shared_preferences/shared_preferences.dart';
class LevelManager {
// Konstanta untuk tipe permainan
static const String TYPE_HINDU_BUDDHA = 'hindu_buddha';
static const String TYPE_ISLAM = 'islam';
// Konstanta untuk jumlah level maksimum
static const int MAX_LEVEL = 3;
// Kunci untuk setiap level dan tipe
static String _getLevelKey(int level, String type) {
if (!_isValidType(type)) {
throw ArgumentError('Tipe permainan tidak valid: $type');
}
if (!_isValidLevel(level)) {
throw ArgumentError('Level tidak valid: $level');
}
return 'level${level}_${type}_completed';
}
// Validasi tipe permainan
static bool _isValidType(String type) {
return type == TYPE_HINDU_BUDDHA || type == TYPE_ISLAM;
}
// Validasi nomor level
static bool _isValidLevel(int level) {
return level >= 1 && level <= MAX_LEVEL;
}
// Set status level selesai
static Future<void> setLevelCompleted(
int level, bool completed, String type) async {
try {
final prefs = await SharedPreferences.getInstance();
final key = _getLevelKey(level, type);
await prefs.setBool(key, completed);
} catch (e) {
print('Error saat menyimpan status level: $e');
rethrow;
}
}
// Cek status level selesai
static Future<bool> isLevelCompleted(int level, String type) async {
try {
final prefs = await SharedPreferences.getInstance();
final key = _getLevelKey(level, type);
return prefs.getBool(key) ?? false;
} catch (e) {
print('Error saat mengecek status level: $e');
return false;
}
}
// Cek apakah level sebelumnya sudah selesai
static Future<bool> canAccessLevel(int level, String type) async {
if (level == 1) return true; // Level 1 selalu dapat diakses
return await isLevelCompleted(level - 1, type);
}
// Reset semua progress untuk tipe permainan tertentu
static Future<void> resetProgress(String type) async {
try {
final prefs = await SharedPreferences.getInstance();
for (int i = 1; i <= MAX_LEVEL; i++) {
final key = _getLevelKey(i, type);
await prefs.remove(key);
}
} catch (e) {
print('Error saat mereset progress: $e');
rethrow;
}
}
// Dapatkan progress untuk tipe permainan tertentu (dalam persen)
static Future<double> getProgress(String type) async {
try {
int completedLevels = 0;
for (int i = 1; i <= MAX_LEVEL; i++) {
if (await isLevelCompleted(i, type)) {
completedLevels++;
}
}
return (completedLevels / MAX_LEVEL) * 100;
} catch (e) {
print('Error saat menghitung progress: $e');
return 0.0;
}
}
}