現在トリアコンタンさんのシーンカスタムメニューでメニュー画面を作成中です
セーブデータを移動させるスクリプトを教えて欲しいです。
アルゴリズムは下記を想定していますが他にアルゴリズムがあればそちらでも大丈夫です。
アルゴリズム
選択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
- 記事: 136
- 登録日時: 2022年10月25日(火) 10:59
【解決済み】セーブデータを移動させるスクリプト
最後に編集したユーザー DoujinRuis on 2023年9月29日(金) 11:43 [ 編集 1 回目 ]
普段Youtubeで同人ゲームの情報を発信しています
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg
Twitter
https://twitter.com/kQ1NG4MmNGK1lRw
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg
https://twitter.com/kQ1NG4MmNGK1lRw
Re: セーブデータを移動させるスクリプト
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: セーブデータを移動させるスクリプト
返信ありがとうございます
下記のスクリプトなどは全然わかりませんでした
早速やってみたいと思います
DataManager.makeSavename(oldId);
下記のスクリプトなどは全然わかりませんでした
早速やってみたいと思います
DataManager.makeSavename(oldId);
普段Youtubeで同人ゲームの情報を発信しています
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg
Twitter
https://twitter.com/kQ1NG4MmNGK1lRw
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg
https://twitter.com/kQ1NG4MmNGK1lRw
- DoujinRuis
- 記事: 136
- 登録日時: 2022年10月25日(火) 10:59
Re: セーブデータを移動させるスクリプト
名無し蛙様ありがとうございます
実装することが出来ました
下記はシーンカスタムメニュー用のスクリプトとして残しておきます
// 移動
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');
実装することが出来ました
下記はシーンカスタムメニュー用のスクリプトとして残しておきます
// 移動
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
https://www.youtube.com/channel/UCQV4_A ... ZxTrkLKbyg
https://twitter.com/kQ1NG4MmNGK1lRw