code:
//=============================================================================
// NRP_MessageSpeed.js
//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc v1.04 Changes the message speed.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @url http://newrpg.seesaa.net/article/485101364.html
 *
 * @help Changes the message speed.
 * You can also add an item
 * for changing the message speed in the options.
 *
 * -------------------------------------------------------------------
 * [Usage]
 * -------------------------------------------------------------------
 * Set the "DefaultSpeed" to your preference.
 * 100 is the normal message speed.
 * For example, 150 is 1.5 times the normal speed.
 * If you set a large number such as 99999,
 * instantaneous display is also possible.
 *
 * If you want to add an item to the option screen,
 * please set a numerical value to "OptionPosition".
 * ※In the initial state (blank), the item will be hidden.
 *
 * Also, the value set in "MessageSpeedList" will be displayed
 * as a candidate for the option.
 *
 * -------------------------------------------------------------------
 * [Terms]
 * -------------------------------------------------------------------
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but will deal with defects to the extent possible.
 *
 * @param DefaultSpeed
 * @type number
 * @default 100
 * @desc Set the message speed with 100 as the standard.
 * For example, 150 is 1.5 times the normal speed.
 *
 * @param SpeedVariable
 * @type variable
 * @desc This variable controls the message speed.
 * It takes precedence over "DefaultSpeed" and optional settings.
 *
 * @param DisableShowFastSwitch
 * @type switch
 * @desc Disables instantaneous message display while the switch is on.
 * Always disabled if 0 (none) is specified. Disabled if blank (DEL).
 *
 * @param <Option>
 * @desc Option-related items.
 *
 * @param OptionPosition
 * @parent <Option>
 * @type number
 * @desc The position where the item is inserted into the option screen.
 * 0 for top, blank (DEL) for hidden.
 *
 * @param OptionName
 * @parent <Option>
 * @type string
 * @default Message Speed
 * @desc Set the display name in the option screen.
 *
 * @param MessageSpeedList
 * @parent <Option>
 * @type struct<MessageSpeed>[]
 * @default ["{\"Name\":\"50%\",\"MessageSpeed\":\"50\"}","{\"Name\":\"75%\",\"MessageSpeed\":\"75\"}","{\"Name\":\"100%\",\"MessageSpeed\":\"100\"}","{\"Name\":\"150%\",\"MessageSpeed\":\"150\"}","{\"Name\":\"200%\",\"MessageSpeed\":\"200\"}","{\"Name\":\"Instant\",\"MessageSpeed\":\"99999\"}"]
 * @desc Candidate message speeds that can be selected as options.
 */

/*~struct~MessageSpeed:
 * @param Name
 * @type text
 * @desc The display name of the message speed.
 *
 * @param MessageSpeed
 * @type number
 * @default 100
 * @desc Set the message speed with 100 as the standard.
 * For example, 150 is 1.5 times the normal speed.
 */

/*:ja
 * @target MV MZ
 * @plugindesc v1.04 メッセージ速度を変更します。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @url http://newrpg.seesaa.net/article/485101364.html
 *
 * @help メッセージ速度を変更します。
 * さらに、オプションにメッセージ速度変更用の項目を追加できます。
 *
 * -------------------------------------------------------------------
 * ■使用方法
 * -------------------------------------------------------------------
 * 『標準メッセージ速度』をお好みで設定してください。
 * 100が通常のメッセージ速度です。
 * 例えば、150なら通常の1.5倍速になります。
 * 99999など大きな数字を設定すれば、瞬間表示も可能です。
 *
 * オプション画面へ項目を追加する場合は、
 * 『オプション挿入位置』に数値を設定してください。
 * ※初期状態（空白）では非表示となります。
 *
 * また、『メッセージ速度の候補』に設定した値が、
 * オプションの候補として表示されます。
 *
 * -------------------------------------------------------------------
 * ■利用規約
 * -------------------------------------------------------------------
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @param DefaultSpeed
 * @text 標準メッセージ速度
 * @type number
 * @default 100
 * @desc 100を標準としてメッセージ速度を設定してください。
 * 例えば、150なら通常の1.5倍速となります。
 *
 * @param SpeedVariable
 * @text メッセージ速度変数
 * @type variable
 * @desc メッセージ速度を制御する変数です。
 * 『標準メッセージ速度』やオプション設定より優先されます。
 *
 * @param DisableShowFastSwitch
 * @text 瞬間表示禁止スイッチ
 * @type switch
 * @desc スイッチがオンの間、キー押下時の瞬間表示を禁止します。
 * 0（なし）を指定すると常に禁止。空白（DEL）なら無効。
 *
 * @param <Option>
 * @text ＜オプション関連＞
 * @desc オプション関連の項目です。
 *
 * @param OptionPosition
 * @text オプション挿入位置
 * @parent <Option>
 * @type number
 * @desc オプション画面に挿入する位置です。
 * 0が先頭、空白（DEL）なら非表示。
 *
 * @param OptionName
 * @text オプション表示名
 * @parent <Option>
 * @type string
 * @default メッセージ速度
 * @desc オプション画面での表示名を設定します。
 *
 * @param MessageSpeedList
 * @text メッセージ速度の候補
 * @parent <Option>
 * @type struct<MessageSpeed>[]
 * @default ["{\"Name\":\"50%\",\"MessageSpeed\":\"50\"}","{\"Name\":\"75%\",\"MessageSpeed\":\"75\"}","{\"Name\":\"100%\",\"MessageSpeed\":\"100\"}","{\"Name\":\"150%\",\"MessageSpeed\":\"150\"}","{\"Name\":\"200%\",\"MessageSpeed\":\"200\"}","{\"Name\":\"瞬間\",\"MessageSpeed\":\"99999\"}"]
 * @desc オプションとして選択できるメッセージ速度の候補です。
 */

/*~struct~MessageSpeed:ja
 * @param Name
 * @text 表示名
 * @type text
 * @desc メッセージ速度の表示名です。
 *
 * @param MessageSpeed
 * @text メッセージ速度
 * @type number
 * @default 100
 * @desc 100を標準としてメッセージ速度を設定してください。
 * 例えば、150なら通常の1.5倍速となります。
 */

