code:
//=============================================================================
// MenuSubMember.js (Ver1.2.2)
//=============================================================================
// 更新履歴
// 2015.10.27 1.0 初公開(準公式プラグイン)
// 2017.06.03 1.1 マップ画面でも同行者を表示
// 2017.06.04 1.1.1 後方互換性対応。プラグイン導入前のセーブデータも読み込み可
// 2017.06.05 1.1.2 連続でメニューを開閉するとフリーズする不具合を修正
// 2017.06.17 1.2 ひきも記さんの隊列歩行プラグイン「TMFollowerEx.js」との併用が
//                可能になりました。
// 2017.06.19 1.2.1 「TMFollowerEx.js」プラグイン導入前にセーブしたデータを
//                読み込んでも、正しく隊列が表示されるようになりました。
//                逆（「TMFollowerEx.js」導入後にセーブしたデータを、導入前の
//                環境で読み込む）の場合も、正しく表示されます。
// 2018.09.18 1.2.2 メニュー画面での同行者の表示のタイプを追加

/*:
 * @plugindesc display sub member at menu window and field (Ver1.2.2)
 * @author Sasuke KANNAZUKI (thanks to Yoji Ojima)
 *
 * @param subMemberIdVal1
 * @desc variable id for actor id of sub member 1
 * @default 11
 *
 * @param subMemberIdVal2
 * @desc variable id for actor id of sub member 2
 * @default 12
 *
 * @param subMemberIdVal3
 * @desc variable id for actor id of sub member 3
 * @default 13
 *
 * @param subMemberIdVal4
 * @desc variable id for actor id of sub member 4
 * @default 14
 *
 * @param displayIfNone
 * @desc when no sub members, whether display the window or not.
 * (1=display, 0=not display)
 * @default 0
 *
 * @param subMemberText
 * @desc display text that means sub member
 * @default Sub Members
 *
 * @param subMemberNoneText
 * @desc text display when no sub members
 * @default None
 *
 * @param DisplayOnMap
 * @desc whether to display sub members on map at tail of party (1:yes, 0:no)
 * @default 1
 *
 * @param MenuSubMember Display Mode
 * @desc set display mode on window. 0=default, 1=without name
 * @default 0
 *
 * @help This plugin does not provide plugin commands.
 *
 * this plugin displays sub members under the menu commands.
 * sub member is an actor that not attend battle.
 *
 * [Ver1.1 additional feature]
 * At map scene, it displays sub members after actors.
 * *note* by option setting, this function can invalidate.
 *
 * if no sub members, set variables value be 0.
 *
 * the actors appeared on map are top 4, that attends the battle.
 * sub members in the party appear always every one on map.
 *
 * [Ver1.2 additional feature]
 * _Enables to utilize this plugin with "TMFollowerEx.js".
 * http://hikimoki.sakura.ne.jp/plugin/plugin_system.html#TMFollowerEx
 *
 * In the case, be sure to put MenuSubMember.js below TMFollowerEx.js.
 *
 * *** Check points to utilize 2 plugins:
 * ・You can insert NPC actor(s) either/both top or tail.
 *   This function is independent from MenuSubMember.
 * ・You can set the max length of the followers.
 *   It enables you to display all actors and sub members on the map scene.
 * ・"TMFollower.js" suppose menu sub members as the tail of actors.
 *    So you can run plugin commands for followers also to menu sub members.
 * ・If the player obtain more character(actors, NPCs, and menu sub members),
 *   truncate actors and menu sub members from the tail.
 *
 * note: this plugin is only for default menu.
 *  it cannot use on changed layout menu(ex. AltMenuScreen.js).
 *
 * [License]
 * this plugin is released under MIT license.
 * http://opensource.org/licenses/mit-license.php
 */

