【解決済み】セーブデータを移動させるスクリプト

アバター
DoujinRuis
記事: 136
登録日時: 2022年10月25日(火) 10:59

【解決済み】セーブデータを移動させるスクリプト

投稿記事by DoujinRuis » 2023年9月27日(水) 23:49

現在トリアコンタンさんのシーンカスタムメニューでメニュー画面を作成中です

セーブデータを移動させるスクリプトを教えて欲しいです。
アルゴリズムは下記を想定していますが他にアルゴリズムがあればそちらでも大丈夫です。

アルゴリズム
選択1回目
 現在のシーンを一時的に保存する(データ1)
 セーブデータの有無の確認、有ればデータを読み込む(データ2)
 データ2を保存する
選択2回目前キャンセル
 データ1を読み込む
選択2回目
 セーブデータの有無の確認、有れば上書きの確認
 無ければデータ2を書き込みする(データ3)
 データ2を削除する

試行錯誤のスクリプト
let save_id = $gameVariables.value(4) + 1; // セーブデータのID
let count = $gameVariables.value(16); // 選択回数カウント用変数
// $gameVariables.value(2)はウィンドウに関わるものです

// 選択回数1回目
if (count === 0 && $gameVariables.value(2) === 2) {
DataManager.saveGame(105);
if (DataManager.savefileExists(save_id)) {
DataManager.loadGame(save_id);
$gameVariables.setValue(16, 1); // カウントを1に増加
$gameVariables.setValue(5, save_id);
} else {
alert("セーブデータがありません");
}
}
// 選択回数2回目
else if (count === 1 && $gameVariables.value(2) === 2) {
if (DataManager.savefileExists(save_id)) {
DataManager.saveGame($gameVariables.value(4)+1).then(contents => {
ConfigManager.save();
DataManager.loadGame($gameVariables.value(5));
});
}else{
DataManager.saveGame($gameVariables.value(4)+1).then(contents => {
ConfigManager.save();
DataManager.loadGame($gameVariables.value(5));
});
$gameVariables.setValue(5, null); // 保存したセーブデータオブジェクトをリセット
$gameVariables.setValue(16, 0); // カウントを0にリセット
}
}

SceneManager.changeWindowFocus('W_SaveFile');


参考スクリプト
DataManagerクラス
セーブデータの作成
DataManager.makeSaveContents();
このメソッドは、現在のゲームの状態をキャプチャして、保存すべきデータの内容を生成します。

セーブデータの取得
DataManager.extractSaveContents(contents);
このメソッドは、保存された内容を取り出して、ゲームのオブジェクトに適用します。

セーブデータの保存
DataManager.saveGame(savefileId);
このメソッドは、指定されたsavefileIdでゲームを保存します。

セーブデータの読み込み
DataManager.loadGame(savefileId);
このメソッドは、指定されたsavefileIdからゲームを読み込みます。

セーブデータが存在するかの確認
DataManager.savefileExists(savefileId);
指定されたsavefileIdが存在するかどうかを確認します。

最新のセーブデータのID取得
DataManager.latestSavefileId();
最も最近保存されたセーブデータのIDを返します。


StorageManagerクラス
StorageManager.exists(key)
指定したキーのデータが存在するかを確認します。
引数: key - データのキー
返り値: ブール値(存在する場合はtrue、そうでない場合はfalse)

StorageManager.saveObject(key, value)
オブジェクトをJSON形式で保存します。
引数:
key - 保存するデータのキー
value - 保存するオブジェクト
返り値: Promise

StorageManager.loadObject(key)
キーを指定して保存されたデータをロードします。
引数: key - データのキー
返り値: ロードされたオブジェクトのPromise

StorageManager.remove(key)
指定したキーのデータを削除します。
引数: key - 削除するデータのキー

StorageManager.backup(key)
指定したキーのデータをバックアップします。
引数: key - データのキー

StorageManager.restoreBackup(key)
指定したキーのデータのバックアップを復元します。
引数: key - データのキー

StorageManager.cleanBackup()
不要なバックアップファイルを削除します。

StorageManager.isLocalMode()
ローカルモードで動作しているかどうかを確認します。
返り値: ブール値(ローカルモードの場合はtrue、そうでない場合はfalse)

StorageManager.saveToLocalFile(filePath, data)
データをローカルファイルとして保存します。
引数:
filePath - 保存するファイルのパス
data - 保存するデータ

StorageManager.loadFromLocalFile(filePath)
ローカルファイルからデータをロードします。
引数: filePath - ロードするファイルのパス
返り値: ロードされたデータ