(function() {
"use strict";

/**
 * ●構造体（二重配列）をJSで扱えるように変換
 */
function parseStruct2(arg) {
    const ret = [];
    if (arg) {
        for (const str of JSON.parse(arg)) {
            ret.push(JSON.parse(str));
        }
    }
    return ret;
}
function toBoolean(str, def) {
    if (str === true || str === "true") {
        return true;
    } else if (str === false || str === "false") {
        return false;
    }
    return def;
}
function toNumber(str, def) {
    if (str == undefined || str == "") {
        return def;
    }
    return isNaN(str) ? def : +(str || def);
}

const PLUGIN_NAME = "NRP_MessageSpeed";
const parameters = PluginManager.parameters(PLUGIN_NAME);
const pDefaultSpeed = toNumber(parameters["DefaultSpeed"], 100);
const pSpeedVariable = toNumber(parameters["SpeedVariable"]);
const pDisableShowFastSwitch = toNumber(parameters["DisableShowFastSwitch"]);
const pOptionPosition = toNumber(parameters["OptionPosition"]);
const pOptionName = parameters["OptionName"];
const pMessageSpeedList = parseStruct2(parameters["MessageSpeedList"]);

// 識別子
const MESSAGE_SPEED_SYMBOL = "messageSpeed";

let mMessageCount = 0;
let mDisableShowFast = false;

/**
 * ●メッセージ開始
 */
const _Window_Message_startMessage = Window_Message.prototype.startMessage;
Window_Message.prototype.startMessage = function() {
    // カウント初期化
    mMessageCount = 0;

    _Window_Message_startMessage.apply(this, arguments);
}

/**
 * ●メッセージの更新
 */
const _Window_Message_updateMessage = Window_Message.prototype.updateMessage;
Window_Message.prototype.updateMessage = function() {
    // メッセージがない場合は終了
    if (!this._textState) {
        return false;
    }

    // 瞬間表示するかどうか？
    mDisableShowFast = isDisabledShowFast();
    // 出力する文字数を蓄積
    mMessageCount += getMessageSpeed() / 100;

    let ret = true;

    // 出力するメッセージがある場合は本来の処理を呼び出し
    if (mMessageCount >= 1) {
        ret = _Window_Message_updateMessage.apply(this, arguments);
    }

    mDisableShowFast = false;
    return ret;
};

/**
 * ●文字出力の停止判定
 * ※本来は瞬間表示時（false）に文字表示を一気に行うための判定。
 * 　当プラグインでは、これを利用して２文字以上の同時表示を行う。
 */
const _Window_Message_shouldBreakHere = Window_Message.prototype.shouldBreakHere;
Window_Message.prototype.shouldBreakHere = function(textState) {
    // 行瞬間表示の場合は停止しない。
    // ※ただし、ウェイト時は除く
    if (!this.isWaiting() && this._lineShowFast) {
        return false;
    }

    // １文字出力したので減算
    mMessageCount--;

    // 追加の出力文字が存在する場合
    if (mMessageCount >= 1 && this.canBreakHere(textState)) {
        // ウェイト命令がある場合は停止
        if (this.isWaiting()) {
            // 出力文字数をクリア
            mMessageCount = 0;
            return true;
        }
        // それ以外は文字表示続行
        return false;
    }

    return _Window_Message_shouldBreakHere.apply(this, arguments);
};

/**
 * ●決定キーによるメッセージの瞬間表示制御
 */
const _Window_Message_updateShowFast = Window_Message.prototype.updateShowFast;
Window_Message.prototype.updateShowFast = function() {
    if (mDisableShowFast && isTriggered()) {
        return;
    }
    _Window_Message_updateShowFast.apply(this, arguments);
};

// ----------------------------------------------------------------------------
// 共通関数
// ----------------------------------------------------------------------------

/**
 * ●メッセージ速度を取得
 */
function getMessageSpeed() {
    // 変数指定がある場合はそちらを優先
    if (pSpeedVariable && $gameVariables.value(pSpeedVariable)) {
        return $gameVariables.value(pSpeedVariable);

    // オプション指定がある場合
    } else if (ConfigManager.messageSpeed) {
        return ConfigManager.messageSpeed;
    }
    // それ以外はデフォルト値を使用
    return pDefaultSpeed;
}

/**
 * ●瞬間表示を禁止するかどうか？
 */
function isDisabledShowFast() {
    // 0なら常に禁止
    if (pDisableShowFastSwitch === 0) {
        return true;
    }
    // それ以外はスイッチがオンの場合のみ禁止
    return $gameSwitches.value(pDisableShowFastSwitch);
};

/**
 * ●Window_Message.prototype.isTriggeredの本来の処理。
 * ※MessageSkip.jsとの併用に対応するため別途定義
 */
function isTriggered() {
    return (
        Input.isRepeated("ok") ||
        Input.isRepeated("cancel") ||
        TouchInput.isRepeated()
    );
};

// ----------------------------------------------------------------------------
// オプション関連
// ----------------------------------------------------------------------------

/**
 * オプションを使用しない場合はここで処理終了
 */
if (pOptionPosition == undefined) {
    return;
}

/**
 * ●オプション候補の最小値
 */
function messageSpeedMin() {
    return toNumber(pMessageSpeedList[0].MessageSpeed);
}

/**
 * ●オプション候補の最大値
 */
function messageSpeedMax() {
    return toNumber(pMessageSpeedList[pMessageSpeedList.length - 1].MessageSpeed);
}

// メッセージ速度の初期値
ConfigManager.messageSpeed = pDefaultSpeed;

/**
 * ●オプション画面の項目生成
 */
const _ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function() {
    const config = _ConfigManager_makeData.apply(this, arguments);

    config.messageSpeed = this.messageSpeed;
    return config;
};

/**
 * ●オプション画面の項目生成
 */
const _ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function(config) {
    _ConfigManager_applyData.apply(this, arguments);

    this.messageSpeed = this.readMessageSpeed(config, MESSAGE_SPEED_SYMBOL);
};

/**
 * 【独自】メッセージ速度をコンフィグから読込
 */
ConfigManager.readMessageSpeed = function(config, name) {
    const value = config[name];
    if (value !== undefined) {
        return Number(value).clamp(messageSpeedMin(), messageSpeedMax());
    } else {
        return pDefaultSpeed;
    }
};

/**
 * ●表示状態取得
 */
const _Window_Options_statusText = Window_Options.prototype.statusText;
Window_Options.prototype.statusText = function(index) {
    const symbol = this.commandSymbol(index);
    const value = this.getConfigValue(symbol);

    if (isMessageSpeedSymbol(symbol)) {
        return messageSpeedStatusText(value);
    }

    return _Window_Options_statusText.apply(this, arguments);
};

/**
 * ●メッセージ速度の表示名
 */
function messageSpeedStatusText(value) {
    const messageSpeed = pMessageSpeedList.find(messageSpeed => messageSpeed.MessageSpeed == value);
    if (messageSpeed) {
        return messageSpeed.Name;
    }
    return "";
}

/**
 * ●決定キー
 */
const _Window_Options_processOk = Window_Options.prototype.processOk;
Window_Options.prototype.processOk = function() {
    const index = this.index();
    const symbol = this.commandSymbol(index);
    const value = this.getConfigValue(symbol);

    if (isMessageSpeedSymbol(symbol)) {
        this.changeMessageSpeedValue(symbol, nextMessageSpeed(value), true);
        return;
    }

    _Window_Options_processOk.apply(this, arguments);
};

/**
 * ●カーソル右
 */
const _Window_Options_cursorRight = Window_Options.prototype.cursorRight;
Window_Options.prototype.cursorRight = function(wrap) {
    const index = this.index();
    const symbol = this.commandSymbol(index);
    const value = this.getConfigValue(symbol);

    if (isMessageSpeedSymbol(symbol)) {
        this.changeMessageSpeedValue(symbol, nextMessageSpeed(value), false);
        return;
    }

    _Window_Options_cursorRight.apply(this, arguments);
};

/**
 * ●カーソル左
 */
const _Window_Options_cursorLeft = Window_Options.prototype.cursorLeft;
Window_Options.prototype.cursorLeft = function(wrap) {
    const index = this.index();
    const symbol = this.commandSymbol(index);
    const value = this.getConfigValue(symbol);

    if (isMessageSpeedSymbol(symbol)) {
        this.changeMessageSpeedValue(symbol, preMessageSpeed(value), false);
        return;
    }

    _Window_Options_cursorLeft.apply(this, arguments);
};

/**
 * 【独自】メッセージ速度の値を変更
 */
Window_Options.prototype.changeMessageSpeedValue = function(symbol, value, wrap) {
    // 現在値が最大の状態で決定を押した場合
    if (wrap && this.getConfigValue(symbol) == messageSpeedMax()) {
        this.changeValue(symbol, messageSpeedMin());
        return;
    }

    value = value.clamp(messageSpeedMin(), messageSpeedMax());
    this.changeValue(symbol, value);
};

/**
 * ●次のメッセージ速度を取得
 */
function nextMessageSpeed(value) {
    let messageSpeed = pMessageSpeedList.find(messageSpeed => messageSpeed.MessageSpeed == value);
    const index = pMessageSpeedList.indexOf(messageSpeed);
    // 次の値を取得できれば返す
    if (pMessageSpeedList[index + 1]) {
        messageSpeed =  toNumber(pMessageSpeedList[index + 1].MessageSpeed);
        return messageSpeed;
    }
    // それ以外は最大値
    return messageSpeedMax();
}

/**
 * ●前のメッセージ速度を取得
 */
function preMessageSpeed(value) {
    let messageSpeed = pMessageSpeedList.find(messageSpeed => messageSpeed.MessageSpeed == value);
    const index = pMessageSpeedList.indexOf(messageSpeed);
    // 前の値を取得できれば返す
    if (pMessageSpeedList[index - 1]) {
        messageSpeed =  toNumber(pMessageSpeedList[index - 1].MessageSpeed);
        return messageSpeed;
    }
    // それ以外は最小値
    return messageSpeedMin();
}

/**
 * ●メッセージ速度の項目追加
 */
const _Window_Options_makeCommandList = Window_Options.prototype.makeCommandList;
Window_Options.prototype.makeCommandList = function() {
    _Window_Options_makeCommandList.apply(this, arguments);

    this._list.splice(pOptionPosition, 0, { name: pOptionName, symbol: MESSAGE_SPEED_SYMBOL, enabled: true, ext: null});

    // Mano_InputConfig.jsとの競合対処
    if (this._gamepadOptionIndex >= pOptionPosition) {
        this._gamepadOptionIndex++;
    }
    if (this._keyboardConfigIndex >= pOptionPosition) {
        this._keyboardConfigIndex++;
    }
};

/**
 * ●設定値を反映
 */
const _Window_Options_setConfigValue = Window_Options.prototype.setConfigValue;
Window_Options.prototype.setConfigValue = function(symbol, volume) {
    _Window_Options_setConfigValue.apply(this, arguments);

    if (isMessageSpeedSymbol(symbol)) {
        // メッセージ速度を反映
        ConfigManager.messageSpeed = volume;
    }
};

/**
 * ●メッセージ速度のオプションか？
 */
function isMessageSpeedSymbol(symbol) {
    if (symbol == MESSAGE_SPEED_SYMBOL) {
        return true;
    }
    return false;
}

/**
 * ●コマンド数を加算
 */
const _Scene_Options_maxCommands = Scene_Options.prototype.maxCommands;
Scene_Options.prototype.maxCommands = function() {
    return _Scene_Options_maxCommands.apply(this, arguments) + 1;
};

})();


code:
//=============================================================================
// NRP_TitleCustomize.js
//=============================================================================
/*:
 * @target MZ
 * @plugindesc v1.00 Customize the title scene.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @orderAfter NRP_N_TitleMap
 * @url https://newrpg.seesaa.net/article/501426741.html
 *
 * @help Customize the title scene.
 *
 * - Change the size of the command window
 * - Enable control characters for commands.
 *   ※Icon and font size changes are enabled.
 * - Do not fade out BGM at the beginning of the game.
 *
 * Note that the placement of the command window can be changed
 * in System 1 of the database.
 *
 * -------------------------------------------------------------------
 * [Terms]
 * -------------------------------------------------------------------
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but will deal with defects to the extent possible.
 *
 * @-----------------------------------------------------
 * @ Plugin Parameters
 * @-----------------------------------------------------
 *
 * @param UseControlCharacter
 * @type boolean
 * @default true
 * @desc Enables control characters in command names.
 * Note that character reduction is disabled.
 *
 * @param TextAlign
 * @type select
 * @option left
 * @option center
 * @default center
 * @desc Command name placement.
 *
 * @param WindowWidth
 * @type number
 * @default 240
 * @desc The width of the title window.
 * The default value is 240.
 *
 * @param WindowLineHeight
 * @type number
 * @desc The height of a single line of the window.
 * If blank, the original setting is used.
 *
 * @param OptionName
 * @type string
 * @desc Optional display name.
 * Can be specified separately from the menu scene.
 *
 * @param NoBgmFadeOut
 * @type boolean
 * @default false
 * @desc Don't fade out the BGM at the start of the game.
 * If you want to take over the title music as it is.
 */

/*:ja
 * @target MZ
 * @plugindesc v1.00 タイトル画面をカスタマイズします。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @orderAfter NRP_N_TitleMap
 * @url https://newrpg.seesaa.net/article/501426741.html
 *
 * @help タイトル画面をカズタマイズします。
 *
 * ・コマンドウィンドウのサイズ調整
 * ・コマンドの制御文字の有効化
 * 　※アイコンやフォントサイズの変更が有効になります。
 * ・ゲーム開始時のＢＧＭをフェードアウトさせない。
 *
 * なお、コマンドウィンドウの配置は、
 * データベースのシステム1で変更できます。
 *
 * -------------------------------------------------------------------
 * ■利用規約
 * -------------------------------------------------------------------
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @-----------------------------------------------------
 * @ プラグインパラメータ
 * @-----------------------------------------------------
 *
 * @param UseControlCharacter
 * @text 制御文字を有効に
 * @type boolean
 * @default true
 * @desc コマンド名に制御文字を有効にします。
 * なお、副作用で文字の縮小が無効になります。
 *
 * @param TextAlign
 * @text 文字の配置
 * @type select
 * @option 左 @value left
 * @option 中央 @value center
 * @default center
 * @desc コマンド名の配置です。
 *
 * @param WindowWidth
 * @text ウィンドウの横幅
 * @type number
 * @default 240
 * @desc タイトルウィンドウの横幅です。
 * 初期値は240です。
 *
 * @param WindowLineHeight
 * @text ウィンドウの一行の幅
 * @type number
 * @desc ウィンドウの一行の縦幅です。
 * 空欄なら元の設定を使用します。
 *
 * @param OptionName
 * @text オプション名
 * @type string
 * @desc オプションの表示名です。
 * メニュー画面とは別に指定できます。
 *
 * @param NoBgmFadeOut
 * @text BGMをフェードアウトしない
 * @type boolean
 * @default false
 * @desc ゲーム開始時にＢＧＭをフェードアウトさせません。
 * タイトル画面の音楽をそのまま引き継ぎたい場合に。
 */

