code:
/*---------------------------------------------------------------------------*
 * 2019/03/06 kido0617
 * http://kido0617.github.io/
 *---------------------------------------------------------------------------*/

/*:
 * @plugindesc ティッカープラグイン
 * @author kido0617
 * @help
 *   簡易メッセージを表示するプラグインです
 *   使用方法:
 *   TickerManager.show('\\I[5]あいうえお');
 *
 *   ・変数はプラスなら自動的に+が付きます
 *   TickerManager.show('\\V[5]');
 *
 *   ・ +をつけたくない場合は以下のように、falseを指定してください
 *   TickerManager.show('\\V[5]', false);
 *
 *   ・全部いっきに消したい場合は以下のようにしてください
 *   TickerManager.hideAll();
 *
 *   ・アイテム・武器・防具のメモ欄
 *   <ticker:あいうえお> : アイテムの説明として入手/消失時に表示されます。ない場合はアイテムの説明の1行目を表示
 *
 *   ・ログをクリア
 *    TickerManager.clearAllLog();
 *
 *   ・古いログを１個クリア
 *    TickerManager.clearOldestLog();
 *
 *
 * @param Opacity
 * @desc 背景の透明度(0 - 255)
 * @type number
 * @min 0
 * @max 255
 * @default 127
 *
 * @param DisplayDuration
 * @desc 表示時間[frame]
 * @type number
 * @default 180
 *
 * @param ToggleDuration
 * @desc 表示、消去にかける時間[frame]
 * @type number
 * @default 30
 *
 * @param y位置
 * @desc y位置のずらし(pixel) 10と入力すると10ピクセルずれます
 * @type number
 * @default 0
 *
 * @param x位置
 * @desc x位置のずらし(pixel) 10と入力すると10ピクセルずれます
 * @type number
 * @default 0
 *
 * @param スライドアニメーション開始位置
 * @desc 左から何ピクセルの位置からスライドしていくか
 * @type number
 * @default 100
 *
 * @param スライドアニメーション終了位置
 * @desc 左から何ピクセルの位置に向けてスライドしていくか
 * @type number
 * @default 0
 *
 * @param y位置合わせスピード
 * @desc 2つ以上あるときに最初のが消えた際にy位置を調整するときのアニメーションスピード[pixel/frame]
 * @type number
 * @default 5
 *
 * @param 上か下か
 * @desc 画面の上に表示するか下に表示するか
 * @default 上
 * @type select
 * @option 上
 * @option 下
 *
 * @param ティッカー高さ
 * @desc ティッカーの高さです
 * @type number
 * @default 36
 *
 * @param フォントサイズ
 * @desc フォントサイズです
 * @type number
 * @default 28
 *
 * @param アイコンサイズ
 * @desc アイコンサイズです
 * @type number
 * @default 32
 *
 * @param 背景画像
 * @desc 背景画像
 * @default
 * @type file
 * @dir img/pictures/
 *
 * @param 最大表示個数
 * @desc 表示できる個数です。オーバーすると古いのが消えます
 * @type number
 * @min 1
 * @max 100
 * @default 10
 *
 * @param ログ機能ONスイッチ
 * @desc ONのとき消去せずログとして残しておくためのスイッチです
 * @type switch
 * @default 0
 *
 * @param イージング
 * @desc スライドアニメーションのイージングを変えます
 * @default easeOutSine
 * @type select
 * @option linear
 * @option swingFromTo
 * @option swingFrom
 * @option swingTo
 * @option easeFromTo
 * @option easeFrom
 * @option easeTo
 * @option easeInQuad
 * @option easeOutQuad
 * @option easeInOutQuad
 * @option easeInCubic
 * @option easeOutCubic
 * @option easeInOutCubic
 * @option easeInQuart
 * @option easeOutQuart
 * @option easeInOutQuart
 * @option easeInQuint
 * @option easeOutQuint
 * @option easeInOutQuint
 * @option easeInSine
 * @option easeOutSine
 * @option easeInOutSine
 * @option easeInExpo
 * @option easeOutExpo
 * @option easeInOutExpo
 * @option easeInCirc
 * @option easeOutCirc
 * @option easeInOutCirc
 * @option easeOutBounce
 * @option easeInBack
 * @option easeOutBack
 * @option easeInOutBack
 * @option bounce
 * @option bouncePast
 * @option elastic
 *
 * @param ステート自動表示スイッチ
 * @desc ここで指定したスイッチがONの時、ステート変化時に自動的にティッカーを表示します
 * @type switch
 * @default 0
 *
 * @param アイテム・お金自動表示スイッチ
 * @desc ここで指定したスイッチがONの時、アイテム・武器防具・お金増減時に自動的にティッカーを表示します
 * @type switch
 * @default 0
 *
 * @param 消失時にティッカーを表示
 * @desc アイテム・武器防具・ゴールド消失時にウィンドウを表示するか
 * @type boolean
 * @default true
 *
 * @param アイテム・武器防具入手時テキスト
 * @desc アイテム・武器防具を入手したときのテキストです
 * %1がアイコン、%2がアイテム名、%3が個数、%4が説明に変わります。
 * メッセージウィンドウの制御コマンドが使えます。
 * @default %1 %2 x %3 GET %4
 *
 * @param アイテム・武器防具消失時テキスト
 * @desc アイテム・武器防具を消失した時に表示するテキストです。
 * %1がアイコン、%2がアイテム名、%3が個数、%4が説明に変わります。
 * メッセージウィンドウの制御コマンドが使えます。
 * @default %1 %2 x %3 消失 %4
 *
 * @param お金入手時テキスト
 * @desc お金を入手したときのテキストです
 * %1がアイコン、%2が金額、%3が通貨単位に変わります。
 * メッセージウィンドウの制御コマンドが使えます。
 * @default %1 %2%3入手!
 *
 * @param お金消失時テキスト
 * @desc お金をなくしたしたときのテキストです
 * %1がアイコン、%2が金額、%3が通貨単位に変わります。
 * メッセージウィンドウの制御コマンドが使えます。
 * @default %1 %2%3消失!
 *
 * @param お金アイコン
 * @desc お金入手/消失時に表示するアイコン番号です
 * @default 1
 * @type number
 *
 *
 * @param アイテム・武器・防具入手時SE
 * @desc アイテム・武器・防具入手時SE
 * @type struct<seSetting>
 *
 * @param アイテム・武器・防具消失時SE
 * @desc アイテム・武器・防具消失時SE
 * @type struct<seSetting>
 *
 * @param お金入手時SE
 * @desc お金入手時SE
 * @type struct<seSetting>
 *
 * @param お金消失時SE
 * @desc お金消失時SE
 * @type struct<seSetting>
 *
 */

/*~struct~seSetting:
 *
 * @param name
 * @desc ファイル名
 * @default
 * @dir audio/se/
 * @type file
 *
 * @param volume
 * @desc ボリューム
 * @default 90
 * @type number
 *
 * @param pitch
 * @desc ピッチ
 * @default 100
 * @type number
 *
 * @param pan
 * @desc パン
 * @default 0
 * @type number
 */

