refactor(core): 진행 루프, 저장 데이터, 저장 관리자 개선

- ProgressLoop 로직 정리
- SaveData 모델 확장
- SaveManager 개선
This commit is contained in:
JiWoong Sul
2026-01-08 16:05:08 +09:00
parent 56b568a832
commit 606d052e2c
3 changed files with 18 additions and 9 deletions

View File

@@ -108,7 +108,7 @@ class ProgressLoop {
_timer?.cancel();
_timer = null;
if (saveOnStop && _autoSaveConfig.onStop && saveManager != null) {
await saveManager!.saveState(_state);
await saveManager!.saveState(_state, cheatsEnabled: cheatsEnabled);
}
}
@@ -131,7 +131,7 @@ class ProgressLoop {
_stateController.add(_state);
if (saveManager != null && _autoSaveConfig.shouldSave(result)) {
saveManager!.saveState(_state);
saveManager!.saveState(_state, cheatsEnabled: cheatsEnabled);
}
// 사망 시 루프 정지 및 콜백 호출 (Phase 4)

View File

@@ -16,9 +16,10 @@ class GameSave {
required this.skillBook,
required this.progress,
required this.queue,
this.cheatsEnabled = false,
});
factory GameSave.fromState(GameState state) {
factory GameSave.fromState(GameState state, {bool cheatsEnabled = false}) {
return GameSave(
version: kSaveVersion,
rngState: state.rng.state,
@@ -29,6 +30,7 @@ class GameSave {
skillBook: state.skillBook,
progress: state.progress,
queue: state.queue,
cheatsEnabled: cheatsEnabled,
);
}
@@ -41,10 +43,12 @@ class GameSave {
final SkillBook skillBook;
final ProgressState progress;
final QueueState queue;
final bool cheatsEnabled;
Map<String, dynamic> toJson() {
return {
'version': version,
'cheatsEnabled': cheatsEnabled,
'rng': rngState,
'traits': {
'name': traits.name,
@@ -144,6 +148,7 @@ class GameSave {
return GameSave(
version: json['version'] as int? ?? kSaveVersion,
cheatsEnabled: json['cheatsEnabled'] as bool? ?? false,
rngState: json['rng'] as int? ?? 0,
traits: Traits(
name: traitsJson['name'] as String? ?? '',

View File

@@ -13,19 +13,23 @@ class SaveManager {
/// Save current game state to disk. [fileName] may be absolute or relative.
/// Returns outcome with error on failure.
Future<SaveOutcome> saveState(GameState state, {String? fileName}) {
final save = GameSave.fromState(state);
Future<SaveOutcome> saveState(
GameState state, {
String? fileName,
bool cheatsEnabled = false,
}) {
final save = GameSave.fromState(state, cheatsEnabled: cheatsEnabled);
return _repo.save(save, fileName ?? defaultFileName);
}
/// Load game state from disk. [fileName] may be absolute (e.g., file picker).
/// Returns outcome + optional state.
Future<(SaveOutcome, GameState?)> loadState({String? fileName}) async {
/// Returns outcome + optional state + cheatsEnabled flag.
Future<(SaveOutcome, GameState?, bool)> loadState({String? fileName}) async {
final (outcome, save) = await _repo.load(fileName ?? defaultFileName);
if (!outcome.success || save == null) {
return (outcome, null);
return (outcome, null, false);
}
return (outcome, save.toState());
return (outcome, save.toState(), save.cheatsEnabled);
}
/// 저장 파일 목록 조회