/*:ja
 * @plugindesc メニュー画面と隊列の最後尾に同行者を表示します(ver1.2.2)
 * @author 神無月サスケ (thanks to Yoji Ojima)
 *
 * @param subMemberIdVal1
 * @desc 同行者1のアクターIDを入れる変数ID
 * @default 11
 *
 * @param subMemberIdVal2
 * @desc 同行者2のアクターIDを入れる変数ID
 * @default 12
 *
 * @param subMemberIdVal3
 * @desc 同行者3のアクターIDを入れる変数ID
 * @default 13
 *
 * @param subMemberIdVal4
 * @desc 同行者4のアクターIDを入れる変数ID
 * @default 14
 *
 * @param displayIfNone
 * @desc 同行者がいない場合でも、ウィンドウを表示するか
 * (する=1, しない=0)
 * @default 0
 *
 * @param subMemberText
 * @desc 「同行者」の意味で表示するテキスト
 * @default 同行者
 *
 * @param subMemberNoneText
 * @desc 同行者がいない時に表示するテキスト
 * @default なし
 *
 * @param DisplayOnMap
 * @desc 隊列歩行の最後尾に同行者を表示するか(1:する, 0:しない)
 * @default 1
 *
 * @param MenuSubMember Display Mode
 * @desc メニュー画面での同行者の表示方法。0=通常 1=キャラのみで名前なし
 * @default 0
 *
 * @help このプラグインには、プラグインコマンドはありません。
 *
 * このプラグインは、同行者リストを、メニューコマンドの下に表示します。
 * 同行者とは、戦闘に参加しないアクターです。
 *
 * [Ver1.1 追加要素]
 * 同行者は、マップ上での隊列歩行で、アクターの最後尾に表示されます。
 * オプションでマップ上で非表示にすることも可能です。
 *
 * 同行者を設定しない場合は、該当する変数の値を 0 にしてください。
 *
 * アクターが５人以上の場合でも、隊列に現れるアクターは先頭の４人だけです。
 * 一方同行者は、全員（最大４人）が表示されます。
 *
 * [Ver1.2 追加要素]
 * ひきも記さんの隊列歩行プラグイン「TMFollowerEx.js」との連携が可能に。
 * http://hikimoki.sakura.ne.jp/plugin/plugin_system.html#TMFollowerEx
 *
 * 連携する場合、本プラグインMenuSubMember.js を、必ず下に配置してください。
 *
 * 連携により、例えば以下のようなことが可能になります。
 * ・隊列の先頭や末尾に、メニューに現れないアクターを挿入可能です。
 *   この機能は、同行者とは完全に独立しています。
 * ・隊列の長さを指定可能です。これにより、本プラグイン単体では先頭４人のみ
 *   ですが、連携することで、全てのアクター、同行者を表示することも可能です。
 * ・『TMFollower.js』側から見ると同行者は「最後尾にいるフォロワー達」と
 *   認識されます。このため、『TMFollower.js』側のプラグインコマンドで
 *   フォロワーに関する処理が同行者に対しても施されます。
 * ・仮に指定した隊列表示人数より、アクターと同行者の方が多くなった場合、
 *   同行者の最後尾から順に表示が省略されていきます。
 *
 * ■注意：このプラグインはデフォルトのメニュー画面専用です。
 * プラグイン(AltMenuScreen.jsなど)でレイアウトを変更したケースでは使えません。
 *
 * ■ライセンス表記
 * このプラグインは MIT ライセンスで配布されます。
 * ご自由にお使いください。
 * http://opensource.org/licenses/mit-license.php
 */

