code:
//=============================================================================
// StopSelfMovementWithPlayer.js (ver 1.01)
//=============================================================================
// [Change History]
// 2017.Jun     First Release
// 2017.Dec.13  avoid collision with Tsumio's ExpandStatusScene.js

/*:
 * @plugindesc While an event is running, events stop self movement
 * @author Sasuke KANNAZUKI
 *
 * @param Varidate Switch ID
 * @desc It works only when the id's switch is on. If set 0, always works.
 * @default 0
 *
 * @help
 * This plugin does not provide plugin commands.
 *
 * [Summary]
 * At default system, events do self movement even if any event is running.
 * This plugin stops events' self movent during any event is running.
 *
 * Note:
 * - events don't stop self movement if only parallel events are running.
 * - events also stop self movement when message window is opening
 * (ex. when state removed message is displaying).
 * - You can toggle mode by switch set at parameter "Varidate Switch ID".
 *
 * [License]
 * this plugin is released under MIT license.
 * http://opensource.org/licenses/mit-license.php
 */

/*:ja
 * @plugindesc イベント起動中にイベントの自律移動を停止します。
 * @author 神無月サスケ
 *
 * @param Varidate Switch ID
 * @desc このIDのスイッチがONの時に有効になります。0を指定すると常に有効です。
 * @default 0
 *
 * @help
 * このプラグインには、プラグインコマンドはありません。
 *
 * ■概要
 * 通常のシステムでは、イベント起動中も他のイベントは自律移動を続けます。
 * このプラグインは、イベント起動中の自律移動を行わなくします。
 *
 * - 並列イベントのみが起動中の場合は、自律移動はやめません。
 * - イベント起動中以外でも、メッセージウィンドウ表示中は自律移動を行いません。
 * (例：「○○のステートが切れた」というメッセージの表示中)
 * - パラメータ"Varidate Switch ID"のスイッチの操作でゲーム中の機能のON/OFFが
 *  可能です。
 *
 * ■ライセンス表記
 * このプラグインは MIT ライセンスで配布されます。
 * ご自由にお使いください。
 * http://opensource.org/licenses/mit-license.php
 */

(function() {
  //
  // process parameters
  //
  var parameters = PluginManager.parameters('StopSelfMovementWithPlayer');
  var validateSwitchId = Number(parameters['Varidate Switch ID'] || 0);

  //
  // stop self movement routine
  //
  var isStopWithPlayerMode = function () {
    return validateSwitchId === 0 || $gameSwitches.value(validateSwitchId);
  };

  var shouldStopWithPlayer = function () {
    if (isStopWithPlayerMode()) {
      var mw;
      if ($gameMap.isEventRunning()) {
        // when another event is running, stop moving.
        // ex. when the player is inspecting treasure box or talking with NPC.
        return true;
      } else if ((mw = SceneManager._scene._messageWindow) && mw.isOpen()) {
        // ex. when state removed message is displaying, stop moving.
        return true;
      }
    }
    return false;
  };

  var _Game_CharacterBase_updateStop = Game_CharacterBase.prototype.updateStop;
  Game_CharacterBase.prototype.updateStop = function() {
    if (!shouldStopWithPlayer()) {
      _Game_CharacterBase_updateStop.call(this);
    }
  };

  var _Game_Event_updateSelfMovement = Game_Event.prototype.updateSelfMovement;
  Game_Event.prototype.updateSelfMovement = function() {
    if (!shouldStopWithPlayer()) {
      _Game_Event_updateSelfMovement.call(this);
    }
  };

})();


code:
//=============================================================================
// SystemSoundCustomize.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015-2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.0.0 2017/05/22 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc SystemSoundCustomizePlugin
 * @author triacontane
 *
 * @help システム効果音をゲーム中に動的に変更します。
 * 変更したシステム効果音はセーブデータごとに有効になります。
 *
 * 変更はプラグインコマンドから行います。最初の引数にシステム効果音ごとの
 * タイプインデックス（後述）を指定してください。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * SSC_CHANGE_SYSTEM_SE 0 seName 90 100 0   # カーソルSEをseNameに変更
 * SSC_システム効果音変更 0 seName 90 100 0 # 同上
 * SSC_RESET_SYSTEM_SE 1                    # 決定SEをデフォルトに戻す
 * SSC_システム効果音削除 1                 # 同上
 * ※音量、ピッチ、位相を省略した場合は通常のデフォルト値が適用されます。
 *
 * タイプインデックス一覧
 *  0:カーソル
 *  1:決定
 *  2:キャンセル
 *  3:ブザー
 *  4:装備
 *  5:セーブ
 *  6:ロード
 *  7:戦闘開始
 *  8:逃走
 *  9:敵攻撃
 * 10:敵ダメージ
 * 11:敵消滅
 * 12:ボス消滅1
 * 13:ボス消滅2
 * 14:味方ダメージ
 * 15:味方戦闘不能
 * 16:回復
 * 17:ミス
 * 18:回避
 * 19:魔法回避
 * 20:魔法反射
 * 21:ショップ
 * 22:アイテム使用
 * 23:スキル使用
 *
 * This plugin is released under the MIT License.
 */
/*:ja
 * @plugindesc システム効果音変更プラグイン
 * @author トリアコンタン
 *
 * @help システム効果音をゲーム中に動的に変更します。
 * 変更したシステム効果音はセーブデータごとに有効になります。
 *
 * 変更はプラグインコマンドから行います。最初の引数にシステム効果音ごとの
 * タイプインデックス（後述）を指定してください。
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * SSC_CHANGE_SYSTEM_SE 0 seName 90 100 0   # カーソルSEをseNameに変更
 * SSC_システム効果音変更 0 seName 90 100 0 # 同上
 * SSC_RESET_SYSTEM_SE 1                    # 決定SEをデフォルトに戻す
 * SSC_システム効果音削除 1                 # 同上
 * ※音量、ピッチ、位相を省略した場合は通常のデフォルト値が適用されます。
 *
 * タイプインデックス一覧
 *  0:カーソル
 *  1:決定
 *  2:キャンセル
 *  3:ブザー
 *  4:装備
 *  5:セーブ
 *  6:ロード
 *  7:戦闘開始
 *  8:逃走
 *  9:敵攻撃
 * 10:敵ダメージ
 * 11:敵消滅
 * 12:ボス消滅1
 * 13:ボス消滅2
 * 14:味方ダメージ
 * 15:味方戦闘不能
 * 16:回復
 * 17:ミス
 * 18:回避
 * 19:魔法回避
 * 20:魔法反射
 * 21:ショップ
 * 22:アイテム使用
 * 23:スキル使用
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function() {
    'use strict';
    var metaTagPrefix = 'SSC_';

    //=============================================================================
    // ローカル関数
    //  プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
    //=============================================================================
    var getArgNumber = function(arg, min, max) {
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(arg) || 0).clamp(min, max);
    };

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

    var isNotAString = function(args) {
        return String(args) !== args;
    };

    var convertAllArguments = function(args) {
        for (var i = 0; i < args.length; i++) {
            args[i] = convertEscapeCharacters(args[i]);
        }
        return args;
    };

    var setPluginCommand = function(commandName, methodName) {
        pluginCommandMap.set(metaTagPrefix + commandName, methodName);
    };

    //=============================================================================
    // パラメータの取得と整形
    //=============================================================================
    var pluginCommandMap = new Map();
    setPluginCommand('CHANGE_SYSTEM_SE', 'execChangeSystemSe');
    setPluginCommand('システム効果音変更', 'execChangeSystemSe');
    setPluginCommand('RESET_SYSTEM_SE', 'execResetSystemSe');
    setPluginCommand('システム効果音削除', 'execResetSystemSe');

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンドを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.apply(this, arguments);
        var pluginCommandMethod = pluginCommandMap.get(command.toUpperCase());
        if (pluginCommandMethod) {
            this[pluginCommandMethod](convertAllArguments(args));
        }
    };

    Game_Interpreter.prototype.execChangeSystemSe = function(args) {
        var typeIndex = getArgNumber(args.shift());
        $gameSystem.setSystemSound(typeIndex, args);
    };

    Game_Interpreter.prototype.execResetSystemSe = function(args) {
        $gameSystem.resetSystemSound(getArgNumber(args[0]));
    };

    //=============================================================================
    // Game_System
    //  カスタムシステム効果音を保持します。
    //=============================================================================
    var _Game_System_onAfterLoad = Game_System.prototype.onAfterLoad;
    Game_System.prototype.onAfterLoad = function() {
        _Game_System_onAfterLoad.apply(this, arguments);
        this.initSystemSound(false);
        this._systemSounds.forEach(function(sound) {
            if (sound) AudioManager.loadStaticSe(sound);
        });
    };

    Game_System.prototype.initSystemSound = function() {
        if (!this._systemSounds) {
            this._systemSounds = [];
        }
    };

    Game_System.prototype.setSystemSound = function(typeIndex, systemSoundArgs) {
        this.initSystemSound();
        var systemSound = {
            name  : systemSoundArgs[0] || '',
            volume: getArgNumber(systemSoundArgs[1] || 90, 0, 100),
            pitch : getArgNumber(systemSoundArgs[2] || 100, 50, 150),
            pan   : getArgNumber(systemSoundArgs[3] || 0, -100, 100)
        };
        this._systemSounds[typeIndex] = systemSound;
        AudioManager.loadStaticSe(systemSound);
    };

    Game_System.prototype.resetSystemSound = function(typeIndex) {
        this.initSystemSound();
        this._systemSounds[typeIndex] = undefined;
    };

    Game_System.prototype.getSystemSound = function(typeIndex) {
        return this._systemSounds && this._systemSounds[typeIndex] ? this._systemSounds[typeIndex] : null;
    };

    //=============================================================================
    // SoundManager
    //  カスタムシステム効果音を演奏します。
    //=============================================================================
    var _SoundManager_playSystemSound = SoundManager.playSystemSound;
    SoundManager.playSystemSound = function(n) {
        var customSound = $gameSystem.getSystemSound(n);
        if (customSound) {
            AudioManager.playStaticSe(customSound);
        } else {
            _SoundManager_playSystemSound.apply(this, arguments);
        }
    };
})();

repo_name: onms/melphias

license: unknown


code:
//=============================================================================
// TMPlugin - アニメ付き明かり
// バージョン: 2.0.1
// 最終更新日: 2016/12/02
// 配布元    : 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 range
 * @desc アニメーションの大きさ。
 * 初期値: 0.1 ( 0.1 でプラスマイナス 10% の拡大縮小アニメ)
 * @default 0.1
 *
 * @param defaultZ
 * @desc アニメーションのＺ座標。
 * 初期値: 4
 * @default 4
 *
 * @param frames
 * @desc アニメーションにかけるフレーム数。
 * 初期値: 30
 * @default 30
 *
 * @help
 * 準備:
 *
 *   プラグインと一緒に配布している明かり画像を img/system フォルダに
 *   保存してください。ファイル名は自由に変更可能です。
 *   使用する画像はどんなものでもかまいません、イベントごとに違う画像を
 *   表示することもできます。
 *
 *
 * 使い方:
 *
 *   イベントのメモ欄に <animeLight:ファイル名> というタグを書き込めば、
 *   明かりが表示されるようになります。
 *
 *   明かりの位置もタグを使って調整することができます。
 *
 *   このプラグインは RPGツクールMV Version 1.3.4 で動作確認をしています。
 *
 *
 * メモ欄（イベント）タグ:
 *
 *   <animeLight:TMAnimeLight1 192 24 -44 4>
 *     画像 TMAnimeLight1.png を不透明度 192 で、イベントの足元から右に 24、
 *     上に 44 ドットずらした位置にＺ座標 4 で表示します。
 *     不透明度の最大値は 255 です。
 *
 *   イベントのメモ欄以外に、実行内容の一番上にある注釈コマンド内でも
 *   同様のタグで名前を設定することができます。
 *   メモ欄と注釈の両方にタグがある場合は注釈が優先されます。
 *
 *
 * プラグインコマンド:
 *
 *   animeLight 1 TMAnimeLight1 255 0 -44 4
 *     イベント 1 番に明かりを適用します。
 *     イベント番号、ファイル名、不透明度、Ｘ座標補正、Ｙ座標補正、Ｚ座標
 *     の順に設定してください。
 *     Ｚ座標を省略した場合はプラグインパラメータ animeLightZ の値を
 *     使用します。
 *
 *   animeLight 1
 *     イベント 1 番の明かりを削除します。
 *
 *   イベント番号（ひとつ目の数値）は以下の規則にしたがって対象を指定します。
 *     -1     … プレイヤーを対象にする
 *     0      … コマンドを実行しているイベントを対象にする
 *     1 以上 … その番号のイベントを対象にする
 *
 *
 * おまけ機能:
 *
 *   メモ欄タグ、注釈、プラグインコマンドすべてに共通で、Ｚ座標のあとに
 *   1 という数値を付与することでアニメーションのない画像を表示できます。
 *   例: <animeLight:TMAnimeLight1 192 0 0 4 1>
 *   この場合Ｚ座標を省略することはできません。
 *
 *
 * プラグインパラメータ補足:
 *
 *   defaultZ
 *     明かりの描画順を設定します、これによりイベントよりも下に表示するか
 *     上に表示するかが決まります。
 *     0 … プライオリティ『通常キャラの下』より下
 *     2 … プライオリティ『通常キャラと同じ』より下
 *     4 … プライオリティ『通常キャラと同じ』より上
 *     6 … プライオリティ『通常キャラの上』より上
 */

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