(function() {
"use strict";

/**
 * ●構造体（二重配列）をJSで扱えるように変換
 */
function parseStruct2(arg) {
    var ret = [];

    JSON.parse(arg).forEach(function(str) {
        ret.push(JSON.parse(str));
    });

    return ret;
}
function toBoolean(str, def) {
    if (str === true || str === "true") {
        return true;
    } else if (str === false || str === "false") {
        return false;
    }
    return def;
}
function toNumber(str, def) {
    if (str == undefined || str == "") {
        return def;
    }
    return isNaN(str) ? def : +(str || def);
}
function setDefault(str, def) {
    if (str == undefined || str == "") {
        return def;
    }
    return str;
}

const PLUGIN_NAME = "NRP_TitleCustomize";
const parameters = PluginManager.parameters(PLUGIN_NAME);
const pUseControlCharacter = toBoolean(parameters["UseControlCharacter"], false);
const pTextAlign = setDefault(parameters["TextAlign"], "center");
const pWindowWidth = toNumber(parameters["WindowWidth"]);
const pWindowLineHeight = toNumber(parameters["WindowLineHeight"]);
const pOptionName = setDefault(parameters["OptionName"]);
const pNoBgmFadeOut = toBoolean(parameters["NoBgmFadeOut"], false);

// ----------------------------------------------------------------------------
// Scene_Title
// ----------------------------------------------------------------------------

if (pNoBgmFadeOut) {
    let mNoFadeOut = false;

    /**
     * 【上書】画面＆音声のフェードアウト
     * ※Scene_Base.prototype.fadeOutAllをオーバライド
     */
    const _Scene_Title_fadeOutAll = Scene_Title.prototype.fadeOutAll;
    Scene_Title.prototype.fadeOutAll = function() {
        mNoFadeOut = true;
        _Scene_Title_fadeOutAll.apply(this, arguments);
        mNoFadeOut = false;
    };

    /**
     * ●ＢＧＭのフェードアウト
     */
    const _AudioManager_fadeOutBgm = AudioManager.fadeOutBgm;
    AudioManager.fadeOutBgm = function(duration) {
        // ゲーム開始時はフェードアウトしない。
        if (mNoFadeOut) {
            return;
        }
        _AudioManager_fadeOutBgm.apply(this, arguments);
    };
}

/**
 * 【上書】コマンドウィンドウの横幅
 */
Scene_Title.prototype.mainCommandWidth = function() {
    return eval(pWindowWidth);
};

//-----------------------------------------------------------------------------
// Window_TitleCommand
//-----------------------------------------------------------------------------

if (pUseControlCharacter) {
    /**
     * 【上書】コマンド名の描画
     */
    Window_TitleCommand.prototype.drawItem = function(index) {
        const rect = this.itemLineRect(index);
        const align = this.itemTextAlign();
        this.resetTextColor();
        this.changePaintOpacity(this.isCommandEnabled(index));

        const text = this.commandName(index);
        let x = rect.x;
        // 中央寄せの場合はＸ座標を調整
        if (align !== "left") {
            const textWidth = this.textSizeEx(text).width;
            x += (rect.width - textWidth) / (align === "center" ? 2 : 1);
        }
        this.drawTextEx(text, x, rect.y, rect.width);
    };

    /**
     * 【上書】文字列描画処理
     * ※Window_Base.prototype.drawTextExとほぼ同じだがフォントリセットしない。
     */
    Window_TitleCommand.prototype.drawTextEx = function(text, x, y, width) {
        const textState = this.createTextState(text, x, y, width);
        this.processAllText(textState);
        return textState.outputWidth;
    };
}

/**
 * 【上書】文字の配置
 */
Window_TitleCommand.prototype.itemTextAlign = function() {
    return pTextAlign;
};

if (pOptionName) {
    /**
     * ●コマンドの生成
     */
    const _Window_TitleCommand_makeCommandList = Window_TitleCommand.prototype.makeCommandList;
    Window_TitleCommand.prototype.makeCommandList = function() {
        // オプションの文字列が格納されているＩＤ
        const OPTIONS_ID = 11;

        const keepOptions = $dataSystem.terms.commands[OPTIONS_ID];
        $dataSystem.terms.commands[OPTIONS_ID] = pOptionName;
        _Window_TitleCommand_makeCommandList.apply(this, arguments);
        $dataSystem.terms.commands[OPTIONS_ID] = keepOptions;
    };
}

if (pWindowLineHeight) {
    /**
     * 【上書】項目の縦幅
     */
    Window_TitleCommand.prototype.itemHeight = function() {
        return pWindowLineHeight;
    };

    /**
     * 【上書】ウィンドウの高さ計算
     */
    Scene_Title.prototype.calcWindowHeight = function(numLines, selectable) {
        // Window_TitleCommandを参照するように変更
        return Window_TitleCommand.prototype.fittingHeight(numLines);
    };
}

})();

repo_name: agatutya/country

license: unknown


code:
/*:-----------------------------------------------------------------------------------
 * NUUN_ActorPicture.js
 *
 * Copyright (C) 2021 NUUN
 * This software is released under the MIT License.
 * http://opensource.org/licenses/mit-license.php
 * -------------------------------------------------------------------------------------
 */
 /*:
 * @target MZ
 * @plugindesc Actor Graphics, Face Graphics Display EX
 * @author NUUN
 * @base NUUN_Base
 * @orderAfter NUUN_Base
 * @version 1.7.3
 *
 * @help
 * This is a plugin that processes the display of actor graphics and face graphics images.
 * A compatible plugin is required to display them.
 * Actor graphics and face graphics can be changed automatically depending on the conditions.
 *
 * All conditions match
 * An image will be displayed when all of the All Conditions Matched conditions are met.
 * Conditions that are not set will not be judged and true will be returned.
 * The priority of standing image and facial graphics display is judged from the top, and the first setting whose conditions are met will be applied.
 * Set conditional standing image and facial graphics settings high in the list.
 *
 * Condition setting
 * Set by selecting some part in the change scene.
 *
 * The index numbers of the face graphics are from the top left
 * 0 1 2 3
 * 4 5 6 7
 * 8 9 10 11
 * 12 13 14 15
 *
 * Terms of Use
 * This plugin is distributed under the MIT license.
 *
 * Log
 * 7/27/2021 Ver.1.7.3
 * Fixed an issue where an error would occur if an image was not set.
 * 7/16/2021 Ver.1.7.2
 * Change display in languages other than Japanese to English.
 * 7/15/2021 Ver.1.7.1
 * Fixed an issue where an error would occur when opening certain scenes.。
 * 7/13/2024 Ver.1.7.0
 * Added the ability to specify which classes can be displayed.
 * 3/26/2021 Ver.1.0.0
 * First edition.
 *
 * @param ButlerActors
 * @text Display actor settings
 * @desc Specifies the actor that will display the image.
 * @type struct<ActorButlerList>[]
 * @default []
 *
 */
/*~struct~ActorButlerList:
 *
 * @param ImgName
 * @text Actor Image Name
 * @desc A name to distinguish the actor image.
 * @type string
 * @default
 *
 * @param actorId
 * @text Actor ID
 * @desc Set the actor ID.
 * @type actor
 * @default 0
 *
 * @param ClassId
 * @text Class Id
 * @desc Specifies the class. If a job ID is specified, this takes precedence.
 * @type class
 * @default 0
 *
 * @param ButlerActorImg
 * @text Image settings
 * @desc Set the actor image.
 * @type struct<ActorButlerImgList>[]
 * @default []
 *
 */
/*~struct~ActorButlerImgList:
 *
 * @param GraphicImg
 * @text Actor Image
 * @desc Set the actor image. If multiple images are specified, they will be displayed randomly.
 * @type file[]
 * @dir img/
 *
 * @param FaceImg
 * @text Face graphics image
 * @desc Set the sprite sheet for the face graphic image.
 * @type file
 * @dir img/faces
 *
 * @param FaceIndex
 * @text Face Gra Index ID
 * @desc he index ID of the face graphic.
 * @type number
 * @default -1
 * @min -1
 *
 * @param Opacity
 * @text Image Opacity
 * @desc Specifies the opacity of the image.
 * @type number
 * @default 255
 * @min 0
 * @max 255
 *
 * @param AllMatch
 * @text All conditions match
 * @default ------------------------------
 *
 * @param ImgHP
 * @text Remaining HP
 * @desc Changes when the remaining HP is within the specified range or numerical value.
 * @type struct<CondValue>
 * @default {"CondValid":"false","UpLimit":"0","DwLimit":"0"}
 * @parent AllMatch
 *
 * @param ImgSwitch
 * @text Switch
 * @desc Changes when all the specified switches are ON.
 * @type switch[]
 * @default
 * @parent AllMatch
 *
 * @param ImgWeapon
 * @text Weapon
 * @desc The condition is met when all of the specified weapons are equipped.
 * @type weapon[]
 * @default
 * @parent AllMatch
 *
 * @param ImgArmor
 * @text Armor
 * @desc The condition is met when all of the specified armor is equipped.
 * @type armor[]
 * @default
 * @parent AllMatch
 *
 * @param ImgClass
 * @text Class
 * @desc Certain professions qualify.
 * @type class
 * @default 0
 * @parent AllMatch
 *
 * @param ImgStateAll
 * @text State
 * @desc The condition is met when all of the specified states are applied.
 * @type state[]
 * @default
 * @parent AllMatch
 *
 * @param FilteringClass
 * @text Filtering class settings
 * @desc Window class to apply. If not specified, it will be reflected in all windows. (Multiple specifications are possible)
 * @type combo[]
 * @option 'Scene_Battle'
 * @option 'Scene_Menu'
 * @option 'Scene_Status'
 * @option 'Scene_Formation'
 * @option 'Scene_Equip'
 * @option 'Window_FormationStatus'
 * @option 'Window_ItemMenuActor'
 * @default []
 *
 * @param ChangeGraphicScenes
 * @text Changing scene
 * @desc Select the graphic change scene.
 * @type select
 * @option Default
 * @value 'default'
 * @option Death
 * @value 'death'
 * @option Dying
 * @value 'dying'
 * @option Damage
 * @value 'damage'
 * @option Cridamage
 * @value 'cridamage'
 * @option Recovery
 * @value 'recovery'
 * @option Attack(1)
 * @value 'attack'
 * @option RecoverySkill(1)
 * @value 'recoverySkill'
 * @option UseItem(2)
 * @value 'item'
 * @option Counter
 * @value 'counter'
 * @option Reflection
 * @value 'reflection'
 * @option CounterEX(CounterExtend)(4)
 * @value 'counterEX'
 * @option Guard
 * @value 'guard'
 * @option Chant
 * @value 'chant'
 * @option Victory
 * @value 'victory'
 * @option State(3)
 * @value 'state'
 * @option Command Selection
 * @value 'command'
 * @option Final Attack (1) NUUN_FinalAttack required
 * @value 'finalAttack'
 * @default 'default'
 * @parent AllMatch
 *
 * @param CondSetting
 * @text Condition setting
 * @default ------------------------------
 *
 * @param Skill
 * @text Skill(1)
 * @desc Select a skill. Applies when using any skill. Blank or none applies to all skills.
 * @type skill[]
 * @default
 * @parent CondSetting
 *
 * @param Item
 * @text Item(2)
 * @desc Select an item. Applies when using any item. Blank or None applies to all items.
 * @type item[]
 * @default
 * @parent CondSetting
 *
 * @param stateId
 * @text Received state(3)
 * @desc Select a state. Applies to all states.
 * @type state[]
 * @default
 * @parent CondSetting
 *
 * @param Id
 * @text Identification tag(4)
 * @desc Specifies an identification tag. Applies when all identification tags are applicable.
 * @type string[]
 * @default
 * @parent CondSetting
 *
 */