(function () {
  //
  // process parameters
  //
  var parameters = PluginManager.parameters("MenuSubMember");
  var submemberVar1 = Number(parameters["subMemberIdVal1"] || 11);
  var submemberVar2 = Number(parameters["subMemberIdVal2"] || 12);
  var submemberVar3 = Number(parameters["subMemberIdVal3"] || 13);
  var submemberVar4 = Number(parameters["subMemberIdVal4"] || 14);
  var subMemberText = parameters["subMemberText"] || "Sub Members";
  var subMemberNoneText = parameters["subMemberNoneText"] || "None";
  var displayIfNone = !!Number(parameters["displayIfNone"]);
  var DisplayOnMap = !!Number(parameters["DisplayOnMap"] || 1);
  var menuDisplayMode = Number(parameters["MenuSubMember Display Mode"] || 0);

  //
  // process TMFollowerEx parameters
  //
  var tmParams = PluginManager.parameters("TMFollowerEx");
  var additionalFollower = tmParams
    ? Number(tmParams["additionalFollower"] || 4)
    : 4;

  // ----------------------------------------------------------------------
  // add window to menu scene (V1.0 section)
  //
  var _Scene_Menu_create = Scene_Menu.prototype.create;
  Scene_Menu.prototype.create = function () {
    _Scene_Menu_create.call(this);
    this.createSubMemberWindow();
  };

  Scene_Menu.prototype.createSubMemberWindow = function () {
    var x = 0;
    var y = this._commandWindow.height;
    var width = this._commandWindow.width;
    var height = Graphics.height - y - this._goldWindow.height;
    switch (menuDisplayMode) {
      case 0:
        this._subMemberWindow = new Window_SubMember(x, y, width, height);
        break;
      default:
        this._subMemberWindow = new Window_SubMember2(x, y, width, height);
        break;
    }
    this.addWindow(this._subMemberWindow);
  };

  var _Scene_Menu_start = Scene_Menu.prototype.start;
  Scene_Menu.prototype.start = function () {
    _Scene_Menu_start.call(this);
    this._subMemberWindow.refresh();
  };

  //
  // sub member window
  //
  function Window_SubMember() {
    this.initialize.apply(this, arguments);
  }

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

  Window_SubMember.prototype.initialize = function (x, y, width, height) {
    Window_Base.prototype.initialize.call(this, x, y, width, height);
    this.setSubMember();
    this.refresh();
  };

  Window_SubMember.prototype.setSubMember = function () {
    this.subMember1 = $gameActors.actor($gameVariables.value(submemberVar1));
    this.subMember2 = $gameActors.actor($gameVariables.value(submemberVar2));
    this.subMember3 = $gameActors.actor($gameVariables.value(submemberVar3));
    this.subMember4 = $gameActors.actor($gameVariables.value(submemberVar4));
  };

  Window_SubMember.prototype.refresh = function () {
    var y = 0;
    var numLines = 0;
    var isVisible = true;
    var width = this.width - 80;
    var lineHeight = this.lineHeight();
    this.contents.clear();
    // draw the text "sub member"
    this.changeTextColor(this.systemColor());
    this.drawText(subMemberText, 4, 0, width);
    numLines++;
    // draw sub members
    this.resetTextColor();
    y += lineHeight;
    if (this.subMember1) {
      this.drawActorName(this.subMember1, 44, y, width);
      this.drawActorCharacter(this.subMember1, 24, y + 40);
      y += lineHeight;
      numLines++;
    }
    if (this.subMember2) {
      this.drawActorName(this.subMember2, 44, y, width);
      this.drawActorCharacter(this.subMember2, 24, y + 40);
      y += lineHeight;
      numLines++;
    }
    if (this.subMember3) {
      this.drawActorName(this.subMember3, 44, y, width);
      this.drawActorCharacter(this.subMember3, 24, y + 40);
      y += lineHeight;
      numLines++;
    }
    if (this.subMember4) {
      this.drawActorName(this.subMember4, 44, y, width);
      this.drawActorCharacter(this.subMember4, 24, y + 40);
      y += lineHeight;
      numLines++;
    }
    // if no sub members
    if (y === lineHeight) {
      this.drawText(subMemberNoneText, 4, y, width);
      numLines++;
      if (!displayIfNone) {
        isVisible = false;
      }
    }
    // fitting height
    if (numLines < 5 || this.y != 324) {
      this.height = this.fittingHeight(numLines) + 4;
      this.y = Graphics.height - 72 - this.height;
    }
    // set visible status
    this.visible = isVisible;
  };

  //
  // sub member window 2 (without name)
  //
  function Window_SubMember2() {
    this.initialize.apply(this, arguments);
  }

  Window_SubMember2.prototype = Object.create(Window_SubMember.prototype);
  Window_SubMember2.prototype.constructor = Window_SubMember2;

  Window_SubMember2.prototype.initialize = function (x, y, width, height) {
    Window_SubMember.prototype.initialize.call(this, x, y, width, height);
  };

  Window_SubMember2.prototype.refresh = function () {
    var x = 24;
    var y = this.lineHeight() * 2 + 16;
    var charSize = $gameMap.tileWidth();
    var numMembers = 0;
    var isVisible = true;
    var width = this.width - 80;
    this.contents.clear();
    // draw the text "sub member"
    this.changeTextColor(this.systemColor());
    this.drawText(subMemberText, 4, 0, width);
    if (this.subMember1) {
      this.drawActorCharacter(this.subMember1, x, y);
      x += charSize;
      numMembers++;
    }
    if (this.subMember2) {
      this.drawActorCharacter(this.subMember2, x, y);
      x += charSize;
      numMembers++;
    }
    if (this.subMember3) {
      this.drawActorCharacter(this.subMember3, x, y);
      x += charSize;
      numMembers++;
    }
    if (this.subMember4) {
      this.drawActorCharacter(this.subMember4, x, y);
      x += charSize;
      numMembers++;
    }
    // draw sub members
    this.resetTextColor();
    // if no sub members
    if (x === 24) {
      this.drawText(subMemberNoneText, 4, this.lineHeight() + 16);
      if (!displayIfNone) {
        isVisible = false;
      }
    }
    // fitting height
    this.height = this.fittingHeight(2) + 20;
    this.y = Graphics.height - 72 - this.height;
    // set visible status
    this.visible = isVisible;
  };

  // ----------------------------------------------------------------------
  // display sub member at screen
  //
  // added parameters Ver.1.1
  //
  var subMemberVarList = [
    submemberVar1,
    submemberVar2,
    submemberVar3,
    submemberVar4,
  ];
  var subMembers = [];

  //
  // sub members definition
  //
  var _Game_Followers_initialize = Game_Followers.prototype.initialize;
  Game_Followers.prototype.initialize = function () {
    _Game_Followers_initialize.call(this);
    this.createSubMembers();
  };

  Game_Followers.prototype.createSubMembers = function () {
    for (var i = 0; i < 4; i++) {
      var follower = new Game_Follower(this._data.length + 1);
      this._data.push(follower);
      subMembers.push(follower);
    }
  };

  //
  // at each loading, recreate followers.
  //
  var _DataManager_loadGame = DataManager.loadGame;
  DataManager.loadGame = function (savefileId) {
    var isSuccess = _DataManager_loadGame.call(this, savefileId);
    if (isSuccess) {
      $gamePlayer._followers.recreateFollowers();
    }
    return isSuccess;
  };

  Game_Followers.prototype.recreateFollowers = function () {
    this._data = [];
    for (var i = 1; i < $gameParty.maxBattleMembers(); i++) {
      this._data.push(new Game_Follower(i));
    }
    $gameSystem._touchFollowerIncluded = null;
    if ($gameSystem.TMFollowerIncluded()) {
      for (i = 0; i < additionalFollower; i++) {
        this._data.push(new Game_Follower($gameParty.maxBattleMembers() + i));
      }
    }
    this.createSubMembers();
  };

  //
  // sub members display (Game_Follower)
  //
  var parameterToSubMemberActor = function (index) {
    var varId = subMemberVarList[index];
    var subMemberID = $gameVariables.value(varId);
    var subMember = $gameActors.actor(subMemberID);
    if (varId > 0 && subMemberID && subMember) {
      return subMember;
    }
    return null;
  };

  // skip subMember whose actorId is 0.
  var subMemberPosition = function (index) {
    for (var newIndex = 0, i = 0; i < 4; i++) {
      var actor = parameterToSubMemberActor(i);
      if (actor) {
        if (newIndex++ === index) {
          return actor;
        }
      } else {
        continue;
      }
    }
    return null;
  };

  //
  // change subPlayer display when specified variable changes
  //
  var _Game_Variables_setValue = Game_Variables.prototype.setValue;
  Game_Variables.prototype.setValue = function (variableId, value) {
    _Game_Variables_setValue.call(this, variableId, value);
    if (DisplayOnMap) {
      if (subMemberVarList.contains(variableId)) {
        $gameTemp.needFollowerRefresh = true;
      }
    }
  };

  var _Scene_Map_update = Scene_Map.prototype.update;
  Scene_Map.prototype.update = function () {
    if ($gameTemp.needFollowerRefresh) {
      $gamePlayer._followers.refresh();
      $gameTemp.needFollowerRefresh = false;
    }
    _Scene_Map_update.call(this);
  };

  //
  // sub members display (Spriteset_Map)
  //
  var _Spriteset_Map_createCharacters =
    Spriteset_Map.prototype.createCharacters;
  Spriteset_Map.prototype.createCharacters = function () {
    _Spriteset_Map_createCharacters.call(this);
    for (var i = 0; i < 4; i++) {
      var newCharacterSprite = new Sprite_Character(subMembers[i]);
      this._characterSprites.push(newCharacterSprite);
      this._tilemap.addChild(newCharacterSprite);
    }
  };

  // ----------------------------------------------------------------------
  // add compatibility with TMFollowerEx.js
  //
  // added features Ver.1.2

  //
  // read hikimoki's plugin parameters
  //
  Game_System.prototype.TMFollowerIncluded = function () {
    if (this._touchFollowerIncluded == null) {
      this._touchFollowerIncluded = "isTouchFollowerEnabled" in $gameSystem;
    }
    return this._touchFollowerIncluded;
  };

  //
  // find the number of each component
  //
  var followerMaxSize = function () {
    return (
      $gameParty.maxBattleMembers() -
      1 +
      ($gameSystem.TMFollowerIncluded() ? additionalFollower : 4)
    );
  };

  var hasHeader = function () {
    return $gameSystem.TMFollowerIncluded() && $gamePlayer.headerFollower() > 0;
  };

  var hasFooter = function () {
    return $gameSystem.TMFollowerIncluded() && $gamePlayer.footerFollower() > 0;
  };

  var numDispActor = function () {
    var actorFollowerNum = $gameParty.size() - 1 + (hasHeader() ? 1 : 0);
    var ceil = $gameSystem.TMFollowerIncluded()
      ? followerMaxSize()
      : $gameParty.maxBattleMembers() - 1;
    return actorFollowerNum.clamp(0, ceil);
  };

  var numSubMembers = function () {
    var num = 0;
    if (DisplayOnMap) {
      for (var i = 0; i < 4; i++) {
        if (subMemberPosition(i)) {
          num++;
        }
      }
    }
    return num.clamp(0, followerMaxSize() - numDispActor());
  };

  //
  // find followers' character
  //
  // (overwritten)
  Game_Follower.prototype.actor = function () {
    var lastId = 0;
    var headerNum = hasHeader() ? 1 : 0;
    var footerNum = hasFooter() ? 1 : 0;
    // footer
    if (
      hasFooter() &&
      this._memberIndex ===
        Math.min(followerMaxSize(), numDispActor() + numSubMembers() + 1)
    ) {
      return $gameActors.actor($gamePlayer.footerFollower());
    }
    // normal followers.
    if (this._memberIndex <= (lastId = numDispActor())) {
      return $gameParty.allMembers()[this._memberIndex - headerNum];
    }
    // menu sub member
    if (DisplayOnMap && this._memberIndex <= (lastId += numSubMembers())) {
      return subMemberPosition(
        this._memberIndex + numSubMembers() - lastId - 1
      );
    }
    return null;
  };
})();