var TMPlugin = TMPlugin || {};
TMPlugin.AnimeLight = {};
TMPlugin.AnimeLight.Parameters = PluginManager.parameters('TMAnimeLight');
TMPlugin.AnimeLight.Range = +(TMPlugin.AnimeLight.Parameters['range'] || 0.1);
TMPlugin.AnimeLight.DefaultZ = +(TMPlugin.AnimeLight.Parameters['defaultZ'] || 4);
TMPlugin.AnimeLight.Frames = +(TMPlugin.AnimeLight.Parameters['frames'] || 30);

if (!TMPlugin.EventBase) {
  TMPlugin.EventBase = true;
  (function() {

    var _Game_Event_setupPage = Game_Event.prototype.setupPage;
    Game_Event.prototype.setupPage = function() {
      _Game_Event_setupPage.call(this);
      if (this._pageIndex >= 0) this.loadCommentParams();
    };

    Game_Event.prototype.loadCommentParams = function() {
      this._commentParams = {};
      var re = /<([^<>:]+)(:?)([^>]*)>/g;
      var list = this.list();
      for (var i = 0; i < list.length; i++) {
        var command = list[i];
        if (command && command.code == 108 || command.code == 408) {
          for (;;) {
            var match = re.exec(command.parameters[0]);
            if (match) {
              this._commentParams[match[1]] = match[2] === ':' ? match[3] : true;
            } else {
              break;
            }
          }
        } else {
          break;
        }
      }
    };

    Game_Event.prototype.loadTagParam = function(paramName) {
      return this._commentParams[paramName] || this.event().meta[paramName];
    };

  })();
} // TMPlugin.EventBase

