code:
/*
 * --------------------------------------------------
 * MNKR_AltMenuScreen3 Ver.0.1.1
 * Copyright (c) 2020 Munokura
 * This software is released under the MIT license.
 * http://opensource.org/licenses/mit-license.php
 * --------------------------------------------------
 */

/*:ja
 * @target MV
 * @url https://raw.githubusercontent.com/munokura/MNKR-MV-plugins/master/MNKR_AltMenuScreen3.js
 * @plugindesc メニュー画面にアクターの顔画像の代わりに立ち絵を表示できます。
 * @author 神無月サスケ (改変:ムノクラ)
 *
 * @help
 * メニュー画面にアクターの顔画像の代わりに立ち絵を表示できます。
 * メニューそれぞれのシーンに背景画像を付けることが出来ます。
 *
 * アクターのメモに以下のように書いてください:
 * <stand_picture:ファイル名> ファイル名が、そのアクターの立ち絵になります。
 *   ファイルは img/pictures に置いてください。
 *
 * 望ましいアクター立ち絵のサイズ：
 * 幅：3列:240px, 4列：174px
 * 高さ： コマンドウィンドウ 1行:444px 2行:408px
 *
 * アクターのメモに<stand_offset_x> <stand_offset_y> を入れると
 * 立ち絵の表示位置指定が出来ます。
 * <stand_picture:ファイル名>で指定したアクター表示にのみ反映されます。
 * 通常の顔画像には反映されません。
 *
 * 立ち絵を横にずらしたい場合
 * <stand_offset_x:10>
 * ※10の部分をずらす量に指定してください。マイナスだと左に移動します。
 *
 * 立ち絵を縦にずらしたい場合
 * <stand_offset_y:10>
 * ※10の部分をずらす量に指定してください。マイナスだと上に移動します。
 *
 *
 * このプラグインには、プラグインコマンドはありません。
 *
 * このプラグインは AltMenuScreen2MZ を元となる AltMenuScreen3 と
 * ムノクラの技量の範囲で合体させたものです。
 *
 *
 * 利用規約:
 *   MITライセンスです。
 *   https://licenses.opensource.jp/MIT/MIT.html
 *   作者に無断で改変、再配布が可能で、
 *   利用形態（商用、18禁利用等）についても制限はありません。
 *
 *
 * @param displayWindow
 * @text ウィンドウ枠表示
 * @desc ウィンドウ枠を表示。デフォルト:false
 * @type boolean
 * @on 表示
 * @off 非表示
 * @default true
 *
 * @param bgBitmapMenu
 * @text メニュー背景
 * @desc メニュー背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapItem
 * @text アイテム画面背景
 * @desc アイテム画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapSkill
 * @text スキル画面背景
 * @desc スキル画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapEquip
 * @text 装備画面背景
 * @desc 装備画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapStatus
 * @text ステータス画面背景
 * @desc ステータス画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapOptions
 * @text オプション画面背景
 * @desc オプション画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapFile
 * @text セーブ／ロード画面背景
 * @desc セーブ／ロード画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @require 1
 * @dir img/pictures/
 * @type file
 *
 * @param bgBitmapGameEnd
 * @text ゲーム終了画面背景
 * @desc ゲーム終了画面背景にする画像ファイルです。
 * img/pictures に置いてください。
 * @default
 * @dir img/pictures/
 * @type file
 *
 * @param maxColsMenu
 * @text アクター表示最大数
 * @desc アクターを表示するウィンドウの1画面の登録最大数。
 * 0にすると、パーティ人数で自動調整
 * @type number
 * @default 4
 *
 * @param commandRows
 * @text コマンド行数
 * @desc コマンドウィンドウの行数です。
 * @type number
 * @min 1
 * @default 2
 *
 * @param isDisplayStatus
 * @text ステータス表示
 * @desc ステータスを表示するかしないかを選びます。
 * @type boolean
 * @on 表示
 * @off 非表示
 * @default true
 *
 * @param displayMapName
 * @text マップ名表示
 * @desc 画面左下にマップ名を表示するかを選びます。
 * @type boolean
 * @on 表示
 * @off 非表示
 * @default true
 *
 * @param locationString
 * @text マップ名ラベル
 * @desc マップ名の前に付ける文字。システムカラーで描画されます。
 * @type string
 * @default 現在地:
 *
 *
 * @noteParam stand_picture
 * @noteRequire 1
 * @noteDir img/pictures/
 * @noteType file
 * @noteData actors
 */

(function () {
  "use strict";

  // set parameters
  var pluginName = document.currentScript.src
    .split("/")
    .pop()
    .replace(/\.js$/, "");
  var parameters = PluginManager.parameters(pluginName);
  var bgBitmapMenu = parameters["bgBitmapMenu"] || "";
  var bgBitmapItem = parameters["bgBitmapItem"] || "";
  var bgBitmapSkill = parameters["bgBitmapSkill"] || "";
  var bgBitmapEquip = parameters["bgBitmapEquip"] || "";
  var bgBitmapStatus = parameters["bgBitmapStatus"] || "";
  var bgBitmapOptions = parameters["bgBitmapOptions"] || "";
  var bgBitmapFile = parameters["bgBitmapFile"] || "";
  var bgBitmapGameEnd = parameters["bgBitmapGameEnd"] || "";
  var maxColsMenuWnd = Number(parameters["maxColsMenu"] || 4);
  var rowsCommandWnd = Number(parameters["commandRows"] || 2);
  var isDisplayStatus = String(parameters["isDisplayStatus"]) === "true";
  var isDisplayMapName = String(parameters["displayMapName"]) === "true";
  var locationString = parameters["locationString"] || "";
  var displayWindow = String(parameters["displayWindow"]) === "true";
  //
  // make transparent windows for each scene in menu.
  //
  var _Scene_Menu_create = Scene_Menu.prototype.create;
  Scene_Menu.prototype.create = function () {
    _Scene_Menu_create.call(this);
    this._statusWindow.x = 0;
    this._statusWindow.y = this._commandWindow.height;
    this._goldWindow.x = Graphics.boxWidth - this._goldWindow.width;
    // make transparent for all windows at menu scene.
    if (!displayWindow) {
      this._statusWindow.opacity = 0;
      this._goldWindow.opacity = 0;
      this._commandWindow.opacity = 0;
    }
    this.createMapNameWindow();
  };

  var _Scene_Item_create = Scene_Item.prototype.create;
  Scene_Item.prototype.create = function () {
    _Scene_Item_create.call(this);
    if (!displayWindow) {
      this._helpWindow.opacity = 0;
      this._categoryWindow.opacity = 0;
      this._itemWindow.opacity = 0;
      this._actorWindow.opacity = 0;
    }
  };

  var _Scene_Skill_create = Scene_Skill.prototype.create;
  Scene_Skill.prototype.create = function () {
    _Scene_Skill_create.call(this);
    if (!displayWindow) {
      this._helpWindow.opacity = 0;
      this._skillTypeWindow.opacity = 0;
      this._statusWindow.opacity = 0;
      this._itemWindow.opacity = 0;
      this._actorWindow.opacity = 0;
    }
  };

  var _Scene_Equip_create = Scene_Equip.prototype.create;
  Scene_Equip.prototype.create = function () {
    _Scene_Equip_create.call(this);
    if (!displayWindow) {
      this._helpWindow.opacity = 0;
      this._statusWindow.opacity = 0;
      this._commandWindow.opacity = 0;
      this._slotWindow.opacity = 0;
      this._itemWindow.opacity = 0;
    }
  };

  var _Scene_Status_create = Scene_Status.prototype.create;
  Scene_Status.prototype.create = function () {
    _Scene_Status_create.call(this);
    if (!displayWindow) {
      this._statusWindow.opacity = 0;
    }
  };

  var _Scene_Options_create = Scene_Options.prototype.create;
  Scene_Options.prototype.create = function () {
    _Scene_Options_create.call(this);
    if (!displayWindow) {
      this._optionsWindow.opacity = 0;
    }
  };

  var _Scene_File_create = Scene_File.prototype.create;
  Scene_File.prototype.create = function () {
    _Scene_File_create.call(this);
    if (!displayWindow) {
      this._helpWindow.opacity = 0;
      this._listWindow.opacity = 0;
    }
  };

  var _Scene_GameEnd_create = Scene_GameEnd.prototype.create;
  Scene_GameEnd.prototype.create = function () {
    _Scene_GameEnd_create.call(this);
    if (!displayWindow) {
      this._commandWindow.opacity = 0;
    }
  };

  //
  // display current map name
  //

  function Window_MapNameAlt3() {
    this.initialize.apply(this, arguments);
  }

  Window_MapNameAlt3.prototype = Object.create(Window_MapName.prototype);
  Window_MapNameAlt3.prototype.constructor = Window_MapNameAlt3;

  Window_MapNameAlt3.prototype.initialize = function () {
    Window_MapName.prototype.initialize.call(this);
  };

  Window_MapNameAlt3.prototype.windowWidth = function () {
    return Number(Graphics.boxWidth - 240);
  };

  Window_MapNameAlt3.prototype.update = function () {
    // do nothing
  };

  var mapName = function () {
    var name = $gameMap.displayName();
    return name ? name : $dataMapInfos[$gameMap.mapId()].name;
  };

  Window_MapNameAlt3.prototype.refresh = function () {
    this.contents.clear();
    this.x = 0;
    this.y = Graphics.boxHeight - this.height;
    if (mapName()) {
      this.changeTextColor(this.systemColor());
      var textWidth = this.textWidth(locationString) + 8;
      var contentsWidth = this.contentsWidth();
      if (textWidth) {
        this.drawText(locationString, 4, 0, contentsWidth - 4, "left");
      }
      this.resetTextColor();
      var orgX = 4 + textWidth;
      this.drawText(mapName(), orgX, 0, contentsWidth - orgX, "left");
      this.contentsOpacity = 255;
    }
  };

  Scene_Menu.prototype.createMapNameWindow = function () {
    if (isDisplayMapName) {
      this._mapNameWindow = new Window_MapNameAlt3();
      this.addChild(this._mapNameWindow);
      if (!displayWindow) {
        this._mapNameWindow.opacity = 0;
      } else {
        this._mapNameWindow.opacity = 255;
      }
    }
  };

  var _Scene_Menu_terminate = Scene_Menu.prototype.terminate;
  Scene_Menu.prototype.terminate = function () {
    _Scene_Menu_terminate.call(this);
    if (isDisplayMapName) {
      this.removeChild(this._mapNameWindow);
    }
  };

  //
  // load bitmap that set in plugin parameter
  //
  var _Scene_Menu_createBackground = Scene_Menu.prototype.createBackground;
  Scene_Menu.prototype.createBackground = function () {
    if (bgBitmapMenu) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapMenu);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Menu_createBackground.call(this);
  };

  var _Scene_Item_createBackground = Scene_Item.prototype.createBackground;
  Scene_Item.prototype.createBackground = function () {
    if (bgBitmapItem) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapItem);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Item_createBackground.call(this);
  };

  var _Scene_Skill_createBackground = Scene_Skill.prototype.createBackground;
  Scene_Skill.prototype.createBackground = function () {
    if (bgBitmapSkill) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapSkill);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Skill_createBackground.call(this);
  };

  var _Scene_Equip_createBackground = Scene_Equip.prototype.createBackground;
  Scene_Equip.prototype.createBackground = function () {
    if (bgBitmapEquip) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapEquip);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Equip_createBackground.call(this);
  };

  var _Scene_Status_createBackground = Scene_Status.prototype.createBackground;
  Scene_Status.prototype.createBackground = function () {
    if (bgBitmapStatus) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapStatus);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Status_createBackground.call(this);
  };

  var _Scene_Options_createBackground =
    Scene_Options.prototype.createBackground;
  Scene_Options.prototype.createBackground = function () {
    if (bgBitmapOptions) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapOptions);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_Options_createBackground.call(this);
  };

  var _Scene_File_createBackground = Scene_File.prototype.createBackground;
  Scene_File.prototype.createBackground = function () {
    if (bgBitmapFile) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapFile);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_File_createBackground.call(this);
  };

  var _Scene_GameEnd_createBackground =
    Scene_GameEnd.prototype.createBackground;
  Scene_GameEnd.prototype.createBackground = function () {
    if (bgBitmapGameEnd) {
      this._backgroundSprite = new Sprite();
      this._backgroundSprite.bitmap = ImageManager.loadPicture(bgBitmapGameEnd);
      this.addChild(this._backgroundSprite);
      return;
    }
    // if background file is invalid, it does original process.
    _Scene_GameEnd_createBackground.call(this);
  };

  //
  // alt menu screen processes
  //
  Window_MenuCommand.prototype.windowWidth = function () {
    return Graphics.boxWidth;
  };

  Window_MenuCommand.prototype.maxCols = function () {
    return 4;
  };

  Window_MenuCommand.prototype.numVisibleRows = function () {
    return rowsCommandWnd;
  };

  Window_MenuStatus.prototype.windowWidth = function () {
    return Graphics.boxWidth;
  };

  Window_MenuStatus.prototype.windowHeight = function () {
    var h1 = this.fittingHeight(1);
    var h2 = this.fittingHeight(rowsCommandWnd);
    return Graphics.boxHeight - h1 - h2;
  };

  Window_MenuStatus.prototype.maxCols = function () {
    var realMaxColsMenuWnd =
      maxColsMenuWnd === 0 ? $gameParty.members().length : maxColsMenuWnd;
    return realMaxColsMenuWnd;
  };

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

  var _Window_MenuStatus_drawItem = Window_MenuStatus.prototype.drawItem;
  Window_MenuStatus.prototype.drawItem = function (index) {
    var actor = $gameParty.members()[index];
    var bitmapName = $dataActors[actor.actorId()].meta.stand_picture;
    const charaIndex = $gameActors.actor(1)._characterIndex;
    const charaName = $gameActors.actor(1)._characterName;

    // ■■■ Altered Mod ■■■
    if (bitmapName === $dataActors[1].meta.stand_picture) {
      if (
        $gameSwitches.value(686) ||
        (charaIndex === 6 && charaName === "bu_001")
      ) {
        bitmapName = $dataActors[actor.actorId()].meta.stand_picture2;
      }
      if (
        $gameSwitches.value(3) ||
        (charaIndex === 1 && charaName === "bu_001")
      ) {
        bitmapName = $dataActors[actor.actorId()].meta.stand_picture3;
      }
    }

    var bitmap = bitmapName ? ImageManager.loadPicture(bitmapName) : null;
    if (bitmap && !bitmap.isReady()) {
      bitmap.addLoadListener(_Window_MenuStatus_drawItem.bind(this, index));
    } else {
      _Window_MenuStatus_drawItem.apply(this, arguments);
    }
  };

  Window_MenuStatus.prototype.drawItemImage = function (index) {
    var actor = $gameParty.members()[index];
    var rect = this.itemRectForText(index);
    const charaIndex = $gameActors.actor(1)._characterIndex;
    const charaName = $gameActors.actor(1)._characterName;
    // load stand_picture
    var bitmapName = $dataActors[actor.actorId()].meta.stand_picture;
    if (bitmapName === $dataActors[1].meta.stand_picture) {
      if (
        $gameSwitches.value(686) ||
        (charaIndex === 6 && charaName === "bu_001")
      ) {
        bitmapName = $dataActors[actor.actorId()].meta.stand_picture2;
      }
      if (
        $gameSwitches.value(3) ||
        (charaIndex === 1 && charaName === "bu_001")
      ) {
        bitmapName = $dataActors[actor.actorId()].meta.stand_picture3;
      }
    }
    var bitmap = bitmapName ? ImageManager.loadPicture(bitmapName) : null;
    var offX = $dataActors[actor.actorId()].meta.stand_offset_x
      ? Number($dataActors[actor.actorId()].meta.stand_offset_x)
      : 0;
    var offY = $dataActors[actor.actorId()].meta.stand_offset_y
      ? Number($dataActors[actor.actorId()].meta.stand_offset_y)
      : 0;
    var w = Math.min(rect.width, bitmapName ? bitmap.width : 144);
    var h = Math.min(rect.height, bitmapName ? bitmap.height : 144);
    var lineHeight = this.lineHeight();
    this.changePaintOpacity(actor.isBattleMember());
    if (bitmap) {
      var sx = bitmap.width > w ? (bitmap.width - w) / 2 : 0;
      var sy = bitmap.height > h ? (bitmap.height - h) / 2 : 0;
      var dx =
        bitmap.width > rect.width
          ? rect.x
          : rect.x + (rect.width - bitmap.width) / 2;
      var dy =
        bitmap.height > rect.height
          ? rect.y
          : rect.y + (rect.height - bitmap.height) / 2;
      this.contents.bltStand(bitmap, sx - offX, sy - offY, w, h, dx, dy);
    } else {
      // when bitmap is not set, do the original process.
      this.drawActorFace(actor, rect.x, rect.y + lineHeight * 2.5, w, h);
    }
    this.changePaintOpacity(true);
  };

  Window_MenuStatus.prototype.drawItemStatus = function (index) {
    //このプラグインが最終的に上書きしている
    if (!isDisplayStatus) {
      return;
    }
    var actor = $gameParty.members()[index];
    var rect = this.itemRectForText(index);
    var x = rect.x;
    var y = rect.y;
    var width = rect.width;
    var bottom = y + rect.height;
    var lineHeight = this.lineHeight();
    this.drawActorName(actor, x, y + lineHeight * 0, width);
    this.drawActorLevelWidth(actor, x, y + lineHeight * 1, width);

    // ■■■ Altered Mod ■■■
    if (SceneManager._scene.constructor.name === "Scene_Item") {
      this.drawActorPrams(actor, x, bottom - lineHeight * 7, width, 2);
      this.drawActorPrams(actor, x, bottom - lineHeight * 6, width, 4);
      this.drawActorPrams(actor, x, bottom - lineHeight * 5, width, 6);
      this.drawActorPrams(actor, x, bottom - lineHeight * 7, width, 3);
      this.drawActorPrams(actor, x, bottom - lineHeight * 6, width, 5);
      this.drawActorPrams(actor, x, bottom - lineHeight * 5, width, 7);
    }

    this.drawActorClass(actor, x, bottom - lineHeight * 4, width);
    this.drawActorHp(actor, x, bottom - lineHeight * 3, width);
    this.drawActorMp(actor, x, bottom - lineHeight * 2, width);
    this.drawActorIcons(actor, x, bottom - lineHeight * 1, width);
  };

  // ■■■ Altered Mod ■■■
  Window_MenuStatus.prototype.drawActorPrams = function (
    actor,
    _x,
    y,
    width,
    paramId
  ) {
    let x = _x;
    let x2 = 0;
    if (paramId % 2 !== 0) {
      x += 128;
      x2 = 32;
    }
    width = Math.min(width, 128);
    this.changeTextColor(this.systemColor());
    this.drawText(TextManager.param(paramId), x + x2, y, 72);
    this.resetTextColor();
    this.drawText(actor.param(paramId), x + x2, y, width, "right");
  };

  Window_MenuStatus.prototype.drawActorLevelWidth = function (
    actor,
    x,
    y,
    width
  ) {
    width = Math.min(width, 128);
    this.changeTextColor(this.systemColor());
    this.drawText(TextManager.levelA, x, y, 48);
    this.resetTextColor();
    this.drawText(actor.level, x, y, width, "right");
  };

  var _Window_MenuActor_initialize = Window_MenuActor.prototype.initialize;
  Window_MenuActor.prototype.initialize = function () {
    _Window_MenuActor_initialize.call(this);
    this.y = this.fittingHeight(2);
  };

  Bitmap.prototype.bltStand = function (
    source,
    sx,
    sy,
    sw,
    sh,
    dx,
    dy,
    dw,
    dh
  ) {
    dw = dw || sw;
    dh = dh || sh;
    this._context.globalCompositeOperation = "source-over";
    this._context.drawImage(source._canvas, sx, sy, sw, sh, dx, dy, dw, dh);
    this._setDirty();
  };
})();

