code:
//=============================================================================
// 111_InputForm.js (Sep. 2017 by Sasuke KANNAZUKI, et al.)
//=============================================================================
// [Update History]
// 2017 Apr    : First Release by Sasuke KANNAZUKI
// 2017 Sep 06 : Add code to prevent error on iOS (thanks to Kuramubon).

/*:
 * @plugindesc Display input form on the game screen
 * @author Sasuke KANNAZUKI, 111, Kuramubon
 *
 * @param OK Button Text
 * @desc Text of OK Button
 * @default OK
 *
 * @param Display Cancel Button
 * @desc Whether to display cancel button.(0=no, 1=yes)
 * @default 1
 *
 * @param Cancel Button Text
 * @desc Text of Cancel Button
 * @default Cancel
 *
 * @param Judge Switch Interval
 * @desc Interval milisecond of checking the switch.
 * By reducing number, more sensitive, maybe overload.
 * @default 100
 *
 * @param Switch ID Selected OK
 * @desc Turn ON when OK pressed, turn OFF when Cancel pressed.
 * if the ID is 0, no effect.
 * @default 0
 *
 * @param Force OK Switch ID
 * @desc When the switch ON, input form is forcely decided.
 * (i.e. this is the default value of if_s.) If the ID is 0, no effect.
 * @default 0
 *
 * @param Force Cancel Switch ID
 * @desc When the switch ON, input form is forcely cancelled.
 * If the ID is 0, no effect.
 * @default 0
 *
 * @help
 * This plugin enables player to input string by using HTML5+CSS functions.
 *
 * [At first you have to do]
 * This plugin needs another css file that is attached in the archive
 * whose name is "111_InputForm.css".
 * Please make the "css" folder at the same folder as index.html,
 * and then put the css file.
 * If you have the knowledge of css, you can easily change the style of the
 * form by overwriting the css file.
 *
 * [Plugin Command Example]
 * Parameters should be separated by semi colon(never use white space!),
 * and each parameter's style is <name>=<value>, as follows:
 *
 * InputForm x=350;y=200;n=1;max=5;
 *
 * At this case, form appears at (350, 200), the result string is stored at
 * actor #1's name, and the maximum string length is 5.
 * If you omit max=5; from the parameter, player can input limitless length.
 *
 * Even if you set maximum string length, player can input limitless length
 * string, but the string is truncated when the input form is closed.
 * This rule is also applied when the form is forcely terminated (to explain
 * below).
 *
 * If you omit x=350; and/or y=200; from the parameter, the position become
 * center of the screen. But when message window is displaying at center of
 * the screen, y position become below of the message window.
 *
 * You also can use variable as to store string like the following notation:
 * v=11;
 * In this case, variable #11's value become the result string,
 * v=Aooni;
 * In this case, the target is the variable whose name is Aooni.
 * (note: you cannot specify the variable name that include white space.)
 * but it's deprecated, because variable is not supporsed to store string.
 *
 * [Advanced option 1 : force termination by switch condition]
 * You also can set time limit of input.
 * For example, when you add if_s=3; to the parameter of above plugin
 * command, the input form will be forcely closed when the switch #3 become ON
 * (You can implement such a process by using a parallel event).
 * 'force_ok_sw' is the alias of 'if_s', so force_ok_sw=3; is equivalent to
 * if_s=3;.
 * Note: when the form is forcely closed, the designated variable keeps
 * the string at the moment!
 *
 * [Important note (esp. if you use parallel events)]
 * - Event command interpreter will not exceed until ending the form inputting.
 * - If you checking the variable by parallel event, make sure that there's
 * slight time rug from input ending by next event command execution.
 * (Comment by Sasuke: To run 'Wait 1 frame' after the input is
 * one of the good way to confirm the valuer of variable.)
 *
 * [Advanced option 2 : custom the OK button's position]
 * For example, add btn_x=100;btn_y=100; to the option,
 * you can change the OK buttion. default position is (0, 72).
 * Note that the position is the relative one from the text box.
 *
 * [Advanced option 3 : display Cancel button]
 * You can display not only OK button but also Cancel button by option.
 * When player click 'Cancel', inputted value is simply discarded.
 * You can change the position of cancel button by following notation in
 * the plugin parameters:
 * btn_xc=300;btn_yc=50;
 * This is the relative position from the text box,
 * and the default position is (120, 72).
 *
 * You also can set time limit of input the same as OK button.
 * force_no_sw=6;
 * By adding this option, the input form will be forcely closed
 * and discard the string on the form when the switch #6 become ON .
 *
 * [Parameters additional explanation]
 * 'Force OK Switch ID' and 'Force Cancel Switch ID' are automatically
 * turn OFF when the form is closed. (whreas, switch set in plugin command
 * doesn't change, it's the difference.)
 *
 * [Advanced option 4 : Change the initial value of input form]
 * At default, initial value is designated actor's name like n=5;,
 * or designated game variable's value(only when the value is a string),
 * otherwise it'll be empty string if 'n'(actor) is not designated.
 * You can change the initial value as following options:
 * init=Hiroshi;  Hiroshi
 * init=;  empty string
 * init_n=3; the name of actor whose id is 3.
 * init_v=10;  the value of game variable #10.
 *
 * [Advanced option 5 : custom the limit number window position]
 * When you set max length option (like max=8;), it will display limit number.
 * If you want to change the position, following option is available.
 * rest_x=300;rest_y=100;
 * In this case, the window will move to (300,100).
 * This is the relative position from the text box,
 * and the default position is (288, 72).
 *
 * [Advanced option 6 : custom the width of input form]
 * Width of input form is supposed to defined in CSS file(default: 15em).
 * You can change the width by following option.
 * w=8;
 * In this case, the width become 8em.
 * Note that 1em is equals to the height of each letter,
 * so if use propotional font (defalut), 1em is length of 2 ascii characters.
 * (and at 2 byte character such as Japanese, 1em is the 1 character.)
 *
 * [License]
 * This plugin is public domain. There's no limitation of use.
 *
 */

/*:ja
 * @plugindesc ゲーム画面上にHTMLの入力フォームを表示します
 * @author 神無月サスケ(原案：１１１、くらむぼん)
 *
 * @param OK Button Text
 * @desc 「決定」ボタンに表示する文字列
 * @default 決定
 *
 * @param Display Cancel Button
 * @desc 「キャンセル」ボタンを表示するか。(0=しない, 1=する)
 * @default 1
 *
 * @param Cancel Button Text
 * @desc 「キャンセル」ボタンに表示する文字列
 * @default キャンセル
 *
 * @param Judge Switch Interval
 * @desc 強制終了スイッチの判定ミリ秒間隔です(推奨値100)。
 * 値を減らすと精度が良くなりますが重くなります。
 * @default 100
 *
 * @param Switch ID Selected OK
 * @desc フォームの決定でON、キャンセルでOFFになるスイッチID。
 * 0の時は何も行いません。
 * @default 0
 *
 * @param Force OK Switch ID
 * @desc このIDのスイッチがONになるとフォームを強制決定します。
 * (つまりif_sのデフォルト値)0の時は作動しません。
 * @default 0
 *
 * @param Force Cancel Switch ID
 * @desc このIDのスイッチがONになるとフォームを強制キャンセルします。
 * 0の時は作動しません。
 * @default 0
 *
 * @help
 * HTML5とCSSの機能を使用して画面上に文字入力フォームを表示します。
 *
 * [最初にすべきこと]
 * このプラグインの実行には、同梱されている「111_InputForm.css」が必要です。
 * index.html のあるフォルダに css フォルダを作成し、そこにこのファイルを
 * 置いてください。
 * このCSSファイルでは入力フォームやボタンのフォームが設定されており、
 * これを書きかえることで自由にスタイルが変更できます。
 * CSSに詳しくない方は「css 書き方」などで検索すればよいでしょう。
 *
 * [プラグインコマンドと実例]
 * 実行はプラグインコマンド呼び出しで行います。
 * その際パラメータは「パラメータ名=値」の設定をセミコロン(;)で区切った形式で
 * 指定します。間にスペースを挟んではいけません。
 *
 * 例：
 * InputForm x=350;y=200;n=1;max=5;
 *
 * この場合、フォームは座標(350,200)の位置に表示され、
 * 結果はアクター1番の名前に保存されます。
 * 最大文字数は5です。パラメータmaxを省略した時は文字数に制限はなくなります。
 *
 * なお、最大文字数を設定した場合でも、それ以上の文字数が入力可能ですが、
 * フォームが閉じられた時に、最大文字数を超える部分はカットされます。
 * これは下記の追加機能によって強制終了した場合でも同じです。
 *
 * x=350; や y=200; を省略した時は、画面サイズに合わせてセンタリングされます。
 * 例外として、メッセージウィンドウが中央に表示されている場合は、
 * y座標はメッセージウィンドウの下になります。
 *
 * 結果の文字列は、ゲーム変数に格納することも可能ですが、推奨されません。
 * v=11;
 * 上記のオプションを付加すると11番の変数に文字列が格納されますが、
 * ゲーム変数への文字列の格納は本来想定されていないため、結果は確証されません。
 *
 * なお、変数はIDのみならず変数名での指定も有効です。
 * v=卓郎生存;
 * この場合、「卓郎生存」という名の変数名のうち一番若い変数IDになります。
 * (注意：半角スペースを含んだ変数名はこの方法では指定できません)
 *
 * [追加機能1 : スイッチONによる強制入力終了]
 * 入力にタイムリミットを設定することも可能です。
 * オプションに if_s=3; を追加した場合、スイッチ3番がONになった時に
 * 入力フォームが強制的に閉じます。
 * （これを実装するには、並列イベントを別に作成しスイッチを操作する必要あり）
 * force_ok_sw=3; と表記しても同様の効果があります。
 * なお、入力フォームが強制的に閉じた際には、その時入力されていた文字列が
 * 指定した変数に入ります。
 *
 * [注意事項(特に並列イベントを使う場合)]
 * - フォーム入力が終了するまで、次のイベントコマンドには進みません。
 * - もし、フォーム入力変数を並列イベントで参照する場合、
 * 入力と実際に変数に反映されるまでの間に若干のタイムラグがあることに注意。
 * (サスケ注:プラグインコマンド実行直後に変数を参照したい場合、
 * 間に「ウェイト:1フレーム」を入れると確実です。)
 *
 * [追加機能2 : 決定ボタンの位置設定]
 * 例えば、プラグインコマンドのオプションに以下を追加します。
 * btn_x=100;btn_y=100;
 * これで決定ボタンの座標が(100,100)になります。
 * この座標は、テキストボックスからの相対座標で、
 * 指定のない場合(0, 72)になります。
 *
 * [追加機能3 : キャンセルボタンの表示]
 * デフォルトでは「決定」ボタンのみの表示ですが、オプションによって
 * 「キャンセル」を表示することが可能です。
 * 「キャンセル」が選択された際には、変数などにいかなる変更も行いません。
 * なお、キャンセルボタンの位置は、以下のようなオプションで変更可能です。
 * btn_xc=300;btn_yc=50;
 * これはテキストボックスからの相対座標で、
 * 指定のない場合(120, 72)になります。
 *
 * また、決定ボタンと同様、スイッチONによる強制キャンセルも可能です。
 * force_no_sw=6;
 * このオプションを追加すると、6番のスイッチがONになった際に
 * 強制キャンセルされます。
 *
 * [パラメータに関する追記事項]
 * 'Force OK Switch ID' と 'Force Cancel Switch ID' は、フォームを閉じた際、
 * 自動的にOFFになります。(プラグインオプションのスイッチはそうなりません)
 *
 * [追加機能4 : 入力フォームの初期文字列の変更]
 * デフォルトでは、n=5;などが指定された場合、そのアクターの名前が、
 * v=11;などが指定され、その変数に文字列が格納されている場合その値が、
 * それ以外の場合は空文字が初期文字列になります。
 * 以下のオプションで、代入対象に関係なく初期文字列を設定可能です。
 * init=ひろし; とすると、初期文字列は「ひろし」になります。
 * init=; のように、空文字の設定も可能です。
 * init_n=3; とすると、3番のアクターの名前が初期文字列になります。
 * init_v=10; とすると、変数10番の値が初期文字列になります。
 *
 * [追加機能5 : 入力可能文字数の位置設定]
 * max=8; のように最大文字数を設定した場合、入力可能文字数が表示されますが、
 * この位置を以下のオプションで変更可能です。
 * rest_x=300;rest_y=100;
 * これで(300,100)に入力可能文字数が表示されるようになります。
 * この座標は、テキストボックスからの相対座標で、
 * 指定のない場合(288, 72)になります。
 *
 * [追加機能6 : 入力フォームの幅の設定]
 * 入力フォームの幅は、CSSファイルにて設定されています(初期値：15em)。
 * このサイズを以下のオプションによって変更可能です。
 * w=8;
 * この場合、入力フォームの幅は8emになります。
 * なお、1emは1文字の高さに相当し、プロポーショナルフォントを使用する限りは、
 * wで指定した値が、表示可能な日本語文字数の長さと等しくなります。
 *
 * [著作権表記]
 * このプラグインは、１１１様、くらむぼん様の 111_InputForm.js をベースに、
 * 神無月サスケが大規模な加筆修正を行ったものです。お二方に感謝します。
 *
 * このプラグインはパブリックドメインです。利用にいかなる制限もありません。
 */

