# 세이브/데이터 관리 시스템 > 메인 문서: [game-system-overhaul-index.md](game-system-overhaul-index.md) --- ## 1. 멀티 세이브 슬롯 ### 1.1 세이브 슬롯 구조 ```dart class SaveSlot { final int slotIndex; // 0-4 (5개 슬롯) final String? characterName; final String? race; final String? klass; final int? level; final Duration? playTime; final DateTime? lastPlayedAt; final bool isEmpty; } ``` ### 1.2 세이브 슬롯 UI ``` ┌─ 세이브 슬롯 선택 ──────────────────┐ │ │ │ ┌─ 슬롯 1 ─────────────────────┐ │ │ │ 🎮 CodeSlayer (Lv.45) │ │ │ │ 버퍼 드워프 디버거 성기사 │ │ │ │ 플레이: 8시간 22분 │ │ │ │ 마지막: 2024.03.15 14:30 │ │ │ └──────────────────────────────┘ │ │ │ │ ┌─ 슬롯 2 ─────────────────────┐ │ │ │ 🎮 NullMaster (Lv.12) │ │ │ │ 널 엘프 컴파일러 마법사 │ │ │ │ 플레이: 1시간 05분 │ │ │ │ 마지막: 2024.03.14 20:15 │ │ │ └──────────────────────────────┘ │ │ │ │ ┌─ 슬롯 3 ─────────────────────┐ │ │ │ 빈 슬롯 │ │ │ │ [ + 새 게임 시작 ] │ │ │ └──────────────────────────────┘ │ │ │ │ ┌─ 슬롯 4 ─────────────────────┐ │ │ │ 빈 슬롯 │ │ │ └──────────────────────────────┘ │ │ │ │ ┌─ 슬롯 5 ─────────────────────┐ │ │ │ 빈 슬롯 │ │ │ └──────────────────────────────┘ │ │ │ └─────────────────────────────────────┘ ``` ### 1.3 슬롯 관리 기능 | 기능 | 설명 | |------|------| | 새 게임 | 빈 슬롯에 새 캐릭터 생성 | | 계속하기 | 해당 슬롯 캐릭터로 게임 재개 | | 삭제 | 슬롯 데이터 삭제 (확인 필요) | | 복사 | 다른 빈 슬롯으로 복사 | | 내보내기 | 세이브 파일로 내보내기 | ### 1.4 관련 파일 | 파일 | 역할 | |------|------| | `core/model/save_slot.dart` | **신규** - 세이브 슬롯 모델 | | `core/storage/multi_save_manager.dart` | **신규** - 멀티 세이브 관리 | | `features/save/save_slot_screen.dart` | **신규** - 슬롯 선택 화면 | --- ## 2. 데이터 마이그레이션 ### 2.1 버전별 마이그레이션 전략 ```dart class SaveMigrator { /// 세이브 데이터 버전 확인 및 마이그레이션 SaveData migrate(Map rawData) { final version = rawData['version'] as int? ?? 1; var data = rawData; // 단계별 마이그레이션 if (version < 2) data = _migrateV1ToV2(data); if (version < 3) data = _migrateV2ToV3(data); if (version < 4) data = _migrateV3ToV4(data); // ... return SaveData.fromJson(data); } } ``` ### 2.2 버전별 변경 사항 | 버전 | 변경 내용 | 마이그레이션 | |------|----------|-------------| | v1→v2 | CombatStats 추가 | 기본 스탯에서 파생 스탯 계산 | | v2→v3 | ItemStats 추가 | 기존 아이템에 기본 스탯 부여 | | v3→v4 | SkillState 추가 | 보유 스킬에 상태 초기화 | | v4→v5 | DeathInfo 추가 | 사망 기록 초기화 | | v5→v6 | 통계 데이터 추가 | 기존 플레이 기반 추정 | ### 2.3 마이그레이션 안전 장치 ```dart class MigrationSafetyNet { /// 마이그레이션 전 백업 생성 Future createBackup(int slotIndex) async { final backup = await loadRawSave(slotIndex); await saveBackup(slotIndex, backup, DateTime.now()); } /// 마이그레이션 실패 시 롤백 Future rollback(int slotIndex) async { final backup = await loadLatestBackup(slotIndex); await restoreSave(slotIndex, backup); } } ``` ### 2.4 마이그레이션 실패 처리 ``` ┌─────────────────────────────────────┐ │ │ │ ⚠️ 세이브 데이터 업그레이드 실패 │ │ │ │ 이전 버전의 세이브 데이터를 │ │ 현재 버전으로 변환하는 데 │ │ 문제가 발생했습니다. │ │ │ │ [ 백업에서 복원 ] │ │ [ 새 게임 시작 ] │ │ [ 버그 리포트 ] │ │ │ └─────────────────────────────────────┘ ``` --- ## 3. 세이브 파일 관리 ### 3.1 세이브 파일 구조 ```dart class SaveFileManager { /// 세이브 파일 경로 Future getSavePath(int slotIndex); /// 백업 파일 경로 Future getBackupPath(int slotIndex, DateTime timestamp); /// 내보내기 파일 생성 Future exportSave(int slotIndex); /// 외부 파일에서 가져오기 Future importSave(File file, int slotIndex); } ``` ### 3.2 자동 백업 | 시점 | 백업 유형 | 보관 기간 | |------|----------|----------| | 레벨업 시 | 자동 | 최근 5개 | | 퀘스트 완료 시 | 자동 | 최근 5개 | | 앱 종료 시 | 자동 | 최근 3개 | | 수동 저장 시 | 수동 | 무제한 | | 버전 업데이트 전 | 마이그레이션 | 영구 | ### 3.3 내보내기/가져오기 ``` 내보내기 형식: JSON (압축) 파일명: ascii_never_die_save_{slot}_{timestamp}.json 내보내기 내용: - 캐릭터 데이터 - 인벤토리 - 장비 - 퀘스트 진행 - 통계 - 업적 - 설정 (선택적) ``` ### 3.4 클라우드 저장 (향후) | 플랫폼 | 저장 위치 | |--------|----------| | iOS | iCloud | | Android | Google Play Games | | Desktop | 로컬만 (향후 자체 서버) | ### 3.5 세이브 파일 UI ``` ┌─ 세이브 파일 관리 ──────────────────┐ │ │ │ 📁 슬롯 1: CodeSlayer │ │ │ │ 자동 백업 (최근 5개) │ │ ├─ 2024-03-15 14:30 (레벨업) │ │ ├─ 2024-03-15 14:15 (퀘스트) │ │ ├─ 2024-03-15 13:45 (레벨업) │ │ └─ ... │ │ │ │ [ 내보내기 ] [ 가져오기 ] │ │ [ 백업에서 복원 ] [ 삭제 ] │ │ │ └─────────────────────────────────────┘ ``` ---