repo_name: dazed/translations

license: unknown


code:
/*
 * --------------------------------------------------
 * MNKR_Excalibur Ver.0.0.2
 * Copyright (c) 2020 Munokura
 * This software is released under the MIT license.
 * http://opensource.org/licenses/mit-license.php
 * --------------------------------------------------
 */

/*:
 * @target MZ MV
 * @url https://raw.githubusercontent.com/munokura/MNKR-MZ-plugins/master/MNKR_Excalibur.js
 * @plugindesc 約束された勝利のキーを作ります。
 * @author munokura
 *
 * @help
 * 戦闘中に勝利キーを押すと、
 * 敵全体に「戦闘不能」ステートを付与し、ターン終了へ移行します。
 *
 *
 * 利用規約:
 *   MITライセンスです。
 *   https://licenses.opensource.jp/MIT/MIT.html
 *   作者に無断で改変、再配布が可能で、
 *   利用形態（商用、18禁利用等）についても制限はありません。
 *
 * @param activation
 * @text 有効化スイッチID
 * @type switch
 * @desc 機能を有効化するスイッチです。ONの時に有効化されます。指定しない場合、常に有効化されます。
 * @default 0
 *
 * @param Excalibur Key
 * @text 勝利キー
 * @desc 勝利するキーを指定します。選択肢以外のキーも設定できます。
 * @type select
 * @option Tab
 * @value tab
 * @option Aボタン / Enter / スペース / Z
 * @value ok
 * @option Xボタン / Shift
 * @value shift
 * @option Control / Alt
 * @value control
 * @option Escape / テンキー0 / X / Insert
 * @value escape
 * @option RBボタン / Pagedown / W
 * @value pagedown
 * @option LBボタン / Pageup / Q
 * @value pageup
 * @option 下ボタン / カーソル下 / テンキー2
 * @value down
 * @option 左ボタン / カーソル左 / テンキー4
 * @value left
 * @option 右ボタン / カーソル右 / テンキー6
 * @value right
 * @option 上ボタン / カーソル上 / テンキー8
 * @value up
 * @option F9
 * @value debug
 * @default pagedown
 */

(() => {
  "use strict";

  const pluginName = document.currentScript.src
    .split("/")
    .pop()
    .replace(/\.js$/, "");
  const parameters = PluginManager.parameters(pluginName);
  const activation = Number(parameters["activation"] || 0);
  const excaliburKey = String(parameters["Excalibur Key"] || "pagedown");

  const _Scene_Battle_update = Scene_Battle.prototype.update;
  Scene_Battle.prototype.update = function () {
    _Scene_Battle_update.call(this);
    if (
      Input.isTriggered(excaliburKey) &&
      (activation === 0 || $gameSwitches.value(activation))
    ) {
      $gameTroop.members().forEach(function (enemy) {
        enemy.addState(1);
      });
      BattleManager.endTurn();
    }
  };
})();


code:
/*
 * --------------------------------------------------
 * MNKR_MenuCommand Ver.1.0.1
 * Copyright (c) 2020 Munokura
 * This software is released under the MIT license.
 * http://opensource.org/licenses/mit-license.php
 * --------------------------------------------------
 */

/*:
 * @param Max Cols
 * @text 横コマンド数
 * @type number
 * @min 1
 * @desc ツクールデフォルト:1
 * @default 2
 *
 * @param Command Alignment
 * @text コマンド行揃え
 * @type select
 * @option 左
 * @value left
 * @option 中央
 * @value center
 * @option 右
 * @value right
 * @desc 左:left / 中央:center / 右:right
 * ツクールデフォルト:left
 * @default left
 *
 * @plugindesc メインメニューのコマンドウィンドウの表示を設定します。
 * @author munokura
 *
 * @help
 * メインメニューのコマンドウィンドウの表示を設定します。
 *
 * 他の要素については「GUI画面デザインプラグイン（トリアコンタン様作）」で
 * 設定することをお勧めします。
 *
 * ---------------------------------------------------------------------------
 * https://triacontane.blogspot.com/2016/03/gui.html
 *   1. ウィンドウの横幅
 *   2. ウィンドウの高さ
 *   3. ウィンドウの余白
 *   4. ウィンドウのフォントサイズ
 *   5. ウィンドウの1行のあたりの高さ
 *   6. ウィンドウの背景透明度
 *   7. ウィンドウの行数
 *   8. ウィンドウの背景画像ファイル名
 *   9. ウィンドウのフォント名
 * ---------------------------------------------------------------------------
 *
 * プラグインコマンドはありません。
 *
 *
 * 利用規約:
 *   MITライセンスです。
 *   https://ja.osdn.net/projects/opensource/wiki/licenses%2FMIT_license
 *   作者に無断で改変、再配布が可能で、
 *   利用形態（商用、18禁利用等）についても制限はありません。
 */

(function () {
  "use strict";

  var parameters = PluginManager.parameters("MNKR_MenuCommand");
  var MaxCols = Number(parameters["Max Cols"] || 2);
  var CmdAlign = String(parameters["Command Alignment"] || "left");

  const _Window_MenuCommand_maxCols = Window_MenuCommand.prototype.maxCols;
  Window_MenuCommand.prototype.maxCols = function () {
    _Window_MenuCommand_maxCols.call(this);
    return MaxCols;
  };

  const _Window_MenuCommand_itemTextAlign =
    Window_MenuCommand.prototype.itemTextAlign;
  Window_MenuCommand.prototype.itemTextAlign = function () {
    _Window_MenuCommand_itemTextAlign.call(this);
    return CmdAlign;
  };
})();


code:
/*
 * --------------------------------------------------
 * MNKR_PartyCommandSkip Ver.1.0.0
 * Copyright (c) 2020 Munokura
 * This software is released under the MIT license.
 * http://opensource.org/licenses/mit-license.php
 * --------------------------------------------------
 */

/*:ja
 * @target MV
 * @url https://raw.githubusercontent.com/munokura/MNKR-MV-plugins/master/MNKR_PartyCommandSkip.js
 * @plugindesc 戦闘開始時にパーティコマンドを飛ばし、アクターコマンドから開始します。
 * @author munokura
 *
 * @help
 * 戦闘開始時にパーティコマンドを飛ばします。
 * 先頭のアクターでキャンセルすると、パーティコマンドに戻ります。
 *
 * パーティコマンドウィンドウでキャンセルすると、戦うを選んだ状態になります。
 *
 * プラグインコマンドはありません。
 *
 *
 * 利用規約:
 *   MITライセンスです。
 *   https://ja.osdn.net/projects/opensource/wiki/licenses%2FMIT_license
 *   作者に無断で改変、再配布が可能で、
 *   利用形態（商用、18禁利用等）についても制限はありません。
 */

(function () {
  "use strict";

  const _Scene_Battle_prototype_createPartyCommandWindow =
    Scene_Battle.prototype.createPartyCommandWindow;
  Scene_Battle.prototype.createPartyCommandWindow = function () {
    _Scene_Battle_prototype_createPartyCommandWindow.call(this);
    this._partyCommandWindow.setHandler("cancel", this.commandFight.bind(this));
  };

  const _Scene_Battle_prototype_startPartyCommandSelection =
    Scene_Battle.prototype.startPartyCommandSelection;
  Scene_Battle.prototype.startPartyCommandSelection = function () {
    this.selectNextCommand();
  };

  Scene_Battle.prototype.selectPreviousCommand = function () {
    BattleManager.selectPreviousCommand();
    if (BattleManager.isInputting() && BattleManager.actor()) {
      this.startActorCommandSelection();
    } else {
      _Scene_Battle_prototype_startPartyCommandSelection.call(this);
    }
  };
})();