(function () {
  //
  // for iOS, stop propagation (in order to prevent error)
  //
  var stopPropagation = function (e) {
    e.stopPropagation();
  };

  //
  // Import CSS at first.
  // (css追加)
  //
  (function () {
    var css = document.createElement('link');
    css.rel = "stylesheet";
    css.type = 'text/css';
    css.href = './css/111_InputForm.css';
    var b_top = document.getElementsByTagName('head')[0];
    b_top.appendChild(css);
  })();

  //
  // Invalidate input function on MV script layer
  // (キー入力不可にする為に)
  //
  Input.formMode = false;
  var _Input_onKeyDown = Input._onKeyDown;
  Input._onKeyDown = function (event) {
    if (Input.formMode) {
      return;
    }
    _Input_onKeyDown.call(this, event);
  };
  var _Input_onKeyUp = Input._onKeyUp;
  Input._onKeyUp = function (event) {
    if (Input.formMode) {
      return;
    }
    _Input_onKeyUp.call(this, event);
  };

  //
  // Interpreter waits until form input is terminated.
  // (入力終わるまで次のイベントコマンド読み込まない)
  //
  var _Game_Interpreter_updateWaitMode =
    Game_Interpreter.prototype.updateWaitMode;
  Game_Interpreter.prototype.updateWaitMode = function () {
    if (this._waitMode == 'input_form') {
      return true;
    }
    return _Game_Interpreter_updateWaitMode.call(this);
  }

  //
  // when input form opens while message window is open, not close it.
  // (メッセージウィンドウの表示の次に呼び出された場合、
  // メッセージウィンドウを消さないまま入力する)
  //
  var _Game_Interpreter_command101 = Game_Interpreter.prototype.command101;
  Game_Interpreter.prototype.command101 = function () {
    _Game_Interpreter_command101.call(this);
    var command = this._list[this._index];
    // if the next command is Plugin Command "InputForm"
    if (command && command.code === 356) {
      if ((/^InputForm /).test(this._list[this._index].parameters[0])) {
        this.command356();
      }
    }
    return false;
  };
  var _Window_Message_doesContinue = Window_Message.prototype.doesContinue;
  Window_Message.prototype.doesContinue = function () {
    return Input.formMode || _Window_Message_doesContinue.call(this);
  };

  //
  // Routine for HTML
  //
  HTMLElement.prototype.positionAdjust = function (screenPos, targetPos) {
    // read CSS properties
    if (this.defaultFontSize == null) {
      var _elem = document.getElementById(this.id);
      if (_elem.currentStyle) { // for IE and so on.
        _elem = _elem.currentStyle;
      } else { // for Chrome, Safari, Opera, and so on.
        _elem = window.getComputedStyle(_elem, null);
      }
      this.defaultFontSize = parseInt(_elem['font-size']) || 24;
    }
    // set width by scale
    var scale = Graphics._realScale;
    this.style.left = Math.floor(screenPos['x'] + targetPos['x'] * scale) +
      'px';
    this.style.top = Math.floor(screenPos['y'] + targetPos['y'] * scale) +
      'px';
    this.style['font-size'] = Math.floor(this.defaultFontSize * scale) + 'px';
  };

  //=========================================================================
  // process parameters (and related functions)
  //=========================================================================
  var parameters = PluginManager.parameters('111_InputForm');
  var textOkButton = parameters['OK Button Text'] || 'OK';
  var textCancelButton = parameters['Cancel Button Text'] || 'Cancel';
  var doDisplayCancel = !!Number(parameters['Display Cancel Button']);
  var judgeInterval = Number(parameters['Judge Switch Interval'] || 100);
  var switchIdOkPressed = Number(parameters['Switch ID Selected OK'] || 0);
  var switchIdForceOk = Number(parameters['Force OK Switch ID'] || 0);
  var switchIdForceCancel = Number(parameters['Force Cancel Switch ID'] || 0);

  //
  // analyze variable parameter notation
  //
  var getVariableIdWhoseNameIs = function (name) {
    var varNames = $dataSystem.variables;
    for (var i = 1; i < varNames.length; i++) {
      if (varNames[i] === name) {
        return i;
      }
    }
    return 0;
  };
  var getVariableIdFromParam = function (varIdNotation) {
    var reg;
    varIdNotation = String(varIdNotation);
    if (reg = (/^(V?)([0-9]+)/i).exec(varIdNotation)) {
      return reg[1] ? $gameVariables.value(+reg[2]) : +reg[2];
    } else {
      return getVariableIdWhoseNameIs(varIdNotation);
    }
  };

  //
  // determine initial string of input form
  //
  var _defaultInputString = function (text, actorId, varId) {
    if (text != null) {
      return text;
    } else if (actorId && $gameActors.actor(actorId)) {
      return $gameActors.actor(actorId).name();
    } else if (varId && ($gameVariables.value(varId) instanceof String)) {
      return $gameVariables.value(varId);
    }
    return '';
  };
  var defaultInputString = function (params) {
    var text = params['init'];
    var actorId = params['init_n'] || params['n'];
    var varId = params['init_v'];
    return _defaultInputString(text, actorId, varId);
  };

  //
  // routine for the case that string length is limited
  //
  var _strLengthText = function (current, max) {
    return String(current) + '/' + max;
  };
  var _setStringColorByLength = function (target, current, max) {
    target.style.color = current > max ? 'red' : 'white';
  };
  var truncateString = function (text, max) {
    return max ? text.substring(0, max) : text;
  };
  var setLimitedStrLength = function (target, current, max) {
    target.textContent = _strLengthText(current, max);
    _setStringColorByLength(target, current, max);
  };

  //
  // centering the input form
  //
  var defaultTargetX = function (target) {
    var rect = target.getBoundingClientRect();
    var width = rect.width + window.pageXOffset;
    return Math.floor((Graphics.boxWidth - width) / 2);
  };
  var defaultTargetY = function (target) {
    // when message window is displaying at the center,
    // change position to below the message window.
    var msgWnd = SceneManager._scene._messageWindow;
    if (msgWnd.isOpen() && msgWnd._positionType === 1) {
      return msgWnd.y + msgWnd.height + msgWnd.standardPadding() * 2;
    }
    var rect = target.getBoundingClientRect();
    var height = rect.height + window.pageYOffset;
    return Math.floor((Graphics.boxHeight - height) / 2);
  };

  //
  // resize the width of input form
  //
  var setFormWidth = function (maxTextLength, target) {
    target.style.cssText += " width: " + maxTextLength + 'em';
  };

  //
  // parse parameters
  //
  var numericParamNames = ['x', 'y', 'max', 'if_s', 'btn_x', 'btn_y',
    'btn_xc', 'btn_yc', 'n', 'force_ok_sw', 'force_no_sw', 'init_n',
    'rest_x', 'rest_y', 'w'];
  var stringParamNames = ['init'];
  var processParameters = function (paramText) {
    var params = {};
    // set default value set in plugin parameter
    params['btn_x'] = 0;
    params['btn_y'] = 72;
    params['btn_xc'] = 120;
    params['btn_yc'] = 72;
    params['rest_x'] = 288;
    params['rest_y'] = 72;
    if (switchIdForceOk) {
      params['force_ok_sw'] = switchIdForceOk;
    }
    if (switchIdForceCancel) {
      params['force_no_sw'] = switchIdForceCancel;
    }
    // parse argument of plugin command
    paramText.split(';').forEach(function (param) {
      if (reg = (/^(\w+)=(\S*)$/i).exec(param)) {
        var key = reg[1].toLowerCase();
        if (key === 'v' || key === 'init_v') {
          params[key] = getVariableIdFromParam(reg[2]);
        } else if (numericParamNames.contains(key)) {
          params[key] = Number(reg[2]);
        } else if (stringParamNames.contains(key)) {
          params[key] = reg[2];
        }
      }
    });
    return params;
  };

  //=========================================================================
  // Game_Interpreter - register plugin command
  //=========================================================================
  var _Game_Interpreter_pluginCommand =
    Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'InputForm') {
      var params = processParameters(args[0]);
      var targetX = params['x'] || null;
      var targetY = params['y'] || null;
      var varId = params['v'] || 0;
      var actorId = params['n'] || 0;
      var maxCount = params['max'] || null;
      var ifSwitchId = params['if_s'] || params['force_ok_sw'] || 0;
      var rejectSwitchId = params['force_no_sw'] || 0;
      var buttonX = params['btn_x'];
      var buttonY = params['btn_y'];
      var cancelButtonX = params['btn_xc'];
      var cancelButtonY = params['btn_yc'];
      var strLengthX = params['rest_x'];
      var strLengthY = params['rest_y'];
      var formWidth = params['w'] || null;

      var interpreter = this;
      var gui = {
        input: null,
        submit: null,
        cancel: null,
        stringLength: null,
        is_pc: true,
        init: function () {
          this.is_pc = Utils.isNwjs();
          this.create();
          this.input.focus();
          this.screenAdjust();
        },
        create: function () {
          // Input form (入力フォーム)
          this.input = document.createElement('input');
          this.input.setAttribute('id', '_111_input');
          // following limitation is inconvinient when Japanese uses IME.
          // (以下は、IME入力の際、必要な変換が出来ない場合があるため削除)
          // if (maxCount) {
          //   this.input.setAttribute('maxlength', maxCount);
          // }
          this.input.value = defaultInputString(params);
          document.body.appendChild(this.input);
          if (formWidth) {
            setFormWidth(formWidth, this.input);
          }
          targetX = targetX || defaultTargetX(this.input);
          targetY = targetY || defaultTargetY(this.input);
          // Submit Button (送信ボタン)
          this.submit = document.createElement('input');
          this.submit.setAttribute('type', 'submit');
          this.submit.setAttribute('id', '_111_submit');
          this.submit.setAttribute('value', textOkButton);
          document.body.appendChild(this.submit);
          // Cancel Button (キャンセルボタン)
          if (doDisplayCancel) {
            this.cancel = document.createElement('input');
            this.cancel.setAttribute('type', 'submit');
            this.cancel.setAttribute('id', '_111_submit');
            this.cancel.setAttribute('value', textCancelButton);
            document.body.appendChild(this.cancel);
          }
          // Display string length of current/max (入力/最大文字数表示)
          if (maxCount) {
            this.strLength = document.createElement('span');
            this.strLength.setAttribute('id', '_Sasuke_RestStrLength');
            setLimitedStrLength(this.strLength, this.input.value.length,
              maxCount);
            document.body.appendChild(this.strLength);
          }
        },
        accept: function () {
          this.input.value = truncateString(this.input.value, maxCount);
          if (varId) {
            $gameVariables.setValue(varId, this.input.value);
          }
          if (actorId && $gameActors.actor(actorId)) {
            $gameActors.actor(actorId).setName(this.input.value);
          }
          if (switchIdOkPressed) {
            $gameSwitches.setValue(switchIdOkPressed, true);
          }
          this.end();
        },
        reject: function () {
          if (switchIdOkPressed) {
            $gameSwitches.setValue(switchIdOkPressed, false);
          }
          this.end();
        },
        start: function () {
          interpreter.setWaitMode('input_form');
          Input.clear();
          Input.formMode = true;
        },
        end: function () {
          this.input.remove();
          this.submit.remove();
          if (this.cancel) {
            this.cancel.remove();
          }
          if (this.strLength) {
            this.strLength.remove();
          }
          window.removeEventListener("resize", resizeEvent, false);
          interpreter.setWaitMode('');
          Input.formMode = false;
          clearInterval(_eventId);
        },
        screenAdjust: function () { // canvasの左上を基準にした位置に合わせる
          var _canvas = document.querySelector('#UpperCanvas');
          var rect = _canvas.getBoundingClientRect();
          var screenX = rect.left;
          var screenY = rect.top;
          this.input.positionAdjust({ x: screenX, y: screenY },
            { x: targetX, y: targetY });
          this.submit.positionAdjust({ x: screenX, y: screenY },
            { x: targetX + buttonX, y: targetY + buttonY });
          if (this.cancel) {
            this.cancel.positionAdjust({ x: screenX, y: screenY },
              { x: targetX + cancelButtonX, y: targetY + cancelButtonY });
          }
          if (this.strLength) {
            this.strLength.positionAdjust({ x: screenX, y: screenY },
              { x: targetX + strLengthX, y: targetY + strLengthY });
          }
        }
      }
      // ----------------------------------------
      gui.init();
      gui.input.addEventListener("keydown", function (e) {
        if (e.keyCode === 13) { // 決定キーで送信
          Input.clear();
          gui.accept();
          // stop propagation not to fire keydown event in document.
          // (親へのイベント伝播を止める(documentのkeydownが反応しないように))
          e.stopPropagation();
        }
      });
      // ----------------------------------------
      //
      // To prevent iOS environment, stop several propagations
      //

      // To prevent click bomb on other game screen
      //  (裏のゲーム画面のクリック暴発を防ぐ)
      gui.input.addEventListener("mousedown", stopPropagation);
      gui.submit.addEventListener("mousedown", stopPropagation);
      if (gui.cancel) {
        gui.cancel.addEventListener("mousedown", stopPropagation);
      }
      // To be sure to catch the event on iOS
      // （iOSでclickイベント取れない対策）
      gui.input.addEventListener("touchstart", stopPropagation);
      gui.submit.addEventListener("touchstart", stopPropagation);
      if (gui.cancel) {
        gui.cancel.addEventListener("touchstart", stopPropagation);
      }

      // ----------------------------------------
      // OK button clicked (送信ボタンクリック)
      gui.submit.addEventListener("click", function () {
        gui.accept();
        return false;
      });
      if (gui.cancel) {
        gui.cancel.addEventListener("click", function () {
          gui.reject();
          return false;
        });
      }
      if (gui.strLength) {
        gui.input.addEventListener("keyup", function () {
          setLimitedStrLength(gui.strLength, gui.input.value.length, maxCount);
          return false;
        });
      }
      // Event for forcing termination by switch condition
      // (スイッチによって強制終了するイベント)
      if (ifSwitchId || rejectSwitchId) {
        var _eventId = setInterval(function () {
          if ($gameSwitches.value(rejectSwitchId)) {
            if (switchIdForceCancel) {
              $gameSwitches.setValue(switchIdForceCancel, false);
            }
            gui.reject();
          } else if ($gameSwitches.value(ifSwitchId)) {
            if (switchIdForceOk) {
              $gameSwitches.setValue(switchIdForceOk, false);
            }
            gui.accept();
          }
        }, judgeInterval);
      }
      // At some condition, it needs to change ratio(%) of elements' size
      // everytime when browser's size changes.
      // (ブラウザではウィンドウのサイズが変わる度に%求め直すイベントが必要)
      //if(! gui.is_pc){
      var resizeEvent = gui.screenAdjust.bind(gui);
      window.addEventListener("resize", resizeEvent, false);
      //}
      //
      gui.start();
    }
  };
})();