StorageManager.removeLocalFile(filePath)
ローカルファイルを削除します。
引数: filePath - 削除するファイルのパス
最後に編集したユーザー DoujinRuis on 2023年9月29日(金) 11:43 [ 編集 1 回目 ]

普段Youtubeで同人ゲームの情報を発信しています
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg

Twitter
https://twitter.com/kQ1NG4MmNGK1lRw
名無し蛙
記事: 304
登録日時: 2015年11月23日(月) 02:46

Re: セーブデータを移動させるスクリプト

投稿記事by 名無し蛙 » 2023年9月28日(木) 20:14

DoujinRuis さんが書きました:セーブデータを移動させるスクリプトを教えて欲しいです。
アルゴリズムは下記を想定していますが他にアルゴリズムがあればそちらでも大丈夫です。

シーンカスタムメニューの事はよく知らないのでこの部分だけ答えると
①セーブファイルの展開
②展開した内容を新規セーブ
③古いセーブの削除
④セーブヘッダ情報の移動、及びGlobalファイルの保存
で良いと思います。例外処理を考慮してませんがコードにするならこんな感じですか。

コード: 全て選択

const oldId = 1;
const newId = 3;
const oldName = DataManager.makeSavename(oldId);
const newName = DataManager.makeSavename(newId);
StorageManager.loadObject(oldName)
    .then(contents => StorageManager.saveObject(newName, contents))
    .then(() => StorageManager.remove(oldName))
    .then(() => {
        DataManager._globalInfo[newId] = DataManager._globalInfo[oldId];
        DataManager._globalInfo[oldId] = null;
        DataManager.saveGlobalInfo();
        return 0;
    });

普通にPCゲームとしてのみ公開するつもりならリネームでも十分だと思います。

コード: 全て選択

const oldId = 1;
const newId = 3;
const oldName = DataManager.makeSavename(oldId);
const newName = DataManager.makeSavename(newId);
const oldPath = StorageManager.filePath(oldName);
const newPath = StorageManager.filePath(newName);
StorageManager.fsRename(oldPath, newPath);
DataManager._globalInfo[newId] = DataManager._globalInfo[oldId];
DataManager._globalInfo[oldId] = null;
DataManager.saveGlobalInfo();
アバター
DoujinRuis
記事: 136
登録日時: 2022年10月25日(火) 10:59

Re: セーブデータを移動させるスクリプト

投稿記事by DoujinRuis » 2023年9月28日(木) 21:22

返信ありがとうございます
下記のスクリプトなどは全然わかりませんでした
早速やってみたいと思います

DataManager.makeSavename(oldId);
普段Youtubeで同人ゲームの情報を発信しています
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg

Twitter
https://twitter.com/kQ1NG4MmNGK1lRw
アバター
DoujinRuis
記事: 136
登録日時: 2022年10月25日(火) 10:59

Re: セーブデータを移動させるスクリプト

投稿記事by DoujinRuis » 2023年9月29日(金) 11:26

名無し蛙様ありがとうございます
実装することが出来ました


下記はシーンカスタムメニュー用のスクリプトとして残しておきます
// 移動
let save_id = $gameVariables.value(4) + 1; // セーブデータのID
let count = $gameVariables.value(16); // 選択回数カウント用変数

// 選択回数1回目
if (count === 0 && $gameVariables.value(2) === 2) {
if (DataManager.savefileExists(save_id)) {
const oldId = save_id;
const oldName = DataManager.makeSavename(oldId);
const oldPath = StorageManager.filePath(oldName);
$gameVariables.setValue(63, oldId);
$gameVariables.setValue(5, oldPath);
$gameVariables.setValue(16, 1); // カウントを1に増加
}else {
$gameMessage.add("セーブデータがありません");

}
}
// 選択回数2回目
else if (count === 1 && $gameVariables.value(2) === 2) {
const newId = save_id;
const newName = DataManager.makeSavename(newId);
const newPath = StorageManager.filePath(newName);
const oldId = $gameVariables.value(63);
const oldPath = $gameVariables.value(5);
StorageManager.fsRename(oldPath, newPath);
DataManager._globalInfo[newId] = DataManager._globalInfo[oldId];
DataManager._globalInfo[oldId] = null;
DataManager.saveGlobalInfo();
$gameVariables.setValue(63, null);
$gameVariables.setValue(5, null);
$gameVariables.setValue(16, 0); // カウントを0にリセット
}

SceneManager.changeWindowFocus('W_SaveFile');
普段Youtubeで同人ゲームの情報を発信しています
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg

Twitter
https://twitter.com/kQ1NG4MmNGK1lRw

“MZ:質問” へ戻る