code:
//===========================================================================
// MOG_EnemyHP.js
// Translate to Japanese : fungamemake.com
//===========================================================================

/*:
 * @plugindesc (v1.4) Apresenta o HP do inimigo ao ataca-lo.
 * @author Moghunter
 *
 * @param EHP Fade Duration
 * @desc Definição do tempo para ativar o fade.
 * (Default = 120)
 * @default 120
 *
 * @param EHP Layout X-Axis
 * @desc Posição X-Axis do layout.
 * @default 0
 *
 * @param EHP Layout Y-Axis
 * @desc Posição Y-Axis do layout.
 * @default 0
 *
 * @param EHP Meter X-Axis
 * @desc Posição X-Axis do medidor.
 * @default 4
 *
 * @param EHP Meter Y-Axis
 * @desc Posição Y-Axis do medidor.
 * @default 2
 +
 * @help
 * ===========================================================================
 * +++ MOG - Enemy HP Meter (v1.4) +++
 * By Moghunter
 * https://atelierrgss.wordpress.com/
 * ===========================================================================
 * Apresenta o HP do inimigo ao ataca-lo.
 * Serão necessários os arquivos. (img/system/)
 *
 * EnemyHP_A.png
 * EnemyHP_B.png
 *
 * Para ocultar o HP do inimigo use a seguinte Tag na caixa de notas
 *
 * Hide HP
 *
 * ===========================================================================
 * ** Histórico **
 * ===========================================================================
 * (v1.4) Melhoria na compatibilidade de plugins.
 * (v1.3) Correção do Crash relativo as Notetags.
 * (v1.2) Melhoria na codificação.
 * (v1.1) - Melhoria na animação do medidor vermelho.
 *      - Mudança da Tag para ocular o hp para HIDE HP.
 *      - Melhoria na codificação.
 */

/*:ja
 * @plugindesc (v1.4) 攻撃時に敵のHPをメーター表示します。
 * @author Moghunter
 *
 * @param EHP Fade Duration
 * @text フェード時間
 * @desc デフォルト:120
 * @default 120
 *
 * @param EHP Layout X-Axis
 * @text レイアウトのX軸位置
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 * @default 0
 *
 * @param EHP Layout Y-Axis
 * @text レイアウトのY軸の位置
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 * @default 0
 *
 * @param EHP Meter X-Axis
 * @text メーターのX軸位置
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 * @default 4
 *
 * @param EHP Meter Y-Axis
 * @text メーターのY軸位置
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 * @default 2
 *
 * @help
 * 翻訳:ムノクラ
 * https://fungamemake.com/
 * https://twitter.com/munokura/
 *
 * ===========================================================================
 * +++ MOG - Enemy HP Meter (v1.4) +++
 * By Moghunter
 * https://atelierrgss.wordpress.com/
 * ===========================================================================
 * 攻撃時に敵のHPをメーター表示します。
 * 画像ファイルが必要になります。
 * 下記フォルダへ保存してください。
 * (img/system/)
 *
 * EnemyHP_A.png
 * EnemyHP_B.png
 *
 * 敵のHPを隠すには、敵のメモ欄に下記のメモタグを入力してください。
 *
 * Hide HP
 *
 * ===========================================================================
 * ** 更新履歴 **
 * ===========================================================================
 * (v1.4) プラグインの互換性の改善
 * (v1.3) ノートタグのクラッシュ修正
 * (v1.2) コーディングの改善
 * (v1.1) - 赤いメーターのアニメーションを改善
 *        - HP HIDEのタグをHide HPに変更
 *        - コーディングの改善
 */

//===========================================================================
// ** PLUGIN PARAMETERS
//===========================================================================
var Imported = Imported || {};
Imported.MOG_EnemyHP = true;
var Moghunter = Moghunter || {};

Moghunter.parameters = PluginManager.parameters("MOG_EnemyHP");
Moghunter.enemyhp_a_x = Number(Moghunter.parameters["EHP Layout X-Axis"] || 0);
Moghunter.enemyhp_a_y = Number(Moghunter.parameters["EHP Layout Y-Axis"] || 0);
Moghunter.enemyhp_b_x = Number(Moghunter.parameters["EHP Meter X-Axis"] || 4);
Moghunter.enemyhp_b_y = Number(Moghunter.parameters["EHP Meter Y-Axis"] || 2);
Moghunter.enemyhp_duration = Number(
  Moghunter.parameters["EHP Fade Duration"] || 120
);

//===========================================================================
// ** Game Battler
//===========================================================================

//==============================
// * Notetags
//==============================
Game_Battler.prototype.notetags = function () {
  if (this.isEnemy()) {
    return this.enemy().note.split(/[\r\n]+/);
  }
  if (this.isActor()) {
    return this.actor().note.split(/[\r\n]+/);
  }
};

//===========================================================================
// ** Game_Enemy
//===========================================================================

//==============================
// * Setup
//==============================
var _alias_mog_gba_setup = Game_Enemy.prototype.setup;
Game_Enemy.prototype.setup = function (enemyId, x, y) {
  _alias_mog_gba_setup.call(this, enemyId, x, y);
  this._hp_meter = true;
  for (var i = 0; i < this.notetags().length; i++) {
    if (this.notetags()[i] == "Hide HP") {
      this._hp_meter = false;
    }
  }
};

//===========================================================================
// ** Spriteset_Battle
//===========================================================================

//==============================
// * CreateLowerLayer
//==============================
var _alias_mog_enemyhp_createUpperLayer =
  Spriteset_Battle.prototype.createUpperLayer;
Spriteset_Battle.prototype.createUpperLayer = function () {
  this.create_ehp_sprites();
  _alias_mog_enemyhp_createUpperLayer.call(this);
};

//==============================
// * Update
//==============================
var _alias_mog_enemyhp_update = Spriteset_Battle.prototype.update;
Spriteset_Battle.prototype.update = function () {
  _alias_mog_enemyhp_update.call(this);
  this.update_ehp_sprites();
};

//==============================
// * Create EHP Sprites
//==============================
Spriteset_Battle.prototype.create_ehp_sprites = function () {
  this._ehp_sprites_a = [];
  this._ehp_sprites_b = [];
  this._ehp_sprites_c = [];
  this._ehp_sprites_data = [];
  for (var i = 0; i < this._enemySprites.length; i++) {
    if (this._enemySprites[i]._battler == null) {
      return;
    }
    this._ehp_sprites_a[i] = new Sprite(ImageManager.loadSystem("EnemyHP_A"));
    this._ehp_sprites_b[i] = new Sprite(ImageManager.loadSystem("EnemyHP_B"));
    this._ehp_sprites_c[i] = new Sprite(ImageManager.loadSystem("EnemyHP_B"));
    this._ehp_sprites_a[i].opacity = 0;
    this._ehp_sprites_b[i].opacity = 0;
    this._ehp_sprites_c[i].opacity = 0;
    this._ehp_sprites_a[i].z = 50;
    this._ehp_sprites_b[i].z = 51;
    this._ehp_sprites_c[i].z = 52;
    if (!this._enemySprites[i]._battler._hp_meter) {
      this._ehp_sprites_a[i].visible = false;
    }
    this._ehp_sprites_b[i].visible = this._ehp_sprites_a[i].visible;
    this._ehp_sprites_c[i].visible = this._ehp_sprites_a[i].visible;
    this._battleField.addChild(this._ehp_sprites_a[i]);
    this._battleField.addChild(this._ehp_sprites_b[i]);
    this._battleField.addChild(this._ehp_sprites_c[i]);
    this._ehp_sprites_data[i] = [
      this._enemySprites[i]._battler.hp,
      0,
      0,
      Math.max(Moghunter.enemyhp_duration, 32),
      this._enemySprites[i]._battler.hp,
    ];
  }
};

//==============================
// * Update EHP Sprites
//==============================
Spriteset_Battle.prototype.update_ehp_sprites = function () {
  for (var i = 0; i < this._enemySprites.length; i++) {
    if (this._ehp_sprites_a[i] == null) {
      return;
    }
    if (!this._ehp_sprites_a[i].bitmap.isReady()) {
      return;
    }
    this._ehp_sprites_a[i].x =
      this._enemySprites[i].x +
      Moghunter.enemyhp_a_x +
      this._ehp_sprites_data[i][1] -
      this._ehp_sprites_a[i].bitmap.width / 2;
    this._ehp_sprites_a[i].y = this._enemySprites[i].y + Moghunter.enemyhp_a_y;
    this._ehp_sprites_b[i].x = this._ehp_sprites_a[i].x + Moghunter.enemyhp_b_x;
    this._ehp_sprites_b[i].y = this._ehp_sprites_a[i].y + Moghunter.enemyhp_b_y;
    this._ehp_sprites_c[i].x = this._ehp_sprites_a[i].x + Moghunter.enemyhp_b_x;
    this._ehp_sprites_c[i].y = this._ehp_sprites_a[i].y + Moghunter.enemyhp_b_y;
    this._ehp_sprites_b[i].opacity = this._ehp_sprites_a[i].opacity;
    this._ehp_sprites_c[i].opacity = this._ehp_sprites_a[i].opacity;
    this.update_ehp_red_bar(i);
    this.update_ehp_blue_bar(i);
  }
};

//==============================
// * Update EHP Blue Bar
//==============================
Spriteset_Battle.prototype.update_ehp_blue_bar = function (i) {
  if (this._enemySprites[i]._battler.isDead()) {
    this._ehp_sprites_a[i].opacity -= 2;
  }
  if (this._ehp_sprites_data[i][2] > 0) {
    this._ehp_sprites_data[i][2] -= 1;
  }
  if (this._ehp_sprites_data[i][2] > this._ehp_sprites_data[i][3]) {
    this._ehp_sprites_data[i][1] += 2;
    this._ehp_sprites_a[i].opacity += 17;
  } else {
    if (
      this._ehp_sprites_data[i][1] < 30 &&
      this._ehp_sprites_data[i][2] <= 15
    ) {
      this._ehp_sprites_data[i][1] += 2;
      this._ehp_sprites_a[i].opacity -= 17;
    }
  }
  if (this._ehp_sprites_data[i][0] != this._enemySprites[i]._battler.hp) {
    if (
      this._ehp_sprites_data[i][2] > 15 &&
      this._ehp_sprites_data[i][2] <= this._ehp_sprites_data[i][3]
    ) {
      this._ehp_sprites_data[i][2] = this._ehp_sprites_data[i][3];
    } else {
      this._ehp_sprites_data[i][1] = -30;
      this._ehp_sprites_data[i][2] = this._ehp_sprites_data[i][3] + 15;
    }
  }
  this._ehp_sprites_data[i][0] = this._enemySprites[i]._battler.hp;
  var meter_rate =
    (this._ehp_sprites_c[i].bitmap.width * this._enemySprites[i]._battler.hp) /
    this._enemySprites[i]._battler.mhp;
  this._ehp_sprites_c[i].setFrame(
    0,
    0,
    meter_rate,
    this._ehp_sprites_c[i].bitmap.height / 2
  );
};

//==============================
// * Update EHP Red Bar
//==============================
Spriteset_Battle.prototype.update_ehp_red_bar = function (i) {
  if (this._ehp_sprites_data[i][4] != this._enemySprites[i]._battler.hp) {
    var dnspeed =
      1 +
      Math.abs(
        this._ehp_sprites_data[i][4] - this._enemySprites[i]._battler.hp
      ) /
        (Moghunter.enemyhp_duration / 2);
    if (this._ehp_sprites_data[i][4] > this._enemySprites[i]._battler.hp) {
      this._ehp_sprites_data[i][4] -= dnspeed;
      if (this._ehp_sprites_data[i][4] < this._enemySprites[i]._battler.hp) {
        this._ehp_sprites_data[i][4] = this._enemySprites[i]._battler.hp;
      }
    } else if (
      this._ehp_sprites_data[i][4] < this._enemySprites[i]._battler.hp
    ) {
      this._ehp_sprites_data[i][4] += dnspeed;
      if (this._ehp_sprites_data[i][4] > this._enemySprites[i]._battler.hp) {
        this._ehp_sprites_data[i][4] = this._enemySprites[i]._battler.hp;
      }
    }
    var meter_rate =
      (this._ehp_sprites_b[i].bitmap.width * this._ehp_sprites_data[i][4]) /
      this._enemySprites[i]._battler.mhp;
    this._ehp_sprites_b[i].setFrame(
      0,
      this._ehp_sprites_b[i].bitmap.height / 2,
      meter_rate,
      this._ehp_sprites_b[i].bitmap.height / 2
    );
  }
};