code:
//=============================================================================
// PartyCommandSkip.js
//=============================================================================

/*:
 * @plugindesc 戦闘の戦う・逃げるを飛ばして戦闘へ
 * @author １１１
 *
 * @desc 戦闘の戦う・逃げるを飛ばして戦闘へ
 *
 * @param SwitchNumber
 * @default 111
 *
 * @help
 * Parametersの番号のスイッチがONだった時、
 * 戦闘に入る時の「戦う・逃げる」メニューを飛ばして
 * そのまま戦闘へ。
 *
 */
(function () {
    var parameters = PluginManager.parameters('111_PartyCommandSkip');
    var swicth_number = String(parameters['SwitchNumber'] || '111');
    swicth_number = +swicth_number;

    Scene_Battle.prototype.changeInputWindow = function () {
        if (BattleManager.isInputting()) {
            if ($gameSwitches.value(swicth_number)) {
                // 戦う・逃げるの決定飛ばす
                BattleManager._actorIndex = 0;
                this.startActorCommandSelection();
            } else
                if (BattleManager.actor()) {
                    this.startActorCommandSelection();
                } else {
                    this.startPartyCommandSelection();
                }
        } else {
            this.endCommandSelection();
        }
    };

})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// AKUNOU_VXWindowSkin.js
// Version: 1.00
// ----------------------------------------------------------------------------
// 河原 つつみ
// 連絡先 ：『アクマの脳髄』http://www.akunou.com/
//=============================================================================

/*:
 * @plugindesc RPGツクールVX系サイズのウィンドウスキン画像がMVで使えるようになります。
 * @author Tsutumi Kawahara
 * @help
 * プラグインコマンド:
 *   必要なし
 * プラグイン ON にするだけで適用されるスクリプトです。
 *
 * ウィンドウカラーの変更にも対応していますが、
 * エディタ上では色が変わって見えませんので注意して下さい。
 */

(function () {

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

    /**
    * @method _refreshBack
    * @private
    */
    Window.prototype._refreshBack = function () {
        var m = this._margin;
        var w = this._width - m * 2;
        var h = this._height - m * 2;
        var bitmap = new Bitmap(w, h);

        this._windowBackSprite.bitmap = bitmap;
        this._windowBackSprite.setFrame(0, 0, w, h);
        this._windowBackSprite.move(m, m);

        if (w > 0 && h > 0 && this._windowskin) {
            var p = 64;
            bitmap.blt(this._windowskin, 0, 0, p, p, 0, 0, w, h);
            for (var y = 0; y < h; y += p) {
                for (var x = 0; x < w; x += p) {
                    bitmap.blt(this._windowskin, 0, p, p, p, x, y, p, p);
                }
            }
            var tone = this._colorTone;
            bitmap.adjustTone(tone[0], tone[1], tone[2]);
        }
    };

    /**
    * @method _refreshFrame
    * @private
    */
    Window.prototype._refreshFrame = function () {
        var w = this._width;
        var h = this._height;
        var m = 16;
        var bitmap = new Bitmap(w, h);

        this._windowFrameSprite.bitmap = bitmap;
        this._windowFrameSprite.setFrame(0, 0, w, h);

        if (w > 0 && h > 0 && this._windowskin) {
            var skin = this._windowskin;
            var p = 64;
            var q = 64;
            bitmap.blt(skin, p + m, 0 + 0, p - m * 2, m, m, 0, w - m * 2, m);
            bitmap.blt(skin, p + m, 0 + q - m, p - m * 2, m, m, h - m, w - m * 2, m);
            bitmap.blt(skin, p + 0, 0 + m, m, p - m * 2, 0, m, m, h - m * 2);
            bitmap.blt(skin, p + q - m, 0 + m, m, p - m * 2, w - m, m, m, h - m * 2);
            bitmap.blt(skin, p + 0, 0 + 0, m, m, 0, 0, m, m);
            bitmap.blt(skin, p + q - m, 0 + 0, m, m, w - m, 0, m, m);
            bitmap.blt(skin, p + 0, 0 + q - m, m, m, 0, h - m, m, m);
            bitmap.blt(skin, p + q - m, 0 + q - m, m, m, w - m, h - m, m, m);
        }
    };

    /**
    * @method _refreshCursor
    * @private
    */
    Window.prototype._refreshCursor = function () {
        var pad = this._padding;
        var x = this._cursorRect.x + pad - this.origin.x;
        var y = this._cursorRect.y + pad - this.origin.y;
        var w = this._cursorRect.width;
        var h = this._cursorRect.height;
        var m = 2;
        var x2 = Math.max(x, pad);
        var y2 = Math.max(y, pad);
        var ox = x - x2;
        var oy = y - y2;
        var w2 = Math.min(w, this._width - pad - x2);
        var h2 = Math.min(h, this._height - pad - y2);
        var bitmap = new Bitmap(w2, h2);

        this._windowCursorSprite.bitmap = bitmap;
        this._windowCursorSprite.setFrame(0, 0, w2, h2);
        this._windowCursorSprite.move(x2, y2);

        if (w > 0 && h > 0 && this._windowskin) {
            var skin = this._windowskin;
            var p = 64;
            var q = 32;
            bitmap.blt(skin, p + m, p + m, q - m * 2, q - m * 2, ox + m, oy + m, w - m * 2, h - m * 2);
            bitmap.blt(skin, p + m, p + 0, q - m * 2, m, ox + m, oy + 0, w - m * 2, m);
            bitmap.blt(skin, p + m, p + q - m, q - m * 2, m, ox + m, oy + h - m, w - m * 2, m);
            bitmap.blt(skin, p + 0, p + m, m, q - m * 2, ox + 0, oy + m, m, h - m * 2);
            bitmap.blt(skin, p + q - m, p + m, m, q - m * 2, ox + w - m, oy + m, m, h - m * 2);
            bitmap.blt(skin, p + 0, p + 0, m, m, ox + 0, oy + 0, m, m);
            bitmap.blt(skin, p + q - m, p + 0, m, m, ox + w - m, oy + 0, m, m);
            bitmap.blt(skin, p + 0, p + q - m, m, m, ox + 0, oy + h - m, m, m);
            bitmap.blt(skin, p + q - m, p + q - m, m, m, ox + w - m, oy + h - m, m, m);
        }
    };

    /**
    * @method _refreshArrows
    * @private
    */
    Window.prototype._refreshArrows = function () {
        var w = this._width;
        var h = this._height;
        var p = 16;
        var q = p / 2;
        var sx = 64 + p;
        var sy = 0 + p;
        this._downArrowSprite.bitmap = this._windowskin;
        this._downArrowSprite.anchor.x = 0.5;
        this._downArrowSprite.anchor.y = 0.5;
        this._downArrowSprite.setFrame(sx + q, sy + q + p, p, q);
        this._downArrowSprite.move(w / 2, h - q);
        this._upArrowSprite.bitmap = this._windowskin;
        this._upArrowSprite.anchor.x = 0.5;
        this._upArrowSprite.anchor.y = 0.5;
        this._upArrowSprite.setFrame(sx + q, sy, p, q);
        this._upArrowSprite.move(w / 2, q);
    };

    /**
    * @method _refreshPauseSign
    * @private
    */
    Window.prototype._refreshPauseSign = function () {
        var sx = 96;
        var sy = 64;
        var p = 16;
        this._windowPauseSignSprite.bitmap = this._windowskin;
        this._windowPauseSignSprite.anchor.x = 0.5;
        this._windowPauseSignSprite.anchor.y = 1;
        this._windowPauseSignSprite.move(this._width / 2, this._height);
        this._windowPauseSignSprite.setFrame(sx, sy, p, p);
        this._windowPauseSignSprite.alpha = 0;
    };

    /**
    * @method _updatePauseSign
    * @private
    */
    Window.prototype._updatePauseSign = function () {
        var sprite = this._windowPauseSignSprite;
        var x = Math.floor(this._animationCount / 16) % 2;
        var y = Math.floor(this._animationCount / 16 / 2) % 2;
        var sx = 96;
        var sy = 64;
        var p = 16;
        if (!this.pause) {
            sprite.alpha = 0;
        } else if (sprite.alpha < 1) {
            sprite.alpha = Math.min(sprite.alpha + 0.1, 1);
        }
        sprite.setFrame(sx + x * p, sy + y * p, p, p);
        sprite.visible = this.isOpen();
    };

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

    Window_Base.prototype.textColor = function (n) {
        var px = 64 + (n % 8) * 8 + 4;
        var py = 96 + Math.floor(n / 8) * 8 + 4;
        return this.windowskin.getPixel(px, py);
    };

    Window_Base.prototype.pendingColor = function () {
        return this.windowskin.getPixel(80, 80);
    };

})();


