code:
//=============================================================================
// MKR_EventGauge.js
//=============================================================================
// Copyright (c) 2021 マンカインド
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.0.0 2021/05/26 ・セーブデータにゲージ情報を保存しないよう修正。
//                  ・マップ初期化時、ゲージ情報も初期化するように修正。
//
// 1.2.3 2020/04/10 ・イベントの一時消去後、
//                    メニュー開閉を行うとエラーとなる問題を修正。
//
// 1.2.2 2020/02/13 ・イベントの一時消去を行った際にエラーとなる問題を修正。
//
// 1.2.1 2018/10/22 ・ニューゲーム開始時点マップにゲージ設定された
//                    イベントがいた場合、エラーになる問題を修正。
//
// 1.2.0 2018/10/20 ・一部イベントにゲージが表示されなくなっていた問題を修正。
//
// 1.1.9 2018/09/26 ・イベント画像にタイルセットを選択時、
//                    イベントゲージを表示するかどうかを
//                    プラグインパラメータで切替可能にした。
//
// 1.1.8 2018/05/29 ・一部プラグインとの競合を修正。
//
// 1.1.7 2018/03/18 ・ゲージ不透明度をイベントごとに設定可能に。
//                  ・ゲージ量設定を残量、最大値で分離させた。
//
// 1.1.6 2017/07/16 ・余計なコードを削除
//                  ・バージョンを変更し忘れていたため修正
//
// 1.1.5 2017/07/16 古いバージョンで作成されたツクールMVプロジェクトにおいて
//                  プラグインが正常に動作しなかったため修正
//
// 1.1.4 2017/05/27 ・イベントゲージを表示するマップで
//                    セーブが出来なかった問題を修正。
//                  ・スクリプトによるコマンド記述方法を一部変更
//                  ・ゲージの色をプラグイン/スクリプトコマンドで変更可能に
//
// 1.1.3 2017/03/11 ・ゲージのoffsetX/Yをプラグイン/スクリプトコマンドで
//                    変更可能に。
//                  ・ゲージをピクチャーの上に描画可能に。
//                    (プラグインパラメーターの追加)
//
// 1.1.2 2017/03/05 ・メモ欄の記述にオプション設定を追加
//                  ・ゲージをメモリキャッシュへと登録するように
//                    (一部のメモリ解放系プラグインへの対応)
//
// 1.1.1 2017/02/17 ・ゲージ設定に変数ではなく数字を使う方式を追加。
//                  ・メモ欄の記述にオプション設定を追加
//
// 1.1.0 2017/02/14 ・プラグインコマンドの対象を実行したイベントのみに変更。
//                  ・スクリプトコマンドの[イベントID]に
//                    実行したイベント自身を表す0を指定可能に。
//                  ・プラグイン/スクリプトコマンドの一部に変数を使用可能に。
//                  ・プラグインパラメーターでゲージの不透明度を指定可能に。
//                  ・上記修正に合わせてプラグイン説明文を修正。
//
// 1.0.2 2017/02/14 メニューの開閉でゲージが非表示になることがある問題を修正。
//
// 1.0.1 2017/02/14 スクリプトによるコマンドが一部動作していなかったため修正。
//
// 1.0.0 2017/02/13 初版公開。
// ----------------------------------------------------------------------------
// [Twitter] https://twitter.com/mankind_games/
//  [GitHub] https://github.com/mankindGames/
//    [Blog] http://mankind-games.blogspot.jp/
//=============================================================================

