docs: 게임 시스템 개편 계획 문서 분리
- 121KB 단일 문서를 22개 태스크 문서로 분리 - 메인 인덱스 문서 (game-system-overhaul-index.md) 생성 - Phase 1-10 태스크 문서 10개 분리 - 추가 시스템 태스크 문서 10개 분리 - 재미 요소 설계 문서 1개 분리 - 기존 문서는 archive/ 폴더로 이동
This commit is contained in:
223
doc/task-ext-save-data.md
Normal file
223
doc/task-ext-save-data.md
Normal file
@@ -0,0 +1,223 @@
|
||||
# 세이브/데이터 관리 시스템
|
||||
|
||||
> 메인 문서: [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 (레벨업) │
|
||||
│ └─ ... │
|
||||
│ │
|
||||
│ [ 내보내기 ] [ 가져오기 ] │
|
||||
│ [ 백업에서 복원 ] [ 삭제 ] │
|
||||
│ │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user