(function () {

  const parameters = PluginManager.parameters('Ticker');
  let defaultTickerSetting = {
    maxDisplay: Number(parameters['最大表示個数'] || 10),
    backgroundOpacity: Number(parameters['Opacity'] || 127),
    displayDuration: Number(parameters['DisplayDuration'] || 3 * 60),
    toggleDuration: Number(parameters['ToggleDuration'] || 30),
    xPosition: Number(parameters['x位置'] || 0),
    yPosition: Number(parameters['y位置'] || 0),
    fixYSpeed: Number(parameters['y位置合わせスピード'] || 100),
    slideFromX: Number(parameters['スライドアニメーション開始位置'] || 0),
    slideToX: Number(parameters['スライドアニメーション終了位置'] || 0),
    height: Number(parameters['ティッカー高さ']),
    fontSize: Number(parameters['フォントサイズ']),
    iconSize: Number(parameters['アイコンサイズ']),
    backgroundImg: parameters['背景画像'],
    isBaseTop: parameters['上か下か'] == '上',
    easingType: parameters['イージング'],
    logOnSwitch: Number(parameters['ログ機能ONスイッチ']),
    stateAutoEnableSWId: Number(parameters['ステート自動表示スイッチ']),
    autoSetting: {
      enableSWId: Number(parameters['アイテム・お金自動表示スイッチ']),
      enableLose: parameters['消失時にティッカーを表示'] == 'true',
      getItemText: parameters['アイテム・武器防具入手時テキスト'],
      loseItemText: parameters['アイテム・武器防具消失時テキスト'],
      getGoldText: parameters['お金入手時テキスト'],
      loseGoldText: parameters['お金消失時テキスト'],
      goldIcon: parameters['お金アイコン'],
      getItemSE: parseSE(parameters['アイテム・武器・防具入手時SE']),
      getGoldSE: parseSE(parameters['お金入手時SE']),
      loseItemSE: parseSE(parameters['アイテム・武器・防具消失時SE']),
      loseGoldSE: parseSE(parameters['お金消失時SE']),
    }
  };

  const gameSystemInitialize = Game_System.prototype.initialize;
  Game_System.prototype.initialize = function () {
    //ゲーム内からパラメータを変更したいのでセーブデータに含める
    gameSystemInitialize.call(this);
    this.setDefaultTickerSetting();
    this.tickerLogs = [];
  };

  Game_System.prototype.setDefaultTickerSetting = function () {
    this.ticker = JsonEx.makeDeepCopy(defaultTickerSetting);
  };

  function parseSE(se) {
    try {
      se = JSON.parse(se);
    } catch (e) {
      return null;
    }
    if (!se || !se.name) return null;
    se.pitch = Number(se.pitch);
    se.volume = Number(se.volume);
    se.pan = Number(se.pan);
    return se;
  }

  window.TickerManager = function () { };

  //パラメータをデフォルトに戻したいケースのため保持
  TickerManager.param = defaultTickerSetting;

  TickerManager.createTickerContainer = function () {
    //通常ティッカー用のコンテナ
    if (!SceneManager._scene._tickerContainer) {
      let tc = new TickerContainer(false);
      SceneManager._scene._tickerContainer = tc;
      SceneManager._scene.addChild(tc);
    }
    //ログティッカー表示用のコンテナ
    if (!SceneManager._scene._tickerLogContainer) {
      let tc = new TickerContainer(true);
      SceneManager._scene._tickerLogContainer = tc;
      SceneManager._scene.addChild(tc);
    }
  };

  TickerManager.show = function (text, needPlus = true) {
    this.createTickerContainer();
    if (this.isLogContainerEnable()) SceneManager._scene._tickerLogContainer.show(text, needPlus);
    else SceneManager._scene._tickerContainer.show(text, needPlus);
  };

  TickerManager.hideAll = function () {
    if (SceneManager._scene._tickerContainer) {
      SceneManager._scene._tickerContainer.hideAll();
    }
  };

  TickerManager.isLogContainerEnable = function () {
    return this.isLogOn() && (SceneManager._scene.constructor == Scene_Map || SceneManager._scene.constructor == Scene_Battle);
  };

  TickerManager.isLogOn = function () {
    return $gameSwitches.value($gameSystem.ticker.logOnSwitch);
  };

  TickerManager.isAutoDisplayEnabled = function () {
    return $gameSystem.ticker.autoSetting.enableSWId > 0 && $gameSwitches.value($gameSystem.ticker.autoSetting.enableSWId);
  };

  TickerManager.clearAllLog = function () {
    if (!$gameParty.inBattle()) $gameSystem.tickerLogs = [];

    if (SceneManager._scene._tickerLogContainer) {
      if ($gameParty.inBattle()) SceneManager._scene._tickerLogContainer.instantLog = [];
      SceneManager._scene._tickerLogContainer.hideAll();
    }
  };

  TickerManager.clearOldestLog = function () {
    if (!$gameParty.inBattle()) $gameSystem.tickerLogs.shift();
    if (SceneManager._scene._tickerLogContainer) {
      if ($gameParty.inBattle()) SceneManager._scene._tickerLogContainer.instantLog.shift();
      SceneManager._scene._tickerLogContainer.hideOldest();
    }
  };

  var createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
  Scene_Map.prototype.createDisplayObjects = function () {
    createDisplayObjects.call(this);
    //メニューから戻ったり、ロードしたりしたときにログ用のティッカーを復元する
    if ($gameSystem.tickerLogs.length > 0) {
      TickerManager.createTickerContainer();
      $gameSystem.tickerLogs.forEach((log) => {
        SceneManager._scene._tickerLogContainer.showFromLog(log);
      });
      SceneManager._scene._tickerLogContainer.alpha = TickerManager.isLogOn() ? 1 : 0;
    }
  };

  function TickerContainer(isLogMode) {
    PIXI.Container.call(this);
    this.isLogMode = isLogMode;
    this.instantLog = [];  //そのシーンだけのログ
  }

  TickerContainer.prototype = Object.create(PIXI.Container.prototype);
  TickerContainer.prototype.constructor = TickerContainer;

  TickerContainer.prototype.update = function () {
    this.displayFade();
    for (var i = 0; i < this.children.length; i++) {
      this.children[i].update();
      if (this.children[i].tickerState == 'end') {
        this.removeChildAt(i);
        this.adjustY();
        i--;
      }
    }
  };

  TickerContainer.prototype.displayFade = function () {
    //ログと通常の切替時にフェード入れる
    const duration = 0.1;
    var direction = 1;
    var logEnabled = TickerManager.isLogContainerEnable();
    if (this.isLogMode && !logEnabled) direction = -1;
    else if (!this.isLogMode && logEnabled) direction = -1;
    this.alpha = (this.alpha + direction * duration).clamp(0, 1);
  };

  TickerContainer.prototype.show = function (text, needPlus) {
    var ticker = this.makeTicker(text, needPlus);
    if (this.isLogMode) {
      //ログモードのとき画面切り替えやセーブに対応するため変換後のテキストを保存する。変換後でないと変数の値が変わる可能性がある
      var logs = $gameParty.inBattle() ? this.instantLog : $gameSystem.tickerLogs;
      logs.push(ticker.getCovertedText());
      if (logs.length > $gameSystem.ticker.maxDisplay) {
        logs.shift();
      }
    }
    if (this.countDisplay() > $gameSystem.ticker.maxDisplay) this.hideOldest();
  };

  TickerContainer.prototype.showFromLog = function (text, needPlus) {
    //ログを復帰するとき。表示アニメーションを飛ばして最初から表示にしたい
    var ticker = this.makeTicker(text, needPlus);
    ticker.setDisplayMode();
  };

  TickerContainer.prototype.makeTicker = function (text, needPlus) {
    var ticker = new Ticker(text, needPlus, this.isLogMode);
    ticker.setY(this.children.length);
    this.addChild(ticker);
    return ticker;
  };

  TickerContainer.prototype.adjustY = function () {
    //y位置直し
    for (var i = 0; i < this.children.length; i++) {
      this.children[i].setToY(i);
    }
  };

  TickerContainer.prototype.hideOldest = function () {
    for (var i = 0; i < this.children.length; i++) {
      if (this.children[i].isShowState()) {
        this.children[i].hide();
        return;
      }
    }
  };

  TickerContainer.prototype.countDisplay = function () {
    return this.children.filter((child) => child.isShowState()).length;
  };

  TickerContainer.prototype.hideAll = function () {
    for (var i = 0; i < this.children.length; i++)this.children[i].hide();
  };

  function Ticker() {
    this.frameCount = 0;
    this.tickerState = 'showing';
    this.initialize.apply(this, arguments);
  }

  Ticker.prototype = Object.create(PIXI.Container.prototype);
  Ticker.prototype.constructor = Ticker;

  Ticker.prototype.initialize = function (text, addPlus, isLogMode) {
    PIXI.Container.call(this);
    this.x = $gameSystem.ticker.xPosition;
    this.width = Graphics.width;
    this.height = $gameSystem.ticker.height;
    this.text = text;
    this.isLogMode = isLogMode;
    this.createBackground();
    this.contents = new Window_Ticker(text, $gameSystem.ticker.slideFromX, 0, this._width, this._height, addPlus);
    this.addChild(this.contents);
  };

  Ticker.prototype.setY = function (index) {
    this.y = $gameSystem.ticker.isBaseTop ? this.height * index + $gameSystem.ticker.yPosition : Graphics.height - this.height * (index + 1) - $gameSystem.ticker.yPosition;
  };

  Ticker.prototype.setToY = function (index) {
    this.toY = $gameSystem.ticker.isBaseTop ? this.height * index + $gameSystem.ticker.yPosition : Graphics.height - this.height * (index + 1) - $gameSystem.ticker.yPosition;
  };

  Ticker.prototype.createBackground = function () {
    this._backSprite = new Sprite();
    if ($gameSystem.ticker.backgroundImg) {
      this._backSprite.bitmap = ImageManager.loadPicture($gameSystem.ticker.backgroundImg);
    } else {
      this._backSprite.bitmap = new Bitmap(this._width, this._height);
      this._backSprite.bitmap.fillAll('rgba(0, 0, 0, 1)');
    }
    this._backSprite.opacity = 0;
    this.addChild(this._backSprite);
  };

  Ticker.prototype.hide = function () {
    if (!this.isShowState()) return;
    this.tickerState = 'hiding';
    this.frameCount = 0;
  };

  Ticker.prototype.isShowState = function () {
    return this.tickerState == 'showing' || this.tickerState == 'display';
  };

  Ticker.prototype.setDisplayMode = function () {
    //アニメなしで表示する（ログのとき画面切り替えしたときとかのため）
    this._backSprite.opacity = $gameSystem.ticker.backgroundOpacity;
    this.contents.contentsOpacity = 255;
    this.contents.x = $gameSystem.ticker.slideToX;
    this.tickerState = 'display';
  };

  Ticker.prototype.getCovertedText = function () {
    return this.contents.convertEscapeCharacters(this.text);
  };

  Ticker.prototype.update = function () {
    this.children.forEach(function (child) {
      child.update();
    });
    this.frameCount++;
    if (this.toY != null && this.y != this.toY) {
      if (this.y > this.toY) {
        this.y -= $gameSystem.ticker.fixYSpeed;
        if (this.y < this.toY) this.y = this.toY;
      } else {
        this.y += $gameSystem.ticker.fixYSpeed;
        if (this.y > this.toY) this.y = this.toY;
      }

    }
    switch (this.tickerState) {
      case 'showing':
        var rate = easing[$gameSystem.ticker.easingType](this.frameCount / $gameSystem.ticker.toggleDuration);
        this._backSprite.opacity = rate * $gameSystem.ticker.backgroundOpacity;
        this.contents.contentsOpacity = rate * 255;
        this.contents.x = $gameSystem.ticker.slideToX + (1 - rate) * $gameSystem.ticker.slideFromX;
        if (this.frameCount == $gameSystem.ticker.toggleDuration) {
          this.tickerState = 'display';
          this.frameCount = 0;
        }
        break;
      case 'display':
        if (this.frameCount == $gameSystem.ticker.displayDuration) {
          if (this.isLogMode) {
            //ログ表示中は消去にいかない
            return;
          }
          this.tickerState = 'hiding';
          this.frameCount = 0;
        }
        break;
      case 'hiding':
        this._backSprite.opacity = (1 - this.frameCount / $gameSystem.ticker.toggleDuration) * $gameSystem.ticker.backgroundOpacity;
        this.contents.contentsOpacity = (1 - this.frameCount / $gameSystem.ticker.toggleDuration) * 255;
        if (this.frameCount == $gameSystem.ticker.toggleDuration) {
          this.tickerState = 'end';
        }
        break;
    }

  };

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

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

  Window_Ticker.prototype.initialize = function (text, x, y, width, height, addPlus) {
    Window_Base.prototype.initialize.call(this, x, y, width, height);
    this.opacity = 0;
    this.contentsOpacity = 0;
    this.addPlus = addPlus;
    this.drawTextEx(text, 0, height / 2 - this.standardFontSize() / 2 - 4);
  };

  Window_Ticker.prototype.lineHeight = function () {
    return $gameSystem.ticker.fontSize + 8;
  };

  Window_Ticker.prototype.standardPadding = function () {
    return 0;
  };

  Window_Ticker.prototype.standardFontSize = function () {
    return $gameSystem.ticker.fontSize;
  };

  //変数にプラス記号をつけるため
  Window_Ticker.prototype.convertEscapeCharacters = function (text) {
    text = text.replace(/\\/g, '\x1b');
    text = text.replace(/\x1b\x1b/g, '\\');
    text = text.replace(/\x1bV\[(\d+)\]/gi, function () {
      var v = $gameVariables.value(parseInt(arguments[1]));
      return (v > 0 && this.addPlus ? '+' : '') + v;
    }.bind(this));
    text = text.replace(/\x1bV\[\+*(\d+)\]/gi, function () {
      var v = $gameVariables.value(parseInt(arguments[1]));
      return (v > 0 && this.addPlus ? '+' : '') + v;
    }.bind(this));
    text = text.replace(/\x1bN\[(\d+)\]/gi, function () {
      return this.actorName(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bP\[(\d+)\]/gi, function () {
      return this.partyMemberName(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
    return text;
  };

  Window_Ticker.prototype.processDrawIcon = function(iconIndex, textState) {
    var size = this.getIconSize();
    var y = ($gameSystem.ticker.height - size) / 2;
    this.drawIcon(iconIndex, textState.x + 2, y);
    textState.x += size + 4;
  };

  Window_Ticker.prototype.drawIcon = function(iconIndex, x, y) {
    var bitmap = ImageManager.loadSystem('IconSet');
    var pw = Window_Base._iconWidth;
    var ph = Window_Base._iconHeight;
    var sx = iconIndex % 16 * pw;
    var sy = Math.floor(iconIndex / 16) * ph;
    var size = this.getIconSize();
    this.contents.blt(bitmap, sx, sy, pw, ph, x, y, size, size);
  };

  Window_Ticker.prototype.getIconSize = function() {
    return $gameSystem.ticker.iconSize ? $gameSystem.ticker.iconSize : Window_Base._iconWidth;
  };

  //自動表示-----------------------------------------------------------------

  function formatTickerText(text, strs) {
    text = text.replace('%1', '\\I[' + strs[0] + ']');
    for (var i = 1; i <= strs.length; i++) {
      text = text.replace('%' + (i + 1), strs[i]);
    }
    return text;
  }

  function GetItemDescription(item) {
    if (item.meta.ticker) {
      return item.meta.ticker;
    }
    return item.description.replace(/[\r\n]+.*/m, '');
  }

  function showAutoTicker(getText, loseText, getSE, loseSE, strs, value) {
    let format = '';
    let se;
    if (value > 0) {
      format = getText;
      se = getSE;
    } else if ($gameSystem.ticker.autoSetting.enableLose && value < 0) {
      format = loseText;
      se = loseSE;
    }
    if (format) {
      let formated = formatTickerText(format, strs);
      TickerManager.show(formated);
      if (se) {
        AudioManager.playSe(se);
      }
    }
  }

  // Change Gold
  const command125 = Game_Interpreter.prototype.command125;
  Game_Interpreter.prototype.command125 = function () {
    command125.call(this);
    if (TickerManager.isAutoDisplayEnabled()) {
      let value = this.operateValue(this._params[0], this._params[1], this._params[2]);
      showAutoTicker($gameSystem.ticker.autoSetting.getGoldText, $gameSystem.ticker.autoSetting.loseGoldText,
        $gameSystem.ticker.autoSetting.getGoldSE, $gameSystem.ticker.autoSetting.loseGoldSE,
        [$gameSystem.ticker.autoSetting.goldIcon, Math.abs(value), $dataSystem.currencyUnit], value);
    }
    return true;
  };

  // Change Items
  const command126 = Game_Interpreter.prototype.command126;
  Game_Interpreter.prototype.command126 = function () {
    command126.call(this);
    if (TickerManager.isAutoDisplayEnabled()) {
      let value = this.operateValue(this._params[1], this._params[2], this._params[3]);
      let item = $dataItems[this._params[0]];
      showAutoTicker($gameSystem.ticker.autoSetting.getItemText, $gameSystem.ticker.autoSetting.loseItemText,
        $gameSystem.ticker.autoSetting.getItemSE, $gameSystem.ticker.autoSetting.loseItemSE,
        [item.iconIndex, item.name, Math.abs(value), GetItemDescription(item)], value);
    }
    return true;
  };

  // Change Weapons
  const command127 = Game_Interpreter.prototype.command127;
  Game_Interpreter.prototype.command127 = function () {
    command127.call(this);
    if (TickerManager.isAutoDisplayEnabled()) {
      let value = this.operateValue(this._params[1], this._params[2], this._params[3]);
      let item = $dataWeapons[this._params[0]];
      showAutoTicker($gameSystem.ticker.autoSetting.getItemText, $gameSystem.ticker.autoSetting.loseItemText,
        $gameSystem.ticker.autoSetting.getItemSE, $gameSystem.ticker.autoSetting.loseItemSE,
        [item.iconIndex, item.name, Math.abs(value), GetItemDescription(item)], value);
    }
    return true;
  };

  // Change Armors
  const command128 = Game_Interpreter.prototype.command128;
  Game_Interpreter.prototype.command128 = function () {
    command128.call(this);
    if (TickerManager.isAutoDisplayEnabled()) {
      let value = this.operateValue(this._params[1], this._params[2], this._params[3]);
      let item = $dataArmors[this._params[0]];
      showAutoTicker($gameSystem.ticker.autoSetting.getItemText, $gameSystem.ticker.autoSetting.loseItemText,
        $gameSystem.ticker.autoSetting.getItemSE, $gameSystem.ticker.autoSetting.loseItemSE,
        [item.iconIndex, item.name, Math.abs(value), GetItemDescription(item)], value);
    }
    return true;
  };

  //ステート変化時の自動表示------------------------------------------------------

  function NeedStateChangeDisplay(){
    if($gameSystem.ticker.stateAutoEnableSWId != 0 && !$gameSwitches.value($gameSystem.ticker.stateAutoEnableSWId)) return false;

    return  !(SceneManager._scene instanceof Scene_Battle) ||
     ($gameTroop && $gameTroop.isEventRunning());
  }

  const _gameBattlerBaseAddNewState = Game_BattlerBase.prototype.addNewState;
  Game_BattlerBase.prototype.addNewState = function(stateId) {
    if(NeedStateChangeDisplay() && this._states && !this._states.contains(stateId)){
      let state = $dataStates[stateId];
      if(state.message1) TickerManager.show(this._name + state.message1);
    }
    _gameBattlerBaseAddNewState.apply(this, arguments);
  };

  const _gameBattlerBaseEraseState = Game_BattlerBase.prototype.eraseState;
  Game_BattlerBase.prototype.eraseState = function(stateId) {
    if(NeedStateChangeDisplay() && this._states && this._states.contains(stateId)){
      let state = $dataStates[stateId];
      if(state.message4) TickerManager.show(this._name + state.message4);
    }
    _gameBattlerBaseEraseState.apply(this, arguments);
  };

  const _gameBattlerBaseClearStates = Game_BattlerBase.prototype.clearStates;
  Game_BattlerBase.prototype.clearStates = function() {
    if(NeedStateChangeDisplay() && this._states){
      this._states.forEach(function(stateId) {
        let state = $dataStates[stateId];
        if(state.message4) TickerManager.show(this._name + state.message4);
      }.bind(this));
    }
    _gameBattlerBaseClearStates.apply(this, arguments);
  };

  //歩行時のウィンドウでのステート表示を消す
  Game_Actor.prototype.showAddedStates = function() {

  };

  Game_Actor.prototype.showRemovedStates = function() {

  };

  //戦闘中のバトルログをTickerに流す-------------------------------------
  const _windowBackLogInitialize = Window_BattleLog.prototype.initialize;
  Window_BattleLog.prototype.initialize = function () {
    _windowBackLogInitialize.call(this);
    this.visible = false;
  };

  Window_BattleLog.prototype.drawLineText = function (index) {
    if (this._actionIcon && this._lines[index].match('<SIMPLE>')) {
      this._lines[index] = '\\I[' + this._actionIcon + ']' + this._lines[index];
    }
    TickerManager.show(this._lines[index].replace('<CENTER>', '').replace('<SIMPLE>', ''));
    this._lines.pop();
  };

  //easing-------------------------------------------------------------
  var easing = {
    linear: function (pos) {
      return pos;
    },

    easeInQuad: function (pos) {
      return Math.pow(pos, 2);
    },

    easeOutQuad: function (pos) {
      return -(Math.pow((pos - 1), 2) - 1);
    },

    easeInOutQuad: function (pos) {
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(pos, 2);
      return -0.5 * ((pos -= 2) * pos - 2);
    },

    easeInCubic: function (pos) {
      return Math.pow(pos, 3);
    },

    easeOutCubic: function (pos) {
      return (Math.pow((pos - 1), 3) + 1);
    },

    easeInOutCubic: function (pos) {
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(pos, 3);
      return 0.5 * (Math.pow((pos - 2), 3) + 2);
    },

    easeInQuart: function (pos) {
      return Math.pow(pos, 4);
    },

    easeOutQuart: function (pos) {
      return -(Math.pow((pos - 1), 4) - 1);
    },

    easeInOutQuart: function (pos) {
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(pos, 4);
      return -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2);
    },

    easeInQuint: function (pos) {
      return Math.pow(pos, 5);
    },

    easeOutQuint: function (pos) {
      return (Math.pow((pos - 1), 5) + 1);
    },

    easeInOutQuint: function (pos) {
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(pos, 5);
      return 0.5 * (Math.pow((pos - 2), 5) + 2);
    },

    easeInSine: function (pos) {
      return -Math.cos(pos * (Math.PI / 2)) + 1;
    },

    easeOutSine: function (pos) {
      return Math.sin(pos * (Math.PI / 2));
    },

    easeInOutSine: function (pos) {
      return (-0.5 * (Math.cos(Math.PI * pos) - 1));
    },

    easeInExpo: function (pos) {
      return (pos === 0) ? 0 : Math.pow(2, 10 * (pos - 1));
    },

    easeOutExpo: function (pos) {
      return (pos === 1) ? 1 : -Math.pow(2, -10 * pos) + 1;
    },

    easeInOutExpo: function (pos) {
      if (pos === 0) return 0;
      if (pos === 1) return 1;
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (pos - 1));
      return 0.5 * (-Math.pow(2, -10 * --pos) + 2);
    },

    easeInCirc: function (pos) {
      return -(Math.sqrt(1 - (pos * pos)) - 1);
    },

    easeOutCirc: function (pos) {
      return Math.sqrt(1 - Math.pow((pos - 1), 2));
    },

    easeInOutCirc: function (pos) {
      if ((pos /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - pos * pos) - 1);
      return 0.5 * (Math.sqrt(1 - (pos -= 2) * pos) + 1);
    },

    easeOutBounce: function (pos) {
      if ((pos) < (1 / 2.75)) {
        return (7.5625 * pos * pos);
      } else if (pos < (2 / 2.75)) {
        return (7.5625 * (pos -= (1.5 / 2.75)) * pos + 0.75);
      } else if (pos < (2.5 / 2.75)) {
        return (7.5625 * (pos -= (2.25 / 2.75)) * pos + 0.9375);
      } else {
        return (7.5625 * (pos -= (2.625 / 2.75)) * pos + 0.984375);
      }
    },

    easeInBack: function (pos) {
      var s = 1.70158;
      return (pos) * pos * ((s + 1) * pos - s);
    },

    easeOutBack: function (pos) {
      var s = 1.70158;
      return (pos = pos - 1) * pos * ((s + 1) * pos + s) + 1;
    },

    easeInOutBack: function (pos) {
      var s = 1.70158;
      if ((pos /= 0.5) < 1) return 0.5 * (pos * pos * (((s *= (1.525)) + 1) * pos - s));
      return 0.5 * ((pos -= 2) * pos * (((s *= (1.525)) + 1) * pos + s) + 2);
    },

    elastic: function (pos) {
      return -1 * Math.pow(4, -8 * pos) * Math.sin((pos * 6 - 1) * (2 * Math.PI) / 2) + 1;
    },

    swingFromTo: function (pos) {
      var s = 1.70158;
      return ((pos /= 0.5) < 1) ? 0.5 * (pos * pos * (((s *= (1.525)) + 1) * pos - s)) :
        0.5 * ((pos -= 2) * pos * (((s *= (1.525)) + 1) * pos + s) + 2);
    },

    swingFrom: function (pos) {
      var s = 1.70158;
      return pos * pos * ((s + 1) * pos - s);
    },

    swingTo: function (pos) {
      var s = 1.70158;
      return (pos -= 1) * pos * ((s + 1) * pos + s) + 1;
    },

    bounce: function (pos) {
      if (pos < (1 / 2.75)) {
        return (7.5625 * pos * pos);
      } else if (pos < (2 / 2.75)) {
        return (7.5625 * (pos -= (1.5 / 2.75)) * pos + 0.75);
      } else if (pos < (2.5 / 2.75)) {
        return (7.5625 * (pos -= (2.25 / 2.75)) * pos + 0.9375);
      } else {
        return (7.5625 * (pos -= (2.625 / 2.75)) * pos + 0.984375);
      }
    },

    bouncePast: function (pos) {
      if (pos < (1 / 2.75)) {
        return (7.5625 * pos * pos);
      } else if (pos < (2 / 2.75)) {
        return 2 - (7.5625 * (pos -= (1.5 / 2.75)) * pos + 0.75);
      } else if (pos < (2.5 / 2.75)) {
        return 2 - (7.5625 * (pos -= (2.25 / 2.75)) * pos + 0.9375);
      } else {
        return 2 - (7.5625 * (pos -= (2.625 / 2.75)) * pos + 0.984375);
      }
    },

    easeFromTo: function (pos) {
      if ((pos /= 0.5) < 1) return 0.5 * Math.pow(pos, 4);
      return -0.5 * ((pos -= 2) * Math.pow(pos, 3) - 2);
    },

    easeFrom: function (pos) {
      return Math.pow(pos, 4);
    },

    easeTo: function (pos) {
      return Math.pow(pos, 0.25);
    }
  };

})();


code:
//=============================================================================
// TintBattleScreen.js
// ----------------------------------------------------------------------------
// <利用規約>
//  利用はRPGツクールMV/RPGMakerMVの正規ユーザーに限られます。
//  商用、非商用、ゲームの内容を問わず利用可能です。
//  ゲームへの利用の際、報告や出典元の記載等は必須ではありません。
//  二次配布や転載は禁止します。
//  ソースコードURL、ダウンロードURLへの直接リンクも禁止します。
//  不具合対応以外のサポートやリクエストは受け付けておりません。
//  スクリプト利用により生じたいかなる問題においても、一切責任を負いかねます。
//  不具合報告は https://twitter.com/koma_neko まで。
// ----------------------------------------------------------------------------
//  Ver1.00  2016/02/27  初版
//=============================================================================

/*:
 * @plugindesc バトルシーンの色調を設定します。
 * @author こま
 *
 * @param DEFAULT TONE
 * @desc デフォルトの色調（赤・緑・青・グレー）を設定してください。
 * @default 0 0 0 0
 *
 * @help
 * パラメータ：
 *   DEFAULT TONE
 *   : バトルシーンの色調を設定します。色調の赤、緑、青、グレーの値を半角スペース
 *   : で区切って指定してください。設定値の詳細については、イベントコマンド「画面
 *   : の色調変更」を参考にしてください。本設定は、後述のプラグインコマンドにてゲ
 *   : ーム内で変更できます。
 *
 * プラグインコマンド：
 *   TBS_BattleTone <red> <green> <blue> <gray>
 *   : バトルシーンの色調を設定します。
 *   : 使用例 : TBS_BattleTone -68 -68 0 68
 *   :          > バトルシーンの色調が、夜のようになります。設定値の詳細については
 *   :          > イベントコマンド「画面の色調変更」を参考にしてください。
 */

(function(){
    var pluginName = 'TintBattleScreen';

    var params = PluginManager.parameters(pluginName);
    var defaultTone = params['DEFAULT TONE'].split(' ').map(function(value){ return +value; });

    // Object Property for Plugin
    function pprop(obj) {
        return (obj[pluginName] = obj[pluginName] || {});
    }

    //=========================================================================
    // Screen_Battle
    //=========================================================================
    var _alias_Scene_Battle_start = Scene_Battle.prototype.start;
    Scene_Battle.prototype.start = function() {
        _alias_Scene_Battle_start.call(this);
        if (!pprop($gameScreen).battleTone) {
            pprop($gameScreen).battleTone = [0,1,2,3].map(function(value){ return defaultTone[value] || 0; })
        }
        pprop($gameScreen).mapTone = $gameScreen._tone;
        $gameScreen._tone = pprop($gameScreen).battleTone;
    };

    var _alias_Scene_Battle_terminate = Scene_Battle.prototype.terminate;
    Scene_Battle.prototype.terminate = function() {
        _alias_Scene_Battle_terminate.call(this);
        $gameScreen._tone = pprop($gameScreen).mapTone;
    };

    //=========================================================================
    // Game_Interpreter
    //=========================================================================
    var _alias_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _alias_Game_Interpreter_pluginCommand.call (this, command, args);
        switch (command.toUpperCase()) {
        case 'TBS_BATTLETONE':
            pprop($gameScreen).battleTone = [0,1,2,3].map(function(value){ return +args[value] || 0 });
            break;
        }
    }
}());

repo_name: onms/sister

license: unknown


code:
//=============================================================================
// TinyGetInfoWnd.js Ver1.1
//=============================================================================
// Ver 1.1 New Features:
// - display window even if screen is faded out.
// - it can display window on battle (option)
// - display money get/(lose:option)
// - set SE for each type of item/money.
// note: The motivation of ver up is to use this at Margikarman ItoA MV.

/*:
 * @plugindesc Display tiny window of gaining/losing items information(Ver 1.1)
 * @author Sasuke KANNAZUKI (thx to Momomaru)
 *
 * @param Event Command Switch
 * @desc If the switch on, display window when change an item number by an
 *  event command
 * @default 104
 *
 * @param Y position type
 * @desc Windows' position. 0:top 1:bottom
 * @default 0
 *
 * @param Display Loss
 * @desc Whether display item loss (1:display 0:not display)
 * @default 1
 *
 * @param Display at Battle
 * @desc Whether display not only map also at battle(1: yes 0:no)
 * @defalut 1
 *
 * @param textGainItem
 * @desc title text display on the window when gain item(s).
 * %1 is replaced to the item's kind(weapon/armor/item/money).
 * @default You got %1
 *
 * @param textLoseItem
 * @desc title text display on the window when lose item(s).
 * %1 is replaced to the item's kind(weapon/armor/item/money).
 * @default You lost %1
 *
 * @param wordMoney
 * @desc the word that represents the kind 'money'
 * @default money
 *
 * @param iconMoney
 * @desc the icon ID that represents the kind 'money'
 * @default 360
 *
 * @param Item SE filename
 * @desc the filename of the SE that plays when you gain item(s).
 * note: It doesn't play when you lose item(s).
 * @default Chime2
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Item SE volume
 * @desc the volume of the SE that plays when you gain item(s).
 * @default 90
 *
 * @param Item SE pitch
 * @desc the pitch of the SE that plays when you gain item(s).
 * @default 100
 *
 * @param Weapon SE filename
 * @desc the filename of the SE that plays when you gain weapon(s).
 * note: It doesn't play when you lose weapon(s).
 * @default Equip1
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Weapon SE volume
 * @desc the volume of the SE that plays when you gain weapon(s).
 * @default 100
 *
 * @param Weapon SE pitch
 * @desc the pitch of the SE that plays when you gain weapon(s).
 * @default 100
 *
 * @param Armor SE filename
 * @desc the filename of the SE that plays when you gain armor(s).
 * note: It doesn't play when you lose armor(s).
 * @default Evasion2
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Armor SE volume
 * @desc the volume of the SE that plays when you gain armor(s).
 * @default 100
 *
 * @param Armor SE pitch
 * @desc the pitch of the SE that plays when you gain armor(s).
 * @default 100
 *
 * @param Money SE filename
 * @desc the filename of the SE that plays when you gain money.
 * note: It doesn't play when you lose money.
 * @default Coin
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Money SE volume
 * @desc the volume of the SE that plays when you gain money.
 * @default 100
 *
 * @param Money SE pitch
 * @desc the pitch of the SE that plays when you gain money.
 * @default 100
 * @help
 * Plugin Commands:
 * TinyGetInfoWnd arg0 arg1 arg2 arg3
 * arg0 must be 'item', 'weapon', 'armor', or 'money'.
 * arg1 must be the ID of the item(or equipment), (when money, the value),
 *  or 'V' + number(ex. 'V20') where the number is the variable ID for item ID.
 * arg2 must be 'gain' or 'lose'. (default value is 'gain').
 *  at 'money', this is ignored.
 * arg3 must be the number of gain/lose. (defalut value is 1).
 *  at 'money', this is ignored.
 *  (arg3 also accepts the same notation as the arg1 like 'V15')
 * ex.
 * TinyGetInfoWnd weapon 14 gain 2  # gain 2 weapons whose id is 14.
 * TinyGetInfoWnd armor 20 lose 1   # lose an armor whose id is 20.
 *   (if you equip the armor, it will not be lost.)
 * TinyGetInfoWnd item 7    # gain an item whose id is 7.
 *   (default value, arg2='gain' and arg3='1' is applied.)
 * TinyGetInfoWnd item V10 gain 3   # gain 3 items whose ID is variable #10.
 * TinyGetInfoWnd money 100         # gain 100G
 * TinyGetInfoWnd money -100        # lose 100G
 *
 * note description:
 * <info:the_explanation> : the_explanation is displayed when gain or lose
 *  the item. If it isn't written down, the first line of the item's
 *  description is displayed.
 *
 * Item lost is not more than the party has.
 * When you have only 3 and execute 'lose 5' for the item,
 * it will display 'lost 3'.
 * When you have the item none, even if execute 'lose', do not display window.
 *
 * Copyright：
 * This plugin is based on a Momomaru's RGSS2 script specification.
 * Thanks to Momomaru.
 */
/*:ja
 * @plugindesc アイテムの入手/消失を小さなウィンドウで表示します。(Ver1.1)
 * @author 神無月サスケ (原案：ももまる)
 *
 * @param Event Command Switch
 * @desc このスイッチがONの時、イベントコマンド「アイテム/武器/防具/所持金の増減」を行った時にウィンドウが表示されます
 * @default 104
 *
 * @param Y position type
 * @desc 複数のウィンドウを並べる位置です。0:上部 1:下部
 * @default 0
 *
 * @param Display Loss
 * @desc 消失時にウィンドウを表示するか (1:する 0:しない)
 * @default 1
 *
 * @param Display at Battle
 * @desc 戦闘中にもウィンドウを表示するか(1:する 0:しない)
 * @defalut 1
 *
 * @param textGainItem
 * @desc アイテムを入手した時に表示するタイトルです。
 * %1がアイテム種別(アイテム/武器/防具/お金)に置き換わります。
 * @default %1入手！
 *
 * @param textLoseItem
 * @desc アイテムを消失した時に表示するタイトルです。
 * %1がアイテム種別(アイテム/武器/防具/お金)に置き換わります。
 * @default %1消失……。
 *
 * @param wordMoney
 * @desc アイテム種別の「お金」をあらわす文字列です
 * @default お金
 *
 * @param iconMoney
 * @desc お金入手/消失時に表示するアイコンIDです
 * @default 360
 *
 * @param Item SE filename
 * @desc アイテムを入手した時に演奏されるSEのファイル名です。
 * 注意：消失した時は演奏されません。
 * @default Evasion1
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Item SE volume
 * @desc アイテムを入手した時に演奏されるSEのボリュームです。
 * @default 100
 *
 * @param Item SE pitch
 * @desc アイテムを入手した時に演奏されるSEのピッチです。
 * @default 100
 *
 * @param Weapon SE filename
 * @desc 武器を入手した時に演奏されるSEのファイル名です。
 * 注意：消失した時は演奏されません。
 * @default Equip1
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Weapon SE volume
 * @desc 武器を入手した時に演奏されるSEのボリュームです。
 * @default 100
 *
 * @param Weapon SE pitch
 * @desc 武器を入手した時に演奏されるSEのピッチです。
 * @default 100
 *
 * @param Armor SE filename
 * @desc 防具を入手した時に演奏されるSEのファイル名です。
 * 注意：消失した時は演奏されません。
 * @default Evasion2
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Armor SE volume
 * @desc 防具を入手した時に演奏されるSEのボリュームです。
 * @default 100
 *
 * @param Armor SE pitch
 * @desc 防具を入手した時に演奏されるSEのピッチです。
 * @default 100
 *
 * @param Money SE filename
 * @desc お金を入手した時に演奏されるSEのファイル名です。
 * 注意：消失した時は演奏されません。
 * @default Coin
 * @require 1
 * @dir audio/se/
 * @type file
 *
 * @param Money SE volume
 * @desc お金を入手した時に演奏されるSEのボリュームです。
 * @default 100
 *
 * @param Money SE pitch
 * @desc お金を入手した時に演奏されるSEのピッチです。
 * @default 100
 *
 * @help
 * プラグインコマンドの書式:
 * TinyGetInfoWnd arg0 arg1 arg2 arg3
 * arg0 は item, weapon, armor, money のいずれかにします。
 * arg1 は アイテム(または武器防具)のID、（お金の時は金額）
 *  または V20 のようにVで始まる数字にします。
 *  後者の場合数字の番号(ここでは20)の変数の値がID(または金額)になります。
 * arg2 は gain, lose のいずれかにします。(省略時はgain)
 *  お金の時は指定しません。
 * arg3 は 個数にします。(省略時は1, arg2を省略してarg3を書くことは出来ません)
 *  お金の時は指定しません。
 * (arg3 でも arg1 と同等の、V15 のような Vで始まる記法が利用可能です)
 * ex.
 * TinyGetInfoWnd weapon 14 gain 2  # ID14の武器を2個得る。
 * TinyGetInfoWnd armor 20 lose 1   # ID20の鎧を1個失う
 *   (ただし装備していた場合は失わない)
 * TinyGetInfoWnd item 7            # ID7のアイテムを1個得る。
 *   (パラメータを省略したので、arg2はgainに、arg3は1になります。)
 * TinyGetInfoWnd item V10 gain 3   # 変数10番の値のIDのアイテムを3個得る。
 * TinyGetInfoWnd money 100         # 100G入手
 * TinyGetInfoWnd money -100        # 100G失う
 *
 * メモの書式：
 * <info:the_explanation> : the_explanation の文章が、アイテムの説明として
 *   入手/消失時に表示されます。省略した場合は、アイテムの説明の1行目が
 *   表示されます。
 *
 * アイテムの消失は、所持している数に関連します。
 * 例えば5個消失コマンドを実行して、3個しか持っていない場合「3個消失」と
 * 表示されます。また、該当アイテムをひとつも持っていない場合は、
 * 消失ウィンドウは表示されません。
 *
 * 謝辞：
 * このプラグインは、ももまる様のRGSS2素材の仕様をベースに作られました。
 * ももまる様に謝意を示します。
 */

(function() {
  //
  // process parameters
  //
  var parameters = PluginManager.parameters('TinyGetInfoWnd');
  var dispSwitchID = Number(parameters['Event Command Switch'] || 22);
  var yPosType = Number(parameters['Y position type'] || 1);
  var isDisplayLoss = !!Number(parameters['Display Loss']);
  var isDisplayBattle = !!Number(parameters['Display at Battle']);
  var wordMoney = parameters['wordMoney'] || 'money';
  var iconMoney = Number(parameters['iconMoney'] || 360);
  var textGainItem = parameters['textGainItem'] || 'You got %1';
  var textLoseItem = parameters['textLoseItem'] || 'You lost %1';
  var seFilename = parameters['Item SE filename'] || 'Evasion1';
  var seVolume = Number(parameters['Item SE volume'] || 100);
  var sePitch = Number(parameters['Item SE pitch'] || 100);
  var seWeaponFilename = parameters['Weapon SE filename'] || 'Equip1';
  var seWeaponVolume = Number(parameters['Weapon SE volume'] || 100);
  var seWeaponPitch = Number(parameters['Weapon SE pitch'] || 100);
  var seArmorFilename = parameters['Armor SE filename'] || 'Evasion2';
  var seArmorVolume = Number(parameters['Armor SE volume'] || 100);
  var seArmorPitch = Number(parameters['Armor SE pitch'] || 100);
  var seMoneyFilename = parameters['Money SE filename'] || 'Coin';
  var seMoneyVolume = Number(parameters['Money SE volume'] || 100);
  var seMoneyPitch = Number(parameters['Money SE pitch'] || 100);

  //
  // process plugin commands
  //
  var _Game_Interpreter_pluginCommand =
   Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'TinyGetInfoWnd') {
      // find args[1]
      var itemId = 0;
      var reg = (/^V([0-9]+)/i).exec(args[1]);
      if(reg){
        itemId = $gameVariables.value(Number(reg[1])) || 0;
      } else {
        itemId = Number(args[1]) || 0;
      }
      // find args[3]
      var itemNumber = 0;
      reg = (/^V([0-9]+)/i).exec(args[3]);
      if(reg){
        itemNumber = $gameVariables.value(Number(reg[1])) || 1;
      } else {
        itemNumber = Number(args[3]) || 1;
      }
      // get current spriteset
      var spriteSet = null;
      if(!$gameParty.inBattle() || isDisplayBattle){
        spriteSet = SceneManager._scene._spriteset;
      }
      // parse parameters
      switch(args[0]) {
      case 'item':
        if(!!$dataItems[itemId] && !!spriteSet) {
          switch(args[2]) {
          case 'gain':
          case undefined:
            // gain item process
            var text = textGainItem.format(TextManager.item);
            spriteSet.addGetInfoWindow(itemId, 0, text, itemNumber);
            break;
          case 'lose':
            // lose item process
            var text = textLoseItem.format(TextManager.item);
            spriteSet.addGetInfoWindow(itemId, 0, text, -itemNumber);
            break;
          }
        }
        break;
      case 'weapon':
        if(!!$dataWeapons[itemId] && !!spriteSet) {
          switch(args[2]) {
          case 'gain':
          case undefined:
            // gain weapon process
            var text = textGainItem.format(TextManager.weapon);
            spriteSet.addGetInfoWindow(itemId, 1, text, itemNumber);
            break;
          case 'lose':
            // lose weapon process
            var text = textLoseItem.format(TextManager.weapon);
            spriteSet.addGetInfoWindow(itemId, 1, text, -itemNumber);
            break;
          }
        }
        break;
      case 'armor':
        if(!!$dataArmors[itemId] && !!spriteSet) {
          switch(args[2]) {
          case 'gain':
          case undefined:
            // gain armor process
            var text = textGainItem.format(TextManager.armor);
            spriteSet.addGetInfoWindow(itemId, 2, text, itemNumber);
            break;
          case 'lose':
            // lose armor process
            var text = textLoseItem.format(TextManager.armor);
            spriteSet.addGetInfoWindow(itemId, 2, text, -itemNumber);
            break;
          }
        }
        break;
      case 'money':
        if(!!spriteSet) {
          var text;
          if(itemId >= 0) {
            text = textGainItem.format(wordMoney);
          } else {
            text = textLoseItem.format(wordMoney);
          }
          spriteSet.addGetInfoWindow(0, 3, text, itemId);
        }
      }
    }
  };

  //
  // set variables
  //
  var _Game_Temp_initialize = Game_Temp.prototype.initialize;
  Game_Temp.prototype.initialize = function() {
    _Game_Temp_initialize.call(this);
    this.getInfoOccupied = [];
  };

  //
  // process spriteset
  //
  var _Spriteset_Base_initialize = Spriteset_Base.prototype.initialize;
  Spriteset_Base.prototype.initialize = function () {
    this.getInfoWndFactory = [];
    this.getInfoWnds = [];
    $gameTemp.getInfoOccupied = [];
    _Spriteset_Base_initialize.call(this);
  };

  Spriteset_Base.prototype.createInfoWindow = function(id, type, text, value) {
    if(this.getInfoWndFactory.length > 0) {
      return this.getInfoWndFactory.shift().setup(id, type, text, value);
    } else {
      return new Window_GetInfo(id, type, text, value);
    }
  };

  Spriteset_Base.prototype.addGetInfoWindow = function(id, type, text, value) {
    var window = this.createInfoWindow(id, type, text, value);
    this.getInfoWnds.push(window);
    SceneManager._scene.addChild(window);
  };

  Spriteset_Base.prototype.removeGetInfoWindow = function(window) {
    $gameTemp.getInfoOccupied[window.index] = null;
    SceneManager._scene.removeChild(window);
    this.getInfoWndFactory.push(window.reset());
  };

  Spriteset_Base.prototype.removeAllGetInfoWindows = function() {
    for(var i = 0; i < this.getInfoWnds.length; i++) {
      this.removeGetInfoWindow(this.getInfoWnds[i]);
    }
    this.getInfoWnds = [];
  };

  var _Spriteset_Base_update = Spriteset_Base.prototype.update;
  Spriteset_Base.prototype.update = function() {
    _Spriteset_Base_update.call(this);
    this.updateGetInfoWindow();
  };

  Spriteset_Base.prototype.updateGetInfoWindow = function() {
    var s = this;
    this.getInfoWnds = this.getInfoWnds.filter(function (window) {
      if (window.needDispose()) {
        s.removeGetInfoWindow(window);
        return false;
      }
      return true;
    });
  };

  //
  // delete all tiny windows before battle
  //
  var _Scene_Map_startEncounterEffect =
   Scene_Map.prototype.startEncounterEffect;
  Scene_Map.prototype.startEncounterEffect = function() {
    this._spriteset.removeAllGetInfoWindows();
    _Scene_Map_startEncounterEffect.call(this);
  };

  // -------------------------------------------------------------------------
  // Window_GetInfo
  //
  // The tiny window to display item gain/lose situation on map.

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

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

  Window_GetInfo.prototype.initialize = function(id, type, text, value) {
    Window_Base.prototype.initialize.call(this, -24, 0, 864, 105);
    this.reset();
    this.setup(id, type, text, value);
  };

  Window_GetInfo.prototype.reset = function() {
    this.disposed = false;
    this.opacity = 0;
    this.backOpacity = 0;
    this.contentsOpacity = 0;
    this.count = 0;
    this.contents.clear();
    return this;
  };

  Window_GetInfo.prototype.setup = function(id, type, text, value) {
    value = this.getRealValue(type, id, value);
    this.gainItem(type, id, value);
    this.setPosition(value);
    this.drawContents(id, type, text, value);
    this.playSE(type, value);
    this.update();
    return this;
  };

  Window_GetInfo.prototype.determineItem = function(type, id) {
    var data = '';
    switch(type) {
    case 0:
      data = $dataItems[id];
      break;
    case 1:
      data = $dataWeapons[id];
      break;
    case 2:
      data = $dataArmors[id];
      break;
    }
    return data;
  };

  Window_GetInfo.prototype.description = function(data) {
    if(data.meta.info) {
      return data.meta.info;
    }
    return data.description.replace(/[\r\n]+.*/m, "");
  };

  Window_GetInfo.prototype.getRealValue = function(type, id, value) {
    var data = this.determineItem(type, id);
    // check number (whether the party has the number of item to lose)
    if(type >= 0 && type <= 2) {
      if(value < 0) {
        if(-value > $gameParty.numItems(data)){
          value = -$gameParty.numItems(data);
        }
      }
    } else if (type === 3) {
      if(value < 0) {
        if(-value > $gameParty.gold()){
          value = -$gameParty.gold();
        }
      }
    }
    return value;
  };

  Window_GetInfo.prototype.gainItem = function(type, id, value) {
    var data = this.determineItem(type, id);
    if(type >= 0 && type <= 2) {
      $gameParty.gainItem(data, value);
    } else if(type === 3) {
      $gameParty.gainGold(value);
    }
  };

  Window_GetInfo.prototype.setPosition = function(value) {
    if (value === 0 || (value < 0 && !isDisplayLoss)) {
      return;
    }
    this.index = $gameTemp.getInfoOccupied.indexOf(null);
    if(this.index === -1) {
      this.index = $gameTemp.getInfoOccupied.length;
    }
    $gameTemp.getInfoOccupied[this.index] = true;
    // set Y position
    if(yPosType === 0){
      this.y = this.index * 60;
    } else {
      this.y = 520 - (this.index * 60);
    }
  };

  Window_GetInfo.prototype.drawContents = function(id, type, text, value) {
    if (value === 0 || (value < 0 && !isDisplayLoss)) {
      return;
    }
    var data = this.determineItem(type, id);
    // fill background
    this.contents.paintOpacity = 160;
    this.contents.fontSize = 28;
    this.contents.fillRect(0, 21, 816, 36, '#000000');
    // draw item name, number, description
    if(type >= 0 && type <= 2) {
      this.contents.paintOpacity = 255;
      this.changeTextColor(this.normalColor());
      if(value < 0){
        this.contents.paintOpacity = 160;
      }
      this.drawItemName(data, 6, 21, 300);
      this.drawText('\xd7', 306, 21, 24, 'center');
      this.drawText(String(Math.abs(value)), 330, 21, 32, 'right');
      this.changeTextColor(this.normalColor());
      this.drawText(this.description(data), 384, 21, 432, 'left');
    } else if (type === 3) {
      this.contents.paintOpacity = 255;
      this.changeTextColor(this.normalColor());
      if(value < 0){
        this.contents.paintOpacity = 160;
      }
      this.drawIcon(iconMoney, 6, 21);
      var mainText = String(Math.abs(value)) + $dataSystem.currencyUnit;
      this.drawText(mainText, 44, 21, 180, 'right');
    }
    // draw guide string
    this.contents.paintOpacity = 160;
    this.contents.fontSize = 20;
    this.contents.fillRect(0, 0, this.textWidth(text) + 6, 22, '#000000');
    this.contents.paintOpacity = 255;
    this.changeTextColor(this.normalColor());
    this.drawText(text, 6, -8, 510, 'left');
  };

  Window_GetInfo.prototype.playSE = function(type, value) {
    if (value <= 0) {   // play when gain, not play when lose.
      return;
    }
    switch(type) {
    case 0: // item
      if(seFilename) {
        var audio = {name:seFilename, volume:seVolume, pitch:sePitch};
        AudioManager.playSe(audio);
      }
      break;
    case 1: // weapon
      if(seWeaponFilename) {
        var audio = {name:seWeaponFilename, volume:seWeaponVolume,
         pitch:seWeaponPitch};
        AudioManager.playSe(audio);
      }
      break;
    case 2: // armor
      if(seArmorFilename) {
        var audio = {name:seArmorFilename, volume:seArmorVolume,
         pitch:seArmorPitch};
        AudioManager.playSe(audio);
      }
      break;
    case 3: // money
      if(seMoneyFilename) {
        var audio = {name:seMoneyFilename, volume:seMoneyVolume,
         pitch:seMoneyPitch};
        AudioManager.playSe(audio);
      }
      break;
    default: // not supported
      break;
    }
  };

  Window_GetInfo.prototype.update = function() {
    Window_Base.prototype.update.call(this);
    if(++this.count < 200) {
      this.contentsOpacity += 32;
    } else {
      if(yPosType === 0){
        this.y -= 2;
      } else {
        this.y += 2;
      }
      this.contentsOpacity -= 32;
    }
  };

  Window_GetInfo.prototype.needDispose = function() {
    return this.contentsOpacity === 0;
  };

  //
  // interpreter commands
  // *** note *** : To prevent multiple exection of operateValue,
  // not to alias but overwriting functions.

  // Change Gold
  Game_Interpreter.prototype.command125 = function() {
    var value = this.operateValue(this._params[0], this._params[1],
     this._params[2]);
    if ($gameSwitches.value(dispSwitchID) &&
     (!$gameParty.inBattle() || isDisplayBattle) &&
     value != 0) {
      var text = '';
      var spriteSet = SceneManager._scene._spriteset;
      if(value > 0){
        text = textGainItem.format(wordMoney);
      } else {
        text = textLoseItem.format(wordMoney);
      }
      spriteSet.addGetInfoWindow(0, 3, text, value);
    } else {
      $gameParty.gainGold(value);
    }
    return true;
  };

  // Change Items
  Game_Interpreter.prototype.command126 = function() {
    var value = this.operateValue(this._params[1], this._params[2],
     this._params[3]);
    if($gameSwitches.value(dispSwitchID) &&
     (!$gameParty.inBattle() || isDisplayBattle) &&
     value != 0) {
      var text = '';
      var spriteSet = SceneManager._scene._spriteset;
      if(value > 0){
        text = textGainItem.format(TextManager.item);
      } else {
        text = textLoseItem.format(TextManager.item);
      }
      spriteSet.addGetInfoWindow(this._params[0], 0, text, value);
    } else {
      $gameParty.gainItem($dataItems[this._params[0]], value);
    }
    return true;
  };

  // Change Weapons
  Game_Interpreter.prototype.command127 = function() {
    var value = this.operateValue(this._params[1], this._params[2],
     this._params[3]);
    if($gameSwitches.value(dispSwitchID) &&
     (!$gameParty.inBattle() || isDisplayBattle) &&
     value != 0) {
      var text = '';
      var spriteSet = SceneManager._scene._spriteset;
      if(value > 0){
        text = textGainItem.format(TextManager.weapon);
      } else {
        text = textLoseItem.format(TextManager.weapon);
      }
      spriteSet.addGetInfoWindow(this._params[0], 1, text, value);
    } else {
      $gameParty.gainItem($dataWeapons[this._params[0]], value,
       this._params[4]);
    }
    return true;
  };

  // Change Armors
  Game_Interpreter.prototype.command128 = function() {
    var value = this.operateValue(this._params[1], this._params[2],
     this._params[3]);
    if($gameSwitches.value(dispSwitchID) &&
     (!$gameParty.inBattle() || isDisplayBattle) &&
     value != 0) {
      var text = '';
      var spriteSet = SceneManager._scene._spriteset;
      if(value > 0){
        text = textGainItem.format(TextManager.armor);
      } else {
        text = textLoseItem.format(TextManager.armor);
      }
      spriteSet.addGetInfoWindow(this._params[0], 2, text, value);
    } else {
      $gameParty.gainItem($dataArmors[this._params[0]], value,
       this._params[4]);
    }
    return true;
  };

})();