/*:
 *
 * @plugindesc (v2.0.0) イベントゲージプラグイン
 * @author マンカインド
 *
 * @help = イベントゲージプラグイン =
 * MKR_EventGauge.js
 *
 * 指定したイベントの足元にゲージを表示します。(表示位置は調節が可能)
 * ゲージの最大値/残量はイベント生成(マップ移動)時に
 * イベント_メモ欄で指定した値(変数も使用可能)で設定されます。
 *
 * (ゲージ最大値/残量に変数を使用した場合、)
 * ゲージ最大値/残量は変数の値に対応し、変数の値とゲージ残量が同期します。
 * (ただし、ゲージ残量は最大値より上になることは無く、
 *  0より小さくなることもありません)
 *
 * ゲージはイベントの透明化によって非表示になり、
 * 透明化を解除すると再表示されます。
 *
 * イベント画像が設定されていないイベント(ページ)の場合、ゲージは表示されません。
 * タイルセット画像を使ったイベントの場合、プラグインパラメータでゲージを表示させるか
 * 設定することが可能です。
 * (タイルセットBの一番左上は[何もない]マス扱いとなりゲージが表示されません)
 *
 * ただし、後述するプラグイン/スクリプトコマンドで
 * ゲージを非表示設定にした場合は透明化や画像設定の有無に関わらず、
 * プラグイン/スクリプトコマンドでゲージを表示設定にする必要があります。
 *
 * イベントコマンド[イベントの一時消去]が実行されると、そのイベントに紐づく
 * ゲージも一緒に消去されます。
 *
 *
 * [コピペ用使用例、メモ欄設定・コマンド]
 *   ※各項目の意味は後述しています。
 *     内容は1行毎になっていますので、
 *     必要な行の使用例部分をコピーしてお使いください。
 *
 *   イベント_メモ欄:
 *     <Egauge:vr10>
 *     <Egauge:mvr11>
 *     <Egauge:vr10 mvr11>
 *     <Egauge:15>
 *     <Egauge:3 Wh20 Ht6>
 *     <Egauge:vr12 Wh100 Ht10 Fx3 Vs0>
 *     <Egauge:5 Ys-50>
 *     <Egauge:vr5 Xs10 Ys10 Fx1 Fc3 Sc11 Bc7>
 *     <Egauge:50 op80>
 *
 *   プラグインコマンド(実行したイベントが持つゲージに対して効果を発揮):
 *     Egauge show
 *     Egauge hide
 *     Egauge add 3
 *     Egauge set 5
 *     Egauge maxset 5
 *     Egauge setx 20
 *     Egauge sety 40
 *     Egauge backcolor 16
 *     Egauge color1 17
 *     Egauge color2 17
 *     Egauge add \V[10]
 *     Egauge set \V[15]
 *     Egauge maxset \V[20]
 *     Egauge opacity 255
 *
 *   スクリプトコマンド(指定したIDのイベントが持つゲージに対して効果を発揮):
 *     $gameMap.showGaugeWindow(1);
 *     $gameMap.hideGaugeWindow(1);
 *     $gameMap.isHideGaugeWindow(1);
 *     $gameMap.addGaugeValue(1, 3);
 *     $gameMap.addGaugeValue(this._eventId, 3);
 *     $gameMap.setGaugeValue(1, 5);
 *     $gameMap.setGaugeValue(this._eventId, 5);
 *     $gameMap.setGaugeMaxValue(1, 5);
 *     $gameMap.setGaugeOffsetX(1, 20);
 *     $gameMap.setGaugeOffsetY(1, 40);
 *     $gameMap.setGaugeBackColor(1, 16);
 *     $gameMap.setGaugeColor1(1, 17);
 *     $gameMap.setGaugeColor2(1, 17);
 *     $gameMap.addGaugeValue(1, $gameVariables.value(10));
 *     $gameMap.addGaugeValue(this._eventId, $gameVariables.value(10));
 *     $gameMap.setGaugeValue(1, $gameVariables.value(15));
 *     $gameMap.setGaugeMaxValue(1, $gameVariables.value(20));
 *     $gameMap.setOpacity(1, 255);
 *
 *
 * ゲージの色について:
 *   このプラグインでは、ゲージの色番号をプラグインパラメーターまたはメモ欄で
 *   指定する必要があります。
 *   (スクリプト/プラグインコマンドによって後からでも変更可能です)
 *
 *   色番号はsystem/Window.pngの右下側にある
 *   色とりどりの四角い枠群に対応しています。
 *
 *   四角い枠群の左上(デフォルトだと白く塗られている四角い枠)を0番として
 *   右に向かって数えていきます。一番右下が31です。
 *
 *   プラグインパラメーター
 *     Gauge_Color_1
 *     Gauge_Color_2
 *   で指定されているデフォルト値である色番号20と21は、
 *   メニュー等で表示されるHPゲージの色と同じものです。
 *   (デフォルトだと赤みがかった黄色で塗られている四角い枠)
 *
 *   同じく、プラグインパラメーター
 *     Gauge_Back_Color
 *   で指定されているデフォルト値である色番号19は、
 *   メニュー等で表示されるゲージの背景色と同じものです。
 *   (デフォルトだと紺色で塗られている四角い枠)
 *
 *
 * イベント_メモ欄_基本設定:
 *   <Egauge:vr[変数番号]>
 *     ・イベントにゲージを表示します。ゲージの残量は変数を使用します。
 *       [変数番号]の部分に変数の番号を指定してください。
 *
 *     ・ゲージ残量に使用する変数は0より大きい値を入れてください。
 *
 *     ・ゲージ最大値の指定がされていない場合、
 *       イベント生成時点の変数の値を最大値として設定します。
 *       (設定後、変数の値はゲージ残量として機能します)
 *
 *   <Egauge:mvr[変数番号]>
 *     ・イベントにゲージを表示します。ゲージの最大値は変数を使用します。
 *       [変数番号]の部分に変数の番号を指定してください。
 *
 *     ・ゲージ最大値に使用する変数は0より大きい値を入れてください。
 *
 *     ・ゲージ残量の指定がされていない場合、
 *       イベント生成時点の変数の値を残量として設定します。
 *       (設定後、変数の値はゲージ最大値として機能します)
 *
 *   <Egauge:vr[変数番号1] mvr[変数番号2]>
 *     ・イベントにゲージを表示します。ゲージの残量/最大値は変数を使用します。
 *       [変数番号1],[変数番号2]の部分に変数の番号を指定してください。
 *
 *     ・[変数番号1]がゲージ残量として使われる変数、
 *       [変数番号2]がゲージ最大値として使われる変数になります。
 *
 *     ・ゲージ残量/最大値に使用する変数は0より大きい値を入れてください。
 *
 *     ・ゲージ残量に設定された変数の値が
 *       ゲージ最大値に設定された変数の値より大きい場合、
 *       自動的にゲージ最大値の値が残量として設定されます。
 *
 *   <Egauge:[数字]>
 *     ・イベントにゲージを表示します。[数字]がゲージの最大値・残量になります。
 *       ゲージ残量の設定、最大値の設定は後述するコマンドでも可能です。
 *       変数を利用したくない場合はこちらをご使用ください。
 *
 *     ・ゲージ最大値に使用する[数字]は0より大きい値を入れてください。
 *
 *   ※ ゲージの値指定に変数と数字を使う2パターンを用意しましたが、
 *      両方指定した場合は変数設定が優先されます。
 *
 *      イベント毎に値指定方法を変えることは可能ですので、
 *      どちらか片方を使い設定を行ってください。
 *
 *
 * メモ欄_オプション(各オプションはスペースで区切る):
 *   Wh[数字]
 *     ・ゲージの長さを数字で指定します。
 *
 *   Ht[数字]
 *     ・ゲージの高さを数字で指定します。
 *
 *   Xs[数字]
 *     ・ゲージX座標を[数字]分、ズラして表示します。
 *       (プラス値で右へ、マイナス値で左に)
 *
 *   Ys[数字]
 *     ・ゲージY座標を[数字]分、ズラして表示します。
 *       (プラス値で下へ、マイナス値で上に)
 *
 *   Vs[0～1の数字]
 *     ・ゲージの初期表示状態を指定します。
 *         0 : イベント生成時、ゲージは非表示設定です。
 *         1 : イベント生成時、ゲージは表示設定です。
 *
 *   Fx[1～3の数字]
 *     ・ゲージを画面下側に固定表示します。
 *       (デフォルト設定でゲージ底辺と画面との余白が20pxになります)
 *
 *     ・ゲージのX座標は[1～3の数字]によって変わり、
 *         1 : 画面左側とゲージ左辺の余白が20pxになるよう配置されます。
 *         2 : ゲージの長さを考慮して画面中央に表示されます。
 *         3 : 画面右側とゲージ右辺の余白が20pxになるよう配置されます。
 *       ゲージオフセットによって余白の数値は変化します。
 *
 *   Fc[数字]
 *     ・ゲージカラー1を数字で指定します。
 *       (プラグインパラメーターのGauge_Color_1設定より優先されます)
 *
 *   Sc[数字]
 *     ・ゲージカラー2を数字で指定します。
 *
 *     ・ゲージのグラデーションが必要ない場合は
 *       ゲージカラー1と同じ数字を指定します。
 *       (プラグインパラメーターのGauge_Color_2設定より優先されます)
 *
 *   Bc[数字]
 *     ・ゲージ背景カラーを数字で指定します。
 *       (プラグインパラメーターのGauge_Back_Color設定より優先されます)
 *
 *   Op[数字]
 *     ・ゲージ不透明度を数字で指定します。
 *       (プラグインパラメーターのGauge_Opacity設定より優先されます)
 *
 *
 * イベント_メモ欄の設定例:
 *   <Egauge:vr10>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値/残量ともに変数10番の値が反映されます。
 *       (変数の変動によりゲージ残量が変化します)
 *
 *   <Egauge:mvr11>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値/残量ともに変数11番の値が反映されます。
 *       (変数の変動によりゲージ最大値が変化します)
 *
 *   <Egauge:vr10 mvr11>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値が変数11番、残量が変数10番の値で反映されます。
 *       (変数11番の変動によりゲージ最大値が、
 *        変数10番の変動により残量が変化します)
 *
 *   <Egauge:15>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値15、残量15で設定されます。
 *
 *   <Egauge:3 Wh20 Ht6>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値3、残量3で設定されます。
 *     ・ゲージの長さを20px、高さを6pxで表示します。
 *
 *   <Egauge:vr20 Xs30 Ys-40>
 *     ・イベントにゲージを表示します。
 *       ゲージの表示は最大値/残量ともに変数20番の値が反映されます。
 *       (変数が変動するとゲージ残量が変化します)
 *     ・ゲージのX座標をデフォルト+30px、Y座標をデフォルト-40pxで表示します。
 *
 *   <Egauge:200 Wh300 Ht10 Xs-10 Ys-10 Fx1>
 *     ・画面下、左側固定でゲージを表示します。
 *       ゲージの表示は最大値200、残量200で設定されます。
 *     ・ゲージの長さを300px、高さを10px、
 *       X座標をデフォルト-10px、Y座標をデフォルト-10pxで表示します。
 *
 *   <Egauge:vr5 Xs10 Ys10 Fx1 Fc3 Sc11 Bc7>
 *     ・画面下、右側固定でゲージを表示します。
 *       ゲージの表示は最大値/残量ともに変数5番の値が反映されます。
 *       (変数が変動するとゲージ残量が変化します)
 *     ・ゲージの長さ、高さはデフォルト、
 *       X座標をデフォルト+10px、Y座標をデフォルト+10pxで表示します。
 *     ・ゲージのカラー1を3番、カラー2を11番、ゲージ背景を7番の色で描画します。
 *
 *
 * プラグインコマンド:　※使用する際は、[]を実際の値に置き換えてください。
 *   Egauge show
 *     ・実行したイベントのゲージを表示設定にします。
 *
 *     ・イベントが透明、イベント画像が未設定のとき、コマンドを実行しても
 *       ゲージは表示されません。
 *
 *     ・ゲージが非表示設定になっている場合、
 *       このコマンドで表示設定にすることが可能です。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   Egauge hide
 *     ・実行したイベントのゲージを非表示設定にします。
 *
 *     ・イベントが透明ではない、イベント画像が設定されているとき、
 *       コマンドの実行によりゲージが非表示になります。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   Egauge add [数字]
 *     ・実行したイベントのゲージ残量を指定した[数字]分、
 *       増加/減少させます。([数字]がマイナス値だと減少します)
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       増加/減少させることができます。
 *
 *     ・変数によってゲージ残量が決められている場合、このコマンドによって
 *       変数の値が変化します。
 *
 *     ・ゲージ残量は最大値より多くなることはなく、
 *       0より小さくなることもありません。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   Egauge set [数字]
 *     ・実行したイベントのゲージ残量を指定した[数字]に設定します。
 *       ([数字]は0以上の値を指定してください。
 *        また、ゲージ最大値より残量が多くなることはありません)
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ残量に設定することができます。
 *
 *     ・変数によってゲージ残量が決められている場合、このコマンドによって
 *       変数の値が変化します。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   Egauge maxset [数字]
 *     ・実行したイベントのゲージ最大値を指定した[数字]に設定します。
 *       ([数字]は0より大きい値を指定してください)
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ最大値に設定することができます。
 *
 *     ・ゲージ最大値がゲージ残量を下回る場合、このコマンドによって
 *       ゲージ残量がゲージ最大値と同じになります。
 *
 *     ・変数によってゲージ最大値/残量が決められている場合、このコマンドによって
 *       変数の値が変化します。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   Egauge setx [数字]
 *     ・実行したイベントのゲージX座標オフセットを指定した[数字]に設定します。
 *       オフセットが指定されたゲージは指定された[数字]分、
 *       本来の描画位置から横方向にズレて表示されます。
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージオフセットに設定することができます。
 *
 *   Egauge sety [数字]
 *     ・実行したイベントのゲージY座標オフセットを指定した[数字]に設定します。
 *       オフセットが指定されたゲージは指定された[数字]分、
 *       本来の描画位置から縦方向にズレて表示されます。
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージオフセットに設定することができます。
 *
 *   Egauge backcolor [数字]
 *     ・実行したイベントのゲージ背景色番号を指定した[数字]に設定します。
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ背景色番号に設定することができます。
 *
 *   Egauge color1 [数字]
 *     ・実行したイベントのゲージ表示色番号を指定した[数字]に設定します。
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ表示色番号に設定することができます。
 *
 *   Egauge color2 [数字]
 *     ・実行したイベントのゲージ表示色番号を指定した[数字]に設定します。
 *       (ゲージのグラデーションが必要ない場合はcolor1と同じ数字を指定します)
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ表示色番号に設定することができます。
 *
 *   Egauge opacity [数字]
 *     ・実行したイベントのゲージ不透明度を指定した[数字]に設定します。
 *       ([数字]は0-255の間の値を指定してください)
 *
 *     ・[数字]の代わりに制御文字\V[n]を使うことで、変数n番の値を
 *       ゲージ不透明度に設定することができます。
 *
 *
 * スクリプトコマンド:
 *     ※使用する際は、[]を実際の値やスクリプトに置き換えてください。
 *   $gameMap.showGaugeWindow([イベントID]);
 *     ・指定した[イベントID]のゲージを表示設定にします。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・イベントが透明、イベント画像が未設定のとき、コマンドを実行しても
 *       ゲージは表示されません。
 *
 *     ・ゲージが非表示設定になっている場合、
 *       このコマンドで表示設定にすることが可能です。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   $gameMap.hideGaugeWindow([イベントID]);
 *     ・指定した[イベントID]のゲージを非表示設定にします。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・イベントが透明ではない、イベント画像が設定されているとき、
 *       コマンドの実行によりゲージが非表示になります。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   $gameMap.isHideGaugeWindow([イベントID]);
 *     ・指定した[イベントID]のゲージが非表示設定であればtrue、
 *       表示設定であればfalseを返します。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、falseが返ります。
 *
 *   $gameMap.addGaugeValue([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ残量を指定した[数字]分、
 *       増加/減少させます。([数字]がマイナス値だと減少します)
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値を増加/減少させることができます。
 *
 *     ・変数によってゲージ残量が決められている場合、このコマンドによって
 *       変数の値が変化します。
 *
 *     ・ゲージ残量は最大値より多くなることはなく、
 *       0より小さくなることもありません。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   $gameMap.setGaugeValue([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ残量を指定した[数字]に設定します。
 *       ([数字]は0以上の値を指定してください。
 *        また、ゲージ最大値より残量が多くなることはありません)
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ残量に設定することができます。
 *
 *     ・変数によってゲージ残量が決められている場合、このコマンドによって
 *       変数の値が変化します。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   $gameMap.setGaugeMaxValue([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ最大値を指定した[数字]に設定します。
 *       ([数字]は0より大きい値を指定してください)
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ最大値に設定することができます。
 *
 *     ・ゲージ最大値がゲージ残量を下回る場合、このコマンドによって
 *       ゲージ残量がゲージ最大値と同じになります。
 *
 *     ・変数によってゲージ最大値/残量が決められている場合、このコマンドによって
 *       変数の値が変化します
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、何も変化しません。
 *
 *   $gameMap.getGaugeValue([イベントID]);
 *     ・指定した[イベントID]のゲージ残量を返します。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・変数によってゲージ残量が決められている場合、
 *       返ってくる値は変数の値と同じです。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、-1を返します。
 *
 *   $gameMap.getGaugeMaxValue([イベントID]);
 *     ・指定した[イベントID]のゲージ最大値を返します。
 *
 *     ・[イベントID]を0にすることで、コマンドを実行したイベントを対象にします。
 *
 *     ・イベント_メモ欄にゲージ表示が設定されていない場合、-1を返します。
 *
 *   $gameMap.setGaugeOffsetX([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージX座標オフセットを
 *       指定した[数字]に設定します。
 *
 *     ・オフセットが指定されたゲージは指定された[数字]分、
 *       本来の描画位置から横方向にズレて表示されます。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージオフセットに設定することができます。
 *
 *   $gameMap.setGaugeOffsetY([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージY座標オフセットを
 *       指定した[数字]に設定します。
 *
 *     ・オフセットが指定されたゲージは指定された[数字]分、
 *       本来の描画位置から縦方向にズレて表示されます。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージオフセットに設定することができます。
 *
 *   $gameMap.setGaugeBackColor([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ背景色番号を指定した[数字]に設定します。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ背景色番号に設定することができます。
 *
 *   $gameMap.setGaugeColor1([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ表示色番号を指定した[数字]に設定します。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ表示色番号に設定することができます。
 *
 *   $gameMap.setGaugeColor2([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ表示色番号を指定した[数字]に設定します。
 *
 *     ・ゲージのグラデーションが必要ない場合は
 *       ゲージカラー1と同じ数字を指定します。
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ表示色番号に設定することができます。
 *
 *   $gameMap.setGaugeOpacity([イベントID], [数字]);
 *     ・指定した[イベントID]のゲージ不透明度を指定した[数字]に設定します。
 *       ([数字]は0-255の間の値を指定してください)
 *
 *     ・[イベントID]をthis._eventIdにすることで、
 *       コマンドを実行したイベントを対象にします。
 *
 *     ・[数字]の代わりにスクリプト$gameVariables.value(n)を使うことで、
 *       変数n番の値をゲージ不透明度に設定することができます。
 *
 *
 * 補足：
 *   ・このプラグインに関するメモ欄の設定、プラグインコマンドは
 *     大文字/小文字を区別していません。
 *
 *   ・プラグインパラメーターの説明に、[初期値]と書かれているものは
 *     イベントのメモ欄で個別に設定が可能です。
 *     設定した場合、[初期値]よりメモ欄の設定が
 *     優先されますのでご注意ください。
 *
 *
 * 利用規約:
 *   ・作者に無断で本プラグインの改変、再配布が可能です。
 *     (ただしヘッダーの著作権表示部分は残してください。)
 *
 *   ・利用形態(フリーゲーム、商用ゲーム、R-18作品等)に制限はありません。
 *     ご自由にお使いください。
 *
 *   ・本プラグインを使用したことにより発生した問題について作者は一切の責任を
 *     負いません。
 *
 *   ・要望などがある場合、本プラグインのバージョンアップを行う
 *     可能性がありますが、バージョンアップにより本プラグインの仕様が
 *     変更される可能性があります。
 *     ご了承ください。
 *
 *
 * @param Gauge_Width
 * @desc [初期値] ゲージの長さを数値で指定してください。(デフォルト:40)
 * @default 40
 *
 * @param Gauge_Height
 * @desc [初期値] ゲージの高さを数値で指定してください。(デフォルト:40)
 * @default 10
 *
 * @param Gauge_Offset_X
 * @desc [初期値] ゲージX座標をズラして表示する場合は指定してください。(プラス値で右へ、マイナス値で左に)(デフォルト:0)
 * @default 0
 *
 * @param Gauge_Offset_Y
 * @desc [初期値] ゲージY座標をズラして表示する場合は指定してください。(プラス値で下へ、マイナス値で上に)(デフォルト:0)
 * @default 0
 *
 * @param Gauge_Visible
 * @desc [初期値] 初めからゲージを表示しておく場合はON、後から表示させる場合はOFFを指定してください。(デフォルト:ON)
 * @default ON
 *
 * @param Gauge_Color_1
 * @desc [初期値] ゲージの表示色番号を指定してください。(実際に表示される色はsystem/Window.pngを参照してください)(デフォルト:20)
 * @default 20
 *
 * @param Gauge_Color_2
 * @desc [初期値] ゲージの表示色番号を指定してください。(この項目はグラデーション用です)(デフォルト:21)
 * @default 21
 *
 * @param Gauge_Back_Color
 * @desc ゲージ背景の表示色番号を指定してください。(ゲージ全体が背景色で塗られ、残量分がゲージ表示色で塗られます)(デフォルト:19)
 * @default 19
 *
 * @param Gauge_Opacity
 * @desc [初期値] ゲージの不透明度(0～255)を指定してください。(0でゲージが透明になります)(デフォルト:255)
 * @default 255
 *
 * @param Gauge_In_Picture
 * @desc 指定した番号のピクチャーよりゲージを上に表示します。(0の場合、ゲージは全ピクチャーの下に表示)(デフォルト:0)
 * @default 0
 *
 * @param Tile_Gauge_Enable
 * @desc タイルセットイベントに対してゲージを表示させるか選択します。(デフォルト:表示させない)
 * @type boolean
 * @on 表示させる
 * @off 表示させない
 * @default false
 *
*/

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