/*~struct~CondValue:
 *
 * @param CondValid
 * @desc Activate the HP condition.
 * @text HP condition valid
 * @type boolean
 * @default false
 *
 * @param UpLimit
 * @text Upper limit
 * @desc Upper limit.
 * @type number
 * @default 0
 *
 * @param DwLimit
 * @text Lower limit
 * @desc Lower limit.
 * @type number
 * @default 0
 *
 */
 /*:ja
 * @target MZ
 * @plugindesc 立ち絵、顔グラ表示EX
 * @author NUUN
 * @base NUUN_Base
 * @orderAfter NUUN_Base
 * @version 1.7.3
 *
 * @help
 * アクターグラフィック、顔グラ画像を表示する処理を行うプラグインです。
 * 表示されるには対応のプラグインが必要になります。
 * 立ち絵、顔グラは条件により自動的に変化させることができます。
 *
 * 全条件一致
 * 全条件一致の条件がすべて一致したときに画像が表示されます。
 * 設定していない条件は判定されずtrueを返します。
 * 立ち絵、顔グラ表示の優先度は上から判定して最初に条件が一致した設定が適用されます。
 * 条件付きの立ち絵、顔グラ設定はリストの上のほうに設定してください。
 *
 * 条件設定
 * 変化シーンでの一部の選択で設定します。
 *
 * 顔グラのインデックス番号は左上から順に
 * 0 1 2 3
 * 4 5 6 7
 * 8 9 10 11
 * 12 13 14 15
 * となります。
 *
 * このプラグインは「NUUN_Base」が必要です。
 *
 *
 * 利用規約
 * このプラグインはMITライセンスで配布しています。
 *
 * 更新履歴
 * 2024/7/28 Ver.1.7.3
 * 画像が未設定の場合にエラーが出る問題を修正。
 * 2024/7/16 Ver.1.7.2
 * 日本語以外での表示を英語表示に変更。
 * 2024/7/15 Ver.1.7.1
 * 特定のシーンを開くとエラーが出る問題を修正。。
 * 2024/7/13 Ver.1.7.0
 * 表示出来るクラスを指定できる機能を追加。
 * 2023/12/28 Ver.1.6.5
 * 戦闘不能時の画像設定状態が正常に取得されていなかった問題を修正。
 * 一部の処理をバトルスタイル拡張側で処理するように修正。
 * 2023/12/23 Ver.1.6.4
 * 戦闘不能ステートの判定が正常に行われていなかった問題を修正。
 * ステート条件設定に0を指定していると他の条件も一致しなくなる問題を修正。
 * 2023/12/18 Ver.1.6.3
 * 戦闘中の立ち絵で画像が切り替わらない問題を修正。
 * 2023/9/2 Ver.1.6.2
 * 条件を満たしていなくても画像が切り替わってしまう問題を修正。
 * 2023/7/30 Ver.1.6.1
 * 味方の画像切り替えでランダムに表示できる機能を追加。
 * 2023/7/20 Ver.1.6.0
 * アクターIDではなく職業IDで指定できる機能を追加。
 * 2023/6/26 Ver.1.5.5
 * カウンターの画像切り替え処理を修正。
 * 2023/5/22 Ver.1.5.4
 * 条件アクター画像にクリティカルダメージ時の設定を追加。
 * 2023/4/11 Ver.1.5.3
 * CounterExtend(トリアコンタン氏)に対応。
 * 2023/2/26 Ver.1.5.2
 * 通常攻撃の画像が変化しなかった問題を修正。
 * 2023/2/24 Ver 1.5.1
 * 戦闘アニメーションがないスキルを使用後、ステートを付加させると攻撃時の画像が瞬間表示される問題を修正。
 * 2022/8/26 Ver 1.5.0
 * アクター画像変化条件に防御時、反撃時、魔法反射時を追加。
 * 2022/6/19 Ver 1.4.0
 * アクター画像条件にコマンド選択時を追加。
 * アクター画像条件に不透明度を指定できる機能を追加。
 * 全条件一致ステートの条件が機能していなかった問題を修正。
 * 2022/5/7 Ver 1.3.2
 * 条件にステートを指定するとエラーが出る問題を修正。
 * 2022/5/6 Ver 1.3.1
 * スイッチで条件判定するとエラーが出る問題を修正。
 * 2022/4/10 Ver 1.3.0
 * アクター画像設定のスイッチ、武器、防具、ステートの条件に複数指定できるように変更。
 * アクター画像設定に残りHPの条件を追加。
 * アクター画像設定のスキル、アイテム条件が適用されていなかった問題を修正。
 * 2022/3/24 Ver 1.2.5
 * ステート条件が取得できなかった問題を修正。
 * 画像指定の仕様を変更。
 * 2022/1/8 Ver 1.2.4
 * 説明文を修正。
 * ステートによる変化が適用されない問題を修正。
 * 2021/12/15 Ver 1.2.3
 * 一部処理の修正。
 * 2021/12/12 Ver 1.2.2
 * インデックスIDに-1を設定できるように変更。（-1:デフォルトのインデックスID）
 * 2021/12/11 Ver 1.2.1
 * 顔グラのインデックスIDが正常に取得できない問題を修正。
 * 2021/12/11 Ver 1.2.0
 * 立ち絵の設定方法を再度変更。
 * ステータス表示拡張に対応。
 * 2021/7/15 Ver 1.1.1
 * アイテム使用時の画像が取得できなかった問題を修正。
 * 2021/7/12 Ver 1.1.0
 * プラグインパラメータの仕様を大幅に見直し。
 * 戦闘を行うとセーブが出来なくなる問題を修正。
 * 2021/4/20 Ver 1.0.1
 * プラグイン導入後に戦闘を開始するとエラーが出る問題を修正。
 * 2021/3/26 Ver 1.0.0
 * 初版
 *
 * @param ButlerActors
 * @text 表示アクター設定
 * @desc 画像を表示するアクターを指定します。
 * @type struct<ActorButlerList>[]
 * @default []
 *
 */
/*~struct~ActorButlerList:ja
 *
 * @param actorId
 * @text アクターID
 * @desc アクターIDを設定します。
 * @type actor
 * @default 0
 *
 * @param ClassId
 * @text 職業ID
 * @desc 職業を指定します。職業のIDが指定されている場合はこちらが優先されます。
 * @type class
 * @default 0
 *
 * @param ImgName
 * @text アクター画像名称
 * @desc アクター画像を区別するための名称。
 * @type string
 * @default
 *
 * @param ButlerActorImg
 * @text 画像設定
 * @desc 画像を指定します。
 * @type struct<ActorButlerImgList>[]
 * @default []
 *
 */
/*~struct~ActorButlerImgList:ja
 *
 * @param GraphicImg
 * @text アクター画像
 * @desc アクターの画像を設定します。複数指定の場合はランダムに表示されます。
 * @type file[]
 * @dir img/
 *
 * @param FaceImg
 * @text 顔グラ画像
 * @desc 顔グラ画像のスプライトシートを設定します。
 * @type file
 * @dir img/faces
 *
 * @param FaceIndex
 * @text 顔グラのインデックスID
 * @desc 顔グラのインデックスID。
 * @type number
 * @default -1
 * @min -1
 *
 * @param Opacity
 * @text 画像不透明度
 * @desc 画像の不透明度を指定します。（現バージョンではバトルスタイル拡張のみ）
 * @type number
 * @default 255
 * @min 0
 * @max 255
 *
 * @param AllMatch
 * @text 全条件一致
 * @default ------------------------------
 *
 * @param ImgHP
 * @text 残りHP
 * @desc 残りHPが指定の範囲内または数値の時に変化します。
 * @type struct<CondValue>
 * @default {"CondValid":"false","UpLimit":"0","DwLimit":"0"}
 * @parent AllMatch
 *
 * @param ImgSwitch
 * @text スイッチ
 * @desc 指定したスイッチが全てONの時に変化します。
 * @type switch[]
 * @default
 * @parent AllMatch
 *
 * @param ImgWeapon
 * @text 武器
 * @desc 指定した武器を全て装備している時に条件を満たします。
 * @type weapon[]
 * @default
 * @parent AllMatch
 *
 * @param ImgArmor
 * @text 防具
 * @desc 指定した防具を全て装備している時に条件を満たします。
 * @type armor[]
 * @default
 * @parent AllMatch
 *
 * @param ImgClass
 * @text 職業
 * @desc 特定の職業なら条件を満たします。
 * @type class
 * @default 0
 * @parent AllMatch
 *
 * @param ImgStateAll
 * @text ステート
 * @desc 指定したステートに全てかかっている時に条件を満たします。
 * @type state[]
 * @default
 * @parent AllMatch
 *
 * @param FilteringClass
 * @text フィルタリングクラス設定
 * @desc 適用するウィンドウクラスを指定します。無指定の場合は全てのウィンドウで反映されます。(複数指定可)
 * @type combo[]
 * @option 'Scene_Battle'
 * @option 'Scene_Menu'
 * @option 'Scene_Status'
 * @option 'Scene_Formation'
 * @option 'Scene_Equip'
 * @option 'Window_FormationStatus'
 * @option 'Window_ItemMenuActor'
 * @default []
 *
 * @param ChangeGraphicScenes
 * @text 変化シーン
 * @desc グラフィックの変化シーンを選択します。
 * @type select
 * @option 通常
 * @value 'default'
 * @option 戦闘不能
 * @value 'death'
 * @option 瀕死
 * @value 'dying'
 * @option ダメージ時
 * @value 'damage'
 * @option クリティカルダメージ時
 * @value 'cridamage'
 * @option 回復時
 * @value 'recovery'
 * @option 攻撃スキル使用時(1)
 * @value 'attack'
 * @option 回復スキル使用時(1)
 * @value 'recoverySkill'
 * @option アイテム使用時(2)
 * @value 'item'
 * @option 反撃時
 * @value 'counter'
 * @option 魔法反射時
 * @value 'reflection'
 * @option 反撃時(CounterExtend)(4)
 * @value 'counterEX'
 * @option 防御時
 * @value 'guard'
 * @option 詠唱時
 * @value 'chant'
 * @option 勝利時
 * @value 'victory'
 * @option 被ステート(3)
 * @value 'state'
 * @option コマンド選択時
 * @value 'command'
 * @option ファイナルアタック時(1) 要NUUN_FinalAttack
 * @value 'finalAttack'
 * @default 'default'
 * @parent AllMatch
 *
 * @param CondSetting
 * @text 条件設定
 * @default ------------------------------
 *
 * @param Skill
 * @text スキル(1)
 * @desc スキルを選択します。いずれかのスキル使用時に適用します。空白の場合は全てのスキルが対象です。スキルID0は通常攻撃です。
 * @type skill[]
 * @default
 * @parent CondSetting
 *
 * @param Item
 * @text アイテム(2)
 * @desc アイテムを選択します。いずれかのアイテム使用時に適用します。空白の場合は全てのアイテムが対象です。
 * @type item[]
 * @default
 * @parent CondSetting
 *
 * @param stateId
 * @text 被ステート(3)
 * @desc ステートを選択します。全てのステートにかかっている時に適用します。
 * @type state[]
 * @default
 * @parent CondSetting
 *
 * @param Id
 * @text 識別タグ(4)
 * @desc 識別タグを指定します。全ての識別タグが該当しているときに適用します。
 * @type string[]
 * @default
 * @parent CondSetting
 *
 */
/*~struct~CondValue:ja
 *
 * @param CondValid
 * @desc HP条件を有効にします。
 * @text HP条件有効
 * @type boolean
 * @default false
 *
 * @param UpLimit
 * @text 上限値
 * @desc 上限値
 * @type number
 * @default 0
 *
 * @param DwLimit
 * @text 下限値
 * @desc 下限値
 * @type number
 * @default 0
 *
 */