code:
//=============================================================================
// MPP_ChoiceEX.js
//=============================================================================
// Copyright (c) 2015-2019 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc 【ver.3.11】選択肢の機能拡張
 * @author 木星ペンギン
 *
 * @help ※[]内は未設定でも動作します。
 * プラグインコマンド:
 *   ChoicePos x y[ row]    # 選択肢の位置(x,y)と行数(row)指定
 *   ChoiceVariableId n     # 選択肢のデフォルト位置を変数n番にする
 *   ChoiceRect x y width height
 *                          # 選択肢の座標とサイズを指定
 *   ChoiceUnderMessage     # 選択肢をメッセージの下に表示
 *
 * ※ プラグインコマンドにて指定する値には変数が使用できます。
 *    v[n] と記述することでn番の変数の値を参照します。
 *
 * 注釈:
 *   選択肢ヘルプ             # 各項目の下に設定することでヘルプを表示させる
 *
 * 選択肢テキスト:
 *   if(条件)                # 条件が偽になると項目が表示されなくなる
 *   en(条件)                # 条件が偽になると項目が選択不可
 *
 * ================================================================
 * ▼ 使い方
 * --------------------------------
 *  〇 選択肢を増やす
 *   イベントコマンド『選択肢の表示』を続けて配置すると
 *   一つの選択肢にまとめられます。
 *   まとめたくない場合は、間に注釈などを入れることで
 *   通常通り分けることができます。
 *
 *   『デフォルト』の処理は、なし以外を設定したものが適用されます。
 *   『デフォルト』の処理が複数ある場合、
 *   後に設定された選択肢のものが適用されます。
 *
 *   『キャンセル』の処理は、禁止以外を設定したものが適用されます。
 *   『キャンセル』の処理が複数ある場合、
 *   後に設定された選択肢のものが適用されます。
 *
 *  『背景』と『ウィンドウ位置』は後の選択肢のものが適用されます。
 *
 *
 * ================================================================
 * ▼ プラグインコマンド 詳細
 * --------------------------------
 *  〇 ChoicePos x y[ row]
 *      x   : 選択肢ウィンドウのX座標
 *      y   : 選択肢ウィンドウのY座標
 *      row : 選択肢ウィンドウの行数。未設定の場合はすべて表示
 *
 *   次に表示する選択肢の位置(x,y)と行数(row)指定します。
 *
 * --------------------------------
 *  〇 ChoiceVariableId n
 *      n : 変数番号
 *
 *   次に表示する選択肢のデフォルト位置を変数の値にします。
 *   さらに現在のカーソル位置を変数に入れます。
 *
 *   カーソル位置は最初の選択肢が上から0～5、次の選択肢は10～15と、
 *   選択肢毎に+10されます。
 *
 *   変数に入った値の項目が表示されない場合、なしと同じ処理をします。
 *
 * --------------------------------
 *  〇 ChoiceRect x y width height
 *      x      : X座標
 *      y      : Y座標
 *      width  : 幅
 *      height : 高さ
 *
 *   次に表示する選択肢の座標とサイズを指定します。
 *
 *   各項目、未設定もしくは-1を指定した場合、通常の値が適用されます。
 *
 * --------------------------------
 *  〇 ChoiceUnderMessage
 *
 *   次に表示する選択肢をメッセージウィンドウ内に表示させます。
 *
 *   この機能は[文章の表示]と併用しなければ機能しません。
 *   [文章の表示]の前に実行してください。
 *
 *   選択肢ウィンドウの[背景]は設定したものが適用されます。
 *
 *
 * ================================================================
 * ▼ 選択肢テキスト 詳細
 * --------------------------------
 *  〇 項目が表示される条件の設定
 *   選択肢の文章中に
 *     if(条件)
 *   と入れ、その条件が偽になると項目が表示されなくなります。
 *
 *   『デフォルト』の項目が表示されない場合の動作は、
 *   プラグインパラメータの[Disabled Index]にて設定できます。
 *
 *   『キャンセル』の項目が表示されない場合、禁止と同じ処理をします。
 *
 *   条件内では s でスイッチ、v で変数を参照できます。
 *
 *     例：if(s[1]) とした場合
 *          => スイッチ１番がONで表示、OFFで非表示。
 *        if(!s[2]) とした場合
 *          => スイッチ２番がOFFで表示、ONで非表示。
 *        if(v[5]>0) とした場合
 *          => 変数５番が0より大きければ表示、0以下で非表示。
 *
 *     変数で使える不等号
 *       === : 等しい
 *       !== : 等しくない
 *       <   : より小さい
 *       <=  : より小さいまたは等しい
 *       >   : より大きい
 *       >=  : より大きいまたは等しい
 *
 *     条件式はeval関数で処理されているため、他演算子も使用できます。
 *
 * --------------------------------
 *  〇 項目を半透明で表示する条件の設定
 *   選択肢の文章中に
 *     en(条件)
 *   と入れ、その条件が偽になると項目が半透明で表示されます。
 *   半透明となった項目は選択できなくなります。
 *
 *   条件は上の『項目が表示される条件の設定』と同じです。
 *
 *   『キャンセル』の項目が半透明の場合、ブザーが鳴ります。
 *
 *
 * ================================================================
 * ▼ プラグインパラメータ 詳細
 * --------------------------------
 *  〇 Disabled Index
 *
 *   [デフォルト]となる項目がif(条件)により非表示となった場合、
 *   デフォルト位置をどこにするかを設定します。
 *
 *     none : [なし]と同じ
 *     top  : 先頭の項目
 *
 * --------------------------------
 *  〇 Plugin Commands / Event Comment
 *
 *   プラグインコマンドや注釈で使用するコマンドは、
 *   プラグインパラメータから変更できます。
 *
 *   コマンドを短くしたり日本語にしたりなどして、
 *   自分が使いやすいようにしてください。
 *
 *   プラグインコマンドのみ、変更後もデフォルトのコマンドでも動作します。
 *
 *
 * ================================================================
 * ▼ その他
 * --------------------------------
 *  〇 プラグインコマンドの実行タイミング
 *   プラグインコマンドを使用する場合、[選択肢の表示]の前に実行するのが
 *   好ましいです。
 *   ただし、メッセージウィンドウを表示したまま選択肢の処理を実行したい場合、
 *   [文章の表示]より前にプラグインコマンドを実行してください。
 *
 * --------------------------------
 *  〇 ヘルプメッセージの表示
 *   各選択肢項目の下に注釈で以下の文字列を入れると、
 *   続きの文章をヘルプメッセージとしてカーソルを合わせたときに
 *   標示させることができます。
 *
 *     選択肢ヘルプ
 *
 *   ※注意点
 *    ヘルプメッセージは[文章の表示]と同じ機能を使っているため、
 *    制御文字が使用できます。
 *    ただし、\!と\^は使用できません。
 *
 * ================================
 * 制作 : 木星ペンギン
 * URL : http://woodpenguin.blog.fc2.com/
 *
 * @param maxPageRow
 * @type number
 * @desc 1ページに表示される行数
 * @default 6
 *
 * @param Disabled Index
 * @type select
 * @option none
 * @option top
 * @desc [デフォルト]となる選択肢が表示されない場合のデフォルト位置
 * @default none
 *
 *
 * @param === Command ===
 *
 * @param Plugin Commands
 * @type struct<Plugin>
 * @desc プラグインコマンド名
 * @default {"ChoicePos":"ChoicePos","ChoiceVariableId":"ChoiceVariableId","ChoiceRect":"ChoiceRect","ChoiceUnderMessage":"ChoiceUnderMessage"}
 * @parent === Command ===
 *
 * @param Event Comment
 * @type struct<EventComment>
 * @desc イベントの注釈で使うコマンド名
 * @default {"ChoiceHelp":"選択肢ヘルプ"}
 * @parent === Command ===
 *
 */

/*~struct~Plugin:
 * @param ChoicePos
 * @desc 選択肢の位置(x,y)と行数(row)指定
 * @default ChoicePos
 *
 * @param ChoiceVariableId
 * @desc 選択肢のデフォルト位置を変数n番にする
 * @default ChoiceVariableId
 *
 * @param ChoiceRect
 * @desc 選択肢の座標とサイズ(x,y,width,height)指定
 * @default ChoiceRect
 *
 * @param ChoiceUnderMessage
 * @desc 選択肢をメッセージの下に表示
 * @default ChoiceUnderMessage
 *
 */

/*~struct~EventComment:
 * @param ChoiceHelp
 * @desc 各項目の下に設定することでヘルプを表示させる
 * @default 選択肢ヘルプ
 */

