93 lines
2.7 KiB
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;
|
|
}
|
|
}
|
|
}
|