code:
//=============================================================================
// TitleCommandPosition.js
//=============================================================================

/*:
 * @plugindesc Changes the position of the title command window.
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc The offset value for the x coordinate.
 * @default 0
 *
 * @param Offset Y
 * @desc The offset value for the y coordinate.
 * @default 0
 *
 * @param Width
 * @desc The width of the command window.
 * @default 240
 *
 * @param Background
 * @desc The background type. 0: Normal, 1: Dim, 2: Transparent
 * @default 0
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc タイトルコマンドウィンドウの位置を変更します。
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc X座標のオフセット値です。
 * @default 0
 *
 * @param Offset Y
 * @desc Y座標のオフセット値です。
 * @default 0
 *
 * @param Width
 * @desc コマンドウィンドウの幅です。
 * @default 240
 *
 * @param Background
 * @desc 背景タイプです。0: 通常、1: 暗くする、2: 透明
 * @default 0
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function() {

    var parameters = PluginManager.parameters('TitleCommandPosition');
    var offsetX = Number(parameters['Offset X'] || 0);
    var offsetY = Number(parameters['Offset Y'] || 0);
    var width = Number(parameters['Width'] || 240);
    var background = Number(parameters['Background'] || 0);

    var _Window_TitleCommand_updatePlacement =
            Window_TitleCommand.prototype.updatePlacement;
    Window_TitleCommand.prototype.updatePlacement = function() {
        _Window_TitleCommand_updatePlacement.call(this);
        this.x += offsetX;
        this.y += offsetY;
        this.setBackgroundType(background);
    };

    Window_TitleCommand.prototype.windowWidth = function() {
        return width;
    };

})();


code:
//=============================================================================
// TitleImageChange.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.4.5 2020/03/01 進行度変数の値を戻したときに、リロードするまで元のタイトル画面に戻らない問題を修正
// 1.4.4 2018/07/11 1.4.3の修正でタイトル画面が変更される条件を満たした状態でセーブ後にタイトルに戻るで再表示しても変更が反映されない問題を修正
// 1.4.3 2018/06/09 セーブファイル数の上限を大きく増やしている場合にタイトル画面の表示が遅くなる現象を修正
// 1.4.2 2018/04/26 ニューゲーム開始後、一度もセーブしていないデータで進行状況のみをセーブするスクリプトを実行しても設定が反映されない問題を修正
// 1.4.1 2017/07/20 1.4.0で追加した機能で画像やBGMを4つ以上しないとタイトルがずれてしまう問題を修正
// 1.4.0 2017/02/12 画像やBGMを4つ以上指定できる機能を追加
// 1.3.1 2017/02/04 簡単な競合対策
// 1.3.0 2017/02/04 どのセーブデータの進行度を優先させるかを決めるための優先度変数を追加
// 1.2.1 2016/12/17 進行状況のみセーブのスクリプトを実行した場合に、グローバル情報が更新されてしまう問題を修正
// 1.2.0 2016/08/27 進行状況に応じてタイトルBGMを変更できる機能を追加
// 1.1.0 2016/06/05 セーブデータに歯抜けがある場合にエラーが発生する問題を修正
//                  進行状況のみをセーブする機能を追加
// 1.0.0 2016/04/06 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc タイトル画面変更プラグイン
 * @author トリアコンタン
 *
 * @param 進行度変数
 * @desc ゲームの進行度に対応する変数番号(1...)
 * @default 1
 * @type variable
 *
 * @param 優先度変数
 * @desc 複数のセーブデータが存在するとき、どのセーブデータの進行度を優先するかを決める変数番号(1...)
 * @default 0
 * @type variable
 *
 * @param タイトル1の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル1の画像が表示されます。
 * @default 1
 *
 * @param タイトル1の画像
 * @desc 進行度変数の値がタイトル1の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル1のBGM
 * @desc 進行度変数の値がタイトル1の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param タイトル2の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル2の画像が表示されます。
 * @default 2
 *
 * @param タイトル2の画像
 * @desc 進行度変数の値がタイトル2の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル2のBGM
 * @desc 進行度変数の値がタイトル2の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param タイトル3の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル3の画像が表示されます。
 * @default 3
 *
 * @param タイトル3の画像
 * @desc 進行度変数の値がタイトル3の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル3のBGM
 * @desc 進行度変数の値がタイトル3の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param 以降の進行度
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りで進行度を指定します。例(4,5,6)
 * @default
 *
 * @param 以降の画像
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りで画像(img/titles1)のファイル名を指定します。例(aaa,bbb,ccc)
 * @default
 *
 * @param 以降のBGM
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りでBGM(audio/bgm)のファイル名を指定します。例(aaa,bbb,ccc)
 * @default
 *
 * @help ゲームの進行度に応じてタイトル画面の画像およびBGMを変更します。
 * 進行度には任意の変数が指定でき、通常は全セーブデータの中の最大値が反映されます。
 *
 * ただし、優先度変数が別途指定されている場合は、その変数値が最も大きい
 * セーブデータの進行度をもとに画像及びBGMが決まります。
 *
 * タイトル画像は最大3つまで指定可能で、複数の条件を満たした場合は
 * 以下のような優先順位になります。
 *
 * 1. 4以降の画像及びBGM
 * 2. タイトル3の画像およびBGM
 * 3. タイトル2の画像およびBGM
 * 4. タイトル1の画像およびBGM
 * 5. デフォルトのタイトル画像およびBGM
 *
 * ゲームデータをセーブせず進行状況のみをセーブしたい場合は、
 * イベントコマンドの「スクリプト」から以下を実行してください。
 * DataManager.saveOnlyGradeVariable();
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

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

    var getParamString = function(paramNames) {
        var value = getParamOther(paramNames);
        return value == null ? '' : value;
    };

    var getParamNumber = function(paramNames, min, max) {
        var value = getParamOther(paramNames);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(value, 10) || 0).clamp(min, max);
    };

    var getParamOther = function(paramNames) {
        if (!Array.isArray(paramNames)) paramNames = [paramNames];
        for (var i = 0; i < paramNames.length; i++) {
            var name = PluginManager.parameters(pluginName)[paramNames[i]];
            if (name) return name;
        }
        return null;
    };

    var getParamArrayString = function(paramNames) {
        var valuesText = getParamString(paramNames);
        if (!valuesText) return [];
        var values = valuesText.split(',');
        for (var i = 0; i < values.length; i++) {
            values[i] = values[i].trim();
        }
        return values;
    };

    var getParamArrayNumber = function(paramNames, min, max) {
        var values = getParamArrayString(paramNames);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        for (var i = 0; i < values.length; i++) {
            if (!isNaN(parseInt(values[i], 10))) {
                values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
            } else {
                values.splice(i--, 1);
            }
        }
        return values;
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var paramGradeVariable    = getParamNumber(['GradeVariable', '進行度変数'], 1, 5000);
    var paramPriorityVariable = getParamNumber(['PriorityVariable', '優先度変数'], 0, 5000);
    var paramTitleGrades      = [];
    paramTitleGrades.push(getParamNumber(['TitleGrade1', 'タイトル1の進行度']));
    paramTitleGrades.push(getParamNumber(['TitleGrade2', 'タイトル2の進行度']));
    paramTitleGrades.push(getParamNumber(['TitleGrade3', 'タイトル3の進行度']));
    var paramTitleImages = [];
    paramTitleImages.push(getParamString(['TitleImage1', 'タイトル1の画像']));
    paramTitleImages.push(getParamString(['TitleImage2', 'タイトル2の画像']));
    paramTitleImages.push(getParamString(['TitleImage3', 'タイトル3の画像']));
    var paramTitleBgms = [];
    paramTitleBgms.push(getParamString(['TitleBgm1', 'タイトル1のBGM']));
    paramTitleBgms.push(getParamString(['TitleBgm2', 'タイトル2のBGM']));
    paramTitleBgms.push(getParamString(['TitleBgm3', 'タイトル3のBGM']));
    paramTitleGrades = paramTitleGrades.concat(getParamArrayNumber(['TitleGradeAfter', '以降の進行度'])).reverse();
    paramTitleImages = paramTitleImages.concat(getParamArrayString(['TitleImageAfter', '以降の画像'])).reverse();
    paramTitleBgms   = paramTitleBgms.concat(getParamArrayString(['TitleBgmAfter', '以降のBGM'])).reverse();

    //=============================================================================
    // DataManager
    //  ゲーム進行状況を保存します。
    //=============================================================================
    var _DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
    DataManager.makeSavefileInfo      = function() {
        var info = _DataManager_makeSavefileInfo.apply(this, arguments);
        this.setGradeVariable(info);
        return info;
    };

    DataManager.getFirstPriorityGradeVariable = function() {
        this._loadGrade = true;
        var globalInfo    = this.loadGlobalInfo().filter(function(data, id) {
            return this.isThisGameFile(id);
        }, this);
        this._loadGrade = false;
        var gradeVariable = 0;
        if (globalInfo && globalInfo.length > 0) {
            var sortedGlobalInfo = globalInfo.clone().sort(this._compareOrderForGradeVariable);
            if (sortedGlobalInfo[0]) {
                gradeVariable = sortedGlobalInfo[0].gradeVariable || 0;
            }
        }
        return gradeVariable;
    };

    var _DataManager_loadGlobalInfo = DataManager.loadGlobalInfo;
    DataManager.loadGlobalInfo = function() {
        if (this._loadGrade) {
            if (!this._globalInfo) {
                try {
                    var json = StorageManager.load(0);
                    this._globalInfo = json ? JSON.parse(json) : [];
                } catch (e) {
                    console.error(e);
                    this._globalInfo = [];
                }
            }
            return this._globalInfo;
        } else {
            return _DataManager_loadGlobalInfo.apply(this, arguments);
        }
    };

    DataManager._compareOrderForGradeVariable = function(a, b) {
        if (!a) {
            return 1;
        } else if (!b) {
            return -1;
        } else if (a.priorityVariable !== b.priorityVariable && paramPriorityVariable > 0) {
            return (b.priorityVariable || 0) - (a.priorityVariable || 0);
        } else {
            return (b.gradeVariable || 0) - (a.gradeVariable || 0);
        }
    };

    DataManager.saveOnlyGradeVariable = function() {
        var saveFileId = this.lastAccessedSavefileId();
        var globalInfo = this.loadGlobalInfo() || [];
        if (globalInfo[saveFileId]) {
            this.setGradeVariable(globalInfo[saveFileId]);
        } else {
            globalInfo[saveFileId] = this.makeSavefileInfo();
        }
        this.saveGlobalInfo(globalInfo);
    };

    DataManager.setGradeVariable = function(info) {
        info.gradeVariable = $gameVariables.value(paramGradeVariable);
        if (paramPriorityVariable > 0) {
            info.priorityVariable = $gameVariables.value(paramPriorityVariable);
        }
    };

    var _DataManager_saveGlobalInfo = DataManager.saveGlobalInfo;
    DataManager.saveGlobalInfo = function(info) {
        _DataManager_saveGlobalInfo.apply(this, arguments);
        this._globalInfo = null;
    };

    //=============================================================================
    // Scene_Title
    //  進行状況が一定以上の場合、タイトル画像を差し替えます。
    //=============================================================================
    var _Scene_Title_initialize      = Scene_Title.prototype.initialize;
    Scene_Title.prototype.initialize = function() {
        _Scene_Title_initialize.apply(this, arguments);
        this.changeTitleImage();
        this.changeTitleBgm();
    };

    Scene_Title.prototype.changeTitleImage = function() {
        var gradeVariable = DataManager.getFirstPriorityGradeVariable();
        if ($dataSystem.originalTitle1Name !== undefined) {
            $dataSystem.title1Name = $dataSystem.originalTitle1Name;
        }
        for (var i = 0, n = paramTitleGrades.length; i < n; i++) {
            if (paramTitleImages[i] && gradeVariable >= paramTitleGrades[i]) {
                $dataSystem.originalTitle1Name = $dataSystem.title1Name;
                $dataSystem.title1Name = paramTitleImages[i];
                break;
            }
        }
    };

    Scene_Title.prototype.changeTitleBgm = function() {
        var gradeVariable = DataManager.getFirstPriorityGradeVariable();
        if ($dataSystem.titleBgm.originalName !== undefined) {
            $dataSystem.titleBgm.name = $dataSystem.titleBgm.originalName;
        }
        for (var i = 0, n = paramTitleGrades.length; i < n; i++) {
            if (paramTitleBgms[i] && gradeVariable >= paramTitleGrades[i]) {
                $dataSystem.titleBgm.originalName = $dataSystem.titleBgm.name;
                $dataSystem.titleBgm.name = paramTitleBgms[i];
                break;
            }
        }
    };
})();