(function () {
  const MPPlugin = {};

  {
    let parameters = PluginManager.parameters("MPP_ChoiceEX");

    MPPlugin.maxPageRow = Number(parameters["maxPageRow"]);
    MPPlugin.DisabledIndex = parameters["Disabled Index"];

    MPPlugin.PluginCommands = JSON.parse(parameters["Plugin Commands"]);
    MPPlugin.EventComment = JSON.parse(parameters["Event Comment"]);
  }

  const Alias = {};

  //-----------------------------------------------------------------------------
  // Game_Message

  //15
  Alias.GaMe_clear = Game_Message.prototype.clear;
  Game_Message.prototype.clear = function () {
    Alias.GaMe_clear.apply(this, arguments);
    this._choiceEnables = [];
    this._choiceResults = [];
    this._helpTexts = [];
    this._choiceX = -1;
    this._choiceY = -1;
    this._choiceWidth = -1;
    this._choiceHeight = -1;
    this._choiceMaxRow = MPPlugin.maxPageRow;
    this._choiceVariableId = 0;
    this.choiceUnderMes = false;
  };

  Game_Message.prototype.setChoiceEnables = function (enables) {
    this._choiceEnables = enables;
  };

  Game_Message.prototype.choiceEnables = function () {
    return this._choiceEnables;
  };

  Game_Message.prototype.setChoiceResults = function (results) {
    this._choiceResults = results;
  };

  Game_Message.prototype.setChoiceHelpTexts = function (texts) {
    this._helpTexts = texts;
  };

  Game_Message.prototype.isHelp = function () {
    return this._helpTexts.length > 0;
  };

  Game_Message.prototype.setChoicePos = function (x, y, row) {
    this._choiceX = x;
    this._choiceY = y;
    this._choiceWidth = -1;
    this._choiceHeight = -1;
    this._choiceMaxRow = row;
  };

  Game_Message.prototype.setChoiceRect = function (x, y, width, height) {
    this._choiceX = x;
    this._choiceY = y;
    this._choiceWidth = width;
    this._choiceHeight = height;
  };

  Game_Message.prototype.setChoiceVariableId = function (id) {
    this._choiceVariableId = id;
  };

  Game_Message.prototype.shiftLine = function (height) {
    this._choiceY += height;
    this._choiceHeight -= height;
  };

  //-----------------------------------------------------------------------------
  // Game_Interpreter

  //336
  Game_Interpreter.prototype.setupChoices = function (params) {
    var data = {
      choices: [],
      enables: [],
      results: [],
      helpTexts: [],
      cancelType: -1,
      defaultType: -1,
      positionType: 0,
      background: 0,
    };
    data = this.addChoices(params, this._index, data, 0);
    if (data.choices.length > 0) {
      var helpTexts = [];
      if (data.helpTexts.length > 0) {
        helpTexts = data.results.map((i) => data.helpTexts[i]);
      }
      var cancelType = -1;
      if (
        data.cancelType.mod(10) === 8 ||
        data.results.contains(data.cancelType)
      ) {
        data.results.push(data.cancelType);
        cancelType = data.choices.length;
      }
      var index = data.defaultType;
      if ($gameMessage._choiceVariableId > 0) {
        index = $gameVariables.value($gameMessage._choiceVariableId);
      }
      var defaultType = data.results.indexOf(index);
      if (index >= 0 && defaultType < 0 && MPPlugin.DisabledIndex === "top") {
        defaultType = 0;
      }
      $gameMessage.setChoices(data.choices, defaultType, cancelType);
      $gameMessage.setChoiceEnables(data.enables);
      $gameMessage.setChoiceResults(data.results);
      $gameMessage.setChoiceHelpTexts(helpTexts);
      $gameMessage.setChoiceBackground(data.background);
      $gameMessage.setChoicePositionType(data.positionType);
      $gameMessage.setChoiceCallback(
        (n) => (this._branch[this._indent] = data.results[n])
      );
    } else {
      this._branch[this._indent] = -1;
    }
  };

  Game_Interpreter.prototype.addChoices = function (params, i, data, d) {
    var regIf = /\s*if\((.+?)\)/;
    var regEn = /\s*en\((.+?)\)/;
    for (var n = 0; n < params[0].length; n++) {
      var str = params[0][n];
      if (regIf.test(str)) {
        str = str.replace(regIf, "");
        if (RegExp.$1 && !this.evalChoice(RegExp.$1)) continue;
      }
      var enable = true;
      if (regEn.test(str)) {
        str = str.replace(regEn, "");
        enable = this.evalChoice(RegExp.$1);
      }
      data.choices.push(str);
      data.enables.push(enable);
      data.results.push(n + d);
    }
    var cancelType = params[1];
    if (cancelType !== -1) {
      data.cancelType = cancelType + d;
    }
    var defaultType = params.length > 2 ? params[2] : 0;
    if (defaultType >= 0) {
      data.defaultType = defaultType + d;
    }
    data.positionType = params.length > 3 ? params[3] : 2;
    data.background = params.length > 4 ? params[4] : 0;
    var command;
    for (;;) {
      i++;
      command = this._list[i];
      if (!command) break;
      if (command.indent === this._indent) {
        if (command.code === 402) {
          this.getHelpText(command.parameters[0] + d, i + 1, data);
        } else if (command.code === 404) {
          break;
        }
      }
    }
    command = this._list[i + 1];
    if (command && command.code === 102) {
      this.addChoices(command.parameters, i + 1, data, d + 10);
    }
    return data;
  };

  Game_Interpreter.prototype.getHelpText = function (c, i, data) {
    var command = MPPlugin.EventComment.ChoiceHelp || "選択肢ヘルプ";
    if (this._list[i].code === 108 && this._list[i].parameters[0] === command) {
      var texts = [];
      while (this._list[i + 1].code === 408) {
        i++;
        texts.push(this._list[i].parameters[0]);
      }
      data.helpTexts[c] = texts;
    }
  };

  Game_Interpreter.prototype.evalChoice = function (formula) {
    try {
      var s = $gameSwitches._data;
      var formula2 = formula.replace(/v\[(\d+)\]/g, (match, p1) =>
        $gameVariables.value(parseInt(p1))
      );
      return !!eval(formula2);
    } catch (e) {
      alert("条件エラー \n\n " + formula);
      return true;
    }
  };

  //362
  Game_Interpreter.prototype.command403 = function () {
    if (this._branch[this._indent] !== -2) {
      this.skipBranch();
    }
    return true;
  };

  Game_Interpreter.prototype.command404 = function () {
    if (this.nextEventCode() === 102) {
      this._branch[this._indent] -= 10;
      this._index++;
    }
    return true;
  };

  //1739
  Alias.GaIn_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    Alias.GaIn_pluginCommand.apply(this, arguments);
    var args2 = this.mppPluginCommandArgs(args);
    switch (command) {
      case MPPlugin.PluginCommands.ChoicePos:
      case "ChoicePos":
        var x = args2[0];
        var y = args2[1];
        var row = args2[2] || 99;
        $gameMessage.setChoicePos(x, y, row);
        break;
      case MPPlugin.PluginCommands.ChoiceVariableId:
      case "ChoiceVariableId":
        $gameMessage.setChoiceVariableId(args2[0]);
        break;
      case MPPlugin.PluginCommands.ChoiceRect:
      case "ChoiceRect":
        var x = args2[0] === undefined ? -1 : args2[0];
        var y = args2[1] === undefined ? -1 : args2[1];
        var width = args2[2] === undefined ? -1 : args2[2];
        var height = args2[3] === undefined ? -1 : args2[3];
        $gameMessage.setChoiceRect(x, y, width, height);
        break;
      case MPPlugin.PluginCommands.ChoiceUnderMessage:
      case "ChoiceUnderMessage":
        $gameMessage.choiceUnderMes = true;
        break;
    }
    return true;
  };

  Game_Interpreter.prototype.mppPluginCommandArgs = function (args) {
    var v = $gameVariables._data;
    return args.map(function (arg) {
      try {
        return eval(arg) || 0;
      } catch (e) {
        return arg;
      }
    });
  };

  //-----------------------------------------------------------------------------
  // Window

  Window.prototype.isClearWindowRect = function () {
    return true;
  };

  //-----------------------------------------------------------------------------
  // WindowLayer

  //7100
  Alias.WiLa__canvasClearWindowRect =
    WindowLayer.prototype._canvasClearWindowRect;
  WindowLayer.prototype._canvasClearWindowRect = function (
    renderSession,
    window
  ) {
    if (window.isClearWindowRect())
      Alias.WiLa__canvasClearWindowRect.apply(this, arguments);
  };

  //7162
  Alias.WiLa__maskWindow = WindowLayer.prototype._maskWindow;
  WindowLayer.prototype._maskWindow = function (window, shift) {
    Alias.WiLa__maskWindow.apply(this, arguments);
    if (!window.isClearWindowRect()) {
      var rect = this._windowRect;
      rect.x = 0;
      rect.y = 0;
      rect.width = 0;
      rect.height = 0;
    }
  };

  //-----------------------------------------------------------------------------
  // Window_ChoiceList

  Window_ChoiceList.prototype.isClearWindowRect = function () {
    return !this._underMessage;
  };

  if (Window_ChoiceList.prototype.hasOwnProperty("close")) {
    Alias.WiChLi_close = Window_ChoiceList.prototype.close;
  }
  Window_ChoiceList.prototype.close = function () {
    if ($gameMessage.isHelp()) this._messageWindow.onShowFast();
    var _super = Alias.WiChLi_close || Window_Command.prototype.close;
    _super.apply(this, arguments);
  };

  if (Window_ChoiceList.prototype.hasOwnProperty("select")) {
    Alias.WiChli_select = Window_ChoiceList.prototype.select;
  }
  Window_ChoiceList.prototype.select = function (index) {
    var variableId = $gameMessage._choiceVariableId;
    if (index !== this.index() && variableId > 0) {
      var results = $gameMessage._choiceResults;
      $gameVariables.setValue(variableId, results[index]);
    }
    var _super = (Alias.WiChli_select = Window_Command.prototype.select);
    _super.apply(this, arguments);
  };

  //34
  Alias.WiChLi_updatePlacement = Window_ChoiceList.prototype.updatePlacement;
  Window_ChoiceList.prototype.updatePlacement = function () {
    Alias.WiChLi_updatePlacement.apply(this, arguments);
    if ($gameMessage._choiceWidth >= 0) {
      this.width = Math.min($gameMessage._choiceWidth, Graphics.boxWidth);
    }
    if ($gameMessage._choiceHeight >= 0) {
      this.height = Math.min($gameMessage._choiceHeight, Graphics.boxHeight);
    }
    if ($gameMessage._choiceX >= 0) {
      this.x = Math.min($gameMessage._choiceX, Graphics.boxWidth - this.width);
    }
    if ($gameMessage._choiceY >= 0) {
      this.y = Math.min(
        $gameMessage._choiceY,
        Graphics.boxHeight - this.height
      );
    }
    this._underMessage = $gameMessage.choiceUnderMes;
  };

  //67
  Window_ChoiceList.prototype.numVisibleRows = function () {
    return Math.min($gameMessage.choices().length, $gameMessage._choiceMaxRow);
  };

  //103
  Window_ChoiceList.prototype.makeCommandList = function () {
    var choices = $gameMessage.choices();
    var enables = $gameMessage._choiceEnables;
    for (var i = 0; i < choices.length; i++) {
      this.addCommand(choices[i], "choice", enables[i]);
    }
  };

  //110
  Alias.WiChLi_drawItem = Window_ChoiceList.prototype.drawItem;
  Window_ChoiceList.prototype.drawItem = function (index) {
    this.changePaintOpacity(this.isCommandEnabled(index));
    Alias.WiChLi_drawItem.apply(this, arguments);
  };

  //123
  Alias.WiChLi_callOkHandler = Window_ChoiceList.prototype.callOkHandler;
  Window_ChoiceList.prototype.callOkHandler = function () {
    Alias.WiChLi_callOkHandler.apply(this, arguments);
    this._messageWindow.forceClear();
  };

  //129
  Alias.WiChLi_callCancelHandler =
    Window_ChoiceList.prototype.callCancelHandler;
  Window_ChoiceList.prototype.callCancelHandler = function () {
    Alias.WiChLi_callCancelHandler.apply(this, arguments);
    this._messageWindow.forceClear();
  };

  if (Window_ChoiceList.prototype.hasOwnProperty("processCancel")) {
    Alias.WiChLi_processCancel = Window_ChoiceList.prototype.processCancel;
  }
  Window_ChoiceList.prototype.processCancel = function () {
    var type = $gameMessage.choiceCancelType();
    var results = $gameMessage._choiceResults;
    var index = results.indexOf(results[type]);
    if (
      this.isCancelEnabled() &&
      index !== type &&
      !this.isCommandEnabled(index)
    ) {
      this.playBuzzerSound();
    } else {
      var _super =
        Alias.WiChLi_processCancel || Window_Command.prototype.processCancel;
      _super.apply(this, arguments);
    }
  };

  Window_ChoiceList.prototype.callUpdateHelp = function () {
    if (this.active && this._messageWindow && $gameMessage.isHelp())
      this.updateHelp();
  };

  Window_ChoiceList.prototype.updateHelp = function () {
    this._messageWindow.forceClear();
    var texts = $gameMessage._helpTexts[this.index()];
    $gameMessage._texts = texts ? texts.clone() : [""];
    this._messageWindow.startMessage();
  };

  //-----------------------------------------------------------------------------
  // Window_Message

  //109
  Alias.WiMe_updatePlacement = Window_Message.prototype.updatePlacement;
  Window_Message.prototype.updatePlacement = function () {
    Alias.WiMe_updatePlacement.apply(this, arguments);
    this.clearUnderChoice();
  };

  Window_Message.prototype.clearUnderChoice = function () {
    if ($gameMessage.choiceUnderMes) {
      var x = this.x + this.standardPadding();
      x += this._textState.left || 0;
      var y = this.y + 4;
      var height = this.windowHeight();
      $gameMessage.setChoiceRect(x, y, -1, height);
    }
  };

  if (Window_Message.prototype.hasOwnProperty("processNewLine")) {
    Alias.WiMe_processNewLine = Window_Message.prototype.processNewLine;
  }
  Window_Message.prototype.processNewLine = function (textState) {
    if ($gameMessage.choiceUnderMes) $gameMessage.shiftLine(textState.height);
    var _super =
      Alias.WiMe_processNewLine || Window_Base.prototype.processNewLine;
    _super.apply(this, arguments);
  };

  //149
  Alias.WiMe_updateInput = Window_Message.prototype.updateInput;
  Window_Message.prototype.updateInput = function () {
    if ($gameMessage.isHelp() && this._textState) return false;
    return Alias.WiMe_updateInput.apply(this, arguments);
  };

  //196
  Alias.WiMe_onEndOfText = Window_Message.prototype.onEndOfText;
  Window_Message.prototype.onEndOfText = function () {
    if ($gameMessage.isHelp() && !this._choiceWindow.active) {
      this.startInput();
    } else {
      Alias.WiMe_onEndOfText.apply(this, arguments);
    }
  };

  //207
  Alias.WiMe_startInput = Window_Message.prototype.startInput;
  Window_Message.prototype.startInput = function () {
    if (this._choiceWindow.active) return true;
    if (
      $gameMessage.isChoice() &&
      $gameMessage.choiceUnderMes &&
      this._textState.x !== this._textState.left
    ) {
      $gameMessage.shiftLine(this._textState.height);
    }
    return Alias.WiMe_startInput.apply(this, arguments);
  };

  Window_Message.prototype.forceClear = function () {
    this._textState = null;
    this.close();
    this._goldWindow.close();
  };

  Window_Message.prototype.onShowFast = function () {
    this._showFast = true;
  };

  //243
  Alias.WiMe_newPage = Window_Message.prototype.newPage;
  Window_Message.prototype.newPage = function (textState) {
    Alias.WiMe_newPage.apply(this, arguments);
    this.clearUnderChoice();
  };
})();


