124 lines
4.3 KiB
JavaScript
124 lines
4.3 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc [最終安定版] スイッチ1002を全セーブデータで共有(global.rmmzsave使用・localStorage完全不使用・安全対応)
|
||
* @author you
|
||
*
|
||
* @help
|
||
* ■ 概要
|
||
* スイッチID 1002 を全セーブデータ・新規ゲームで共通化します。
|
||
* RPGツクールMZ標準の global.rmmzsave に保存されます。
|
||
*
|
||
* ■ 保存先
|
||
* ./save/global.rmmzsave
|
||
*
|
||
* ■ 特徴
|
||
* ・localStorage は一切使用しません。
|
||
* ・save フォルダが無くても自動生成されます。
|
||
* ・ツクールの StorageManager が初期化された後にのみアクセス。
|
||
* ・新規ゲーム、ロード、セーブ、終了時に自動同期。
|
||
*
|
||
* ■ 注意
|
||
* ・PC / NW.js専用(ブラウザでは動作しません)。
|
||
* ・共有スイッチを初期化したい場合は save/global.rmmzsave を削除してください。
|
||
*/
|
||
|
||
(() => {
|
||
const SWITCH_ID = 1002;
|
||
const GLOBAL_KEY = "SharedSwitch1002";
|
||
|
||
// ============================================================
|
||
// ファイル安全ヘルパ
|
||
// ============================================================
|
||
function ensureSaveFolder() {
|
||
const fs = require("fs");
|
||
const path = require("path");
|
||
const base = path.dirname(process.mainModule.filename);
|
||
const dir = path.join(base, "save");
|
||
if (!fs.existsSync(dir)) fs.mkdirSync(dir);
|
||
return dir;
|
||
}
|
||
|
||
function readGlobalFile() {
|
||
const fs = require("fs");
|
||
const path = require("path");
|
||
const dir = ensureSaveFolder();
|
||
const file = path.join(dir, "global.rmmzsave");
|
||
try {
|
||
if (!fs.existsSync(file)) return {};
|
||
const data = fs.readFileSync(file, "utf8");
|
||
const json = LZString.decompressFromBase64(data);
|
||
return JSON.parse(json) || {};
|
||
} catch (e) {
|
||
console.warn("[SharedSwitch1002] 読み込み失敗:", e);
|
||
return {};
|
||
}
|
||
}
|
||
|
||
function writeGlobalFile(obj) {
|
||
const fs = require("fs");
|
||
const path = require("path");
|
||
const dir = ensureSaveFolder();
|
||
const file = path.join(dir, "global.rmmzsave");
|
||
try {
|
||
const json = JSON.stringify(obj || {});
|
||
const compressed = LZString.compressToBase64(json);
|
||
fs.writeFileSync(file, compressed, "utf8");
|
||
} catch (e) {
|
||
console.error("[SharedSwitch1002] 保存失敗:", e);
|
||
}
|
||
}
|
||
|
||
// ============================================================
|
||
// 実際の同期処理
|
||
// ============================================================
|
||
function importSharedSwitch() {
|
||
if (!$gameSwitches) return;
|
||
try {
|
||
const global = readGlobalFile();
|
||
if (Object.prototype.hasOwnProperty.call(global, GLOBAL_KEY)) {
|
||
$gameSwitches.setValue(SWITCH_ID, global[GLOBAL_KEY]);
|
||
}
|
||
} catch (e) {
|
||
console.warn("[SharedSwitch1002] import error:", e);
|
||
}
|
||
}
|
||
|
||
function exportSharedSwitch() {
|
||
if (!$gameSwitches) return;
|
||
try {
|
||
const global = readGlobalFile();
|
||
global[GLOBAL_KEY] = $gameSwitches.value(SWITCH_ID);
|
||
writeGlobalFile(global);
|
||
} catch (e) {
|
||
console.warn("[SharedSwitch1002] export error:", e);
|
||
}
|
||
}
|
||
|
||
// ============================================================
|
||
// フック(StorageManager初期化後にのみ発動)
|
||
// ============================================================
|
||
const _DataManager_setupNewGame = DataManager.setupNewGame;
|
||
DataManager.setupNewGame = function() {
|
||
_DataManager_setupNewGame.call(this);
|
||
setTimeout(importSharedSwitch, 10); // 10ms遅延してStorageManager初期化を待つ
|
||
};
|
||
|
||
const _DataManager_extractSaveContents = DataManager.extractSaveContents;
|
||
DataManager.extractSaveContents = function(contents) {
|
||
_DataManager_extractSaveContents.call(this, contents);
|
||
setTimeout(importSharedSwitch, 10);
|
||
};
|
||
|
||
const _DataManager_makeSaveContents = DataManager.makeSaveContents;
|
||
DataManager.makeSaveContents = function() {
|
||
const contents = _DataManager_makeSaveContents.call(this);
|
||
setTimeout(exportSharedSwitch, 10);
|
||
return contents;
|
||
};
|
||
|
||
const _SceneManager_terminate = SceneManager.terminate;
|
||
SceneManager.terminate = function() {
|
||
setTimeout(exportSharedSwitch, 10);
|
||
_SceneManager_terminate.call(this);
|
||
};
|
||
})();
|