//=============================================================================
// RPGツクールMZ - LL_VariableWindow.js v1.0.0
//-----------------------------------------------------------------------------
// ルルの教会 (Lulu's Church)
// https://nine-yusha.com/
//
// URL below for license details.
// https://nine-yusha.com/plugin/
//=============================================================================

/*:
 * @target MZ
 * @plugindesc Display variables on screen using windows.
 * @author Lulu's Church
 * @url https://nine-yusha.com/plugin-variablewindow/
 *
 * @help LL_VariableWindow.js
 *
 * This plugin displays game variables on screen using windows.
 * Up to 4 variable windows can be shown at the same time.
 *
 * Plugin Commands:
 *   Show Window: Display a variable in a window.
 *   Hide Window: Remove a displayed window.
 *
 * Terms of use:
 *   ・No copyright notice required.
 *   ・No report needed for use.
 *   ・Free for commercial and non-commercial.
 *   ・No restriction for adult works.
 *   ・You may modify freely for your game.
 *   ・Redistribution as plugin material (incl. modified) prohibited.
 *
 * Author: Lulu's Church
 * Date: 2022/5/14
 *
 * @command showWindow
 * @text Show Window
 * @desc Display a variable in a window.
 *
 * @arg windowId
 * @text Window ID
 * @desc Choose which window number to use.
 * Up to 4 windows can be displayed at once.
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 *
 * @arg variableId
 * @text Variable
 * @desc The variable to display in the window.
 * @type variable
 *
 * @arg windowX
 * @text X Position
 * @desc X position of the window. Enter "auto" to center.
 * @default 408
 * @type string
 *
 * @arg windowY
 * @text Y Position
 * @desc Y position of the window. Enter "auto" to center.
 * @default 60
 * @type string
 *
 * @arg windowWidth
 * @text Width
 * @desc Width of the window.
 * @default 400
 * @type number
 *
 * @command hideWindow
 * @text Hide Window
 * @desc Hide a previously displayed window.
 *
 * @arg windowId
 * @text Window ID
 * @desc Choose which window number to hide.
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 */

/*:ja
 * @target MZ
 * @plugindesc 変数を画面にウィンドウで表示します。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-variablewindow/
 *
 * @help LL_VariableWindow.js
 *
 * 変数を画面にウィンドウで表示します。
 * ウィンドウは同時に4つまで表示することができます。
 *
 * プラグインコマンド:
 *    ウィンドウを表示: 変数をウィンドウで表示します。
 *    ウィンドウを消去: 表示しているウィンドウを消去します。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/5/14
 *
 * @command showWindow
 * @text ウィンドウを表示
 * @desc 変数の値をウィンドウで表示します。
 *
 * @arg windowId
 * @text ウィンドウ番号
 * @desc どのウィンドウ番号に表示するか選択します。
 * 同時に4つまで表示することが可能です。
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 *
 * @arg variableId
 * @text 変数
 * @desc ウィンドウに表示する変数です。
 * @type variable
 *
 * @arg windowX
 * @text X座標
 * @desc ウィンドウの表示位置(X)です。(autoと入力すると中央表示)
 * @default 408
 * @type string
 *
 * @arg windowY
 * @text Y座標
 * @desc ウィンドウの表示位置(Y)です。(autoと入力すると中央表示)
 * @default 60
 * @type string
 *
 * @arg windowWidth
 * @text 横幅
 * @desc ウィンドウの横幅です。
 * @default 400
 * @type number
 *
 * @command hideWindow
 * @text ウィンドウを消去
 * @desc 表示したウィンドウを消去します。
 *
 * @arg windowId
 * @text ウィンドウ番号
 * @desc どのウィンドウ番号を消去するか選択します。
 * @type select
 * @default 1
 * @option 1
 * @value 1
 * @option 2
 * @value 2
 * @option 3
 * @value 3
 * @option 4
 * @value 4
 */

