code:
//=============================================================================
// TDDP_MouseSystemEx.js
// Version: 1.6.1
//=============================================================================

var Imported = Imported || {};
Imported.TDDP_MouseSystemEx = "1.6.1";

//=============================================================================
/*:
 * @plugindesc 1.6.1 Custom mouse cursors, highlight menu items on hover, custom event mouse interaction and much more! See Help.
 *
 * @author Tor Damian Design / Galenmereth
 *
 * @param ---Custom Cursor---
 * @desc This is a heading, no need to touch it.
 * @default
 *
 * @param Use Custom Cursor?
 * @desc Whether you want to use a custom mouse cursor image.
 * true => ON       false => OFF
 * @default false
 *
 * @param Custom Cursor Image
 * @desc The filename for the custom cursor. It looks for this in your project's Custom Cursor Folder.
 * @default default.png
 *
 * @param Custom Cursors Folder
 * @desc The folder you wish to store the custom cursors in. Must end with a forward slash. Default: img/cursors/
 * @default img/cursors/
 *
 * @param ---Auto Change Cursors---
 * @desc Options for automatically changing the mouse cursor when hovering over events with the given event commands in them.
 * @default
 *
 * @param Show Text Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Show Text commands in them.
 *
 * @param Transfer Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Transfer Player commands in them.
 *
 * @param Change Gold Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Change Gold commands in them.
 *
 * @param Change Items Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Change Items commands in them.
 *
 * @param Change Weapons Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Change Weapons commands in them.
 *
 * @param Change Armors Cursor
 * @desc Automatically show this custom cursor image when hovering over events with Change Armors commands in them.
 *
 * @param ---Auto Change Icons---
 * @desc Options for automatically showing an icon when hovering over events with the given event commands in them.
 * @default
 *
 * @param Show Text Icon
 * @desc Automatically show this icon when hovering over events with Show Text commands in them.
 *
 * @param Transfer Icon
 * @desc Automatically show this icon when hovering over events with Transfer Player commands in them.
 *
 * @param Change Gold Icon
 * @desc Automatically show this icon when hovering over events with Change Gold commands in them.
 *
 * @param Change Items Icon
 * @desc Automatically show this icon when hovering over events with Change Items commands in them.
 *
 * @param Change Weapons Icon
 * @desc Automatically show this icon when hovering over events with Change Weapons commands in them.
 *
 * @param Change Armors Icon
 * @desc Automatically show this icon when hovering over events with Change Armors commands in them.
 *
 * @param ---Hover Select---
 * @desc This is a heading, no need to touch it.
 * @default
 *
 * @param Highlight On Hover
 * @desc Highlight menu items when hovering over them with the mouse.
 * true => ON       false => OFF
 * @default false
 *
 * @param Hover SE Cooldown
 * @desc Audio cooldown (in frames) between playing Cursor SE when Highlight On Hover is set to true. Default 4.
 * @default 4
 *
 * @param ---Customizeable Notetags---
 * @desc These are options for activating events by mouse interaction instead of player character.
 * @default
 *
 * @param No Auto Cursor Notetag
 * @desc The notetag used to disable auto cursor switching on this event or event page.
 * @default no_auto_cursor!
 *
 * @param No Auto Icon Notetag
 * @desc The notetag used to disable auto icon switching on this event or event page.
 * @default no_auto_icon!
 *
 * @param Click Notetag
 * @desc The notetag used to trigger the event when it is clicked on.
 * Default: click_activate!
 * @default click_activate!
 *
 * @param Hover Notetag
 * @desc The notetag used to trigger the event when the mouse is over it.
 * Default: hover_activate!
 * @default hover_activate!
 *
 * @param Leave Notetag
 * @desc The notetag used to trigger the event when the mouse leaves it.
 * Default: leave_activate!
 * @default leave_activate!
 *
 * @param ---Mouse Icons---
 * @desc This is a heading, no need to touch it.
 * @default
 *
 * @param Hide Cursor
 * @desc Hide the default mouse cursor when an icon is shown.
 * true => ON       false => OFF
 * @default false
 *
 * @param Icon Offset X
 * @desc The icon's offset from the mouse horizontally.
 * Default: 9
 * @default 9
 *
 * @param Icon Offset Y
 * @desc The icon's offset from the mouse vertically.
 * Default: 14
 * @default 14
 *
 * @param ---Mouse Icon Tags---
 * @desc This is a heading, no need to touch it.
 * @default
 *
 * @param Icon Tag 1
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default quest: 191
 *
 * @param Icon Tag 2
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default chest: 210
 *
 * @param Icon Tag 3
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default door: 106
 *
 * @param Icon Tag 4
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default world_map: 190
 *
 * @param Icon Tag 5
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default potion: 176
 *
 * @param Icon Tag 6
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default poison: 177
 *
 * @param Icon Tag 7
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default four_leaf_clover: 182
 *
 * @param Icon Tag 8
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default notebook: 187
 *
 * @param Icon Tag 9
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default letter: 192
 *
 * @param Icon Tag 10
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @param Icon Tag 11
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @param Icon Tag 12
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @param Icon Tag 13
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @param Icon Tag 14
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @param Icon Tag 15
 * @desc Set up an icon tag shortcut to be used with the Mouse Hover Icons notetag. See plugin Help for more information.
 * @default key: 195
 *
 * @help =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * Information
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * TDDP - MouseSystem is a collection of methods for modifying mouse-based
 * interaction in your games. You can set custom mouse cursors, show icons beside
 * the mouse when hovering over events, activate events by mouse, and more.
 *
 * For updates and easy to use documentation, please go to the plugin's website:
 * http://mvplugins.tordamian.com/?p=26
 *
 * There you can also download a PDF of the documentation for offline use, and
 * having the documentation in one cleanly presented place means you can always
 * be sure it's the most recent available.
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Terms & Conditions
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * This plugin is free for both non-commercial and commercial use. Please see
 * http://mvplugins.tordamian.com/terms-of-use for the full terms of use.
 *
 * A big thank you to Degica for making this plugin free for commercial use for
 * everyone!
 */
/*:ja
 * @plugindesc マウスカーソルのカスタム、メニューアイテムの
 * ハイライトなどを行います。詳しくはHelpをご覧ください。
 *
 * @author Tor Damian Design / Galenmereth
 *
 * @param ---Custom Cursor---
 * @desc カーソルをカスタムするオプションです。(見出しのため変更不要)
 * @default
 *
 * @param Use Custom Cursor?
 * @desc カスタムマウスカーソル画像を利用するかどうか選択します。
 * true => ON       false => OFF
 * @default false
 *
 * @param Custom Cursor Image
 * @desc カスタムカーソルのファイル名です。プロジェクト内のカスタムカーソルフォルダで、このファイル名を探します。
 * @default default.png
 *
 * @param Custom Cursors Folder
 * @desc カスタムカーソルを入れておきたいフォルダです。「/」で終わるように設定してください。デフォルト設定: img/cursors/
 * @default img/cursors/
 *
 * @param ---Auto Change Cursors---
 * @desc イベントのマウスオーバー時に、自動的にカーソルを変更するオプションです。(見出しのため変更不要)
 * @default
 *
 * @param Show Text Cursor
 * @desc Show Textのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param Transfer Cursor
 * @desc Transfer Playerのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param Change Gold Cursor
 * @desc Change Goldのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param Change Items Cursor
 * @desc Change Itemsのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param Change Weapons Cursor
 * @desc Change Weaponsのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param Change Armors Cursor
 * @desc Change Armorsのコマンドを含むイベントにマウスオーバーした際、このカスタムカーソル画像を表示します。
 *
 * @param ---Auto Change Icons---
 * @desc イベントのマウスオーバー時に、自動的にアイコンを表示するオプションです。(見出しのため変更不要)
 * @default
 *
 * @param Show Text Icon
 * @desc Show Textのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param Transfer Icon
 * @desc Transfer Playerのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param Change Gold Icon
 * @desc Change Goldのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param Change Items Icon
 * @desc Change Itemsのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param Change Weapons Icon
 * @desc Change Weaponsのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param Change Armors Icon
 * @desc Change Armorsのコマンドを含むイベントにマウスオーバーした際、このアイコンを表示します。
 *
 * @param ---Hover Select---
 * @desc マウス移動時のエフェクトを設定するオプションです。(見出しのため変更不要)
 * @default
 *
 * @param Highlight On Hover
 * @desc マウスオーバー時にメニューアイテムをハイライトします。
 * true => ON       false => OFF
 * @default false
 *
 * @param Hover SE Cooldown
 * @desc Highlight On HoverがONになっている状態で、オーディオの音量を下げます。デフォルト値=4
 * @default 4
 *
 * @param ---Customizeable Notetags---
 * @desc プレイヤーキャラクターの行動によってではなく、マウスインタラクションによってイベントを発動させるオプションです。
 * @default
 *
 * @param No Auto Cursor Notetag
 * @desc イベントもしくはイベントページ上で、オートカーソルスイッチを無効化するnotetagです。
 * @default no_auto_cursor!
 *
 * @param No Auto Icon Notetag
 * @desc イベントもしくはイベントページ上で、オートアイコンスイッチを無効化するnotetagです。
 * @default no_auto_icon!
 *
 * @param Click Notetag
 * @desc クリック時にイベントを発動させるnotetagです。
 * Default: click_activate!
 * @default click_activate!
 *
 * @param Hover Notetag
 * @desc マウスオ―バー時にイベントを発動させるnotetagです。
 * Default: hover_activate!
 * @default hover_activate!
 *
 * @param Leave Notetag
 * @desc マウスが離れた時にイベントを発動させるnotetagです。
 * Default: leave_activate!
 * @default leave_activate!
 *
 * @param ---Mouse Icons---
 * @desc マウスアイコンにまつわるオプションです。(見出しのため変更不要)
 * @default
 *
 * @param Hide Cursor
 * @desc アイコン表示時に、デフォルトのマウスカーソルを隠すオプションです。
 * true => ON       false => OFF
 * @default false
 *
 * @param Icon Offset X
 * @desc マウスからアイコンの距離を設定します。(X軸)
 * Default: 9
 * @default 9
 *
 * @param Icon Offset Y
 * @desc マウスからアイコンの距離を設定します。(Y軸)
 * Default: 14
 * @default 14
 *
 * @param ---Mouse Icon Tags---
 * @desc マウスアイコンにまつわるタグです。(見出しのため変更不要)
 * @default
 *
 * @param Icon Tag 1
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default quest: 191
 *
 * @param Icon Tag 2
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default chest: 210
 *
 * @param Icon Tag 3
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default door: 106
 *
 * @param Icon Tag 4
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default world_map: 190
 *
 * @param Icon Tag 5
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default potion: 176
 *
 * @param Icon Tag 6
 * @desc Mouse Hover Iconsnotetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default poison: 177
 *
 * @param Icon Tag 7
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default four_leaf_clover: 182
 *
 * @param Icon Tag 8
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default notebook: 187
 *
 * @param Icon Tag 9
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default letter: 192
 *
 * @param Icon Tag 10
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @param Icon Tag 11
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @param Icon Tag 12
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @param Icon Tag 13
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @param Icon Tag 14
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @param Icon Tag 15
 * @desc Mouse Hover Icons notetagと合わせて使用するため、アイコンタグのショートカットを設定します。
 * @default key: 195
 *
 * @help =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * Information
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * TDDP - MouseSystemは、ゲーム内でのマウスを用いた
 * 様々なアクションを可能にするプラグインです。
 * マウスカーソル自体のカスタマイズや、イベントマウスオーバー時のアイコン表示、
 * マウスでのイベントの発動などを行なうことができます。
 *
 * アップデートと簡易使用方法については、
 * こちらのプラグインのサイトを参照してください。
 * http://mvplugins.tordamian.com/?p=26
 * このサイトでは、オフラインで使用するためのPDFをダウンロードすることができます。
 * またいつでも最新版の確認を行なうことができます。
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Terms & Conditions
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * このプラグインは、商用利用・非商用利用どちらにもフリーで公開されています。
 * 使用方法の全文についてはこちらのサイトを確認してください。
 * http://mvplugins.tordamian.com/terms-of-use
 *
 * 最後に、このプラグインのフリーでの商用利用を実現してくれた
 * Degicaさんに感謝の意を表します。
 */