code:
//=============================================================================
// AddFunctionByVillaA.js
//=============================================================================

/*:ja
 * @plugindesc 諸プラグインへの機能追加を提供するプラグインです。
 * @author 村人A
 *
 * @help
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
 * バージョン情報
 *
 * 23/01/24 バージョン1.3　 不具合修正
 * 23/01/13 バージョン1.2　 茂みを考慮
 * 23/01/09 バージョン1.1　 不具合修正
 * 23/01/08 バージョン1.0　 試作品リリース
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
 * ＊このプラグインはTsumioGatheringSystem.jsよりも下に配置してください。
 *
 * TsumioGatheringSystem.jsに追加した機能をまとめたプラグインです。
 * プラグイン導入初期にプラグインパラメータにて使用する変数とコモンイベントを設定
 * してください。
 * サンプルプロジェクトのコモンイベント４がガジェット変更時のコモンイベントとしま
 * した。
 * 取得した変数によって条件分岐としております。
 *
 * 23/01/08現在このプラグインにて実装してる機能は
 *
 * ・弓等の投擲機能
 * ・弓の連射機能
 * ・ガジェット変更時のコモにベント実行と変数代入
 * ・ガジェットの当たり判定範囲化
 * ・下方向への収集動作のキャラチップの位置調整
 *
 * となります。
 *
 * ガジェットの当たり判定について、範囲を指定する箇所はTsumioGatheringSystem.jsの
 * プラグインパラメータ「追加アクションのリスト」のcollisionDistanceにて指定する
 * のは変わりありませんが、指定方法が変わりました。
 * これまでと同様に1~4マスに当たり判定をつけたい場合は「4」と記述すればそのように
 * なります。
 * 2マス目のみや2~3マス目に当たり判定を設けたい場合は「開始マス目,終了マス目」で
 * 指定してください。
 * 例えば2~3マス目に当たり判定をつけたい場合は「2,3」と記述し、２マス目のみに当た
 * り判定をつけたい場合は「2,2」と記述してください。
 *
 * 収集動作でストップさせたい場合はTsumioGatheringSystem.jsのプラグインパラメータ
 * 「追加アクションのリスト」のwaitPatternNumにてパターン番号を指定してください。
 * パターン番号は左から0,1,2…と続きます。
 * 動作途中で止まる必要がない場合は-1と指定してください。
 * パターン途中で止めた場合は実行するイベントの最後にスクリプトで
 *
 * $gamePlayer.isStopGatheringAction = false
 *
 * と記述してください。
 * サンプルプロジェクトの魚影のイベントにサンプルがあります。
 * このスクリプトが実行された際にプレイヤーのパターンストップが解除されます。
 * パターンのストップの仕方に柔軟性を持たせるために現在の仕様にしましたが、それぞ
 * れのイベントに記述するのは大変ですのでコモンイベントなどにしてください。
 * このスクリプトの記述がない場合はパターンがそのままになってしまいます。
 *
 *
 *
 * @param n2
 * @text ガジェット変更時コモンイベント
 * @desc ガジェット変更時に実行するコモンイベントのIDを指定します。
 * @type number
 * @default 4
 *
 * @param n3
 * @text ガジェット判定用変数
 * @desc 現在選択しているガジェットの番号を代入する変数のIDを指定します。
 * @type number
 * @default 5
 *
 *
 *
 *
 *
 *
 *
 */

{
	'use strict'

	String.prototype.toNumArray = function () {
		return this.split(',').map(str => Number(str));
	}

	const t_param = PluginManager.parameters('TsumioGatheringSystem');
	if (!t_param) { throw new Error("AddFunctionByVillaAをTsumioGatheringSystemよりも下部に配置してください。") }
	let collisionDistance = {};
	let waitPatternNum = {};
	JSON.parse(t_param['追加アクションのリスト']).map(str => JSON.parse(str)).forEach(obj => {
		collisionDistance[obj.symbol] = obj.collisionDistance
		waitPatternNum[obj.symbol] = Number(obj.waitPatternNum)
	})

	const param = PluginManager.parameters('AddFunctionByVillaA');
	let _ = {};
	Object.keys(param).forEach(key => {
		if (key[0] == "n" && key[1] == "a") {
			_[key] = param[key].toNumArray();
		} else if (key[0] == "n") {
			_[key] = Number(param[key]);
		} else if (key[0] == "s" && key[1] == "a" && key[2] == "a") {
			_[key] = JSON.parse(param[key]).map(str => str.split(','));
		} else if (key[0] == "s" && key[1] == "a") {
			_[key] = JSON.parse(param[key]);
		} else if (key[0] == "s") {
			_[key] = param[key];
		} else if (key[0] == "a") {
			_[key] = param[key].toAudioParam();
		}
	})

	//-----------------------------------------------------------------------------
	// Game_CharacterBase
	//

	const _alias_Game_CharacterBase_pattern = Game_CharacterBase.prototype.pattern;
	Game_CharacterBase.prototype.pattern = function () {
		if (this.isGatheringActor() && this.isStopGatheringAction == 1 && this._pattern == $gamePlayer.waitPatternNum) {
			this.isStopGatheringAction = 2
		}
		return _alias_Game_CharacterBase_pattern.call(this);
	};

	const _alias_Game_CharacterBase_updateAnimationCount = Game_CharacterBase.prototype.updateAnimationCount;
	Game_CharacterBase.prototype.updateAnimationCount = function () {
		if (this == $gamePlayer && this.isStopGatheringAction == 2) { return }
		_alias_Game_CharacterBase_updateAnimationCount.call(this);
	};

	//-----------------------------------------------------------------------------
	// Game_Player
	//

	Game_Player.prototype.addFunctionToGetheringAction = function () {
		const _this = this._gatheringAction
		_this._setThrowObject = () => {
			const m = _this.fetchCurrentModel();
			$gameMap.setMovingObjects(m.throwImage.split(','), m.collisionDistance);
		}
		const _alias_Game_GatheringAction_invokeAction = _this._invokeAction
		_this._invokeAction = (event) => {
			_this.onAction = true;
			if (_this.fetchCurrentModel().throwImage) {
				_this._setThrowObject();
			}
			_alias_Game_GatheringAction_invokeAction.call(_this, event);
			_this.onAction = false;
		}
		const _alias_Game_GatheringAction_shouldEndAnimation = _this._shouldEndAnimation
		_this._shouldEndAnimation = () => {
			if ($gamePlayer.isStopGatheringAction == 2) { return false }
			return _alias_Game_GatheringAction_shouldEndAnimation.call(_this)
		}
		const _alias_Game_GatheringAction_refreshActionItemWindow = _this.refreshActionItemWindow
		_this.refreshActionItemWindow = () => {
			_alias_Game_GatheringAction_refreshActionItemWindow.call(_this);
			//23/01/24 追記
			if (!_this.onAction) {
				$gameVariables.setValue(_.n3, _this._currentIndex)
				$gameTemp.reserveCommonEvent(_.n2);
			}
		}
		const _alias_Game_GatheringAction_startActing = _this._startActing
		_this._startActing = () => {
			_alias_Game_GatheringAction_startActing.call(_this);
			if (~["弓矢"].indexOf(_this._currentSymbol)) { this._isActing = false };
		}
		this._gatheringAction.isAddedFunction = true
	}

	const _alias_Game_Player_initMembers = Game_Player.prototype.initMembers;
	Game_Player.prototype.initMembers = function () {
		_alias_Game_Player_initMembers.call(this);
		this.addFunctionToGetheringAction();
	}

	//23/02/02 ロード後に追加機能が無効になる点への対策
	const _alias_Scene_Load_onLoadSuccess = Scene_Load.prototype.onLoadSuccess;
	Scene_Load.prototype.onLoadSuccess = function () {
		_alias_Scene_Load_onLoadSuccess.call(this)
		$gamePlayer.addFunctionToGetheringAction();
	}

	const getForwardPosition = function (x, y, dir) {
		return {
			x: $gameMap.xWithDirection(x, dir),
			y: $gameMap.yWithDirection(y, dir)
		};
	};

	//-----------------------------------------------------------------------------
	// Game_Map
	//

	Game_Map.prototype._searchGatheringTarget = function (actionModel) {
		if (!$gamePlayer.canGathering()) { return null }
		$gamePlayer.waitPatternNum = waitPatternNum[actionModel.symbol];
		const forwardPos = $gamePlayer.getForwardPosition();
		const range = ~collisionDistance[actionModel.symbol].indexOf(",") ? collisionDistance[actionModel.symbol].toNumArray() : [1, Number(collisionDistance[actionModel.symbol])];
		let x = forwardPos.x;
		let y = forwardPos.y;
		let count = 1;
		let targetEvent;
		while (count <= range[1]) {
			targetEvent = $gameMap.eventsXy(x, y).find(ev => ev.event().meta[actionModel.symbol]);
			if (count >= range[0] && targetEvent) {
				break;
			} else {
				const nextPos = getForwardPosition(x, y, $gamePlayer.direction());
				x = nextPos.x;
				y = nextPos.y;
				count++;
			}
		}
		$gamePlayer.isStopGatheringAction = !!targetEvent ? 1 : 0;
		return targetEvent;
	};

	Game_Actor.prototype.setCharacterImage = function (characterName, characterIndex) {
		console.log(this._characterName, characterName)
		//if(this._characterName == "$00_player-eda" && characterName == "$00_player_eda"){throw new Error("a")}
		this._characterName = characterName;
		this._characterIndex = characterIndex;
	};
	//-----------------------------------------------------------------------------
	// Sprite_Character
	//

	const _alias_Sprite_Character_updateFrame = Sprite_Character.prototype.updateFrame;
	Sprite_Character.prototype.updateFrame = function () {
		if (this._character == $gamePlayer) {
			let anchorY = 1;
			if (this._character.isGatheringActor() && this._character.direction() == 2) {
				const d = (this._isBigCharacter ? 192 : 384) - this._bushDepth * 3;
				anchorY = d / this.bitmap.height;
			}
			this.anchor.y = anchorY;
			if (this._upperBody && this._bushDepth > 0) {
				this._upperBody.anchor.y = anchorY;
				this._lowerBody.anchor.y = anchorY;
			}
		}
		_alias_Sprite_Character_updateFrame.call(this);
	}
}