code:
//
//  メッセージアライメント制御文字 ver1.04
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//

var Imported = Imported || {};
Imported["MessageAlignmentEC"] = 1.04;
/*:
 * @plugindesc ver1.04/メッセージのアライメントを変更する制御文字を追加します。
 * @author Yana
 *
 * @param ExtendEC
 * @desc メッセージ内で制御文字として扱う文字です。
 * 詳細はヘルプを参照してください。
 * @default
 *
 * @help ------------------------------------------------------
 * 使用方法
 * ------------------------------------------------------
 * イベントコマンド「文章の表示」及び、「文章のスクロール表示」内に
 * アライメントを変更する制御文字を追加します。
 * 追加される制御文字は、
 *
 * \LL 文字を左寄せにします。
 * \CL 文字を中央寄せにします。
 * \RL 文字を右寄せにします。
 *
 * の3つです。
 * 呼び出された時点で、同ページのそれより下の行は自動的に
 * 設定したアライメントに変更されます。
 *
 * ※プラグインパラメータについて
 *
 * プラグインパラメータで指定した制御文字は、幅0として計算される
 * ようになります。
 *
 * この際、制御文字が\aの場合は、aを指定します。
 * 制御文字が\a[x]の場合は、aのみを指定します。
 *
 * 指定する制御文字はカンマ区切りで複数個指定可能です。
 * a,b,d
 * と指定すると、\a及び\a[x]、\b及び\b[x]、\d及び\d[x]が、
 * 文字幅0として計算されます。
 *
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 当プラグインはMITライセンスで公開されています。
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.04:
 * 一つの行に複数の色変更やアイコンがあった時、正常にテキストの幅が取得できないバグを修正。
 * ver1.03:
 * 拡張制御文字に合わせて処理を修正。
 * ver1.02:
 * プラグインパラメータに何も指定していない時、アライメント指定が正常に機能しないバグを修正。
 * ver1.01:
 * 文章のスクロール表示に対応。
 * }{を使用すると、正常に文字の横幅を取得できていなかったバグを修正。
 * 指定した制御文字を幅0で計算するためのパラメータを追加。
 * ver1.00:
 * 公開
 */