code:
//=============================================================================
// MPP_EquipStatusEX.js
//=============================================================================
// Copyright (c) 2018-2019 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc 【ver.3.1】装備ステータスの拡張
 * @author 木星ペンギン
 *
 * @help 武器・防具のメモ:
 *   <mppEqSt:name1[,name2[,name3[,...]]]>   # 装備変更時に name を表示
 *
 * ================================================================
 * ▼ 武器・防具のメモ 詳細
 * --------------------------------
 *  〇 <mppEqSt:name1[,name2[,name3[,...]]]>
 *   装備変更時のステータスウィンドウにオリジナルのパラメータ名を表示させます。
 *
 *   例:
 *    <mppEqSt:炎半減,氷半減> と記述したアイテムを装備した場合、
 *    [炎半減]と[氷半減]が表示されます。
 *
 *
 * ================================================================
 * ▼プラグインパラメータ詳細
 * --------------------------------
 *  〇 Max Square (数値が増えるほどゲージの増加量を減らす)
 *   ステータスの値が低いほどゲージが伸び、高くなってくるとゲージの増加量が
 *   減るようになります。
 *
 *   ゲームの後半でステータスが高くなるようなゲームだと、
 *   ステータスの低い序盤ではゲージの変化がわかりにくいため、
 *   その対策として用意した機能です。
 *
 *   この設定は通常能力値のみに適用されます。
 *
 * --------------------------------
 *  〇 Status (能力値)
 *   [通常ステータス] : 装備スロット選択中に表示されるステータス
 *   [固定ステータス] : 変更後のアイテムを選択中、常に表示されるステータス
 *   [装備ステータス] : 変更後のアイテムを選択中、
 *                      装備品に含まれる場合に表示されるステータス
 *   [変動ステータス] : 変更後のアイテムを選択中、
 *                      変更がある場合に表示されるステータス
 *
 *   設定する数値は以下の通りです。
 *
 *     0:最大ＨＰ, 1:最大ＭＰ, 2:攻撃力, 3:防御力,
 *     4:魔法力,   5:魔法防御, 6:敏捷性, 7:運,
 *
 *     8:命中率,      9:回避率,     10:会心率, 11:会心回避率,
 *    12:魔法回避率, 13:魔法反射率, 14:反撃率, 15:ＨＰ再生率,
 *    16:ＭＰ再生率, 17:ＴＰ再生率,
 *
 *    18:狙われ率,   19:防御効果率,     20:回復効果率,   21:薬の知識,
 *    22:ＭＰ消費率, 23:ＴＰチャージ率, 24:物理ダメージ, 25:魔法ダメージ,
 *    26:床ダメージ, 27:経験獲得率
 *
 * --------------------------------
 *  〇 Rate (耐性)
 *   Reverse?(反転表示)を有効にした場合、表示される数値が
 *     (1 - 有効度)*100
 *   となります。
 *   (例：有効度80%の場合は20、有効度30%の場合は70)
 *   これは[有効度]ではなく[耐性値]として表示するための機能です。
 *
 *   表示タイプにて表示する条件を指定します。
 *    0 : 非表示
 *    1 : [固定ステータス]として表示
 *    2 : [装備ステータス]として表示
 *    3 : [変動ステータス]として表示
 *    4 : [装備ステータス]または[変動ステータス]として表示
 *
 * --------------------------------
 *  〇 プラグインパラメータの配列
 *   数値を配列で設定する際、
 *   n-m と表記することでnからmまでの数値を指定できます。
 *   (例 : 1-4,8,10-12 => 1,2,3,4,8,10,11,12)
 *
 * --------------------------------
 *  〇 Equip Metadata
 *   プラグインコマンド名を変更できます。
 *   コマンドを短くしたり日本語化等が可能です。
 *
 * ================================
 * 制作 : 木星ペンギン
 * URL : http://woodpenguin.blog.fc2.com/
 *
 * @param === Base ===
 * @default 【基本設定】
 *
 * @param Status Window Row
 * @type number
 * @min 1
 * @desc ステータスウィンドウの行数
 * @default 7
 * @parent === Base ===
 *
 * @param Gauge Height
 * @type number
 * @min 1
 * @desc ゲージの高さ
 * @default 8
 * @parent === Base ===
 *
 * @param Gauge Color
 * @desc 現在値のゲージの色
 * @default 232,255,255
 * @parent === Base ===
 *
 * @param Gauge Type
 * @type select
 * @option 0:通常
 * @value 0
 * @option 1:丸み
 * @value 1
 * @option 2:2ライン
 * @value 2
 * @desc ゲージタイプ
 * @default 0
 * @parent === Base ===
 *
 * @param Gauge Slope
 * @type number
 * @min -1
 * @max 1
 * @decimals 1
 * @desc ゲージの傾き
 * (-1.0～1.0で指定)
 * @default -0.5
 * @parent === Base ===
 *
 *
 * @param === Gauge Max ===
 * @default 【ゲージの最大値】
 *
 * @param param Gauge Max
 * @type struct<ParamGaugeMax>
 * @desc 通常能力値ゲージの最大値
 * @default {"mhp":"10000","mmp":"2000","atk":"200","def":"200","mat":"200","mdf":"200","agi":"400","luk":"400"}
 * @parent === Gauge Max ===
 *
 * @param Max Square
 * @type boolean
 * @desc 数値が増えるほどゲージの増加量を減らす
 * @default false
 * @parent param Gauge Max
 *
 * @param xparam Gauge Max
 * @type number
 * @min 1
 * @decimals 2
 * @desc 追加能力値ゲージの最大値
 * @default 2.50
 * @parent === Gauge Max ===
 *
 * @param sparam Gauge Max
 * @type number
 * @min 1
 * @decimals 2
 * @desc 特殊能力値ゲージの最大値
 * @default 2.50
 * @parent === Gauge Max ===
 *
 * @param rate Gauge Max
 * @type number
 * @min 1
 * @decimals 2
 * @desc 有効度ゲージの最大値
 * @default 2.50
 * @parent === Gauge Max ===
 *
 *
 * @param === Status ===
 * @default 【能力値】
 *
 * @param Default Status
 * @desc 装備スロット選択中に表示されるステータス
 * @default 2-7
 * @parent === Status ===
 *
 * @param Fixing Status
 * @desc 変更後のアイテムを選択中、常に表示されるステータス
 * @default
 * @parent === Status ===
 *
 * @param Item Status
 * @desc 変更後のアイテムを選択中、装備品に含まれる場合に表示されるステータス
 * @default 0-27
 * @parent === Status ===
 *
 * @param Flow Status
 * @desc 変更後のアイテムを選択中、ステータスに変更がある場合に表示されるステータス
 * @default 0-27
 * @parent === Status ===
 *
 *
 * @param === Trait ===
 * @default 【特徴】
 *
 * @param Element Rate Params
 * @type struct<Rate>
 * @desc 属性有効度
 * @default {"Draw Ids":"1-9","Reverse?":"true","View Type":"4"}
 * @parent === Trait ===
 *
 * @param Debuff Rate Params
 * @type struct<DebuffRate>
 * @desc 弱体有効度
 * @default {"Draw Params":"0-7","Reverse?":"true","View Type":"4"}
 * @parent === Trait ===
 *
 * @param State Rate Params
 * @type struct<Rate>
 * @desc ステート有効度
 * @default {"Draw Ids":"1-13","Reverse?":"true","View Type":"4"}
 * @parent === Trait ===
 *
 * @param State Resist Params
 * @type struct<StateResist>
 * @desc ステート無効化
 * @default {"Draw Ids":"1-13","View Type":"3"}
 * @parent === Trait ===
 *
 * @param Original Trait Type
 * @type select
 * @option 0:非表示
 * @value 0
 * @option 1:固定（常に表示）
 * @value 1
 * @option 2:装備（装備品に含まれるステータス）
 * @value 2
 * @option 3:変動（変更があるステータス）
 * @value 3
 * @option 4:装備or変動
 * @value 4
 * @desc オリジナルパラメータの表示タイプ
 * @default 4
 * @parent === Trait ===
 *
 *
 * @param === Terms ===
 * @default 【用語】
 *
 * @param xparams
 * @type struct<xparams>
 * @desc 用語[追加能力値]
 * @default {"hit":"命中率","eva":"回避率","cri":"会心率","cev":"会心回避率","mev":"魔法回避率","mrf":"魔法反射率","cnt":"反撃率","hrg":"ＨＰ再生率","mrg":"ＭＰ再生率","trg":"ＴＰ再生率"}
 * @parent === Terms ===
 *
 * @param sparams
 * @type struct<sparams>
 * @desc 用語[特殊能力値]
 * @default {"tgr":"狙われ率","grd":"防御効果率","rec":"回復効果率","pha":"薬の知識","mcr":"ＭＰ消費率","tcr":"ＴＰチャージ率","pdr":"物理ダメージ率","mdr":"魔法ダメージ率","fdr":"床ダメージ率","exr":"経験獲得率"}
 * @parent === Terms ===
 *
 * @param Element Rate
 * @desc 用語[属性有効度]
 * (%1が属性名となります)
 * @default %1耐性
 * @parent === Terms ===
 *
 * @param Debuff Rate
 * @desc 用語[弱体有効度]
 * (%1が能力値名となります)
 * @default %1ダウン耐性
 * @parent === Terms ===
 *
 * @param State Rate
 * @desc 用語[ステート有効度]
 * (%1がステート名となります)
 * @default %1耐性
 * @parent === Terms ===
 *
 * @param State Resist
 * @desc 用語[ステート無効化]
 * (%1がステート名となります)
 * @default %1無効化
 * @parent === Terms ===
 *
 *
 * @param === Command ===
 * @default 【コマンド関連】
 *
 * @param Equip Metadata
 * @type struct<EquipMetadata>
 * @desc 武器・防具のメモ欄のコマンド名
 * @default {"mppEqSt":"mppEqSt"}
 * @parent === Command ===
 *
 *
 */

/*~struct~ParamGaugeMax:
 * @param mhp
 * @type number
 * @min 1
 * @desc 最大ＨＰ
 * @default 10000
 *
 * @param mmp
 * @type number
 * @min 1
 * @desc 最大ＭＰ
 * @default 2000
 *
 * @param atk
 * @type number
 * @desc 攻撃力
 * @default 200
 *
 * @param def
 * @type number
 * @min 1
 * @desc 防御力
 * @default 200
 *
 * @param mat
 * @type number
 * @min 1
 * @desc 魔法力
 * @default 200
 *
 * @param mdf
 * @type number
 * @min 1
 * @desc 魔法防御
 * @default 200
 *
 * @param agi
 * @type number
 * @min 1
 * @desc 敏捷性
 * @default 400
 *
 * @param luk
 * @type number
 * @min 1
 * @desc 運
 * @default 400
 *
 */

/*~struct~Rate:
 * @param Draw Ids
 * @desc 表示するIDの配列
 * @default 1-9
 *
 * @param Reverse?
 * @type boolean
 * @desc 反転表示
 * @default true
 *
 * @param View Type
 * @type select
 * @option 0:非表示
 * @value 0
 * @option 1:固定（常に表示）
 * @value 1
 * @option 2:装備（装備品に含まれるステータス）
 * @value 2
 * @option 3:変動（変更があるステータス）
 * @value 3
 * @option 4:装備or変動
 * @value 4
 * @desc 表示タイプ
 * @default 4
 *
 */

/*~struct~DebuffRate:
 * @param Draw Params
 * @desc 表示する能力値の配列
 * @default 0-7
 *
 * @param Reverse?
 * @type boolean
 * @desc 反転表示
 * @default true
 *
 * @param View Type
 * @type select
 * @option 0:非表示
 * @value 0
 * @option 1:固定（常に表示）
 * @value 1
 * @option 2:装備（装備品に含まれるステータス）
 * @value 2
 * @option 3:変動（変更があるステータス）
 * @value 3
 * @option 4:装備or変動
 * @value 4
 * @desc 表示タイプ
 * @default 4
 *
 */

/*~struct~StateResist:
 * @param Draw Ids
 * @desc 表示するステートIDの配列
 * @default 1-13
 *
 * @param View Type
 * @type select
 * @option 0:非表示
 * @value 0
 * @option 1:固定（常に表示）
 * @value 1
 * @option 2:装備（装備品に含まれるステータス）
 * @value 2
 * @option 3:変動（変更があるステータス）
 * @value 3
 * @option 4:装備or変動
 * @value 4
 * @desc 表示タイプ
 * @default 4
 *
 */

/*~struct~xparams:
 * @param hit
 * @desc 命中率
 * @default 命中率
 *
 * @param eva
 * @desc 回避率
 * @default 回避率
 *
 * @param cri
 * @desc 会心率
 * @default 会心率
 *
 * @param cev
 * @desc 会心回避率
 * @default 会心回避率
 *
 * @param mev
 * @desc 魔法回避率
 * @default 魔法回避率
 *
 * @param mrf
 * @desc 魔法反射率
 * @default 魔法反射率
 *
 * @param cnt
 * @desc 反撃率
 * @default 反撃率
 *
 * @param hrg
 * @desc ＨＰ再生率
 * @default ＨＰ再生率
 *
 * @param mrg
 * @desc ＭＰ再生率
 * @default ＭＰ再生率
 *
 * @param trg
 * @desc ＴＰ再生率
 * @default ＴＰ再生率
 *
 */

/*~struct~sparams:
 * @param tgr
 * @desc 狙われ率
 * @default 狙われ率
 *
 * @param grd
 * @desc 防御効果率
 * @default 防御効果率
 *
 * @param rec
 * @desc 回復効果率
 * @default 回復効果率
 *
 * @param pha
 * @desc 薬の知識
 * @default 薬の知識
 *
 * @param mcr
 * @desc ＭＰ消費率
 * @default ＭＰ消費率
 *
 * @param tcr
 * @desc ＴＰチャージ率
 * @default ＴＰチャージ率
 *
 * @param pdr
 * @desc 物理ダメージ率
 * @default 物理ダメージ率
 *
 * @param mdr
 * @desc 魔法ダメージ率
 * @default 魔法ダメージ率
 *
 * @param fdr
 * @desc 床ダメージ率
 * @default 床ダメージ率
 *
 * @param exr
 * @desc 経験獲得率
 * @default 経験獲得率
 *
 */

/*~struct~EquipMetadata:
 * @param mppEqSt
 * @desc 装備変更時に name を表示
 * @default mppEqSt
 *
 */

var MPP = MPP || {};
MPP.EquipStatusEX = {};