(function() {
    "use strict";
    var pluginName = "LL_VariableWindow";
    var parameters = PluginManager.parameters(pluginName);


    // 変数名の横幅割合
	const variableWindowLabelWidth = 0.6;

    // ウィンドウを表示
    PluginManager.registerCommand(pluginName, "showWindow", args => {
        const windowId = Number(args.windowId || 1);
        const variableId = Number(args.variableId || 0);
        const x = String(args.windowX || 0);
        const y = String(args.windowY || 0);
        const width = Number(args.windowWidth || 400);

        // 旧セーブデータ対策
        if (!$gameSystem._LL_VariableWindow) {
            $gameSystem._LL_VariableWindow = {};
            $gameSystem._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
        }

        $gameSystem._LL_VariableWindow[windowId] = { variableId: variableId, x: x, y: y, width: width };
    });

    // ウィンドウを消去
    PluginManager.registerCommand(pluginName, "hideWindow", args => {
        const windowId = Number(args.windowId || 1);

        // 旧セーブデータ対策
        if (!$gameSystem._LL_VariableWindow) {
            $gameSystem._LL_VariableWindow = {};
            $gameSystem._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
            $gameSystem._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
        }

        $gameSystem._LL_VariableWindow[windowId] = { variableId: null, x: 0, y: 0, width: 0 };
    });


    //-----------------------------------------------------------------------------
	// Game_System
	//
	// 変数ウィンドウ制御用の独自配列を追加定義します。

	const _Game_System_initialize = Game_System.prototype.initialize;
	Game_System.prototype.initialize = function() {
		_Game_System_initialize.apply(this, arguments);

        this._LL_VariableWindow = {};
        this._LL_VariableWindow[1] = { variableId: null, x: 0, y: 0, width: 0 };
        this._LL_VariableWindow[2] = { variableId: null, x: 0, y: 0, width: 0 };
        this._LL_VariableWindow[3] = { variableId: null, x: 0, y: 0, width: 0 };
        this._LL_VariableWindow[4] = { variableId: null, x: 0, y: 0, width: 0 };
	};


    //-----------------------------------------------------------------------------
    // Scene_Map
    //

    const _Scene_Map_stop = Scene_Map.prototype.stop;
    Scene_Map.prototype.stop = function() {
        this._exVariableWindow1.hide();
        this._exVariableWindow2.hide();
        this._exVariableWindow3.hide();
        this._exVariableWindow4.hide();
        _Scene_Map_stop.apply(this, arguments);
    };

    const _Scene_Map_terminate = Scene_Map.prototype.terminate;
    Scene_Map.prototype.terminate = function() {
        _Scene_Map_terminate.apply(this, arguments);
        if (!SceneManager.isNextScene(Scene_Battle)) {
            this._exVariableWindow1.hide();
            this._exVariableWindow2.hide();
            this._exVariableWindow3.hide();
            this._exVariableWindow4.hide();
        }
    };

    const _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
    Scene_Map.prototype.createAllWindows = function() {
        _Scene_Map_createAllWindows.apply(this, arguments);
        this.createExVariableWindow();
    };

    Scene_Map.prototype.createExVariableWindow = function() {
        this._exVariableWindow1 = new Window_ExVariableWindow();
        this._exVariableWindow1.setWindowId(1);
        this.addWindow(this._exVariableWindow1);
        this._exVariableWindow2 = new Window_ExVariableWindow();
        this._exVariableWindow2.setWindowId(2);
        this.addWindow(this._exVariableWindow2);
        this._exVariableWindow3 = new Window_ExVariableWindow();
        this._exVariableWindow3.setWindowId(3);
        this.addWindow(this._exVariableWindow3);
        this._exVariableWindow4 = new Window_ExVariableWindow();
        this._exVariableWindow4.setWindowId(4);
        this.addWindow(this._exVariableWindow4);
    };

    const _Scene_Map_callMenu = Scene_Map.prototype.callMenu;
    Scene_Map.prototype.callMenu = function() {
        _Scene_Map_callMenu.apply(this, arguments);
        this._exVariableWindow1.hide();
        this._exVariableWindow2.hide();
        this._exVariableWindow3.hide();
        this._exVariableWindow4.hide();
    };

    //-----------------------------------------------------------------------------
    // Window_ExVariableWindow
    //
    // 変数を表示するウィンドウです。

    function Window_ExVariableWindow() {
        this.initialize(...arguments);
    }

    Window_ExVariableWindow.prototype = Object.create(Window_Base.prototype);
    Window_ExVariableWindow.prototype.constructor = Window_ExVariableWindow;

    Window_ExVariableWindow.prototype.initialize = function() {
        const rect = new Rectangle(0, 0, Graphics.boxWidth, Graphics.boxHeight);
        Window_Base.prototype.initialize.call(this, rect);

        this.width = 0;
        this.height = 0;
        this._windowId = null;
    };

    Window_ExVariableWindow.prototype.setWindowId = function(id) {
        this._windowId = id;
    };

    Window_ExVariableWindow.prototype.update = function() {
        Window_Base.prototype.update.call(this);

        this.refresh();
    };

    Window_ExVariableWindow.prototype.windowWidth = function() {
        if ($gameSystem._LL_VariableWindow) {
            return $gameSystem._LL_VariableWindow[this._windowId].width;
        }
        return 400;
    };

    Window_ExVariableWindow.prototype.labelWidth = function() {
        return Math.floor(this.windowWidth() * variableWindowLabelWidth);
    };

    Window_ExVariableWindow.prototype.windowHeight = function() {
        return this.fittingHeight(1);
    };

    Window_ExVariableWindow.prototype.getVariableId = function() {
        if ($gameSystem._LL_VariableWindow) {
            return $gameSystem._LL_VariableWindow[this._windowId].variableId;
        }
        return null;
    };

    Window_ExVariableWindow.prototype.getX = function() {
        if ($gameSystem._LL_VariableWindow) {
            return $gameSystem._LL_VariableWindow[this._windowId].x;
        }
        return 0;
    };

    Window_ExVariableWindow.prototype.getY = function() {
        if ($gameSystem._LL_VariableWindow) {
            return $gameSystem._LL_VariableWindow[this._windowId].y;
        }
        return 0;
    };

    Window_ExVariableWindow.prototype.refresh = function() {
        if (this.getVariableId()) {
            this.width = this.windowWidth();
            this.height = this.windowHeight();
            if (this.getX() === "auto") {
                this.x = (Graphics.boxWidth - this.windowWidth()) / 2;
            } else {
                this.x = Number(this.getX() || 0);
            }
            if (this.getY() === "auto") {
                this.y = (Graphics.boxHeight - this.windowHeight()) / 2;
            } else {
                this.y = Number(this.getY() || 0);
            }

            this.contents.clear();
            this.changeTextColor(this.systemColor());
            this.drawText($dataSystem.variables[this.getVariableId()], this.itemPadding(), 0, this.labelWidth());
            this.resetTextColor();
            this.drawText($gameVariables.value(this.getVariableId()), this.labelWidth() + this.itemPadding(), 0, (this.innerWidth - this.labelWidth() - (this.itemPadding() * 2)), "right");
        } else {
            this.width = 0;
            this.height = 0;
        }
    };
})();
