/*=============================================================================
 PictureNameVariable.js
----------------------------------------------------------------------------
 (C)2021 Triacontane
 This software is released under the MIT License.
 http://opensource.org/licenses/mit-license.php
----------------------------------------------------------------------------
 Version
 1.1.1 2022/12/04 ダウンロードURLが間違っていたので修正
 1.1.0 2021/12/22 制御文字で指定した変数が変更された場合、ピクチャを再読み込みする機能を追加
 1.0.0 2021/06/06 初版
----------------------------------------------------------------------------
 [Blog]   : https://triacontane.blogspot.jp/
 [Twitter]: https://twitter.com/triacontane/
 [GitHub] : https://github.com/triacontane/
=============================================================================*/

/*:
 * @plugindesc ピクチャ名の変数設定プラグイン
 * @target MZ
 * @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/PictureNameVariable.js
 * @base PluginCommonBase
 * @orderAfter PluginCommonBase
 * @author トリアコンタン
 *
 * @command SET_PICTURE_NAME
 * @text ピクチャ名設定
 * @desc ピクチャの表示で使用するファイル名をあらかじめ設定できます。
 *
 * @arg name
 * @text ピクチャ名
 * @desc ピクチャの表示で使用するファイル名を指定します。拡張子不要。制御文字\v[n]を使用できます。
 * @default
 * @type multiline_string
 *
 * @arg scriptUse
 * @text スクリプトとして評価
 * @desc ファイル名を直接指定するのではなく、スクリプトとして評価した結果をファイル名とします。上級者向け。
 * @default false
 * @type boolean
 *
 * @arg realTime
 * @text リアルタイム変更
 * @desc 制御文字で指定した変数が変更されたらピクチャを再読込します。本機能は『スクリプトとして評価』とは両立できません。
 * @default false
 * @type boolean
 *
 * @help PictureNameVariable.js
 *
 * イベントコマンド「ピクチャの表示」で使用するファイルをあらかじめ設定できます。
 * 制御文字\v[n]が使えるので、連番を含むファイル名など動的な指定が可能です。
 * プラグインコマンドを実行後、ピクチャの表示を行ってください。
 *
 * 本プラグインで使用したピクチャは「未使用ファイルを除外する」機能の
 * 対象になる可能性があります。ご注意ください。
 *　
 * このプラグインの利用にはベースプラグイン『PluginCommonBase.js』が必要です。
 * 『PluginCommonBase.js』は、RPGツクールMZのインストールフォルダ配下の
 * 以下のフォルダに格納されています。
 * dlc/BasicResources/plugins/official
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(() => {
    'use strict';
    const script = document.currentScript;

    PluginManagerEx.registerCommand(script, 'SET_PICTURE_NAME', function (args) {
        if (args.realTime) {
            $gameScreen.reservePictureName(args.name, true);
        } else {
            const name = PluginManagerEx.convertEscapeCharacters(args.name);
            $gameScreen.reservePictureName(args.scriptUse ? eval(name) : name);
        }
    });

    Game_Screen.prototype.reservePictureName = function(name, realTime = false) {
        this._reservePictureName = name;
        this._realTimePictureName = realTime;
    };

    const _Game_Screen_showPicture = Game_Screen.prototype.showPicture;
    Game_Screen.prototype.showPicture = function(
        pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode
    ) {
        if (this._reservePictureName) {
            arguments[1] = this._reservePictureName;
            this._reservePictureName = null;
        }
        _Game_Screen_showPicture.apply(this, arguments);
        const picture = this._pictures[this.realPictureId(pictureId)];
        if (this._realTimePictureName) {
            picture.setRealTimeName();
            this._realTimePictureName = false;
        }
    };

    Game_Picture.prototype.setRealTimeName = function() {
        this._realTimeName = true;
        this._originalName = this._name;
    };

    const _Game_Picture_show = Game_Picture.prototype.show;
    Game_Picture.prototype.show = function() {
        _Game_Picture_show.apply(this, arguments);
        this._realTimeName = false;
        this._originalName = '';
    }

    const _Game_Picture_update = Game_Picture.prototype.update;
    Game_Picture.prototype.update = function() {
        _Game_Picture_update.apply(this, arguments);
        if (this._realTimeName) {
            this.updateName();
        }
    };

    Game_Picture.prototype.updateName = function() {
        this._name = PluginManagerEx.convertEscapeCharacters(this._originalName);
    };
})();