(function (exports) {
  "use strict";

  const Params = {};

  {
    let parameters = PluginManager.parameters("MPP_EquipStatusEX");

    let convertParam = function (param) {
      var result = [];
      if (param) {
        var data = param.split(",");
        for (var i = 0; i < data.length; i++) {
          if (/(\d+)\s*-\s*(\d+)/.test(data[i])) {
            for (var n = Number(RegExp.$1); n <= Number(RegExp.$2); n++) {
              result.push(n);
            }
          } else {
            result.push(Number(data[i]));
          }
        }
      }
      return result;
    };

    Params.statusWindowRow = Number(parameters["Status Window Row"] || 7);
    Params.gaugeHeight = Number(parameters["Gauge Height"] || 8);
    Params.GaugeColor = "rgb(%1)".format(
      parameters["Gauge Color"] || "224,255,255"
    );
    Params.GaugeType = Number(parameters["Gauge Type"] || 0);
    Params.GaugeSlope = Number(parameters["Gauge Slope"] || 0.5);

    // Gauge Max
    let param = JSON.parse(parameters["param Gauge Max"] || "{}");
    Params.paramGaugeMax = [];
    Params.paramGaugeMax[0] = Number(param.mhp);
    Params.paramGaugeMax[1] = Number(param.mmp);
    Params.paramGaugeMax[2] = Number(param.atk);
    Params.paramGaugeMax[3] = Number(param.def);
    Params.paramGaugeMax[4] = Number(param.mat);
    Params.paramGaugeMax[5] = Number(param.mdf);
    Params.paramGaugeMax[6] = Number(param.agi);
    Params.paramGaugeMax[7] = Number(param.luk);
    Params.MaxSquare = !!eval(parameters["Max Square"]);
    Params.xparamGaugeMax = Number(parameters["xparam Gauge Max"] || 2.0);
    Params.sparamGaugeMax = Number(parameters["sparam Gauge Max"] || 2.0);
    Params.rateGaugeMax = Number(parameters["rate Gauge Max"] || 2.0);

    // Status
    Params.defaultStatus = convertParam(parameters["Default Status"]);
    Params.fixingStatus = convertParam(parameters["Fixing Status"]);
    Params.itemStatus = convertParam(parameters["Item Status"]);
    Params.flowStatus = convertParam(parameters["Flow Status"]);

    // Rate
    param = JSON.parse(parameters["Element Rate Params"] || "{}");
    Params.ElementRate = {
      DrawIds: convertParam(param["Draw Ids"]),
      Reverse: !!eval(param["Reverse?"]),
      ViewType: Number(param["View Type"]),
    };
    param = JSON.parse(parameters["Debuff Rate Params"] || "{}");
    Params.DebuffRate = {
      DrawParams: convertParam(param["Draw Params"]),
      Reverse: !!eval(param["Reverse?"]),
      ViewType: Number(param["View Type"]),
    };
    param = JSON.parse(parameters["State Rate Params"] || "{}");
    Params.StateRate = {
      DrawIds: convertParam(param["Draw Ids"]),
      Reverse: !!eval(param["Reverse?"]),
      ViewType: Number(param["View Type"]),
    };
    param = JSON.parse(parameters["State Resist Params"] || "{}");
    Params.StateResist = {
      DrawIds: convertParam(param["Draw Ids"]),
      ViewType: Number(param["View Type"]),
    };
    Params.OriginalTraitType = Number(parameters["Original Trait Type"] || 4);

    // Terms
    Params.terms = {};
    param = JSON.parse(parameters["xparams"] || "{}");
    Params.terms[8] = param.hit;
    Params.terms[9] = param.eva;
    Params.terms[10] = param.cri;
    Params.terms[11] = param.cev;
    Params.terms[12] = param.mev;
    Params.terms[13] = param.mrf;
    Params.terms[14] = param.cnt;
    Params.terms[15] = param.hrg;
    Params.terms[16] = param.mrg;
    Params.terms[17] = param.trg;
    param = JSON.parse(parameters["sparams"] || "{}");
    Params.terms[18] = param.tgr;
    Params.terms[19] = param.grd;
    Params.terms[20] = param.rec || "回復効果率";
    Params.terms[21] = param.pha;
    Params.terms[22] = param.mcr;
    Params.terms[23] = param.tcr;
    Params.terms[24] = param.pdr;
    Params.terms[25] = param.mdr;
    Params.terms[26] = param.fdr;
    Params.terms[27] = param.exr;
    Params.terms.elementRate = parameters["Element Rate"] || "";
    Params.terms.debuffRate = parameters["Debuff Rate"] || "";
    Params.terms.stateRate = parameters["State Rate"] || "";
    Params.terms.stateResist = parameters["State Resist"] || "";

    Params.downStrongParams = [22, 24, 25, 26];

    // Command
    Params.EquipMetadata = JSON.parse(parameters["Equip Metadata"] || "{}");
  }

  const Alias = {};

  //-----------------------------------------------------------------------------
  // Game_BattlerBase

  Game_BattlerBase.prototype.allMetadata = function (name) {
    return this.traitObjects()
      .map((obj) => obj.meta[name])
      .filter(Boolean);
  };

  Game_BattlerBase.prototype.allOriginalTraits_mpp = function () {
    var result = [];
    var name = Params.EquipMetadata.mppEqSt || "mppEqSt";
    var data = this.allMetadata(name);
    for (var i = 0; i < data.length; i++) {
      var params = data[i].split(",").filter((t) => !result.contains(t));
      result = result.concat(params);
    }
    return result;
  };

  //-----------------------------------------------------------------------------
  // Window_EquipItem

  //57
  Alias.WiEqIt_updateHelp = Window_EquipItem.prototype.updateHelp;
  Window_EquipItem.prototype.updateHelp = function () {
    if (this._actor && this._statusWindow) {
      this._statusWindow.setNewItem(this.item());
    }
    Alias.WiEqIt_updateHelp.apply(this, arguments);
  };

  //-----------------------------------------------------------------------------
  // Window_EquipStatus

  //13
  Alias.WiEqSt_initialize = Window_EquipStatus.prototype.initialize;
  Window_EquipStatus.prototype.initialize = function (x, y) {
    this._createDrawer = false;
    this._mppEqStGaugeCount = 0;
    Alias.WiEqSt_initialize.apply(this, arguments);
  };

  //30
  Window_EquipStatus.prototype.numVisibleRows = function () {
    return Params.statusWindowRow;
  };

  Window_EquipStatus.prototype.setNewItem = function (item) {
    this._item = item;
  };

  //
  if (Window_EquipStatus.prototype.hasOwnProperty("update")) {
    Alias.WiEqSt_update = Window_EquipStatus.prototype.update;
  }
  Window_EquipStatus.prototype.update = function () {
    if (this._mppEqStGaugeCount > 0) this._mppEqStGaugeCount--;
    var _super = Alias.WiEqSt_update || Window_Base.prototype.update;
    _super.apply(this, arguments);
  };

  //41
  Window_EquipStatus.prototype.refresh = function () {
    this.clearUpdateDrawer();
    this.contents.clear();
    if (this._actor) {
      this._createDrawer = true;
      this._mppEqStGaugeCount = 30;
      this.drawActorName(this._actor, this.textPadding(), 0);
      var height = this.lineHeight();
      var maxRow = Math.floor((this.contentsHeight() - height) / height);
      this.drawParameters(0, height, maxRow);
      this._createDrawer = false;
    }
  };

  Window_EquipStatus.prototype.drawParameters = function (x, y, maxRow) {
    var list = this.makeStatusList(maxRow);
    var height = this.lineHeight();
    for (var i = 0; i < list.length; i++) {
      this.drawItem(x, y + i * height, list[i]);
    }
  };

  Window_EquipStatus.prototype.makeStatusList = function (maxRow) {
    if (this._tempActor) {
      //EquipParams
      var list = this.createEquipParamsList(maxRow);

      //ElementRate
      if (maxRow > list.length)
        list = list.concat(this.createElementRateList(maxRow - list.length));

      //DebuffRate
      if (maxRow > list.length)
        list = list.concat(this.createDebuffRateList(maxRow - list.length));

      //StateRate
      if (maxRow > list.length)
        list = list.concat(this.createStateRateList(maxRow - list.length));

      //StateResist
      if (maxRow > list.length)
        list = list.concat(this.createStateResistList(maxRow - list.length));

      //OriginalTrait
      if (maxRow > list.length)
        list = list.concat(this.createOriginalTraitList(maxRow - list.length));

      return list;
    } else {
      return this.createDefaultParamsList(maxRow);
    }
  };

  Window_EquipStatus.prototype.convertList = function (list, type) {
    return list.map((id) => ({ type: type, value: id }));
  };

  Window_EquipStatus.prototype.createEquipParamsList = function (maxRow) {
    var list = [];

    //FixingStatus
    var status = this.getFixingStatus().slice(0, maxRow);
    list = list.concat(status);

    //ItemStatus
    if (maxRow > list.length) {
      status = this.getItemStatus();
      status = status.filter(
        (id) => !list.contains(id) && this.includeParam(id)
      );
      status = status.slice(0, maxRow - list.length);
      list = list.concat(status);
    }

    //FlowStatus
    if (maxRow > list.length) {
      status = this.getFlowStatus();
      status = status.filter(
        (id) => !list.contains(id) && this.isChangedParam(id)
      );
      status = status.slice(0, maxRow - list.length);
      list = list.concat(status);
    }

    list.sort((a, b) => a - b);
    return this.convertList(list, "param");
  };

  Window_EquipStatus.prototype.isChangedParam = function (paramId) {
    return (
      this.getActorParam(this._actor, paramId) !==
      this.getActorParam(this._tempActor, paramId)
    );
  };

  Window_EquipStatus.prototype.isChangedRate = function (method, id) {
    return this._actor[method](id) !== this._tempActor[method](id);
  };

  Window_EquipStatus.prototype.createElementRateList = function (maxRow) {
    var type = this.getElementRateType();
    if (Params.terms.elementRate && type > 0) {
      var code = Game_BattlerBase.TRAIT_ELEMENT_RATE;
      var elements = Params.ElementRate.DrawIds;
      elements = elements.filter((id) =>
        this.includeRate(type, code, "elementRate", id)
      );
      elements = elements.slice(0, maxRow);
      return this.convertList(elements, "elementRate");
    } else {
      return [];
    }
  };

  Window_EquipStatus.prototype.createDebuffRateList = function (maxRow) {
    var type = this.getDebuffRateType();
    if (Params.terms.debuffRate && type > 0) {
      var code = Game_BattlerBase.TRAIT_DEBUFF_RATE;
      var debuffs = Params.DebuffRate.DrawParams;
      debuffs = debuffs.filter((id) =>
        this.includeRate(type, code, "debuffRate", id)
      );
      debuffs = debuffs.slice(0, maxRow);
      return this.convertList(debuffs, "debuffRate");
    } else {
      return [];
    }
  };

  Window_EquipStatus.prototype.createStateRateList = function (maxRow) {
    var type = this.getStateRateType();
    if (Params.terms.stateRate && type > 0) {
      var code = Game_BattlerBase.TRAIT_STATE_RATE;
      var states = Params.StateRate.DrawIds;
      states = states.filter((id) =>
        this.includeRate(type, code, "stateRate", id)
      );
      states = states.slice(0, maxRow);
      return this.convertList(states, "stateRate");
    } else {
      return [];
    }
  };

  Window_EquipStatus.prototype.createStateResistList = function (maxRow) {
    var type = this.getStateResistType();
    if (Params.terms.stateResist && type > 0) {
      var code = Game_BattlerBase.TRAIT_STATE_RESIST;
      var states = Params.StateResist.DrawIds;
      states = states.filter((id) =>
        this.includeRate(type, code, "isStateResist", id)
      );
      states = states.slice(0, maxRow);
      return this.convertList(states, "stateResist");
    } else {
      return [];
    }
  };

  Window_EquipStatus.prototype.createOriginalTraitList = function (maxRow) {
    var list = [];
    var type = this.getOriginalTraitType();
    if (type === 2 || type === 4) {
      if (this._item && this._item.meta.mppEqSt) {
        list = list.concat(this._item.meta.mppEqSt.split(","));
      }
    }
    if (maxRow > list.length && (type === 3 || type === 4)) {
      var curTraits = this._actor.allOriginalTraits_mpp();
      var newTraits = this._tempActor.allOriginalTraits_mpp();
      list = list.concat(
        curTraits.filter((t) => !list.contains(t) && !newTraits.contains(t))
      );
      list = list.concat(
        newTraits.filter((t) => !list.contains(t) && !curTraits.contains(t))
      );
    }
    if (maxRow < list.length) list.length = maxRow;
    return this.convertList(list, "original");
  };

  Window_EquipStatus.prototype.createDefaultParamsList = function (maxRow) {
    var list = this.getDefaultStatus().slice(0, maxRow);
    return this.convertList(list, "param");
  };

  //58
  Window_EquipStatus.prototype.drawItem = function (x, y, data) {
    switch (data.type) {
      case "param":
        this.drawParam(x, y, data.value);
        break;
      case "elementRate":
        this.drawElement(x, y, data.value);
        break;
      case "debuffRate":
        this.drawDebuff(x, y, data.value);
        break;
      case "stateRate":
        this.drawState(x, y, data.value);
        break;
      case "stateResist":
        this.drawResist(x, y, data.value);
        return;
      case "original":
        this.drawOriginal(x, y, data.value);
        return;
    }

    if (this._createDrawer && this._tempActor) {
      this.createItemDrawer(x, y, data);
    }
  };

  Window_EquipStatus.prototype.createItemDrawer = function (x, y, data) {
    var width = this.contentsWidth();
    this.addUpdateDrawer(() => {
      var count = this._mppEqStGaugeCount;
      if (count <= 22 && count % 2 === 0) {
        this.contents.clearRect(x, y, width, this.lineHeight());
        this.drawItem(x, y, data);
      }
      return count > 0;
    });
  };

  Window_EquipStatus.prototype.getDefaultStatus = function () {
    return Params.defaultStatus;
  };
  Window_EquipStatus.prototype.getFixingStatus = function () {
    return Params.fixingStatus;
  };
  Window_EquipStatus.prototype.getItemStatus = function () {
    return Params.itemStatus;
  };
  Window_EquipStatus.prototype.getFlowStatus = function () {
    return Params.flowStatus;
  };
  Window_EquipStatus.prototype.getElementRateType = function () {
    return Params.ElementRate.ViewType;
  };
  Window_EquipStatus.prototype.getDebuffRateType = function () {
    return Params.DebuffRate.ViewType;
  };
  Window_EquipStatus.prototype.getStateRateType = function () {
    return Params.StateRate.ViewType;
  };
  Window_EquipStatus.prototype.getStateResistType = function () {
    return Params.StateResist.ViewType;
  };
  Window_EquipStatus.prototype.getOriginalTraitType = function () {
    return Params.OriginalTraitType;
  };

  Window_EquipStatus.prototype.drawParamGauge = function (
    x,
    y,
    width,
    curValue,
    newValue,
    max,
    reverse
  ) {
    var count = Math.min(this._mppEqStGaugeCount, 24);
    var curWidth = (width * curValue) / max;
    var value =
      newValue - ((newValue - curValue) * Math.pow(count, 2)) / Math.pow(24, 2);
    var newWidth = (width * value) / max;

    var color = Params.GaugeColor;
    if (curValue !== newValue) {
      var diffvalue = (newValue - curValue) * (reverse ? -1 : 1);
      color = this.paramchangeTextColor(diffvalue);
    }

    switch (Params.GaugeType) {
      case 0: // flat
        this.drawFlatGauge(x, y, curWidth, newWidth, color);
        break;
      case 1: // arch
        this.drawArcGauge(x, y, curWidth, newWidth, color);
        break;
      case 2: // 2line
        this.draw2LineGauge(x, y, curWidth, newWidth, color);
        break;
    }
  };

  Window_EquipStatus.prototype.drawFlatGauge = function (
    x,
    y,
    curWidth,
    newWidth,
    color
  ) {
    var gh = Params.gaugeHeight;
    var gy = y + this.lineHeight() - 3 - gh;

    var curW = curWidth;
    var newX = 0;
    var newW = newWidth;

    if (curWidth >= 0) {
      if (newWidth >= curWidth) {
        newX = curWidth;
      } else if (newWidth >= 0) {
        newX = newWidth;
        newW = curWidth;
        curW = newWidth;
      } else {
        newX = curWidth;
        curW = 0;
      }
    } else {
      if (newWidth <= curWidth) {
        newX = curWidth;
      } else if (newWidth <= 0) {
        newX = newWidth;
        newW = curWidth;
        curW = newWidth;
      } else {
        newX = curWidth;
        curW = 0;
      }
    }

    var context = this.contents.context;
    context.save();
    context.setTransform(1, 0, Params.GaugeSlope, 1, x, gy);

    var sx = Math.min(curWidth, newWidth, 0);
    var sw = Math.max(curWidth, newWidth, 0) - sx;
    this.drawFlatShadow(sx, 0, sw);

    if (curWidth !== newWidth) {
      if (curWidth > newWidth) this.contents.paintOpacity = 192;
      this.drawFlatLine(newX, 0, newW - newX, color);
      this.contents.paintOpacity = 255;
    }
    this.drawFlatLine(0, 0, curW, Params.GaugeColor);

    context.restore();
  };

  Window_EquipStatus.prototype.drawFlatLine = function (x, y, width, color) {
    var gh = Params.gaugeHeight;
    var context = this.contents.context;
    //context.save();
    //context.setTransform(1, 0, Params.GaugeSlope, 1, x, y);

    var gradient = context.createLinearGradient(x, y + 2, x, y + gh * 2);
    gradient.addColorStop(0, color);
    gradient.addColorStop(1, "black");

    context.lineWidth = gh;

    context.beginPath();
    context.moveTo(x, y + gh / 2);
    context.lineTo(x + width, y + gh / 2);
    context.strokeStyle = gradient;
    context.stroke();

    //context.restore();
  };

  Window_EquipStatus.prototype.drawFlatShadow = function (x, y, width) {
    var context = this.contents.context;
    context.shadowColor = "black";
    context.shadowOffsetX = 2;
    context.shadowOffsetY = 2;
    context.shadowBlur = 1;
    this.drawFlatLine(x, y, width, "black");
    context.shadowColor = "transparent";
  };

  Window_EquipStatus.prototype.drawArcGauge = function (
    x,
    y,
    curWidth,
    newWidth,
    color
  ) {
    var gh = Params.gaugeHeight;
    var gy = y + this.lineHeight() - 3 - gh;

    var curW = curWidth;
    var newX = 0;
    var newW = newWidth;

    if (curWidth >= 0) {
      if (newWidth >= curWidth) {
        newX = Math.max(curWidth - gh, 0);
      } else if (newWidth >= 0) {
        newX = Math.max(newWidth - gh, 0);
        newW = curWidth;
        curW = newWidth;
      } else {
        newX = curWidth;
        curW = 0;
      }
    } else {
      if (newWidth <= curWidth) {
        newX = Math.min(curWidth + gh, 0);
      } else if (newWidth <= 0) {
        newX = Math.min(newWidth + gh, 0);
        newW = curWidth;
        curW = newWidth;
      } else {
        newX = curWidth;
        curW = 0;
      }
    }

    var context = this.contents.context;
    context.save();
    context.setTransform(1, 0, Params.GaugeSlope, 1, x, gy);

    var sx = Math.min(curWidth, newWidth, 0);
    var sw = Math.max(curWidth, newWidth, 0) - sx;
    this.drawArcShadow(sx, 0, sw);

    if (curWidth !== newWidth) {
      if (curWidth > newWidth) this.contents.paintOpacity = 160;
      this.drawArcLine(newX, 0, newW - newX, color);
      this.contents.paintOpacity = 255;
    }
    this.drawArcLine(0, 0, curW, Params.GaugeColor);

    context.restore();
  };

  Window_EquipStatus.prototype.drawArcLine = function (x, y, width, color) {
    var minX = Math.min(x, x + width);
    var maxX = Math.max(x, x + width);
    var h = Params.gaugeHeight;
    var gy = y + h / 2;
    var context = this.contents.context;
    //context.save();
    //context.setTransform(1, 0, Params.GaugeSlope, 1, x, y);

    var gradient = context.createLinearGradient(x, y + 2, x, y + h * 2);
    gradient.addColorStop(0, color);
    gradient.addColorStop(1, "black");

    if (maxX - minX < h) {
      var r = h / 2;
      var angle = Math.acos((r - (maxX - minX) / 2) / r);
      context.beginPath();
      context.arc(minX + r, gy, r, Math.PI - angle, Math.PI + angle);
      context.arc(maxX - r, gy, r, -angle, angle);
      context.fillStyle = gradient;
      context.fill();
    } else {
      context.lineWidth = h;
      context.lineCap = "round";

      context.beginPath();
      context.moveTo(minX + h / 2, gy);
      context.lineTo(maxX - h / 2, gy);
      context.strokeStyle = gradient;
      context.stroke();
    }

    //context.restore();
  };

  Window_EquipStatus.prototype.drawArcShadow = function (x, y, width) {
    var context = this.contents.context;
    context.shadowColor = "black";
    context.shadowOffsetX = 2;
    context.shadowOffsetY = 2;
    context.shadowBlur = 1;
    this.drawArcLine(x, y, width, "black");
    context.shadowColor = "transparent";
  };

  Window_EquipStatus.prototype.draw2LineGauge = function (
    x,
    y,
    curWidth,
    newWidth,
    color
  ) {
    var gh = Params.gaugeHeight;
    var gy = y + this.lineHeight() - 3 - gh;

    var context = this.contents.context;
    context.save();
    context.setTransform(1, 0, Params.GaugeSlope, 1, x, gy);

    context.shadowColor = "black";
    context.shadowOffsetX = 2;
    context.shadowOffsetY = 2;
    context.shadowBlur = 1;

    if (color === Params.GaugeColor) {
      this.drawFlatLine(0, 0, curWidth, Params.GaugeColor);
    } else {
      this.drawFlatLine(0, -gh, curWidth, Params.GaugeColor);
      this.drawFlatLine(0, 0, newWidth, color);
    }

    context.restore();
  };

  Window_EquipStatus.prototype.drawParam = function (x, y, paramId) {
    var curValue = this.getActorParam(this._actor, paramId);
    var newValue = this._tempActor
      ? this.getActorParam(this._tempActor, paramId)
      : curValue;
    var max = this.getParamMax(paramId);
    if (Params.MaxSquare && paramId < 8) {
      curValue = Math.sqrt(curValue);
      newValue = Math.sqrt(newValue);
      max = Math.sqrt(max);
    }
    var reverse = Params.downStrongParams.contains(paramId);
    this.drawParamGauge(x + 140, y, 130, curValue, newValue, max, reverse);
    this.drawParamName(x + this.textPadding(), y, paramId);
    if (this._actor) {
      this.drawCurrentParam(x + 140, y, paramId);
    }
    if (this._tempActor) {
      this.drawRightArrow(x + 188, y);
      this.drawNewParam(x + 222, y, paramId, reverse);
    }
  };

  //69
  Alias.WiEqSt_drawParamName = Window_EquipStatus.prototype.drawParamName;
  Window_EquipStatus.prototype.drawParamName = function (x, y, paramId) {
    if (paramId < 8) {
      Alias.WiEqSt_drawParamName.apply(this, arguments);
    } else {
      this.changeTextColor(this.systemColor());
      this.drawText(Params.terms[paramId], x, y, 120);
    }
  };

  //74
  Alias.WiEqSt_drawCurrentParam = Window_EquipStatus.prototype.drawCurrentParam;
  Window_EquipStatus.prototype.drawCurrentParam = function (x, y, paramId) {
    if (paramId < 8) {
      Alias.WiEqSt_drawCurrentParam.apply(this, arguments);
    } else {
      this.resetTextColor();
      var param = Math.round(this.getActorParam(this._actor, paramId) * 100);
      this.drawText(param, x, y, 48, "right");
    }
  };

  //84
  Alias.WiEqSt_drawNewParam = Window_EquipStatus.prototype.drawNewParam;
  Window_EquipStatus.prototype.drawNewParam = function (
    x,
    y,
    paramId,
    reverse
  ) {
    if (paramId < 8) {
      Alias.WiEqSt_drawNewParam.apply(this, arguments);
    } else {
      var newValue = this.getActorParam(this._tempActor, paramId);
      var diffvalue = newValue - this.getActorParam(this._actor, paramId);
      if (reverse) diffvalue *= -1;
      this.changeTextColor(this.paramchangeTextColor(diffvalue));
      this.drawText(Math.round(newValue * 100), x, y, 48, "right");
    }
  };

  Window_EquipStatus.prototype.includeParam = function (paramId) {
    if (paramId < 8) {
      if (this._item && this._item.params[paramId] !== 0) return true;
      return this.includeTrait(Game_BattlerBase.TRAIT_PARAM, paramId);
    } else if (paramId < 18) {
      return this.includeTrait(Game_BattlerBase.TRAIT_XPARAM, paramId - 8);
    } else {
      return this.includeTrait(Game_BattlerBase.TRAIT_SPARAM, paramId - 18);
    }
  };

  Window_EquipStatus.prototype.includeTrait = function (code, id) {
    return (
      this._item &&
      this._item.traits.some((t) => t.code === code && t.dataId === id)
    );
  };

  Window_EquipStatus.prototype.includeRate = function (type, code, method, id) {
    switch (type) {
      case 1:
        return true;
      case 2:
        return this.includeTrait(code, id);
      case 3:
        return this.isChangedRate(method, id);
      case 4:
        return this.includeTrait(code, id) || this.isChangedRate(method, id);
      default:
        return false;
    }
  };

  Window_EquipStatus.prototype.getActorParam = function (actor, paramId) {
    if (paramId < 8) {
      return actor.param(paramId);
    } else if (paramId < 18) {
      return actor.xparam(paramId - 8);
    } else {
      return actor.sparam(paramId - 18);
    }
  };

  Window_EquipStatus.prototype.getParamMax = function (paramId) {
    if (paramId < 8) {
      return Params.paramGaugeMax[paramId];
    } else if (paramId < 18) {
      return Params.xparamGaugeMax;
    } else {
      return Params.sparamGaugeMax;
    }
  };

  Window_EquipStatus.prototype.drawElement = function (x, y, id) {
    var name = Params.terms.elementRate.format($dataSystem.elements[id]);
    var curValue = this._actor.elementRate(id);
    var newValue = this._tempActor.elementRate(id);
    var reverse = Params.ElementRate.Reverse;
    this.drawRate(x, y, name, curValue, newValue, reverse);
  };

  Window_EquipStatus.prototype.drawDebuff = function (x, y, id) {
    var name = Params.terms.debuffRate.format(TextManager.param(id));
    var curValue = this._actor.debuffRate(id);
    var newValue = this._tempActor.debuffRate(id);
    var reverse = Params.DebuffRate.Reverse;
    this.drawRate(x, y, name, curValue, newValue, reverse);
  };

  Window_EquipStatus.prototype.drawState = function (x, y, id) {
    var name = Params.terms.stateRate.format($dataStates[id].name);
    var curValue = this._actor.stateRate(id);
    var newValue = this._tempActor.stateRate(id);
    var reverse = Params.StateRate.Reverse;
    this.drawRate(x, y, name, curValue, newValue, reverse);
  };

  Window_EquipStatus.prototype.drawRate = function (
    x,
    y,
    name,
    curValue,
    newValue,
    reverse
  ) {
    this.changeTextColor(this.systemColor());
    this.drawText(name, x + this.textPadding(), y, 120);
    var curValue2 = reverse ? 1 - curValue : curValue;
    var newValue2 = reverse ? 1 - newValue : newValue;
    var max = Params.rateGaugeMax;
    this.drawParamGauge(x + 140, y, 130, curValue2, newValue2, max, !reverse);
    this.resetTextColor();
    this.drawText(Math.round(curValue2 * 100), x + 140, y, 48, "right");
    this.drawRightArrow(x + 188, y);
    this.changeTextColor(this.paramchangeTextColor(curValue - newValue));
    this.drawText(Math.round(newValue2 * 100), x + 222, y, 48, "right");
  };

  Window_EquipStatus.prototype.drawResist = function (x, y, id) {
    var name = Params.terms.stateResist.format($dataStates[id].name);
    var curFlag = this._actor.isStateResist(id);
    var newFlag = this._tempActor.isStateResist(id);
    this.drawTraitText(x + 96, y, name, curFlag, newFlag);
  };

  Window_EquipStatus.prototype.drawOriginal = function (x, y, trait) {
    var curFlag = this._actor.allOriginalTraits_mpp().contains(trait);
    var newFlag = this._tempActor.allOriginalTraits_mpp().contains(trait);
    this.drawTraitText(x + 96, y, trait, curFlag, newFlag);
  };

  Window_EquipStatus.prototype.drawTraitText = function (
    x,
    y,
    name,
    curFlag,
    newFlag
  ) {
    var diffvalue = !curFlag ? 1 : !newFlag ? -1 : 0;
    this.changeTextColor(this.paramchangeTextColor(diffvalue));
    var text = !curFlag ? "+" + name : !newFlag ? "-" + name : name;
    var width = this.contentsWidth() - x;
    this.drawText(text, x, y, width);
  };
})();