(function () {
    'use strict';
    var PN, Params;
    PN = "MKR_EventGauge";

    var CheckParam = function(type, param, def, min, max) {
        var Parameters, regExp, value;
        Parameters = PluginManager.parameters(PN);

        if(arguments.length < 4) {
            min = -Infinity;
            max = Infinity;
        }
        if(arguments.length < 5) {
            max = Infinity;
        }
        if(param in Parameters) {
            value = String(Parameters[param]);
        } else {
            throw new Error("[CheckParam] プラグインパラメーターがありません: " + param);
        }

        value = value.replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');

        regExp = /^\x1bV\[\d+\]$/i;
        if(!regExp.test(value)) {
            switch(type) {
                case "bool":
                    if(value == "") {
                        value = (def)? true : false;
                    } else {
                        value = value.toUpperCase() === "ON" || value.toUpperCase() === "TRUE" || value.toUpperCase() === "1";
                    }
                    break;
                case "num":
                    if(value == "") {
                        value = (isFinite(def))? parseInt(def, 10) : 0;
                    } else {
                        value = (isFinite(value))? parseInt(value, 10) : (isFinite(def))? parseInt(def, 10) : 0;
                        value = value.clamp(min, max);
                    }
                    break;
                default:
                    throw new Error("[CheckParam] " + param + "のタイプが不正です: " + type);
                    break;
            }
        }

        return [value, type, def, min, max, param];
    };

    var convertEscapeCharacters = function(text) {
        var windowChild;

        if(typeof text != "string") {
            return text;
        }

        if(SceneManager._scene) {
            windowChild = SceneManager._scene._windowLayer.children[0];
            text = windowChild ? windowChild.convertEscapeCharacters(text) : ConvVb(text);
        } else {
            text = ConvVb(text);
        }

        return text;
    };

    var ConvVb = function(text) {
        var num;

        if(typeof text != "string") {
            return text;
        }

        text = text.replace(/\x1bV\[(\d+)\]/i, function() {
            num = parseInt(arguments[1]);
            return $gameVariables.value(num);
        }.bind(this));
        text = text.replace(/\x1bV\[(\d+)\]/i, function() {
            num = parseInt(arguments[1]);
            return $gameVariables.value(num);
        }.bind(this));

        return text;
    }

    var GetMeta = function(meta, name, sep) {
        var value, values, i, count;
        value = "";
        values = [];
        name = name.toLowerCase().trim();

        Object.keys(meta).forEach(function(key) {
            if(key.toLowerCase().trim() == name) {
                value = meta[key].trim();
                return false;
            }
        });

        if(sep !== undefined && sep != "" && value != "") {
            values = value.split(sep);
            count = values.length;
            values = values.map(function(elem) {
                return elem.trim();
            });

            return values;
        }

        return value;
    };

    Params = {
        "GaugeW" : CheckParam("num", "Gauge_Width", 40, 0),
        "GaugeH" : CheckParam("num", "Gauge_Height", 10, 0),
        "GaugeOX" : CheckParam("num", "Gauge_Offset_X", 0),
        "GaugeOY" : CheckParam("num", "Gauge_Offset_Y", 0),
        "GaugeVisible" : CheckParam("bool", "Gauge_Visible", true),
        "GaugeColor1" : CheckParam("num", "Gauge_Color_1", 20, 0,31),
        "GaugeColor2" : CheckParam("num", "Gauge_Color_2", 21, 0, 31),
        "GaugeBackColor" : CheckParam("num", "Gauge_Back_Color", 19, 0, 31),
        "GaugeOpacity" : CheckParam("num", "Gauge_Opacity", 255, 0, 255),
        "GaugeInPict" : CheckParam("num", "Gauge_In_Picture", 0, 0),
        "TileGaugeEnable" : CheckParam("bool", "Tile_Gauge_Enable", false),
    };

    //=========================================================================
    // Game_Interpreter
    //  ・プラグイン用コマンドを定義します。
    //
    //=========================================================================
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        var eventId, value;
        _Game_Interpreter_pluginCommand.call(this, command, args);
        if (command.toLowerCase() === "egauge") {
            eventId = this.eventId();
            value = args[1];
            switch (args[0].toLowerCase()) {
                case "show":
                    $gameMap.showGaugeWindow(eventId);
                    break;
                case "hide":
                    $gameMap.hideGaugeWindow(eventId);
                    break;
                case "add":
                    $gameMap.addGaugeValue(eventId, value);
                    break;
                case "set":
                    $gameMap.setGaugeValue(eventId, value);
                    break;
                case "maxset":
                    $gameMap.setGaugeMaxValue(eventId, value);
                    break;
                case "setx":
                    $gameMap.setGaugeOffsetX(eventId, value);
                    break;
                case "sety":
                    $gameMap.setGaugeOffsetY(eventId, value);
                    break;
                case "backcolor":
                    $gameMap.setGaugeBackColor(eventId, value);
                    break;
                case "color1":
                    $gameMap.setGaugeColor1(eventId, value);
                    break;
                case "color2":
                    $gameMap.setGaugeColor2(eventId, value);
                    break;
                case "opacity":
                    $gameMap.setGaugeOpacity(eventId, value);
                    break;
            }
        }
    };

    //=========================================================================
    // Window_Gauge
    //  ・ゲージウィンドウを定義します。
    //
    //=========================================================================
    function Window_Gauge() {
        this.initialize.apply(this, arguments);
    }

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

    Window_Gauge.prototype.initialize = function(num) {
        var x, y, width, height, option, bitmap, key, ver;

        this._gaugeNum = num;
        width = this.windowWidth();
        height = this.windowHeight();
        x = this.windowX();
        y = this.windowY();
        option = null;
        bitmap = null;

        Window_Base.prototype.initialize.call(this, x, y, width, height);

        try {
            ver = Utils.RPGMAKER_VERSION;
            key = String.randomStr(12);
            ver = ver.replace(/\./g, "");
            if(isFinite(ver)) {
                ver = parseInt(ver);
                if(ver >= 150) {
                    bitmap = ImageManager._imageCache.get(key);
                    if (!bitmap) {
                        bitmap = new Bitmap(width - this.standardPadding() * 2, height - this.standardPadding() * 2);
                        ImageManager._imageCache.add(key, bitmap);
                    }
                    this.contents = bitmap;
                } else if(ver >= 131) {
                    bitmap = ImageManager.cache.getItem(key);
                    if (!bitmap) {
                        bitmap = new Bitmap(width - this.standardPadding() * 2, height - this.standardPadding() * 2);
                        ImageManager.cache.setItem(key, bitmap);
                    }
                    this.contents = bitmap;
                }
            }
        } catch(e) {
            // console.log(e);
        }

        this.opacity = 0;

        option = $gameMap.event(num).getGaugeOption();

        if(option["Visible"] == 0) {
            this.hide();
        }
        if(option["PaintO"] >= 0) {
            this.contents.paintOpacity = option["PaintO"];
        }
    };

    Window_Gauge.prototype.windowWidth = function() {
        var option;
        option = $gameMap.event(this._gaugeNum).getGaugeOption();

        return option["Width"] + this.standardPadding() * 2;
    };

    Window_Gauge.prototype.windowHeight = function() {
        var option;
        option = $gameMap.event(this._gaugeNum).getGaugeOption();

        return option["Height"] + this.standardPadding() * 2;
    };

    Window_Gauge.prototype.windowX = function() {
        var option, value;
        value = 0;

        if(!$gameMap.event(this._gaugeNum) || $gameMap.event(this._gaugeNum)._erased) {
            return;
        }

        option = $gameMap.event(this._gaugeNum).getGaugeOption();
        switch(option["Fix"]) {
            case 1:
                break;
            case 2:
                value = Graphics.boxWidth / 2 - this.width / 2;
                break;
            case 3:
                value = Graphics.boxWidth - this.width;
                break;
            default:
                value = $gameMap.event(this._gaugeNum).screenX() - this.width / 2;
                break;
        }
        value += option["OffsetX"];

        return value;
    };

    Window_Gauge.prototype.windowY = function() {
        var option, value;
        value = 0;

        if(!$gameMap.event(this._gaugeNum) || $gameMap.event(this._gaugeNum)._erased) {
            return;
        }

        option = $gameMap.event(this._gaugeNum).getGaugeOption();
        if(option["Fix"] != null) {
            value = Graphics.boxHeight - this.height;
        } else {
            value = $gameMap.event(this._gaugeNum).screenY();
        }
        value += option["OffsetY"];

        return value;
    };

    Window_Gauge.prototype.update = function() {
        Window_Base.prototype.update.call(this);
        this.updateGauge();
        this.updatePosition();
        this.updateVisibility();
    };

    Window_Gauge.prototype.updateVisibility = function() {
        var chara;
        chara = $gameMap.event(this._gaugeNum);

        if(!chara) {
            $gameMap.delGaugeInfo(this._gaugeNum);
            this.parent.removeChild(this);
            return false;
        }

        if (chara.isHideGauge() || chara.isTransparent() || !$gameMap.getGaugeInfo(this._gaugeNum)) {
            this.hide();
        } else if(chara.characterName() == "" && (chara.tileId() == 0 || !Params.TileGaugeEnable[0])) {
            this.hide();
        } else if(!chara.isHideGauge()) {
            this.show();
        }

        if(chara._erased) {
            $gameMap.delGaugeInfo(this._gaugeNum);
            this.parent.removeChild(this);
        }

    };

    Window_Gauge.prototype.updateGauge = function() {
        var color1, color2, backColor, width, height, fillW, option, opacity;
        width = this.contents.width;
        height = this.contents.height;

        if(!$gameMap.event(this._gaugeNum) || $gameMap.event(this._gaugeNum)._erased) {
            this.contents.clear();
            return;
        }

        option = $gameMap.event(this._gaugeNum).getGaugeOption();
        color1 = this.textColor(option["Color1"]);
        color2 = this.textColor(option["Color2"]);
        backColor = this.textColor(option["BackC"]);
        opacity = option["PaintO"];

        fillW = Math.floor(width * $gameMap.event(this._gaugeNum).gaugeRate());

        this.contents.clear();
        this.contents.fillRect(0, 0, width, height, backColor);
        this.contents.gradientFillRect(0, 0, fillW, height, color1, color2);
        this.contents.paintOpacity = opacity;
    };

    Window_Gauge.prototype.updatePosition = function() {
        if(!$gameMap.event(this._gaugeNum) || $gameMap.event(this._gaugeNum)._erased) {
            return;
        }

        this.x = this.windowX();
        this.y = this.windowY();
        this.z = $gameMap.event(this._gaugeNum).screenZ();
    };

    //=========================================================================
    // Spriteset_Map
    //  ・イベントにゲージウィンドウを追加する処理を定義します。
    //
    //=========================================================================
    var _Spriteset_Map_createUpperLayer = Spriteset_Map.prototype.createUpperLayer;
    Spriteset_Map.prototype.createUpperLayer = function() {
        _Spriteset_Map_createUpperLayer.call(this);

        $gameMap.events().forEach(function(event) {
            if(event && GetMeta(event.event().meta, "egauge") != "") {
                $gameMap.addGaugeInfo({id:event.eventId(), generated:false});
            }
        }, this);
    };

    const _Spriteset_Map_update = Spriteset_Map.prototype.update;
    Spriteset_Map.prototype.update = function() {
        _Spriteset_Map_update.call(this);

        this.createGaugeWindow();
    };

    Spriteset_Map.prototype.createGaugeWindow = function() {
        let i, id, push, event, gaugeWindow;
        i = 0;
        push = $gameMap.getGaugePush();

        if(!push || push.length < 1) {
            return;
        }

        while(push.length) {
            event = $gameMap.event(push.shift());
            if(!event || event._erased) {
                break;
            }
            gaugeWindow = new Window_Gauge(event.eventId());
            if(gaugeWindow != null) {
                if(Params.GaugeInPict[0] > 0) {
                    this._pictureContainer.addChildAt(gaugeWindow, Params.GaugeInPict[0] + i);
                    i++;
                } else {
                    // this.addChildAt(gaugeWindow, 100 + i);
                    this._tilemap.addChild(gaugeWindow);
                    i++
                }
                $gameMap.generatedGauge(event.eventId());
            }
        }
    };

    //=========================================================================
    // Game_Map
    //  ・ウィンドウゲージ群を保持する処理を定義します。
    //  ・プラグイン用コマンドを定義します。
    //
    //=========================================================================
    var _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function(mapId) {
        _Game_Map_setup.call(this, mapId);

        this.initGauge();
    };

    Game_Map.prototype.initGauge = function() {
        this._gaugeInfos = [];
        this._gaugePush = [];
    };

    Game_Map.prototype.getGaugeInfo = function(id) {
        let info, i, cnt;
        info = null;
        i = 0;

        if(id < 1 || !this._gaugeInfos) {
            return info;
        }

        cnt = this._gaugeInfos.length;
        for(i; i < cnt; i++) {
            if(this._gaugeInfos[i].id == id) {
                info = this._gaugeInfos[i];
                break;
            }
        }

        // return this._gaugeInfos.indexOf(id);
        return info;
    };

    Game_Map.prototype.getGaugeInfos = function() {
        return this._gaugeInfos;
    };

    Game_Map.prototype.setGaugeInfos = function(gaugeInfos) {
        this._gaugeInfos = gaugeInfos;
    }

    Game_Map.prototype.generatedGauge = function(id) {
        let info, i, cnt;
        info = null;
        cnt = this._gaugeInfos.length;
        i = 0;

        if(id < 1) {
            return false;
        }

        for(i; i < cnt; i++) {
            if(this._gaugeInfos[i].id == id) {
                this._gaugeInfos[i].generated = true;
                break;
            }
        }

        return true;
    };

    Game_Map.prototype.isGeneratedGauge = function(id) {
        let info, i, cnt;
        cnt = this._gaugeInfos.length;
        i = 0;

        if(id < 1) {
            return true;
        }

        for(i; i < cnt; i++) {
            if(this._gaugeInfos[i].id == id) {
                return this._gaugeInfos[i].generated;
            }
        }

        return true;
    };

    Game_Map.prototype.addGaugeInfo = function(info) {
        if(!this._gaugeInfos) {
            this.initGauge();
        }
        this._gaugeInfos.push(info);
        this._gaugePush.push(info.id);
    };

    Game_Map.prototype.delGaugeInfo = function(id) {
        let num, i, cnt;
        cnt = this._gaugeInfos.length;
        num = -1;
        i = 0;

        if(id < 1) {
            return false;
        }

        // num = this._gaugeInfos.indexOf(id);
        for(; i < cnt; i++) {
            if(this._gaugeInfos[i].id == id) {
                num = i;
                break;
            }
        }
        if(num > -1) {
            this._gaugeInfos.splice(num, 1);
        }

        if(!this.event(id)) {
            return;
        }
        this.event(id).delMember();
    };

    Game_Map.prototype.getGaugePush = function() {
        return this._gaugePush;
    };

    Game_Map.prototype.setGaugePush = function(gaugePush) {
        this._gaugePush = gaugePush;
    };

    Game_Map.prototype.showGaugeWindow = function(eventId) {
        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).showGauge();
        }
    };

    Game_Map.prototype.hideGaugeWindow = function(eventId) {
        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).hideGauge();
        }
    };

    Game_Map.prototype.isHideGaugeWindow = function(eventId) {
        var gaugeNum, gaugeWindow, result;
        result = false;

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            result = this.event(eventId).isHideGauge();
        }

        return result;
    };

    Game_Map.prototype.addGaugeValue = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).addGaugeValue(value);
        }
    };

    Game_Map.prototype.setGaugeValue = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeValue(value);
        }
    };

    Game_Map.prototype.getGaugeValue = function(eventId) {
        var value;
        value = -1;

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            value = this.event(eventId).getGaugeValue();
        }

        return value;
    };

    Game_Map.prototype.setGaugeMaxValue = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeMaxValue(value);
        }
    };

    Game_Map.prototype.getGaugeMaxValue = function(eventId) {
        var value;
        value = -1;

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            value = this.event(eventId).getGaugeMaxValue();
        }

        return value;
    };

    Game_Map.prototype.setGaugeOffsetX = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeOffsetX(value);
        }
    };

    Game_Map.prototype.setGaugeOffsetY = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeOffsetY(value);
        }
    };

    Game_Map.prototype.setGaugeBackColor = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeBackColor(value);
        }
    };

    Game_Map.prototype.setGaugeColor1 = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeColor1(value);
        }
    };

    Game_Map.prototype.setGaugeColor2 = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            this.event(eventId).setGaugeColor2(value);
        }
    };

    Game_Map.prototype.setGaugeOpacity = function(eventId, value) {
        value = String(value).replace(/\\/g, '\x1b');
        value = value.replace(/\x1b\x1b/g, '\\');
        if(/\x1bV\[\d+\]/i.test(value)) {
            value = ConvVb(value);
        }

        if(eventId == 0) {
            eventId = this._interpreter.eventId();
        }

        if(eventId > 0 && eventId < this._events.length) {
            console.log(eventId + " set opacity:" + value);
            this.event(eventId).setGaugeOpacity(value);
        }
    };

    //=========================================================================
    // Game_Event
    //  ・イベントの追加メンバーと関連メソッドを定義します。
    //
    //=========================================================================
    var _Game_Event_initialize = Game_Event.prototype.initialize;
    Game_Event.prototype.initialize = function(mapId, eventId) {
        _Game_Event_initialize.apply(this, arguments);

        if(GetMeta(this.event().meta, "egauge") != "") {
            this.addMembers();
        }
    };

    Game_Event.prototype.addMembers = function() {
        var vr, mvr, value, metas;

        vr = 0;
        mvr = 0;
        this._gauge = 0;
        this._gaugeMax = 0;
        this._gaugeNum = -1;
        this._gaugeVr = 0;
        this._gaugeMvr = 0;
        this._gaugeType = "num";
        this._gaugeOption = {
            "Width"   : Params.GaugeW[0],
            "Height"  : Params.GaugeH[0],
            "OffsetX" : Params.GaugeOX[0],
            "OffsetY" : Params.GaugeOY[0],
            "Fix"     : null,
            "Visible" : Params.GaugeVisible[0],
            "Color1"  : Params.GaugeColor1[0],
            "Color2"  : Params.GaugeColor2[0],
            "BackC"   : Params.GaugeBackColor[0],
            "PaintO"  : Params.GaugeOpacity[0],
        };

        metas = GetMeta(this.event().meta, "egauge", " ");

        if(!metas || metas.length <= 0) {
            return false;
        }

        metas.forEach(function(meta) {
            meta = meta.trim().toLowerCase();
            if(/^vr(\d+)$/.test(meta)) {
                vr = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : 0;
                this._gaugeType = "vr";
            }
            if(/^mvr(\d+)$/.test(meta)) {
                mvr = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : 0;
                this._gaugeType = "vr";
            }
            if(/^(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : 0;
                if(value > 0 && this._gaugeType == "num") {
                    this._gauge = value;
                    this._gaugeMax = value;
                }
            }
            if(/^wh(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : 0;
                if(value > 0) {
                    this._gaugeOption["Width"] = value;
                }
            }
            if(/^ht(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : 0;
                if(value > 0) {
                    this._gaugeOption["Height"] = value;
                }
            }
            if(/^xs(-?\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : null;
                if(value != null) {
                    this._gaugeOption["OffsetX"] = value;
                }
            }
            if(/^ys(-?\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : null;
                if(value != null) {
                    this._gaugeOption["OffsetY"] = value;
                }
            }
            if(/^fx([1-3])$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : null;
                if(value != null) {
                    this._gaugeOption["Fix"] = value;
                }
            }
            if(/^vs([0-1])$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : null;
                if(value != null) {
                    this._gaugeOption["Visible"] = value;
                }
            }
            if(/^fc(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : -1;
                if(value >= 0 && value <= 31) {
                    this._gaugeOption["Color1"] = value;
                }
            }
            if(/^sc(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : -1;
                if(value >= 0 && value <= 31) {
                    this._gaugeOption["Color2"] = value;
                }
            }
            if(/^bc(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : -1;
                if(value >= 0 && value <= 31) {
                    this._gaugeOption["BackC"] = value;
                }
            }
            if(/^op(\d+)$/.test(meta)) {
                value = isFinite(RegExp.$1) ? parseInt(RegExp.$1, 10) : -1;
                if(value >= 0 && value <= 255) {
                    this._gaugeOption["PaintO"] = value;
                }
            }
        }, this);

        if(vr > 0 && mvr > 0) {
            this._gaugeVr = vr;
            this._gaugeMvr = mvr;
            // this._gauge = 0;
            // this._gaugeMax = 0;
            this._gaugeType = "vr";
            value = $gameVariables.value(mvr);
            if(isFinite(value)) {
                this._gaugeMax = parseInt(value, 10);
            }
            value = $gameVariables.value(vr);
            if(isFinite(value)) {
                this._gauge = parseInt(value, 10);
            }
        } else if(vr > 0) {
            this._gaugeVr = vr;
            this._gaugeMvr = 0;
            // this._gaugeMax = 0;
            this._gaugeType = "a_vr";
            value = $gameVariables.value(vr);
            if(isFinite(value)) {
                this._gaugeMax = parseInt(value, 10);
                this._gauge = parseInt(value, 10);
            }
        } else if(mvr > 0) {
            this._gaugeVr = 0;
            this._gaugeMvr = mvr;
            // this._gaugeMax = 0;
            this._gaugeType = "a_mvr";
            value = $gameVariables.value(mvr);
            if(isFinite(value)) {
                this._gaugeMax = parseInt(value, 10);
                this._gauge = parseInt(value, 10);
            }
        }

        $gameMap.addGaugeInfo({id:this.eventId(), generated:false});
    };

    var _Game_Event_update = Game_Event.prototype.update;
    Game_Event.prototype.update = function() {
        _Game_Event_update.call(this);

        this.checkGaugeVariable();
    };

    // ゲージ残量と最大値の関係チェック
    Game_Event.prototype.checkGaugeVariable = function() {
        let gaugeValue, gaugeMaxValue;

        if(!this.gaugeEnable()) {
            return false;
        }

        gaugeValue = this.getGaugeValue();
        gaugeMaxValue = this.getGaugeMaxValue();

        if(gaugeValue > gaugeMaxValue) {
            this.setGaugeValue(gaugeMaxValue);
        }

    };

    Game_Event.prototype.gaugeEnable = function() {
        return this._gaugeType !== undefined;
    };

    Game_Event.prototype.gaugeRate = function() {
        var value, maxValue;

        if(!this.gaugeEnable()) {
            return 0;
        }

        value = this.getGaugeValue();
        maxValue = this.getGaugeMaxValue();
        if(maxValue == 0) {
            return 0;
        }

        return value / maxValue;
    };

    Game_Event.prototype.setGaugeNum = function(index) {
        if(this.gaugeEnable()) {
            this._gaugeNum = index;
        }
    };

    Game_Event.prototype.getGaugeNum = function() {
        var value;
        value = -1;

        if(this.gaugeEnable()) {
            value = this._gaugeNum;
        }

        return value;
    };

    Game_Event.prototype.addGaugeValue = function(value) {
        var gameValue, result;
        value = isFinite(value) ? parseInt(value, 10) : 0;

        if(!this.gaugeEnable()) {
            return false;
        }

        gameValue = this.getGaugeValue();

        if(value != 0) {
            result = gameValue + value;
            gameValue = this.getGaugeMaxValue();
            if(result < 0) {
                result = 0;
            } else if(result > gameValue) {
                result = gameValue;
            }
            this.setGaugeValue(result);
        }

    };

    Game_Event.prototype.setGaugeValue = function(value) {
        var maxValue;
        value = isFinite(value) ? parseInt(value, 10) : -1;

        if(!this.gaugeEnable()) {
            return false;
        }

        maxValue = this.getGaugeMaxValue();
        if(value > maxValue) {
            value = maxValue;
        }

        if(value >= 0) {
            switch(this._gaugeType) {
                case "vr":
                case "a_vr":
                    $gameVariables.setValue(this._gaugeVr, value);
                    break;
                case "a_mvr":
                case "num":
                    this._gauge = value;
                    break;
            }
        }

    };

    Game_Event.prototype.getGaugeValue = function() {
        var value;
        value = -1;

        if(!this.gaugeEnable()) {
            return value;
        }

        switch(this._gaugeType) {
            case "vr":
            case "a_vr":
                value = $gameVariables.value(this._gaugeVr);
                break;
            case "a_mvr":
            case "num":
                value = this._gauge;
                break;
        }

        return value;
    };

    Game_Event.prototype.setGaugeMaxValue = function(value) {
        var maxValue;
        value = isFinite(value) ? parseInt(value, 10) : 0;

        if(!this.gaugeEnable()) {
            return false;
        }

        if(value <= 0) {
            return false;
        }

        maxValue = this.getGaugeMaxValue();

        switch(this._gaugeType) {
            case "vr":
                if(value < maxValue) {
                    $gameVariables.setValue(this._gaugeVr, value);
                }
                $gameVariables.setValue(this._gaugeMvr, value);
                break;
            case "a_vr":
                if(value < maxValue) {
                    $gameVariables.setValue(this._gaugeVr, value);
                }
                this._gaugeMax = value;
                break;
            case "a_mvr":
                if(value < maxValue) {
                    this._gauge = value;
                }
                $gameVariables.setValue(this._gaugeMvr, value);
                break;
            case "num":
                if(value < maxValue) {
                    this._gauge = value;
                }
                this._gaugeMax = value;
                break;
        }

    };

    Game_Event.prototype.getGaugeMaxValue = function() {
        var value;
        value = -1;

        if(!this.gaugeEnable()) {
            return value;
        }

        switch(this._gaugeType) {
            case "vr":
            case "a_mvr":
                value = $gameVariables.value(this._gaugeMvr);
                break;
            case "a_vr":
            case "num":
                value = this._gaugeMax;
                break;
        }

        return value;
    };

    Game_Event.prototype.setGaugeOffsetX = function(value) {
        value = isFinite(value) ? parseInt(value, 10) : null;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["OffsetX"] = value;
        }
    };

    Game_Event.prototype.setGaugeOffsetY = function(value) {
        value = isFinite(value) ? parseInt(value, 10) : null;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["OffsetY"] = value;
        }
    };

    Game_Event.prototype.getGaugeOption = function() {
        return this._gaugeOption;
    };

    Game_Event.prototype.hideGauge = function() {
        if(this.gaugeEnable()) {
            this._gaugeOption["Visible"] = false;
        }
    };

    Game_Event.prototype.showGauge = function() {
        if(this.gaugeEnable()) {
            this._gaugeOption["Visible"] = true;
        }
    };

    Game_Event.prototype.isHideGauge = function() {
        return this.gaugeEnable() ? !this._gaugeOption["Visible"] : false;
    };

    Game_Event.prototype.setGaugeBackColor = function(value) {
        value = isFinite(value) ? parseInt(value, 10) : null;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["BackC"] = value;
        }
    };

    Game_Event.prototype.setGaugeColor1 = function(value) {
        value = isFinite(value) ? parseInt(value, 10) : null;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["Color1"] = value;
        }
    };

    Game_Event.prototype.setGaugeColor2 = function(value) {
        value = isFinite(value) ? parseInt(value, 10) : null;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["Color2"] = value;
        }
    };

    Game_Event.prototype.setGaugeOpacity = function(value) {
        var gameValue;
        value = isFinite(value) ? parseInt(value, 10) : 0;

        if(this.gaugeEnable() && value !== null) {
            this._gaugeOption["PaintO"] = value;
        }
    };

    Game_Event.prototype.delMember = function() {
        if(this._gauge !== undefined) {
            delete this._gauge;
        }
        if(this._gaugeMax !== undefined) {
            delete this._gaugeMax;
        }
        if(this._gaugeNum !== undefined) {
            delete this._gaugeNum;
        }
        if(this._gaugeVr !== undefined) {
            delete this._gaugeVr;
        }
        if(this._gaugeMvr !== undefined) {
            delete this._gaugeMvr;
        }
        if(this._gaugeType !== undefined) {
            delete this._gaugeType;
        }
        if(this._gaugeOption !== undefined) {
            delete this._gaugeOption;
        }
    };

    //=========================================================================
    // DataManager
    //  ・セーブデータにゲージ情報を含まないようにします。
    //
    //=========================================================================
    const _DataManager_saveGameWithoutRescue = DataManager.saveGameWithoutRescue;
    DataManager.saveGameWithoutRescue = function(savefileId) {
        const gaugeInfos = ($gameMap.getGaugeInfos()) ? [...$gameMap.getGaugeInfos()] : [];
        const gaugePush = ($gameMap.getGaugePush()) ? [...$gameMap.getGaugePush()] : [];
        $gameMap.initGauge();
        const result = _DataManager_saveGameWithoutRescue.call(this, savefileId);
        if(gaugeInfos.length > 0) {
            $gameMap.setGaugeInfos(gaugeInfos);
        }
        if(gaugePush.length > 0) {
            $gameMap.setGaugePush(gaugePush);
        }
        return result;
    };

    //=========================================================================
    // String
    //  ・ランダムな文字列を生成する処理を定義します。
    //
    //=========================================================================
    String.randomStr = function(length) {
        var str, random, i;
        str = "";
        length = length || 32;

        for (i = 0; i < length; i++) {
            random = Math.random() * 16 | 0;
            str += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);
        }

        return str;
    };

})();