var Imported = Imported || {};
Imported.NUUN_ActorPicture = true;

(() => {
    const params = Nuun_PluginParams.getPluginParams(document.currentScript);
    const parameters = PluginManager.parameters('NUUN_ActorPicture');

    class Nuun_ActorGraphics {
        constructor(_class) {
            this._class = _class;
            this._battler = null;
            this._data = null;
            this._actorImgIndex = -1;
            this._actorGraphicIndex = -1;
            this._actorGraphicOpacity = 255;
            this._actorGraphicName = null;
            this._actorGraphicFace = null;
            this._imgScenes = 'default';
        }

        setup(battler) {
            this._battler = battler;
            this._data = this.getGraphicsData(battler);
            this.update();
        }

        actor() {
            return this._battler;
        }

        update() {
            this.graphicRefresh();
        }

        getActorGraphicName(data) {
            const images = data.GraphicImg;
            if (Array.isArray(images)) {
                if (images.length > 1) {
                    return images[Math.randomInt(images.length)];
                } else {
                    return images[0];
                }
            } else {
                return images;
            }
        }

        getActorFaceName(data) {
            return data && data.FaceImg ? data.FaceImg : this._battler.faceName();
        }

        getGraphicsData(actor) {
            return params.ButlerActors ? params.ButlerActors.find(data => actor && data.actorId === actor.actorId()) || [] : [];
        }

        condActorImg(data, actor) {
            if (data.actorId === actor.actorId() && actor._classId === data.ClassId) {
                return true;
            } else if (data.ClassId === 0 && data.actorId === actor.actorId()) {
                return true;
            } else if (data.actorId === 0 && actor._classId === data.ClassId) {
                return true;
            }
            return false;
        }

        graphicRefresh() {
            if (!this._battler) {
                return;
            }
            let imgIndex = -1;
            let index = -1;
            this._isDeadImg = false;
            this._imgScenes = 'default';
            index = this._data && this._data.ButlerActorImg ? this._data.ButlerActorImg.findIndex(data => this.matchConditions(data)) : -1;
            const oldFileName = this._actorGraphicName;
            const oldFileFace = this._actorGraphicFace;
            if (index >= 0) {
                const data = this._data.ButlerActorImg[index];
                this._actorGraphicName = this.getActorGraphicName(data);
                this._actorGraphicFace = this.getActorFaceName(data);
                imgIndex = this.getActorFaceIndex(data);
                this._isDeadImg = this.isActorGraphicDead(data);
                this._actorGraphicOpacity = data.Opacity || 255;
            } else {
                this._actorGraphicName = null;
                this._actorGraphicFace = this._battler.faceName();
                imgIndex = this._battler.faceIndex();
                this._actorGraphicOpacity = 255;
            }
            this._actorGraphicIndex = index;
            this._actorImgIndex = imgIndex;
            if (oldFileName !== this._actorGraphicName && !!this._actorGraphicName) {
                ImageManager.nuun_LoadPictures(this._actorGraphicName);
            }
            if (oldFileFace !== this._actorGraphicFace && !!this._actorGraphicFace) {
                ImageManager.loadFace(this._actorGraphicFace);
            }
        }

        matchConditions(data) {
            if (data._Class > 0 && !this.filteringClass(data)) {
                return false;
            }
            if (data.ImgHP && data.ImgHP.CondValid && !conditionsParam(data.ImgHP, this._battler.hp, this._battler.param(0))) {
                return false;
            }
            if (data.ImgSwitch && !this.isSwitchImg(data)) {
                return false;
            }
            if (data.ImgWeapon && !this.isWeaponImg(data)) {
                return false;
            }
            if (data.ImgArmor && !this.isArmorImg(data)) {
                return false;
            }
            if (data.ImgStateAll && !this.isStateImg(data, data.ImgStateAll)) {
                return false;
            }
            if (data.ImgClass > 0 && !this.isClassImg(data)) {
                return false;
            }
            if (!this.matchChangeGraphic(data)) {
                return false;
            }
            return true;
        }

        matchChangeGraphic(data) {
            const changeData = data.ChangeGraphicScenes;
            this._imgScenes = changeData;
            switch (changeData) {
                case 'default' :
                    return true;
                case 'finalAttack':
                    return this.isFinalAttack(data.Skill);
                case 'death' :
                    return this.isDead();
                case 'b_appeared' :
                    return !this.isAppeared();
                case 'command' :
                    return this.isInputting();
                case 'dying' :
                    return this.isDying();
                case 'damage' :
                    return this.getImgId(1) || this.getImgId(3);
                case 'cridamage' :
                    return this.getImgId(3);
                case 'recovery' :
                    return this.getImgId(2);
                case 'attack' :
                    return this.getImgId(10) && this.isUseItemImg(data.Skill);
                case 'recoverySkill' :
                    return this.getImgId(11) && this.isUseItemImg(data.Skill);
                case 'item' :
                    return this.getImgId(12) && this.isUseItemImg(data.Item);
                case 'chant' :
                    return this.isChanting();
                case 'victory' :
                    return this.getImgId(20);
                case 'state' :
                    return this.isStateImg(data, data.stateId);
                case 'counter' :
                    return this.isCounter();
                case 'reflection' :
                    return this.isReflection();
                case 'counterEX' :
                    return this.isCounterEX(data);
                case 'guard' :
                    return this.getImgId(15);
            }
        }

        getActorGraphicImg() {
            return this._actorGraphicName;
        }

        getActorGraphicFace() {
            return this._actorGraphicFace || this._battler.faceName();
        }

        getActorGraphicFaceInde() {
            return this._actorImgIndex || this._battler.faceIndex();
        }

        loadActorGraphic() {
            return ImageManager.nuun_LoadPictures(this.getActorGraphicImg());
        }

        loadActorFace() {
            return ImageManager.loadFace(this.getActorGraphicFace());
        }

        isDeadImg() {
            return this._isDeadImg;
        }

        isActorGraphicDead(data) {
            return data && (!!data.ImgStateAll && this.getStateData(data.ImgStateAll)) || data.ChangeGraphicScenes === 'death' || (data.ChangeGraphicScenes === 'state' && (data.stateId && this.getStateData(data.stateId)));
        }

        getStateData(data) {
            return data.some(s => s === this._battler.deathStateId());
        }

        getActorFaceIndex(data) {
            return data && data.FaceIndex >= 0 ? data.FaceIndex : this._battler.faceIndex();
        }

        getImgId(id) {
            return this._battler.onImgId[id];
        }

        isDead() {
            return this._battler.isDead();
        }

        isAppeared() {
            return this._battler.isAppeared();
        }

        isInputting() {
            return this._battler.isInputting();
        }

        isDying() {
            return this._battler.isDying();
        }

        isChanting() {
            return this._battler.isChanting();
        }

        isCounter() {
            return this._battler.result().counterEx;
        }

        isReflection() {
            return this._battler.result().reflectionEx;
        }

        isSwitchImg(data) {
            return data.ImgSwitch.every(id => $gameSwitches.value(id));
        }

        isWeaponImg(data) {
            return data.ImgWeapon.every(id => this._battler.isEquipped($dataWeapons[id]));
        }

        isArmorImg(data) {
            return data.ImgArmor.every(id => this._battler.isEquipped($dataArmors[id]));
        }

        isClassImg(data) {
            return data.ImgClass ? this._battler._classId === data.ImgClass : true;
        }

        isUseItemImg(item) {
            return item && item[0] > 0 ? item.includes(this._battler.nuun_useItemId) : true;
        }

        isStateImg(data, states) {
            return states.every(id => id > 0 ? this._battler.isStateAffected(id) : true);
        }

        filteringClass(data) {
            const className = NuunManager.isFilterClass(this._class);
            if (data.FilteringClass && data.FilteringClass.length > 0) {
                return data.FilteringClass.some(filterClass => filterClass === String(SceneManager._scene.constructor.name) || filterClass === className);
            } else {
                return true;
            }
        }
    }

    window.Nuun_ActorGraphics = Nuun_ActorGraphics;

    function conditionsParam(data, param, maxParam) {
        return (param >= maxParam * data.DwLimit / 100 && (data.UpLimit > 0 ? (param <= maxParam * data.UpLimit / 100) : true));
    };

    function condActorImg(data, actor) {
        if (data.actorId === actor.actorId() && actor._classId === data.ClassId) {
            return true;
        } else if (data.ClassId === 0 && data.actorId === actor.actorId()) {
            return true;
        } else if (data.actorId === 0 && actor._classId === data.ClassId) {
            return true;
        }
        return false;
    };

    function getActorGraphicName(data) {//廃止予定
        const images = data.GraphicImg;
        if (Array.isArray(images)) {
            if (images.length > 1) {
                return images[Math.randomInt(images.length)];
            } else {
                return images[0];
            }
        } else {
            return images;
        }
    }

    NuunManager.getBattlerActors = function() {
        return params.ButlerActors;
    };

    NuunManager.setupClassName = function(className) {
        this._className = className;
    };

    NuunManager.getClassName = function() {
        return this._className;
    };

    const _Game_Actor_initMembers = Game_Actor.prototype.initMembers;
    Game_Actor.prototype.initMembers = function() {
        _Game_Actor_initMembers.call(this);
        this.nuun_useItemId = -1;
        this._onImgId = -1;//廃止予定
        this.onImgId = [];
        this._actorGraphicIndex = -1;
        this._actorGraphicOpacity = 255;
        this._actorGraphicName = null;
        this._actorGraphicFace = null;
        this._imgScenes = 'default';
    };

    Game_Actor.prototype.getActorGraphicList = function() {
        return params.ButlerActors.find(data => condActorImg(data, this));
    };

    Game_Actor.prototype.getActorGraphicIndex = function() {
        return params.ButlerActors.findIndex(data => condActorImg(data, this));
    };

    Game_Actor.prototype.getActorGraphic = function() {
        const imgData = this.getActorGraphicList();
        return imgData ? imgData.ButlerActorImg.find(data => this.matchConditions(data)) : null;
    };

    Game_Actor.prototype.getActorGraphicData = function() {
        const data = this.getActorGraphicList();
        return data ? data.ButlerActorImg[this._actorGraphicIndex] : null;
    };

    Game_Actor.prototype.imgRefresh = function() {
        this.setActorGraphicData();
    };

    Game_Actor.prototype.setActorGraphicData = function() {
        const imgData = this.getActorGraphicList();
        const index = imgData ? imgData.ButlerActorImg.findIndex(data => this.matchConditions(data)) : -1;
        this._actorGraphicIndex = index;
        if (index >= 0) {
            const data = imgData.ButlerActorImg[index];
            this._actorGraphicName = getActorGraphicName(data);
            this._actorGraphicFace = data.FaceImg || this.faceName();
            this._actorImgIndex = data.FaceIndex >= 0 ? data.FaceIndex : this.faceIndex();
            this._actorGraphicOpacity = data.Opacity || 255;
        } else {
            this._actorGraphicName = null;
            this._actorGraphicFace = this.faceName();
            this._actorImgIndex = this.faceIndex();
            this._actorGraphicOpacity = 255;
        }
    };

    Game_Actor.prototype.matchConditions = function(data) {
        if (data._Class && data._Class > 0 && !this.filteringClass(data)) {
            return false;
        }
        if (data.ImgHP && data.ImgHP.CondValid && !conditionsParam(data.ImgHP, this.hp, this.param(0))) {
            return false;
        }
        if (data.ImgSwitch && !this.isCondSwitchImg(data)) {
            return false;
        }
        if (data.ImgWeapon && !this.isCondWeaponImg(data)) {
            return false;
        }
        if (data.ImgArmor && !this.isCondArmorImg(data)) {
            return false;
        }
        if (data.ImgStateAll && !this.isCondStateImg(data, data.ImgStateAll)) {
            return false;
        }
        if (data.ImgClass > 0 && !this.isCondClassImg(data)) {
            return false;
        }
        if (!this.matchChangeGraphic(data)) {
            return false;
        }
        return true;
    };

    Game_Actor.prototype.matchChangeGraphic = function(data) {
        const changeData = data.ChangeGraphicScenes;
        this._imgScenes = changeData;
        switch (changeData) {
          case 'default' :
            return true;
          case 'death' :
            return this.isDead();
          case 'command' :
            return this.isInputting();
          case 'dying' :
            return this.isDying();
          case 'damage' :
              return this._onImgId === 1 || this._onImgId === 3;
          case 'cridamage' :
              return this._onImgId === 3;
          case 'recovery' :
            return this._onImgId === 2;
          case 'attack' :
            return this._onImgId === 10 && this.isCondUseItemImg(data.Skill);
          case 'recoverySkill' :
            return this._onImgId === 11 && this.isCondUseItemImg(data.Skill);
          case 'item' :
            return this._onImgId === 12 && this.isCondUseItemImg(data.Item);
          case 'chant' :
            return this.isChanting();
          case 'victory' :
            return this._onImgId === 20;
          case 'state' :
            return this.isCondStateImg(data, data.stateId);
          case 'counter' :
            return this.result().counterEx;
          case 'reflection' :
            return this.result().reflectionEx;
          case 'counterEX' :
            return this.result().counterExtend && this.isCondUseItemImg(data.Id);
          case 'guard' :
            return this._onImgId === 15;
        }
    };

    Game_Actor.prototype.isCondSwitchImg = function(data) {
        return data.ImgSwitch.every(id => $gameSwitches.value(id));
    };

    Game_Actor.prototype.isCondWeaponImg = function(data) {
        return data.ImgWeapon.every(id => this.isEquipped($dataWeapons[id]));
    };

    Game_Actor.prototype.isCondArmorImg = function(data) {
        return data.ImgArmor.every(id => this.isEquipped($dataArmors[id]));
    };

    Game_Actor.prototype.isCondStateImg = function(data, states) {
        return states.every(id => id > 0 ? this.isStateAffected(id) : true);
    };

    Game_Actor.prototype.isCondClassImg = function(data) {
        return data.ImgClass ? this._classId === data.ImgClass : true;
    };

    Game_Actor.prototype.isCondUseItemImg = function(data) {
        return data ? data.includes(this.nuun_useItemId) : true;
    };

    Game_Actor.prototype.isClassNameImg = function(data) {
        const className = NuunManager.getClassName();
        return data.some(name => className === name);
    };

    Game_Actor.prototype.getActorGraphicImg = function() {
        return this._actorGraphicName;
    };

    Game_Actor.prototype.getActorGraphicFace = function() {
        return this._actorGraphicFace || this.faceName();
    };

    Game_Actor.prototype.getActorGraphicFaceIndex = function() {
        return this._actorImgIndex || this.faceIndex();
    };

    Game_Actor.prototype.getIsActorGraphicImg = function() {
        return !!this._actorGraphicName;
    };

    Game_Actor.prototype.setAttackImgId = function(action) {
        if (action.item().animationId !== 0) {
            this.nuun_useItemId = action.item().id;
            if (action.isRecover()) {
                this._onImgId = 11;
                this._actionBattlerImg = "recovery";
            } else if (action.isAttack() && action.isDamage()) {
                this._onImgId = 10;
                this._actionBattlerImg = "attack";
            } else if (action.isMagicSkill()) {
                this._onImgId = 10;
                this._actionBattlerImg = "attack";
            } else if (action.isSkill() && action.isDamage()) {
                this._onImgId = 10;
                this._actionBattlerImg = "attack";
            } else if (action.isItem()) {
                this._onImgId = 12;
                this._actionBattlerImg = "item";
            } else {
                this._onImgId = 0;
                this._actionBattlerImg = null;
                this.nuun_useItemId = -1;
            }
            this.imgRefresh();
        }
    };

    Game_Actor.prototype.resetImgId = function() {
        this._onImgId = 0;
        this.nuun_useItemId = -1;
        this.imgRefresh();
    };

    Game_Actor.prototype.loadActorGraphic = function() {
        return ImageManager.nuun_LoadPictures(this.getActorGraphicImg());
    };

    Game_Actor.prototype.loadActorFace = function() {
        return ImageManager.loadFace(this.getActorGraphicFace());
    };

    Game_Actor.prototype.isActorGraphicDead = function(data) {
        return data && (data.ImgStateAll && this.getStateData(data.ImgStateAll)) || data.ChangeGraphicScenes === 'death' || (data.ChangeGraphicScenes === 'state' && (data.stateId && this.getStateData(data.stateId)));
    };

    Window_StatusBase.prototype.actorPictureEXDrawFace = function(actor, x, y, width, height) {
        this.drawFace(actor.getActorGraphicFace(), actor.getActorGraphicFaceIndex(), x, y, width, height);
    };

})();