code:
//=============================================================================
// AllSeStop.js
// Copyright (c) 2020- 村人Ａ
//=============================================================================

/*:ja
 * @plugindesc 一度に多くのSEを再生した際に一部のSEに停止が効かない不具合を修正するプラグインです。
 * @author 村人Ａ
 *
 * @help
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
 * 更新履歴
 *
 * 21/02/09 ver 1.0 リリース
 *
 * _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
 *
*/

{
	'use strict';

	AudioManager._seAllBuffers = [];

	const _alias_AudioManager_stopSe = AudioManager.stopSe;
	AudioManager.stopSe = function () {
		_alias_AudioManager_stopSe.call(this);
		this._seAllBuffers.forEach(function (buffer) {
			buffer.stop();
		});
		this._seAllBuffers = [];
	};

	const _alias_AudioManager_playSe = AudioManager.playSe;
	AudioManager.playSe = function (se) {
		_alias_AudioManager_playSe.call(this, se)
		if (se.name) {
			this._seAllBuffers.push(this._seBuffers[0]);
		}
	};
}


code:
//=============================================================================
// AltMenuScreen.js
//=============================================================================

/*:
 * @plugindesc Alternative menu screen layout.
 * @author Yoji Ojima
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc メニュー画面のレイアウトを変更します。
 * @author Yoji Ojima
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function () {

    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;
    };

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

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

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

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

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

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

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

    Window_MenuStatus.prototype.drawItemImage = function (index) {
        var actor = $gameParty.members()[index];
        var rect = this.itemRectForText(index);
        var w = Math.min(rect.width, 144);
        var h = Math.min(rect.height, 144);
        var lineHeight = this.lineHeight();
        this.changePaintOpacity(actor.isBattleMember());
        this.drawActorFace(actor, rect.x, rect.y + lineHeight * 2.5, w, h);
        this.changePaintOpacity(true);
    };

    Window_MenuStatus.prototype.drawItemStatus = function (index) {
        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.drawActorLevel(actor, x, y + lineHeight * 1, width);
        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);
    };

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

})();


code:
//=============================================================================
// AltSaveScreen.js
//=============================================================================

/*:
 * @plugindesc Alternative save/load screen layout.
 * @author Yoji Ojima
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc セーブ／ロード画面のレイアウトを変更します。
 * @author Yoji Ojima
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function () {

    var _Scene_File_create = Scene_File.prototype.create;
    Scene_File.prototype.create = function () {
        _Scene_File_create.call(this);
        this._listWindow.height = this._listWindow.fittingHeight(8);
        var x = 0;
        var y = this._listWindow.y + this._listWindow.height;
        var width = Graphics.boxWidth;
        var height = Graphics.boxHeight - y;
        this._statusWindow = new Window_SavefileStatus(x, y, width, height);
        this._statusWindow.setMode(this.mode());
        this._listWindow.statusWindow = this._statusWindow;
        this._listWindow.callUpdateHelp();
        this.addWindow(this._statusWindow);
    };

    var _Scene_File_start = Scene_File.prototype.start;
    Scene_File.prototype.start = function () {
        _Scene_File_start.call(this);
        this._listWindow.ensureCursorVisible();
        this._listWindow.callUpdateHelp();
    };

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

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

    Window_SavefileList.prototype.numVisibleRows = function () {
        return 5;
    };

    Window_SavefileList.prototype.spacing = function () {
        return 8;
    };

    Window_SavefileList.prototype.itemHeight = function () {
        return this.lineHeight() * 2;
    };

    var _Window_SavefileList_callUpdateHelp =
        Window_SavefileList.prototype.callUpdateHelp;
    Window_SavefileList.prototype.callUpdateHelp = function () {
        _Window_SavefileList_callUpdateHelp.call(this);
        if (this.active && this.statusWindow) {
            this.statusWindow.setId(this.index() + 1);
        }
    };

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

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

    Window_SavefileStatus.prototype.initialize = function (x, y, width, height) {
        Window_Base.prototype.initialize.call(this, x, y, width, height);
        this._id = 1;
    };

    Window_SavefileStatus.prototype.setMode = function (mode) {
        this._mode = mode;
    };

    Window_SavefileStatus.prototype.setId = function (id) {
        this._id = id;
        this.refresh();
    };

    Window_SavefileStatus.prototype.refresh = function () {
        this.contents.clear();
        var id = this._id;
        var valid = DataManager.isThisGameFile(id);
        var info = DataManager.loadSavefileInfo(id);
        var rect = this.contents.rect;
        this.resetTextColor();
        if (this._mode === 'load') {
            this.changePaintOpacity(valid);
        }
        this.drawFileId(id, rect.x, rect.y);
        if (info) {
            this.changePaintOpacity(valid);
            this.drawContents(info, rect, valid);
            this.changePaintOpacity(true);
        }
    };

    Window_SavefileStatus.prototype.drawFileId = function (id, x, y) {
        this.drawText(TextManager.file + ' ' + id, x, y, 180);
    };

    Window_SavefileStatus.prototype.drawContents = function (info, rect, valid) {
        var bottom = rect.y + rect.height;
        var playtimeY = bottom - this.lineHeight();
        this.drawText(info.title, rect.x + 192, rect.y, rect.width - 192);
        if (valid) {
            this.drawPartyfaces(info, rect.x, bottom - 144);
        }
        this.drawText(info.playtime, rect.x, playtimeY, rect.width, 'right');
    };

    Window_SavefileStatus.prototype.drawPartyfaces = function (info, x, y) {
        if (info && info.faces) {
            for (var i = 0; i < info.faces.length; i++) {
                var data = info.faces[i];
                this.drawFace(data[0], data[1], x + i * 150, y);
            }
        }
    };

})();


code:
//=============================================================================
// AnotherNewGame.js
// ----------------------------------------------------------------------------
// (C) 2015 Triacontane
// This plugin is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 3.0.0 2020/03/08 アナザーニューゲームコマンドを複数登録できるよう修正。以前のバージョンと互換性がありません。
// 2.0.0 2019/03/19 アナザーロード時に場所移動せず、セーブ位置から開始できる機能を追加
//                  アナザーニューゲーム時に自動でONになるスイッチを追加
//                  パラメータの型指定機能に対応
// 1.4.0 2017/06/18 アナザーニューゲームの追加位置を指定できる機能を追加
// 1.3.0 2017/05/27 ニューゲームを非表示にできる機能を追加
// 1.2.4 2017/05/23 プラグインコマンドのヘルプを修正
// 1.2.3 2017/01/25 同一サーバで同プラグインを適用した複数のゲームを公開する際に、設定が重複するのを避けるために管理番号を追加
// 1.2.2 2016/12/10 アナザーニューゲームをロードした際に、ロード元でイベントが実行中だった場合に続きが実行されてしまう現象を修正
// 1.2.1 2016/11/23 遠景タイトルプラグイン（ParallaxTitle.js）と連携する設定を追加
// 1.2.0 2016/11/22 アナザーニューゲームを選択した際に、フェードアウトしなくなる設定を追加
// 1.1.0 2016/03/29 fftfanttさんからご提供いただいたコードを反映させ、アナザーニューゲーム選択時に
//                  既存のセーブファイルをロードする機能を追加
// 1.0.1 2015/11/10 プラグイン適用中にセーブできなくなる不具合を修正
// 1.0.0 2015/11/07 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc アナザーニューゲーム追加プラグイン
 * @author トリアコンタン
 *
 * @param anotherDataList
 * @text アナザーニューゲームリスト
 * @desc アナザーニューゲームのコマンド一覧です。
 * @default []
 * @type struct<COMMAND>[]
 *
 * @param manageNumber
 * @text 管理番号
 * @desc 同一サーバ内に複数のゲームを配布する場合のみ、ゲームごとに異なる値を設定してください。(RPGアツマールは対象外)
 * @default
 *
 * @help バージョン3.0.0は以前のバージョンと互換性がありません。
 *
 * タイトル画面のウィンドウの一番下に、もう一つのニューゲームを追加します。
 * 選択すると、ニューゲームとは別に指定したマップに遷移します。
 * クリア後のおまけやCG回想モード、スタッフクレジット、ミニゲーム、隠し要素など
 * 使い手次第で様々な用途に使えます。
 *
 * 選択肢は、あらかじめ非表示あるいは選択禁止にしておくことができます。
 * これらはプラグインコマンドから解除でき、解除状態はセーブファイルを
 * 超えてゲーム全体で共有されます。解除した状態を再度、禁止にすることもできます。
 *
 * 設定はファイル「AnotherNewGameMk2.rpgsave」に保存されます。
 *
 * プラグインコマンド詳細
 *   イベントコマンド「プラグインコマンド」から実行。
 *
 *  ANG_VISIBLE 1  # [1]番目のアナザーニューゲームを表示にする。
 *  ANG_ENABLE 1   # [1]番目のアナザーニューゲームを選択可能にする。
 *  ANG_HIDDEN 1   # [1]番目のアナザーニューゲームを非表示にする。
 *  ANG_DISABLE 1  # [1]番目のアナザーニューゲームを選択禁止にする。
 *
 * 使用例（1番目に登録したアナザーニューゲームを「表示」にする場合）
 * ANG_VISIBLE 1
 *
 *  ANG_NEWGAME_HIDDEN  # ニューゲームを非表示にする。
 *  ANG_NEWGAME_VISIBLE # ニューゲームを表示にする。
 *
 * ニューゲームを非表示にする機能は、ゲームが開始できなくなる場合が
 * あるので注意して使用してください。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

/*~struct~COMMAND:
 * @param name
 * @text コマンド名称
 * @desc タイトル画面に表示されるコマンド名です。
 * @default Another New Game
 *
 * @param mapId
 * @text マップID
 * @desc 移動先のマップIDです。0を指定した場合、場所移動しません。
 * @default 1
 * @type number
 *
 * @param mapX
 * @text X座標
 * @desc 移動先のX座標です。
 * @default 1
 * @type number
 *
 * @param mapY
 * @text Y座標
 * @desc 移動先のY座標です。（自然数）
 * @default 1
 * @type number
 *
 * @param hidden
 * @text デフォルト非表示
 * @desc デフォルトで選択肢を非表示にします。プラグインコマンドで有効化できます。
 * @default false
 * @type boolean
 *
 * @param disable
 * @text デフォルト使用禁止
 * @desc デフォルトで選択肢を選択禁止にします。プラグインコマンドで有効化できます。
 * @default false
 * @type boolean
 *
 * @param addPosition
 * @text 追加位置
 * @desc アナザーニューゲームのコマンド追加位置です。(1:ニューゲームの上、2:コンティニューの上、3:オプションの上)
 * @default 0
 * @type select
 * @option オプションの下
 * @value 0
 * @option ニューゲームの上
 * @value 1
 * @option コンティニューの上
 * @value 2
 * @option オプションの上
 * @value 3
 *
 * @param switchId
 * @text 連動スイッチ番号
 * @desc アナザーニューゲーム開始時に自動でONになるスイッチを指定できます。
 * @default 0
 * @type switch
 *
 * @param fileLoad
 * @text ファイルロード
 * @desc アナザーニューゲーム選択時に、ロード画面に遷移して既存セーブデータをロードします。
 * @default false
 * @type boolean
 *
 * @param noFadeout
 * @text フェードアウト無効
 * @desc アナザーニューゲーム選択時に、オーディオや画面がフェードアウトしなくなります。
 * @default false
 * @type boolean
 */