code:
//=============================================================================
// MKR_MapScrollFix.js
//=============================================================================
// Copyright (c) 2016 マンカインド
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.0 2019/07/28 DP_MapZoomプラグインとの競合を修正
//
// 1.0.4 2019/07/15 画面固定時、画面のスクロールを
//                  タイル単位で行わないようにできる設定を追加
//
// 1.0.3 2017/10/24 画面固定時、ジャンプ移動で画面外へ移動できていた
//                  問題を修正。
//
// 1.0.2 2017/10/20 一部プラグインとの競合に対応。
//
// 1.0.1 2017/10/04 スクロール固定時、画面外への離脱と画面内への侵入を
//                  制限できるようにした。
//
// 1.0.0 2016/10/24 初版公開。
// ----------------------------------------------------------------------------
// [Twitter] https://twitter.com/mankind_games/
//  [GitHub] https://github.com/mankindGames/
//    [Blog] http://mankind-games.blogspot.jp/
//=============================================================================

/*:
 *
 * @plugindesc (v1.1.0) マップスクロール固定プラグイン
 * @author マンカインド
 *
 * @help = MKR_MapScrollFix.js =
 * 指定されたスイッチがオンの間、
 * プレイヤーの移動によるマップスクロールを固定します。
 *
 * プラグインパラメータ(以下、パラメータ)でスクロールを禁止するための
 * スイッチ番号を指定します。
 * ゲーム中にそのスイッチがオンになると画面スクロールが固定されます。
 *
 *
 * パラメータ[画面外への離脱/画面内への侵入]により、
 * イベントが固定された画面から外への離脱、画面内への侵入が可能か設定できます。
 * (プレイヤー/イベントがすり抜けONの場合、この設定は無視されます)
 *
 *
 * スクロール固定はタイル(48px四方)単位で行われます。
 * そのため、解像度変更などでマップ画面の更新がタイル単位で行われなくなった場合、
 * 画面表示がタイル単位になるようスクロールされてから固定が行われます。
 *
 * パラメータ[画面固定方法]で「緩和する」を設定することで、
 * タイル単位ではなくその場で画面が固定されます。
 * ただし、キャラクター移動はタイル単位となっているため、
 * 画面固定の結果、画面内に収まっていないタイルは画面外と判定されます。
 *
 *
 * プラグイン:DP_MapZoom.js(以下、MapZoomプラグイン)併用時、
 * プラグイン管理画面で本プラグインをMapZoomプラグインより下に登録し
 * 本プラグインのプラグインパラメータ[MapZoom併用]を「有効にする」と
 * 設定してください。
 *
 *
 * プラグインコマンド:
 *   ありません。
 *
 *
 * スクリプトコマンド:
 *   ありません。
 *
 *
 * 補足：
 *   ・このプラグインに関するメモ欄の設定、プラグインコマンド/パラメーター、
 *     制御文字は大文字/小文字を区別していません。
 *
 *
 * 利用規約:
 *   ・作者に無断で本プラグインの改変、再配布が可能です。
 *     (ただしヘッダーの著作権表示部分は残してください。)
 *
 *   ・利用形態(フリーゲーム、商用ゲーム、R-18作品等)に制限はありません。
 *     ご自由にお使いください。
 *
 *   ・本プラグインを使用したことにより発生した問題について作者は一切の責任を
 *     負いません。
 *
 *   ・要望などがある場合、本プラグインのバージョンアップを行う
 *     可能性がありますが、
 *     バージョンアップにより本プラグインの仕様が変更される可能性があります。
 *     ご了承ください。
 *
 *
 * @param Default_Scroll_Fix_Sw
 * @text スクロール固定スイッチ
 * @desc 画面スクロールを固定するスイッチの番号を指定します。
 * @type switch
 * @default 10
 *
 * @param Is_Display_Out
 * @text 画面外への離脱
 * @desc 画面スクロール固定時、イベントが画面外へと移動可能か選択します。
 * @type boolean
 * @on 移動可能
 * @off 移動不可
 * @default true
 *
 * @param Is_Display_In
 * @text 画面内への侵入
 * @desc 画面スクロール固定時、画面外にいるイベントが画面内へと移動可能か選択します。
 * @type boolean
 * @on 移動可能
 * @off 移動不可
 * @default true
 *
 * @param Scroll_Fix_Type
 * @text 画面固定方法
 * @type select
 * @option 厳格に行う
 * @value 1
 * @option 緩和する
 * @value 0
 * @default 1
 * @desc ゲーム画面内にマップタイルが収まる(=画面解像度がタイル1マスのサイズ、48の倍数である)場合は[厳格に行う]を選択します。
 *
 * @param Enable_MapZoom
 * @text MapZoom併用
 * @desc DP_MapZoom.jsプラグイン併用時、「有効する」に設定してください
 * @type boolean
 * @on 有効にする
 * @off 無効にする
 * @default false
 *
*/

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