code:
/*:-----------------------------------------------------------------------------------
 * NUUN_Base.js
 *
 * Copyright (C) 2020 NUUN
 * This software is released under the MIT License.
 * http://opensource.org/licenses/mit-license.php
 * -------------------------------------------------------------------------------------
 *
 */
/*:
 * @target MZ
 * @plugindesc  NuuNBasePlugin
 * @author NUUN
 * @version 1.7.8
 *
 * @help
 * This is a base plugin that performs common processing.
 * Place it above the plugin list.
 *
 * Terms of Use
 * This plugin is distributed under the MIT license.
 *
 * Log
 * 6/9/2024 Ver.1.7.8
 * Re-fixed APNG-related processing.
 * 6/8/2024 Ver.1.7.7
 * Fixes for APNG related processing.
 * 5/25/2024 Ver.1.7.6
 * Fixed some processing.
 * 5/20/2024 Ver.1.7.5
 * Add processing.
 * 5/11/2024 Ver.1.7.4
 * Modified to accommodate the diversity of acquisition parameters.
 * 5/4/2024 Ver.1.7.3
 * Corrected display of MV type gauge.
 * 5/3/2024 Ver.1.7.2
 * Added MV specification gauge processing.
 * Fixed some processing.
 * 3/17/2024 Ver.1.7.1
 * Added font handling for numbers and units.
 * 1/6/2023 Ver.1.7.0
 * Added plugin parameter acquisition processing. Newly released plug-ins after 2024 will be compatible with Ver.1.7.0 or later.
 * 7/1/2023 Ver.1.6.9
 * Added attack element processing.
 * 6/2/2023 Ver.1.6.8
 * Fixed processing related to overlay plugins.
 * 4/16/2023 Ver.1.6.7
 * Fixed filtering class handling.
 * 4/10/2023 Ver.1.6.6
 * Fixed filtering class handling.
 * 4/10/2023 Ver.1.6.5
 * Added filtering class handling.
 * 3/15/2023 Ver.1.6.4
 * Added error prevention processing for String input.
 * Added error proofing for eval input.
 * 2/7/2023 Ver.1.6.3
 * Added processing to call events with plugin commands.
 * 12/30/2022 Ver.1.6.2
 * Added exception handling when image could not be loaded.
 * Added content background processing definition.
 * 12/21/2022 Ver.1.6.1
 * Added definition of processing to add enemy use skills.
 * 11/13/2022 Ver.1.6.0
 * Added processing to display APNG.
 * 11/9/2022 Ver.1.5.2
 * Changed the display in languages other than Japanese to English.
 * 7/29/2022 Ver.1.5.1
 * Added processing to specify the range.
 * 7/23/2022 Ver.1.5.0
 * 'NuunManager' also defines the process for specifying the range.
 * 6/15/2022 Ver.1.4.5
 * Fixed the problem that 'NaN' is displayed when entering a string.
 * 5/24/2022 Ver.1.4.4
 * Added processing to set sprite filtering window.
 * 2/12/2022 Ver.1.4.3
 * Fixed an issue where some variable names were wrong.
 * 1/12/2022 Ver.1.4.2
 * Added processing to apply enemy MP gauge and enemy TP gauge.
 * 1/9/2022 Ver.1.4.1
 * Added processing to round the decimal point.
 * 1/8/2022 Ver.1.4.0
 * Added color index acquisition process.
 * 12/12/2021 Ver.1.3.2
 * Added processing for applying enemy state display enhancements.
 * 11/7/2021 Ver.1.3.1
 * Added processing related to multiple attribute acquisition.
 * 8/22/2021 Ver.1.3.0
 * Added processing to 'Window_ItemList'.
 * 7/15/2021 Ver.1.2.0
 * Added common processing for gauges and name display plug-ins.
 * 5/15/2021 Ver.1.1.4
 * Added a process that can set the window skin for each window.
 * 5/8/2021 Ver.1.1.3
 * Fixed some processing.
 * 5/7/2021 Ver.1.1.2
 * Added structure acquisition processing.
 * 4/23/2021 Ver.1.1.1
 * Added processing for specifying a folder for images.
 * 3/14/2021 Ver.1.1.0
 * Added processing for specifying a folder for images.
 * 12/31/2020 Ver.1.0.0
 * first edition
 *
 */
