magical-girls-runa-and-nanami/js/plugins/variable_kaisou.js
2026-02-28 12:33:13 -06:00

124 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:
* @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);
};
})();