(function () {
    'use strict';

    const PN = "MKR_MapScrollFix";

    const CheckParam = function(type, name, value, def, min, max, options) {
        if(min == undefined || min == null) {
            min = -Infinity;
        }
        if(max == undefined || max == null) {
            max = Infinity;
        }

        if(value == null) {
            value = "";
        } else {
            value = String(value);
        }

        switch(type) {
            case "bool":
                if(value == "") {
                    value = (def)? true : false;
                }
                value = value.toUpperCase() === "ON" || value.toUpperCase() === "TRUE" || value.toUpperCase() === "1";
                break;
            case "num":
                value = (isFinite(value))? parseInt(value, 10) : (isFinite(def))? parseInt(def, 10) : 0;
                value = value.clamp(min, max);
                break;
            default:
                throw new Error("[CheckParam] " + name + "のタイプが不正です: " + type);
                break;
        }

        return [value, type, def, min, max];
    };

    const paramParse = function(obj) {
        return JSON.parse(JSON.stringify(obj, paramReplace));
    }

    const paramReplace = function(key, value) {
        try {
            return JSON.parse(value || null);
        } catch (e) {
            return value;
        }
    };

    const Parameters = paramParse(PluginManager.parameters(PN));
    let Params = {};

    Params = {
        "ScrollFixSw" : CheckParam("num", "Default_Scroll_Fix_Sw", Parameters["Default_Scroll_Fix_Sw"], 10, 0),
        "ScrollFixType" : CheckParam("num", "Scroll_Fix_Type", Parameters["Scroll_Fix_Type"], 1),
        "IsDisplayOut" : CheckParam("bool", "Is_Display_Out", Parameters["Is_Display_Out"], true),
        "IsDisplayIn" : CheckParam("bool", "Is_Display_In", Parameters["Is_Display_In"], true),
        "EnableMapZoom" : CheckParam("bool", "Enable_MapZoom", Parameters["Enable_MapZoom"], false),
    };

    //=========================================================================
    // Game_Player
    //  ・プレイヤー移動による画面のスクロールを再定義します。
    //
    //=========================================================================
    var _Game_Player_updateScroll = Game_Player.prototype.updateScroll;
    Game_Player.prototype.updateScroll = function(lastScrolledX, lastScrolledY) {
        if(!$gameSwitches.value(Params.ScrollFixSw[0])) {
            _Game_Player_updateScroll.apply(this, arguments);
            return;
        }

        if(Params.ScrollFixType[0] != 1) {
            return;
        }

        if($gameMap.displayX() != Math.round($gameMap.displayX())) {
            $gameMap._displayX = Math.round($gameMap.displayX());
        }
        if($gameMap.displayY() != Math.round($gameMap.displayY())) {
            $gameMap._displayY = Math.round($gameMap.displayY());
        }
    };

    //=========================================================================
    // Game_Map
    //  ・マップスクロール処理を再定義します。
    //
    //=========================================================================
    const _Game_Map_scrollDown = Game_Map.prototype.scrollDown;
    Game_Map.prototype.scrollDown = function(distance) {
        if(Params.EnableMapZoom[0] && $gameSwitches.value(Params.ScrollFixSw[0])) {
            return;
        }
        _Game_Map_scrollDown.call(this, distance);
    };

    const _Game_Map_scrollLeft = Game_Map.prototype.scrollLeft;
    Game_Map.prototype.scrollLeft = function(distance) {
        if(Params.EnableMapZoom[0] && $gameSwitches.value(Params.ScrollFixSw[0])) {
            return;
        }
        _Game_Map_scrollLeft.call(this, distance);
    };

    const _Game_Map_scrollRight = Game_Map.prototype.scrollRight;
    Game_Map.prototype.scrollRight = function(distance) {
        if(Params.EnableMapZoom[0] && $gameSwitches.value(Params.ScrollFixSw[0])) {
            return;
        }
        _Game_Map_scrollRight.call(this, distance);
    };

    const _Game_Map_scrollUp = Game_Map.prototype.scrollUp;
    Game_Map.prototype.scrollUp = function(distance) {
        if(Params.EnableMapZoom[0] && $gameSwitches.value(Params.ScrollFixSw[0])) {
            return;
        }
        _Game_Map_scrollUp.call(this, distance);
    };

    //=========================================================================
    // Game_CharacterBase
    //  ・画面外への移動可能判定を定義します
    //
    //=========================================================================
    var _Game_CharacterBase_isMapPassable = Game_CharacterBase.prototype.isMapPassable;
    Game_CharacterBase.prototype.isMapPassable = function(x, y, d) {
        let isPass, x2, y2;
        isPass = _Game_CharacterBase_isMapPassable.apply(this, arguments);

        if(!this.isThrough() && $gameSwitches.value(Params.ScrollFixSw[0])) {
            if(isPass && !Params.IsDisplayOut[0]) {
                isPass = this.isDisplayOutPassible(x, y, d);
            }
            if(isPass && !Params.IsDisplayIn[0]) {
                isPass = this.isDisplayInPassible(x, y, d);
            }
        }
        return isPass;
    };

    Game_CharacterBase.prototype.isDisplayOutPassible = function(x, y, d) {
        let x2, y2, dx, rdx, dy, rdy, realX, realY;
        dx = $gameMap.displayX();
        rdx = dx + $gameMap.screenTileX() - 1;
        dy = $gameMap.displayY();
        rdy = dy + $gameMap.screenTileY() - 1;
        x2 = $gameMap.roundXWithDirection(x, d);
        y2 = $gameMap.roundYWithDirection(y, d);
        realX = this._realX;
        realY = this._realY;

        // switch(true) {
        //     case x == dx && x2 < dx:
        //     case x == rdx && x2 > rdx:
        //     case y == dy && y2 < dy:
        //     case y == rdy && y2 > rdy:
        //     case realX == dx && x2 < dx:
        //     case realX == rdx && x2 > rdx:
        //     case realY == dy && y2 < dy:
        //     case realY == rdy && y2 > rdy:
        //         return false;
        // }

        if(d == 8 || d == 2) {
            switch(true) {
                case y == Math.floor(dy) && y2 < dy:
                case y == Math.ceil(dy) && y2 < dy:
                case y == Math.floor(rdy) && y2 > rdy:
                case y == Math.ceil(rdy) && y2 > rdy:
                case realY == Math.floor(dy) && y2 < dy:
                case realY == Math.ceil(dy) && y2 < dy:
                case realY == Math.floor(rdy) && y2 > rdy:
                case realY == Math.ceil(rdy) && y2 > rdy:
                    return false;
            }
        } else if(d == 6 || d == 4) {
            switch(true) {
                case x == Math.floor(dx) && x2 < dx:
                case x == Math.ceil(dx) && x2 < dx:
                case x == Math.floor(rdx) && x2 > rdx:
                case x == Math.ceil(rdx) && x2 > rdx:
                case realX == Math.floor(dx) && x2 < dx:
                case realX == Math.ceil(dx) && x2 < dx:
                case realX == Math.floor(rdx) && x2 > rdx:
                case realX == Math.ceil(rdx) && x2 > rdx:
                    return false;
            }
        }

        return true;
    };

    Game_CharacterBase.prototype.isDisplayInPassible = function(x, y, d) {
        let x2, y2, dx, rdx, dy, rdy, realX, realY;
        dx = $gameMap.displayX();
        rdx = dx + $gameMap.screenTileX();
        dx--;
        dy = $gameMap.displayY();
        rdy = dy + $gameMap.screenTileY();
        dy--;
        x2 = $gameMap.roundXWithDirection(x, d);
        y2 = $gameMap.roundYWithDirection(y, d);
        realX = this._realX;
        realY = this._realY;

        // switch(true) {
        //     case x == dx && x2 > dx:
        //     case x == rdx && x2 < rdx:
        //     case y == dy && y2 > dy:
        //     case y == rdy && y2 < rdy:
        //     case realX == dx && x2 > dx:
        //     case realX == rdx && x2 < rdx:
        //     case realY == dy && y2 > dy:
        //     case realY == rdy && y2 < rdy:
        //         return false;
        // }

        if(d == 8 || d == 2) {
            switch(true) {
                case y == Math.floor(dy) && y2 > dy:
                case y == Math.ceil(dy) && y2 > dy:
                case y == Math.floor(rdy) && y2 < rdy:
                case y == Math.ceil(rdy) && y2 < rdy:
                case realY == Math.floor(dy) && y2 > dy:
                case realY == Math.ceil(dy) && y2 > dy:
                case realY == Math.floor(rdy) && y2 < rdy:
                case realY == Math.ceil(rdy) && y2 < rdy:
                    return false;
            }
        } else if(d == 6 || d == 4) {
            switch(true) {
                case x == Math.floor(dx) && x2 < dx:
                case x == Math.ceil(dx) && x2 < dx:
                case x == Math.floor(rdx) && x2 > rdx:
                case x == Math.ceil(rdx) && x2 > rdx:
                case realX == Math.floor(dx) && x2 > dx:
                case realX == Math.ceil(dx) && x2 > dx:
                case realX == Math.floor(rdx) && x2 < rdx:
                case realX == Math.ceil(rdx) && x2 < rdx:
                    return false;
            }
        }

        return true;
    };

    const _Game_CharacterBase_updateJump = Game_CharacterBase.prototype.updateJump;
    Game_CharacterBase.prototype.updateJump = function() {
        _Game_CharacterBase_updateJump.call(this);

        let maxDisplayX, maxDisplayY;
        maxDisplayX = $gameMap.displayX() + $gameMap.screenTileX() - 1;
        maxDisplayY = $gameMap.displayY() + $gameMap.screenTileY() - 1;

        if(!this.isThrough() && $gameSwitches.value(Params.ScrollFixSw[0])) {
            if(this._realX > maxDisplayX) {
                this._realX = maxDisplayX;
                this._x = maxDisplayX;
            } else if(this._realX <= $gameMap.displayX()) {
                this._realX = $gameMap.displayX();
                this._x = $gameMap.displayX();
            }
            if(this._realY >= maxDisplayY) {
                this._realY = maxDisplayY;
                this._y = maxDisplayY;
            } else if(this._realY <= $gameMap.displayY()) {
                this._realY = $gameMap.displayY();
                this._y = $gameMap.displayY();
            }
        }
    };

})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// MOG_CollapseEffects.js
//=============================================================================