/*:ja
 * @target MZ
 * @plugindesc  共通処理
 * @author NUUN
 * @version 1.7.8
 *
 * @help
 * 共通処理を行うベースプラグインです。
 * プラグインリストの上に配置してください。
 *
 * 利用規約
 * このプラグインはMITライセンスで配布しています。
 *
 * 更新履歴
 * 2024/6/9 Ver.1.7.8
 * APNG関連の処理の再修正。
 * 2024/6/8 Ver.1.7.7
 * APNG関連の処理の修正。
 * 2024/5/25 Ver.1.7.6
 * 一部の処理を修正。
 * 2024/5/20 Ver.1.7.5
 * 処理の追加。
 * 2024/5/11 Ver.1.7.4
 * 取得パラメータの多様性に対応できるように修正。
 * 2024/5/4 Ver.1.7.3
 * MV式ゲージを表示を修正。
 * 2024/5/3 Ver.1.7.2
 * MV仕様のゲージ処理追加。
 * 一部処理の修正。
 * 2024/3/17 Ver.1.7.1
 * 数値と単位のフォント処理の追加。
 * 2024/1/6 Ver.1.7.0
 * プラグインのパラメータ取得処理の処理を追加。2024年以降の新規公開プラグインはVer.1.7.0以降の対応になります。
 * 2023/7/1 Ver.1.6.9
 * 攻撃属性の処理追加。
 * 2023/6/2 Ver.1.6.8
 * オーバレイプラグイン関連の処理の修正。
 * 2023/4/16 Ver.1.6.7
 * フィルタリングクラスの処理を修正。
 * 2023/4/10 Ver.1.6.6
 * フィルタリングクラスの処理を修正。
 * 2023/4/10 Ver.1.6.5
 * フィルタリングクラスの処理を追加。
 * 2023/3/15 Ver.1.6.4
 * string入力のエラー防止処理を追加。
 * eval入力のエラー防止処理を追加。
 * 2023/2/7 Ver.1.6.3
 * プラグインコマンドでイベントを呼び出すための処理の追加。
 * 2022/12/30 Ver.1.6.2
 * 画像が読み込めなかったときの例外処理を追加。
 * コンテンツ背景処理の定義を追加。
 * 2022/12/21 Ver.1.6.1
 * 敵の使用スキルの追加する処理の定義を追加。
 * 2022/11/13 Ver.1.6.0
 * APNGを表示するための処理を追加。
 * 2022/11/9 Ver.1.5.2
 * 日本語以外での表示を英語表示に変更。
 * 2022/7/29 Ver.1.5.1
 * -を元に配列を返す処理をNuunManagerでも定義。
 * 2022/7/23 Ver.1.5.0
 * -を元に配列を返す処理を追加。
 * 2022/7/23 Ver.1.4.5 2022/6/15 Ver.1.4.5
 * 文字列を記入したときにNaNと表示されてしまう問題を修正。
 * 2022/7/23 Ver.1.4.4 2022/5/24 Ver.1.4.4
 * スプライトのフィルタリングウィンドウを設定する処理を追加。
 * 2022/7/2 Ver.1.4.3 2022/2/12 Ver.1.4.3
 * 一部変数名が間違っていた問題を修正。
 * 2022/7/1 Ver.1.4.2 2022/1/12 Ver.1.4.2
 * 敵MPゲージ、敵TPゲージのゲージ適用するための処理の追加。
 * 2022/7/1 Ver.1.4.1 2022/1/9 Ver.1.4.1
 * 小数点を丸める処理を追加。
 * 2022/8/1 Ver.1.4.0 2022/1/8 Ver.1.4.0
 * カラーインデックス取得処理を追加。
 * 2021/12/12 Ver.1.3.2
 * 敵ステート表示拡張を適用するための処理を追加。
 * 2021/11/7 Ver.1.3.1
 * 複数属性取得に関しての処理追加。
 * 2021/8/22 Ver.1.3.0
 * Window_ItemListに処理を追加。
 * 2021/7/15 Ver.1.2.0
 * ゲージ、名前表示関連プラグインの共通処理を追加。
 * 2021/5/15 Ver.1.1.4
 * ウィンドウスキンをウィンドウ毎に設定できる処理を追加。
 * 2021/5/8 Ver.1.1.3
 * 処理を一部修正。
 * 2021/5/7 Ver.1.1.2
 * 構造体の取得処理を追加。
 * 2021/4/23 Ver.1.1.1
 * 画像のフォルダー指定の処理を追加。
 * 2021/3/14 Ver.1.1.0
 * 画像のフォルダー指定の処理を追加。
 * 2020/12/31 Ver.1.0.0
 * 初版
 *
 */
var Imported = Imported || {};
Imported.NUUN_Base = true;
const NUUN_Base_Ver = 140;

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

Sprite_NuunAPngImg.prototype = Object.create(Sprite.prototype);
Sprite_NuunAPngImg.prototype.constructor = Sprite_NuunAPngImg;