(function () {
    var localExtraStageIndex = -1;

    var createPluginParameter = function (pluginName) {
        var paramReplacer = function (key, value) {
            if (value === 'null') {
                return value;
            }
            if (value[0] === '"' && value[value.length - 1] === '"') {
                return value;
            }
            try {
                return JSON.parse(value);
            } catch (e) {
                return value;
            }
        };
        var parameter = JSON.parse(JSON.stringify(PluginManager.parameters(pluginName), paramReplacer));
        PluginManager.setParameters(pluginName, parameter);
        return parameter;
    };
    var parameters = createPluginParameter('AnotherNewGame');
    parameters.anotherDataList = parameters.anotherDataList || [];

    /**
     * Convert escape characters.(require any window object)
     * @param text Target text
     * @returns {String} Converted text
     */
    var convertEscapeCharacters = function (text) {
        var windowLayer = SceneManager._scene._windowLayer;
        return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text.toString()) : text;
    };

    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        var index = args[0] ? parseInt(convertEscapeCharacters(args[0])) - 1 : 0;
        switch (command.toUpperCase()) {
            case 'ANG_VISIBLE':
                ANGSettingManager.setVisible(index, true);
                ANGSettingManager.save();
                break;
            case 'ANG_ENABLE':
                ANGSettingManager.setEnable(index, true);
                ANGSettingManager.save();
                break;
            case 'ANG_HIDDEN':
                ANGSettingManager.setVisible(index, false);
                ANGSettingManager.save();
                break;
            case 'ANG_DISABLE':
                ANGSettingManager.setEnable(index, false);
                ANGSettingManager.save();
                break;
            case 'ANG_NEWGAME_HIDDEN':
                ANGSettingManager.newGameHidden = true;
                ANGSettingManager.save();
                break;
            case 'ANG_NEWGAME_VISIBLE':
                ANGSettingManager.newGameHidden = false;
                ANGSettingManager.save();
                break;
        }
    };

    //=============================================================================
    // Game_Map
    //  アナザーニューゲームのロード時に実行していたイベントを中断します。
    //=============================================================================
    Game_Map.prototype.abortInterpreter = function () {
        if (this.isEventRunning()) {
            this._interpreter.command115();
        }
    };

    //=============================================================================
    // Scene_Title
    //  アナザーニューゲームの選択時の処理を追加定義します。
    //=============================================================================
    var _Scene_Title_create = Scene_Title.prototype.create;
    Scene_Title.prototype.create = function () {
        ANGSettingManager.loadData();
        _Scene_Title_create.call(this);
    };

    var _Scene_Title_commandContinue = Scene_Title.prototype.commandContinue;
    Scene_Title.prototype.commandContinue = function () {
        _Scene_Title_commandContinue.call(this);
        localExtraStageIndex = -1;
    };

    var _Scene_Title_commandNewGameSecond = Scene_Title.prototype.commandNewGameSecond;
    Scene_Title.prototype.commandNewGameSecond = function (index) {
        if (_Scene_Title_commandNewGameSecond) {
            _Scene_Title_commandNewGameSecond.apply(this, arguments);
        }
        var command = parameters.anotherDataList[index];
        if (command.noFadeout) {
            this._noFadeout = true;
        }
        if (!command.fileLoad) {
            var preMapId = $dataSystem.startMapId;
            var preStartX = $dataSystem.startX;
            var preStartY = $dataSystem.startY;
            var newMapId = command.mapId;
            if (newMapId > 0) {
                $dataSystem.startMapId = newMapId;
                $dataSystem.startX = command.mapX || 1;
                $dataSystem.startY = command.mapY || 1;
            }
            this.commandNewGame();
            $dataSystem.startMapId = preMapId;
            $dataSystem.startX = preStartX;
            $dataSystem.startY = preStartY;
            var switchId = command.switchId;
            if (switchId > 0) {
                $gameSwitches.setValue(switchId, true);
            }
        } else {
            this.commandContinue();
            localExtraStageIndex = index;
        }
    };

    var _Scene_Title_createCommandWindow = Scene_Title.prototype.createCommandWindow;
    Scene_Title.prototype.createCommandWindow = function () {
        _Scene_Title_createCommandWindow.call(this);
        parameters.anotherDataList.forEach(function (command, index) {
            if (ANGSettingManager.isVisible(index)) {
                this._commandWindow.setHandler('nameGame2_' + index, this.commandNewGameSecond.bind(this, index));
            }
        }, this);
    };

    Scene_Title.prototype.fadeOutAll = function () {
        if (!this._noFadeout) {
            Scene_Base.prototype.fadeOutAll.apply(this, arguments);
        }
    };

    //=============================================================================
    // Scene_Load
    //  ロード成功時にアナザーポイントに移動します。
    //=============================================================================
    var _Scene_Load_onLoadSuccess = Scene_Load.prototype.onLoadSuccess;
    Scene_Load.prototype.onLoadSuccess = function () {
        _Scene_Load_onLoadSuccess.call(this);
        if (localExtraStageIndex >= 0) {
            var command = parameters.anotherDataList[localExtraStageIndex];
            var mapId = command.mapId;
            if (mapId > 0) {
                var x = command.mapX || 1;
                var y = command.mapY || 1;
                $gamePlayer.reserveTransfer(mapId, x, y);
            }
            $gameMap.abortInterpreter();
            DataManager.selectSavefileForNewGame();
            var switchId = command.switchId;
            if (switchId > 0) {
                $gameSwitches.setValue(switchId, true);
            }
        }
    };

    //=============================================================================
    // Window_TitleCommand
    //  アナザーニューゲームの選択肢を追加定義します。
    //=============================================================================
    var _Window_TitleCommand_makeCommandList = Window_TitleCommand.prototype.makeCommandList;
    Window_TitleCommand.prototype.makeCommandList = function () {
        _Window_TitleCommand_makeCommandList.call(this);
        parameters.anotherDataList.forEach(function (command, index) {
            if (ANGSettingManager.isVisible(index)) {
                this.makeAnotherNewGameCommand(command, index);
            }
        }, this);
        if (ANGSettingManager.newGameHidden) {
            this.eraseCommandNewGame();
        }
    };

    Window_TitleCommand.prototype.makeAnotherNewGameCommand = function (command, index) {
        this.addCommand(command.name, 'nameGame2_' + index, ANGSettingManager.isEnable(index));
        var addPosition = command.addPosition;
        if (addPosition > 0) {
            var anotherCommand = this._list.pop();
            this._list.splice(addPosition - 1, 0, anotherCommand);
        }
    };

    Window_TitleCommand.prototype.eraseCommandNewGame = function () {
        this._list = this._list.filter(function (command) {
            return command.symbol !== 'newGame';
        });
    };

    var _Window_TitleCommand_updatePlacement = Window_TitleCommand.prototype.updatePlacement;
    Window_TitleCommand.prototype.updatePlacement = function () {
        _Window_TitleCommand_updatePlacement.call(this);
        var addSize = this._list.length - 3;
        if (addSize > 0) {
            this.y += addSize * this.itemHeight() / 2;
        }
    };

    //=============================================================================
    // ANGManager
    //  アナザーニューゲームの設定ファイルのセーブとロードを定義します。
    //=============================================================================
    function ANGSettingManager() {
        throw new Error('This is a static class');
    }

    ANGSettingManager._fileId = -1001;

    ANGSettingManager._visible = [];
    ANGSettingManager._enable = [];
    ANGSettingManager.newGameHidden = false;

    ANGSettingManager.make = function () {
        var info = {};
        info.visible = this._visible;
        info.enable = this._enable;
        info.newGameHidden = this.newGameHidden;
        return info;
    };

    ANGSettingManager.isVisible = function (index) {
        if (this._visible[index] !== undefined) {
            return this._visible[index];
        } else {
            return !parameters.anotherDataList[index].hidden;
        }
    };

    ANGSettingManager.setVisible = function (index, value) {
        this._visible[index] = value;
    };

    ANGSettingManager.isEnable = function (index) {
        if (this._enable[index] !== undefined) {
            return this._enable[index];
        } else {
            return !parameters.anotherDataList[index].disable;
        }
    };

    ANGSettingManager.setEnable = function (index, value) {
        this._enable[index] = value;
    };

    ANGSettingManager.loadData = function () {
        var info = this.load();
        this._visible = info.visible || [];
        this._enable = info.enable || [];
        this.newGameHidden = !!info.newGameHidden;
    };

    ANGSettingManager.load = function () {
        var json;
        try {
            json = StorageManager.load(this._fileId);
        } catch (e) {
            console.error(e);
            return [];
        }
        if (json) {
            return JSON.parse(json);
        } else {
            return [];
        }
    };

    ANGSettingManager.save = function () {
        var info = ANGSettingManager.make();
        StorageManager.save(this._fileId, JSON.stringify(info));
    };

    //=============================================================================
    // StorageManager
    //  アナザーニューゲームの設定ファイルのパス取得処理を追加定義します。
    //=============================================================================
    var _StorageManager_localFilePath = StorageManager.localFilePath;
    StorageManager.localFilePath = function (savefileId) {
        if (savefileId === ANGSettingManager._fileId) {
            return this.localFileDirectoryPath() + 'AnotherNewGameMk2.rpgsave';
        } else {
            return _StorageManager_localFilePath.call(this, savefileId);
        }
    };

    var _StorageManager_webStorageKey = StorageManager.webStorageKey;
    StorageManager.webStorageKey = function (savefileId) {
        if (savefileId === ANGSettingManager._fileId) {
            return 'RPG AnotherNewGame Mk2' + parameters.manageNumber;
        } else {
            return _StorageManager_webStorageKey.call(this, savefileId);
        }
    };
})();