/*:
 * @plugindesc (v1.6 *) Adiciona efeitos de colapsos animados.
 * @author Moghunter
 *
 * @param Default Collapse
 * @desc Definição do colapso padrão;
 * (0 a 10) (-1 = No Effect / -2 = Random Effects)
 * @default 3
 * @type select
 * @option Shatter Effect 1 (Horizontal)
 * @value 0
 * @option Shatter Effect 2 (Vertical)
 * @value 1
 * @option Shatter Effect 3 (Stripes / Horizontal / Vertical)
 * @value 2
 * @option Shatter Effect 4 (Stripes / Vertical)
 * @value 3
 * @option Fade + Horizontal Zoom (Melting)
 * @value 4
 * @option Fade + Vertical Zoom
 * @value 5
 * @option Fade + Horizontal + Vertical Zoom
 * @value 6
 * @option Fade + Rotation
 * @value 7
 * @option Horizontal Slice
 * @value 8
 * @option Vetical Slice
 * @value 9
 * @option Stone
 * @value 10
 * @option Random
 * @value -2
 * @option No Effect
 * @value -1
 *
 * @param Shatter Direction
 * @desc Definição da direção do Collapso no modo 0;
 * (Left  / Right)
 * @default Left
 * @type select
 * @option Left
 * @value Left
 * @option Right
 * @value Right
 *
 * @help
 * =============================================================================
 * +++ MOG - Collapse Effects (v1.6) +++
 * By Moghunter
 * https://mogplugins.wordpress.com
 * =============================================================================
 * Adiciona efeitos de colapsos animados.
 *
 * =============================================================================
 * - COLLAPSE EFFECT (SKILL & ENEMY)
 * =============================================================================
 * Para forçar um efeito use use as tags abaixo na caixa de notas do inimigo
 * ou SKILLs.
 *
 * Collapse Motion: EFFECT_ID
 *
 * EFFECT ID = Tipo de efeito(0 a 10)
 * 0 - Shatter Effect (Particles + Side Animation)
 * 1 - Shatter Effect (Particles)
 * 2 - Shatter Effect (Stripes + Wave)
 * 3 - Shatter Effect (Stripes)
 * 4 - Fade + Horizontal Zoom.
 * 5 - Fade + Vertical Zoom.
 * 6 - Fade + Horizontal + Vertical Zoom.
 * 7 - Fade + Rotation.
 * 8 - Horizontal Slice.
 * 9 - Vetical Slice.
 * 10 - Stone.
 *
 * =============================================================================
 * - ANIMATION (SKILL & ENEMY)
 * =============================================================================
 * Para forçar uma animação use use as tags abaixo na caixa de notas do inimigo
 * ou SKILLs.
 *
 * Collapse Animation: ANIMATION_ID
 *
 * ANIMATION_ID = Definição da ID da animação do banco de dados.
 *
 * ============================================================================
 * - WHAT'S  NEW (version 1.6)
 * ============================================================================
 * - (BUG FIX)     - Correção de cortar a parte da imagem com
 *                   o plugin MOG_EnemyPose.
 */