(() => {
const parameters = PluginManager.parameters('NUUN_Base');

class Nuun_PluginParams {
    static getPluginParams(text) {//document.currentScript
        const name = String(Utils.extractFileName(text.src).split('.').shift());
        const params = PluginManager.parameters(name);
        if (params) {
            const pluginParam = new Nuun_PluginParamData(params);
            return pluginParam.getParameters();
        }
        return {};
    }
};

window.Nuun_PluginParams = Nuun_PluginParams;

class Nuun_PluginParamData {
    constructor(text) {
        this._parameters = JSON.parse(JSON.stringify(text, this._convertParams));
    }

    _convertParams(key, code) {
        try {
            return JSON.parse(code);
        } catch (e) {
            if (isNaN(code)) {
                if (!code) {
                    return null;
                }
                try {
                    if (code.indexOf("'") === 0 || code.indexOf('"' === 0)) {
                        return eval(code);//'または"を外す。
                    }
                    return !!code ? String(code) : null;
                } catch (e) {
                    if (typeof {} === "object") {
                        return code;
                    }
                    return !!code ? String(code) : null;
                }
            } else {
                return String(code);
            }
        }
    }

    getParameters() {
        return this._parameters;
    }

    getMetaTag(object, code) {
        const data = object.meta[code];
        let list = [];
        if (data !== undefined) {
            try {
                list = data.split(',');
            } catch (error) {
                return this.getTextCodeMeta(data);
            }
            list.forEach(a => {
                a = this.getTextCodeMeta(a);
            });
            return list;
        } else {
            return undefined;
        }
    }

    getTextCodeMeta(text) {
        if (isNaN(text)) {
            return text;
        } else {
            return Number(text);
        }
    }
};

class Nuun_TempParam {
    constructor() {
        this._data = null;
        this._exParams = null;
    }

    setGaugeData(data, type, exParams) {
        this._data = data;
        this._type = type;
        this._exParams = exParams;
    }

    setType(type) {
        this._type = type;
    }

    setData(data, exParams) {
        this._data = data;
        this._exParams = exParams;
    }

    getType() {
        return this._type || '';
    }

    getData() {
        return this._data;
    }

    getExParams() {
        return this._exParams;
    }

    clear() {
        this._data = null;
        this._type = "";
        this._exParams = null;
    }
};
window.Nuun_TempParam = Nuun_TempParam;

function structureData(params) {
    return JSON.parse(JSON.stringify(params, function(key, value) {
        try {
            return JSON.parse(value);
        } catch (e) {
            return NuunManager.getEvalCode(value);
        }
    }));
};

function stringCode(code) {
    try {
        if (code.indexOf("'") === 0 || code.indexOf('"' === 0)) {
            return eval(code);//'または"を外す。
        }
        return !!code ? String(code) : null;
    } catch (e) {
        return code;
    }
};

function nuun_GausePlugins() {
    return (
        Imported.NUUN_ButlerHPGauge || Imported.NUUN_EnemyMPGauge || Imported.NUUN_EnemyTPGauge || Imported.NUUN_ButlerName || Imported.NUUN_EnemyTpbGauge || Imported.NUUN_EnemyStateIconEX ||
        Imported.NUUN_BattlerMPGauge || Imported.NUUN_BattlerTPGauge || Imported.NUUN_BattlerTpbGauge
    )
}

function getDataSystemColor(data) {
    if (!!data.SystemNameColor) {
        return data.SystemNameColor;
    } else if (!!data.NameColor) {
        return data.NameColor;
    }
};

function getDataUnit(data) {
    if (!!data.paramUnit) {
        return data.paramUnit;
    }
};

function NuunManager() {
    throw new Error("This is a static class");
}

window.NuunManager = NuunManager;

NuunManager.isFilterClass = function(_class) {
    if (!!_class._classNameId) {
        return _class._classNameId;
    } else if (_class._data && _class._data.Id) {
        return _class._data.Id;
    } else {
        return String(_class.constructor.name);
    }
};

NuunManager.getColorCode = function(color) {
  if (typeof(color) === "string") {
    return color;
  }
  return ColorManager.textColor(color);
};

NuunManager.numPercentage = function(num, digits, mode) {
  if (isNaN(num)) { return num }
  return (mode ? Math.round(num * Math.pow(10, digits + 2)) : Math.floor(num * Math.pow(10, digits + 2))) / Math.pow(10, digits + 2);
};

NuunManager.nuun_getListIdData = function(id) {
  let newId = [];
  if (id.includes('-')) {
    const data = id.split('-').map(Number);
    for (let i = data[0]; i <= data[1]; i++) {
      Array.prototype.push.apply(newId, [i]);
    }
    return newId;
  } else {
    return [Number(id)];
  }
};

NuunManager.getStringCode = function(code) {
    if (!code) {
        return null;
    }
    return stringCode(code);
};

NuunManager.getEvalCode = function(code) {
    if (isNaN(code)) {
        if (!code) {
            return null;
        }
        return stringCode(code);
    } else {
        return String(code);
    }
};

NuunManager.stringCodeSplit = function(code, mode) {
    const list = code.split(',');
    for (let data of list) {
        if (code.indexOf("[") === 0) {
            data = data.slice(1, 2);
        }
    }
    return mode ? list.map(Number) : list;
};

NuunManager.setMainFontFace = function(font) {
    this._mainFontFace = font ? font : null;
};

NuunManager.setNumberFontFace = function(font) {
    this._numberFontFace = font ? font : null;
};

NuunManager.resetFontFace = function() {
    this._mainFontFace = null;
    this._numberFontFace = null;
};

NuunManager.mainFontFace = function() {
    return this._mainFontFace || $gameSystem.mainFontFace();
};

NuunManager.numberFontFace = function() {
    return this._numberFontFace || $gameSystem.numberFontFace();
};

NuunManager.isFontFace = function() {
    return !!this._mainFontFace || !!this._numberFontFace;
};

const _Game_Interpreter_command357 = Game_Interpreter.prototype.command357;
Game_Interpreter.prototype.command357 = function(params) {
    PluginManager.setNuunEventData(this._eventId);
    return _Game_Interpreter_command357.call(this, params);
};

PluginManager.setNuunEventData = function(eventId) {
    this.nuunEvent = $gameMap ? $gameMap._events[eventId] : null;
};

DataManager.nuun_structureData = function(params){
  return params ? structureData(params) : [];
};

const _Scene_Boot_onDatabaseLoaded = Scene_Boot.prototype.onDatabaseLoaded;
Scene_Boot.prototype.onDatabaseLoaded = function() {
  _Scene_Boot_onDatabaseLoaded.call(this);
  DataManager.nuun_Data();
};

DataManager.nuun_Data = function(){
  DataManager.nuun_DataObject($dataActors, 1);
  DataManager.nuun_DataObject($dataEnemies, 7);
};

DataManager.nuun_DataObject = function(object, code){
  for(let i = 1; i <= object.length; i++){
    if (object[i]) {
      if(code === 1) {
        DataManager.nuun_loadDataActors(object[i]);
      } else if (code === 7) {
        DataManager.nuun_loadDataEnemies(object[i]);
      }
    }
  }
};

DataManager.nuun_loadDataActors = function(deta){
};

DataManager.nuun_loadDataEnemies = function(deta){
};

ImageManager.nuun_backGround = function(filename) {
  return this.loadBitmap("img/nuun_background/", filename);
};

ImageManager.nuun_actorPictures = function(filename) {
  return this.loadBitmap("img/nuun_actorpictures/", filename);
};

ImageManager.nuun_LoadPictures = function(filename) {
  const bitmap = this.loadBitmap("img/", filename);
  bitmap.nuun_LoadBitmap = true;
  return bitmap;
};

const _ImageManager_throwLoadError = ImageManager.throwLoadError;
ImageManager.throwLoadError = function(bitmap) {
  if (bitmap.nuun_LoadBitmap) {
    try {
      _ImageManager_throwLoadError.call(this, bitmap);
    } catch (e) {

    }
  } else {
    _ImageManager_throwLoadError.call(this, bitmap);
  }
};

const _Bitmap_isReady = Bitmap.prototype.isReady;
Bitmap.prototype.isReady = function() {
  if (this.nuun_LoadBitmap && this.isError()) {
    this._loadingState = "none";
  }
  return _Bitmap_isReady.call(this);
};

Bitmap.prototype.nuun_contentsBackBlt = function(source, sx, sy, sw, sh, dx, dy, dw, dh, pscale, mode) {
  let scale = pscale / 100;
  let scale2 = 100 / pscale;
  const scaleMode = source.width * scale < dw || source.height * scale < dh;
  if (scaleMode) {
    scale = 1.0;
    scale2 = Math.max(dw / source.width, dh / source.height);
  }
  const width = (scaleMode  ? source.width : sw * scale2);
  const height = (scaleMode ? source.height : sh) * scale2;
  const x = Math.floor((!mode && scaleMode ? 0 : (dw - source.width) / 2 * -1 * scale));
  const y = Math.floor((!mode ? 0 : (scaleMode ? (dh - source.height) / 2 * -1 * scale2 : (dh - source.height) / 2 * -1 * scale)));
  this.blt(source, x + sx, y + sy, width, height, dx, dy, dw, dh);
};

const _BattleManager_initMembers = BattleManager.initMembers;
BattleManager.initMembers = function() {
  _BattleManager_initMembers.call(this);
  this.gaugeBaseSprite = null;
};

const _Window_Base_resetFontSettings = Window_Base.prototype.resetFontSettings;
Window_Base.prototype.resetFontSettings = function() {
    _Window_Base_resetFontSettings.call(this);
    NuunManager.resetFontFace();
};

Window_Base.prototype.nuun_DrawActorGauge = function(text, x, y, width, param, maxParam, color1, color2, sColor = ColorManager.systemColor(), status) {
    this.changeTextColor(sColor);
    this.nuun_setFontFace();
    this.contents.fontSize = $gameSystem.mainFontSize() - 2;
    this.nuun_DrawGauge(x, y, width, param / maxParam, color1, color2, status);
    this.drawText(text, x, y + 11, width, "left");
    this.resetTextColor();
    this.nuun_setValueFontFace();
    this.contents.fontSize = $gameSystem.mainFontSize() - 6;
    this.drawText(param, x, y + 8, width, "right");
};

Window_Base.prototype.nuun_DrawGauge = function(x, y, width, rate, color1, color2, status) {
    const labelWidth = status === "time" ? 0 : this.nuun_LabelWidth() + 6;
    const gaugeX = x + labelWidth;
    const gaugeY = y + this.lineHeight() - 10;
    width -= labelWidth;
    const fillW = Math.floor((width - 2) * rate);
    const fillH = 10;
    this.contents.fillRect(gaugeX, gaugeY, width, 12, ColorManager.gaugeBackColor());
    this.contents.gradientFillRect(gaugeX + 1, gaugeY + 1, fillW, fillH, color1, color2);
};

Window_Base.prototype.nuun_gaugeX = function(statusType) {
    if (statusType === "time") {
        return 0;
    } else {
        return this.nuun_LabelWidth() + 6;
    }
};

Window_Base.prototype.nuun_LabelWidth = function() {
    const labels = [TextManager.hpA, TextManager.mpA, TextManager.tpA];
    const widths = labels.map(str => this.textWidth(str));
    return Math.ceil(Math.max(...widths));
};

Window_Base.prototype.nuun_DrawContentsParamUnitText = function(text, data, x, y, width, unit) {
    const padding = this.itemPadding();
    unit = getDataUnit(data) || unit;
    const unitWidth = unit ? this.textWidth(unit) + padding : 0;
    if (NuunManager.isFontFace()) {
        isNaN(text) ? this.nuun_setFontFace() : this.nuun_setValueFontFace();
    }
    this.drawText(text, x, y, width - unitWidth, (data.Align || 'right'));
    if (unit) {
        this.changeTextColor(NuunManager.getColorCode(getDataSystemColor(data)));
        this.nuun_setFontFace();
        const textWidth = Math.min(this.textWidth(text), width - unitWidth);
        if (data.Align === 'left') {
            this.drawText(unit, x + textWidth + padding, y, width);
        } else if (data.Align === 'right') {
            this.drawText(unit, x + width - unitWidth + padding, y, width);
        } else if (data.Align === 'center') {
            this.drawText(unit, x + Math.floor(width / 2) + Math.floor(textWidth / 2) - padding, y, width);
        } else {
            this.drawText(unit, x + width - unitWidth + padding, y, width);
        }
    }
};

Window_Base.prototype.nuun_setFontFace = function() {
    this.contents.fontFace = NuunManager.mainFontFace();
};

Window_Base.prototype.nuun_setValueFontFace = function() {
    this.contents.fontFace = NuunManager.numberFontFace();
};

const _Window_Base_drawCurrencyValue = Window_Base.prototype.drawCurrencyValue;
Window_Base.prototype.drawCurrencyValue = function(value, unit, x, y, width) {
    if (NuunManager.isFontFace()) {
        const unitWidth = Math.min(80, this.textWidth(unit));
        this.nuun_setValueFontFace();
        this.resetTextColor();
        this.drawText(value, x, y, width - unitWidth - 6, "right");
        this.changeTextColor(ColorManager.systemColor());
        this.nuun_setFontFace();
        this.drawText(unit, x + width - unitWidth, y, unitWidth, "right");
    } else {
        _Window_Base_drawCurrencyValue.call(this, value, unit, x, y, width);
    }
};

const _Window_addInnerChild = Window.prototype.addInnerChild;
Window.prototype.addInnerChild = function(child) {
    child.className = NuunManager.isFilterClass(this);
    return _Window_addInnerChild.call(this, child);
};

const _Window_Selectable_drawItemBackground = Window_Selectable.prototype.drawItemBackground;
Window_Selectable.prototype.drawItemBackground = function(index) {
  if (!this._contentsBackVisible) {
    _Window_Selectable_drawItemBackground.call(this, index);
  }
};

const _Window_Base_initialize = Window_Base.prototype.initialize;
Window_Base.prototype.initialize = function(rect) {
    _Window_Base_initialize.call(this, rect);
    this.createContentsExSprite();
    this._userWindowSkin = null;
};

Window_Base.prototype.createContentsExSprite = function() {
    this._contentsExSprite = new Sprite()
    const index = this._clientArea.children.indexOf(this._contentsSprite);
    this._clientArea.addChildAt(this._contentsExSprite, index);
};

const _Window_Base_loadWindowskin = Window_Base.prototype.loadWindowskin;
Window_Base.prototype.loadWindowskin = function() {
    if (this._userWindowSkin) {
        this.windowskin = ImageManager.loadSystem(this._userWindowSkin);
    } else {
        _Window_Base_loadWindowskin.call(this);
    }
};

Window_Base.prototype.nuun_addClientAreaSprite = function(sprite) {
    this._contentsExSprite.addChild(sprite);
};

Window_Base.prototype.nuun_getListIdData = function(id) {
    let newId = [];
    if (id.includes('-')) {
        const data = id.split('-').map(Number);
        for (let i = data[0]; i <= data[1]; i++) {
        Array.prototype.push.apply(newId, [i]);
        }
        return newId;
    } else {
        return [Number(id)];
    }
};

const _Spriteset_Battle_createLowerLayer = Spriteset_Battle.prototype.createLowerLayer;
Spriteset_Battle.prototype.createLowerLayer = function() {
    _Spriteset_Battle_createLowerLayer.call(this);
    if (nuun_GausePlugins()) {
        this.createGaugeBase();
    }
};

Spriteset_Battle.prototype.createGaugeBase = function() {
  if (!this._battlerGaugeBase) {
    const sprite = new Sprite();
    this.addChild(sprite);
    this._battlerGaugeBase = sprite;
    BattleManager.gaugeBaseSprite = sprite;
  }
};

const _Spriteset_Battle_update = Spriteset_Battle.prototype.update;
Spriteset_Battle.prototype.update = function() {
    _Spriteset_Battle_update.call(this);
    this.updateBattlerGauge();
};

Spriteset_Battle.prototype.updateBattlerGauge = function() {
  if (this._battlerGaugeBase) {
    for (const sprite of this._battlerGaugeBase.children) {
      const spriteData = this._enemySprites.some(enemy => enemy.spriteId === sprite.enemySpriteId);
      if (!spriteData) {
        this._battlerGaugeBase.removeChild(sprite);
      }
    }
  }
};

const _Window_ItemList_initialize  = Window_ItemList.prototype.initialize;
Window_ItemList.prototype.initialize = function(rect) {
  _Window_ItemList_initialize.call(this, rect);
  this._className = NuunManager.isFilterClass(this);
};

Window_ItemList.prototype.isConstructor = function() {
  return false;
};

const _Game_Action_clear = Game_Action.prototype.clear;
Game_Action.prototype.clear = function() {
    _Game_Action_clear.call(this);
    this._multiElements = [];
};
//以下2つは新バージョンでは必要なし。
Game_Action.prototype.getAttackElementsList = function() {
  return Imported.NUUN_MultiElement ? this.getAttackElements() : this.subject().attackElements();
};

Game_Action.prototype.getItemElementsList = function() {
  return Imported.NUUN_MultiElement ? this.getItemElements() : [this.item().damage.elementId];
};

Sprite_NuunAPngImg.prototype.initialize = function() {
  Sprite.prototype.initialize.call(this);
  this.initMembers();
};

Sprite_NuunAPngImg.prototype.initMembers = function() {
  this._battler = null;
  this._apngMode = null;
  this._data = null;
  this._pictureName = null;
};

Sprite_NuunAPngImg.prototype.setup = function(battler, data, name, mode) {
    this._battler = battler;
    this._data = data;
    this._pictureName = name.split('pictures/')[1];
    this._actorPictureEXApp = mode;
    this.refresh();
};

Sprite_NuunAPngImg.prototype.refresh = function() {
    if (this.addApngChild && this.loadApngSprite(this._pictureName)) {
        this.addApngChild(this._pictureName);
        this._apngMode = true;
    }
};

Sprite_NuunAPngImg.prototype.destroy = function() {
  this.resetApngImg();
  Sprite.prototype.destroy.call(this);
};

Sprite_NuunAPngImg.prototype.resetApngImg = function() {
  this._battler = null;
  if (this._apngMode) {
      this.destroyApngIfNeed();
      this._apngMode = null;
  }
};

Sprite_NuunAPngImg.prototype.isActorPictureEXApp = function() {
    return this._actorPictureEXApp;
};

Sprite_NuunAPngImg.prototype.loadApngSprite = function(name) {
    return Sprite_Picture.prototype.loadApngSprite.call(this, name);
};

Game_Enemy.prototype.allSkillActions = function(actionList) {
  return actionList;
};

})();