# 세이브/데이터 관리 시스템

> 메인 문서: [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<String, dynamic> 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<void> createBackup(int slotIndex) async {
    final backup = await loadRawSave(slotIndex);
    await saveBackup(slotIndex, backup, DateTime.now());
  }

  /// 마이그레이션 실패 시 롤백
  Future<void> rollback(int slotIndex) async {
    final backup = await loadLatestBackup(slotIndex);
    await restoreSave(slotIndex, backup);
  }
}
```

### 2.4 마이그레이션 실패 처리

```
┌─────────────────────────────────────┐
│                                     │
│   ⚠️ 세이브 데이터 업그레이드 실패   │
│                                     │
│   이전 버전의 세이브 데이터를       │
│   현재 버전으로 변환하는 데         │
│   문제가 발생했습니다.              │
│                                     │
│   [ 백업에서 복원 ]                 │
│   [ 새 게임 시작 ]                  │
│   [ 버그 리포트 ]                   │
│                                     │
└─────────────────────────────────────┘
```

---

## 3. 세이브 파일 관리

### 3.1 세이브 파일 구조

```dart
class SaveFileManager {
  /// 세이브 파일 경로
  Future<String> getSavePath(int slotIndex);

  /// 백업 파일 경로
  Future<String> getBackupPath(int slotIndex, DateTime timestamp);

  /// 내보내기 파일 생성
  Future<File> exportSave(int slotIndex);

  /// 외부 파일에서 가져오기
  Future<void> 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 (레벨업)     │
│   └─ ...                            │
│                                     │
│   [ 내보내기 ] [ 가져오기 ]         │
│   [ 백업에서 복원 ] [ 삭제 ]        │
│                                     │
└─────────────────────────────────────┘
```

---