if (!TMPlugin.InterpreterBase) {
  TMPlugin.InterpreterBase = true;
  (function() {

    Game_Interpreter.prototype.convertEscapeCharactersTM = function(text) {
      text = text.replace(/\\/g, '\x1b');
      text = text.replace(/\x1b\x1b/g, '\\');
      text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
        return $gameVariables.value(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
        return $gameVariables.value(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bN\[(\d+)\]/gi, function() {
        return this.actorNameTM(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bP\[(\d+)\]/gi, function() {
        return this.partyMemberNameTM(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
      return text;
    };

    Game_Interpreter.prototype.actorNameTM = function(n) {
      var actor = n >= 1 ? $gameActors.actor(n) : null;
      return actor ? actor.name() : '';
    };

    Game_Interpreter.prototype.partyMemberNameTM = function(n) {
      var actor = n >= 1 ? $gameParty.members()[n - 1] : null;
      return actor ? actor.name() : '';
    };

  })();
} // TMPlugin.InterpreterBase

(function() {

  //-----------------------------------------------------------------------------
  // Game_Temp
  //

  var _Game_Temp_initialize = Game_Temp.prototype.initialize;
  Game_Temp.prototype.initialize = function() {
    _Game_Temp_initialize.call(this);
    this.createAnimeLightSinTable();
  };

  Game_Temp.prototype.createAnimeLightSinTable = function() {
    this._animeLightSinTable = [];
    for (var i = 0; i < TMPlugin.AnimeLight.Frames; i++) {
      this._animeLightSinTable[i] = Math.sin(Math.PI * i / (TMPlugin.AnimeLight.Frames / 2)) *
                                    TMPlugin.AnimeLight.Range + 1;
    }
  };

  Game_Temp.prototype.animeLightSin = function(index) {
    return this._animeLightSinTable[index];
  };

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

  Game_CharacterBase.prototype.requestAnimeLight = function() {
    this._requestAnimeLight = true;
  };

  Game_CharacterBase.prototype.onChangeAnimeLight = function() {
    this._requestAnimeLight = false;
  };

  Game_CharacterBase.prototype.isAnimeLightRequested = function() {
    return this._requestAnimeLight;
  };

  //-----------------------------------------------------------------------------
  // Game_Event
  //

  var _Game_Event_setupPage = Game_Event.prototype.setupPage;
  Game_Event.prototype.setupPage = function() {
    _Game_Event_setupPage.call(this);
    if (this._pageIndex >= 0) {
      var animeLight = this.loadTagParam('animeLight');
      if (animeLight) {
        var arr = animeLight.split(' ');
        this._animeLight = arr[0];
        this._animeLightOpacity = arr[1] || 255;
        this._animeLightShiftX  = arr[2] || 0;
        this._animeLightShiftY  = arr[3] || 0;
        this._animeLightZ       = arr[4] || TMPlugin.AnimeLight.DefaultZ;
        this._animeLightNone    = arr[5] === '1';
      }
    } else {
      this._animeLight = '';
      this._animeLightOpacity = 255;
      this._animeLightShiftX = 0;
      this._animeLightShiftY = 0;
      this._animeLightZ = TMPlugin.AnimeLight.DefaultZ;
      this._animeLightNone = false;
    }
    this.requestAnimeLight();
  };

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

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'animeLight') {
      var arr = args.map(this.convertEscapeCharactersTM, this);
      var character = this.character(+arr[0]);
      if (character) {
        character._animeLight = arr[1];
        character._animeLightOpacity = arr[2] || 255;
        character._animeLightShiftX  = arr[3] || 0;
        character._animeLightShiftY  = arr[4] || 0;
        character._animeLightZ       = arr[5] || TMPlugin.AnimeLight.DefaultZ;
        character._animeLightNone    = arr[6] === '1';
        character.requestAnimeLight();
      }
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_Character
  //

  var _Sprite_Character_update = Sprite_Character.prototype.update;
  Sprite_Character.prototype.update = function() {
    _Sprite_Character_update.call(this);
    this.updateAnimeLight();
  };

  Sprite_Character.prototype.updateAnimeLight = function() {
    if (this._character.isAnimeLightRequested() ||
        this._animeLight !== this._character._animeLight) {
      this._character.onChangeAnimeLight();
      this._animeLight = this._character._animeLight;
      if (this._animeLight) {
        if (!this._animeLightSprite) {
          this._animeLightSprite = new Sprite_AnimeLight(this);
          this.parent.addChild(this._animeLightSprite);
        }
        this._animeLightSprite.refresh(this._animeLight);
      } else {
        this.parent.removeChild(this._animeLightSprite);
        this._animeLightSprite = null;
      }
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_AnimeLight
  //

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

  Sprite_AnimeLight.prototype = Object.create(Sprite.prototype);
  Sprite_AnimeLight.prototype.constructor = Sprite_AnimeLight;

  Sprite_AnimeLight.prototype.initialize = function(characterSprite) {
    Sprite.prototype.initialize.call(this);
    this._characterSprite = characterSprite;
    this.anchor.x = 0.5;
    this.anchor.y = 0.5;
    this.blendMode = 1;
    this._animeCount = 0;
  };

  Sprite_AnimeLight.prototype.update = function() {
    Sprite.prototype.update.call(this);
    this.x = this._characterSprite.x + this._shiftX;
    this.y = this._characterSprite.y + this._shiftY;
    if (!this._characterSprite._character._animeLightNone) {
      this._animeCount++;
      if (this._animeCount === TMPlugin.AnimeLight.Frames) this._animeCount = 0;
      var n = $gameTemp.animeLightSin(this._animeCount);
      this.scale.set(n, n);
    }
  };

  Sprite_AnimeLight.prototype.refresh = function(fileName) {
    this.bitmap = ImageManager.loadSystem(fileName);
    this.opacity = +this._characterSprite._character._animeLightOpacity;
    this._shiftX = +this._characterSprite._character._animeLightShiftX;
    this._shiftY = +this._characterSprite._character._animeLightShiftY;
    this.x = this._characterSprite.x + this._shiftX;
    this.y = this._characterSprite.y + this._shiftY;
    this.z = +this._characterSprite._character._animeLightZ;
  };

})();


code:
//=============================================================================
// TMVplugin - フキダシループ
// 作者: tomoaky (http://hikimoki.sakura.ne.jp/)
// Version: 1.11
// 最終更新日: 2016/06/20
//=============================================================================

/*:
 * @plugindesc フキダシアイコンをループ表示させます。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @help
 * 使い方:
 *   プラグインコマンドまたはメモ欄タグを使ってイベントにフキダシループを設
 *   定すると、指定されたフキダシアイコンが繰り返し表示され続けるようになり
 *   ます。
 *
 *   イベントのメモ欄以外に、実行内容の一番上にある注釈コマンド内でも同様の
 *   タグでフキダシループを設定することができます。メモ欄と注釈の両方にタグ
 *   がある場合は注釈が優先されます。
 *
 *   プラグインコマンドによるフキダシループは、イベントページの切り替わりや
 *   イベントコマンド『イベントの一時消去』などによって解除されます。
 *
 * プラグインコマンド:
 *   setBalloonLoop 2 1
 *   ２番のイベントにフキダシループとしてびっくりアイコンを設定します。イベ
 *   ント番号は -1 ならプレイヤー、0 ならコマンドを実行しているイベントが対
 *   象となります。
 *   表示するアイコンの番号はイベントコマンド『フキダシアイコンの表示』での
 *   並びに対応していて、0 を指定するとフキダシループが解除されます。
 *
 * メモ欄タグ（イベント）:
 *   <balloonLoop:1>
 *   このタグがついているイベントは setBalloonLoop を実行しなくても自動的に
 *   フキダシループが設定されます。数値は表示するアイコン番号です。
 *
 */

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

if (!Imported.TMEventBase) {
  Imported.TMEventBase = true;
  (function() {

    //-----------------------------------------------------------------------------
    // Game_Event
    //

    var _Game_Event_setupPage = Game_Event.prototype.setupPage;
    Game_Event.prototype.setupPage = function() {
      _Game_Event_setupPage.call(this);
      if (this._pageIndex >= 0) {
        this.loadCommentParams();
      }
    };

    Game_Event.prototype.loadCommentParams = function() {
      this._commentParams = {};
      var re = /<([^<>:]+)(:?)([^>]*)>/g;
      var list = this.list();
      for (var i = 0; i < list.length; i++) {
        var command = list[i];
        if (command && command.code == 108 || command.code == 408) {
          for (;;) {
            var match = re.exec(command.parameters[0]);
            if (match) {
              if (match[2] === ':') {
                this._commentParams[match[1]] = match[3];
              } else {
                this._commentParams[match[1]] = true;
              }
            } else {
              break;
            }
          }
        } else {
          break;
        }
      }
    };

    Game_Event.prototype.loadTagParam = function(paramName) {
      if (this._commentParams[paramName]) {
        return this._commentParams[paramName];
      } else if (this.event().meta[paramName]) {
        return this.event().meta[paramName];
      } else {
        return null;
      }
    };

  })();
}

(function() {

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

  var _Game_CharacterBase_endBalloon = Game_CharacterBase.prototype.endBalloon;
  Game_CharacterBase.prototype.endBalloon = function() {
    _Game_CharacterBase_endBalloon.call(this);
    var balloonLoop = this.balloonLoop();
    if (balloonLoop) {
      this.requestBalloon(balloonLoop);
    }
  };

  Game_CharacterBase.prototype.setBalloonLoop = function(balloonLoop) {
    this._balloonLoop = balloonLoop;
  };

  Game_CharacterBase.prototype.balloonLoop = function() {
    return this._balloonLoop;
  };

  //-----------------------------------------------------------------------------
  // Game_Event
  //

  var _Game_Event_setupPage = Game_Event.prototype.setupPage;
  Game_Event.prototype.setupPage = function() {
    _Game_Event_setupPage.call(this);
    if (this._pageIndex >= 0) {
      var balloonLoop = +this.loadTagParam('balloonLoop');
      if (balloonLoop) {
        this.setBalloonLoop(balloonLoop);
      }
    } else {
      this.setBalloonLoop(0);
    }
  };

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

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'setBalloonLoop') {
      var character = this.character(+args[0]);
      if (character) {
        character.setBalloonLoop(+args[1]);
      }
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_Character
  //

  var _Sprite_Character_endBalloon = Sprite_Character.prototype.endBalloon;
  Sprite_Character.prototype.endBalloon = function() {
    var balloonLoop = this._character.balloonLoop();
    if (balloonLoop) {
      this._balloonSprite.setup(balloonLoop);
    } else {
      _Sprite_Character_endBalloon.call(this);
    }
  };

})();


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 mistImage
 * @desc 霧として利用する画像ファイル名。
 * 初期値: mist
 * @default mist
 * @require 1
 * @dir img/system/
 * @type file
 *
 * @param mistNumber
 * @desc 表示する霧スプライトの数です。
 * 初期値: 32
 * @default 32
 *
 * @param mistTopSide
 * @desc サイドビューで霧を表示する範囲の上端の座標。
 * 初期値: 200
 * @default 200
 *
 * @param mistRangeSide
 * @desc サイドビューで霧を表示するＹ方向の範囲。
 * 初期値: 300
 * @default 300
 *
 * @param mistTopFront
 * @desc フロントビューで霧を表示する範囲の上端の座標。
 * 初期値: 240
 * @default 240
 *
 * @param mistRangeFront
 * @desc フロントビューで霧を表示するＹ方向の範囲。
 * 初期値: 340
 * @default 340
 *
 * @param mistScale
 * @desc 霧スプライトの拡大率。
 * 初期値: 1
 * @default 1
 *
 * @param mistOpacityMax
 * @desc 霧スプライトの最大不透明度。
 * 初期値: 224
 * @default 224
 *
 * @help
 * 準備:
 *
 *   プラグインと一緒に配布している霧の画像を img/system フォルダに
 *   保存してください。ファイル名は mist.png となっています。
 *   ファイル名を変更しなければならない場合はプラグインパラメータの
 *   mistImage も一緒に変更してください。
 *
 *
 * 使い方:
 *
 *   ゲーム画面の解像度 816*624 に合わせてあるため、解像度を変更すると
 *   表示が乱れる場合があります。
 *   プラグインパラメータの値をいじって調整してください。
 *
 *   このプラグインは RPGツクールMV Version 1.3.0 で動作確認をしています。
 *
 *
 * プラグインコマンド:
 *
 *   stopMist
 *     バトルミストを無効にします。この設定はセーブデータにも記録され、
 *     startMist コマンドが実行されるまで霧が表示されなくなります。
 *
 *   startMist
 *     無効になっているバトルミストを有効にします。
 *
 *   onMistMirror
 *     霧の移動方向を反転します。サイドビュー限定の機能です。この設定は
 *     セーブデータにも記録され、offMistMirror コマンドが実行されるまで
 *     反転したままとなります。
 *
 *   offMistMirror
 *     霧の移動方向反転を解除します。サイドビュー限定の機能です。
 */

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

var TMPlugin = TMPlugin || {};
TMPlugin.BattleMist = {};
TMPlugin.BattleMist.Parameters = PluginManager.parameters('TMBattleMist');
TMPlugin.BattleMist.MistImage = TMPlugin.BattleMist.Parameters['mistImage'] || 'mist';
TMPlugin.BattleMist.MaxMists = +(TMPlugin.BattleMist.Parameters['mistNumber'] || 32);
TMPlugin.BattleMist.TopSide = +(TMPlugin.BattleMist.Parameters['mistTopSide'] || 200);
TMPlugin.BattleMist.RangeSide = +(TMPlugin.BattleMist.Parameters['mistRangeSide'] || 300);
TMPlugin.BattleMist.TopFront = +(TMPlugin.BattleMist.Parameters['mistTopFront'] || 240);
TMPlugin.BattleMist.RangeFront = +(TMPlugin.BattleMist.Parameters['mistRangeFront'] || 340);
TMPlugin.BattleMist.Scale = +(TMPlugin.BattleMist.Parameters['mistScale'] || 1);
TMPlugin.BattleMist.OpacityMax = +(TMPlugin.BattleMist.Parameters['mistOpacityMax'] || 224);

(function() {

  //-----------------------------------------------------------------------------
  // Game_System
  //

  Game_System.prototype.isMistEnabled = function() {
    if (this._mistEnabled === undefined) this._mistEnabled = true;
    return this._mistEnabled;
  };

  Game_System.prototype.disableMist = function() {
    this._mistEnabled = false;
  };

  Game_System.prototype.enableMist = function() {
    this._mistEnabled = true;
  };

  Game_System.prototype.mistMirror = function() {
    return this._mistMirror;
  };

  Game_System.prototype.setMistMirror = function(mirror) {
    this._mistMirror = mirror;
  };

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

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'startMist') {
      $gameSystem.enableMist();
    } else if (command === 'stopMist') {
      $gameSystem.disableMist();
    } else if (command === 'onMistMirror') {
      $gameSystem.setMistMirror(true);
    } else if (command === 'offMistMirror') {
      $gameSystem.setMistMirror(false);
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_BattleMist
  //

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

  Sprite_BattleMist.prototype = Object.create(Sprite.prototype);
  Sprite_BattleMist.prototype.constructor = Sprite_BattleMist;

  Sprite_BattleMist.prototype.initialize = function() {
    Sprite.prototype.initialize.call(this);
    this.loadBitmap();
    this.blendMode = 1;
    this.z = 5;
    this.anchor.x = 0.5;
    this.anchor.y = 1;
  };

  Sprite_BattleMist.prototype.loadBitmap = function() {
    this.bitmap = ImageManager.loadSystem(TMPlugin.BattleMist.MistImage);
  };

  Sprite_BattleMist.prototype.setRandomPosition = function() {
    if ($gameSystem.isSideView()) {
      this.resetSideView();
      var w = this.width * this.scale.x;
      this.x = Math.random() * (Graphics.width + w) - w / 2 - this.parent.x;
    } else {
      this.resetFrontView();
      this.y = Math.random() * TMPlugin.BattleMist.RangeFront + TMPlugin.BattleMist.TopFront;
    }
    this.update();
  };

  Sprite_BattleMist.prototype.resetSideView = function() {
    var r = Math.random();
    this._count = Math.floor(Math.random() * 180);
    this.y = r * TMPlugin.BattleMist.RangeSide + TMPlugin.BattleMist.TopSide;
    r = (r + 0.5) * TMPlugin.BattleMist.Scale;
    this.scale.set(r, r);
    this._vx = this.scale.x * 2 - 0.5;
    if ($gameSystem.mistMirror()) {
      this.x = Graphics.width + this.width / 2 * this.scale.x;
      this._vx = 0 - this._vx;
    } else {
      this.x = -this.width / 2 * this.scale.x;
    }
    this.x -= this.parent.x;
  };

  Sprite_BattleMist.prototype.resetFrontView = function() {
    var r = Math.random();
    this.x = r * Graphics.width;
    this.y = TMPlugin.BattleMist.TopFront;
    this._vx = (this.x - Graphics.width / 2) * 0.01;
    this.x -= this.parent.x;
  };

  Sprite_BattleMist.prototype.update = function() {
    Sprite.prototype.update.call(this);
    if ($gameSystem.isSideView()) {
      this.updateSideView();
    } else {
      this.updateFrontView();
    }
  };

  Sprite_BattleMist.prototype.updateSideView = function() {
    this.x += this._vx;
    this._count++;
    if (this._count >= 180) this._count = 0;
    this.opacity = TMPlugin.BattleMist.OpacityMax - 16 + Math.sin(this._count * Math.PI / 90) * 16;
    if ($gameSystem.mistMirror()) {
      if (this.x + this.width / 2 * this.scale.x < 0 - this.parent.x) {
        this.resetSideView();
      }
    } else {
      if (this.x - this.width / 2 * this.scale.x > Graphics.width - this.parent.x) {
        this.resetSideView();
      }
    }
  };

  Sprite_BattleMist.prototype.updateFrontView = function() {
    this.x += this._vx;
    this.y += TMPlugin.BattleMist.Scale;
    var w = this.width / 2;
    if (this.y > TMPlugin.BattleMist.RangeFront + TMPlugin.BattleMist.TopFront ||
        this.x < 0 - w - this.parent.x || this.x > Graphics.width + w - this.parent.x) {
      this.resetFrontView();
    }
    this.updateScaleFront();
    this.updateOpacityFront();
  };

  Sprite_BattleMist.prototype.updateScaleFront = function() {
    var r = (0.5 + (this.y - TMPlugin.BattleMist.TopFront) / TMPlugin.BattleMist.RangeFront) *
            TMPlugin.BattleMist.Scale;
    this.scale.set(r, r);
  };

  Sprite_BattleMist.prototype.updateOpacityFront = function() {
    var borderY = TMPlugin.BattleMist.TopFront + TMPlugin.BattleMist.RangeFront * 0.8;
    if (this.y > borderY) {
      this.opacity = (1 - (this.y - borderY) / (TMPlugin.BattleMist.RangeFront * 0.2)) *
                     TMPlugin.BattleMist.OpacityMax;
    } else {
      this.opacity = Math.min((this.y - TMPlugin.BattleMist.TopFront) / TMPlugin.BattleMist.Scale * 8,
                              TMPlugin.BattleMist.OpacityMax);
    }
  };

  //-----------------------------------------------------------------------------
  // Spriteset_Battle
  //

  var _Spriteset_Battle_createLowerLayer = Spriteset_Battle.prototype.createLowerLayer;
  Spriteset_Battle.prototype.createLowerLayer = function() {
    _Spriteset_Battle_createLowerLayer.call(this);
    this.createMists();
    this._back1Sprite.z = 0;
    this._back2Sprite.z = 1;
    for (var i = 0; i < this._enemySprites.length; i++) {
      this._enemySprites[i].z = 5;
    }
    this.updateActors();
    for (var j = 0; j < this._actorSprites.length; j++) {
      this._actorSprites[j].z = 5;
    }
  };

  Spriteset_Battle.prototype.createMists = function() {
    this._mistSprites = [];
    if ($gameSystem.isMistEnabled()) {
      for (var i = 0; i < TMPlugin.BattleMist.MaxMists; i++) {
        this._mistSprites[i] = new Sprite_BattleMist();
        this._battleField.addChild(this._mistSprites[i]);
        this._mistSprites[i].setRandomPosition();
      }
    }
  };

  var _Spriteset_Battle_update = Spriteset_Battle.prototype.update;
  Spriteset_Battle.prototype.update = function() {
    _Spriteset_Battle_update.call(this);
    this._sortBattleField();
  };

  Spriteset_Battle.prototype._sortBattleField = function() {
    this._battleField.children.sort(function(a, b) {
      a.z = a.z != null ? a.z : 10;
      b.z = b.z != null ? b.z : 10;
      if (a.z !== b.z) {
        return a.z - b.z;
      } else if (a.y !== b.y) {
        return a.y - b.y;
      } else {
        return a.spriteId - b.spriteId;
      }
    });
  };

})();


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
//
//追加修正 dorgel
//
//=============================================================================

/*:
 * @plugindesc エネミーに遠近感や息づかいの表現を追加します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param baseY
 * @desc 拡大率が等倍になるＹ座標。
 * 初期値: 400
 * @default 400
 *
 * @param breathH
 * @desc 息づかいの大きさ。
 * 初期値: 0.05
 * @default 0.05
 *
 * @param mirrorRate
 * @desc 左右反転の確率。
 * 初期値: 0.4（ 0 ～ 1 ）
 * @default 0.4
 *
 * @param breathStop
 * @desc 行動不能時に息づかいを止める。
 * 初期値: 1（ 0 で無効 / 1 で有効 ）
 * @default 1
 *
 * @param shakeEffect
 * @desc 点滅エフェクトを揺れエフェクトに差し替える。
 * 初期値: 1（ 0 で無効 / 1 で有効 ）
 * @default 1

 * @param EmpY
 * @desc 遠近感の強調
 * 初期値: 1
 * @default 1
 *
 * @help
 * 使い方:
 *
 *   このプラグインを導入すると、敵キャラの表示に以下の演出が追加されます。
 *     ・画面の上の方に出現する敵が小さく表示される（遠近感）
 *     ・ゆっくりと拡大縮小を繰り返す（息づかい）
 *     ・ランダムに左右が反転する
 *
 *   サイドビューでは左右反転が無効になります。
 *   敵キャラのメモ欄にタグを書き込むことで、敵キャラごとに演出の強弱を
 *   設定することができます。
 *
 *   プラグインコマンドはありません。
 *
 *   このプラグインは RPGツクールMV Version 1.3.0 で動作確認をしています。
 *
 *
 * メモ欄（敵キャラ）タグ:
 *
 *   <chkXPstyle:1>
 *     XPスタイルバトルと併用のため敵バトラー判定用。敵には必ずこのタグを挿入する。
 *
 *   <breathH:0.05>
 *     息づかいの大きさを個別に設定します。
 *
 *   <noMirror>
 *     左右反転を禁止します。
 */

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

var TMPlugin = TMPlugin || {};
TMPlugin.BattlerEx = {};
TMPlugin.BattlerEx.Parameters = PluginManager.parameters('TMBattlerEx');
TMPlugin.BattlerEx.BaseY = +(TMPlugin.BattlerEx.Parameters['baseY'] || 400);
TMPlugin.BattlerEx.BreathH = +(TMPlugin.BattlerEx.Parameters['breathH'] || 0.05);
TMPlugin.BattlerEx.MirrorRate = +(TMPlugin.BattlerEx.Parameters['mirrorRate'] || 0.4);
TMPlugin.BattlerEx.BreathStop = TMPlugin.BattlerEx.Parameters['breathStop'] === '1';
TMPlugin.BattlerEx.ShakeEffect = TMPlugin.BattlerEx.Parameters['shakeEffect'] === '1';
TMPlugin.BattlerEx.EmpY = +(TMPlugin.BattlerEx.Parameters['EmpY'] || 1);

(function() {

  //-----------------------------------------------------------------------------
  // Sprite_Enemy
  //

  var _Sprite_Enemy_initialize = Sprite_Enemy.prototype.initialize;
  Sprite_Enemy.prototype.initialize = function(battler) {
    _Sprite_Enemy_initialize.call(this, battler);
	var empsY = TMPlugin.BattlerEx.BaseY - (TMPlugin.BattlerEx.BaseY - this.y)*TMPlugin.BattlerEx.EmpY
	//console.log(battler.enemy().meta.scale)
	if (battler.enemy().meta.chkXPstyle == 1){
        var r = +(empsY / (TMPlugin.BattlerEx.BaseY * 2) + 0.5);
	} else {
        var r = +1;
	}
    this._baseScale = new Point(r, r);
    if (!$gameSystem.isSideView() && Math.random() < TMPlugin.BattlerEx.MirrorRate &&
        !battler.enemy().meta.noMirror) {
      this._baseScale.x = 0 - r;
      this._stateIconSprite.scale.x = -1;
    }
    this._breathMax = Math.randomInt(90) + 90;
    this._breathCount = Math.randomInt(this._breathMax);
  };

  var _Sprite_Enemy_update = Sprite_Enemy.prototype.update;
  Sprite_Enemy.prototype.update = function() {
    _Sprite_Enemy_update.call(this);
    this.updateScaleEx();
  };

  Sprite_Enemy.prototype.updateScaleEx = function() {
    if (TMPlugin.BattlerEx.BreathStop && !this._enemy.canMove()) return;
    this._breathCount++;
    if (this._breathCount >= this._breathMax) {
      this._breathMax = Math.randomInt(90) + 90;
      this._breathCount = 0;
    }
    var scaleX = this._baseScale.x;
    var scaleY = this._baseScale.y;

	if (this._enemy.enemy().meta.chkXPstyle == 1){
        var bh = +TMPlugin.BattlerEx.BreathH;
	} else {
         var bh = 0;
	}

    //var bh = +(this._enemy.enemy().meta.breathH || TMPlugin.BattlerEx.BreathH);
    scaleY += Math.sin(Math.PI * this._breathCount / (this._breathMax / 2)) * bh;
    this.scale.set(scaleX, scaleY);
  };

  var _Sprite_Enemy_updateBlink = Sprite_Enemy.prototype.updateBlink;
  Sprite_Enemy.prototype.updateBlink = function() {
    if (TMPlugin.BattlerEx.ShakeEffect) {
      var ed = this._effectDuration;
      this.rotation = ed % 4 < 2 ? ed / 200 : 0 - ed / 200;
    } else {
      _Sprite_Enemy_updateBlink.call(this);
    }
  };

})();


code:
//=============================================================================
// TMPlugin - 欲張りショップ
// バージョン: 2.2.0
// 最終更新日: 2018/07/17
// 配布元    : 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 materialWindowPosition
 * @type select
 * @option 商品名の下
 * @value 0
 * @option 商品名の右
 * @value 1
 * @option 購入ウィンドウの下
 * @value 2
 * @desc 素材ウィンドウの表示位置
 * @default 0
 *
 * @param materialWindowWidth
 * @type number
 * @desc 素材ウィンドウの幅
 * 初期値: 408
 * @default 408
 *
 * @param buyWindowWidth
 * @type number
 * @desc 購入ウィンドウの幅
 * 初期値: 456
 * @default 456
 *
 * @param buyWindowHeight
 * @type number
 * @desc 購入ウィンドウの高さ
 * 0なら自動で決定
 * @default 0
 *
 * @param materialMax
 * @type number
 * @desc 設定できる素材の最大数。
 * 初期値: 5
 * @default 5
 *
 * @param fontRate
 * @type number
 * @decimals 2
 * @desc 素材情報のフォント倍率
 * @default 0.8
 *
 * @param greedCommand
 * @desc 欲張りショップの購入コマンド名。
 * 初期値: 購入する
 * @default 購入する
 *
 * @param needText
 * @desc 素材一覧のトップに表示するテキスト
 * ( 何も設定しなければ省略 )
 * @default 必要なもの
 *
 * @param showSellCommand
 * @type boolean
 * @desc 購入のみの場合にも売却コマンドを表示する。
 * @default true
 *
 * @param showMaterialWindow
 * @type boolean
 * @desc 素材ウィンドウを表示する。
 * @default true
 *
 * @param overlaid
 * @type boolean
 * @desc 素材ウィンドウを他のウィンドウと違うレイヤーに表示する。
 * 四隅が欠ける問題は解決しますが、可読性は低下します。
 * @default true
 *
 * @param backOpacity
 * @type number
 * @desc 素材ウィンドウの背景の不透明度
 * @default 192
 *
 * @param showMaterialFromNumberWindow
 * @type boolean
 * @desc 個数選択ウィンドウに素材情報を表示する。
 * @default true
 *
 * @param showPrice
 * @type boolean
 * @desc 商品ウィンドウに価格を表示する。
 * @default true
 *
 * @param seGreedBuy
 * @type struct<SoundEffect>
 * @desc 欲張りショップで購入時に鳴らす効果音
 * @default {"name":"Shop1","volume":"90","pitch":"100","pan":"0"}
 *
 * @help
 * TMPlugin - 欲張りショップ ver2.2.0
 *
 * 使い方:
 *
 *   アイテム、武器、防具にメモ欄タグ（後述）を使って素材を設定します。
 *
 *   イベントコマンド『プラグインコマンド』で greedShop を実行し、
 *   直後にイベントコマンド『ショップの処理』で、素材を設定したアイテムを
 *   商品として販売してください。
 *
 *   このプラグインは RPGツクールMV Version 1.6.1 で動作確認をしています。
 *
 *
 * プラグインコマンド:
 *
 *   greedShop
 *     このコマンドが実行された直後にショップの処理を
 *     実行することで欲張りショップになります。
 *
 *   greedCommand 買っちゃう
 *     欲張りショップの購入コマンド名を『買っちゃう』に変更します。
 *     この変更はセーブデータには保存されません。
 *
 *
 * メモ欄タグ（アイテム、武器、防具）:
 *
 *   <mat1:I1*3>
 *     お金以外にアイテム１番が３個必要になります。
 *     mat2, mat3... と素材を追加していくことができます。
 *     I の部分が W なら武器、A なら防具になります。
 *
 *   <matKey:1>
 *     mat1 タグに設定されている素材をキー素材として扱います。
 *     キー素材を所持していない場合、商品リストから除外されます。
 *     <matKey:1 2> というように半角スペースで区切り、複数のキー素材を
 *     設定することもできます。（この場合、mat1 と mat2 がキー素材になる）
 *     このタグを使うことで、レシピを所持していないと
 *     ショップに並ばない商品などを表現することができます。
 *
 *   <matG:50>
 *     価格を50に設定します、この設定は欲張りショップが
 *     有効になっている場合にのみ購入価格として反映されます。
 *
 *
 * メモ欄タグ（武器、防具）:
 *
 *   <noConsume>
 *     このタグを指定した武器、防具は素材として設定しても
 *     消費されなくなります。
 *
 *     消耗設定が『しない』になっているアイテムを素材にした場合、
 *     消耗しないが必要なものとして機能します。
 */
/*~struct~SoundEffect:
 *
 * @param name
 * @type file
 * @dir audio/se/
 * @desc 効果音のファイル名
 * @default
 * @require 1
 *
 * @param volume
 * @type number
 * @max 100
 * @desc 効果音の音量
 * 初期値: 90
 * @default 90
 *
 * @param pitch
 * @type number
 * @min 50
 * @max 150
 * @desc 効果音のピッチ
 * 初期値: 100
 * @default 100
 *
 * @param pan
 * @type number
 * @min -100
 * @max 100
 * @desc 効果音の位相
 * 初期値: 0
 * @default 0
 *
 */

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

(function() {

  var parameters = PluginManager.parameters('TMGreedShop');
  var materialWindowPosition = +(parameters['materialWindowPosition'] || 0);
  var materialWindowWidth = +(parameters['materialWindowWidth'] || 408);
  var buyWindowWidth = +(parameters['buyWindowWidth'] || 456);
  var buyWindowHeight = +(parameters['buyWindowHeight'] || 0);
  var materialMax = +(parameters['materialMax'] || 5);
  var fontRate = +(parameters['fontRate'] || 0.8);
  var greedCommand = parameters['greedCommand'] || '購入する';
  var needText = parameters['needText'] || '';
  var showSellCommand = JSON.parse(parameters['showSellCommand'] || 'true');
  var showMaterialWindow = JSON.parse(parameters['showMaterialWindow'] || 'true');
  var overlaid = JSON.parse(parameters['overlaid'] || 'true');
  var backOpacity = +(parameters['backOpacity'] || 192);
  var showMaterialFromNumberWindow = JSON.parse(parameters['showMaterialFromNumberWindow'] || 'true');
  var showPrice = JSON.parse(parameters['showPrice'] || 'true');
  var seGreedBuy = JSON.parse(parameters['seGreedBuy'] || '{}');

  //-----------------------------------------------------------------------------
  // DataManager
  //

  DataManager.getGreedShopMaterials = function(item) {
    result = [];
    if (item) {
      var re = /(i|w|a)(\d+)\*(\d+)/i;
      for (var i = 1; i <= materialMax; i++) {
        var key = 'mat' + i;
        if (item.meta[key]) {
          var match = re.exec(item.meta[key]);
          if (match) {
            var material = {};
            material.type = match[1];
            material.id   = +match[2];
            material.need = +match[3];
            result.push(material);
          }
        }
      }
    }
    return result;
  };

  DataManager.materialToItem = function(material) {
    var type = material.type.toUpperCase();
    if (type === 'I') {
      return $dataItems[material.id];
    } else if (type === 'W') {
      return $dataWeapons[material.id];
    } else if (type === 'A') {
      return $dataArmors[material.id];
    }
    return null;
  };

  DataManager.isConsumableMaterial = function(item) {
    return item.consumable || (!this.isItem(item) && !item.meta.noConsume);
  };

  //-----------------------------------------------------------------------------
  // Game_Temp
  //

  Game_Temp.prototype.setGreedShop = function(flag) {
    this._greedShop = flag;
  };

  Game_Temp.prototype.isGreedShop = function() {
    return this._greedShop;
  };

  Game_Temp.prototype.setGreedCommand = function(text) {
    this._greedCommand = text;
  };

  Game_Temp.prototype.greedCommand = function() {
    return this._greedCommand || greedCommand;
  };

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

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'greedShop') {
      $gameTemp.setGreedShop(true);
    } else if (command === 'greedCommand') {
      $gameTemp.setGreedCommand(args[0]);
    }
  };

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

  // 素材リストの描画
  Window_Base.prototype.drawGreedMaterials = function(x, y, item, amount, rate) {
    var materials = DataManager.getGreedShopMaterials(item);
    this.resetFontSettings();
    this.contents.fontSize = Math.floor(this.contents.fontSize * rate);
    if (needText) {
      y = this.drawGreedNeedText(y, rate);
    }
    for (var i = 0; i < materials.length; i++) {
      y = this.drawGreedMaterial(x, y, materials[i], amount, rate);
    }
    if (this._price) {
      this.drawGreedPrice(y, amount, rate);
    }
    this.resetFontSettings();
  };

  // 素材リストの見出し（初期設定：必要なもの）描画
  Window_Base.prototype.drawGreedNeedText = function(y, rate) {
    var lh = Math.floor(this.lineHeight() * rate);
    this.changeTextColor(this.systemColor());
    this.contents.drawText(needText, 0, y, this.contents.width, lh, 'center');
    return y + lh;
  };

  // 素材の描画
  Window_Base.prototype.drawGreedMaterial = function(x, y, material, amount, rate) {
    var x2 = x + Math.floor((Window_Base._iconWidth + 4) * rate);
    var lh = Math.floor(this.lineHeight() * rate);
    var materialItem = DataManager.materialToItem(material);
    var need = material.need * amount;
    var n = $gameParty.numItems(materialItem);
    var text = DataManager.isConsumableMaterial(materialItem) ? '' + n + '/' : '--/';
    text += ('   ' + need).substr(-3);
    this.drawStretchIcon(x, y, materialItem.iconIndex, rate);
    this.changeTextColor(this.normalColor());
    this.contents.drawText(materialItem.name, x2, y, 312, lh);
    this.contents.drawText(text, x, y, this.contents.width - this.textPadding(), lh, 'right');
    return y + lh;
  };

  // 拡大率を指定したアイコン描画
  Window_Base.prototype.drawStretchIcon = function(x, y, index, rate) {
    var bitmap = ImageManager.loadSystem('IconSet');
    var pw = Window_Base._iconWidth;
    var ph = Window_Base._iconHeight;
    var sx = index % 16 * pw;
    var sy = Math.floor(index / 16) * ph;
    var dw = Math.floor(pw * rate);
    var dh = Math.floor(ph * rate);
    this.contents.blt(bitmap, sx, sy, pw, ph, x, y, dw, dh);
  };

  // 価格の描画
  Window_Base.prototype.drawGreedPrice = function(y, amount, rate) {
    var x = this.textPadding();
    var lh = Math.floor(this.lineHeight() * rate);
    var width = this.contents.width - x * 2;
    var unitWidth = Math.min(80, this.textWidth(TextManager.currencyUnit));
    this.resetTextColor();
    this.contents.drawText(this._price * amount, x, y, width - unitWidth - 6, lh, 'right');
    this.changeTextColor(this.systemColor());
    this.contents.drawText(TextManager.currencyUnit, x + width - unitWidth, y, unitWidth, lh, 'right');
  };

  //-----------------------------------------------------------------------------
  // Window_ShopCommand
  //

  // 売却コマンドを表示するかどうかで列数を変更する
  var _Window_ShopCommand_maxCols = Window_ShopCommand.prototype.maxCols;
  Window_ShopCommand.prototype.maxCols = function() {
    return (showSellCommand || !this._purchaseOnly) ? _Window_ShopCommand_maxCols.call(this) : 2;
  };

  // 欲張りショップならば専用のコマンドリストを作成する
  var _Window_ShopCommand_makeCommandList = Window_ShopCommand.prototype.makeCommandList;
  Window_ShopCommand.prototype.makeCommandList = function() {
    if ($gameTemp.isGreedShop()) {
      this.addCommand($gameTemp.greedCommand(), 'buy');
      if (showSellCommand || !this._purchaseOnly) {
        this.addCommand(TextManager.sell, 'sell', !this._purchaseOnly);
      }
      this.addCommand(TextManager.cancel, 'cancel');
    } else {
      _Window_ShopCommand_makeCommandList.call(this);
    }
  };

  //-----------------------------------------------------------------------------
  // Window_ShopBuy
  //

  var _Window_ShopBuy_initialize = Window_ShopBuy.prototype.initialize;
  Window_ShopBuy.prototype.initialize = function(x, y, height, shopGoods) {
    if ($gameTemp.isGreedShop() && +buyWindowHeight > 0) {
      height = +buyWindowHeight;
    }
    _Window_ShopBuy_initialize.call(this, x, y, height, shopGoods);
  };

  var _Window_ShopBuy_windowWidth = Window_ShopBuy.prototype.windowWidth;
  Window_ShopBuy.prototype.windowWidth = function() {
    if ($gameTemp.isGreedShop()) {
      return buyWindowWidth;
    }
    return _Window_ShopBuy_windowWidth.call(this);
  };

  var _Window_ShopBuy_price = Window_ShopBuy.prototype.price;
  Window_ShopBuy.prototype.price = function(item) {
    if ($gameTemp.isGreedShop() && (item && item.meta.matG)) {
      return +item.meta.matG;
    }
    return _Window_ShopBuy_price.call(this, item);
  };

  var _Window_ShopBuy_isEnabled = Window_ShopBuy.prototype.isEnabled;
  Window_ShopBuy.prototype.isEnabled = function(item) {
    var result = _Window_ShopBuy_isEnabled.call(this, item);
    if (result && $gameTemp.isGreedShop()) {
      var materials = DataManager.getGreedShopMaterials(item);
      for (var i = 0; i < materials.length; i++) {
        var material = materials[i];
        var matItem = DataManager.materialToItem(material);
        if ($gameParty.numItems(matItem) < material.need) {
          return false;
        }
      }
    }
    return result;
  };

  var _Window_ShopBuy_update = Window_ShopBuy.prototype.update;
  Window_ShopBuy.prototype.update = function() {
    _Window_ShopBuy_update.call(this);
    if (this.active && this._materialWindow) {
      this._materialWindow.setShopItem(this.item(), this.price(this.item()));
      this.setMaterialWindowPosition();
    }
  };

  Window_ShopBuy.prototype.setMaterialWindowPosition = function() {
    switch (materialWindowPosition) {
    case 0:  // 商品名の下
      var x = this.x + this.width / 2;
      var y = this.y + this.padding;
      var lineHeight = this.lineHeight();
      y += (this.index() - this.topRow() + 1) * lineHeight;
      this._materialWindow.x = x - this._materialWindow.width / 2;
      this._materialWindow.y = y;
      if (this._materialWindow.y + this._materialWindow.height > Graphics.boxHeight) {
        this._materialWindow.y = y - this._materialWindow.height - lineHeight;
      }
      break;
    case 1:  // 商品名の右
      var x = this.x + this.width - this.padding;
      var y = this.y + this.padding;
      var lineHeight = this.lineHeight();
      y += (this.index() - this.topRow()) * lineHeight;
      this._materialWindow.x = x;
      this._materialWindow.y = y;
      if (this._materialWindow.y + this._materialWindow.height > Graphics.boxHeight) {
        this._materialWindow.y = Graphics.boxHeight - this._materialWindow.height;
      }
      if (this._materialWindow.x + this._materialWindow.width > Graphics.boxWidth) {
        this._materialWindow.x = Graphics.boxWidth - this._materialWindow.width;
      }
      break;
    case 2:  // 購入ウィンドウの下
      this._materialWindow.x = this.x;
      this._materialWindow.y = this.y + this.height;
      if (this._materialWindow.y + this._materialWindow.height > Graphics.boxHeight) {
        this._materialWindow.y = Graphics.boxHeight - this._materialWindow.height;
      }
      break;
    }
  };

  // キー素材を所持していない場合は商品リストから除外する
  var _Window_ShopBuy_makeItemList = Window_ShopBuy.prototype.makeItemList;
  Window_ShopBuy.prototype.makeItemList = function() {
    _Window_ShopBuy_makeItemList.call(this);
    for (var i = this._data.length - 1; i >= 0; i--) {
      var item = this._data[i];
      if (item && item.meta.matKey) {
        var materials = DataManager.getGreedShopMaterials(item);
        var keys = item.meta.matKey.split(' ').map(Number);
        for (var j = 0; j < keys.length; j++) {
          var material = materials[keys[j] - 1];
          var matItem = DataManager.materialToItem(material);
          if (!$gameParty.hasItem(matItem, false)) {
            this._data.splice(i, 1);
            this._price.splice(i, 1);
            break;
          }
        }
      }
    }
  };

  var _Window_ShopBuy_drawItem = Window_ShopBuy.prototype.drawItem;
  Window_ShopBuy.prototype.drawItem = function(index) {
    if ($gameTemp.isGreedShop() && !showPrice) {
      var item = this._data[index];
      var rect = this.itemRect(index);
      rect.width -= this.textPadding();
      this.changePaintOpacity(this.isEnabled(item));
      this.drawItemName(item, rect.x, rect.y, rect.width);
      this.changePaintOpacity(true);
    } else {
      _Window_ShopBuy_drawItem.call(this, index);
    }
  };

  Window_ShopBuy.prototype.setMaterialWindow = function(materialWindow) {
    this._materialWindow = materialWindow;
  };

  //-----------------------------------------------------------------------------
  // Window_ShopNumber
  //

  var _Window_ShopNumber_windowWidth = Window_ShopNumber.prototype.windowWidth;
  Window_ShopNumber.prototype.windowWidth = function() {
    if ($gameTemp.isGreedShop()) {
      return buyWindowWidth;
    }
    return _Window_ShopNumber_windowWidth.call(this);
  };

  var _Window_ShopNumber_refresh = Window_ShopNumber.prototype.refresh;
  Window_ShopNumber.prototype.refresh = function() {
    _Window_ShopNumber_refresh.call(this);
    if ($gameTemp.isGreedShop() && showMaterialFromNumberWindow) {
      this.drawGreedMaterials(0, this.lineHeight() * 2, this._item, this._number, fontRate);
    }
  };

  // 欲張りショップの場合は価格表示を素材リストに任せる
  var _Window_ShopNumber_drawTotalPrice = Window_ShopNumber.prototype.drawTotalPrice;
  Window_ShopNumber.prototype.drawTotalPrice = function() {
    if (!$gameTemp.isGreedShop()) {
      _Window_ShopNumber_drawTotalPrice.call(this);
    }
  };

  var _Window_ShopNumber_itemY = Window_ShopNumber.prototype.itemY;
  Window_ShopNumber.prototype.itemY = function() {
    if ($gameTemp.isGreedShop() && showMaterialFromNumberWindow) {
      return 0;
    }
    return _Window_ShopNumber_itemY.call(this);
  };

  var _Window_ShopNumber_priceY = Window_ShopNumber.prototype.priceY;
  Window_ShopNumber.prototype.priceY = function() {
    if ($gameTemp.isGreedShop() && showMaterialFromNumberWindow) {
      return this.lineHeight() * 1.5;
    }
    return _Window_ShopNumber_priceY.call(this);
  };

  var _Window_ShopNumber_buttonY = Window_ShopNumber.prototype.buttonY;
  Window_ShopNumber.prototype.buttonY = function() {
    if ($gameTemp.isGreedShop() && showMaterialFromNumberWindow) {
      return Math.min(this.priceY() + this.lineHeight() * (materialMax + 3),
                      this.contents.height - this.lineHeight());
    }
    return _Window_ShopNumber_buttonY.call(this);
  };

  //-----------------------------------------------------------------------------
  // Window_Material
  //

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

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

  Window_Material.prototype.initialize = function() {
    this._materials = [];
    var width = this.windowWidth();
    var height = this.windowHeight();
    Window_Base.prototype.initialize.call(this, 0, 0, width, height);
    this.hide();
  };

  Window_Material.prototype.windowWidth = function() {
    return materialWindowWidth;
  };

  Window_Material.prototype.windowHeight = function() {
    var n = this._materials.length;
    if (needText) {
      n += 1;
    }
    if (this._price) {
      n += 1;
    }
    return Math.floor(this.fittingHeight(n) * fontRate);
  };

  Window_Material.prototype.standardBackOpacity = function() {
    return backOpacity;
  };

  var _Window_Material_show = Window_Material.prototype.show;
  Window_Material.prototype.show = function() {
    _Window_Material_show.call(this);
    if (this._materials.length === 0) {
      this.visible = false;
    }
  };

  Window_Material.prototype.materials = function() {
    return this._materials;
  };

  Window_Material.prototype.setShopItem = function(item, price) {
    if (this._shopItem !== item) {
      this._shopItem = item;
      this._price = price;
      this._materials = DataManager.getGreedShopMaterials(item);
      if (this._materials.length > 0) {
        this.refresh();
      }
      if (showMaterialWindow) {
        this.show();
      }
    }
  };

  Window_Material.prototype.refresh = function() {
    this.move(this.x, this.y, this.width, this.windowHeight());
    this.createContents();
    this.drawGreedMaterials(0, 0, this._shopItem, 1, fontRate);
/*    for (var i = 0; i < this._materials.length; i++) {
      var material = this._materials[i];
      var item = DataManager.materialToItem(material);
      var need = material.need;
      var n = $gameParty.numItems(item);
      this.changePaintOpacity(n >= need);
      this.drawItemName(item, 0, this.lineHeight() * i);
      var text = DataManager.isConsumableMaterial(item) ? '' + n + '/' : '--/';
      text += ('   ' + need).substr(-3);
      this.drawText(text, 0, this.lineHeight() * i, this.contents.width, 'right');
    }*/
  };

  //-----------------------------------------------------------------------------
  // Scene_Shop
  //

  var _Scene_Shop_terminate = Scene_Shop.prototype.terminate;
  Scene_Shop.prototype.terminate = function() {
    _Scene_Shop_terminate.call(this);
    $gameTemp.setGreedShop(false);
  };

  var _Scene_Shop_create = Scene_Shop.prototype.create;
  Scene_Shop.prototype.create = function() {
    _Scene_Shop_create.call(this);
    if ($gameTemp.isGreedShop()) {
      this.createMaterialWindow();
    }
  };

  Scene_Shop.prototype.createMaterialWindow = function() {
    this._materialWindow = new Window_Material();
    this._buyWindow.setMaterialWindow(this._materialWindow);
    if (overlaid) {
      this.addChild(this._materialWindow);
    } else {
      this.addWindow(this._materialWindow);
    }
  };

  var _Scene_Shop_onBuyOk = Scene_Shop.prototype.onBuyOk;
  Scene_Shop.prototype.onBuyOk = function() {
    _Scene_Shop_onBuyOk.call(this);
    if (this._materialWindow) {
      this._materialWindow.hide();
    }
  };

  var _Scene_Shop_onBuyCancel = Scene_Shop.prototype.onBuyCancel;
  Scene_Shop.prototype.onBuyCancel = function() {
    _Scene_Shop_onBuyCancel.call(this);
    if (this._materialWindow) {
      this._materialWindow.setShopItem(null);
    }
  };

  var _Scene_Shop_onNumberOk = Scene_Shop.prototype.onNumberOk;
  Scene_Shop.prototype.onNumberOk = function() {
    if ($gameTemp.isGreedShop() && this._commandWindow.currentSymbol() === 'buy') {
      AudioManager.playSe(seGreedBuy);
      this.doBuy(this._numberWindow.number());
      this.endNumberInput();
      this._goldWindow.refresh();
      this._statusWindow.refresh();
    } else {
      _Scene_Shop_onNumberOk.call(this);
    }
  };

  var _Scene_Shop_doBuy = Scene_Shop.prototype.doBuy;
  Scene_Shop.prototype.doBuy = function(number) {
    _Scene_Shop_doBuy.call(this, number);
    if (this._materialWindow) {
      var materials = this._materialWindow.materials();
      for (var i = 0; i < materials.length; i++) {
        var material = materials[i];
        var item = DataManager.materialToItem(material);
        if (DataManager.isConsumableMaterial(item)) {
          $gameParty.loseItem(item, material.need * number);
        }
      }
      this._materialWindow.refresh();
    }
  };

  var _Scene_Shop_maxBuy = Scene_Shop.prototype.maxBuy;
  Scene_Shop.prototype.maxBuy = function() {
    var result = _Scene_Shop_maxBuy.call(this);
    if (this._materialWindow) {
      var materials = this._materialWindow.materials();
      for (var i = 0; i < materials.length; i++) {
        var material = materials[i];
        var item = DataManager.materialToItem(material);
        if (DataManager.isConsumableMaterial(item)) {
          var n = $gameParty.numItems(item);
          result = Math.min(result, Math.floor(n / material.need));
        }
      }
    }
    return result;
  };

  var _Scene_Shop_endNumberInput = Scene_Shop.prototype.endNumberInput;
  Scene_Shop.prototype.endNumberInput = function() {
    _Scene_Shop_endNumberInput.call(this);
    if (this._materialWindow && showMaterialWindow) {
      this._materialWindow.show();
    }
  };

})();


code:
//=============================================================================
// TMPlugin - メニューラベル
// バージョン: 1.1.1
// 最終更新日: 2017/02/07
// 配布元    : 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 labelCName
 * @desc ラベルＣの名前
 * 初期値: ラベルＣ
 * @default ラベルＣ
 *
 * @param labelCId
 * @desc ラベルＣのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelCMax
 * @desc ラベルＣの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelCFooter
 * @desc ラベルＣのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelDName
 * @desc ラベルＤの名前
 * 初期値: ラベルＤ
 * @default ラベルＤ
 *
 * @param labelDId
 * @desc ラベルＤのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelDMax
 * @desc ラベルＤの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelDFooter
 * @desc ラベルＤのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelNameWidth
 * @desc ラベル名の表示幅
 * 初期値: 128
 * @default 128
 *
 * @param labelValueWidth
 * @desc ラベル値の表示幅
 * 初期値: 72
 * @default 72
 *
 * @param labelNameColorId
 * @desc ラベル名の文字色番号
 * 初期値: 16
 * @default 16
 *
 * @param labelValueColorId
 * @desc ラベル値の文字色番号
 * 初期値: 0
 * @default 0
 *
 * @param labelMaxColorId
 * @desc ラベル値が最大のときの文字色番号
 * 初期値: 2
 * @default 2
 *
 * @param labelFooterColorId
 * @desc フッターの文字色番号
 * 初期値: 0
 * @default 0
 *
 * @param footerSpace
 * @desc フッターとラベル値の間隔
 * 初期値: 0
 * @default 0
 *
 * @param reverseMenuWindow
 * @desc メニューシーンのウィンドウ配置を左右反転
 * 初期値: 0 ( 0 = 無効 / 1 = 有効)
 * @default 0
 *
 * @param menuTextAlign
 * @desc メニューコマンド項目の描画位置
 * 初期値: left ( left / center / right)
 * @default left
 *
 * @help
 * TMPlugin - メニューラベル ver1.1.1

 * 使い方:
 *
 *   このプラグインを導入するとメインメニューの左下にゲーム変数の
 *   値（以下ラベル）を最大で 4 つまで表示することができるようになります。
 *
 *   このプラグインは RPGツクールMV Version 1.3.4 で動作確認をしています。
 *
 *
 * プラグインコマンド:
 *
 *   stopMenuLabel
 *     メニューラベルを無効にします。この設定はセーブデータにも記録され、
 *     startMenuLabel コマンドが実行されるまでラベルが表示されなくなります。
 *
 *   startMenuLabel
 *     無効になっているメニューラベルを有効にします。
 *     ゲーム開始時の状態ではメニューラベルは有効になっています。
 *
 *
 * プラグインパラメータ補足:
 *
 *   labelAId ～ labelDId
 *     この値が 1 以上のときは変数の値が表示され、それ以外の場合は
 *     以下のようなルールで表示される値が変化します。
 *      0 … ラベルの無効化（何も表示しない）
 *     -1 … 歩数
 *     -2 … セーブ回数
 *     -3 … 戦闘回数
 *     -4 … 勝利回数
 *     -5 … 敗北回数
 *
 *   labelAMax ～ labelDMax
 *     ゲーム変数の値がこれらの値以上だった場合、ラベルに表示される値の
 *     文字色番号が labelValueColorId から labelMaxColorId に変化します。
 *     また、ゲーム変数の値が最大値よりも大きい場合は、最大値を表示します。
 *     0 を設定すると上記機能が無効になります。
 *
 *   labelAFooter ～ labelDFooter
 *     ラベル値の後ろに表示する文字列を設定します。
 *     『1234 点』、『12 日目』のような表示にするための機能です、値との間の
 *     スペースは半角スペースなどで調整してください。
 *
 *   labelNameColorId
 *   labelValueColorId
 *   labelMaxColorId
 *   labelFooterColorId
 *     ラベルの各部分ごとの文字色番号を設定します。
 *     番号はイベントコマンド『文章の表示』などで使う制御文字 \C[n] の
 *     n の部分と同じものになります。
 *
 *   footerSpace
 *     ラベル値とフッターの表示位置を所持金ウィンドウとそろえたいときは
 *     このパラメータを調節してください。フッターと通貨単位がともに
 *     全角 1 文字の場合は 6 を設定するとちょうど同じになります。
 */

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

var TMPlugin = TMPlugin || {};
TMPlugin.MenuLabel = {};
TMPlugin.MenuLabel.Parameters = PluginManager.parameters('TMMenuLabel');
TMPlugin.MenuLabel.Labels = [];
TMPlugin.MenuLabel.Labels[0] = {name: TMPlugin.MenuLabel.Parameters['labelAName'],
                                id: +(TMPlugin.MenuLabel.Parameters['labelAId'] || 10),
                                max: +(TMPlugin.MenuLabel.Parameters['labelAMax'] || 9999),
                                footer: TMPlugin.MenuLabel.Parameters['labelAFooter']};
TMPlugin.MenuLabel.Labels[1] = {name: TMPlugin.MenuLabel.Parameters['labelBName'],
                                id: +(TMPlugin.MenuLabel.Parameters['labelBId'] || 10),
                                max: +(TMPlugin.MenuLabel.Parameters['labelBMax'] || 9999),
                                footer: TMPlugin.MenuLabel.Parameters['labelBFooter']};
TMPlugin.MenuLabel.Labels[2] = {name: TMPlugin.MenuLabel.Parameters['labelCName'],
                                id: +(TMPlugin.MenuLabel.Parameters['labelCId'] || 10),
                                max: +(TMPlugin.MenuLabel.Parameters['labelCMax'] || 9999),
                                footer: TMPlugin.MenuLabel.Parameters['labelCFooter']};
TMPlugin.MenuLabel.Labels[3] = {name: TMPlugin.MenuLabel.Parameters['labelDName'],
                                id: +(TMPlugin.MenuLabel.Parameters['labelDId'] || 10),
                                max: +(TMPlugin.MenuLabel.Parameters['labelDMax'] || 9999),
                                footer: TMPlugin.MenuLabel.Parameters['labelDFooter']};
TMPlugin.MenuLabel.NameWidth     = +(TMPlugin.MenuLabel.Parameters['labelNameWidth'] || 160);
TMPlugin.MenuLabel.ValueWidth    = +(TMPlugin.MenuLabel.Parameters['labelValueWidth'] || 96);
TMPlugin.MenuLabel.NameColorId   = +(TMPlugin.MenuLabel.Parameters['labelNameColorId'] || 16);
TMPlugin.MenuLabel.ValueColorId  = +(TMPlugin.MenuLabel.Parameters['labelValueColorId'] || 0);
TMPlugin.MenuLabel.MaxColorId    = +(TMPlugin.MenuLabel.Parameters['labelMaxColorId'] || 2);
TMPlugin.MenuLabel.FooterColorId = +(TMPlugin.MenuLabel.Parameters['labelFooterColorId'] || 0);
TMPlugin.MenuLabel.FooterSpace   = +(TMPlugin.MenuLabel.Parameters['footerSpace'] || 0);
TMPlugin.MenuLabel.ReverseMenuWindow = TMPlugin.MenuLabel.Parameters['reverseMenuWindow'] === '1';
TMPlugin.MenuLabel.MenuTextAlign = TMPlugin.MenuLabel.Parameters['menuTextAlign'] || 'left';

(function() {

  //-----------------------------------------------------------------------------
  // Game_System
  //

  Game_System.prototype.isMenuLabelEnabled = function() {
    if (this._menuLabelEnabled === undefined) this._menuLabelEnabled = true;
    return this._menuLabelEnabled;
  };

  Game_System.prototype.setMenuLabel = function(flag) {
    this._menuLabelEnabled = flag;
  };

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

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'startMenuLabel') {
      $gameSystem.setMenuLabel(true);
    } else if (command === 'stopMenuLabel') {
      $gameSystem.setMenuLabel(false);
    }
  };

  //-----------------------------------------------------------------------------
  // Window_MenuCommand
  //

  Window_MenuCommand.prototype.itemTextAlign = function() {
    return TMPlugin.MenuLabel.MenuTextAlign;
  };

  //-----------------------------------------------------------------------------
  // Window_MenuLabel
  //

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

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

  Window_MenuLabel.prototype.initialize = function(x, y) {
    var width = this.windowWidth();
    var height = this.windowHeight();
    Window_Base.prototype.initialize.call(this, x, y, width, height);
    this.refresh();
  };

  Window_MenuLabel.prototype.maxItems = function() {
    var n = 0;
    for (var i = 0; i < 4; i++) {
      if (TMPlugin.MenuLabel.Labels[i].id !== 0) n++;
    }
    return n;
  };

  Window_MenuLabel.prototype.windowWidth = function() {
    return 240;
  };

  Window_MenuLabel.prototype.windowHeight = function() {
    return this.fittingHeight(this.maxItems());
  };

  Window_MenuLabel.prototype.refresh = function() {
    var x = this.textPadding();
    var width = this.contents.width - this.textPadding() * 2;
    var lineHeight = this.lineHeight();
    this.contents.clear();
    var x = this.contents.width - this.textPadding();
    var y = 0;
    for (var i = 0; i < 4; i++) {
      var label = TMPlugin.MenuLabel.Labels[i];
      var value = this.labelValue(label.id);
      if (value != null) {
        this.drawMenuLabel(x, y, label, value);
        y += lineHeight;
      }
    }
  };

  Window_MenuLabel.prototype.labelValue = function(id) {
    if (id > 0) {
      return $gameVariables.value(id);
    } else if (id === -1) {
      return $gameParty.steps();
    } else if (id === -2) {
      return $gameSystem.saveCount();
    } else if (id === -3) {
      return $gameSystem.battleCount();
    } else if (id === -4) {
      return $gameSystem.winCount();
    } else if (id === -5) {
      return $gameSystem.escapeCount();
    }
    return null;
  };

  Window_MenuLabel.prototype.drawMenuLabel = function(x, y, label, value) {
    if (label.footer) {
      var footerWidth = this.textWidth(label.footer);
      x -= footerWidth;
      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.FooterColorId));
      this.drawText(label.footer, x, y, footerWidth);
      x -= TMPlugin.MenuLabel.FooterSpace;
    }
    x -= TMPlugin.MenuLabel.ValueWidth;
    this.changeTextColor(this.textColor(TMPlugin.MenuLabel.ValueColorId));
    if (label.max && value >= label.max) {
      value = label.max;
      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.MaxColorId));
    }
    var sprite = new Sprite(ImageManager.loadSystem($gameVariables.value(38)));
sprite.x = x;
sprite.y = y;
this.addChild(sprite);

      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.NameColorId));
      this.drawText($gameVariables.value(40), this.textPadding()+30, y, TMPlugin.MenuLabel.NameWidth);
    var moon = $gameVariables.value(41);
      this.drawTextEx(moon, this.textPadding(), y, TMPlugin.MenuLabel.NameWidth);
  };

  //-----------------------------------------------------------------------------
  // Scene_Menu
  //

  var _Scene_Menu_create = Scene_Menu.prototype.create;
  Scene_Menu.prototype.create = function() {
    _Scene_Menu_create.call(this);
    if ($gameSystem.isMenuLabelEnabled()) this.createMenuLabelWindow();
    if (TMPlugin.MenuLabel.ReverseMenuWindow) {
      this._statusWindow.x = 0;
      this._commandWindow.x = this._statusWindow.width;
      this._goldWindow.x = this._commandWindow.x
      if (this._menuLabelWindow) this._menuLabelWindow.x = this._commandWindow.x
    }
  };

  Scene_Menu.prototype.createMenuLabelWindow = function() {
    this._menuLabelWindow = new Window_MenuLabel(0, 0);
    this._menuLabelWindow.y = this._goldWindow.y - this._menuLabelWindow.height;
    this.addWindow(this._menuLabelWindow);
  };

})();