code:
//=============================================================================
// AutomaticState.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.1 2016/02/14 オートステートの追加時にメッセージを表示する仕様を追加
// 1.0.0 2016/02/08 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc ステート自動付与プラグイン
 * @author トリアコンタン
 *
 * @help 条件を満たしている間、指定したステートを付与します。
 * ステートのメモ欄に以下の書式で条件を入力してください。
 *
 * メモ欄書式（ステートIDには制御文字を利用できます）
 *
 * 1. 自動付与ステートの条件
 * <AS上限HP:（HPの割合[百分率]）>
 *     指定したHP(割合)を上回っている（>=）間、対象ステートを付与する。
 * <AS下限HP:（HPの割合[百分率]）>
 *     指定したHP(割合)を下回っている（<=）間、対象ステートを付与する。
 * <AS上限MP:（MPの割合[百分率]）>
 *     指定したMP(割合)を上回っている（>=）間、対象ステートを付与する。
 * <AS下限MP:（MPの割合[百分率]）>
 *     指定したMP(割合)を下回っている（<=）間、対象ステートを付与する。
 * <AS上限TP:（TPの割合[百分率]）>
 *     指定したMP(割合)を上回っている（>=）間、対象ステートを付与する。
 * <AS下限TP:（TPの割合[百分率]）>
 *     指定したMP(割合)を下回っている（<=）間、対象ステートを付与する。
 * <AS武器装備:（武器ID）>
 *     指定した武器を装備している間、対象ステートを付与する。
 * <AS防具装備:（防具ID）>
 *     指定した武器を装備している間、対象ステートを付与する。
 * <ASスイッチ:（スイッチID）>
 *     指定したスイッチがONになっている間、対象ステートを付与する。
 *
 * 2. 自動付与ステートの対象
 * <ASアクター:（アクターID）>
 *     ステート自動付与の対象を指定したアクターのみに設定する。
 *     IDの指定がない場合、全てのアクターに有効になる。
 * <AS敵キャラ:（敵キャラID）>
 *     ステート自動付与の対象を指定した敵キャラのみに設定する。
 *     IDの指定がない場合、全ての敵キャラに有効になる。
 *
 * スクリプト
 * 自動付与ステートが有効になったときに所定のメッセージを表示する場合
 * $gameSystem.automaticStateAddMessage = true;
 *
 * 自動付与ステートが有効になったときに所定のメッセージを表示しない場合
 * $gameSystem.automaticStateAddMessage = false;
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function () {
    'use strict';
    var pluginName = 'AutomaticState';

    var getArgNumber = function (arg, min, max) {
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max);
    };

    var convertEscapeCharacters = function (text) {
        if (text == null) text = '';
        var window = SceneManager._scene._windowLayer ? SceneManager._scene._windowLayer.children[0] : null;
        return window ? window.convertEscapeCharacters(text) : text;
    };

    if (!Object.prototype.hasOwnProperty('isEmpty')) {
        Object.defineProperty(Object.prototype, 'isEmpty', {
            value: function () {
                return Object.keys(this).length <= 0;
            }
        });
    }

    if (!Object.prototype.hasOwnProperty('iterate')) {
        Object.defineProperty(Object.prototype, 'iterate', {
            value: function (handler) {
                Object.keys(this).forEach(function (key, index) {
                    handler.call(this, key, this[key], index);
                }, this);
            }
        });
    }

    //=============================================================================
    // Game_System
    //  自動付与ステートのメッセージ表示フラグを定義します。
    //=============================================================================
    var _Game_System_initialize = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function () {
        _Game_System_initialize.apply(this, arguments);
        this.automaticStateAddMessage = null;
    };

    //=============================================================================
    // Game_BattlerBase
    //  自動付与ステートの更新処理を定義します。
    //=============================================================================
    Game_BattlerBase.prototype.updateAutomaticState = function () {
        $dataStates.forEach(function (state) {
            if (state == null || state.meta.isEmpty()) return;
            var stateId = state.id, result = this.isAutomaticValid(state);
            if (result == null) return;
            if (result) {
                if (!this.isStateAffected(stateId) && this.isStateAddable(stateId)) {
                    this.addState(stateId);
                    if ($gameSystem.automaticStateAddMessage) this.showAddedStates();
                    this._result.deleteAddedStates(stateId);
                }
            } else {
                if (this.isStateAffected(stateId)) {
                    this.removeState(stateId);
                    this._result.deleteRemovedStates(stateId);
                }
            }
        }.bind(this));
    };

    Game_BattlerBase.prototype.showAddedStates = function () {
    };

    Game_BattlerBase.prototype.isAutomaticValid = function (state) {
        this._automaticTargetState = state;
        var switchId = this.getStateMetaNumber('スイッチ', 1, $dataSystem.switches.length - 1);
        if (switchId !== null) return $gameSwitches.value(switchId);
        var upperLimitHp = this.getStateMetaNumber('上限HP', 0, 100);
        if (upperLimitHp !== null) return this.hpRate() * 100 >= upperLimitHp;
        var lowerLimitHp = this.getStateMetaNumber('下限HP', 0, 100);
        if (lowerLimitHp !== null) return this.hpRate() * 100 <= lowerLimitHp;
        var upperLimitMp = this.getStateMetaNumber('上限MP', 0, 100);
        if (upperLimitMp !== null) return this.mpRate() * 100 >= upperLimitMp;
        var lowerLimitMp = this.getStateMetaNumber('下限MP', 0, 100);
        if (lowerLimitMp !== null) return this.mmp > 0 && this.mpRate() * 100 <= lowerLimitMp;
        var upperLimitTp = this.getStateMetaNumber('上限TP', 0, 100);
        if (upperLimitTp !== null) return this.tpRate() * 100 >= upperLimitTp;
        var lowerLimitTp = this.getStateMetaNumber('下限TP', 0, 100);
        if (lowerLimitTp !== null) return this.tpRate() * 100 <= lowerLimitTp;
        return null;
    };

    Game_BattlerBase.prototype.getStateMetaNumber = function (tagName, min, max) {
        var value = this._automaticTargetState.meta['AS' + tagName];
        return value != null ? getArgNumber(value, min, max) : null;
    };

    Game_BattlerBase.prototype.isStateMetaInfo = function (tagName) {
        return this._automaticTargetState.meta.hasOwnProperty('AS' + tagName);
    };

    var _Game_BattlerBase_setHp = Game_BattlerBase.prototype.setHp;
    Game_BattlerBase.prototype.setHp = function (hp) {
        _Game_BattlerBase_setHp.apply(this, arguments);
        this.updateAutomaticState();
    };

    var _Game_BattlerBase_setMp = Game_BattlerBase.prototype.setMp;
    Game_BattlerBase.prototype.setMp = function (mp) {
        _Game_BattlerBase_setMp.apply(this, arguments);
        this.updateAutomaticState();
    };

    var _Game_BattlerBase_setTp = Game_BattlerBase.prototype.setTp;
    Game_BattlerBase.prototype.setTp = function (tp) {
        _Game_BattlerBase_setTp.apply(this, arguments);
        this.updateAutomaticState();
    };

    //=============================================================================
    // Game_Actor
    //  自動付与ステートの更新処理を定義します。
    //=============================================================================
    var _Game_Actor_isAutomaticValid = Game_Actor.prototype.isAutomaticValid;
    Game_Actor.prototype.isAutomaticValid = function (state) {
        this._automaticTargetState = state;
        var actorId = this.getStateMetaNumber('アクター', 1, $dataActors.length - 1);
        if (this.isStateMetaInfo('敵キャラ') || (actorId !== null && actorId !== this._actorId)) return false;
        var weaponId = this.getStateMetaNumber('武器装備', 1, $dataWeapons.length - 1);
        if (weaponId !== null) return this.hasWeapon($dataWeapons[weaponId]);
        var armorId = this.getStateMetaNumber('防具装備', 1, $dataArmors.length - 1);
        if (armorId !== null) return this.hasArmor($dataArmors[armorId]);
        return _Game_Actor_isAutomaticValid.apply(this, arguments);
    };

    var _Game_Actor_changeEquip = Game_Actor.prototype.changeEquip;
    Game_Actor.prototype.changeEquip = function (slotId, item) {
        _Game_Actor_changeEquip.apply(this, arguments);
        this.updateAutomaticState();
    };

    //=============================================================================
    // Game_Enemy
    //  自動付与ステートの更新処理を定義します。
    //=============================================================================
    var _Game_Enemy_isAutomaticValid = Game_Enemy.prototype.isAutomaticValid;
    Game_Enemy.prototype.isAutomaticValid = function (state) {
        this._automaticTargetState = state;
        var enemyId = this.getStateMetaNumber('敵キャラ', 1, $dataEnemies.length - 1);
        if (this.isStateMetaInfo('アクター') || (enemyId !== null && enemyId !== this._enemyId)) return false;
        return _Game_Enemy_isAutomaticValid.apply(this, arguments);
    };

    //=============================================================================
    // Game_Party
    //  全てのアクターの自動付与ステートを更新します。
    //=============================================================================
    Game_Party.prototype.updateAutomaticState = function () {
        this.members().forEach(function (actor) {
            actor.updateAutomaticState();
        });
    };

    //=============================================================================
    // Game_Map
    //  場所移動時に自動付与ステートを更新します。
    //=============================================================================
    var _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function (mapId) {
        _Game_Map_setup.apply(this, arguments);
        $gameParty.updateAutomaticState();
    };

    //=============================================================================
    // Game_Interpreter
    //  イベント終了時に自動付与ステートを更新します。
    //=============================================================================
    var _Game_Interpreter_terminate = Game_Interpreter.prototype.terminate;
    Game_Interpreter.prototype.terminate = function () {
        _Game_Interpreter_terminate.apply(this, arguments);
        if (this._depth === 0) $gameParty.updateAutomaticState();
    };

    //=============================================================================
    // Game_ActionResult
    //  ステート付与、解除時のメッセージを抑制します。
    //=============================================================================
    Game_ActionResult.prototype.deleteRemovedStates = function (stateId) {
        this.removedStates.iterate(function (key, value, index) {
            if (value === stateId) this.removedStates.splice(index, 1);
        }.bind(this));
    };

    Game_ActionResult.prototype.deleteAddedStates = function (stateId) {
        this.addedStates.iterate(function (key, value, index) {
            if (value === stateId) this.addedStates.splice(index, 1);
        }.bind(this));
    };
})();


code:
//=============================================================================
// BMSP.js (BMSPベースプラグイン)
//=============================================================================

/*:
 * @plugindesc BMSPベースプラグインです。
 * @author gentlawk
 * @website http://blueredzone.com
 * @url https://github.com/gentlawk/BMSP_MV
 * @license
 * Copyright(c) 2015 BlueRedZone, gentlawk
 * Released under the MIT license
 * https://github.com/gentlawk/BMSP_MV/blob/master/LICENSE
 *
 * @version 1.11
 *
 * @help
 * 使用方法:
 *   BMSPプラグインシリーズのベースとなるプラグインです。
 *
 * ●追加位置
 *   全てのBMSPプラグインシリーズより上に配置してください。
 */

function BMSP() {
    throw new Error('This is a static class');
}

/*
 * プラグインの導入チェック
 */
PluginManager._versions = {};

PluginManager.version = function (name) {
    if (!(name.toLowerCase() in this._versions)) return 0;
    return this._versions[name.toLowerCase()];
};