(function () {
  ////////////////////////////////////////////////////////////////////////////////////

  var parameters = PluginManager.parameters("MessageAlignmentEC");
  var extendEC = parameters["ExtendEC"].split(",");

  ////////////////////////////////////////////////////////////////////////////////////

  Window_Base.prototype.textWidthEx = function (text) {
    var result = 0;
    text = text.replace(/\x1bC\[\d+\]/gi, "");
    text = text.replace(
      /\x1bI\[\d+\]/gi,
      function () {
        result += Window_Base._iconWidth;
        return "";
      }.bind(this)
    );
    for (var i = 0, max = text.length; i < max; i++) {
      var c = text[i];
      if (c === "\x1b") {
        i++;
        c = text[i];
        if (c === "{") {
          this.makeFontBigger();
        } else if (c === "}") {
          this.makeFontSmaller();
        } else if (c === "F" && text[i + 1] === "S") {
          var cc = "\x1b";
          for (var j = i; j < max; j++) {
            cc += text[j];
            if (text[j] === "]") {
              if (cc.match(/\x1bFS\[(\d+)\]/i))
                this.contents.fontSize = Number(RegExp.$1);
              i = j;
              break;
            }
          }
        }
      } else {
        result += this.textWidth(c);
      }
    }
    return result;
  };

  Window_Base.prototype.setAlignment = function (text, col, max) {
    if (this._aligns === undefined) {
      this._aligns = [];
    }
    text = text.replace(
      /\x1bLL/i,
      function () {
        for (var j = col; j < max; j++) {
          this._aligns[j] = null;
        }
        return "";
      }.bind(this)
    );
    text = text.replace(
      /\x1bCL/i,
      function () {
        for (var j = col; j < max; j++) {
          this._aligns[j] = "center";
        }
        return "";
      }.bind(this)
    );
    text = text.replace(
      /\x1bRL/i,
      function () {
        for (var j = col; j < max; j++) {
          this._aligns[j] = "right";
        }
        return "";
      }.bind(this)
    );
    return text;
  };

  ////////////////////////////////////////////////////////////////////////////////////

  // 再定義
  Window_ScrollText.prototype.refresh = function () {
    var textState = { index: 0 };
    textState.text = this.convertEscapeCharacters(this._text);
    this.resetFontSettings();
    this._allTextHeight = this.calcTextHeight(textState, true);
    var texts = this._text.split("\n");
    this.createContents();
    this.origin.y = -this.height;
    var yy = 0;
    var fontSize = this.contents.fontSize;
    this._aligns = [];
    for (var i = 0, max = texts.length; i < max; i++) {
      var text = texts[i];
      var text2 = this.convertEscapeCharacters(text);
      if (fontSize > this.standardFontSize()) {
        var n = Math.ceil((fontSize - this.standardFontSize()) / 12);
        for (var j = 0; j < n; j++) {
          text = "\\{" + text;
        }
      }
      if (fontSize < this.standardFontSize()) {
        text = "\\}" + text;
      }
      var height = this.calcTextHeight({ index: 0, text: text2 }, false);
      text2 = this.setAlignment(text2, i, max);
      var textWidth = this.textWidthEx(text2);
      var sx = 0;
      if (this._aligns[i] === "center") {
        sx = (this.contentsWidth() - this.textPadding() - textWidth) / 2;
      } else if (this._aligns[i] === "right") {
        sx = this.contentsWidth() - this.textPadding() - textWidth;
      }
      this.drawTextEx(text, this.textPadding() + sx, 1 + yy);
      fontSize = this.contents.fontSize;
      yy += height;
    }
  };

  ////////////////////////////////////////////////////////////////////////////////////

  var __WMessage_startMessage = Window_Message.prototype.startMessage;
  Window_Message.prototype.startMessage = function () {
    this._callStart = true;
    __WMessage_startMessage.call(this);
    this._callStart = false;
  };

  Window_Message.prototype.checkTextWidth = function () {
    this._currentPage = 0;
    var texts = this._textState.text.split("\n");
    this._corX = [0, 0, 0, 0];
    this._aligns = [];
    var fontSize = this.contents.fontSize;
    var ary = this.zeroWidthEscapes();
    for (var i = 0, max = texts.length; i < max; i++) {
      var text = texts[i];
      for (var j = 0, jmax = ary.length; j < jmax; j++) {
        var regExp = new RegExp("\\x1b" + ary[j] + "(?:\\[.+?\\])*", "gi");
        text = text.replace(regExp, "");
      }
      text = this.setAlignment(text, i, max);
      this._corX[i] = this.textWidthEx(text);
    }
    this.contents.fontSize = fontSize;
  };

  Window_Message.prototype.zeroWidthEscapes = function () {
    var ary = ["\\.", "\\|", "\\$", ">", "<", "!", "\\^"];
    if (extendEC.length > 0 && extendEC[0] !== "") {
      ary = ary.concat(extendEC);
    }
    if (Imported["yExtendEscapeCharacters"]) {
      var ary2 = [
        "BGM",
        "BGS",
        "SE",
        "ME",
        "FRT",
        "FFV",
        "FFH",
        "FO",
        "FCI",
        "FSN",
        "FCT",
        "FBC",
        "WC",
        "WCW",
        "DWC",
        "DWCW",
        "MMW",
        "RMW",
        "OMW",
        "BLN",
        "ANI",
        "SPIC",
        "MPIC",
        "ZPIC",
        "OPIC",
        "ORPIC",
        "RPIC",
        "APIC",
        "TPIC",
        "NCPIC",
        "CFPIC",
        "CTPIC",
        "CXPIC",
        "BNPIC",
        "FIPIC",
        "FOPIC",
      ];
      ary = ary.concat(ary2);
    }
    if (Imported["StandPictureEC"]) {
      var ary2 = [
        "WT",
        "SP",
        "HP",
        "CP",
        "RP",
        "MP",
        "ZP",
        "RMP",
        "RRP",
        "RZP",
        "TP",
        "CFP",
        "COP",
        "BCP",
        "LS",
        "LE",
        "BP",
        "OP",
        "SFR",
        "SBK",
        "MC",
        "RMC",
        "ZC",
        "RZC",
        "RC",
        "RRC",
        "RPC",
        "ZPC",
        "SAC",
      ];
      ary = ary.concat(ary2);
    }
    return ary;
  };

  var __WMessage_newLineX = Window_Message.prototype.newLineX;
  Window_Message.prototype.newLineX = function () {
    if (this._callStart) {
      this.checkTextWidth();
    }
    var newX = __WMessage_newLineX.call(this);
    var width = this.contents.width;
    if (this._rightFace) {
      width -= 168;
    }
    if (this._aligns[this._currentPage] === "center") {
      newX = (width - newX - this._corX[this._currentPage]) / 2 + newX;
    } else if (this._aligns[this._currentPage] === "right") {
      newX = width - this._corX[this._currentPage];
    }
    return newX;
  };

  var __WMessage_processNewLine = Window_BattleLog.prototype.processNewLine;
  Window_Message.prototype.processNewLine = function (textState) {
    __WMessage_processNewLine.call(this, textState);
    this._currentPage += 1;
    this._textState.x = this.newLineX();
  };

  ////////////////////////////////////////////////////////////////////////////////////
})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// MessageWindowHidden.js
// ----------------------------------------------------------------------------
// (C)2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.6.1 2020/05/21 トリガースイッチと連動無効スイッチの状態によってエラーが起きうる記述を修正
// 2.6.0 2020/05/20 ピクチャの連動を無効にできるスイッチを追加
// 2.5.1 2020/05/19 2.3.0の仕様変更で連動表示ピクチャの透明度が復元できない問題を修正
// 2.5.0 2020/05/17 指定したスイッチに連動させてウィンドウの表示/非表示を切り替える機能を追加
// 2.4.0 2020/05/08 選択肢表示中でもウィンドウを隠せるよう設定を追加
// 2.3.0 2019/10/22 ウィンドウを表示状態にもどしたとき、連動ピクチャは、もともと表示していた不透明度を復元するよう仕様変更
// 2.2.0 2019/06/09 メッセージウィンドウと逆に連動して指定したピクチャの表示/非表示が自動で切り替わる機能を追加
// 2.1.0 2018/10/10 戦闘中にプラグインを無効化できる機能を追加。
// 2.0.0 2018/03/31 消去するトリガーを複数指定できる機能を追加。パラメータの指定方法を見直し。
// 1.4.0 2018/03/10 指定したスイッチがONの間はウィンドウ消去を無効化できる機能を追加
// 1.3.2 2017/08/02 ponidog_BackLog_utf8.jsとの競合を解消
// 1.3.1 2017/07/03 古いYEP_MessageCore.jsのネーム表示ウィンドウが再表示できない不具合の修正(by DarkPlasmaさま)
// 1.3.0 2017/03/16 連動して非表示にできるピクチャを複数指定できる機能を追加
// 1.2.1 2017/02/07 端末依存の記述を削除
// 1.2.0 2016/01/02 メッセージウィンドウと連動して指定したピクチャの表示/非表示が自動で切り替わる機能を追加
// 1.1.0 2016/08/25 選択肢の表示中はウィンドウを非表示にできないよう仕様変更
// 1.0.4 2016/07/22 YEP_MessageCore.jsのネーム表示ウィンドウと連携する機能を追加
// 1.0.3 2016/01/24 メッセージウィンドウが表示されていないときも非表示にできてしまう現象の修正
// 1.0.2 2016/01/02 競合対策
// 1.0.1 2015/12/31 コメント追加＋英語対応（仕様に変化なし）
// 1.0.0 2015/12/30 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc Erase message window
 * @author triacontane
 *
 * @param triggerButton
 * @desc Trigger buttons
 * (light_click or shift or control)
 * @default ["light_click"]
 * @type combo[]
 * @option light_click
 * @option shift
 * @option control
 * @option tab
 * @option pageup
 * @option pagedown
 * @option debug
 *
 * @param triggerSwitch
 * @desc The window will be erased in conjunction with the specified switch.
 * @default 0
 * @type switch
 *
 * @param linkPictureNumbers
 * @desc Picture number of window show/hide
 * @default []
 * @type number[]
 *
 * @param linkShowPictureNumbers
 * @desc Picture number of window show/hide
 * @default []
 * @type number[]
 *
 * @param disableLinkSwitchId
 * @desc 指定した番号のスイッチがONのとき、ピクチャの連動が無効になります。
 * @default 0
 * @type switch
 *
 * @param disableSwitchId
 * @desc 指定した番号のスイッチがONのとき、プラグインの機能が無効になります。
 * @default 0
 * @type switch
 *
 * @param disableInBattle
 * @desc trueのとき、戦闘中にプラグインの機能を無効にします。
 * @default false
 * @type boolean
 *
 * @param disableInChoice
 * @desc 選択肢の表示中はウィンドウを非表示にできなくなります。
 * @default true
 * @type boolean
 *
 * @help Erase message window (and restore) when triggered
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc メッセージウィンドウ一時消去プラグイン
 * @author トリアコンタン
 *
 * @param triggerButton
 * @text ボタン名称
 * @desc ウィンドウを消去するボタンです。(複数登録可能) プラグイン等で入力可能なボタンを追加した場合は直接入力
 * @default ["右クリック"]
 * @type combo[]
 * @option 右クリック
 * @option shift
 * @option control
 * @option tab
 * @option pageup
 * @option pagedown
 * @option debug
 *
 * @param triggerSwitch
 * @text トリガースイッチ
 * @desc 指定したスイッチに連動させてウィンドウを消去します。並列処理などを使ってON/OFFを適切に管理してください。
 * @default 0
 * @type switch
 *
 * @param linkPictureNumbers
 * @text 連動ピクチャ番号
 * @desc ウィンドウ消去時に連動して不透明度を[0]にするピクチャの番号です。
 * @default []
 * @type number[]
 *
 * @param linkShowPictureNumbers
 * @text 連動表示ピクチャ番号
 * @desc ウィンドウ消去時に連動して不透明度を[255]にするピクチャの番号です。
 * @default []
 * @type number[]
 *
 * @param disableLinkSwitchId
 * @text 連動ピクチャ無効スイッチ
 * @desc 指定した番号のスイッチがONのとき、ピクチャの連動が無効になります。
 * @default 0
 * @type switch
 *
 * @param disableSwitchId
 * @text 無効スイッチ
 * @desc 指定した番号のスイッチがONのとき、プラグイン全体の機能が無効になります。
 * @default 0
 * @type switch
 *
 * @param disableInBattle
 * @text 戦闘中無効化
 * @desc trueのとき、戦闘中にプラグインの機能を無効にします。
 * @default false
 * @type boolean
 *
 * @param disableInChoice
 * @text 選択肢表示中は無効
 * @desc 選択肢の表示中はウィンドウを非表示にできなくなります。
 * @default true
 * @type boolean
 *
 * @help メッセージウィンドウを表示中に指定したボタンを押下することで
 * メッセージウィンドウを消去します。もう一度押すと戻ります。
 *
 * ウィンドウ消去時に連動して不透明度を[0]にするピクチャを指定することができます。
 * 背景に特定のピクチャを使用している場合などに指定してください。
 * 再表示すると不透明度は、ウィンドウ非表示まえの不透明度で復元されます。
 *
 * ver2.0.0よりパラメータの指定方法が一部変更になりました。
 * 以前のバージョンを使っていた方は再設定をお願いします。
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
(function () {
  "use strict";

  /**
   * Create plugin parameter. param[paramName] ex. param.commandPrefix
   * @param pluginName plugin name(EncounterSwitchConditions)
   * @returns {Object} Created parameter
   */
  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 param = createPluginParameter("MessageWindowHidden");

  //=============================================================================
  // Game_Picture
  //  メッセージウィンドウの表示可否と連動します。
  //=============================================================================
  Game_Picture.prototype.linkWithMessageWindow = function (opacity) {
    this._opacity = opacity;
    this._targetOpacity = opacity;
  };

  //=============================================================================
  // Window_Message
  //  指定されたボタン押下時にウィンドウとサブウィンドウを非表示にします。
  //=============================================================================
  var _Window_Message_updateWait = Window_Message.prototype.updateWait;
  Window_Message.prototype.updateWait = function () {
    if (
      !this.isClosed() &&
      this.isTriggeredHidden() &&
      this.isEnableInChoice()
    ) {
      if (!this.isHidden()) {
        this.hideAllWindow();
      } else {
        this.showAllWindow();
      }
    }
    var wait = _Window_Message_updateWait.apply(this, arguments);
    if (this.isHidden() && this.visible) {
      this.hideAllWindow();
    }
    return wait;
  };

  Window_Message.prototype.isEnableInChoice = function () {
    return !(param.disableInChoice && $gameMessage.isChoice());
  };

  Window_Message.prototype.hideAllWindow = function () {
    this.hide();
    this.subWindows().forEach(
      function (subWindow) {
        this.hideSubWindow(subWindow);
      }.bind(this)
    );
    if (this.hasNameWindow() && !this.nameWindowIsSubWindow())
      this.hideSubWindow(this._nameWindow);
    this._originalPictureOpacities = {};
    this.linkPictures(0, param.linkPictureNumbers);
    this.linkPictures(255, param.linkShowPictureNumbers);
    this._hideByMessageWindowHidden = true;
  };

  Window_Message.prototype.showAllWindow = function () {
    this.show();
    this.subWindows().forEach(
      function (subWindow) {
        this.showSubWindow(subWindow);
      }.bind(this)
    );
    if (this.hasNameWindow() && !this.nameWindowIsSubWindow())
      this.showSubWindow(this._nameWindow);
    this.linkPictures(null, param.linkShowPictureNumbers);
    this.linkPictures(null, param.linkPictureNumbers);
    this._hideByMessageWindowHidden = false;
  };

  Window_Message.prototype.isHidden = function () {
    return this._hideByMessageWindowHidden;
  };

  Window_Message.prototype.linkPictures = function (opacity, pictureNumbers) {
    if (!pictureNumbers || $gameSwitches.value(param.disableLinkSwitchId)) {
      return;
    }
    pictureNumbers.forEach(function (pictureId) {
      this.linkPicture(opacity, pictureId);
    }, this);
  };

  Window_Message.prototype.linkPicture = function (opacity, pictureId) {
    var picture = $gameScreen.picture(pictureId);
    if (!picture) {
      return;
    }
    if (opacity === null) {
      if (!this._originalPictureOpacities.hasOwnProperty(pictureId)) {
        return;
      }
      opacity = this._originalPictureOpacities[pictureId];
    } else {
      this._originalPictureOpacities[pictureId] = picture.opacity();
    }
    picture.linkWithMessageWindow(opacity);
  };

  Window_Message.prototype.hideSubWindow = function (subWindow) {
    subWindow.prevVisible = subWindow.visible;
    subWindow.hide();
  };

  Window_Message.prototype.showSubWindow = function (subWindow) {
    if (subWindow.prevVisible) subWindow.show();
    subWindow.prevVisible = undefined;
  };

  Window_Message.prototype.hasNameWindow = function () {
    return this._nameWindow && typeof Window_NameBox !== "undefined";
  };

  // 古いYEP_MessageCore.jsでは、ネーム表示ウィンドウはsubWindowsに含まれる
  Window_Message.prototype.nameWindowIsSubWindow = function () {
    return (
      this.subWindows().filter(function (subWindow) {
        return subWindow === this._nameWindow;
      }, this).length > 0
    );
  };

  Window_Message.prototype.disableWindowHidden = function () {
    return (
      (param.disableSwitchId > 0 &&
        $gameSwitches.value(param.disableSwitchId)) ||
      (param.disableInBattle && $gameParty.inBattle())
    );
  };

  Window_Message.prototype.isTriggeredHidden = function () {
    if (this.disableWindowHidden()) {
      return false;
    }
    if (param.triggerSwitch > 0 && this.isTriggeredHiddenSwitch()) {
      return true;
    }
    return param.triggerButton.some(function (button) {
      switch (button) {
        case "":
        case "右クリック":
        case "light_click":
          return TouchInput.isCancelled();
        case "ok":
          return false;
        default:
          return Input.isTriggered(button);
      }
    });
  };

  Window_Message.prototype.isTriggeredHiddenSwitch = function () {
    var triggerSwitch = $gameSwitches.value(param.triggerSwitch);
    if (triggerSwitch && !this.isHidden()) {
      return true;
    }
    if (!triggerSwitch && this.isHidden()) {
      return true;
    }
    return false;
  };

  var _Window_Message_updateInput = Window_Message.prototype.updateInput;
  Window_Message.prototype.updateInput = function () {
    if (this.isHidden()) return true;
    return _Window_Message_updateInput.apply(this, arguments);
  };

  //=============================================================================
  // Window_ChoiceList、Window_NumberInput、Window_EventItem
  //  非表示の間は更新を停止します。
  //=============================================================================
  var _Window_ChoiceList_update = Window_ChoiceList.prototype.update;
  Window_ChoiceList.prototype.update = function () {
    if (!this.visible) return;
    _Window_ChoiceList_update.apply(this, arguments);
  };

  var _Window_NumberInput_update = Window_NumberInput.prototype.update;
  Window_NumberInput.prototype.update = function () {
    if (!this.visible) return;
    _Window_NumberInput_update.apply(this, arguments);
  };

  var _Window_EventItem_update = Window_EventItem.prototype.update;
  Window_EventItem.prototype.update = function () {
    if (!this.visible) return;
    _Window_EventItem_update.apply(this, arguments);
  };
})();