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

/*:
 * @target MZ
 * @plugindesc メニュー画面レイアウトをカスタマイズします。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-menuscreencustom/
 * @base LL_MenuScreenBase
 * @orderAfter LL_MenuScreenBase
 *
 * @help LL_MenuScreenCustom.js
 *
 * メニュー画面レイアウトをカスタマイズします。
 * 顔グラフィックの代わりに立ち絵を表示することもできます。
 * ※表示する立ち絵リストは「LL_MenuScreenBase」で設定してください。
 *
 * 立ち絵が上手く表示されない場合:
 *   何も表示されない場合は、X・Y座標始点のマイナス値を大きくしてみるか、
 *   拡大率を小さくしてみてください。
 *   顔グラフィックが表示されている時は、立ち絵リストが紐づけできていません。
 *   立ち絵リストが正しく設定されているか確認してみてください。
 *
 * ヘルプウィンドウ:
 *   ヘルプウィンドウの左上と右上、左下と右下に任意の情報を表示できます。
 *   表示する内容（値）はスクリプトで記述してください。
 *
 * プラグインコマンドはありません。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2022/6/7
 *
 * @param menuSettings
 * @text メニュー画面の設定
 * @desc ※この項目は使用しません
 *
 * @param leftInputMode
 * @text メニューを左に配置
 * @desc メニューを左に配置し、タッチUI配置も左向けに調整します。
 * 戻るボタンが左上、ページ切替ボタンが右上に配置されます。
 * @default false
 * @type boolean
 * @parent menuSettings
 *
 * @param numVisibleRows
 * @text アクター行数
 * @desc アクター一覧画面の行数です。 (推奨値: 1～2)
 * @default 2
 * @min 1
 * @max 10
 * @type number
 * @parent menuSettings
 *
 * @param maxCols
 * @text アクター列数
 * @desc アクター一覧画面の列数です。 (推奨値: 1～2)
 * @default 2
 * @min 1
 * @max 10
 * @type number
 * @parent menuSettings
 *
 * @param currencyWindowPosition
 * @text 所持金の表示位置
 * @desc ヘルプウィンドウの右下に独自の項目を表示するときは、
 * 「メニュー下に別ウィンドウで表示」に設定してください。
 * @default helpWindowRightBottom
 * @type select
 * @option 表示しない
 * @value hidden
 * @option ヘルプウィンドウの右下
 * @value helpWindowRightBottom
 * @option メニュー下に別ウィンドウで表示
 * @value menuCommandBottom
 * @parent menuSettings
 *
 * @param backgroundImages
 * @text 背景画像の設定
 * @desc メニュー画面の背景画像を変更します。
 * @default []
 * @type struct<backgroundImages>[]
 * @parent menuSettings
 *
 * @param layoutSettings
 * @text 表示位置の設定
 * @desc ※この項目は使用しません
 *
 * @param actorNameLH
 * @text アクター名表示位置
 * @desc アクター名を上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 0)
 * @default 0
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorNameX
 * @text アクター名表示位置(X)
 * @desc アクター名の横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorLevelLH
 * @text レベル表示位置
 * @desc レベルを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 1)
 * @default 1
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorLevelX
 * @text レベル表示位置(X)
 * @desc レベルの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorIconLH
 * @text ステート表示位置
 * @desc ステートアイコンを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 2)
 * @default 2
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorIconX
 * @text ステート表示位置(X)
 * @desc ステートアイコンの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorClassLH
 * @text 職業名表示位置
 * @desc 職業名を上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 3)
 * @default 3
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorClassX
 * @text 職業名表示位置(X)
 * @desc 職業名の横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param actorGaugeLH
 * @text ゲージ表示位置
 * @desc HP・MP・TPゲージを上から何行目に表示するか設定します。
 * -1にすると非表示になります。 (初期値: 4)
 * @default 4
 * @min -1
 * @max 100
 * @type number
 * @parent layoutSettings
 *
 * @param actorGaugeX
 * @text ゲージ表示位置(X)
 * @desc ゲージの横位置を調整します。(初期値: 0)
 * プラスにすると右へ、マイナスにすると左へ移動します。
 * @default 0
 * @min -9999
 * @max 9999
 * @type number
 * @parent layoutSettings
 *
 * @param lvPadding
 * @text Lvの余白調整値
 * @desc Lv表記の余白調整値です。
 * 数値を小さくすると余白が狭くなります。 (初期値: 84)
 * @default 84
 * @min 0
 * @max 2000
 * @type number
 * @parent layoutSettings
 *
 * @param gaugeWidth
 * @text ゲージの幅
 * @desc ゲージの幅(長さ)です。  (初期値: 128)
 * この設定はメニュー画面トップのみ適用されます。
 * @default 128
 * @min 0
 * @max 2000
 * @type number
 * @parent layoutSettings
 *
 * @param pictureSettings
 * @text 立ち絵表示の設定
 * @desc ※この項目は使用しません
 *
 * @param showStandingPicture
 * @text 立ち絵を表示
 * @desc 顔グラフィックの代わりに立ち絵を表示します。
 * @default true
 * @type boolean
 * @parent pictureSettings
 *
 * @param menuWindowPictureX
 * @text X座標始点
 * @desc 顔グラフィックの代わりに表示する立ち絵の表示位置(X)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuWindowPictureY
 * @text Y座標始点
 * @desc 顔グラフィックの代わりに表示する立ち絵の表示位置(Y)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuWindowPictureScale
 * @text 拡大率
 * @desc 立ち絵の拡大率です。 (初期値: 100)
 * @default 100
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param menuHelpSettings
 * @text ヘルプウィンドウの設定
 * @desc ※この項目は使用しません
 *
 * @param menuHelpWindowEnable
 * @text ヘルプウィンドウを表示
 * @desc メニュー画面上部にヘルプウィンドウを表示します。
 * @default true
 * @type boolean
 * @parent menuHelpSettings
 *
 * @param menuHelpTexts
 * @text メニュー説明文
 * @desc メニュー説明文のリストを定義します。
 * @default ["{\"symbol\":\"アイテム\",\"helpText\":\"入手したアイテムを使用します。\"}","{\"symbol\":\"スキル\",\"helpText\":\"習得したスキルを使用します。\"}","{\"symbol\":\"装備\",\"helpText\":\"装備を変更します。\"}","{\"symbol\":\"ステータス\",\"helpText\":\"ステータスを確認します。\"}","{\"symbol\":\"並び替え\",\"helpText\":\"パーティの並び順を変更します。\"}","{\"symbol\":\"オプション\",\"helpText\":\"オプション画面を開きます。\"}","{\"symbol\":\"セーブ\",\"helpText\":\"セーブ画面を開きます。\"}","{\"symbol\":\"ゲーム終了\",\"helpText\":\"ゲームを終了します。\"}"]
 * @type struct<menuHelpTexts>[]
 * @parent menuHelpSettings
 *
 * @param leftBlockLabel
 * @text 左上の項目名
 * @desc 左上に表示する項目名です。
 * 空白にすると非表示になります。
 * @default 現在地：
 * @type string
 * @parent menuHelpSettings
 *
 * @param leftBlockValue
 * @text 左上の値
 * @desc 左上に表示する値をスクリプトで記述します。
 * @default $gameMap.displayName()
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param leftBlockAlign
 * @text 左上の文字揃え
 * @desc 左上に表示する値の文字配置を選択します。
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param rightBlockLabel
 * @text 右上の項目名
 * @desc 右上に表示する項目名です。
 * 空白にすると非表示になります。
 * @default プレイ時間：
 * @type string
 * @parent menuHelpSettings
 *
 * @param rightBlockValue
 * @text 右上の値
 * @desc 右上に表示する値をスクリプトで記述します。
 * @default $gameSystem.playtimeText()
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param rightBlockAlign
 * @text 右上の文字揃え
 * @desc 右上に表示する値の文字配置を選択します。
 * @default right
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockLabel
 * @text 右下の項目名
 * @desc 右下に表示する項目名です。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default
 * @type string
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockValue
 * @text 右下の値
 * @desc 右下に表示する値をスクリプトで記述します。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param rightBottomBlockAlign
 * @text 右下の文字揃え
 * @desc 右下に表示する値の文字配置を選択します。
 * ※所持金の表示位置が「ヘルプウィンドウの右下」時は無効
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockLabel
 * @text 左下の項目名
 * @desc 左下に表示する項目名です。
 * ※設定するとメニュー説明文が表示されなくなります
 * @default
 * @type string
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockValue
 * @text 左下の値
 * @desc 左下に表示する値をスクリプトで記述します。
 * ※設定するとメニュー説明文が表示されなくなります
 * @default
 * @type combo
 * @option $gameVariables.value(1)   // 変数ID:1の値
 * @option $gameSwitches.value(1) ? "有効" : "無効"  // スイッチID:1の状態
 * @option $gameMap.displayName()  // マップ名
 * @option $gameParty.size()  // パーティー人数
 * @option $gameParty.steps()  // 現在の歩数
 * @option $gameParty.gold()  // 所持金
 * @option $gameParty.numItems($dataItems[1])  // アイテムID:1の所持数
 * @option $gameParty.numItems($dataWeapons[1])  // 武器ID:1の所持数
 * @option $gameParty.numItems($dataArmors[1])  // 防具ID:1の所持数
 * @option $gameSystem.playtimeText()   // プレイ時間
 * @option $gameSystem.saveCount()  // セーブ回数
 * @option $gameSystem.battleCount()  // 戦闘回数
 * @parent menuHelpSettings
 *
 * @param leftBottomBlockAlign
 * @text 左下の文字揃え
 * @desc 左下に表示する値の文字配置を選択します。
 * @default left
 * @type select
 * @option 左揃え
 * @value left
 * @option 中央揃え
 * @value center
 * @option 右揃え
 * @value right
 * @parent menuHelpSettings
 */

