//=============================================================================
// RPG Maker MZ - IM_GlobalSave
//
// Copyright 2025 min-pub. All rights reserved.
// This source code or any portion thereof must not be
// reproduced or used without licensed in any manner whatsoever.
//=============================================================================
/*:
 * @target MZ
 * @plugindesc グローバルセーブ
 * @author 四号戦車
 * @base PluginCommonBase
 * @base PluginUtils
 * @orderAfter PluginCommonBase
 * @orderAfter PluginUtils
 * 
 * @param start
 * @text グローバル指定開始
 * @desc 指定開始
 * @type switch
 * @default 0
 *
 * @param end
 * @text グローバル指定終了
 * @desc 指定終了
 * @type switch
 * @default 0
 *
 * @help IM_GlobalSave.js
 *
 * Version: 0.0.1
 *
 * グローバルセーブプラグイン
 * スイッチをグローバル領域にセーブします。
 *
 */
(() => {
	"use strict";

    //========================================================================
    // プラグイン定義
    //========================================================================
    const pluginName = "IM_GlobalSave";
    const script = document.currentScript;
    const param  = PluginManagerEx.createParameter(script);

    //========================================================================
    // 定数定義
    //========================================================================

    //========================================================================
    // コアスクリプト変更部 (DataManager)
    //========================================================================
    const _DataManager_loadGlobalInfo = DataManager.loadGlobalInfo;
    DataManager.loadGlobalInfo = function() {
        StorageManager.loadObject("global")
            .then(globalInfo => {
                this._globalInfo = globalInfo.infos;
                this._globalSwitches = globalInfo.switches;
                this.removeInvalidGlobalInfo();

                if (!!$gameSwitches) {
                    for (let slot = param.start; slot <= param.end; slot++) {
                        $gameSwitches.setValue(slot, this._globalSwitches[slot]);
                    }
                }
                return 0;
            })
            .catch(() => {
                this._globalInfo = [];
            });
    };

    const _DataManager_saveGlobalInfo = DataManager.saveGlobalInfo;
    DataManager.saveGlobalInfo = function() {

        for (let slot = param.start; slot <= param.end; slot++) {
            if (!this._globalSwitches) {
                this._globalSwitches = {};
            }
            this._globalSwitches[slot] = $gameSwitches.value(slot);
        }

        StorageManager.saveObject("global", {
            infos: this._globalInfo,
            switches: this._globalSwitches,
        });
    };

    const _DataManager_extractSaveContents = DataManager.extractSaveContents;
    DataManager.extractSaveContents = function(contents) {
        _DataManager_extractSaveContents.apply(this, arguments);

        for (let slot = param.start; slot <= param.end; slot++) {
            $gameSwitches.setValue(slot, this._globalSwitches[slot]);
        }
    };

    const _DataManager_setupNewGame = DataManager.setupNewGame;
    DataManager.setupNewGame = function() {
        _DataManager_setupNewGame.apply(this, arguments);

        if (!!this._globalSwitches) {
            for (let slot = param.start; slot <= param.end; slot++) {
                $gameSwitches.setValue(slot, this._globalSwitches[slot]);
            }
        }
    };

})();