//=============================================================================
// ** PLUGIN PARAMETERS
//=============================================================================
　　var Imported = Imported || {};
　　Imported.MOG_CollapseEffects = true;
　　var Moghunter = Moghunter || {};

    Moghunter.parameters = PluginManager.parameters('MOG_CollapseEffects');
	Moghunter.collShatterDirection = String(Moghunter.parameters['Shatter Direction'] || "Left");
    Moghunter.collDefaultCollapse = Number(Moghunter.parameters['Default Collapse'] || 0);

//=============================================================================
// ** Game Battler
//=============================================================================

//==============================
// * initMembers
//==============================
var _mog_cefc_gbat_initMembers = Game_Battler.prototype.initMembers;
Game_Battler.prototype.initMembers = function() {
    _mog_cefc_gbat_initMembers.call(this);
	this._collpaseData = [-1,-1];
};

//==============================
// * Notetags
//==============================
Game_Battler.prototype.notetags = function() {
	if (this.isEnemy()) {return this.enemy().note.split(/[\r\n]+/)};
	if (this.isActor()) {return this.actor().note.split(/[\r\n]+/)};
};

//==============================
// * Perform Collapse
//==============================
var _mog_colefct_gbattler_performCollapse = Game_Battler.prototype.performCollapse;
Game_Battler.prototype.performCollapse = function() {
	_mog_colefct_gbattler_performCollapse.call(this);
	if (this.isEnemy()) {this.checkCollapseEffect()};
};

//==============================
// * Check Collapse Effect
//==============================
Game_Battler.prototype.checkCollapseEffect = function() {
	if (this._collpaseData[0] == -1) {this.setDefaultCollapse()};
	if (this._collpaseData[1] > 0) {this.startAnimation(this._collpaseData[1], false, 0)};
};

//==============================
// * set Default Collapse
//==============================
Game_Battler.prototype.setDefaultCollapse = function() {
   var coltype = Math.min(Math.max(Number(Moghunter.collDefaultCollapse),-2),10);
   if (coltype === -1) {
	   this.performCollapseSoundMG();
	   return;
   };
   if (coltype === -2) {
	   this._collpaseData[0] = Math.randomInt(7);
   } else {
	   this._collpaseData[0] = coltype;
   };
};

//==============================
// * perform Collapse Sound
//==============================
Game_Battler.prototype.performCollapseSoundMG = function() {
    switch (this.collapseType()) {
    case 0:
        SoundManager.playEnemyCollapse();
        break;
    case 1:
        SoundManager.playBossCollapse1();
        break;
    };
};

//==============================
// * Load Collapse Notetags
//==============================
Game_Battler.prototype.loadCollapseNotetags = function() {
    this.notetags().forEach(function(note) {
         var note_data = note.split(': ')
		 if (note_data[0].toLowerCase() == "collapse motion"){
			 var par = note_data[1].split(':');
			 var effect = Math.min(Math.max(Number(par[0]),0),10);
		     this._collpaseData[0]  = effect;
		 } else if (note_data[0].toLowerCase() == "collapse animation"){
			 var par = note_data[1].split(':');
			 var animation_id = Math.min(Math.max(Number(par[0]),0),2000);
		     this._collpaseData[1] = animation_id;
		 };
	},this);
};

//=============================================================================
// ** Game Enemy
//=============================================================================

//==============================
// * Setup
//==============================
var _mog_coleft_genmy_setup = Game_Enemy.prototype.setup;
Game_Enemy.prototype.setup = function(enemyId, x, y) {
	_mog_coleft_genmy_setup.call(this,enemyId, x, y);
    this.loadCollapseNotetags();
};

//==============================
// * perform Collapse *Overwrite
//==============================
Game_Enemy.prototype.performCollapse = function() {
    Game_Battler.prototype.performCollapse.call(this);
    switch (this.collapseType()) {
    case 0:
        this.requestEffect('collapse');
        break;
    case 1:
        this.requestEffect('bossCollapse');
        break;
    case 2:
        this.requestEffect('instantCollapse');
        break;
    }
};

//=============================================================================
// ** Game Action
//=============================================================================

//==============================
// * Apply
//==============================
var _alias_mog_colefct_gaction_apply = Game_Action.prototype.apply;
Game_Action.prototype.apply = function(target) {
	 _alias_mog_colefct_gaction_apply.call(this,target);
	 if (target.isDead() && this._item) {
        if (target.isEnemy()) {this.setCollapseEffect(target)};
	 };
};

//==============================
// * Set Collapse Effect
//==============================
Game_Action.prototype.setCollapseEffect = function(target) {
    if (!this._item || !this._item.object()) {return};
	var item_notes = this._item.object().note.split(/[\r\n]+/);
    item_notes.forEach(function(note) {
         var note_data = note.split(': ')
		 if (note_data[0].toLowerCase() == "collapse effect"){
			 var par = note_data[1].split(':');
			 var effect = Math.min(Math.max(Number(par[0]),0),10);
		     target._collpaseData[0]  = effect;
		 } else if (note_data[0].toLowerCase() == "collapse animation"){
			 var par = note_data[1].split(':');
			 var animation_id = Math.min(Math.max(Number(par[0]),0),2000);
		     target._collpaseData[1] = animation_id;
		 };
	},this);
};

//=============================================================================
// ** Sprite Enemy
//=============================================================================

//==============================
// * set Battler
//==============================
var _mog_colefct_sprEnemy_setBattler = Sprite_Enemy.prototype.setBattler;
Sprite_Enemy.prototype.setBattler = function(battler) {
    _mog_colefct_sprEnemy_setBattler.call(this,battler)
	if (this.isEnemyP()) {this._colpsBitmap = this.bitmap};
};

//==============================
// * Update
//==============================
var _mog_cefc_sprtenemy_update = Sprite_Enemy.prototype.update;
Sprite_Enemy.prototype.update = function() {
	_mog_cefc_sprtenemy_update.call(this);
	if (this._spriteCol != null) {this.setFrame(0,0,0,0)};
};

//==============================
// * update Collapse
//==============================
var _mog_cefc_sprtenmy_updateCollapse = Sprite_Enemy.prototype.updateCollapse;
Sprite_Enemy.prototype.updateCollapse = function() {
	if (this._battler._collpaseData[0] != -1) {this.updateCollapseEffects(); return}
	_mog_cefc_sprtenmy_updateCollapse.call(this)
};

//=============================================================================
// ** Sprite Battler
//=============================================================================

//==============================
// * init Members
//==============================
var _mog_sprtBat_initMembers = Sprite_Battler.prototype.initMembers;
Sprite_Battler.prototype.initMembers = function() {
    _mog_sprtBat_initMembers.call(this);
    this._collEffectWait = 0;
};

//==============================
// * is Enemy P
//==============================
Sprite_Battler.prototype.isEnemyP = function() {
   if (!this._battler) {return false};
   if (!Imported.MOG_EnemyPoses) {return false};
   if (!this._battler.isBPose()) {return false};
   return true;
};

//==============================
// * collapse Type
//==============================
Sprite_Battler.prototype.collapseType = function() {
   return this._battler._collpaseData[0];
};

//==============================
// * Record Pre Collapse
//==============================
Sprite_Battler.prototype.recordPreCollapse = function() {
     this._collData = [0,this.width,this.height,this.rotation,this.scale.x,this.scale.y];
};

//==============================
// * load Pre Collapse
//==============================
Sprite_Battler.prototype.loadPreCollapse = function() {
	 this.rotation = this._collData[3];
	 this.scale.x = this._collData[4];
	 this.scale.y = this._collData[5];
	 this.setFrame(0,0,this._collData[1],this._collData[2]);
};

//==============================
// * remove Collapse Effects
//==============================
Sprite_Battler.prototype.removeCollapseEffects = function() {
	 this._effectDuration = 0;
	 this.filters = null;
	 if (this._spriteCol) {
		 for (var i = 0; i < this._spriteCol.length; i++) {
			  this.removeChild(this._spriteCol[i]);
			  this._spriteCol[i] = null;
		 };
	 };
	 this.loadPreCollapse();
	 this.revertToNormal();
	 this.opacity = 0;
     this._collData = null;
	 this._spriteCol = null;
	 this._collapseMode = false;
};

//==============================
// * setup Collapse Effects
//==============================
Sprite_Battler.prototype.setupCollapseEffect = function() {
	 if (Imported.MOG_BattlerMotion && this._battler) {this._battler.clearBdamage(0)};
	 if (this.collapseType() < 4 || this.collapseType() > 7) {
        if (this._colpsBitmap) {this.bitmap = this._colpsBitmap;};
	 } else {
	    this._collapseMode = true;
	 };
	 this._effectDuration = 400;
	 this._collEffectWait = 1;
	 if (Imported.MOG_FlashDamage) {
         this._collEffectWait = $gameTemp._flashDamage ? 22 : 1;
	 };
	 this.recordPreCollapse();
	 if (this.collapseType() <= 1) {this.setupColShatterPoint();
	 } else if (this.collapseType() === 2 || this.collapseType() === 3) {
		 this.setupColShatterLine();
	 } else if (this.collapseType() === 4 || this.collapseType() === 5 ||
	             this.collapseType() === 6 || this.collapseType() === 7) {
		 this.setupColFadeZoom();
	 } else if (this.collapseType() === 8) {
		 this.setupColSliceHorz();
	 } else if (this.collapseType() === 9) {
		 this.setupColSliceVert();
	 } else if (this.collapseType() === 10) {
		 this.setupColStone();
	 };
};