/*~struct~menuHelpTexts:
 *
 * @param symbol
 * @text メニュー名
 * @desc メニュー名を入力します。
 * @type string
 *
 * @param helpText
 * @text メニュー説明文
 * @desc メニューの説明文を入力します。
 * @type string
 */

/*~struct~backgroundImages:
 *
 * @param sceneName
 * @text シーン名
 * @desc 背景画像を設定するシーン名です。
 * 独自で追加したシーン名を直接入力することもできます。
 * @default Scene_Menu
 * @type combo
 * @option Scene_Menu
 * @option Scene_Item
 * @option Scene_Skill
 * @option Scene_Equip
 * @option Scene_Status
 * @option Scene_Options
 * @option Scene_Save
 * @option Scene_Load
 * @option Scene_GameEnd
 *
 * @param imageName
 * @text 背景画像
 * @desc 背景画像として表示する画像を選択してください。
 * @dir img/system
 * @type file
 * @require 1
 */

(() => {
  "use strict";
  const pluginName = "LL_MenuScreenCustom";

  const parameters = PluginManager.parameters(pluginName);
  const leftInputMode = eval(parameters["leftInputMode"] || "true");
  const numVisibleRows = Number(parameters["numVisibleRows"] || 2);
  const maxCols = Number(parameters["maxCols"] || 2);
  const currencyWindowPosition = String(
    parameters["currencyWindowPosition"] || "helpWindowRightBottom"
  );
  // 表示位置の設定
  const actorNameLH = Number(parameters["actorNameLH"] || 0);
  const actorLevelLH = Number(parameters["actorLevelLH"] || 1);
  const actorIconLH = Number(parameters["actorIconLH"] || 2);
  const actorClassLH = Number(parameters["actorClassLH"] || 3);
  const actorGaugeLH = Number(parameters["actorGaugeLH"] || 4);
  const lvPadding = Number(parameters["lvPadding"] || 84);
  const gaugeWidth = Number(parameters["gaugeWidth"] || 128);
  // 表示位置の設定(X)
  const actorNameX = Number(parameters["actorNameX"] || 0);
  const actorLevelX = Number(parameters["actorLevelX"] || 0);
  const actorIconX = Number(parameters["actorIconX"] || 0);
  const actorClassX = Number(parameters["actorClassX"] || 0);
  const actorGaugeX = Number(parameters["actorGaugeX"] || 0);
  // 立ち絵表示の設定
  const showStandingPicture = eval(parameters["showStandingPicture"] || "true");
  const menuWindowPictureX = Number(parameters["menuWindowPictureX"] || 0);
  const menuWindowPictureY = Number(parameters["menuWindowPictureY"] || 0);
  const menuWindowPictureScale = Number(
    parameters["menuWindowPictureScale"] || 100
  );
  // ヘルプウィンドウの設定
  const menuHelpWindowEnable = eval(
    parameters["menuHelpWindowEnable"] || "true"
  );
  const menuHelpTexts = JSON.parse(parameters["menuHelpTexts"] || "null");
  const leftBlockLabel = String(parameters["leftBlockLabel"] || "");
  const leftBlockValue = String(parameters["leftBlockValue"] || "");
  const leftBlockAlign = String(parameters["leftBlockAlign"] || "left");
  const rightBlockLabel = String(parameters["rightBlockLabel"] || "");
  const rightBlockValue = String(parameters["rightBlockValue"] || "");
  const rightBlockAlign = String(parameters["rightBlockAlign"] || "right");
  const rightBottomBlockLabel = String(
    parameters["rightBottomBlockLabel"] || ""
  );
  const rightBottomBlockValue = String(
    parameters["rightBottomBlockValue"] || ""
  );
  const rightBottomBlockAlign = String(
    parameters["rightBottomBlockAlign"] || "left"
  );
  const leftBottomBlockLabel = String(parameters["leftBottomBlockLabel"] || "");
  const leftBottomBlockValue = String(parameters["leftBottomBlockValue"] || "");
  const leftBottomBlockAlign = String(
    parameters["leftBottomBlockAlign"] || "left"
  );
  // 背景画像の設定
  const backgroundImages = JSON.parse(parameters["backgroundImages"] || "null");

  let menuHelpLists = [];
  if (menuHelpTexts) {
    menuHelpTexts.forEach((elm) => {
      menuHelpLists[String(JSON.parse(elm).symbol)] = String(
        JSON.parse(elm).helpText
      );
    });
  }

  let backgroundImageLists = [];
  if (backgroundImages) {
    backgroundImages.forEach((elm) => {
      backgroundImageLists.push(JSON.parse(elm));
    });
  }

  // メニュー画面ヘルプウィンドウの標準高さ (lineHeight)
  let menuHelpWindowLH = 1.5;

  // ヘルプウィンドウフォントサイズ
  const menuHelpWindowFontSize = 22;

  const _Scene_MenuBase_createBackground =
    Scene_MenuBase.prototype.createBackground;
  Scene_MenuBase.prototype.createBackground = function () {
    let sceneName = SceneManager._scene.constructor.name;
    // 背景画像を検索
    let originalBackgroundImage = backgroundImageLists.find(function (item) {
      if (String(item.sceneName) == sceneName) return true;
    });
    if (originalBackgroundImage) {
      // 独自の背景画像を表示
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadSystem(
        originalBackgroundImage.imageName
      );
      this.addChild(this._backgroundSprite);
      return;
    }
    _Scene_MenuBase_createBackground.apply(this, arguments);
  };

  // ヘルプウィンドウの高さを定義
  Scene_MenuBase.prototype.calcMenuHelpWindowHeight = function () {
    let height = this.calcWindowHeight(menuHelpWindowLH, false);
    if (!leftBlockLabel && !rightBlockLabel)
      height = this.calcWindowHeight(1, false);
    if (!menuHelpWindowEnable) height = 0;
    return height;
  };

  Scene_Menu.prototype.isRightInputMode = function () {
    return !leftInputMode;
  };

  Scene_MenuBase.prototype.createCancelButton = function () {
    this._cancelButton = new Sprite_Button("cancel");
    this._cancelButton.x = leftInputMode
      ? 4
      : Graphics.boxWidth - this._cancelButton.width - 4;
    this._cancelButton.y = this.buttonY();
    this.addWindow(this._cancelButton);
  };

  Scene_MenuBase.prototype.createPageButtons = function () {
    this._pageupButton = new Sprite_Button("pageup");
    this._pagedownButton = new Sprite_Button("pagedown");
    if (leftInputMode) {
      this._pageupButton.x =
        Graphics.boxWidth -
        this._pageupButton.width -
        this._pagedownButton.width -
        8;
    } else {
      this._pageupButton.x = 4;
    }
    this._pageupButton.y = this.buttonY();
    const pageupRight = this._pageupButton.x + this._pageupButton.width;
    this._pagedownButton.x = pageupRight + 4;
    this._pagedownButton.y = this.buttonY();
    this.addWindow(this._pageupButton);
    this.addWindow(this._pagedownButton);
    this._pageupButton.setClickHandler(this.previousActor.bind(this));
    this._pagedownButton.setClickHandler(this.nextActor.bind(this));
  };

  const _Scene_Menu_create = Scene_Menu.prototype.create;
  Scene_Menu.prototype.create = function () {
    _Scene_Menu_create.apply(this, arguments);
    this.createMenuHelpWindow();
    if (currencyWindowPosition != "menuCommandBottom") {
      this._goldWindow.visible = false;
    }
  };

  Scene_Menu.prototype.commandWindowRect = function () {
    const ww = this.mainCommandWidth();
    let wh =
      this.mainAreaHeight() -
      this.menuHelpWindowRect().height -
      this.goldWindowRect().height;
    const wx = this.isRightInputMode() ? Graphics.boxWidth - ww : 0;
    const wy = this.mainAreaTop() + this.menuHelpWindowRect().height;
    if (currencyWindowPosition != "menuCommandBottom") {
      wh += this.goldWindowRect().height;
    }
    return new Rectangle(wx, wy, ww, wh);
  };

  Scene_Menu.prototype.goldWindowRect = function () {
    const ww = this.mainCommandWidth();
    const wh = this.calcWindowHeight(1, true);
    const wx = this.isRightInputMode() ? Graphics.boxWidth - ww : 0;
    const wy = this.mainAreaBottom() - wh;
    return new Rectangle(wx, wy, ww, wh);
  };

  Scene_Menu.prototype.statusWindowRect = function () {
    const ww = Graphics.boxWidth - this.mainCommandWidth();
    const wh = this.mainAreaHeight() - this.menuHelpWindowRect().height;
    const wx = this.isRightInputMode() ? 0 : Graphics.boxWidth - ww;
    const wy = this.mainAreaTop() + this.menuHelpWindowRect().height;
    return new Rectangle(wx, wy, ww, wh);
  };

  Scene_Menu.prototype.createMenuHelpWindow = function () {
    const rect = this.menuHelpWindowRect();
    this._menuHelpWindow = new Window_MenuHelp(rect);
    this.addWindow(this._menuHelpWindow);
  };

  Scene_Menu.prototype.menuHelpWindowRect = function () {
    const wx = 0;
    const wy = this.mainAreaTop();
    const ww = Graphics.boxWidth;
    const wh = this.calcMenuHelpWindowHeight();
    return new Rectangle(wx, wy, ww, wh);
  };

  const _Scene_Menu_update = Scene_Menu.prototype.update;
  Scene_Menu.prototype.update = function () {
    _Scene_Menu_update.apply(this, arguments);
    // インフォメーションウィンドウの更新
    const helpText = menuHelpLists[this._commandWindow.currentName()]
      ? menuHelpLists[this._commandWindow.currentName()]
      : "";
    this._menuHelpWindow.setText(helpText);
  };

  Scene_ItemBase.prototype.actorWindowRect = function () {
    const wx = 0;
    const wy = Math.min(this.mainAreaTop(), this.helpAreaTop());
    const ww = Graphics.boxWidth - this.mainCommandWidth();
    const wh =
      Graphics.boxHeight -
      this.buttonAreaHeight() -
      this.calcMenuHelpWindowHeight();
    return new Rectangle(wx, wy, ww, wh);
  };

  // Get Current Name
  Window_Command.prototype.currentName = function () {
    return this.currentData() ? this.currentData().name : null;
  };

  // ウィンドウ内に立ち絵を描画
  Window_StatusBase.prototype.drawStandingPicture = function (
    pictureName,
    x,
    y,
    width,
    height,
    sx,
    sy,
    scaleX,
    scaleY
  ) {
    width = width || 200;
    height = height || 200;
    sx = sx || 0;
    sy = sy || 0;
    const bitmap = ImageManager.loadPicture(pictureName);
    const pw = width;
    const ph = height;
    let sw = Math.min(width, pw);
    let sh = Math.min(height, ph);
    let dx = Math.floor(x + Math.max(width - pw, 0) / 2);
    let dy = Math.floor(y + Math.max(height - ph, 0) / 2);
    let dw = Math.min(width, pw);
    let dh = Math.min(height, ph);

    // for iOS Safari
    if (sx < 0) {
      dx += sx * -1 * scaleX;
      sw -= sx * -1 * scaleX;
      dw -= sx * -1 * scaleX;
      sx = 0;
    }
    if (sy < 0) {
      dy += sy * -1 * scaleY;
      sh -= sy * -1 * scaleY;
      dh -= sy * -1 * scaleY;
      sy = 0;
    }

    bitmap.addLoadListener(
      function () {
        this.contents.blt(
          bitmap,
          sx,
          sy,
          sw / scaleX,
          sh / scaleY,
          dx,
          dy,
          dw,
          dh
        );
      }.bind(this)
    );
  };

  Window_StatusBase.prototype.exDrawActorSimpleStatus = function (
    actor,
    x,
    y,
    width
  ) {
    const lineHeight = this.lineHeight();
    if (actorNameLH > -1)
      this.drawActorName(
        actor,
        x + actorNameX,
        y + lineHeight * actorNameLH,
        width - actorNameX
      );
    if (actorLevelLH > -1)
      this.drawActorLevel(
        actor,
        x + actorLevelX,
        y + lineHeight * actorLevelLH
      );
    if (actorIconLH > -1)
      this.drawActorIcons(
        actor,
        x + actorIconX,
        y + lineHeight * actorIconLH,
        width - actorIconX
      );
    if (actorClassLH > -1)
      this.drawActorClass(
        actor,
        x + actorClassX,
        y + lineHeight * actorClassLH,
        width - actorClassX
      );
    if (actorGaugeLH > -1)
      this.placeBasicGauges(
        actor,
        x + actorGaugeX,
        y + lineHeight * actorGaugeLH
      );
  };

  Window_MenuStatus.prototype.drawItemImage = function (index) {
    const actor = this.actor(index);
    const rect = this.itemRect(index);

    this.changePaintOpacity(actor.isBattleMember());
    // 立ち絵 or 顔グラフィック描画
    let mPicture = ExMenuScreenBase.getImageName(actor.actorId());
    if (mPicture && showStandingPicture) {
      const width = rect.width - 2;
      const height = rect.height - 2;
      const x = rect.x + 1;
      const y = rect.y + 1;
      const sx = (Number(mPicture.x) + menuWindowPictureX) * -1;
      const sy = (Number(mPicture.y) + menuWindowPictureY) * -1;
      let scaleX = Number(mPicture.scaleX) / 100;
      let scaleY = Number(mPicture.scaleY) / 100;
      // 拡大率を適用
      scaleX *= menuWindowPictureScale / 100;
      scaleY *= menuWindowPictureScale / 100;
      // ピンチ判定
      if (
        ExMenuScreenBase.getHpRate(actor.actorId()) >
          Number(mPicture.pinchPercentage) ||
        !mPicture.pinchImageName
      ) {
        // 通常
        this.drawStandingPicture(
          String(mPicture.imageName),
          x,
          y,
          width,
          height,
          sx,
          sy,
          scaleX,
          scaleY
        );
      } else {
        // ピンチ
        this.drawStandingPicture(
          String(mPicture.pinchImageName),
          x,
          y,
          width,
          height,
          sx,
          sy,
          scaleX,
          scaleY
        );
      }
    } else {
      let width = ImageManager.faceWidth;
      // 横幅が小さい場合、横幅に合わせてトリミング
      if (rect.width - 2 < width) {
        width = rect.width - 2;
      }
      const height = rect.height - 2;
      const x = rect.x + rect.width - width - 1;
      const y = rect.y + 1;
      this.drawActorFace(actor, x, y, width, height);
    }
    this.changePaintOpacity(true);
  };

  Window_MenuStatus.prototype.drawItemStatus = function (index) {
    const actor = this.actor(index);
    const rect = this.itemRect(index);
    const x = rect.x + 2;
    const y = rect.y + 2;
    const width = rect.width - 4;

    // 画像キャッシュ判定
    const mPicture = ExMenuScreenBase.getImageName(actor.actorId());
    if (mPicture && showStandingPicture) {
      let pictureName = null;
      // ピンチ判定 (旧Ver.互換用)
      if (
        ExMenuScreenBase.getHpRate(actor.actorId()) >
          Number(mPicture.pinchPercentage) ||
        !mPicture.pinchImageName
      ) {
        pictureName = String(mPicture.imageName);
      } else {
        pictureName = String(mPicture.pinchImageName);
      }
      const bitmap = ImageManager.loadPicture(pictureName);
      bitmap.addLoadListener(
        function () {
          this.exDrawActorSimpleStatus(actor, x, y, width);
        }.bind(this)
      );
    } else {
      this.exDrawActorSimpleStatus(actor, x, y, width);
    }
  };

  Window_MenuStatus.prototype.numVisibleRows = function () {
    return numVisibleRows;
  };

  Window_MenuStatus.prototype.maxCols = function () {
    return maxCols;
  };

  Window_MenuStatus.prototype.drawActorLevel = function (actor, x, y) {
    this.changeTextColor(ColorManager.systemColor());
    this.drawText(TextManager.levelA, x, y, 48);
    this.resetTextColor();
    this.drawText(actor.level, x + lvPadding, y, 36, "right");
  };

  Window_MenuStatus.prototype.refreshCursorForAll = function () {
    const maxItems = this.maxItems();
    if (maxItems > 0) {
      const rect = this.itemRect(0);

      // 独自に最大数を計算
      let maxRectCnt = maxItems;
      if (maxRectCnt > maxCols) {
        maxRectCnt = Math.ceil(maxRectCnt / maxCols) * maxCols;
      }
      rect.enlarge(this.itemRect(maxRectCnt - 1));

      this.setCursorRect(rect.x, rect.y, rect.width, rect.height);
    } else {
      this.setCursorRect(0, 0, 0, 0);
    }
  };

  //-----------------------------------------------------------------------------
  // Window_MenuHelp
  //

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

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

  Window_MenuHelp.prototype.initialize = function (rect) {
    Window_Base.prototype.initialize.call(this, rect);
    this.refresh();
  };

  Window_MenuHelp.prototype.setText = function (text) {
    this._text = text;
    this.refresh();
  };

  Window_MenuHelp.prototype.clear = function () {
    this.setText("");
  };

  Window_MenuHelp.prototype.refresh = function () {
    this.contents.clear();
    this.contents.fontSize = this.getFontSize();
    // マップ名
    this.drawLeftBlock();
    // プレイ時間
    this.drawRightBlock();
    // 所持金
    this.drawCurrency();
    // メニューヘルプ
    this.drawMenuHelp();
    this.contents.fontSize = $gameSystem.mainFontSize();
  };

  Window_MenuHelp.prototype.getFontSize = function () {
    return !leftBlockLabel && !rightBlockLabel
      ? $gameSystem.mainFontSize()
      : menuHelpWindowFontSize;
  };

  Window_MenuHelp.prototype.drawLeftBlock = function () {
    if (!leftBlockLabel) return;
    const y = -6;
    const oneThirdWidth = Math.floor(this.innerWidth / 3);
    this.changeTextColor(this.systemColor());
    this.drawText(
      leftBlockLabel,
      0,
      y,
      this.contents.measureTextWidth(leftBlockLabel),
      leftBlockAlign
    );
    this.resetTextColor();
    this.drawText(
      eval(leftBlockValue),
      this.contents.measureTextWidth(leftBlockLabel),
      y,
      oneThirdWidth * 1.5 - this.contents.measureTextWidth(leftBlockLabel),
      leftBlockAlign
    );
  };

  Window_MenuHelp.prototype.drawRightBlock = function () {
    if (!rightBlockLabel) return;
    const y = -6;
    const oneThirdWidth = Math.floor(this.innerWidth / 3);
    this.changeTextColor(this.systemColor());
    this.drawText(
      rightBlockLabel,
      oneThirdWidth * 1.5,
      y,
      this.contents.measureTextWidth(rightBlockLabel),
      rightBlockAlign
    );
    this.resetTextColor();
    this.drawText(
      eval(rightBlockValue),
      this.contents.measureTextWidth(rightBlockLabel) + oneThirdWidth * 1.5,
      y,
      oneThirdWidth * 1.5 - this.contents.measureTextWidth(rightBlockLabel),
      rightBlockAlign
    );
  };

  Window_MenuHelp.prototype.drawCurrency = function () {
    const y = !leftBlockLabel && !rightBlockLabel ? 0 : 24;
    const oneThirdWidth = Math.floor(this.innerWidth / 3);

    if (currencyWindowPosition == "helpWindowRightBottom") {
      // 所持金の表示位置が「ヘルプウィンドウの右下」の場合、所持金を描画
      const currencyUnit = TextManager.currencyUnit;
      this.drawCurrencyValue(
        $gameParty.gold(),
        currencyUnit,
        oneThirdWidth * 1.5,
        y,
        oneThirdWidth * 1.5
      );
    } else {
      // それ以外の場合、独自の項目を描画
      if (!rightBottomBlockLabel) return;
      this.changeTextColor(this.systemColor());
      this.drawText(
        rightBottomBlockLabel,
        oneThirdWidth * 1.5,
        y,
        this.contents.measureTextWidth(rightBottomBlockLabel),
        rightBottomBlockAlign
      );
      this.resetTextColor();
      this.drawText(
        eval(rightBottomBlockValue),
        this.contents.measureTextWidth(rightBottomBlockLabel) +
          oneThirdWidth * 1.5,
        y,
        oneThirdWidth * 1.5 -
          this.contents.measureTextWidth(rightBottomBlockLabel),
        rightBottomBlockAlign
      );
    }
  };

  Window_MenuHelp.prototype.drawMenuHelp = function () {
    const y = !leftBlockLabel && !rightBlockLabel ? 0 : 24;
    const oneThirdWidth = Math.floor(this.innerWidth / 3);

    if (leftBottomBlockLabel != "") {
      // 左下に独自の項目を表示する場合 (v1.4.0)
      this.changeTextColor(this.systemColor());
      this.drawText(
        leftBottomBlockLabel,
        0,
        y,
        this.contents.measureTextWidth(leftBottomBlockLabel),
        leftBottomBlockAlign
      );
      this.resetTextColor();
      this.drawText(
        eval(leftBottomBlockValue),
        this.contents.measureTextWidth(leftBottomBlockLabel),
        y,
        oneThirdWidth * 1.5 -
          this.contents.measureTextWidth(leftBottomBlockLabel),
        leftBottomBlockAlign
      );
    } else {
      // メニューヘルプを表示
      this.resetTextColor();
      this.drawText(
        this._text ? this._text : "",
        0,
        y,
        this.innerWidth - oneThirdWidth * 1.5,
        leftBottomBlockAlign
      );
    }
  };

  // ゲージ幅調整機能 (v1.3.0)
  const _Window_StatusBase_placeGauge = Window_StatusBase.prototype.placeGauge;
  Window_StatusBase.prototype.placeGauge = function (actor, type, x, y) {
    // メニュー画面トップおよび対象アクター選択画面のみ適用
    if (
      this.constructor.name === "Window_MenuStatus" ||
      this.constructor.name === "Window_MenuActor"
    ) {
      const key = "actor%1-gauge-%2".format(actor.actorId(), type);
      const sprite = this.createInnerSprite(key, Sprite_GaugeExMenuBase);
      sprite.setup(actor, type);
      sprite.move(x, y);
      sprite.show();
    } else {
      _Window_StatusBase_placeGauge.apply(this, arguments);
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_GaugeExMenuBase
  //
  // ゲージ幅調整用のゲージスプライトを新規定義します。

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

  Sprite_GaugeExMenuBase.prototype = Object.create(Sprite_Gauge.prototype);
  Sprite_GaugeExMenuBase.prototype.constructor = Sprite_GaugeExMenuBase;

  Sprite_GaugeExMenuBase.prototype.bitmapWidth = function () {
    return gaugeWidth;
  };
})();


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

/*:
 * @target MZ
 * @plugindesc ステータス画面に立ち絵を表示します。
 * @author ルルの教会
 * @url https://nine-yusha.com/plugin-menuscreen/
 * @base LL_MenuScreenBase
 * @orderAfter LL_MenuScreenBase
 *
 * @help LL_MenuScreenStatus.js
 *
 * ステータス画面に立ち絵を表示します。
 * ※表示する立ち絵リストは「LL_MenuScreenBase」で設定してください。
 *
 * 立ち絵を優先して見せたい場合は、下記の通り設定してください。
 *   X座標基点・Y座標基点: 右側寄りに設定
 *   不透明度: 255
 *   経験値情報の表示: 次のレベルのみ
 *   装備品リストの表示: false
 *   区切り線の表示: false
 *
 * プラグインコマンドはありません。
 *
 * 利用規約:
 *   ・著作権表記は必要ございません。
 *   ・利用するにあたり報告の必要は特にございません。
 *   ・商用・非商用問いません。
 *   ・R18作品にも使用制限はありません。
 *   ・ゲームに合わせて自由に改変していただいて問題ございません。
 *   ・プラグイン素材としての再配布（改変後含む）は禁止させていただきます。
 *
 * 作者: ルルの教会
 * 作成日: 2020/11/08
 *
 * @param pictureSettings
 * @text 立ち絵表示の設定
 * @desc ※この項目は使用しません
 *
 * @param statusWindowPictureX
 * @text X座標始点
 * @desc ステータス画面に表示する立ち絵の表示位置(X)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param statusWindowPictureY
 * @text Y座標始点
 * @desc ステータス画面に表示する立ち絵の表示位置(Y)です。
 * @default 0
 * @min -2000
 * @max 2000
 * @type number
 * @parent pictureSettings
 *
 * @param statusWindowPictureOpacity
 * @text 不透明度
 * @desc 立ち絵の不透明度(0～255)です。 (初期値: 160)
 * @type number
 * @default 160
 * @min 0
 * @max 255
 * @parent pictureSettings
 *
 * @param windowSettings
 * @text ウィンドウの設定
 * @desc ※この項目は使用しません
 *
 * @param showActorFace
 * @text 顔グラフィックの表示
 * @desc 顔グラフィックを表示します。
 * @default true
 * @type boolean
 * @parent windowSettings
 *
 * @param showExpInfos
 * @text 経験値情報の表示
 * @desc 経験値情報の表示方法を選択します。
 * @default all
 * @type select
 * @option 全て表示
 * @value all
 * @option 次のレベルのみ
 * @value nextLevel
 * @option 表示しない
 * @value off
 * @parent windowSettings
 *
 * @param showEquipLists
 * @text 装備品リストの表示
 * @desc 装備品のリストを表示します。
 * @default true
 * @type boolean
 * @parent windowSettings
 *
 * @param showLines
 * @text 区切り線の表示
 * @desc ウィンドウ内の区切り線を表示します。
 * @default true
 * @type boolean
 * @parent windowSettings
 */

(() => {
  "use strict";
  const pluginName = "LL_MenuScreenStatus";

  const parameters = PluginManager.parameters(pluginName);
  const statusWindowPictureX = Number(parameters["statusWindowPictureX"] || 0);
  const statusWindowPictureY = Number(parameters["statusWindowPictureY"] || 0);
  const statusWindowPictureOpacity = Number(
    parameters["statusWindowPictureOpacity"] || 160
  );
  const showActorFace = eval(parameters["showActorFace"] || "true");
  const showExpInfos = String(parameters["showExpInfos"] || "all");
  const showEquipLists = eval(parameters["showEquipLists"] || "true");
  const showLines = eval(parameters["showLines"] || "true");

  Scene_Status.prototype.create = function () {
    Scene_MenuBase.prototype.create.call(this);
    // ステータス画面に立ち絵を表示する場合、独自Windowに差し替え
    this.createStatusWithPictureWindow();
  };

  Scene_Status.prototype.refreshActor = function () {
    const actor = this.actor();
    this._statusWithPictureWindow.setActor(actor);
  };

  Scene_Status.prototype.onActorChange = function () {
    Scene_MenuBase.prototype.onActorChange.call(this);
    this.refreshActor();
    this._statusWithPictureWindow.activate();
  };

  Scene_Status.prototype.createStatusWithPictureWindow = function () {
    const rect = this.statusWithPictureWindowRect();
    this._statusWithPictureWindow = new Window_StatusWithPicture(rect);
    this._statusWithPictureWindow.setHandler(
      "cancel",
      this.popScene.bind(this)
    );
    this._statusWithPictureWindow.setHandler(
      "pagedown",
      this.nextActor.bind(this)
    );
    this._statusWithPictureWindow.setHandler(
      "pageup",
      this.previousActor.bind(this)
    );
    this.addWindow(this._statusWithPictureWindow);
  };

  Scene_Status.prototype.statusWithPictureWindowRect = function () {
    const wx = 0;
    const wy = this.mainAreaTop();
    const ww = Graphics.boxWidth;
    const wh = Graphics.boxHeight - wy;
    return new Rectangle(wx, wy, ww, wh);
  };

  //-----------------------------------------------------------------------------
  // Window_StatusWithPicture
  //
  // The window for displaying full status on the status screen.

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

  Window_StatusWithPicture.prototype = Object.create(
    Window_StatusBase.prototype
  );
  Window_StatusWithPicture.prototype.constructor = Window_StatusWithPicture;

  Window_StatusWithPicture.prototype.initialize = function (rect) {
    Window_StatusBase.prototype.initialize.call(this, rect);
    this._actor = null;
    this._backStandingPicture = null;
    this.refresh();
    this.activate();
  };

  Window_StatusWithPicture.prototype.setActor = function (actor) {
    if (this._actor !== actor) {
      this._actor = actor;
      this.refresh();
    }
  };

  Window_StatusWithPicture.prototype.refresh = function () {
    Window_StatusBase.prototype.refresh.call(this);
    if (this._actor) {
      const lineHeight = this.lineHeight();
      this.drawPicture();
      this.drawBlock1();
      this.drawBlock2();
      this.drawHorzLine(lineHeight * 5.25);
      this.drawBlock3(lineHeight * 6);
      this.drawHorzLine(lineHeight * 11.75);
      this.drawBlock4(lineHeight * 12.5);
    }
  };

  Window_StatusWithPicture.prototype.drawBlock1 = function () {
    const y = this.block1Y();
    this.drawActorName(this._actor, 6, y, 168);
    this.drawActorClass(this._actor, 192, y, 168);
    this.drawActorNickname(this._actor, 432, y, 270);
  };

  Window_StatusWithPicture.prototype.block1Y = function () {
    return 0;
  };

  Window_StatusWithPicture.prototype.drawBlock2 = function () {
    const y = this.block2Y();
    if (showActorFace) this.drawActorFace(this._actor, 12, y);
    this.drawBasicInfo(showActorFace ? 204 : 12, y);
    this.drawExpInfo(456, y);
  };

  Window_StatusWithPicture.prototype.block2Y = function () {
    const lineHeight = this.lineHeight();
    const min = lineHeight;
    const max = this.innerHeight - lineHeight * 4;
    return Math.floor((lineHeight * 1.4).clamp(min, max));
  };

  Window_StatusWithPicture.prototype.drawBlock3 = function (y) {
    this.drawParameters(12, y);
    this.drawEquipments(312, y);
  };

  Window_StatusWithPicture.prototype.drawBlock4 = function (y) {
    this.drawProfile(12, y);
  };

  Window_StatusWithPicture.prototype.drawBasicInfo = function (x, y) {
    const lineHeight = this.lineHeight();
    this.drawActorLevel(this._actor, x, y + lineHeight * 0);
    this.drawActorIcons(this._actor, x, y + lineHeight * 1);
    this.placeBasicGauges(this._actor, x, y + lineHeight * 2);
  };

  Window_StatusWithPicture.prototype.drawExpInfo = function (x, y) {
    const lineHeight = this.lineHeight();
    const expTotal = TextManager.expTotal.format(TextManager.exp);
    const expNext = TextManager.expNext.format(TextManager.level);
    // 設定により、表示情報を切り替え
    switch (showExpInfos) {
      case "off":
        return;
      case "nextLevel":
        this.changeTextColor(ColorManager.systemColor());
        this.drawText(expNext, x, y + lineHeight * 0, 270);
        this.resetTextColor();
        this.drawText(this.expNextValue(), x, y + lineHeight * 1, 270, "right");
        break;
      default:
        this.changeTextColor(ColorManager.systemColor());
        this.drawText(expTotal, x, y + lineHeight * 0, 270);
        this.drawText(expNext, x, y + lineHeight * 2, 270);
        this.resetTextColor();
        this.drawText(
          this.expTotalValue(),
          x,
          y + lineHeight * 1,
          270,
          "right"
        );
        this.drawText(this.expNextValue(), x, y + lineHeight * 3, 270, "right");
    }
  };

  Window_StatusWithPicture.prototype.expTotalValue = function () {
    if (this._actor.isMaxLevel()) {
      return "-------";
    } else {
      return this._actor.currentExp();
    }
  };

  Window_StatusWithPicture.prototype.expNextValue = function () {
    if (this._actor.isMaxLevel()) {
      return "-------";
    } else {
      return this._actor.nextRequiredExp();
    }
  };

  Window_StatusWithPicture.prototype.drawItem = function (index) {
    const rect = this.itemLineRect(index);
    const paramId = index + 2;
    const name = TextManager.param(paramId);
    const value = this._actor.param(paramId);
    this.changeTextColor(ColorManager.systemColor());
    this.drawText(name, rect.x, rect.y, 160);
    this.resetTextColor();
    this.drawText(value, rect.x + 160, rect.y, 60, "right");
  };

  Window_StatusWithPicture.prototype.drawParameters = function (x, y) {
    var lineHeight = this.lineHeight();
    for (var i = 0; i < 6; i++) {
      var paramId = i + 2;
      var y2 = y + lineHeight * i;
      this.changeTextColor(this.systemColor());
      this.drawText(TextManager.param(paramId), x, y2, 160);
      this.resetTextColor();
      this.drawText(this._actor.param(paramId), x + 160, y2, 60, "right");
    }
  };

  Window_StatusWithPicture.prototype.drawEquipments = function (x, y) {
    var equips = this._actor.equips();
    var count = Math.min(equips.length, this.maxEquipmentLines());
    for (var i = 0; i < count; i++) {
      this.changeTextColor(this.systemColor());
      this.drawText(
        this.actorSlotName(this._actor, i),
        x,
        y + this.lineHeight() * i,
        160
      );
      this.resetTextColor();
      this.drawItemName(equips[i], x + 160, y + this.lineHeight() * i);
    }
  };

  Window_StatusWithPicture.prototype.maxEquipmentLines = function () {
    return showEquipLists ? 6 : 0;
  };

  Window_StatusWithPicture.prototype.drawHorzLine = function (y) {
    if (!showLines) return;
    var lineY = y + this.lineHeight() / 2 - 1;
    this.contents.paintOpacity = 48;
    this.contents.fillRect(0, lineY, this.contentsWidth(), 2, this.lineColor());
    this.contents.paintOpacity = 255;
  };

  Window_StatusWithPicture.prototype.lineColor = function () {
    return ColorManager.normalColor();
  };

  Window_StatusWithPicture.prototype.drawProfile = function (x, y) {
    this.drawTextEx(this._actor.profile(), x, y);
  };

  Window_StatusWithPicture.prototype.drawPicture = function () {
    const actor = this._actor;
    if (this._backStandingPicture) this._backStandingPicture.bitmap = null;

    // 立ち絵描画
    let mPicture = ExMenuScreenBase.getImageName(actor._actorId);
    if (mPicture) {
      const x = statusWindowPictureX + Number(mPicture.x);
      const y = statusWindowPictureY + Number(mPicture.y);
      const scaleX = Number(mPicture.scaleX) / 100;
      const scaleY = Number(mPicture.scaleY) / 100;
      // ピンチ判定
      if (
        ExMenuScreenBase.getHpRate(actor._actorId) >
          Number(mPicture.pinchPercentage) ||
        !mPicture.pinchImageName
      ) {
        // 通常
        this.drawBackStandingPicture(
          String(mPicture.imageName),
          x,
          y,
          scaleX,
          scaleY
        );
      } else {
        // ピンチ
        this.drawBackStandingPicture(
          String(mPicture.pinchImageName),
          x,
          y,
          scaleX,
          scaleY
        );
      }
    }
  };

  Window_StatusWithPicture.prototype.drawBackStandingPicture = function (
    imageName,
    x,
    y,
    scaleX,
    scaleY
  ) {
    const spacing = 8;
    this._backStandingPicture = new Sprite();
    this._backStandingPicture.bitmap = ImageManager.loadPicture(imageName);
    this._backStandingPicture.x = x;
    this._backStandingPicture.y = y;
    this._backStandingPicture.scale.x = scaleX;
    this._backStandingPicture.scale.y = scaleY;

    // マスク処理
    let mask = new PIXI.Graphics();
    const paddingHelfX = (Graphics.width - Graphics.boxWidth - 8) / 2;
    const paddingHelfY = (Graphics.height - Graphics.boxHeight - 8) / 2;
    mask.beginFill(0xffffff, 1);
    mask.drawRect(
      this.x + 12 + paddingHelfX,
      this.y + 12 + paddingHelfY,
      this.width - 16,
      this.height - 16
    );
    mask.endFill();
    this._backStandingPicture.mask = mask;

    this._backStandingPicture.opacity = statusWindowPictureOpacity;
    this.addChildToBack(this._backStandingPicture);
  };
})();

repo_name: dazed/translations

license: unknown