//=============================================================================
// UpdateDrawer
//=============================================================================

(function () {
  if (!Window_Base.Mpp_UpdateDrawer) {
    const Alias = {};

    //-----------------------------------------------------------------------------
    // Window_Base

    //13
    Alias.WiBa_initialize = Window_Base.prototype.initialize;
    Window_Base.prototype.initialize = function (x, y, width, height) {
      Alias.WiBa_initialize.apply(this, arguments);
      this._updateDrawers = [];
    };

    //105
    Alias.WiBa_update = Window_Base.prototype.update;
    Window_Base.prototype.update = function () {
      Alias.WiBa_update.apply(this, arguments);
      this.updateDrawer();
    };

    Window_Base.prototype.updateDrawer = function () {
      if (this.isOpen() && this.visible && this._updateDrawers.length > 0) {
        this._updateDrawers = this._updateDrawers.filter((process) =>
          process()
        );
      }
    };

    Window_Base.prototype.addUpdateDrawer = function (process) {
      this._updateDrawers.push(process);
    };

    Window_Base.prototype.clearUpdateDrawer = function () {
      this._updateDrawers = [];
    };

    Window_Base.Mpp_UpdateDrawer = 1;
  } //if (!Window_Base.Mpp_UpdateDrawer)
})(MPP.EquipStatusEX);