SAVE機能の概要
概要
SAVE機能は、ゲームデータの永続化を担当する機能群です。 プレイヤーの進行状況を安全に保存・読み込みし、データの整合性を保証します。
主要機能
データ管理
操作 |
機能 |
|---|---|
SAVE |
ゲーム進行データの保存 |
LOAD |
保存されたデータの読み込み |
DELETE |
不要なセーブデータの削除 |
セーブスロット
3つのスロット: プレイヤーは最大3つのセーブデータを管理可能
スロット情報表示: 各スロットの作成日時・プレイ時間を表示
上書き確認: 既存データへの上書き時に確認ダイアログ表示
データ保護
暗号化保存: AES暗号化によるデータ改ざん防止
整合性チェック: 読み込み時のデータ検証
バックアップ機能: 自動バックアップによるデータ保護
技術仕様
アーキテクチャ
SAVE機能は3層構造で実装されています:
Controller層 (
common/save/*.py)Service層 (
common/save/service/*.py)Component層 (暗号化・ファイル操作)
データ形式
セーブデータ構造:
- ヘッダー情報(タイムスタンプ、バージョン)
- プレイヤーデータ(レベル、所持アイテム)
- ゲーム進行状況(現在位置、フラグ状態)
- 設定情報(キー設定、音量)
ファイル構成
save/
├── save.dat # 暗号化されたセーブデータファイル
└── backup/ # 自動バックアップフォルダ
├── save_001.dat # スロット1のバックアップ
├── save_002.dat # スロット2のバックアップ
└── save_003.dat # スロット3のバックアップ
暗号化仕様
暗号化方式: AES-128-EAX
キー長: 128ビット(16バイト固定)
モード: EAX(認証付き暗号化)
認証タグ: 可変長(メタデータで記録)
NONCE: 自動生成・可変長管理
完全性: 認証タグによる改ざん検証(復号化時に自動検証)
データフロー
保存処理
ゲームデータ
↓
SAVE Controller(保存要求受付)
↓
SAVE Service(データ変換・検証)
↓
暗号化Component(AES暗号化)
↓
ファイルシステム(永続化)
読み込み処理
ファイルシステム
↓
復号化Component(AES復号化)
↓
SAVE Service(データ検証・変換)
↓
SAVE Controller(ゲームへデータ提供)
↓
ゲーム状態復元
関連ファイル
Controller層
common/save/action.py- セーブ・ロード操作処理common/save/display.py- セーブ画面描画common/save/sound.py- 操作音再生common/save/status.py- 画面遷移管理
Service層
common/save/service/action.py- データ操作ロジックcommon/save/service/display.py- 画面表示制御common/save/service/sound.py- 音声制御common/save/service/status.py- 状態管理
Component層
表示コンポーネント
common/save/service/component/displayScreenManager.py- 画面描画管理コンポーネントクラス:
DisplayScreenManager主要メソッド:
blit() -> bool- 画面への画像描画None チェック(screen / img / pos)
pygame.error/MemoryError/Exceptionの多段ハンドリングハンドラの戻り値(True/False)をそのまま返却
ハンドラ自体が例外を起こした場合のみ
recovery_errorパスへ
実装詳細:
dataclass(frozen=True)による不変オブジェクト抽象クラス
AbstractScreenComponentの共通エラーハンドラを使用
common/save/service/component/displayTextManager.py- テキスト描画管理コンポーネントクラス:
DisplayTextManager主要メソッド:
blit() -> bool- フォントレンダリングと画面描画None チェック(screen / font / text / pos)
pygame.error / MemoryError / Exception を個別ログ出力
成功時は
False、エラー時はTrueを返却
common/save/service/component/displayRequestValidator.py- 表示リクエスト検証コンポーネントクラス:
RequestValidator主要メソッド:
raise_if_invalid() -> None- リクエスト属性の一括検証全属性の存在・None・型チェック
不正な場合は
ValueErrorを raise
サウンドコンポーネント
common/save/service/component/soundChannelManager.py- 音声チャンネル管理コンポーネントクラス:
SoundChannelManager主要メソッド:
start() -> None- 音声再生開始volume / mp3_path の妥当性検証
チャンネル有効性チェック後に再生
失敗時は
Exceptionを raise
stop() -> None- 音声再生停止hasattrによるチャンネル確認pygame.error / Exception をログ出力してもみ消す
実装詳細:
dataclass(frozen=True)による不変オブジェクト抽象クラス
AbstractSoundManagerを継承
common/save/service/component/soundChannelCheck.py- 音声チャンネル状態確認コンポーネントクラス:
SoundChannelCheck主要メソッド:
can_sound_start() -> bool- 再生開始可否の判定_has_channel_availableが True_channel_indexがRELEASED_CHANNEL_INDEX_channelが None、の全条件を満たす場合に True を返却
common/save/service/component/soundRequestValidator.py- サウンドリクエスト検証コンポーネントクラス:
RequestValidator主要メソッド:
raise_if_invalid() -> None- リクエスト属性の一括検証bool属性 11件(save/load/delete タッチ状態等)を検証
int属性 2件(volume / channel_index)を検証
channel 属性の型検証
sound_list 属性の存在・型検証
暗号化・復号化処理
common/save/aes.py- AES-EAX暗号化コンポーネントクラス:
Aes主要メソッド:
encrypt(text: str) -> bytes- テキスト暗号化AES-EAX モード採用
NONCE自動生成
認証タグ付き(改ざん検出可能)
戻り値形式:
[tagLen:4bytes][tag][nonceLen:4bytes][nonce][cipherText]
decrypt(datalist: list) -> str- テキスト復号化暗号化データから認証タグ・NONCE・暗号文を抽出
完全性検証後に復号化
改ざん検出時は例外発生
実装詳細:
pycryptodome ライブラリ使用
EAX モード(認証付き暗号化)
自動デバッグログ出力機能
エラー発生時の空バイト列返却
高速化処理
pyd/save.cp311-win_amd64.pyd- Cython実装のセーブ処理エンジン用途: 大規模ゲームデータの高速化
インターフェース:
pyd.saveモジュールとして import処理対象:
バイナリシリアライズ
チャンク単位での処理
メモリ効率的な大規模データ対応
共通機能
common/common.py- 全体共通機能
エラーハンドリング
想定エラー
エラー種別 |
対応 |
|---|---|
ファイル破損 |
バックアップからの自動復旧 |
暗号化失敗 |
エラーログ出力・ユーザー通知 |
容量不足 |
古いバックアップの自動削除 |
権限エラー |
管理者権限での再試行 |
復旧手順
自動復旧: バックアップファイルからの自動復元
手動復旧: ユーザーによるバックアップ選択復元
初期化: 全データ消失時の新規作成
今後の拡張予定
クラウド同期: オンラインストレージとの同期機能
エクスポート機能: セーブデータの外部出力
インポート機能: 外部セーブデータの取り込み
圧縮機能: より効率的なデータ保存
マルチプロファイル: ユーザー別のセーブデータ管理