//==============================
// * setColSpritePar
//==============================
Sprite_Battler.prototype.setColSpritePar = function(sprite) {
	 sprite.anchor.x = this.anchor.x;
	 sprite.anchor.y = this.anchor.y;
	 sprite.width = this.width;
	 sprite.height = this.height;
	 sprite.scale.x = 1.00;
	 sprite.scale.y = 1.00;
	 sprite.rotation = this.rotation;
};

//==============================
// * setup Coll Shatter Point
//==============================
Sprite_Battler.prototype.setupColShatterPoint = function() {
	 this._spriteCol = [];
	 this._shatterDCol = String(Moghunter.collShatterDirection) == "Left" ? 0 : 1;
	 var w = this.isEnemyP() ? this.bitmap.width / 4 : this.width;
	 var fz = 32;
	 var x2 = this.isEnemyP() ?  w * 3 : 0;
	 var frag_size = Math.floor((this.height + w) / 40);
	 var xi = Math.floor(-w / 2) + Math.floor(frag_size / 2);
     var yi = Math.floor(-this.height + frag_size);
     var f = 0
	 for (var i = 0; i >= 0; i++) {
		 this._spriteCol[i] = new Sprite(this.bitmap);
		 this.setColSpritePar(this._spriteCol[i]);
		 this._spriteCol[i].sx = (Math.random() * 0.5) + 1
		 this._spriteCol[i].op = (Math.random() * 2) + 2.5;
		 var x = Math.floor(i % fz) * frag_size
		 var y = Math.floor(i / fz) * frag_size;
		 this._spriteCol[i].x = xi + x;
		 this._spriteCol[i].y = yi + y;
		 this._spriteCol[i].setFrame(x + x2,y,frag_size,frag_size);
		 this.addChild(this._spriteCol[i]);
		 if (this._spriteCol[i].y > 0) {break};
	 };
};

//==============================
// * update Collapse Shatter Point
//==============================
Sprite_Battler.prototype.updateCollapseShatterPoint= function() {
	var coldone = true;
	for (var i = 0; i < this._spriteCol.length; i++) {
		if (this.collapseType() === 0) {
			if (this._shatterDCol === 0) {
				this._spriteCol[i].x -= this._spriteCol[i].sx*4;
			} else {
				this._spriteCol[i].x += this._spriteCol[i].sx*4;
			};
		};
		this._spriteCol[i].y -= this._spriteCol[i].sx*2;
		this._spriteCol[i].opacity -= this._spriteCol[i].op*4;
        if (this._spriteCol[i].opacity > 0) {coldone = false};
	};
	if (coldone) {this.removeCollapseEffects()};
};

//==============================
// * setup Coll Shatter Line
//==============================
Sprite_Battler.prototype.setupColShatterLine = function() {
	 var w = this.isEnemyP() ? this.bitmap.width / 4 : this.width;
	 var fz = 32;
	 var x2 = this.isEnemyP() ?  w * 3 : 0;
	 this._spriteCol = [];
	 var frag_size = 6;
	 var xi = Math.floor(-w / 2) + Math.floor(frag_size / 2);
     var yi = Math.floor(-this.height + frag_size)
	 for (var i = 0; i >= 0; i++) {
		 this._spriteCol[i] = new Sprite(this.bitmap);
		 this.setColSpritePar(this._spriteCol[i]);
		 this._spriteCol[i].sx = (Math.random() * 0.5) + 1 - (i * 0.01);
		 this._spriteCol[i].op = (Math.random() * 2) + 2.5;
		 var y = Math.floor(i * frag_size);
		 this._spriteCol[i].y = yi + y;
		 this._spriteCol[i].setFrame(x2,y,this.width,frag_size);
		 this.addChild(this._spriteCol[i]);
		 if (this._spriteCol[i].y > 0) {break};
	 };
};

//==============================
// * update Collapse Shatter Line
//==============================
Sprite_Battler.prototype.updateCollapseShatterLine= function() {
	var coldone = true;
	var d = this.collapseType() === 2 ? 0 : null;
	for (var i = 0; i < this._spriteCol.length; i++) {
	    if (d != null) {
		   d = d === 0 ? 1 : 0;
		   if (d === 0) {this._spriteCol[i].x -= this._spriteCol[i].sx;
		   } else {this._spriteCol[i].x += this._spriteCol[i].sx;
		   };
		};
		this._spriteCol[i].y -= this._spriteCol[i].sx
		this._spriteCol[i].opacity -= this._spriteCol[i].op
        if (this._spriteCol[i].opacity > 0) {coldone = false};
	};
	if (coldone) {this.removeCollapseEffects()};
};

//==============================
// * setup Col Slice Horz
//==============================
Sprite_Battler.prototype.setupColSliceHorz = function() {
 	 var w = this.isEnemyP() ? this.bitmap.width / 4 : this.width;
	 var fz = 32;
	 var x2 = this.isEnemyP() ?  w * 3 : 0;
	 this._spriteCol = [];
	 var frag_size = Math.floor(this.height / 2);
     var yi = Math.floor(-this.height + frag_size)
	 for (var i = 0; i < 2; i++) {
		 this._spriteCol[i] = new Sprite(this.bitmap);
		 this.setColSpritePar(this._spriteCol[i]);
		 var y = Math.floor(i * frag_size);
		 this._spriteCol[i].y = yi + y;
		 this._spriteCol[i].setFrame(x2,y,w,frag_size);
		 this.addChild(this._spriteCol[i]);
		 this._spriteCol[i].sx = Math.floor(frag_size / 2);
		 this._spriteCol[i].sp = (this._spriteCol[i].sx / 40) + 0.01;
	 };
};

//==============================
// * update Collapse Slice Horz
//==============================
Sprite_Battler.prototype.updateCollapseSliceHorz = function() {
	 var coldone = false;
     if (this._spriteCol[0].x >= this._spriteCol[0].sx) {
		  this._spriteCol[0].opacity -= 5;
		  this._spriteCol[1].opacity -= 5;
		  if (this._spriteCol[0].opacity <= 0) {coldone = true;};
	 } else {
          this._spriteCol[0].x += this._spriteCol[0].sp;
	      this._spriteCol[1].x -= this._spriteCol[1].sp;
	 };
	 if (coldone) {this.removeCollapseEffects()};
};

//==============================
// * setup Col Slice Vert
//==============================
Sprite_Battler.prototype.setupColSliceVert = function() {
 	 var w = this.isEnemyP() ? this.bitmap.width / 4 : this.width;
	 var fz = 32;
	 var x2 = this.isEnemyP() ?  w * 3 : 0;
	 this._spriteCol = [];
	 var frag_size = Math.floor(w / 2);
	 var xi = Math.floor(-w / 2) + Math.floor(frag_size / 2);
	 for (var i = 0; i < 2; i++) {
		 this._spriteCol[i] = new Sprite(this.bitmap);
		 this.setColSpritePar(this._spriteCol[i]);
		 var x = Math.floor(i * frag_size);
		 this._spriteCol[i].x = xi + x;
		 this._spriteCol[i].setFrame(x + x2,0,frag_size,this.height);
		 this.addChild(this._spriteCol[i]);
		 this._spriteCol[i].sx = Math.floor(frag_size / 2);
		 this._spriteCol[i].sp = (this._spriteCol[i].sx / 40) + 0.01;
	 };
};

//==============================
// * update Collapse Slice Vert
//==============================
Sprite_Battler.prototype.updateCollapseSliceVert = function() {
	 var coldone = false;
     if (this._spriteCol[0].y >= this._spriteCol[0].sx) {
		  this._spriteCol[0].opacity -= 5;
		  this._spriteCol[1].opacity -= 5;
		  if (this._spriteCol[0].opacity <= 0) {coldone = true;};
	 } else {
          this._spriteCol[0].y += this._spriteCol[0].sp;
	      this._spriteCol[1].y -= this._spriteCol[1].sp;
	 };
	 if (coldone) {this.removeCollapseEffects()};
};

//==============================
// * setup Col Fade Zoom
//==============================
Sprite_Battler.prototype.setupColFadeZoom = function() {
     this._animeDuration = 0;
};

//==============================
// * update Col Fade Zoom
//==============================
Sprite_Battler.prototype.updateColFadeZoom = function() {
	this._animeDuration ++;
	if (this.collapseType() === 4) {
		this.updateColFazeZoom1();
	} else if (this.collapseType() === 5) {
	    this.updateColFazeZoom2();
	} else if (this.collapseType() === 6) {
	    this.updateColFazeZoom3();
	} else {
	   this.updateColFazeZoom4();
	};
	if (this.scale.x < 0) {this.scale.x = 0};
	if (this.scale.y < 0) {this.scale.y = 0};
	if (this.opacity === 0) {this.removeCollapseEffects()};
};

//==============================
// * update Col Fade Zoom1
//==============================
Sprite_Battler.prototype.updateColFazeZoom1 = function() {
	this.scale.x += 0.03;
	this.scale.y -= 0.01;
	this.opacity -= 3;
};

//==============================
// * update Col Fade Zoom2
//==============================
Sprite_Battler.prototype.updateColFazeZoom2 = function() {
	this.scale.x -= 0.01;
	this.scale.y += 0.03;
	this.opacity -= 3;
};

//==============================
// * update Col Fade Zoom3
//==============================
Sprite_Battler.prototype.updateColFazeZoom3 = function() {
	if (this._animeDuration < 30) {
		this.scale.x += 0.08;
		this.scale.y -= 0.04;
	} else if (this._animeDuration < 120) {
		this.scale.x -= 0.09;
		this.scale.y += 0.15;
		this.opacity -= 5;
	};
};

//==============================
// * update Col Fade Zoom4
//==============================
Sprite_Battler.prototype.updateColFazeZoom4 = function() {
	this.scale.x -= 0.01;
	this.scale.y += 0.04;
	this.rotation -= 0.1;
	this.opacity -= 2;
};

//==============================
// * setup Col  Stone
//==============================
Sprite_Battler.prototype.setupColStone = function() {
     this._effectDuration = 30;
	 if (Utils.RPGMAKER_VERSION >= "1.3.2") {
	   var filter = new PIXI.filters.ColorMatrixFilter()
	   filter.blackAndWhite(true);
	 } else {
	   var filter = new PIXI.GrayFilter();
	 };
	 this.filters = [filter];
};

//==============================
// * update Collapse Stone
//==============================
Sprite_Battler.prototype.updateCollapseStone = function() {
};

//==============================
// * update Collapse Effects
//==============================
Sprite_Battler.prototype.updateCollapseEffects = function() {
	if (!this._collData) {this.setupCollapseEffect()};
    if (this._collEffectWait > 0) {
		this._collEffectWait--
		if (this._collEffectWait == 0) {this._battler.performCollapseSoundMG()}
	    return;
	};
	if (this.collapseType() <= 1) {
	    this.updateCollapseShatterPoint();
	} else if (this.collapseType() === 2  || this.collapseType() === 3) {
		this.updateCollapseShatterLine();
	} else if (this.collapseType() === 4 || this.collapseType() === 5 ||
	            this.collapseType() === 6 || this.collapseType() === 7) {
		this.updateColFadeZoom();
	} else if (this.collapseType() === 8) {
		this.updateCollapseSliceHorz();
	} else if (this.collapseType() === 9) {
		this.updateCollapseSliceVert();
	} else if (this.collapseType() === 10) {
		this.updateCollapseStone();
	};
};