PluginManager.setVersion = function (name, version) {
    this._versions[name.toLowerCase()] = version;
};

BMSP.checkPluginName = function (name) {
    return PluginManager._scripts.indexOf(name) >= 0;
};

BMSP.checkPluginVersion = function (name, version) {
    var now = PluginManager.version(name);
    return now >= version;
};

BMSP.includedPlugin = function (name, version) {
    if (!this.checkPluginName(name)) return false;
    if (version === undefined) return true;
    return this.checkPluginVersion(name, version);
};

BMSP.requirePlugin = function (name, version) {
    if (!this.checkPluginName(name)) {
        throw new Error('no such plugin: ' + name);
    }
    if (version === undefined) return;
    if (!this.checkPluginVersion(name, version)) {
        var now = PluginManager.version(name);
        throw new Error('need version ' + version + ' and over: ' + name + ' version ' + now);
    }
};

/*
 * プラグインバージョン
 */
PluginManager.setVersion('BMSP', 1.11);

/*
 * オブジェクトのユニークID管理
 */
BMSP.getUniqueId = function () {
    return new Date().getTime() + Math.floor(Math.random() * 1000);
};

BMSP.getObjectId = function (object) {
    if (!object) {
        return 0;
    }
    if (!('_bmsp_object_id' in object)) {
        object._bmsp_object_id = BMSP.getUniqueId();
    }
    return object._bmsp_object_id;
};

/*
 * Ruby(他Perl等)ライクな剰余演算
 */
BMSP.rubyLikeMod = function (a, b) {
    return (a % b + b) % b;
};

/*
 * シャローコピー
 */
BMSP.shallowCopy = function (object) {
    if (object instanceof Array) {
        return [].concat(object);
    }
    var copy = {};
    for (var prop in object) {
        copy[prop] = object[prop];
    }
    return copy;
};


code:
//=============================================================================
// BMSP_MapFog.js (マップフォグ)
//=============================================================================

/*:
 * @plugindesc マップにフォグを表示します。
 * @author gentlawk
 * @website http://blueredzone.com
 * @url https://github.com/gentlawk/BMSP_MV
 * @license
 * Copyright(c) 2015 BlueRedZone, gentlawk
 * Released under the MIT license
 * https://github.com/gentlawk/BMSP_MV/blob/master/LICENSE
 *
 * @version 1.03
 *
 * @param Label
 * @desc マップフォグメモのラベルです。
 * @default フォグ
 *
 * @help
 * マップのメモ:
 *   <フォグ%n%:%name%, %sx%, %sy%, %opacity%, %z%, %blend%, %switchies%>  # マップにフォグを追加します。
 *     - %n% : フォグの番号です。1以上の整数を指定してください。
 *     - %name% : 使用するファイル名です。(初期値: '')
 *     - %sx% : X方向のスピードです。(初期値: 0)
 *     - %sy% : Y方向のスピードです。(初期値: 0)
 *     - %opacity% : 不透明度です。(初期値: 255)
 *     - %z% : Z座標です。0が遠景直上、1がピクチャ直下、2がピクチャ直上です。(初期値: 1)
 *     - %blend% : 合成方法です。0が通常、1が加算です。(初期値: 1)
 *     - %switchies% : 表示条件スイッチIDリストです。条件にしたいスイッチのIDを「:」区切りで指定します。(初期値: 指定無し※常に表示)
 *   ※メモのラベルはパラメータで変更可能です。
 *   ※フォグ番号はマップごとに1から順番に存在しなければなりません。
 *   ※%n%以外の各パラメータは省略可能です。省略した場合初期値が使用されます。
 *   　また、省略したパラメータ以降のパラメータも全て省略しなければなりません。
 *
 * プラグインコマンド:
 *   MapFog %n% name %value% # フォグ番号%n%に使用するファイルを%value%に変更します。
 *   MapFog %n% sx %value% # フォグ番号%n%のX方向速度を%value%に変更します。
 *   MapFog %n% sy %value% # フォグ番号%n%のY方向速度を%value%に変更します。
 *   MapFog %n% opacity %value% # フォグ番号%n%の不透明度を%value%に変更します。
 *   MapFog %n% blend %value% # フォグ番号%n%の合成方法を%value%に変更します。
 *   MapFog %n% visible %value% # フォグ番号%n%を%value%が1で表示、0で非表示にします。
 *
 * 使用方法:
 *   マップのメモにフォグ設定を記述すると、マップにフォグを表示できます。
 *   1つのマップに表示するフォグの数は任意ですが、フォグ番号は1から順番にふる必要があります。
 *   フォグの表示条件はマップ移動時のみ判定されます。
 *   同一マップ上でフォグの表示を切り替える場合はプラグインコマンドを使用して下さい。
 *   マップフォグ画像は以下のディレクトリに配置してください(fogsディレクトリは新規作成してください)。
 *   img/fogs
 *
 * ●使用例
 *   フォグを表示
 *     <フォグ1:fogfile>
 *
 *   フォグを2つ表示
 *     <フォグ1:fogfile1,1,0,255>
 *     <フォグ2:fogfile2,0,0,255,0,0>
 *
 *   スイッチ10がONの時フォグを表示
 *     <フォグ1:fogfile,0,0,255,1,1,10>
 *
 *   スイッチ10がONの時フォグ1を、スイッチ10と20がONの時フォグ2を表示
 *     <フォグ1:fogfile1,0,0,255,1,1,10>
 *     <フォグ2:fogfile2,0,0,255,1,1,10:20>
 */

(function () {

    /*
     * プラグインバージョン
     */
    PluginManager.setVersion('BMSP_MapFog', 1.03);

    /*
     * 必須プラグインチェック
     */
    var _Scene_Boot_start = Scene_Boot.prototype.start;
    Scene_Boot.prototype.start = function () {
        BMSP.requirePlugin('BMSP', 1.00);
        _Scene_Boot_start.call(this);
    };

    /*
     * プラグインコマンド
     */
    var _Game_Interpreter_pluginCommand =
        Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command === 'MapFog') {
            $gameMap.setFogParameter(args[1], Number(args[0]), args[2]);
        }
    };

    /*
     * MapFog
     */
    BMSP.MapFog = function () {
        throw new Error('This is a static class');
    };

    var parameters = PluginManager.parameters('BMSP_MapFog');
    BMSP.MapFog._label = parameters['Label'];

    BMSP.MapFog._cache_settings = {};

    BMSP.MapFog.getSettings = function (map) {
        var objectId = BMSP.getObjectId(map);
        if (objectId in this._cache_settings) {
            return this._cache_settings[objectId];
        }
        var index = 1;
        var settings = {};
        while ((this._label + index) in map.meta) {
            settings[index] = map.meta[this._label + index].split(',');
            index++;
        }
        this._cache_settings[objectId] = settings;
        return settings;
    };

    BMSP.MapFog.getSprite = function (index) {
        if (!SceneManager._scene || SceneManager._scene.constructor !== Scene_Map) {
            return null;
        }
        var fogData = SceneManager._scene._spriteset._fogData;
        for (var i in fogData) {
            var data = fogData[i];
            if (data.index == index) return data.sprite;
        }
        return null;
    };

    /*
     * ImageManager
     */
    ImageManager.loadFog = function (filename, hue) {
        return this.loadBitmap('img/fogs/', filename, hue, true);
    };

    var _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function (mapId) {
        _Game_Map_setup.call(this, mapId);
        this.setupFogs();
    };

    Game_Map.prototype.setupFogs = function () {
        this._fogs = {};
        var settings = BMSP.MapFog.getSettings($dataMap);
        for (var index in settings) {
            var setting = settings[index];
            var cond = (setting[6] || '').split(':');
            var visible = true;
            if (cond[0] !== '') {
                visible = cond.every(function (id) {
                    return $gameSwitches.value(id);
                });
            }
            this._fogs[index] = {
                name: setting[0] || '',
                sx: Number(setting[1] || 0),
                sy: Number(setting[2] || 0),
                opacity: Number(setting[3] || 255),
                z: Number(setting[4] || 1),
                blend: Number(setting[5] || 1),
                visible: visible,
                x: 0,
                y: 0,
            }
        }
    };

    Game_Map.prototype.fogs = function () {
        return this._fogs;
    }

    var _Game_Map_update = Game_Map.prototype.update;
    Game_Map.prototype.update = function (sceneActive) {
        _Game_Map_update.call(this, sceneActive);
        this.updateFogs();
    };

    Game_Map.prototype.updateFogs = function () {
        for (var index in this._fogs) {
            this._fogs[index].x += this._fogs[index].sx;
            this._fogs[index].y += this._fogs[index].sy;
        }
    };

    Game_Map.prototype.setFogParameter = function (name, index, value) {
        if (!(index in this._fogs)) return;
        if (value === undefined) return;
        var fog = this._fogs[index];
        switch (name) {
            case 'name':
                fog[name] = value;
                break;
            case 'sx':
            case 'sy':
            case 'opacity':
            case 'blend':
                fog[name] = Number(value);
                break;
            case 'visible':
                fog[name] = Boolean(Number(value));
                break;
        }
    };

    /*
     * Spriteset_Map
     */
    var _Spriteset_Map_initialize = Spriteset_Map.prototype.initialize;
    Spriteset_Map.prototype.initialize = function () {
        this._fogContainer = [];
        this._fogData = [];
        _Spriteset_Map_initialize.call(this);
    };

    var _Spriteset_Map_createParallax = Spriteset_Map.prototype.createParallax;
    Spriteset_Map.prototype.createParallax = function () {
        _Spriteset_Map_createParallax.call(this);
        this.createFogs(0);
    };

    var _Spriteset_Map_createPictures = Spriteset_Map.prototype.createPictures;
    Spriteset_Map.prototype.createPictures = function () {
        this.createFogs(1);
        _Spriteset_Map_createPictures.call(this);
        this.createFogs(2);
    };

    var _Spriteset_Map_update = Spriteset_Map.prototype.update;
    Spriteset_Map.prototype.update = function () {
        _Spriteset_Map_update.call(this);
        this.updateFogs();
    };

    Spriteset_Map.prototype.createFogs = function (z) {
        this._fogContainer[z] = new Sprite();
        var fogs = $gameMap.fogs();
        for (var index in fogs) {
            if (fogs[index].z !== z) continue;

            var fogSprite = new TilingSprite();
            fogSprite.move(0, 0, Graphics.width, Graphics.height);
            this._fogContainer[z].addChild(fogSprite);
            this._fogData.push({
                index: index,
                sprite: fogSprite,
                name: null,
            });
        }
        if (z === 2) {
            this.addChild(this._fogContainer[z]);
        } else {

            this._baseSprite.addChild(this._fogContainer[z]);
        }
    };

    Spriteset_Map.prototype.updateFogs = function () {
        var fogs = $gameMap.fogs();
        this._fogData.forEach(function (data) {
            var fog = fogs[data.index];
            var sprite = data.sprite;
            if (data.name !== fog.name) {
                data.name = fog.name;
                sprite.bitmap = ImageManager.loadFog(data.name);
            }
            if (sprite.bitmap) {
                sprite.origin.x = fog.x;
                sprite.origin.y = fog.y;
                sprite.opacity = fog.opacity;
                sprite.visible = fog.visible;
                sprite.blendMode = fog.blend;
            }
        }, this);
    };

})();