//=============================================================================
// All anonymous/helper functions are registered on this object for the convenience of other plugins.
var TDDP_MouseSystemEx = {};
(function () {
  "use strict";
  /**
   * Return .png if no file extension present in filename
   */
  TDDP_MouseSystemEx._ext = function (filename) {
    if (String(filename).split(".").length > 1) {
      return filename;
    } else {
      // Default filetype extension
      return filename + ".png";
    }
  };
  //=============================================================================
  // Setting up parameters
  //=============================================================================
  var parameters = PluginManager.parameters("TDDP_MouseSystemEx");
  // Auto change cursors
  TDDP_MouseSystemEx.showTextCursor =
    String(parameters["Show Text Cursor"]) || false;
  TDDP_MouseSystemEx.changeGoldCursor =
    String(parameters["Change Gold Cursor"]) || false;
  TDDP_MouseSystemEx.changeItemCursor =
    String(parameters["Change Items Cursor"]) || false;
  TDDP_MouseSystemEx.changeWeaponCursor =
    String(parameters["Change Weapons Cursor"]) || false;
  TDDP_MouseSystemEx.changeArmorCursor =
    String(parameters["Change Armors Cursor"]) || false;
  TDDP_MouseSystemEx.transferPlayerCursor =
    String(parameters["Transfer Cursor"]) || false;
  // Auto change icons
  TDDP_MouseSystemEx.showTextIcon =
    String(parameters["Show Text Icon"]) || false;
  TDDP_MouseSystemEx.changeGoldIcon =
    String(parameters["Change Gold Icon"]) || false;
  TDDP_MouseSystemEx.changeItemIcon =
    String(parameters["Change Items Icon"]) || false;
  TDDP_MouseSystemEx.changeWeaponIcon =
    String(parameters["Change Weapons Icon"]) || false;
  TDDP_MouseSystemEx.changeArmorIcon =
    String(parameters["Change Armors Icon"]) || false;
  TDDP_MouseSystemEx.transferPlayerIcon =
    String(parameters["Transfer Icon"]) || false;
  // Settings
  TDDP_MouseSystemEx.highlightOnHover = Boolean(
    parameters["Highlight On Hover"] === "true" || false
  );
  TDDP_MouseSystemEx.audioCooldownOnHover = Number(
    parameters["Hover SE Cooldown"] || 4
  );
  TDDP_MouseSystemEx.hideCursor = Boolean(
    parameters["Hide Cursor"] === "true" || false
  );
  TDDP_MouseSystemEx.iconOffsetX = Number(parameters["Icon Offset X"]) || 0;
  TDDP_MouseSystemEx.iconOffsetY = Number(parameters["Icon Offset Y"]) || 0;
  TDDP_MouseSystemEx.noAutoCursorNotetag = String(
    parameters["No Auto Cursor Notetag"]
  );
  TDDP_MouseSystemEx.noAutoIconNotetag = String(
    parameters["No Auto Icon Notetag"]
  );
  TDDP_MouseSystemEx.clickToActivateNote = String(parameters["Click Notetag"]);
  TDDP_MouseSystemEx.hoverToActivateNote = String(parameters["Hover Notetag"]);
  TDDP_MouseSystemEx.leaveToActivateNote = String(parameters["Leave Notetag"]);
  TDDP_MouseSystemEx.useCustomCursor = Boolean(
    parameters["Use Custom Cursor?"] === "true" || false
  );
  TDDP_MouseSystemEx.cursorImage = TDDP_MouseSystemEx._ext(
    String(parameters["Custom Cursor Image"])
  );
  TDDP_MouseSystemEx.defaultCursorImage = TDDP_MouseSystemEx.cursorImage;
  TDDP_MouseSystemEx.customCursorPath = String(
    parameters["Custom Cursors Folder"]
  );

  TDDP_MouseSystemEx.mouseIconTags = {};
  TDDP_MouseSystemEx._cursorFilenameInUse = null; // Helper to compare changes
  TDDP_MouseSystemEx._lastUpdateFrame = 0; // Last frame cursor got updated
  TDDP_MouseSystemEx._cssClassPrefix = "TDDP_customCursor_";

  // Add all mouse icon tags
  for (var i = 1; i <= 15; ++i) {
    var tag = parameters["Icon Tag " + i];
    if (!tag) continue;
    tag = tag.split(":");
    var key = tag[0];
    var val = tag[1].replace(" ", "");
    TDDP_MouseSystemEx.mouseIconTags[key] = val;
  }
  /**
   * Pre-cache all custom cursors when in test mode
   */
  // Check if playtest; if so, store file. If not, read stored
  TDDP_MouseSystemEx._indexFilename = "_index.json";
  if (StorageManager.isLocalMode() && Utils.isOptionValid("test")) {
    var fs = require("fs");
    // Find that relative local path, using MV's own methods
    var path = window.location.pathname.replace(
      /\/[^\/]*$/,
      "/" + TDDP_MouseSystemEx.customCursorPath
    );
    if (path.match(/^\/([A-Z]\:)/)) {
      path = path.slice(1);
    }
    path = decodeURIComponent(path);
    // Check if cursors dir exists, make if not
    if (!fs.existsSync(path)) {
      alert(
        'TDDP MouseSystemEx\nThe chosen cursor folder "' +
          TDDP_MouseSystemEx.customCursorPath +
          '" has been created for you. Please put any custom cursor image files in this folder.'
      );
      fs.mkdirSync(path);
    }
    // Read dir
    var files = fs.readdirSync(path).filter(function (v) {
      if (v != TDDP_MouseSystemEx._indexFilename && v[1]) return v;
    });
    // Store in json
    fs.writeFile(
      path + TDDP_MouseSystemEx._indexFilename,
      JSON.stringify(files),
      "utf8",
      _loadAndSetupCustomCursorCSS
    );
  } else {
    // Read stored file
    _loadAndSetupCustomCursorCSS();
  }
  /**
   * Load and setup the custom cursor CSS additions
   */
  function _loadAndSetupCustomCursorCSS() {
    var xhr = new XMLHttpRequest();
    var url =
      TDDP_MouseSystemEx.customCursorPath + TDDP_MouseSystemEx._indexFilename;
    xhr.open("GET", url);
    xhr.overrideMimeType("application/json");
    xhr.onload = function () {
      if (xhr.status < 400) {
        var dummyContainerElement = document.createElement("div");
        dummyContainerElement.id = "TDD_MS_CursorDummies";
        document.body.appendChild(dummyContainerElement);
        // Next we iterate the cached cursor list
        var classPrefix = TDDP_MouseSystemEx._cssClassPrefix;
        var cachedCursors = JSON.parse(xhr.responseText);
        for (var i = 0, max = cachedCursors.length; i < max; i++) {
          var cursor = cachedCursors[i];
          var cursorName = cursor.split(".")[0];
          var cursorPath = TDDP_MouseSystemEx.customCursorPath + cursor;
          var sheet = window.document.styleSheets[0];
          sheet.insertRule(
            "." +
              classPrefix +
              cursorName +
              " { cursor: url(../" +
              cursorPath +
              "), default; }",
            sheet.cssRules.length
          );
          // To ensure all the cursors get prefetched by browsers, we create dummy divs to hold all the styles...
          var dummyLoaderElement = document.createElement("div");
          dummyLoaderElement.id = cursorName + "_dummy";
          dummyContainerElement.appendChild(dummyLoaderElement);
          dummyLoaderElement.className = classPrefix + cursorName;
        }
      }
    };
    xhr.onerror = function () {
      //
    };
    xhr.send();
  }
  //=============================================================================
  // Game_Interpreter - register plugin commands
  //=============================================================================
  /**
   * Alias and extend pluginCommand
   */
  var Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === "SetCustomCursor")
      TDDP_MouseSystemEx._setCustomCursor(args);
    if (command === "ResetCustomCursor")
      TDDP_MouseSystemEx._resetCustomCursor();
  };
  //=============================================================================
  // Helper functions
  //=============================================================================
  /**
   * Show custom cursor
   */
  TDDP_MouseSystemEx._showCustomCursor = function (filename) {
    var filename = filename || this.cursorImage;
    document.body.className = this._cssClassPrefix + filename.split(".")[0];
  };
  /**
   * Set new default custom cursor
   */
  TDDP_MouseSystemEx._setCustomCursor = function (filename) {
    this.cursorImage = filename;
    this._showCustomCursor(TouchInput.cursorImage);
  };
  /**
   * Reset custom cursor to parameter setting defaults
   */
  TDDP_MouseSystemEx._resetCustomCursor = function () {
    this._setCustomCursor(this.defaultCursorImage);
  };
  /**
   * Show the mouse cursor
   */
  TDDP_MouseSystemEx._showMouseCursor = function () {
    if (this.useCustomCursor) {
      this._showCustomCursor();
    } else {
      document.body.style.cursor = "inherit";
    }
  };
  /**
   * Hide the mouse cursor
   */
  TDDP_MouseSystemEx._hideMouseCursor = function () {
    document.body.style.cursor = "none";
  };
  /**
   * Return Comments from event page. Multiline comments require an additional check (408)
   */
  TDDP_MouseSystemEx._filterComments = function (pageListObject) {
    var comments =
      pageListObject.code == 108 || pageListObject.code == 408 ? true : false;
    return comments;
  };
  /**
   * Return Show Text messages from event page
   */
  TDDP_MouseSystemEx._filterMessages = function (pageListObject) {
    return pageListObject.code == 401;
  };
  /**
   * Return Transfer Player events from event page
   */
  TDDP_MouseSystemEx._filterTransferPlayer = function (pageListObject) {
    return pageListObject.code == 201;
  };
  /**
   * Return Change Gold events from event page
   */
  TDDP_MouseSystemEx._filterChangeGold = function (pageListObject) {
    return pageListObject.code == 125;
  };
  /**
   * Return Change Items events from event page
   */
  TDDP_MouseSystemEx._filterChangeItems = function (pageListObject) {
    return pageListObject.code == 126;
  };
  /**
   * Return Change Weapons events from event page
   */
  TDDP_MouseSystemEx._filterChangeWeapons = function (pageListObject) {
    return pageListObject.code == 127;
  };
  /**
   * Return Change Armors events from event page
   */
  TDDP_MouseSystemEx._filterChangeArmors = function (pageListObject) {
    return pageListObject.code == 128;
  };
  /**
   * Check if current scene is of the type Scene_Map
   */
  TDDP_MouseSystemEx._isSceneMap = function () {
    return SceneManager._scene instanceof Scene_Map;
  };
  /**
   * Find a given notetag either in a game_event's Note box or Comment box on current active page
   */
  TDDP_MouseSystemEx._findInEventNotetags = function (
    game_event,
    notetag,
    onMatch
  ) {
    if (!game_event.page()) return false;
    var comments = game_event.page().list.filter(this._filterComments);
    var result = null;
    var foundMatch = false;
    var matchInString = function (string) {
      result = string.match(notetag);
      if (result !== null) {
        foundMatch = true;
      }
    };
    // First see if there's a relevant page comment, has higher priority
    if (comments.length > 0) {
      comments.forEach(function (comment) {
        if (foundMatch) return;
        matchInString(comment.parameters[0]);
      });
    }
    // If nothing found in page comment, check Note box
    if (!foundMatch) {
      if (game_event.event().note) {
        matchInString(game_event.event().note);
      }
    }
    if (foundMatch) {
      onMatch.call(game_event, result);
    }
  };
  /**
   * Arrays of pairs of cursors/icons and filters to run to check if they should be used
   */
  TDDP_MouseSystemEx.autoCursorFilters = [
    // The order is the priority; the first match stops further lookup
    [
      TDDP_MouseSystemEx.transferPlayerCursor,
      TDDP_MouseSystemEx._filterTransferPlayer,
    ],
    [TDDP_MouseSystemEx.changeGoldCursor, TDDP_MouseSystemEx._filterChangeGold],
    [
      TDDP_MouseSystemEx.changeItemCursor,
      TDDP_MouseSystemEx._filterChangeItems,
    ],
    [
      TDDP_MouseSystemEx.changeWeaponCursor,
      TDDP_MouseSystemEx._filterChangeWeapons,
    ],
    [
      TDDP_MouseSystemEx.changeArmorCursor,
      TDDP_MouseSystemEx._filterChangeArmors,
    ],
    [TDDP_MouseSystemEx.showTextCursor, TDDP_MouseSystemEx._filterMessages],
  ];
  TDDP_MouseSystemEx.autoIconFilters = [
    // The order is the priority; the first match stops further lookup
    [
      TDDP_MouseSystemEx.transferPlayerIcon,
      TDDP_MouseSystemEx._filterTransferPlayer,
    ],
    [TDDP_MouseSystemEx.changeGoldIcon, TDDP_MouseSystemEx._filterChangeGold],
    [TDDP_MouseSystemEx.changeItemIcon, TDDP_MouseSystemEx._filterChangeItems],
    [
      TDDP_MouseSystemEx.changeWeaponIcon,
      TDDP_MouseSystemEx._filterChangeWeapons,
    ],
    [
      TDDP_MouseSystemEx.changeArmorIcon,
      TDDP_MouseSystemEx._filterChangeArmors,
    ],
    [TDDP_MouseSystemEx.showTextIcon, TDDP_MouseSystemEx._filterMessages],
  ];
  /**
   * Function to check whether conditions are prime to check for events under the mouse
   */
  TDDP_MouseSystemEx.conditionsValidForMouseHoverCheck = function () {
    return (
      SceneManager.isCurrentSceneStarted() &&
      this._isSceneMap() &&
      $gameMap !== null &&
      $dataMap !== null &&
      !$gameMap._interpreter.isRunning()
    );
  };
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  // START - Highlight On Hover option
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if (TDDP_MouseSystemEx.highlightOnHover) {
    //=========================================================================
    // TouchInput modifications
    //=========================================================================
    /**
     * Removing the check for whether _mousePressed is active to facilitate hover events
     */
    TouchInput._onMouseMove = function (event) {
      var x = Graphics.pageToCanvasX(event.pageX);
      var y = Graphics.pageToCanvasY(event.pageY);
      this._onMove(x, y);
    };
    //=========================================================================
    // Window_Selectable modifications
    //=========================================================================
    /**
     * Aliased update function, adds processMouseMoved() call
     */
    var _Window_Selectable_update = Window_Selectable.prototype.update;
    Window_Selectable.prototype.update = function () {
      this.processMouseMoved();
      _Window_Selectable_update.call(this);
    };
    /**
     * Check if conditions are right for calling onTouch when using mouse movement (for hover activation)
     */
    Window_Selectable.prototype.processMouseMoved = function () {
      if (
        this.isOpenAndActive() &&
        TouchInput.isMoved() &&
        this.cursorIsWithinWindow()
      ) {
        this.onTouch(false);
      }
    };
    /**
     * Check if cursor is within window
     */
    Window_Selectable.prototype.cursorIsWithinWindow = function () {
      var _x = this.canvasToLocalX(TouchInput.x);
      var _y = this.canvasToLocalY(TouchInput.y);
      if (_x > this.padding && _x <= this.width - this.padding) {
        if (_y > this.padding && _y < this.height - this.padding) {
          return true;
        }
      }
      return false;
    };

    //=============================================================================
    // SoundManager modifications
    //=============================================================================
    /*
     * Static var to keep track of last played cursor SE frame
     */
    SoundManager._lastPlayCursorFrame = 0;
    /**
     * Aliased function to add check for whether playCursor should play, based on cooldown setting
     */
    var _SoundManager_playCursor = SoundManager.playCursor;
    SoundManager.playCursor = function () {
      var _canPlay =
        SoundManager._lastPlayCursorFrame > Graphics.frameCount ||
        Graphics.frameCount >
          SoundManager._lastPlayCursorFrame +
            TDDP_MouseSystemEx.audioCooldownOnHover;

      if (_canPlay) {
        _SoundManager_playCursor.call(this);
        SoundManager._lastPlayCursorFrame = Graphics.frameCount;
      }
    };
  }
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  // END - Highlight On Hover option
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //=============================================================================
  // TouchInput modifications
  //=============================================================================
  /**
   * Alias and extend initialize() with _setupCursorIconObject()
   */
  var _TouchInput_initialize = TouchInput.initialize;
  TouchInput.initialize = function () {
    this._setupCursorIconObject();
    _TouchInput_initialize.call(this);
  };
  /**
   * Setup cursorIcon object
   */
  TouchInput._setupCursorIconObject = function () {
    this.cursorIcon = new Sprite();
    this.cursorIcon.drawIcon = Window_Base.prototype.drawIcon;
    this.cursorIcon.bitmap = new Bitmap(
      Window_Base._iconWidth,
      Window_Base._iconHeight
    );
    this.cursorIcon.contents = this.cursorIcon.bitmap;
    this.cursorIcon.iconIndex = null;
  };
  /**
   * Alias and extend _onMouseMove() to use new function _checkCursorStatus()
   */
  var _TouchInput_onMouseMove = TouchInput._onMouseMove;
  TouchInput._onMouseMove = function (event) {
    _TouchInput_onMouseMove.call(this, event);
    this._checkCursorStatus(event.pageX, event.pageY);
  };
  /**
   * Check cursor's status and whether to alter cursor
   */
  TouchInput._checkCursorStatus = function (pageX, pageY) {
    // Check for events under mouse and perform actions, and get event in result
    var overEvent = this._checkForEventUnderMouse(pageX, pageY);

    // Update cursor icon position
    if (this.cursorIcon.iconIndex) {
      this.cursorIcon.x =
        Graphics.pageToCanvasX(pageX) +
        (this.cursorIcon.customOffsetX !== null
          ? this.cursorIcon.customOffsetX
          : TDDP_MouseSystemEx.iconOffsetX);
      this.cursorIcon.y =
        Graphics.pageToCanvasY(pageY) +
        (this.cursorIcon.customOffsetY !== null
          ? this.cursorIcon.customOffsetY
          : TDDP_MouseSystemEx.iconOffsetY);
      this.cursorIcon.visible = true;
    }

    // Check if leave activate is to be triggered for a previous event
    if (
      this._activeEvent &&
      this._activeEvent.TDDP_MS.leaveActivate &&
      (!overEvent || overEvent !== this._activeEvent)
    ) {
      this._activeEvent.start();
      this._activeEvent = false;
    }
    // Set active event
    this._activeEvent = overEvent || this._activeEvent;
  };
  /**
   * Alias and extend update() to store last event coords for checking if cursor has left an event
   */
  var _TouchInput_update = TouchInput.update;
  TouchInput.update = function () {
    _TouchInput_update.call(this);
    if (
      this._lastEventPageX == this._curEventPageX &&
      this._lastEventPageY == this._curEventPageY
    ) {
      this._checkCursorStatus(this._lastEventPageX, this._lastEventPageY);
    }
    this._lastEventPageX = this._curEventPageX;
    this._lastEventPageY = this._curEventPageY;
  };
  /**
   * Perform check for event under mouse and perform functions depending on parsed notetag properties
   */
  TouchInput._checkForEventUnderMouse = function (pageX, pageY) {
    this._curEventPageX = pageX;
    this._curEventPageY = pageY;
    if (TDDP_MouseSystemEx.conditionsValidForMouseHoverCheck()) {
      var x = $gameMap.canvasToMapX(Graphics.pageToCanvasX(pageX));
      var y = $gameMap.canvasToMapY(Graphics.pageToCanvasY(pageY));
      var _events = $gameMap.eventsXy(x, y);
      if (_events.length > 0) {
        var game_event = _events[_events.length - 1]; // Get topmost event
        if (game_event.TDDP_MS.hoverIcon) {
          TouchInput._updateCursorIcon(game_event.TDDP_MS.hoverIcon);
          if (TDDP_MouseSystemEx.hideCursor)
            TDDP_MouseSystemEx._hideMouseCursor();
        } else {
          TouchInput._hideCursorIcon();
        }
        if (game_event.TDDP_MS.hoverActivate && !$gameMessage.isBusy()) {
          game_event.start();
        }
        if (game_event.TDDP_MS.hideCursor) {
          TDDP_MouseSystemEx._hideMouseCursor();
        }
        if (
          game_event.TDDP_MS.customOffsetX &&
          game_event.TDDP_MS.customOffsetY
        ) {
          TouchInput.cursorIcon.customOffsetX =
            game_event.TDDP_MS.customOffsetX;
          TouchInput.cursorIcon.customOffsetY =
            game_event.TDDP_MS.customOffsetY;
        }
        if (TDDP_MouseSystemEx.useCustomCursor) {
          if (game_event.TDDP_MS.customCursor) {
            TDDP_MouseSystemEx._showCustomCursor(
              game_event.TDDP_MS.customCursor
            );
          } else {
            TDDP_MouseSystemEx._showCustomCursor();
          }
        }
        if (game_event.TDDP_MS.hoverSwitch) {
          var key = [
            $gameMap._mapId,
            game_event._eventId,
            game_event.TDDP_MS.hoverSwitch.key,
          ];
          $gameSelfSwitches.setValue(
            key,
            game_event.TDDP_MS.hoverSwitch.val === "true"
          );
        }
        return game_event;
      }
    }
    TouchInput._hideCursorIcon();
    TDDP_MouseSystemEx._showMouseCursor();
    return false;
  };
  /**
   * Update the cursor icon
   */
  TouchInput._updateCursorIcon = function (iconIndex) {
    if (this.cursorIcon.iconIndex != iconIndex) {
      this.cursorIcon.iconIndex = iconIndex;
      this.cursorIcon.contents.clear();
      this.cursorIcon.drawIcon(iconIndex, 0, 0);
      this.cursorIcon.visible = false;
    }
  };
  /**
   * Hide the cursor icon
   */
  TouchInput._hideCursorIcon = function () {
    this.cursorIcon.iconIndex = null;
    this.cursorIcon.visible = false;
    this.cursorIcon.customOffsetX = null;
    this.cursorIcon.customOffsetY = null;
  };
  /**
   * Alias and extend _onTrigger() to only fire if we're not activating on click
   */
  var _TouchInput_onTrigger = TouchInput._onTrigger;
  TouchInput._onTrigger = function (x, y) {
    if (TouchInput._activateClickEvents(x, y)) {
      $gameTemp.clearDestination(); // Invalidate destination
    } else {
      _TouchInput_onTrigger.call(this, x, y);
    }
  };
  /**
   * Activate click events if valid and return true if so
   */
  TouchInput._activateClickEvents = function (x, y) {
    var found_click_event = false;
    if (
      SceneManager.isCurrentSceneStarted() &&
      $gameMap !== null &&
      $dataMap !== null &&
      !$gameMessage.isBusy()
    ) {
      var x = $gameMap.canvasToMapX(x);
      var y = $gameMap.canvasToMapY(y);
      var _events = $gameMap.eventsXy(x, y);
      if (_events.length > 0) {
        var game_event = _events[_events.length - 1];
        if (game_event.TDDP_MS.clickActivate) {
          game_event.start();
          found_click_event = true;
        }
        if (game_event.TDDP_MS.clickSwitch) {
          var key = [
            $gameMap._mapId,
            game_event._eventId,
            game_event.TDDP_MS.clickSwitch.key,
          ];
          $gameSelfSwitches.setValue(
            key,
            game_event.TDDP_MS.clickSwitch.val === "true"
          );
          found_click_event = true;
        }
      }
    }
    return found_click_event;
  };
  //=============================================================================
  // Spriteset_Map modifications
  //=============================================================================
  /**
   * Alias and extend createScreenSprites() to also create cursor icon holder sprite
   */
  var _Spriteset_Map_createScreenSprites =
    Spriteset_Map.prototype.createScreenSprites;
  Spriteset_Map.prototype.createScreenSprites = function () {
    _Spriteset_Map_createScreenSprites.call(this);
    this.createCursorIconSprite();
  };
  /**
   * Create a container sprite for the cursor icon
   */
  Spriteset_Map.prototype.createCursorIconSprite = function () {
    this._cursorIconSprite = new Sprite();
    this._cursorIconSprite.setFrame(0, 0, Graphics.width, Graphics.height);
    this._cursorIconSprite.addChild(TouchInput.cursorIcon);
    this.addChild(this._cursorIconSprite);
  };
  //=============================================================================
  // Game_Event modifications
  //=============================================================================
  /**
   * Alias and extend setupPage() to also setup mouse system properties
   */
  var _Game_Event_setupPage = Game_Event.prototype.setupPage;
  Game_Event.prototype.setupPage = function () {
    _Game_Event_setupPage.call(this);
    this.setupMouseSystemProperties();
  };
  /**
   * Setup mouse system properties on events, for storing notetag parsing on page updates
   */
  Game_Event.prototype.setupMouseSystemProperties = function () {
    this.TDDP_MS = {};
    this.TDDP_MS.hoverIcon = false;
    this.TDDP_MS.allowAutoCursor = true;
    this.TDDP_MS.allowAutoIcon = true;
    this.TDDP_MS.clickActivate = false;
    this.TDDP_MS.hoverActivate = false;
    this.TDDP_MS.leaveActivate = false;
    this.TDDP_MS.hideCursor = false;
    this.TDDP_MS.customOffsetX = false;
    this.TDDP_MS.customOffsetY = false;
    this.TDDP_MS.customCursor = false;
    this.TDDP_MS.clickSwitch = false;
    this.TDDP_MS.hoverSwitch = false;
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      /hover_icon\s(.*?);/i,
      function (result) {
        if (!result) return;
        result = result[result.length - 1];
        if (TDDP_MouseSystemEx.mouseIconTags[result]) {
          result = TDDP_MouseSystemEx.mouseIconTags[result];
        }
        this.TDDP_MS.hoverIcon = Number(result);
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      TDDP_MouseSystemEx.noAutoCursorNotetag,
      function () {
        this.TDDP_MS.allowAutoCursor = false;
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      TDDP_MouseSystemEx.noAutoIconNotetag,
      function () {
        this.TDDP_MS.allowAutoIcon = false;
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      TDDP_MouseSystemEx.clickToActivateNote,
      function () {
        this.TDDP_MS.clickActivate = true;
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      TDDP_MouseSystemEx.hoverToActivateNote,
      function () {
        this.TDDP_MS.hoverActivate = true;
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      TDDP_MouseSystemEx.leaveToActivateNote,
      function () {
        this.TDDP_MS.leaveActivate = true;
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(this, "hide_cursor!", function () {
      this.TDDP_MS.hideCursor = true;
    });
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      /icon_offset\s(.*?)\s(.*?);/i,
      function (result) {
        this.TDDP_MS.customOffsetX = Number(result[1]);
        this.TDDP_MS.customOffsetY = Number(result[2]);
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      /hover_cursor\s(.*?);/i,
      function (result) {
        this.TDDP_MS.customCursor = result[result.length - 1];
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      /click_switch\s(.*?)\s(.*?);/i,
      function (result) {
        this.TDDP_MS.clickSwitch = {};
        this.TDDP_MS.clickSwitch.key = String(result[1]);
        this.TDDP_MS.clickSwitch.val = String(result[2]);
      }
    );
    TDDP_MouseSystemEx._findInEventNotetags(
      this,
      /hover_switch\s(.*?)\s(.*?);/i,
      function (result) {
        this.TDDP_MS.hoverSwitch = {};
        this.TDDP_MS.hoverSwitch.key = String(result[1]);
        this.TDDP_MS.hoverSwitch.val = String(result[2]);
      }
    );
    if (!this.page()) return;
    // Auto cursor checks, only if there's a page and allowed
    if (this.TDDP_MS.allowAutoCursor) {
      for (
        var i = 0, max = TDDP_MouseSystemEx.autoCursorFilters.length;
        i < max;
        i++
      ) {
        if (this.TDDP_MS.customCursor) break;
        var entry = TDDP_MouseSystemEx.autoCursorFilters[i];
        var cursor = entry[0];
        var filter = entry[1];
        if (typeof cursor == "string") {
          var matches = this.page().list.filter(filter);
          if (matches.length > 0) {
            this.TDDP_MS.customCursor = cursor;
          }
        }
      }
    }
    // Auto icon checks
    if (this.TDDP_MS.allowAutoIcon) {
      for (
        var i = 0, max = TDDP_MouseSystemEx.autoIconFilters.length;
        i < max;
        i++
      ) {
        if (this.TDDP_MS.hoverIcon) break;
        var entry = TDDP_MouseSystemEx.autoIconFilters[i];
        var icon = entry[0];
        var filter = entry[1];
        if (typeof icon == "string") {
          var matches = this.page().list.filter(filter);
          if (matches.length > 0) {
            if (isNaN(icon)) {
              // Icon is a string, so let's look in Icon Tags
              icon = TDDP_MouseSystemEx.mouseIconTags[icon];
            }
            this.TDDP_MS.hoverIcon = Number(icon);
          }
        }
      }
    }
  };
})();


code:
//=============================================================================
// TDDP_PreloadManager.js
// Version: 1.0.0
//=============================================================================

var Imported = Imported || {};
Imported.TDDP_PreloadManager = "1.0.0";

var TDDP = TDDP || {};
TDDP.PreloadManager = TDDP.PreloadManager || {};
//=============================================================================
/*:
 * @plugindesc 1.0.0 Preload resources on scene/map load as well as game boot for a smoother gameplay experience.
 *
 * @author Tor Damian Design / Galenmereth
 *
 * @param Preload System SFX
 * @desc If you want to preload all the SFX specified in the Database System tab on boot, set this to true.
 * @default false
 *
 * @param Print Debug to Console
 * @desc If you want to see debug information in the console (F8) set this to true.
 * @default false
 *
 * @help =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * Introduction / Table of contents
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * TDDP PreloadManager lets you preload resources on both boot (before the
 * game title screen displays) and on map load (in between map transfers) to
 * ensure resources such as pictures, music and sound effects are preloaded
 * before called.
 *
 * By default MV will stream the resources as they are required. This plugin
 * serves as an alternative for a smoother gameplay experience at the cost of
 * more bandwidth.
 *
 * This Plugin will load all resources in all event pages on the map,
 * regardless of if they will be triggered by the player at any time or not.
 * Since page conditions cannot be predicted as they are dependent on player
 * interaction, this is a necessity to ensure the right files are ready and
 * preloaded.
 *
 * For updates and easy to use documentation, please go to the plugin's website:
 * http://mvplugins.tordamian.com/?p=29
 *
 * There you can also download a PDF of the documentation for offline use, and
 * having the documentation in one cleanly presented place means you can always
 * be sure it's the most recent available.
 *
 * Table of contents
 * -----------------
 * 1. Installation
 * 2. Advanced Configuration
 * 3. Terms & Conditions
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 1. Installation
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Drag and drop plugin .js file into your project's js/plugins folder, then
 * enable it in the editor interface.
 *
 * Make sure this plugin is placed at the top for maximum compatibility.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 2. Advanced Configuration
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * There is an advanced configuration section if you open the plugin .js file
 * in a text editor. Look for BOOT PRELOAD CONFIG -- ADVANCED USERS. This lets
 * you define resources to preload on boot manually.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 3. Terms & Conditions
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * This plugin is free for both non-commercial and commercial use. Please see
 * http://mvplugins.tordamian.com/terms-of-use for the full terms of use.
 *
 * A big thank you to Degica for making this plugin free for commercial use for
 * everyone!
 */
/*:ja
 * @plugindesc マップ/シーン切り替え時、またブート時に素材の事前ロードを行います。
 *
 * @author Tor Damian Design / Galenmereth
 *
 * @param Preload System SFX
 * @desc ブート時に、データベース上で指定された全てのSFXをプリロードしたい場合は、trueにしてください。
 * @default false
 *
 * @param Print Debug to Console
 * @desc コンソール(F8)でデバッグ情報を見たい場合は、trueにしてください。
 * @default false
 *
 * @help =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * Introduction / Table of contents
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * TDDP PreloadManagerは、画像・音楽・サウンドエフェクトのような素材を、
 * 事前にロードさせることができるプラグインです。
 * タイトル前のゲームブート時や、マップ切り替わりのロード時に、
 * 事前ローディングを可能にします。
 *
 * デフォルト設定時には、素材のストリームは要求後に行われますが、
 * このプラグインを利用することで、高帯域を使用し、
 * スムーズなゲームプレイを提供することが可能になります。
 *
 * このプラグインは、プレイヤーのアクションがトリガーとなるか否かに関わらず、
 * マップ上のすべてのイベントページで、全素材をロードします。
 * ページの条件分岐がプレイヤーのアクションに依存しないため、
 * 必ず正しいファイルがロードされるように注意してください。
 *
 * アップデートと簡易使用方法については、
 * こちらのプラグインのサイトを参照してください。
 * http://mvplugins.tordamian.com/?p=29
 *
 * このサイトでは、オフラインで使用するためのPDFをダウンロードすることができます。
 * またいつでも最新版の確認を行なうことができます。
 *
 *
 *
 * コンテンツ目次
 * -----------------
 * 1. Installation
 * 2. Advanced Configuration
 * 3. Terms & Conditions
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 1. Installation
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * プラグインの「.js」ファイルを、プロジェクト内のプラグインフォルダに
 * ドラッグ&ドロップし、エディター内で有効にしてください。
 *
 * 最大の互換性を得るため、このプラグインはトップに置くようにしてください。
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 2. Advanced Configuration
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * プラグインの「.js」ファイルを開くと、
 * アドバンスドコンフィグレーションを行うことができます。
 * BOOT PRELOAD CONFIG -- ADVANCED USERSを用いて、
 * ブート時にプリロードされる素材を手動で指定することができます。
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 3. Terms & Conditions
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * このプラグインは、商用利用・非商用利用どちらにもフリーで公開されています。
 * 使用方法の全文についてはこちらのサイトを確認してください。
 * http://mvplugins.tordamian.com/terms-of-use
 *
 * 最後に、このプラグインのフリーでの商用利用を実現してくれた
 * Degicaさんに感謝の意を表します。
 */

/*
 * =============================================================================
 * BOOT PRELOAD CONFIG -- ADVANCED USERS
 * =============================================================================
 *
 * Tip: ファイル名は省略することができます。
 * 拡張子はMVの特性に合わせ、「.png」とみなされます。
 *
 * -----------------------------------------------------------------------------
 * Image files to load on boot:
 * -----------------------------------------------------------------------------
 * Keys:
 *   animation
 *   battleback1
 *   battleback2
 *   character
 *   enemy
 *   face
 *   parallax
 *   picture
 *   svActor
 *   svEnemy
 *   system
 *   tileset
 *   title1
 *   title2
 *
 * 上記のフォルダ内に、サブフォルダを作成している場合は、
 * ファイル名にそれを付け足してください。
 * 例えば「arrow」という画像が「cursors」というサブフォルダの中に入っている場合
 * 下記のように指定してください。
 *
 * system: [
 *   "balloon",
 *   "cursors/arrow"
 * ]
 */
TDDP.bootPreloadImages = {
  /* Example
    face: [
        "Actor3"
    ],
    system: [
      "myFile",
      "subfolder/myOtherFile"
    ]
    */
};
/*
 *
 * -----------------------------------------------------------------------------
 * BGM files to load on boot
 * -----------------------------------------------------------------------------
 */
TDDP.bootPreloadBGM = [
  // "Town1"
];
/*
 *
 * -----------------------------------------------------------------------------
 * BGS files to load on boot
 * -----------------------------------------------------------------------------
 */
TDDP.bootPreloadBGS = [
  // "Quake"
];
/*
 *
 * -----------------------------------------------------------------------------
 * SFX files to load on boot.
 * -----------------------------------------------------------------------------
 */
TDDP.bootPreloadSE = [
  // "Open2"
];
/*
 *
 * -----------------------------------------------------------------------------
 * ME files to load on boot.
 * -----------------------------------------------------------------------------
 */
TDDP.bootPreloadME = [
  // "Shock1"
];
//=============================================================================
// END OF BOOT PRELOAD CONFIG
//=============================================================================
var PreloadManager;
(function () {
  //=============================================================================
  // Setting up parameters
  //=============================================================================
  var parameters = PluginManager.parameters("TDDP_PreloadManager");
  var preloadSystemSFX = Boolean(
    parameters["Preload System SFX"] === "true" || false
  );
  var debug = Boolean(parameters["Print Debug to Console"] === "true" || false);
  if (debug)
    console.log("========= TDDP PreloadManager: Debug mode on =========");

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

  PreloadManager._callOnComplete = false;
  PreloadManager._filesLoaded = 0;
  PreloadManager._filesTotal = 0;
  PreloadManager._ready = false;
  PreloadManager._preloadedMaps = [];
  PreloadManager._preloadedAudio = [];

  PreloadManager.callOnComplete = function (func) {
    this._callOnComplete = func;
  };

  PreloadManager.start = function () {
    this._ready = true;
    this.controlIfReady(true);
  };

  PreloadManager.preloadImages = function (type, filename, hue) {
    if (filename.constructor === Array) {
      for (var i = 0; i < filename.length; i++) {
        this.preloadImages(type, filename[i], hue);
      }
    } else {
      if (filename.length > 0) {
        if (debug) console.log("Preloading image (" + type + "): ", filename);
        var func =
          "load" + type.charAt(0).toUpperCase() + type.substr(1).toLowerCase();
        if (typeof ImageManager[func] === "undefined") {
          e =
            "PreloadManager: " +
            type +
            " is not a valid image load key. Check your configuration.";
          Graphics.printError(e);
          throw new Error(e);
        }
        this._increaseFileNums();
        ImageManager[func](filename, hue).addLoadListener(
          this.onFileLoaded.bind(this, filename)
        );
      }
    }
  };

  PreloadManager.preloadBGM = function (audioObject) {
    this.preloadAudio("bgm", audioObject);
  };

  PreloadManager.preloadBGS = function (audioObject) {
    this.preloadAudio("bgs", audioObject);
  };

  PreloadManager.preloadSE = function (audioObject) {
    this.preloadAudio("se", audioObject);
  };

  PreloadManager.preloadME = function (audioObject) {
    this.preloadAudio("me", audioObject);
  };

  PreloadManager.preloadAudio = function (type, audioObject) {
    if (!audioObject) return;
    if (audioObject.constructor === Array) {
      for (var i = 0, max = audioObject.length; i < max; i++) {
        this.preloadAudio(type, audioObject[i]);
      }
    } else {
      if (audioObject.name.length <= 0) return;
      if (this.isAudioCached(type, audioObject.name)) {
        if (debug)
          console.log(
            type + "/" + audioObject.name + " already preloaded; skipping."
          );
        return;
      }
      this._increaseFileNums();
      var bufferObject = AudioManager.createBuffer(type, audioObject.name);
      bufferObject.addLoadListener(
        this.onFileLoaded.bind(this, bufferObject.name)
      );
      bufferObject.addErrorListener(
        this.onAudioFileError.bind(this, bufferObject)
      );
      this._cacheAudio(type, audioObject.name);
    }
  };

  PreloadManager.preloadAnimation = function (animationId) {
    var animation = $dataAnimations[animationId];
    this.preloadImages("animation", [
      animation.animation1Name,
      animation.animation2Name,
    ]);
    for (var i = 0, max = animation.timings.length; i < max; i++) {
      var se = animation.timings[i].se;
      this.preloadSE(se);
    }
  };

  PreloadManager.preloadMapResources = function (mapId) {
    this._ready = false;
    // Wait and ensure map is loaded
    if (!DataManager.isMapDataLoaded())
      return setTimeout(this.preloadMapResources.bind(this, mapId), 250);
    if (this._preloadedMaps.indexOf(mapId) > -1) {
      if (debug) console.log("Map " + mapId + " already preloaded, skipping.");
    } else {
      if (debug) console.log("Map " + mapId + " preload starting.");
      // Map is loaded, preload resources now
      this.preloadBGM($dataMap.bgm);
      this.preloadBGS($dataMap.bgs);
      this.preloadImages("battleback1", $dataMap.battleback1Name);
      this.preloadImages("battleback2", $dataMap.battleback2Name);
      this.preloadImages("parallax", $dataMap.parallaxName);
      // Cycle events and load appropriate resources
      for (var i = 0, max = $dataMap.events.length; i < max; i++) {
        var event = $dataMap.events[i];
        if (!event) continue;
        for (var p = 0, pMax = event.pages.length; p < pMax; p++) {
          var page = event.pages[p];
          // Preload character graphic for page
          this.preloadImages("character", page.image.characterName);
          for (var l = 0, lMax = page.list.length; l < lMax; l++) {
            var listEntry = page.list[l];
            this.preloadEventListEntry(listEntry);
          }
        }
      }
      this._preloadedMaps.push(mapId);
    }
    this.start(true);
  };

  PreloadManager.preloadEventListEntry = function (listEntry) {
    var code = listEntry.code;
    var parameters = listEntry.parameters;
    switch (code) {
      // Show Picture
      case 231:
        this.preloadImages("picture", parameters[1]);
        break;
      // Play BGM
      case 241:
        this.preloadBGM(parameters[0]);
        break;
      // Play BGS
      case 245:
        this.preloadBGS(parameters[0]);
        break;
      case 249:
        this.preloadME(parameters[0]);
        break;
      // Play SE
      case 250:
        this.preloadSE(parameters[0]);
        break;
      // Change Parallax
      case 284:
        this.preloadImages("parallax", parameters[0]);
        break;
      // Show Text
      case 101:
        this.preloadImages("face", parameters[0]);
        break;
      // Show Animation
      case 212:
        this.preloadAnimation(parameters[1]);
        break;
    }
  };

  PreloadManager.onFileLoaded = function (filename) {
    this._filesLoaded += 1;
    if (debug)
      console.log(
        "Loaded file: " +
          filename +
          "(" +
          this._filesLoaded +
          "/" +
          this._filesTotal +
          ")"
      );
    this.controlIfReady();
  };

  PreloadManager.onAudioFileError = function (bufferObject) {
    throw new Error("Could not load file " + bufferObject._url);
  };

  PreloadManager.controlIfReady = function (manual) {
    if (this.isReady()) {
      if (debug && !manual)
        console.log(
          "All files loaded (" +
            this._filesLoaded +
            "/" +
            this._filesTotal +
            ")"
        );
      this._filesTotal = this._filesLoaded = 0;
      if (this._callOnComplete) {
        this._callOnComplete.call();
      }
    }
  };

  PreloadManager._cacheAudio = function (path, filename) {
    this._preloadedAudio.push(path + filename);
  };

  PreloadManager.isAudioCached = function (path, filename) {
    return this._preloadedAudio.indexOf(path + filename) > -1;
  };

  PreloadManager._increaseFileNums = function () {
    this._ready = false;
    this._filesTotal += 1;
  };

  PreloadManager.isReady = function () {
    if (this._filesLoaded >= this._filesTotal) {
      if (this._ready || this._filesTotal == 0) {
        return true;
      }
    }
    return false;
  };

  //=============================================================================
  // Scene_Boot extensions
  //=============================================================================
  var Scene_Boot_prototype_create = Scene_Boot.prototype.create;
  Scene_Boot.prototype.create = function () {
    Scene_Boot_prototype_create.call(this);
    this._performPreload();
  };

  Scene_Boot.prototype._performPreload = function () {
    if (!DataManager.isDatabaseLoaded())
      return setTimeout(this._performPreload.bind(this), 5);
    if (debug)
      console.log("========= TDDP PreloadManager: Boot Preload =========");
    // Preload bootPreloadImages resources
    if (TDDP.bootPreloadImages) {
      for (var key in TDDP.bootPreloadImages) {
        if (TDDP.bootPreloadImages.hasOwnProperty(key)) {
          PreloadManager.preloadImages(key, TDDP.bootPreloadImages[key]);
        }
      }
    }
    // Preload bootPreloadBGM resources
    if (TDDP.bootPreloadBGM && TDDP.bootPreloadBGM.length > 0) {
      for (var i = 0, max = TDDP.bootPreloadBGM.length; i < max; i++) {
        PreloadManager.preloadBGM({
          name: TDDP.bootPreloadBGM[i],
          volume: 90,
          pitch: 100,
        });
      }
    }
    // Preload bootPreloadBGS resources
    if (TDDP.bootPreloadBGS && TDDP.bootPreloadBGS.length > 0) {
      for (var i = 0, max = TDDP.bootPreloadBGS.length; i < max; i++) {
        PreloadManager.preloadBGS({
          name: TDDP.bootPreloadBGS[i],
          volume: 90,
          pitch: 100,
        });
      }
    }
    // Preload bootPreloadSE resources
    if (TDDP.bootPreloadSE && TDDP.bootPreloadSE.length > 0) {
      for (var i = 0, max = TDDP.bootPreloadSE.length; i < max; i++) {
        PreloadManager.preloadSE({
          name: TDDP.bootPreloadSE[i],
          volume: 90,
          pitch: 100,
        });
      }
    }
    // Preload bootPreloadME resources
    if (TDDP.bootPreloadME && TDDP.bootPreloadME.length > 0) {
      for (var i = 0, max = TDDP.bootPreloadME.length; i < max; i++) {
        PreloadManager.preloadME({
          name: TDDP.bootPreloadME[i],
          volume: 90,
          pitch: 100,
        });
      }
    }
    // Preload system SFX if set
    if (preloadSystemSFX) {
      ("========= TDDP PreloadManager: Boot Preloading System SFX =========");
      for (var i = 0, max = $dataSystem.sounds.length; i < max; i++) {
        PreloadManager.preloadSE($dataSystem.sounds[i]);
      }
    }
    PreloadManager.start();
  };

  //=============================================================================
  // DataManager extensions
  //=============================================================================
  var DataManager_loadMapData = DataManager.loadMapData;
  DataManager.loadMapData = function (mapId) {
    if (debug)
      console.log("========= TDDP PreloadManager: Map Preload =========");
    this._preloaded = false;
    DataManager_loadMapData.call(this, mapId);
    PreloadManager.preloadMapResources(mapId);
    PreloadManager.callOnComplete(this._onPreloadDone.bind(this));
  };

  DataManager._onPreloadDone = function () {
    this._preloaded = true;
  };

  var DataManager_isMapLoaded = DataManager.isMapLoaded;
  DataManager.isMapLoaded = function () {
    return this.isMapDataLoaded() && this._preloaded;
  };

  DataManager.isMapDataLoaded = function () {
    return DataManager_isMapLoaded.call(this);
  };

  //=============================================================================
  // Scene_Base extensions
  //=============================================================================
  var Scene_Base_prototype_isReady = Scene_Base.prototype.isReady;
  Scene_Base.prototype.isReady = function () {
    if (!PreloadManager.isReady()) return false;
    return Scene_Base_prototype_isReady.call(this);
  };

  //=============================================================================
  // WebAudio extensions
  //=============================================================================
  /**
   * NEW function for adding error listener
   *
   * @method addErrorListener
   * @param {Function} listener The callback function
   */
  WebAudio.prototype.addErrorListener = function (listener) {
    this._errorListeners.push(listener);
  };
  /**
   * NEW function for calling on error listeners
   *
   * @method onError
   */
  WebAudio.prototype.onError = function () {
    while (this._errorListeners.length > 0) {
      var listener = this._errorListeners.shift();
      listener();
    }
  };
  /**
   * Clears the audio data.
   *
   * @method clear
   */
  TDDP.PreloadManager.WebAudio_clear = WebAudio.prototype.clear;
  WebAudio.prototype.clear = function () {
    TDDP.PreloadManager.WebAudio_clear.call(this);
    this._errorListeners = [];
  };
  /**
   * EXTENDED to call onError
   * @method _load
   * @param {String} url
   * @private
   */
  WebAudio.prototype._load = function (url) {
    if (WebAudio._context) {
      var xhr = new XMLHttpRequest();
      xhr.open("GET", url);
      xhr.responseType = "arraybuffer";
      xhr.onload = function () {
        if (xhr.status < 400) {
          this._onXhrLoad(xhr);
        }
      }.bind(this);
      xhr.onerror = function () {
        this._hasError = true;
        this.onError(); // NEW call
      }.bind(this);
      xhr.send();
    }
  };
  //=============================================================================
  // HTML5Audio extensions
  //=============================================================================
  /**
   * EXTENDED Clears the audio data.
   *
   * @static
   * @method clear
   */
  TDDP.PreloadManager.Html5Audio_clear = Html5Audio.clear;
  Html5Audio.clear = function () {
    TDDP.PreloadManager.Html5Audio_clear.call(this);
    this._errorListeners = [];
  };
  /**
   * EXTENDED Calls error listeners
   * @static
   * @method _onError
   * @private
   */
  TDDP.PreloadManager.Html5Audio__onError = Html5Audio._onError;
  Html5Audio._onError = function () {
    TDDP.PreloadManager.Html5Audio__onError.call(this);
    while (this._errorListeners.length > 0) {
      var listener = this._errorListeners.shift();
      listener();
    }
  };
})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// TMVplugin - 自律移動拡張
// 作者: tomoaky (http://hikimoki.sakura.ne.jp/)
// Version: 1.1
// 最終更新日: 2016/04/12
//=============================================================================

/*:
 * @plugindesc イベントに新しい自律移動パターンを追加します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @help
 * 使い方:
 *   イベントの自律移動タイプをカスタムに設定し、移動ルートで
 *   以下のスクリプトを実行してください。『動作を繰り返す』に
 *   チェックをいれれば設定は完了です。
 *   イベントコマンド『移動ルートの設定』でも同様に使用できます。
 *
 *   this.moveTowardEvent(10);
 *   イベント１０番に近づく
 *
 *   this.moveAwayFromEvent(5);
 *   イベント５番から遠ざかる
 *
 *   this.moveLeft45();
 *   今向いている方向から左斜め前へ移動する
 *
 *   this.moveRight45();
 *   今向いている方向から右斜め前へ移動する
 *
 *   this.moveLeft135();
 *   今向いている方向から左斜め後ろへ移動する
 *
 *   this.moveRight135();
 *   今向いている方向から右斜め後ろへ移動する
 *
 *   this.moveRouteEx1();
 *   壁に右手を付いて移動し続けます。this.moveRouteEx1(true); にすると
 *   移動可能範囲が同じリージョン内に限定されます。
 *
 *   this.moveRouteEx2();
 *   壁に左手を付いて移動し続けます。this.moveRouteEx2(true); にすると
 *   移動可能範囲が同じリージョン内に限定されます。
 *
 * プラグインコマンドはありません。
 *
 */

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

(function () {
  //-----------------------------------------------------------------------------
  // Game_Character
  //

  Game_Character.prototype.moveTowardEvent = function (eventId) {
    var event = $gameMap.event(eventId);
    if (event) this.moveTowardCharacter(event);
  };

  Game_Character.prototype.moveAwayFromEvent = function (eventId) {
    var event = $gameMap.event(eventId);
    if (event) this.moveAwayFromCharacter(event);
  };

  Game_Character.prototype.moveLeft45 = function () {
    var d = this.direction();
    var horz = (d / 2) % 2 === 1 ? 6 : 4;
    var vert = d <= 4 ? 2 : 8;
    this.moveDiagonally(horz, vert);
  };

  Game_Character.prototype.moveRight45 = function () {
    var d = this.direction();
    var horz = d <= 4 ? 4 : 6;
    var vert = (d / 2) % 2 === 1 ? 2 : 8;
    this.moveDiagonally(horz, vert);
  };

  Game_Character.prototype.moveLeft135 = function () {
    var d = this.direction();
    var horz = d <= 4 ? 6 : 4;
    var vert = (d / 2) % 2 === 1 ? 8 : 2;
    this.moveDiagonally(horz, vert);
  };

  Game_Character.prototype.moveRight135 = function () {
    var d = this.direction();
    var horz = (d / 2) % 2 === 1 ? 4 : 6;
    var vert = d <= 4 ? 8 : 2;
    this.moveDiagonally(horz, vert);
  };

  Game_Character.prototype.moveRouteEx1 = function (sameRegion) {
    this.turnRight90();
    if (this.canPassSameRegion(this.x, this.y, this.direction(), sameRegion)) {
      var x = $gameMap.roundXWithDirection(this.x, this.direction());
      var y = $gameMap.roundYWithDirection(this.y, this.direction());
      var d = this.directionTurnRight90();
      if (!this.canPassSameRegion(x, y, d, sameRegion)) {
        this.moveStraight(this.direction());
        return;
      }
    }
    for (var i = 0; i < 3; i++) {
      this.turnLeft90();
      if (this.moveStraightSameRegion(this.direction(), sameRegion)) return;
    }
  };

  Game_Character.prototype.moveRouteEx2 = function (sameRegion) {
    this.turnLeft90();
    if (this.canPassSameRegion(this.x, this.y, this.direction(), sameRegion)) {
      var x = $gameMap.roundXWithDirection(this.x, this.direction());
      var y = $gameMap.roundYWithDirection(this.y, this.direction());
      var d = this.directionTurnLeft90();
      if (!this.canPassSameRegion(x, y, d, sameRegion)) {
        this.moveStraight(this.direction());
        return;
      }
    }
    for (var i = 0; i < 3; i++) {
      this.turnRight90();
      if (this.moveStraightSameRegion(this.direction(), sameRegion)) return;
    }
  };

  Game_Character.prototype.moveStraightSameRegion = function (d, sameRegion) {
    if (!this.canPassSameRegion(this.x, this.y, d, sameRegion)) return false;
    this.moveStraight(d);
    return true;
  };

  Game_Character.prototype.canPassSameRegion = function (x, y, d, sameRegion) {
    var x2 = $gameMap.roundXWithDirection(x, d);
    var y2 = $gameMap.roundYWithDirection(y, d);
    if (sameRegion && $gameMap.regionId(x, y) !== $gameMap.regionId(x2, y2)) {
      return false;
    }
    return this.canPass(x, y, d);
  };

  Game_Character.prototype.directionTurnRight90 = function () {
    var d = this.direction();
    return d === 2 ? 4 : d === 4 ? 8 : d === 6 ? 2 : 6;
  };

  Game_Character.prototype.directionTurnLeft90 = function () {
    var d = this.direction();
    return d === 2 ? 6 : d === 4 ? 2 : d === 6 ? 8 : 4;
  };
})();


code:
//=============================================================================
// TMPlugin - セーブデータラベル
// バージョン: 2.0.0
// 最終更新日: 2016/08/12
// 配布元    : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc セーブファイルウィンドウに変数の値を表示します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param labelAName
 * @desc ラベルＡの名前
 * 初期値: ラベルＡ
 * @default ラベルＡ
 *
 * @param labelAId
 * @desc ラベルＡのゲーム変数番号
 * 初期値: 10（ 0 で非表示 / 1 以上で表示）
 * @default 10
 *
 * @param labelAMax
 * @desc ラベルＡの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelAFooter
 * @desc ラベルＡのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelBName
 * @desc ラベルＢの名前
 * 初期値: ラベルＢ
 * @default ラベルＢ
 *
 * @param labelBId
 * @desc ラベルＢのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelBMax
 * @desc ラベルＢの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelBFooter
 * @desc ラベルＢのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelNameWidth
 * @desc ラベル名の表示幅
 * 初期値: 160
 * @default 160
 *
 * @param labelValueWidth
 * @desc ラベル値の表示幅
 * 初期値: 96
 * @default 96
 *
 * @param labelNameColorId
 * @desc ラベル名の文字色番号
 * 初期値: 16
 * @default 16
 *
 * @param labelValueColorId
 * @desc ラベル値の文字色番号
 * 初期値: 0
 * @default 0
 *
 * @param labelMaxColorId
 * @desc ラベル値が最大のときの文字色番号
 * 初期値: 2
 * @default 2
 *
 * @param labelFooterColorId
 * @desc フッターの文字色番号
 * 初期値: 0
 * @default 0
 *
 * @help
 * 使い方:
 *
 *   このプラグインを導入するとセーブファイルウィンドウの右上にゲーム変数の
 *   値（以下ラベル）を最大で２つまで表示することができるようになります。
 *
 *   プラグイン導入前に作成されたセーブデータは、再度セーブが実行されるまで
 *   ラベルは表示されません。
 *
 *   プラグインコマンドはありません。
 *
 *   このプラグインは RPGツクールMV Version 1.3.0 で動作確認をしています。
 *
 *
 * プラグインパラメータ補足:
 *
 *   labelAFooter / labelBFooter
 *     ラベル値の後ろに表示する文字列を設定します。
 *     『1234 点』、『12 日目』のような表示にするための機能です、値との間の
 *     スペースは半角スペースなどで調整してください。
 *
 *   labelAMax / labelBMax
 *     ゲーム変数の値がこれらの値以上だった場合、ラベルに表示される値の
 *     文字色番号が labelValueColorId から labelMaxColorId に変化します。
 *     また、ゲーム変数の値が最大値よりも大きい場合は、最大値を表示します。
 *     0 を設定すると上記機能が無効になります。
 *
 *   labelNameColorId
 *   labelValueColorId
 *   labelMaxColorId
 *   labelFooterColorId
 *     ラベルの各部分ごとの文字色番号を設定します。
 *     番号はイベントコマンド『文章の表示』などで使う制御文字 \C[n] の
 *     n の部分と同じものになります。
 */

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

var TMPlugin = TMPlugin || {};
TMPlugin.SaveDataLabel = {};
TMPlugin.SaveDataLabel.Parameters = PluginManager.parameters("TMSaveDataLabel");
TMPlugin.SaveDataLabel.LabelAName =
  TMPlugin.SaveDataLabel.Parameters["labelAName"];
TMPlugin.SaveDataLabel.LabelAId = +(
  TMPlugin.SaveDataLabel.Parameters["labelAId"] || 10
);
TMPlugin.SaveDataLabel.LabelAMax = +(
  TMPlugin.SaveDataLabel.Parameters["labelAMax"] || 9999
);
TMPlugin.SaveDataLabel.LabelAFooter =
  TMPlugin.SaveDataLabel.Parameters["labelAFooter"];
TMPlugin.SaveDataLabel.LabelBName =
  TMPlugin.SaveDataLabel.Parameters["labelBName"];
TMPlugin.SaveDataLabel.LabelBId = +(
  TMPlugin.SaveDataLabel.Parameters["labelBId"] || 0
);
TMPlugin.SaveDataLabel.LabelBMax = +(
  TMPlugin.SaveDataLabel.Parameters["labelBMax"] || 9999
);
TMPlugin.SaveDataLabel.LabelBFooter =
  TMPlugin.SaveDataLabel.Parameters["labelBFooter"];
TMPlugin.SaveDataLabel.NameWidth = +(
  TMPlugin.SaveDataLabel.Parameters["labelNameWidth"] || 160
);
TMPlugin.SaveDataLabel.ValueWidth = +(
  TMPlugin.SaveDataLabel.Parameters["labelValueWidth"] || 96
);
TMPlugin.SaveDataLabel.NameColorId = +(
  TMPlugin.SaveDataLabel.Parameters["labelNameColorId"] || 16
);
TMPlugin.SaveDataLabel.ValueColorId = +(
  TMPlugin.SaveDataLabel.Parameters["labelValueColorId"] || 0
);
TMPlugin.SaveDataLabel.MaxColorId = +(
  TMPlugin.SaveDataLabel.Parameters["labelMaxColorId"] || 2
);
TMPlugin.SaveDataLabel.FooterColorId = +(
  TMPlugin.SaveDataLabel.Parameters["labelFooterColorId"] || 0
);

(function () {
  //-----------------------------------------------------------------------------
  // DataManager
  //

  var _DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
  DataManager.makeSavefileInfo = function () {
    var info = _DataManager_makeSavefileInfo.call(this);
    info.labelA = TMPlugin.SaveDataLabel.LabelAId
      ? $gameVariables.value(TMPlugin.SaveDataLabel.LabelAId)
      : 0;
    info.labelB = TMPlugin.SaveDataLabel.LabelBId
      ? $gameVariables.value(TMPlugin.SaveDataLabel.LabelBId)
      : 0;
    return info;
  };

  //-----------------------------------------------------------------------------
  // Window_SavefileList
  //

  var _Window_SavefileList_drawItem = Window_SavefileList.prototype.drawItem;
  Window_SavefileList.prototype.drawItem = function (index) {
    _Window_SavefileList_drawItem.call(this, index);
    var id = index + 1;
    var valid = DataManager.isThisGameFile(id);
    var info = DataManager.loadSavefileInfo(id);
    if (info && valid) {
      var rect = this.itemRectForText(index);
      var x = rect.width + this.textPadding();
      if (TMPlugin.SaveDataLabel.LabelAId && info.labelA != null) {
        var label = {
          name: TMPlugin.SaveDataLabel.LabelAName,
          value: info.labelA,
          max: TMPlugin.SaveDataLabel.LabelAMax,
          footer: TMPlugin.SaveDataLabel.LabelAFooter,
        };
        this.drawSaveDataLabel(x, rect.y, label);
      }
      if (TMPlugin.SaveDataLabel.LabelBId && info.labelB != null) {
        var label = {
          name: TMPlugin.SaveDataLabel.LabelBName,
          value: info.labelB,
          max: TMPlugin.SaveDataLabel.LabelBMax,
          footer: TMPlugin.SaveDataLabel.LabelBFooter,
        };
        this.drawSaveDataLabel(x, rect.y + this.lineHeight(), label);
      }
    }
  };

  Window_SavefileList.prototype.drawSaveDataLabel = function (x, y, label) {
    if (label.footer) {
      var footerWidth = this.textWidth(label.footer);
      x -= footerWidth;
      this.changeTextColor(
        this.textColor(TMPlugin.SaveDataLabel.FooterColorId)
      );
      this.drawText(label.footer, x, y, footerWidth);
    }
    x -= TMPlugin.SaveDataLabel.ValueWidth;
    this.changeTextColor(this.textColor(TMPlugin.SaveDataLabel.ValueColorId));
    if (label.max && label.value >= label.max) {
      label.value = label.max;
      this.changeTextColor(this.textColor(TMPlugin.SaveDataLabel.MaxColorId));
    }
    this.drawText(
      label.value,
      x,
      y,
      TMPlugin.SaveDataLabel.ValueWidth,
      "right"
    );
    if (label.name) {
      x -= TMPlugin.SaveDataLabel.NameWidth;
      this.changeTextColor(this.textColor(TMPlugin.SaveDataLabel.NameColorId));
      this.drawText(label.name, x, y, TMPlugin.SaveDataLabel.NameWidth);
    }
  };
})();


code:
//=============================================================================
// TMVplugin - ステータス表示拡張
// 作者: tomoaky (http://hikimoki.sakura.ne.jp/)
// Version: 1.0
// 最終更新日: 2016/02/26
//=============================================================================

/*:
 * @plugindesc ステータスシーンに表示するパラメータを追加します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param descriptionKeyCode
 * @desc 表示切替ボタンとして使うキー
 * 初期値: 65（ 65 = A, 66 = B, 67 = C, ... ）
 * @default 65
 *
 * @param useOkKey
 * @desc 表示切替ボタンとして決定キー（Enter, Z など）を使う
 * 初期値: 1（ 0 で使わない）
 * @default 1
 *
 * @param horzLineHeight
 * @desc 横線の余白も含めた高さ
 * 初期値: 28
 * @default 28
 *
 * @param xparamText
 * @desc 追加能力値の項目名（カンマ区切りで１０項目）
 * 初期値: 命中,回避,会心,会心回避,魔法回避,魔法反射,反撃,…
 * @default 命中,回避,会心,会心回避,魔法回避,魔法反射,反撃,ＨＰ再生,ＭＰ再生,ＴＰ再生
 *
 * @param sparamText
 * @desc 特殊能力値の項目名（カンマ区切りで１０項目）
 * 初期値: 狙われ率,防御効果,回復効果,薬の知識,ＭＰ消費,…
 * @default 狙われ率,防御効果,回復効果,薬の知識,ＭＰ消費,ＴＰチャージ,,,床ダメージ,経験値獲得
 *
 * @param paramNameX
 * @desc 通常能力値名の表示Ｘ座標
 * 初期値: 6
 * @default 6
 *
 * @param paramNameWidth
 * @desc 通常能力値名の表示幅
 * 初期値: 96
 * @default 96
 *
 * @param paramX
 * @desc 通常能力値の表示Ｘ座標
 * 初期値: 112
 * @default 112
 *
 * @param paramWidth
 * @desc 通常能力値の表示幅
 * 初期値: 60
 * @default 60
 *
 * @param xparamNameX
 * @desc 追加能力値名の表示Ｘ座標
 * 初期値: 204
 * @default 204
 *
 * @param xparamNameWidth
 * @desc 追加能力値名の表示幅
 * 初期値: 120
 * @default 120
 *
 * @param xparamX
 * @desc 追加能力値の表示Ｘ座標
 * 初期値: 330
 * @default 330
 *
 * @param xparamWidth
 * @desc 追加能力値の表示幅
 * 初期値: 60
 * @default 60
 *
 * @param xparamFixed
 * @desc 追加能力値の小数点以下桁数
 * 初期値: 0
 * @default 0
 *
 * @param sparamNameX
 * @desc 特殊能力値名の表示Ｘ座標
 * 初期値: 432
 * @default 432
 *
 * @param sparamNameWidth
 * @desc 特殊能力値名の表示幅
 * 初期値: 172
 * @default 172
 *
 * @param sparamX
 * @desc 特殊能力値の表示Ｘ座標
 * 初期値: 610
 * @default 610
 *
 * @param sparamWidth
 * @desc 特殊能力値の表示幅
 * 初期値: 80
 * @default 80
 *
 * @param sparamFixed
 * @desc 特殊能力値の小数点以下桁数
 * 初期値: 0
 * @default 0
 *
 * @param elementResistX
 * @desc 属性有効度の表示Ｘ座標
 * 初期値: 6
 * @default 6
 *
 * @param elementResistWidth
 * @desc 属性有効度の表示幅
 * 初期値: 160
 * @default 160
 *
 * @param elementResistIds
 * @desc 表示する属性有効度
 * 初期値: 2,3,4,5,6,7,8,9
 * @default 2,3,4,5,6,7,8,9
 *
 * @param elementResistIconIds
 * @desc 表示する属性有効度のアイコン番号
 * 初期値: 64,65,66,67,68,69,70,71
 * @default 64,65,66,67,68,69,70,71
 *
 * @param pdrIconId
 * @desc 物理ダメージ率のアイコン番号（ 0 で非表示）
 * 初期値: 77
 * @default 77
 *
 * @param mdrIconId
 * @desc 魔法ダメージ率のアイコン番号（ 0 で非表示）
 * 初期値: 79
 * @default 79
 *
 * @param stateResistX
 * @desc ステート有効度の表示Ｘ座標
 * 初期値: 204
 * @default 204
 *
 * @param stateResistWidth
 * @desc ステート有効度の表示幅
 * 初期値: 160
 * @default 160
 *
 * @param stateResistIds
 * @desc 表示するステート有効度
 * 初期値: 4,5,6,7,8,9,10
 * @default 4,5,6,7,8,9,10
 *
 * @param resistFixed
 * @desc 有効度の小数点以下桁数
 * 初期値: 1
 * @default 1
 *
 * @param paramBackGround
 * @desc パラメータの背景を暗くするかどうか
 * 初期値: 1 ( 0 で無効)
 * @default 1
 *
 * @param paramBackGroundOpacity
 * @desc パラメータの背景の暗さ（ 1 ～ 255 ）
 * 初期値: 160
 * @default 160
 *
 * @param useNicknameEx
 * @desc 二つ名と職業をまとめて表示する
 * 初期値: 0（ 1 で有効）
 * @default 0
 *
 * @param useMaxLevel
 * @desc 最大レベルを表示するかどうか
 * 初期値: 1（ 0 で無効）
 * @default 1
 *
 * @param maxLevelColor
 * @desc レベルが最大の場合の文字色番号
 * 初期値: 5
 * @default 5
 *
 * @help
 * 使い方:
 *   ステータスシーンでＡキーを押す、あるいは左クリック（シングルタップ）で
 *   表示するパラメータを切り替えることができます。
 *
 *   useNicknameEx を 1 に設定することで二つ名と職業をセットで表示できます。
 *   二つ名を '髪殺しの' とか '邪竜屠りの' とかにすることで、同じ職業でも
 *   キャラごとの違いを際立たせることができるかもしれません。
 *
 * プラグインコマンドはありません。
 *
 */

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

(function () {
  var parameters = PluginManager.parameters("TMStatusMenuEx");
  Input.keyMapper[+parameters["descriptionKeyCode"]] = "description";
  var useOkButton = parameters["useOkButton"] === "1" ? true : false;
  var horzLineHeight = +parameters["horzLineHeight"];
  var xparamText = parameters["xparamText"].split(",");
  var sparamText = parameters["sparamText"].split(",");
  var paramNameX = +parameters["paramNameX"];
  var paramNameWidth = +parameters["paramNameWidth"];
  var paramX = +parameters["paramX"];
  var paramWidth = +parameters["paramWidth"];
  var xparamNameX = +parameters["xparamNameX"];
  var xparamNameWidth = +parameters["xparamNameWidth"];
  var xparamX = +parameters["xparamX"];
  var xparamWidth = +parameters["xparamWidth"];
  var xparamFixed = +parameters["xparamFixed"];
  var sparamNameX = +parameters["sparamNameX"];
  var sparamNameWidth = +parameters["sparamNameWidth"];
  var sparamX = +parameters["sparamX"];
  var sparamWidth = +parameters["sparamWidth"];
  var sparamFixed = +parameters["sparamFixed"];
  var elementResistX = +parameters["elementResistX"];
  var elementResistWidth = +parameters["elementResistWidth"];
  var elementResistIds = parameters["elementResistIds"].split(",");
  var elementResistIconIds = parameters["elementResistIconIds"].split(",");
  var pdrIconId = +parameters["pdrIconId"];
  var mdrIconId = +parameters["mdrIconId"];
  var stateResistX = +parameters["stateResistX"];
  var stateResistWidth = +parameters["stateResistWidth"];
  var stateResistIds = parameters["stateResistIds"].split(",");
  var resistFixed = +parameters["resistFixed"];
  var paramBackGround = parameters["paramBackGround"] === "1" ? true : false;
  var paramBackGroundOpacity = +parameters["paramBackGroundOpacity"];
  var useNicknameEx = parameters["useNicknameEx"] === "1" ? true : false;
  var useMaxLevel = parameters["useMaxLevel"] === "1" ? true : false;
  var maxLevelColor = +parameters["maxLevelColor"];

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

  Window_Base.prototype.levelWidth = function () {
    return 160;
  };

  var _Window_Base_drawActorLevel = Window_Base.prototype.drawActorLevel;
  Window_Base.prototype.drawActorLevel = function (actor, x, y) {
    if (useMaxLevel) {
      this.changeTextColor(this.systemColor());
      this.drawText(TextManager.levelA, x, y, 48);
      var level = actor.level;
      var maxLevel = actor.maxLevel();
      var color1 =
        level === maxLevel ? this.textColor(maxLevelColor) : this.normalColor();
      this.drawCurrentAndMax(
        level,
        maxLevel,
        x,
        y,
        this.levelWidth(),
        color1,
        this.normalColor()
      );
    } else {
      _Window_Base_drawActorLevel.call(this, actor, x, y);
    }
  };

  var _Window_Base_drawActorSimpleStatus =
    Window_Base.prototype.drawActorSimpleStatus;
  Window_Base.prototype.drawActorSimpleStatus = function (actor, x, y, width) {
    if (useNicknameEx) {
      var lineHeight = this.lineHeight();
      y -= lineHeight * 0.5 - 8;
      this.contents.fontSize = 20;
      var text = actor.nickname() + actor.currentClass().name;
      this.contents.drawText(text, x, y, width, 20, "left");
      this.resetFontSettings();
      var x2 = x + 180;
      y += 20;
      var width2 = Math.min(200, width - 180 - this.textPadding());
      this.drawActorName(actor, x + 20, y);
      this.drawActorLevel(actor, x, y + lineHeight * 1);
      this.drawActorIcons(actor, x, y + lineHeight * 2);
      this.drawActorHp(actor, x2, y + lineHeight * 1, width2);
      this.drawActorMp(actor, x2, y + lineHeight * 2, width2);
    } else {
      _Window_Base_drawActorSimpleStatus.call(this, actor, x, y, width);
    }
  };

  //-----------------------------------------------------------------------------
  // Window_Status
  //

  Window_Status.prototype.levelWidth = function () {
    return 186;
  };

  var _Window_Status_initialize = Window_Status.prototype.initialize;
  Window_Status.prototype.initialize = function () {
    this._parameterMode = 0;
    _Window_Status_initialize.call(this);
  };

  Window_Status.prototype.refresh = function () {
    this.contents.clear();
    if (this._actor) {
      var lineHeight = this.lineHeight();
      var y = 0;
      y = this.drawBlock1(y);
      y = this.drawHorzLine(y);
      if (this._parameterMode === 0) {
        y = this.drawBlock2(y);
        y = this.drawHorzLine(y);
        this.drawBlock3(y);
      } else {
        this.drawBlock5(y);
      }
      y = this.contents.height - lineHeight * 2 - horzLineHeight;
      y = this.drawHorzLine(y);
      this.drawBlock4(y);
    }
  };

  var _Window_Status_drawBlock1 = Window_Status.prototype.drawBlock1;
  Window_Status.prototype.drawBlock1 = function (y) {
    if (useNicknameEx) {
      this.drawActorName(this._actor, 6, y);
      this.resetTextColor();
      var x = this.textWidth(this._actor.name()) + 6;
      var text = this._actor.nickname() + this._actor.currentClass().name;
      this.drawText(
        text,
        x,
        y,
        this.contents.width - x - this.textPadding(),
        "right"
      );
    } else {
      _Window_Status_drawBlock1.call(this, y);
    }
    return y + this.lineHeight() * 1;
  };

  var _Window_Status_drawBlock2 = Window_Status.prototype.drawBlock2;
  Window_Status.prototype.drawBlock2 = function (y) {
    _Window_Status_drawBlock2.call(this, y);
    return y + this.lineHeight() * 4;
  };

  Window_Status.prototype.drawBlock5 = function (y) {
    this.drawElementResists(y);
    this.drawStateResists(y);
    this.drawSparams(y);
  };

  Window_Status.prototype.drawHorzLine = function (y) {
    this.contents.paintOpacity = 48;
    this.contents.fillRect(
      0,
      y + horzLineHeight / 2 - 1,
      this.contentsWidth(),
      2,
      this.lineColor()
    );
    this.contents.paintOpacity = 255;
    return y + horzLineHeight;
  };

  Window_Status.prototype.drawParamBackGround = function (x, y, width) {
    this.contents.paintOpacity = paramBackGroundOpacity;
    this.contents.fillRect(
      x,
      y + this.lineHeight() / 2,
      width,
      this.lineHeight() / 2,
      this.gaugeBackColor()
    );
    this.contents.paintOpacity = 255;
  };

  Window_Status.prototype.drawParameters = function (x, y) {
    this.drawParams(y);
    this.drawXparams(y);
  };

  Window_Status.prototype.drawParams = function (y) {
    var x = paramNameX;
    var w = paramNameWidth;
    var x2 = paramX;
    var w2 = paramWidth;
    var lineHeight = this.lineHeight();
    for (var i = 0; i < 6; i++) {
      var paramId = i + 2;
      if (TextManager.param(paramId)) {
        if (paramBackGround) this.drawParamBackGround(x, y, x2 + w2 - x);
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.param(paramId), x, y, w);
        this.resetTextColor();
        this.drawText(this._actor.param(paramId), x2, y, w2, "right");
        y += lineHeight;
      }
    }
  };

  Window_Status.prototype.drawXparams = function (y) {
    var x = xparamNameX;
    var w = xparamNameWidth;
    var x2 = xparamX;
    var w2 = xparamWidth;
    var lineHeight = this.lineHeight();
    for (var i = 0; i < 7; i++) {
      if (xparamText[i]) {
        if (paramBackGround) this.drawParamBackGround(x, y, x2 + w2 - x);
        this.changeTextColor(this.systemColor());
        this.drawText(xparamText[i], x, y, w);
        this.resetTextColor();
        var value = this._actor.xparam(i) * 100;
        this.drawText(value.toFixed(xparamFixed), x2, y, w2, "right");
        y += lineHeight;
      }
    }
  };

  Window_Status.prototype.drawSparams = function (y) {
    var x = sparamNameX;
    var w = sparamNameWidth;
    var x2 = sparamX;
    var w2 = sparamWidth;
    var lineHeight = this.lineHeight();
    for (var i = 7; i < 10; i++) {
      if (xparamText[i]) {
        if (paramBackGround) this.drawParamBackGround(x, y, x2 + w2 - x);
        this.changeTextColor(this.systemColor());
        this.drawText(xparamText[i], x, y, w);
        this.resetTextColor();
        var value = this._actor.xparam(i) * 100;
        this.drawText(value.toFixed(xparamFixed) + "%", x2, y, w2, "right");
        y += lineHeight;
      }
    }
    for (var i = 0; i < 10; i++) {
      if (sparamText[i]) {
        if (paramBackGround) this.drawParamBackGround(x, y, x2 + w2 - x);
        this.changeTextColor(this.systemColor());
        this.drawText(sparamText[i], x, y, w);
        this.resetTextColor();
        var value = this._actor.sparam(i) * 100;
        this.drawText(value.toFixed(sparamFixed) + "%", x2, y, w2, "right");
        y += lineHeight;
      }
    }
  };

  Window_Status.prototype.drawElementResists = function (y) {
    var x = elementResistX;
    var w = elementResistWidth;
    var lineHeight = this.lineHeight();
    if (pdrIconId > 0) {
      if (paramBackGround) this.drawParamBackGround(x, y, w);
      this.drawIcon(pdrIconId, x, y);
      var n = this._actor.pdr * 100;
      this.drawText(
        n.toFixed(resistFixed) + "%",
        x + Window_Base._iconWidth,
        y,
        w - Window_Base._iconWidth,
        "right"
      );
      y += lineHeight;
    }
    if (mdrIconId > 0) {
      if (paramBackGround) this.drawParamBackGround(x, y, w);
      this.drawIcon(mdrIconId, x, y);
      var n = this._actor.mdr * 100;
      this.drawText(
        n.toFixed(resistFixed) + "%",
        x + Window_Base._iconWidth,
        y,
        w - Window_Base._iconWidth,
        "right"
      );
      y += lineHeight;
    }
    for (var i = 0; i < elementResistIds.length; i++) {
      if (paramBackGround) this.drawParamBackGround(x, y, w);
      var elementId = +elementResistIds[i];
      this.drawIcon(elementResistIconIds[i], x, y);
      var n = this._actor.elementRate(elementId) * 100;
      this.drawText(
        n.toFixed(resistFixed) + "%",
        x + Window_Base._iconWidth,
        y,
        w - Window_Base._iconWidth,
        "right"
      );
      y += lineHeight;
    }
  };

  Window_Status.prototype.drawStateResists = function (y) {
    var x = stateResistX;
    var w = stateResistWidth;
    var lineHeight = this.lineHeight();
    for (var i = 0; i < stateResistIds.length; i++) {
      if (paramBackGround) this.drawParamBackGround(x, y, w);
      var stateId = +stateResistIds[i];
      this.drawIcon($dataStates[stateId].iconIndex, x, y);
      var n = this._actor.stateRate(stateId) * 100;
      if (this._actor.isStateResist(stateId)) n = 0;
      this.drawText(
        n.toFixed(resistFixed) + "%",
        x + Window_Base._iconWidth,
        y,
        w - Window_Base._iconWidth,
        "right"
      );
      y += lineHeight;
    }
  };

  Window_Status.prototype.changeParameterMode = function () {
    this._parameterMode = (this._parameterMode + 1) % 2;
    this.refresh();
  };

  //-----------------------------------------------------------------------------
  // Scene_Status
  //

  var _Scene_Status_update = Scene_Status.prototype.update;
  Scene_Status.prototype.update = function () {
    _Scene_Status_update.call(this);
    if (
      Input.isTriggered("description") ||
      TouchInput.isTriggered() ||
      (useOkButton && Input.isTriggered("ok"))
    ) {
      SoundManager.playOk();
      this._statusWindow.changeParameterMode();
      this._statusWindow.activate();
    }
  };
})();


code:
//=============================================================================
// TextDecoration.js
//=============================================================================

/*:
 * @plugindesc Changes the decoration method for window texts.
 * @author Yoji Ojima
 *
 * @param Mode
 * @desc The decoration mode. 0: Outline, 1: Shadow
 * @default 0
 *
 * @param Red
 * @desc The R value of the decoration color. (0-255)
 * @default 0
 *
 * @param Green
 * @desc The G value of the decoration color. (0-255)
 * @default 0
 *
 * @param Blue
 * @desc The B value of the decoration color. (0-255)
 * @default 0
 *
 * @param Alpha
 * @desc The opacity of the decoration. (0-255)
 * @default 128
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc ウィンドウテキストの装飾方法を変更します。
 * @author Yoji Ojima
 *
 * @param Mode
 * @desc 装飾モードです。0: 縁取り、1: 影
 * @default 0
 *
 * @param Red
 * @desc 装飾色のR値です。(0-255)
 * @default 0
 *
 * @param Green
 * @desc 装飾色のG値です。(0-255)
 * @default 0
 *
 * @param Blue
 * @desc 装飾色のB値です。(0-255)
 * @default 0
 *
 * @param Alpha
 * @desc 装飾色の不透明度です。(0-255)
 * @default 128
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function () {
  var parameters = PluginManager.parameters("TextDecoration");
  var mode = Number(parameters["Mode"] || 0);
  var red = Number(parameters["Red"] || 0);
  var green = Number(parameters["Green"] || 0);
  var blue = Number(parameters["Blue"] || 0);
  var alpha = Number(parameters["Alpha"] || 128);

  var _Window_Base_resetFontSettings = Window_Base.prototype.resetFontSettings;
  Window_Base.prototype.resetFontSettings = function () {
    _Window_Base_resetFontSettings.call(this);
    this.contents.outlineColor = "rgba(%1,%2,%3,%4)".format(
      red,
      green,
      blue,
      alpha / 255
    );
    this.contents.decorationMode = mode;
  };

  var _Bitmap_drawTextOutline = Bitmap.prototype._drawTextOutline;
  Bitmap.prototype._drawTextOutline = function (text, tx, ty, maxWidth) {
    if (this.decorationMode === 1) {
      var context = this._context;
      context.fillStyle = this.outlineColor;
      context.fillText(text, tx + 2, ty + 2, maxWidth);
    } else {
      _Bitmap_drawTextOutline.call(this, text, tx, ty, maxWidth);
    }
  };
})();


code:
//=============================================================================
// TimeLimitedChoice.js	2017/04/02
// Copyright (c) 2017 Tsukimi
//=============================================================================

/*:
 * @plugindesc 時間制限付き選択肢プレグイン
 * @author Tsukimi
 *
 * @help
 * 時間制限付き選択肢プレグイン
 * 作者：ツキミ
 *
 * 2018/09/17 ver 1.0.1 ツキミ式選択肢との競合を解消
 * 2017/05/01 ver 1.0 完成
 *
 * ***************************************************
 * 説明：
 * 次の選択肢に時間制限をかけます。
 * プラグインコマンドを実行して選択肢を設定した時、タイマーが自動で起動します。
 * 時間切れすると選択ウィンドウが消え、[キャンセルのとき]
 * のイベントコマンドを実行します。
 *
 * ※ 選択肢の表示の設定の中の、キャンセルを[分岐]にしてください。
 *
 * ※ 必ずしもプラグインコマンドの直後に選択肢を設定する必要がありません。
 * オススメの設定方法は：
 * ◆プラグインコマンド：TLChoice 300
 * ◆文章：～～～～～
 * ◆選択肢の表示：～～～～～
 *
 *
 * ***************************************************
 * プラグインコマンド：
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * TLChoice [フレーム数]
 * 　　次の選択肢表示に時間制限をかける（1秒=60フレーム）
 * 　　例： TLChoice 600
 * 　　※次の選択肢にだけ効果があります。連続で使用したい場合、
 * 　　各[選択肢の表示]コマンドの前にもう一度このコマンドを行ってください。
 *
 *
 * 作者のサイト： http://tsukimitsf.blog.fc2.com/
 * バグなどがあったら、是非こちらへご一報ください。ありがとうございます。
 */

var Imported = Imported || {};

(function (_global) {
  // ここにプラグイン処理を記載

  var _Game_Timer_onExpire = Game_Timer.prototype.onExpire;
  Game_Timer.prototype.onExpire = function () {
    _Game_Timer_onExpire.call(this);
    var cw = SceneManager._scene._messageWindow._choiceWindow;
    if (!!cw._timeLimit && !!cw._TLStarted) {
      cw._timeLimit = false;
      cw._TLStarted = false;
      // processCancel, without sound
      cw.updateInputData();
      cw.deactivate();
      cw.callCancelHandler();
      // end
      this.stop();
    }
  };
  if (Imported.TKM_ChoiceList) {
    var _Window_TKMChoiceList_oked = Window_TKMChoiceList.prototype.oked;
    Window_TKMChoiceList.prototype.oked = function () {
      _Window_TKMChoiceList_oked.call(this);
      if (!!this._timeLimit) {
        this._timeLimit = false;
        this._TLStarted = false;
        $gameTimer.stop();
      }
    };
  } else {
    var _Window_ChoiceList_callOkHandler =
      Window_ChoiceList.prototype.callOkHandler;
    Window_ChoiceList.prototype.callOkHandler = function () {
      _Window_ChoiceList_callOkHandler.call(this);
      if (!!this._timeLimit) {
        this._timeLimit = false;
        this._TLStarted = false;
        $gameTimer.stop();
      }
    };
  }

  var _Window_ChoiceList_start = Window_ChoiceList.prototype.start;
  Window_ChoiceList.prototype.start = function () {
    _Window_ChoiceList_start.call(this);
    if (!!this._timeLimit) {
      this._TLStarted = true;
      $gameTimer.start(this._limitedTime || 300);
    }
  };

  var _Window_ChoiceList_isCancelEnabled =
    Window_ChoiceList.prototype.isCancelEnabled;
  Window_ChoiceList.prototype.isCancelEnabled = function () {
    var normal = _Window_ChoiceList_isCancelEnabled.call(this);
    if (!!this._timeLimit) return false;
    else return normal;
  };

  var _Game_Interpreter_pluginCommand =
    Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    switch (command) {
      case "TLChoice":
        var cw = SceneManager._scene._messageWindow._choiceWindow;
        cw._timeLimit = true;
        if (!args) cw._limitedTime = 300;
        else if (parseInt(args[0]) == 0) cw._limitedTime = 300;
        else cw._limitedTime = parseInt(args[0]);
        break;
    }
  };
})(this);