//=============================================================================
// TRP_ParticleMZ.js
//=============================================================================
/* このソフトウェアは正規に購入したユーザーのみが利用規約に従って使用することができます。
   また、このソフトウェアはMITライセンス、ならびにApache 2.0ライセンスで配布されている製作物が含まれています。
   http://www.opensource.org/licenses/mit-license
   http://www.apache.org/licenses/LICENSE-2.0
 */


//=============================================================================
/*:
 * @target MZ
 * @author Thirop
 * @plugindesc ※TRP_ParticleMZ_Presetより下に配置
 * @help
 * 【更新履歴】
 * 1.33 2024/08/03 メンバー入替後の戦闘開始時に発生するエラー修正
 * 1.30 2023/01/22 他シーン用のパーティクルをクリア時の不具合修正
 * 1.29 2022/12/11 戦闘中に待機中アクターにステート付与時に発生する不具合の修正
 * 1.28 2022/12/05 戦闘不能などステート全解除時にパーティクルが残る不具合の修正
 * 1.27 2022/09/07 グループ機能追加時のセーブデータ互換性の対応
 * 1.25 2022/07/31 タグ情報管理の不具合修正
 *                 スキルのパーティクル表示設定で「user」に対応
 * 1.24 2022/06/24 敵のステートに関連する内部処理の変更
 * 1.23 2022/06/04 コアスクリプトv1.5.0のタイルサイズ変更対応
 * 1.22 2022/05/26 アニメーション画像使用時の不具合修正
 * 1.20 2022/03/20 exceedコマンドの不具合修正
 * 1.19 2022/02/05 exceedコマンドの不具合修正
 * 1.17 2022/01/09 iOSでの動作不具合修正
 * 1.16 2021/12/10 隊列入れ替え時のステート反映の不具合修正
 * 1.15 2021/12/06 戦闘中のメンバーの入れ替えに対応
 * 1.13 2021/10/31 不具合修正など
 * 1.09 2021/08/18 設定名の「/h」を自動補完
 *                 walk/startdashのデフォルトZ値をbelowに変更
 *                「weather:x,y」で視差スクロール対応
 *                 プラグイン設定「キャッシュ設定(β)」の実装
 * 1.07 2021/06/22 最大数制限が正しく変更されない不具合修正
 * 1.06 2021/06/01 ウィンドウ開閉時に白く表示される不具合への前提対応
 * 1.05 2021/04/22 内部処理の一部変更
 * 1.03 2021/04/14 screen
 * 1.02 2021/04/12 変数の制御文字に対応
 * 1.00 2021/04/10 初版。
 *
 * @param importLibrary
 * @text ライブラリインポート
 * @desc pixi-particles.jsの内容をこのプラグイン内で定義する場合はON/true。独自にインポートする場合はOFF/false。
 * @type boolean
 * @default true
 *
 * @param importFilter
 * @text pixi-filtersインポート
 * @desc pixi-filters.jsの内容をこのプラグイン内で定義する場合はON/true。独自にインポートする場合はOFF/false。
 * @type boolean
 * @default true
 *
 * @param systemParticles
 * @text 常用パーティクル
 * @desc マップ・戦闘以外でも表示したいマウスクリック(click)/ドラッグ(drag)などのパーティクルを設定。
 * @type String[]
 * @default []
 *
 * @param commandName
 * @text コマンド名
 * @desc 他のプラグインとコマンド名が被る場合に変更。カンマ続きで複数可(デフォルトはparticle,パーティクル)
 * @default particle,パーティクル
 *
 * @param keepPictureOrder
 * @text ピクチャ重ね順保持
 * @desc ONにすると各ピクチャの間に表示。OFFにすると全てのピクチャの前後に表示。ONは競合の可能性高め
 * @type boolean
 * @default false
 *
 * @param walkOffset
 * @text walk時のオフセット
 * @desc walk対象時に指定したピクセル分だけキャラクターの前に表示します。
 * @default 16
 * @type number
 *
 * @param dashOffset
 * @text startDash時のオフセット
 * @desc startDash対象時に指定したピクセル分だけキャラクターの前に表示します。
 * @default 16
 * @type number
 *
 * @param categoryClear
 * @text 【自動クリア】
 * @default ==============================
 *
 * @param clearCharacterOnMapChange
 * @text 移動時イベント対象クリア
 * @desc マップ移動時にイベントを対象としたパーティクル設定をクリア
 * @default true
 * @type boolean
 * @parent categoryClear
 *
 * @param clearPartyOnMapChange
 * @text 移動時パーティー対象クリア
 * @desc マップ移動時にプレイヤー/フォロワー対象のパーティクル設定をクリア
 * @default true
 * @type boolean
 * @parent categoryClear
 *
 * @param clearScreenOnMapChange
 * @text 移動時Screen対象クリア
 * @desc マップ移動時に対象screen/weather/regionのパーティクル設定をクリア
 * @default true
 * @type boolean
 * @parent categoryClear
 *
 * @param clearBattleScreenOnEnd
 * @text 戦闘終了時に戦闘Screen対象クリア
 * @desc 戦闘終了時に対象battle/battleWeather対象のパーティクル設定をクリア
 * @default false
 * @type boolean
 * @parent categoryClear
 *
 * @param clearBattleCharaOnEnd
 * @text 戦闘終了時に戦闘キャラ対象クリア
 * @desc 戦闘終了時に対象party/enemy対象のパーティクル設定をクリア
 * @default true
 * @type boolean
 * @parent categoryClear
 *
 * @param categoryPerformance
 * @text 【パフォーマンス】
 * @default ==============================
 *
 * @param regionMargin
 * @text リージョンの画面外幅
 * @desc ターゲットをregionにした場合にパーティクルを発生させる画面外の余白タイル数。(デフォ2)
 * @type number
 * @default 2
 * @parent categoryPerformance
 *
 * @param outsideMargin
 * @text キャラ対象の画面外幅
 * @desc ターゲットがキャラの場合のパーティクルを発生させる画面外の余白タイル数。(デフォ4,マイナスで無効)
 * @default 6
 * @type number
 * @min -9999
 * @parent categoryPerformance
 *
 * @param maxParticles
 * @text 最大パーティクル数
 * @desc 画面上の最大パーティクル数(0以下で制限なし)の制限の初期値。最大数を超えるとそれぞれのfrequencyなどを調整。
 * @default 100000
 * @type number
 * @parent categoryPerformance
 *
 * @param useCache
 * @text キャッシュ設定(β)
 * @desc ON/trueでより効率的にパーティクルを再利用。試験導入機能なので要動作確認
 * @type boolean
 * @default false
 * @parent categoryPerformance
 *
 * @param categoryConflict
 * @text 【機能無効化/競合対策】
 * @default ==============================
 *
 * @param disableState
 * @text ステート表示無効
 * @desc ONにするとステートでのパーティクル表示無効。(競合ある場合にOFF)
 * @type boolean
 * @default false
 * @parent categoryConflict
 *
 * @param disableSkill
 * @text スキル表示無効
 * @desc ONにするとスキルでのパーティクル表示無効。(競合ある場合にOFF)
 * @type boolean
 * @default false
 * @parent categoryConflict
 *
 * @param disableRoute
 * @text 移動ルートでのコマンド無効
 * @desc ONにすると移動ルートでのコマンド実行無効。(競合ある場合にOFF)
 * @type boolean
 * @default false
 * @parent categoryConflict
 *
 * @param cacheBeforeTerminate
 * @text 終了処理前にキャッシュ
 * @desc 競合対策用。基本OFFにしてください。
 * @type boolean
 * @default false
 * @parent categoryConflict
 * 
 *
 * @param categorySenior
 * @text 【上級者向け用】
 * @default ==============================
 *
 * @param sceneTypes
 * @text シーン対象登録
 * @desc メニューなどのシーンで表示する場合にクラス名登録。
 * @type string[]
 * @default ["Scene_Menu-Scene_Save-Scene_Item-Scene_Equip-Scene_Actor-Scene_Skill-Scene_Status","Scene_Title","Scene_Load","Scene_Options","Scene_Shop","Scene_Gameover"]
 * @parent categorySenior
 *
 * @param noRewriteFunctions
 * @text Particle関数の上書きを無効
 * @desc pixi-particle.js由来の一部基幹関数の上書きを無効化します(上級者向け)
 * @type boolean
 * @default false
 * @parent categorySenior
 *
 * @param categoryDebug
 * @text 【デバッグ用】
 * @default ==============================
 *
 * @param displayCount
 * @text パーティクル数表示
 * @desc ONで全パーティクル数表示(デバッグ用)
 * @type boolean
 * @default false
 * @parent categoryDebug
 *
 * @param errorLog
 * @text エラー表示
 * @desc 正しくないIDや設定データ名を指定した場合にerror表示する。
 * @type boolean
 * @default true
 * @parent categoryDebug
 *
 * @param windowBugFix
 * @text ウィンドウ不具合回避
 * @desc 背景透明でメッセージ表示の際に開閉中のネームボックスが白くなる不具合の暫定回避。
 * @type boolean
 * @default true
 * @parent categoryDebug
 *
 *
 *
 *
 *
 * @command set
 * @text set/表示
 * @desc パーティクル表示
 *
 * @arg id
 * @text 管理ID
 * @desc 他と被らない管理ID。（末尾に-EIDをつけるとEIDがイベントIDに置き換わる。）
 * @default def
 *
 * @arg target
 * @text ターゲット
 * @desc thisでこのイベント。「event:イベントID」「player」「weather」など
 * @default this
 *
 * @arg name
 * @text データ名
 * @desc データ名。defとすると管理IDをデータ名として使用。（同じデータ名を複数表示するときは管理IDを分ける）
 * @default def
 *
 * @arg z
 * @text Z値
 * @desc 重なり順。above:上、below:後ろ、screen、spritesetなど。数値指定も可
 * @default def
 *
 * @arg tag
 * @text 管理タグ
 * @desc 管理用のタグ名
 *
 * @arg edit
 * @text _Editモード
 * @desc ONにするとエディタを呼び出し(テストプレイ時のみ有効)
 * @default false
 * @type boolean
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command play
 * @text play/１回だけ再生
 * @desc パーティクルを１回だけ再生
 *
 * @arg id
 * @text 管理ID
 * @desc 他と被らない管理ID。（末尾に-EIDをつけるとEIDがイベントIDに置き換わる。）
 * @default def
 *
 * @arg target
 * @text ターゲット
 * @desc thisでこのイベント。「event:イベントID」「player」「weather」など
 * @default this
 *
 * @arg name
 * @text データ名
 * @desc データ名。defとすると管理IDをデータ名として使用。（重み同じデータ名を複数表示するときは管理IDを分ける）
 * @default def
 *
 * @arg z
 * @text Z値
 * @desc 重なり順。above:上、below:後ろ、screen、spritesetなど。数値指定も可
 * @default def
 *
 * @arg tag
 * @text 管理タグ
 * @desc 管理用のタグ名
 *
 * @arg edit
 * @text _Editモード
 * @desc ONにするとエディタを呼び出し(テストプレイ時のみ有効)
 * @default false
 * @type boolean
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 *
 * @command repeat
 * @text repeat/リピート設定
 * @desc 再生を繰り返すリピートの設定
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg interval
 * @text インターバル
 * @desc 1で即リピート。0でリピート解除。2以上で指定フレームの間隔をあけてリピート
 * @type number
 * @min 0
 * @default 1
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command on
 * @text on/再生の再開
 * @desc 停止中のエミッターの再生再開
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command off
 * @text off/一時停止
 * @desc 再生中のエミッターの一時停止
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command clear
 * @text clear/クリア
 * @desc 再生中のエミッターを消去
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg quitFlag
 * @text 即座に消去
 * @desc ON/trueにすると再生終了を待たずに即座に削除
 * @type boolean
 * @default false
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command update
 * @text update/パラメータ変更
 * @desc 指定エミッターの各種パラメータの変更
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg key
 * @text パラメータ名
 * @desc 変更するパラメータ名。frequency、particlesPerWave、posなど
 *
 * @arg values
 * @text 変更値(スペースつなぎ)
 * @desc 変更後の値をスペースつなぎで指定。posなら「100 200」でx=100、y=200など
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command animate
 * @text animate/パラメータを徐々に変化
 * @desc 指定エミッターの各種パラメータを時間を指定して徐々に変化
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg duration
 * @text 所要フレーム数
 * @desc パラメータ変化にかける所要フレーム数
 *
 * @arg key
 * @text パラメータ名
 * @desc 変更するパラメータ名。frequency、particlesPerWave、posなど
 *
 * @arg values
 * @text 変更値(スペースつなぎ)
 * @desc 変更後の値をスペースつなぎで指定。posなら「100 200」でx=100、y=200など
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command exceed
 * @text exceed/時間を進める
 * @desc 指定エミッターの時間を手動で進める
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg time
 * @text スキップ時間(秒数)
 * @desc スキップする時間(秒数で指定)
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command loop
 * @text loop/画面ループ
 * @desc 画面の上下左右で見切れたパーティクルを上下左右でループさせるコマンド
 *
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg x
 * @text 横の余白(ピクセル単位)/clear
 * @desc 横の余白(ピクセル単位)。「clear」とするとループ設定を解除
 * @default def
 *
 * @arg y
 * @text 縦の余白(ピクセル単位)
 * @desc 縦の余白(ピクセル単位)
 * @default def
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command max
 * @text max/最大数の制限
 * @desc 全体の表示最大数の制限を設定
 *
 * @arg num
 * @text 最大数
 * @desc 最大数。0で制限なし。resetでコンフィグ設定の値にリセット
 * @default 0
 * 
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command filterClear
 * @text [フィルター]フィルタークリア
 * @desc 指定エミッターにセットしたフィルターを消去
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command filterBlur
 * @text [フィルター]ブラー
 * @desc 指定エミッターにブラーフィルターをセット
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg blur
 * @text ブラー量
 * @desc ブラー量
 * @type number
 * @default 8
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 * 
 * @command filterGlow
 * @text [フィルター]グロー
 * @desc 指定エミッターにグローフィルターをセット
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg innerStretch
 * @text 内側の強さ
 * @desc グローの内側の強さ
 * @type number
 * @min 0
 * @default 0
 *
 * @arg outerStretch
 * @text 外側の強さ
 * @desc グローの外側の強さ
 * @type number
 * @min 0
 * @default 4
 *
 * @arg distance
 * @text 距離
 * @desc グローの距離
 * @type number
 * @min 0
 * @default 10
 * 
 * @arg r
 * @text R値(赤)
 * @desc R値(赤)。0~255
 * @type number
 * @default 255
 *
 * @arg g
 * @text G値(緑)
 * @desc G値(緑)。0~255
 * @type number
 * @default 255
 *
 * @arg b
 * @text B値(青)
 * @desc B値(青)。0~255
 * @type number
 * @default 255
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command filterRgbSplit
 * @text [フィルター]RGPスプリット
 * @desc 指定エミッターにRGPスプリットフィルターをセット
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg rx
 * @text R(赤)のX方向ずれ
 * @text R(赤)のX方向ずれ
 * @type number
 * @default 3
 *
 * @arg ry
 * @text R(赤)のY方向ずれ
 * @text R(赤)のY方向ずれ
 * @type number
 * @default 3
 *
 * @arg gx
 * @text G(緑)のX方向ずれ
 * @text G(緑)のX方向ずれ
 * @type number
 * @default 3
 *
 * @arg gy
 * @text G(緑)のY方向ずれ
 * @text G(緑)のY方向ずれ
 * @type number
 * @default 3
 *
 * @arg bx
 * @text B(青)のX方向ずれ
 * @text B(青)のX方向ずれ
 * @type number
 * @default 3
 *
 * @arg by
 * @text B(青)のY方向ずれ
 * @text B(青)のY方向ずれ
 * @type number
 * @default 3
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command filterPixelate
 * @text [フィルター]ピクセレート
 * @desc 指定エミッターにピクセレートフィルターをセット
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg x
 * @text 横幅
 * @text 横幅
 * @type number
 * @default 3
 *
 * @arg y
 * @text 縦幅
 * @text 縦幅
 * @type number
 * @default 3
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 * @command filterDisplacement
 * @text [フィルター]ディスプレイスメント
 * @desc 指定エミッターにディスプレイスメントフィルターをセット
 * 
 * @arg targetId
 * @text 対象の管理ID
 * @desc 対象の管理ID
 *
 * @arg scaleX
 * @text 横拡大率
 * @text 横拡大率
 * @type number
 * @default 1
 *
 * @arg scaleY
 * @text 縦拡大率
 * @text 縦拡大率
 * @type number
 * @default 1
 *
 * @arg delay
 * @text _ディレイ
 * @desc 1以上とすると、指定フレーム後にコマンドを実効
 * @default 0
 * @type number
 * @min 0
 *
 *
 *
 */
//============================================================================= 
//PRAGMA_END: header
//PRAGMA: englishHeader
//PRAGMA_END: englishHeader


var $dataTrpParticlePreset = $dataTrpParticlePreset||null;
var $dataTrpParticles = null;
(function(){
//PRAGMA: pluginName
var pluginName = 'TRP_ParticleMZ';
//PRAGMA_END: pluginName
if(PluginManager.parameters(pluginName).importLibrary!=='true')return;

/*!
 * pixi-particles - v4.3.0
 * Compiled Fri, 18 Sep 2020 13:47:54 UTC
 *
 * pixi-particles is licensed under the MIT License.
 * http://www.opensource.org/licenses/mit-license
 */
this.PIXI=this.PIXI||{},function(t,i){"use strict";var e,s=function(){function i(i,e,s){this.value=i,this.time=e,this.next=null,this.isStepped=!1,this.ease=s?"function"==typeof s?s:t.ParticleUtils.generateEase(s):null}return i.createList=function(e){if("list"in e){var s=e.list,r=void 0,n=s[0],a=n.value,h=n.time,o=r=new i("string"==typeof a?t.ParticleUtils.hexToRGB(a):a,h,e.ease);if(s.length>2||2===s.length&&s[1].value!==a)for(var l=1;l<s.length;++l){var p=s[l],d=p.value,c=p.time;r.next=new i("string"==typeof d?t.ParticleUtils.hexToRGB(d):d,c),r=r.next}return o.isStepped=!!e.isStepped,o}var u=new i("string"==typeof e.start?t.ParticleUtils.hexToRGB(e.start):e.start,0);return e.end!==e.start&&(u.next=new i("string"==typeof e.end?t.ParticleUtils.hexToRGB(e.end):e.end,1)),u},i}(),r=i;function n(t){return e(t)}e=parseInt(/^(\d+)\./.exec(i.VERSION)[1],10)<5?r.Texture.fromImage:r.Texture.from,function(t){t.verbose=!1,t.DEG_TO_RADS=Math.PI/180,t.rotatePoint=function(i,e){if(i){i*=t.DEG_TO_RADS;var s=Math.sin(i),r=Math.cos(i),n=e.x*r-e.y*s,a=e.x*s+e.y*r;e.x=n,e.y=a}},t.combineRGBComponents=function(t,i,e){return t<<16|i<<8|e},t.normalize=function(i){var e=1/t.length(i);i.x*=e,i.y*=e},t.scaleBy=function(t,i){t.x*=i,t.y*=i},t.length=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},t.hexToRGB=function(t,i){var e;return i||(i={}),"#"===t.charAt(0)?t=t.substr(1):0===t.indexOf("0x")&&(t=t.substr(2)),8===t.length&&(e=t.substr(0,2),t=t.substr(2)),i.r=parseInt(t.substr(0,2),16),i.g=parseInt(t.substr(2,2),16),i.b=parseInt(t.substr(4,2),16),e&&(i.a=parseInt(e,16)),i},t.generateEase=function(t){var i=t.length,e=1/i;return function(s){var r=i*s|0,n=(s-r*e)*i,a=t[r]||t[i-1];return a.s+n*(2*(1-n)*(a.cp-a.s)+n*(a.e-a.s))}},t.getBlendMode=function(t){if(!t)return i.BLEND_MODES.NORMAL;for(t=t.toUpperCase();t.indexOf(" ")>=0;)t=t.replace(" ","_");return i.BLEND_MODES[t]||i.BLEND_MODES.NORMAL},t.createSteppedGradient=function(i,e){void 0===e&&(e=10),("number"!=typeof e||e<=0)&&(e=10);var r=new s(t.hexToRGB(i[0].value),i[0].time);r.isStepped=!0;for(var n=r,a=i[0],h=1,o=i[h],l=1;l<e;++l){for(var p=l/e;p>o.time;)a=o,o=i[++h];p=(p-a.time)/(o.time-a.time);var d=t.hexToRGB(a.value),c=t.hexToRGB(o.value),u={r:(c.r-d.r)*p+d.r,g:(c.g-d.g)*p+d.g,b:(c.b-d.b)*p+d.b};n.next=new s(u,l/e),n=n.next}return r}}(t.ParticleUtils||(t.ParticleUtils={}));var a=function(t,i){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,i){t.__proto__=i}||function(t,i){for(var e in i)i.hasOwnProperty(e)&&(t[e]=i[e])})(t,i)};function h(t,i){function e(){this.constructor=t}a(t,i),t.prototype=null===i?Object.create(i):(e.prototype=i.prototype,new e)}function o(t){return this.ease&&(t=this.ease(t)),(this.next.value-this.current.value)*t+this.current.value}function l(i){this.ease&&(i=this.ease(i));var e=this.current.value,s=this.next.value,r=(s.r-e.r)*i+e.r,n=(s.g-e.g)*i+e.g,a=(s.b-e.b)*i+e.b;return t.ParticleUtils.combineRGBComponents(r,n,a)}function p(t){for(this.ease&&(t=this.ease(t));t>this.next.time;)this.current=this.next,this.next=this.next.next;return t=(t-this.current.time)/(this.next.time-this.current.time),(this.next.value-this.current.value)*t+this.current.value}function d(i){for(this.ease&&(i=this.ease(i));i>this.next.time;)this.current=this.next,this.next=this.next.next;i=(i-this.current.time)/(this.next.time-this.current.time);var e=this.current.value,s=this.next.value,r=(s.r-e.r)*i+e.r,n=(s.g-e.g)*i+e.g,a=(s.b-e.b)*i+e.b;return t.ParticleUtils.combineRGBComponents(r,n,a)}function c(t){for(this.ease&&(t=this.ease(t));this.next&&t>this.next.time;)this.current=this.next,this.next=this.next.next;return this.current.value}function u(i){for(this.ease&&(i=this.ease(i));this.next&&i>this.next.time;)this.current=this.next,this.next=this.next.next;var e=this.current.value;return t.ParticleUtils.combineRGBComponents(e.r,e.g,e.b)}var m,f=function(){function t(t){void 0===t&&(t=!1),this.current=null,this.next=null,this.isColor=!!t,this.interpolate=null,this.ease=null}return t.prototype.reset=function(t){this.current=t,this.next=t.next,this.next&&this.next.time>=1?this.interpolate=this.isColor?l:o:t.isStepped?this.interpolate=this.isColor?u:c:this.interpolate=this.isColor?d:p,this.ease=this.current.ease},t}(),_=function(e){function s(t){var r=e.call(this)||this;return r.prevChild=r.nextChild=null,r.emitter=t,r.anchor.x=r.anchor.y=.5,r.velocity=new i.Point,r.rotationSpeed=0,r.rotationAcceleration=0,r.maxLife=0,r.age=0,r.ease=null,r.extraData=null,r.alphaList=new f,r.speedList=new f,r.speedMultiplier=1,r.acceleration=new i.Point,r.maxSpeed=NaN,r.scaleList=new f,r.scaleMultiplier=1,r.colorList=new f(!0),r._doAlpha=!1,r._doScale=!1,r._doSpeed=!1,r._doAcceleration=!1,r._doColor=!1,r._doNormalMovement=!1,r._oneOverLife=0,r.next=null,r.prev=null,r.init=r.init,r.Particle_init=s.prototype.init,r.update=r.update,r.Particle_update=s.prototype.update,r.Sprite_destroy=e.prototype.destroy,r.Particle_destroy=s.prototype.destroy,r.applyArt=r.applyArt,r.kill=r.kill,r}return h(s,e),s.prototype.init=function(){this.age=0,this.velocity.x=this.speedList.current.value*this.speedMultiplier,this.velocity.y=0,t.ParticleUtils.rotatePoint(this.rotation,this.velocity),this.noRotation?this.rotation=0:this.rotation*=t.ParticleUtils.DEG_TO_RADS,this.rotationSpeed*=t.ParticleUtils.DEG_TO_RADS,this.rotationAcceleration*=t.ParticleUtils.DEG_TO_RADS,this.alpha=this.alphaList.current.value,this.scale.x=this.scale.y=this.scaleList.current.value,this._doAlpha=!!this.alphaList.current.next,this._doSpeed=!!this.speedList.current.next,this._doScale=!!this.scaleList.current.next,this._doColor=!!this.colorList.current.next,this._doAcceleration=0!==this.acceleration.x||0!==this.acceleration.y,this._doNormalMovement=this._doSpeed||0!==this.speedList.current.value||this._doAcceleration,this._oneOverLife=1/this.maxLife;var i=this.colorList.current.value;this.tint=t.ParticleUtils.combineRGBComponents(i.r,i.g,i.b),this.visible=!0},s.prototype.applyArt=function(t){this.texture=t||i.Texture.EMPTY},s.prototype.update=function(i){if(this.age+=i,this.age>=this.maxLife||this.age<0)return this.kill(),-1;var e=this.age*this._oneOverLife;if(this.ease&&(e=4===this.ease.length?this.ease(e,0,1,1):this.ease(e)),this._doAlpha&&(this.alpha=this.alphaList.interpolate(e)),this._doScale){var s=this.scaleList.interpolate(e)*this.scaleMultiplier;this.scale.x=this.scale.y=s}if(this._doNormalMovement){var r=void 0,n=void 0;if(this._doSpeed){var a=this.speedList.interpolate(e)*this.speedMultiplier;t.ParticleUtils.normalize(this.velocity),t.ParticleUtils.scaleBy(this.velocity,a),r=this.velocity.x*i,n=this.velocity.y*i}else if(this._doAcceleration){var h=this.velocity.x,o=this.velocity.y;if(this.velocity.x+=this.acceleration.x*i,this.velocity.y+=this.acceleration.y*i,this.maxSpeed){var l=t.ParticleUtils.length(this.velocity);l>this.maxSpeed&&t.ParticleUtils.scaleBy(this.velocity,this.maxSpeed/l)}r=(h+this.velocity.x)/2*i,n=(o+this.velocity.y)/2*i}else r=this.velocity.x*i,n=this.velocity.y*i;this.position.x+=r,this.position.y+=n}if(this._doColor&&(this.tint=this.colorList.interpolate(e)),0!==this.rotationAcceleration){var p=this.rotationSpeed+this.rotationAcceleration*i;this.rotation+=(this.rotationSpeed+p)/2*i,this.rotationSpeed=p}else 0!==this.rotationSpeed?this.rotation+=this.rotationSpeed*i:this.acceleration&&!this.noRotation&&(this.rotation=Math.atan2(this.velocity.y,this.velocity.x));return e},s.prototype.kill=function(){this.emitter.recycle(this)},s.prototype.destroy=function(){this.parent&&this.parent.removeChild(this),this.Sprite_destroy(),this.emitter=this.velocity=this.colorList=this.scaleList=this.alphaList=this.speedList=this.ease=this.next=this.prev=null},s.parseArt=function(i){var e;for(e=i.length;e>=0;--e)"string"==typeof i[e]&&(i[e]=n(i[e]));if(t.ParticleUtils.verbose)for(e=i.length-1;e>0;--e)if(i[e].baseTexture!==i[e-1].baseTexture){window.console&&console.warn("PixiParticles: using particle textures from different images may hinder performance in WebGL");break}return i},s.parseData=function(t){return t},s}(i.Sprite),C=function(){function t(t){this.segments=[],this.countingLengths=[],this.totalLength=0,this.init(t)}return t.prototype.init=function(t){if(t&&t.length)if(Array.isArray(t[0]))for(var i=0;i<t.length;++i)for(var e=t[i],s=e[0],r=1;r<e.length;++r){var n=e[r];this.segments.push({p1:s,p2:n,l:0}),s=n}else for(s=t[0],i=1;i<t.length;++i){n=t[i];this.segments.push({p1:s,p2:n,l:0}),s=n}else this.segments.push({p1:{x:0,y:0},p2:{x:0,y:0},l:0});for(i=0;i<this.segments.length;++i){var a=this.segments[i],h=a.p1,o=a.p2,l=Math.sqrt((o.x-h.x)*(o.x-h.x)+(o.y-h.y)*(o.y-h.y));this.segments[i].l=l,this.totalLength+=l,this.countingLengths.push(this.totalLength)}},t.prototype.getRandomPoint=function(t){var i,e,s=Math.random()*this.totalLength;if(1===this.segments.length)i=this.segments[0],e=s;else for(var r=0;r<this.countingLengths.length;++r)if(s<this.countingLengths[r]){i=this.segments[r],e=0===r?s:s-this.countingLengths[r-1];break}e/=i.l||1;var n=i.p1,a=i.p2;t.x=n.x+e*(a.x-n.x),t.y=n.y+e*(a.y-n.y)},t}(),v=i;m=parseInt(/^(\d+)\./.exec(i.VERSION)[1],10)<5?v.ticker.shared:v.Ticker.shared;var x=new i.Point,y=function(){function e(t,i,e){this._currentImageIndex=-1,this._particleConstructor=_,this.particleImages=null,this.startAlpha=null,this.startSpeed=null,this.minimumSpeedMultiplier=1,this.acceleration=null,this.maxSpeed=NaN,this.startScale=null,this.minimumScaleMultiplier=1,this.startColor=null,this.minLifetime=0,this.maxLifetime=0,this.minStartRotation=0,this.maxStartRotation=0,this.noRotation=!1,this.minRotationSpeed=0,this.maxRotationSpeed=0,this.particleBlendMode=0,this.customEase=null,this.extraData=null,this._frequency=1,this.spawnChance=1,this.maxParticles=1e3,this.emitterLifetime=-1,this.spawnPos=null,this.spawnType=null,this._spawnFunc=null,this.spawnRect=null,this.spawnCircle=null,this.spawnPolygonalChain=null,this.particlesPerWave=1,this.particleSpacing=0,this.angleStart=0,this.rotation=0,this.ownerPos=null,this._prevEmitterPos=null,this._prevPosIsValid=!1,this._posChanged=!1,this._parent=null,this.addAtBack=!1,this.particleCount=0,this._emit=!1,this._spawnTimer=0,this._emitterLife=-1,this._activeParticlesFirst=null,this._activeParticlesLast=null,this._poolFirst=null,this._origConfig=null,this._origArt=null,this._autoUpdate=!1,this._currentImageIndex=-1,this._destroyWhenComplete=!1,this._completeCallback=null,this.parent=t,i&&e&&this.init(i,e),this.recycle=this.recycle,this.update=this.update,this.rotate=this.rotate,this.updateSpawnPos=this.updateSpawnPos,this.updateOwnerPos=this.updateOwnerPos}return Object.defineProperty(e.prototype,"orderedArt",{get:function(){return-1!==this._currentImageIndex},set:function(t){this._currentImageIndex=t?0:-1},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"frequency",{get:function(){return this._frequency},set:function(t){this._frequency="number"==typeof t&&t>0?t:1},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"particleConstructor",{get:function(){return this._particleConstructor},set:function(t){if(t!==this._particleConstructor){this._particleConstructor=t,this.cleanup();for(var i=this._poolFirst;i;i=i.next)i.destroy();this._poolFirst=null,this._origConfig&&this._origArt&&this.init(this._origArt,this._origConfig)}},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},set:function(t){this.cleanup(),this._parent=t},enumerable:!0,configurable:!0}),e.prototype.init=function(e,r){if(e&&r){this.cleanup(),this._origConfig=r,this._origArt=e,e=Array.isArray(e)?e.slice():[e];var n=this._particleConstructor;this.particleImages=n.parseArt?n.parseArt(e):e,r.alpha?this.startAlpha=s.createList(r.alpha):this.startAlpha=new s(1,0),r.speed?(this.startSpeed=s.createList(r.speed),this.minimumSpeedMultiplier=("minimumSpeedMultiplier"in r?r.minimumSpeedMultiplier:r.speed.minimumSpeedMultiplier)||1):(this.minimumSpeedMultiplier=1,this.startSpeed=new s(0,0));var a=r.acceleration;a&&(a.x||a.y)?(this.startSpeed.next=null,this.acceleration=new i.Point(a.x,a.y),this.maxSpeed=r.maxSpeed||NaN):this.acceleration=new i.Point,r.scale?(this.startScale=s.createList(r.scale),this.minimumScaleMultiplier=("minimumScaleMultiplier"in r?r.minimumScaleMultiplier:r.scale.minimumScaleMultiplier)||1):(this.startScale=new s(1,0),this.minimumScaleMultiplier=1),r.color?this.startColor=s.createList(r.color):this.startColor=new s({r:255,g:255,b:255},0),r.startRotation?(this.minStartRotation=r.startRotation.min,this.maxStartRotation=r.startRotation.max):this.minStartRotation=this.maxStartRotation=0,r.noRotation&&(this.minStartRotation||this.maxStartRotation)?this.noRotation=!!r.noRotation:this.noRotation=!1,r.rotationSpeed?(this.minRotationSpeed=r.rotationSpeed.min,this.maxRotationSpeed=r.rotationSpeed.max):this.minRotationSpeed=this.maxRotationSpeed=0,this.rotationAcceleration=r.rotationAcceleration||0,this.minLifetime=r.lifetime.min,this.maxLifetime=r.lifetime.max,this.particleBlendMode=t.ParticleUtils.getBlendMode(r.blendMode),r.ease?this.customEase="function"==typeof r.ease?r.ease:t.ParticleUtils.generateEase(r.ease):this.customEase=null,n.parseData?this.extraData=n.parseData(r.extraData):this.extraData=r.extraData||null,this.spawnRect=this.spawnCircle=null,this.particlesPerWave=1,r.particlesPerWave&&r.particlesPerWave>1&&(this.particlesPerWave=r.particlesPerWave),this.particleSpacing=0,this.angleStart=0,this.parseSpawnType(r),this.frequency=r.frequency,this.spawnChance="number"==typeof r.spawnChance&&r.spawnChance>0?r.spawnChance:1,this.emitterLifetime=r.emitterLifetime||-1,this.maxParticles=r.maxParticles>0?r.maxParticles:1e3,this.addAtBack=!!r.addAtBack,this.rotation=0,this.ownerPos=new i.Point,this.spawnPos=new i.Point(r.pos.x,r.pos.y),this.initAdditional(e,r),this._prevEmitterPos=this.spawnPos.clone(),this._prevPosIsValid=!1,this._spawnTimer=0,this.emit=void 0===r.emit||!!r.emit,this.autoUpdate=!!r.autoUpdate,this.orderedArt=!!r.orderedArt}},e.prototype.initAdditional=function(t,i){},e.prototype.parseSpawnType=function(t){var e;switch(t.spawnType){case"rect":this.spawnType="rect",this._spawnFunc=this._spawnRect;var s=t.spawnRect;this.spawnRect=new i.Rectangle(s.x,s.y,s.w,s.h);break;case"circle":this.spawnType="circle",this._spawnFunc=this._spawnCircle,e=t.spawnCircle,this.spawnCircle=new i.Circle(e.x,e.y,e.r);break;case"ring":this.spawnType="ring",this._spawnFunc=this._spawnRing,e=t.spawnCircle,this.spawnCircle=new i.Circle(e.x,e.y,e.r),this.spawnCircle.minRadius=e.minR;break;case"burst":this.spawnType="burst",this._spawnFunc=this._spawnBurst,this.particleSpacing=t.particleSpacing,this.angleStart=t.angleStart?t.angleStart:0;break;case"point":this.spawnType="point",this._spawnFunc=this._spawnPoint;break;case"polygonalChain":this.spawnType="polygonalChain",this._spawnFunc=this._spawnPolygonalChain,this.spawnPolygonalChain=new C(t.spawnPolygon);break;default:this.spawnType="point",this._spawnFunc=this._spawnPoint}},e.prototype.recycle=function(t){t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next),t===this._activeParticlesLast&&(this._activeParticlesLast=t.prev),t===this._activeParticlesFirst&&(this._activeParticlesFirst=t.next),t.prev=null,t.next=this._poolFirst,this._poolFirst=t,t.parent&&t.parent.removeChild(t),--this.particleCount},e.prototype.rotate=function(i){if(this.rotation!==i){var e=i-this.rotation;this.rotation=i,t.ParticleUtils.rotatePoint(e,this.spawnPos),this._posChanged=!0}},e.prototype.updateSpawnPos=function(t,i){this._posChanged=!0,this.spawnPos.x=t,this.spawnPos.y=i},e.prototype.updateOwnerPos=function(t,i){this._posChanged=!0,this.ownerPos.x=t,this.ownerPos.y=i},e.prototype.resetPositionTracking=function(){this._prevPosIsValid=!1},Object.defineProperty(e.prototype,"emit",{get:function(){return this._emit},set:function(t){this._emit=!!t,this._emitterLife=this.emitterLifetime},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"autoUpdate",{get:function(){return this._autoUpdate},set:function(t){this._autoUpdate&&!t?m.remove(this.update,this):!this._autoUpdate&&t&&m.add(this.update,this),this._autoUpdate=!!t},enumerable:!0,configurable:!0}),e.prototype.playOnceAndDestroy=function(t){this.autoUpdate=!0,this.emit=!0,this._destroyWhenComplete=!0,this._completeCallback=t},e.prototype.playOnce=function(t){this.emit=!0,this._completeCallback=t},e.prototype.update=function(t){if(this._autoUpdate&&(t=t/i.settings.TARGET_FPMS/1e3),this._parent){var e,s,r,n,a;for(s=this._activeParticlesFirst;s;s=r)r=s.next,s.update(t);this._prevPosIsValid&&(n=this._prevEmitterPos.x,a=this._prevEmitterPos.y);var h=this.ownerPos.x+this.spawnPos.x,o=this.ownerPos.y+this.spawnPos.y;if(this._emit)for(this._spawnTimer-=t<0?0:t;this._spawnTimer<=0;){if(this._emitterLife>=0&&(this._emitterLife-=this._frequency,this._emitterLife<=0)){this._spawnTimer=0,this._emitterLife=0,this.emit=!1;break}if(this.particleCount>=this.maxParticles)this._spawnTimer+=this._frequency;else{var l=void 0;if(l=this.minLifetime===this.maxLifetime?this.minLifetime:Math.random()*(this.maxLifetime-this.minLifetime)+this.minLifetime,-this._spawnTimer<l){var p=void 0,d=void 0;if(this._prevPosIsValid&&this._posChanged){var c=1+this._spawnTimer/t;p=(h-n)*c+n,d=(o-a)*c+a}else p=h,d=o;e=0;for(var u=Math.min(this.particlesPerWave,this.maxParticles-this.particleCount);e<u;++e)if(!(this.spawnChance<1&&Math.random()>=this.spawnChance)){var m=void 0;this._poolFirst?(m=this._poolFirst,this._poolFirst=this._poolFirst.next,m.next=null):m=new this.particleConstructor(this),this.particleImages.length>1?-1!==this._currentImageIndex?(m.applyArt(this.particleImages[this._currentImageIndex++]),(this._currentImageIndex<0||this._currentImageIndex>=this.particleImages.length)&&(this._currentImageIndex=0)):m.applyArt(this.particleImages[Math.floor(Math.random()*this.particleImages.length)]):m.applyArt(this.particleImages[0]),m.alphaList.reset(this.startAlpha),1!==this.minimumSpeedMultiplier&&(m.speedMultiplier=Math.random()*(1-this.minimumSpeedMultiplier)+this.minimumSpeedMultiplier),m.speedList.reset(this.startSpeed),m.acceleration.x=this.acceleration.x,m.acceleration.y=this.acceleration.y,m.maxSpeed=this.maxSpeed,1!==this.minimumScaleMultiplier&&(m.scaleMultiplier=Math.random()*(1-this.minimumScaleMultiplier)+this.minimumScaleMultiplier),m.scaleList.reset(this.startScale),m.colorList.reset(this.startColor),this.minRotationSpeed===this.maxRotationSpeed?m.rotationSpeed=this.minRotationSpeed:m.rotationSpeed=Math.random()*(this.maxRotationSpeed-this.minRotationSpeed)+this.minRotationSpeed,m.rotationAcceleration=this.rotationAcceleration,m.noRotation=this.noRotation,m.maxLife=l,m.blendMode=this.particleBlendMode,m.ease=this.customEase,m.extraData=this.extraData,this.applyAdditionalProperties(m),this._spawnFunc(m,p,d,e),m.init(),this.addAtBack?this._parent.addChildAt(m,0):this._parent.addChild(m),this._activeParticlesLast?(this._activeParticlesLast.next=m,m.prev=this._activeParticlesLast,this._activeParticlesLast=m):this._activeParticlesLast=this._activeParticlesFirst=m,++this.particleCount,m.update(-this._spawnTimer)}}this._spawnTimer+=this._frequency}}if(this._posChanged&&(this._prevEmitterPos.x=h,this._prevEmitterPos.y=o,this._prevPosIsValid=!0,this._posChanged=!1),!this._emit&&!this._activeParticlesFirst){if(this._completeCallback){var f=this._completeCallback;this._completeCallback=null,f()}this._destroyWhenComplete&&this.destroy()}}},e.prototype.applyAdditionalProperties=function(t){},e.prototype._spawnPoint=function(t,i,e){this.minStartRotation===this.maxStartRotation?t.rotation=this.minStartRotation+this.rotation:t.rotation=Math.random()*(this.maxStartRotation-this.minStartRotation)+this.minStartRotation+this.rotation,t.position.x=i,t.position.y=e},e.prototype._spawnRect=function(i,e,s){this.minStartRotation===this.maxStartRotation?i.rotation=this.minStartRotation+this.rotation:i.rotation=Math.random()*(this.maxStartRotation-this.minStartRotation)+this.minStartRotation+this.rotation,x.x=Math.random()*this.spawnRect.width+this.spawnRect.x,x.y=Math.random()*this.spawnRect.height+this.spawnRect.y,0!==this.rotation&&t.ParticleUtils.rotatePoint(this.rotation,x),i.position.x=e+x.x,i.position.y=s+x.y},e.prototype._spawnCircle=function(i,e,s){this.minStartRotation===this.maxStartRotation?i.rotation=this.minStartRotation+this.rotation:i.rotation=Math.random()*(this.maxStartRotation-this.minStartRotation)+this.minStartRotation+this.rotation,x.x=Math.random()*this.spawnCircle.radius,x.y=0,t.ParticleUtils.rotatePoint(360*Math.random(),x),x.x+=this.spawnCircle.x,x.y+=this.spawnCircle.y,0!==this.rotation&&t.ParticleUtils.rotatePoint(this.rotation,x),i.position.x=e+x.x,i.position.y=s+x.y},e.prototype._spawnRing=function(i,e,s){var r=this.spawnCircle;this.minStartRotation===this.maxStartRotation?i.rotation=this.minStartRotation+this.rotation:i.rotation=Math.random()*(this.maxStartRotation-this.minStartRotation)+this.minStartRotation+this.rotation,r.minRadius!==r.radius?x.x=Math.random()*(r.radius-r.minRadius)+r.minRadius:x.x=r.radius,x.y=0;var n=360*Math.random();i.rotation+=n,t.ParticleUtils.rotatePoint(n,x),x.x+=this.spawnCircle.x,x.y+=this.spawnCircle.y,0!==this.rotation&&t.ParticleUtils.rotatePoint(this.rotation,x),i.position.x=e+x.x,i.position.y=s+x.y},e.prototype._spawnPolygonalChain=function(i,e,s){this.minStartRotation===this.maxStartRotation?i.rotation=this.minStartRotation+this.rotation:i.rotation=Math.random()*(this.maxStartRotation-this.minStartRotation)+this.minStartRotation+this.rotation,this.spawnPolygonalChain.getRandomPoint(x),0!==this.rotation&&t.ParticleUtils.rotatePoint(this.rotation,x),i.position.x=e+x.x,i.position.y=s+x.y},e.prototype._spawnBurst=function(t,i,e,s){0===this.particleSpacing?t.rotation=360*Math.random():t.rotation=this.angleStart+this.particleSpacing*s+this.rotation,t.position.x=i,t.position.y=e},e.prototype.cleanup=function(){var t,i;for(t=this._activeParticlesFirst;t;t=i)i=t.next,this.recycle(t),t.parent&&t.parent.removeChild(t);this._activeParticlesFirst=this._activeParticlesLast=null,this.particleCount=0},e.prototype.destroy=function(){var t;this.autoUpdate=!1,this.cleanup();for(var i=this._poolFirst;i;i=t)t=i.next,i.destroy();this._poolFirst=this._parent=this.particleImages=this.spawnPos=this.ownerPos=this.startColor=this.startScale=this.startAlpha=this.startSpeed=this.customEase=this._completeCallback=null},e}(),g=new i.Point,P=["pow","sqrt","abs","floor","round","ceil","E","PI","sin","cos","tan","asin","acos","atan","atan2","log"],w=new RegExp(["[01234567890\\.\\*\\-\\+\\/\\(\\)x ,]"].concat(P).join("|"),"g");var b=function(e){function s(t){var s=e.call(this,t)||this;return s.path=null,s.initialRotation=0,s.initialPosition=new i.Point,s.movement=0,s}return h(s,e),s.prototype.init=function(){this.initialRotation=this.rotation,this.Particle_init(),this.path=this.extraData.path,this._doNormalMovement=!this.path,this.movement=0,this.initialPosition.x=this.position.x,this.initialPosition.y=this.position.y},s.prototype.update=function(i){var e=this.Particle_update(i);if(e>=0&&this.path){if(this._doSpeed){var s=this.speedList.interpolate(e)*this.speedMultiplier;this.movement+=s*i}else{s=this.speedList.current.value*this.speedMultiplier;this.movement+=s*i}g.x=this.movement,g.y=this.path(this.movement),t.ParticleUtils.rotatePoint(this.initialRotation,g),this.position.x=this.initialPosition.x+g.x,this.position.y=this.initialPosition.y+g.y}return e},s.prototype.destroy=function(){this.Particle_destroy(),this.path=this.initialPosition=null},s.parseArt=function(t){return _.parseArt(t)},s.parseData=function(i){var e={};if(i&&i.path)try{e.path=function(t){for(var i=t.match(w),e=i.length-1;e>=0;--e)P.indexOf(i[e])>=0&&(i[e]="Math."+i[e]);return t=i.join(""),new Function("x","return "+t+";")}(i.path)}catch(i){t.ParticleUtils.verbose&&console.error("PathParticle: error in parsing path expression"),e.path=null}else t.ParticleUtils.verbose&&console.error("PathParticle requires a path string in extraData!"),e.path=null;return e},s}(_),S=function(t){function e(i){var e=t.call(this,i)||this;return e.textures=null,e.duration=0,e.framerate=0,e.elapsed=0,e.loop=!1,e}return h(e,t),e.prototype.init=function(){this.Particle_init(),this.elapsed=0,this.framerate<0&&(this.duration=this.maxLife,this.framerate=this.textures.length/this.duration)},e.prototype.applyArt=function(t){this.textures=t.textures,this.framerate=t.framerate,this.duration=t.duration,this.loop=t.loop},e.prototype.update=function(t){var e=this.Particle_update(t);if(e>=0){this.elapsed+=t,this.elapsed>this.duration&&(this.loop?this.elapsed=this.elapsed%this.duration:this.elapsed=this.duration-1e-6);var s=this.elapsed*this.framerate+1e-7|0;this.texture=this.textures[s]||i.Texture.EMPTY}return e},e.prototype.destroy=function(){this.Particle_destroy(),this.textures=null},e.parseArt=function(t){for(var e=[],s=0;s<t.length;++s){for(var r=t[s],a=e[s]={},h=a.textures=[],o=r.textures,l=0;l<o.length;++l){var p=o[l];if("string"==typeof p)h.push(n(p));else if(p instanceof i.Texture)h.push(p);else{var d=p.count||1;for(p="string"==typeof p.texture?n(p.texture):p.texture;d>0;--d)h.push(p)}}"matchLife"===r.framerate?(a.framerate=-1,a.duration=0,a.loop=!1):(a.loop=!!r.loop,a.framerate=r.framerate>0?r.framerate:60,a.duration=h.length/a.framerate)}return e},e}(_),R=function(t){function e(){var i=null!==t&&t.apply(this,arguments)||this;return i._firstChild=null,i._lastChild=null,i._childCount=0,i}return h(e,t),Object.defineProperty(e.prototype,"firstChild",{get:function(){return this._firstChild},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"lastChild",{get:function(){return this._lastChild},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"childCount",{get:function(){return this._childCount},enumerable:!0,configurable:!0}),e.prototype.addChild=function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];if(t.length>1)for(var e=0;e<t.length;e++)this.addChild(t[e]);else{var s=t[0];s.parent&&s.parent.removeChild(s),s.parent=this,this.sortDirty=!0,s.transform._parentID=-1,this._lastChild?(this._lastChild.nextChild=s,s.prevChild=this._lastChild,this._lastChild=s):this._firstChild=this._lastChild=s,++this._childCount,this._boundsID++,this.onChildrenChange(),this.emit("childAdded",s,this,this._childCount),s.emit("added",this)}return t[0]},e.prototype.addChildAt=function(t,i){if(i<0||i>this._childCount)throw new Error("addChildAt: The index "+i+" supplied is out of bounds "+this._childCount);t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1;var e=t;if(this._firstChild)if(0===i)this._firstChild.prevChild=e,e.nextChild=this._firstChild,this._firstChild=e;else if(i===this._childCount)this._lastChild.nextChild=e,e.prevChild=this._lastChild,this._lastChild=e;else{for(var s=0,r=this._firstChild;s<i;)r=r.nextChild,++s;r.prevChild.nextChild=e,e.prevChild=r.prevChild,e.nextChild=r,r.prevChild=e}else this._firstChild=this._lastChild=e;return++this._childCount,this._boundsID++,this.onChildrenChange(i),t.emit("added",this),this.emit("childAdded",t,this,i),t},e.prototype.addChildBelow=function(t,i){if(i.parent!==this)throw new Error("addChildBelow: The relative target must be a child of this parent");return t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,i.prevChild.nextChild=t,t.prevChild=i.prevChild,t.nextChild=i,i.prevChild=t,this._firstChild===i&&(this._firstChild=t),++this._childCount,this._boundsID++,this.onChildrenChange(),this.emit("childAdded",t,this,this._childCount),t.emit("added",this),t},e.prototype.addChildAbove=function(t,i){if(i.parent!==this)throw new Error("addChildBelow: The relative target must be a child of this parent");return t.parent&&t.parent.removeChild(t),t.parent=this,this.sortDirty=!0,t.transform._parentID=-1,i.nextChild.prevChild=t,t.nextChild=i.nextChild,t.prevChild=i,i.nextChild=t,this._lastChild===i&&(this._lastChild=t),++this._childCount,this._boundsID++,this.onChildrenChange(),this.emit("childAdded",t,this,this._childCount),t.emit("added",this),t},e.prototype.swapChildren=function(t,i){if(t!==i&&t.parent===this&&i.parent===this){var e=t,s=e.prevChild,r=e.nextChild;t.prevChild=i.prevChild,t.nextChild=i.nextChild,i.prevChild=s,i.nextChild=r,this._firstChild===t?this._firstChild=i:this._firstChild===i&&(this._firstChild=t),this._lastChild===t?this._lastChild=i:this._lastChild===i&&(this._lastChild=t),this.onChildrenChange()}},e.prototype.getChildIndex=function(t){for(var i=0,e=this._firstChild;e&&e!==t;)e=e.nextChild,++i;if(!e)throw new Error("The supplied DisplayObject must be a child of the caller");return i},e.prototype.setChildIndex=function(t,i){if(i<0||i>=this._childCount)throw new Error("The index "+i+" supplied is out of bounds "+this._childCount);if(t.parent!==this)throw new Error("The supplied DisplayObject must be a child of the caller");if(t.nextChild&&(t.nextChild.prevChild=t.prevChild),t.prevChild&&(t.prevChild.nextChild=t.nextChild),this._firstChild===t&&(this._firstChild=t.nextChild),this._lastChild===t&&(this._lastChild=t.prevChild),t.nextChild=null,t.prevChild=null,this._firstChild)if(0===i)this._firstChild.prevChild=t,t.nextChild=this._firstChild,this._firstChild=t;else if(i===this._childCount)this._lastChild.nextChild=t,t.prevChild=this._lastChild,this._lastChild=t;else{for(var e=0,s=this._firstChild;e<i;)s=s.nextChild,++e;s.prevChild.nextChild=t,t.prevChild=s.prevChild,t.nextChild=s,s.prevChild=t}else this._firstChild=this._lastChild=t;this.onChildrenChange(i)},e.prototype.removeChild=function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];if(t.length>1)for(var e=0;e<t.length;e++)this.removeChild(t[e]);else{var s=t[0];if(s.parent!==this)return null;s.parent=null,s.transform._parentID=-1,s.nextChild&&(s.nextChild.prevChild=s.prevChild),s.prevChild&&(s.prevChild.nextChild=s.nextChild),this._firstChild===s&&(this._firstChild=s.nextChild),this._lastChild===s&&(this._lastChild=s.prevChild),s.nextChild=null,s.prevChild=null,--this._childCount,this._boundsID++,this.onChildrenChange(),s.emit("removed",this),this.emit("childRemoved",s,this)}return t[0]},e.prototype.getChildAt=function(t){if(t<0||t>=this._childCount)throw new Error("getChildAt: Index ("+t+") does not exist.");if(0===t)return this._firstChild;if(t===this._childCount)return this._lastChild;for(var i=0,e=this._firstChild;i<t;)e=e.nextChild,++i;return e},e.prototype.removeChildAt=function(t){var i=this.getChildAt(t);return i.parent=null,i.transform._parentID=-1,i.nextChild&&(i.nextChild.prevChild=i.prevChild),i.prevChild&&(i.prevChild.nextChild=i.nextChild),this._firstChild===i&&(this._firstChild=i.nextChild),this._lastChild===i&&(this._lastChild=i.prevChild),i.nextChild=null,i.prevChild=null,--this._childCount,this._boundsID++,this.onChildrenChange(t),i.emit("removed",this),this.emit("childRemoved",i,this,t),i},e.prototype.removeChildren=function(t,i){void 0===t&&(t=0),void 0===i&&(i=this._childCount);var e=t,s=i,r=s-e;if(r>0&&r<=s){for(var n=[],a=this._firstChild,h=0;h<=s&&a;++h,a=a.nextChild)h>=e&&n.push(a);var o=n[0].prevChild,l=n[n.length-1].nextChild;l?l.prevChild=o:this._lastChild=o,o?o.nextChild=l:this._firstChild=l;for(h=0;h<n.length;++h)n[h].parent=null,n[h].transform&&(n[h].transform._parentID=-1),n[h].nextChild=null,n[h].prevChild=null;this._boundsID++,this.onChildrenChange(t);for(h=0;h<n.length;++h)n[h].emit("removed",this),this.emit("childRemoved",n[h],this,h);return n}if(0===r&&0===this._childCount)return[];throw new RangeError("removeChildren: numeric values are outside the acceptable range.")},e.prototype.updateTransform=function(){var t,i;for(this._boundsID++,this.transform.updateTransform(this.parent.transform),this.worldAlpha=this.alpha*this.parent.worldAlpha,t=this._firstChild;t;t=i)i=t.nextChild,t.visible&&t.updateTransform()},e.prototype.calculateBounds=function(){var t,i;for(this._bounds.clear(),this._calculateBounds(),t=this._firstChild;t;t=i)if(i=t.nextChild,t.visible&&t.renderable)if(t.calculateBounds(),t._mask){var e=t._mask.maskObject||t._mask;e.calculateBounds(),this._bounds.addBoundsMask(t._bounds,e._bounds)}else t.filterArea?this._bounds.addBoundsArea(t._bounds,t.filterArea):this._bounds.addBounds(t._bounds);this._bounds.updateID=this._boundsID},e.prototype.getLocalBounds=function(t,e){void 0===e&&(e=!1);var s=i.DisplayObject.prototype.getLocalBounds.call(this,t);if(!e){var r=void 0,n=void 0;for(r=this._firstChild;r;r=n)n=r.nextChild,r.visible&&r.updateTransform()}return s},e.prototype.render=function(t){if(this.visible&&!(this.worldAlpha<=0)&&this.renderable)if(this._mask||this.filters&&this.filters.length)this.renderAdvanced(t);else{this._render(t);var i=void 0,e=void 0;for(i=this._firstChild;i;i=e)e=i.nextChild,i.render(t)}},e.prototype.renderAdvanced=function(t){t.batch.flush();var i,e,s=this.filters,r=this._mask;if(s){this._enabledFilters||(this._enabledFilters=[]),this._enabledFilters.length=0;for(var n=0;n<s.length;n++)s[n].enabled&&this._enabledFilters.push(s[n]);this._enabledFilters.length&&t.filter.push(this,this._enabledFilters)}for(r&&t.mask.push(this,this._mask),this._render(t),i=this._firstChild;i;i=e)e=i.nextChild,i.render(t);t.batch.flush(),r&&t.mask.pop(this),s&&this._enabledFilters&&this._enabledFilters.length&&t.filter.pop()},e.prototype.renderWebGL=function(t){if(this.visible&&!(this.worldAlpha<=0)&&this.renderable)if(this._mask||this.filters&&this.filters.length)this.renderAdvancedWebGL(t);else{this._renderWebGL(t);var i=void 0,e=void 0;for(i=this._firstChild;i;i=e)e=i.nextChild,i.renderWebGL(t)}},e.prototype.renderAdvancedWebGL=function(t){t.flush();var i,e,s=this._filters,r=this._mask;if(s){this._enabledFilters||(this._enabledFilters=[]),this._enabledFilters.length=0;for(var n=0;n<s.length;n++)s[n].enabled&&this._enabledFilters.push(s[n]);this._enabledFilters.length&&t.filterManager.pushFilter(this,this._enabledFilters)}for(r&&t.maskManager.pushMask(this,this._mask),this._renderWebGL(t),i=this._firstChild;i;i=e)e=i.nextChild,i.renderWebGL(t);t.flush(),r&&t.maskManager.popMask(this,this._mask),s&&this._enabledFilters&&this._enabledFilters.length&&t.filterManager.popFilter()},e.prototype.renderCanvas=function(t){if(this.visible&&!(this.worldAlpha<=0)&&this.renderable){var i,e;for(this._mask&&t.maskManager.pushMask(this._mask),this._renderCanvas(t),i=this._firstChild;i;i=e)e=i.nextChild,i.renderCanvas(t);this._mask&&t.maskManager.popMask(t)}},e}(i.Container);t.AnimatedParticle=S,t.Emitter=y,t.GetTextureFromString=n,t.LinkedListContainer=R,t.Particle=_,t.PathParticle=b,t.PolygonalChain=C,t.PropertyList=f,t.PropertyNode=s}(this.PIXI.particles=this.PIXI.particles||{},PIXI);
//# sourceMappingURL=pixi-particles.min.js.map
})();
(function(){
//PRAGMA: pluginName
var pluginName = 'TRP_ParticleMZ';
//PRAGMA_END: pluginName
if(PluginManager.parameters(pluginName).importFilter!=='true')return;

/*!
 * pixi-filters - v3.2.1
 * Compiled Wed, 30 Dec 2020 18:32:15 UTC
 *
 * pixi-filters is licensed under the MIT License.
 * http://www.opensource.org/licenses/mit-license
 */
var __filters=function(e,t,n,r,o,i,l,s){"use strict";var a="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n    gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n    vTextureCoord = aTextureCoord;\n}",u="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform float gamma;\nuniform float contrast;\nuniform float saturation;\nuniform float brightness;\nuniform float red;\nuniform float green;\nuniform float blue;\nuniform float alpha;\n\nvoid main(void)\n{\n    vec4 c = texture2D(uSampler, vTextureCoord);\n\n    if (c.a > 0.0) {\n        c.rgb /= c.a;\n\n        vec3 rgb = pow(c.rgb, vec3(1. / gamma));\n        rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\n        rgb.r *= red;\n        rgb.g *= green;\n        rgb.b *= blue;\n        c.rgb = rgb * brightness;\n\n        c.rgb *= c.a;\n    }\n\n    gl_FragColor = c * alpha;\n}\n",c=function(e){function t(t){e.call(this,a,u),Object.assign(this,{gamma:1,saturation:1,contrast:1,brightness:1,red:1,green:1,blue:1,alpha:1},t)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.apply=function(e,t,n,r){this.uniforms.gamma=Math.max(this.gamma,1e-4),this.uniforms.saturation=this.saturation,this.uniforms.contrast=this.contrast,this.uniforms.brightness=this.brightness,this.uniforms.red=this.red,this.uniforms.green=this.green,this.uniforms.blue=this.blue,this.uniforms.alpha=this.alpha,e.applyFilter(this,t,n,r)},t}(t.Filter),f=a,h="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\n\nvoid main(void)\n{\n    vec4 color = vec4(0.0);\n\n    // Sample top left pixel\n    color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y));\n\n    // Sample top right pixel\n    color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y));\n\n    // Sample bottom right pixel\n    color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y));\n\n    // Sample bottom left pixel\n    color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y));\n\n    // Average\n    color *= 0.25;\n\n    gl_FragColor = color;\n}",p="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\nuniform vec4 filterClamp;\n\nvoid main(void)\n{\n    vec4 color = vec4(0.0);\n\n    // Sample top left pixel\n    color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n    // Sample top right pixel\n    color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n    // Sample bottom right pixel\n    color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n    // Sample bottom left pixel\n    color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n    // Average\n    color *= 0.25;\n\n    gl_FragColor = color;\n}\n",d=function(e){function t(t,r,o){void 0===t&&(t=4),void 0===r&&(r=3),void 0===o&&(o=!1),e.call(this,f,o?p:h),this.uniforms.uOffset=new Float32Array(2),this._pixelSize=new n.Point,this.pixelSize=1,this._clamp=o,this._kernels=null,Array.isArray(t)?this.kernels=t:(this._blur=t,this.quality=r)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={kernels:{configurable:!0},clamp:{configurable:!0},pixelSize:{configurable:!0},quality:{configurable:!0},blur:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){var o,i=this._pixelSize.x/t._frame.width,l=this._pixelSize.y/t._frame.height;if(1===this._quality||0===this._blur)o=this._kernels[0]+.5,this.uniforms.uOffset[0]=o*i,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,t,n,r);else{for(var s,a=e.getFilterTexture(),u=t,c=a,f=this._quality-1,h=0;h<f;h++)o=this._kernels[h]+.5,this.uniforms.uOffset[0]=o*i,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,u,c,1),s=u,u=c,c=s;o=this._kernels[f]+.5,this.uniforms.uOffset[0]=o*i,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,u,n,r),e.returnFilterTexture(a)}},t.prototype._updatePadding=function(){this.padding=Math.ceil(this._kernels.reduce(function(e,t){return e+t+.5},0))},t.prototype._generateKernels=function(){var e=this._blur,t=this._quality,n=[e];if(e>0)for(var r=e,o=e/t,i=1;i<t;i++)r-=o,n.push(r);this._kernels=n,this._updatePadding()},r.kernels.get=function(){return this._kernels},r.kernels.set=function(e){Array.isArray(e)&&e.length>0?(this._kernels=e,this._quality=e.length,this._blur=Math.max.apply(Math,e)):(this._kernels=[0],this._quality=1)},r.clamp.get=function(){return this._clamp},r.pixelSize.set=function(e){"number"==typeof e?(this._pixelSize.x=e,this._pixelSize.y=e):Array.isArray(e)?(this._pixelSize.x=e[0],this._pixelSize.y=e[1]):e instanceof n.Point?(this._pixelSize.x=e.x,this._pixelSize.y=e.y):(this._pixelSize.x=1,this._pixelSize.y=1)},r.pixelSize.get=function(){return this._pixelSize},r.quality.get=function(){return this._quality},r.quality.set=function(e){this._quality=Math.max(1,Math.round(e)),this._generateKernels()},r.blur.get=function(){return this._blur},r.blur.set=function(e){this._blur=e,this._generateKernels()},Object.defineProperties(t.prototype,r),t}(t.Filter),m=a,g="\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform float threshold;\n\nvoid main() {\n    vec4 color = texture2D(uSampler, vTextureCoord);\n\n    // A simple & fast algorithm for getting brightness.\n    // It's inaccuracy , but good enought for this feature.\n    float _max = max(max(color.r, color.g), color.b);\n    float _min = min(min(color.r, color.g), color.b);\n    float brightness = (_max + _min) * 0.5;\n\n    if(brightness > threshold) {\n        gl_FragColor = color;\n    } else {\n        gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n}\n",v=function(e){function t(t){void 0===t&&(t=.5),e.call(this,m,g),this.threshold=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={threshold:{configurable:!0}};return n.threshold.get=function(){return this.uniforms.threshold},n.threshold.set=function(e){this.uniforms.threshold=e},Object.defineProperties(t.prototype,n),t}(t.Filter),x="uniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D bloomTexture;\nuniform float bloomScale;\nuniform float brightness;\n\nvoid main() {\n    vec4 color = texture2D(uSampler, vTextureCoord);\n    color.rgb *= brightness;\n    vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0);\n    bloomColor.rgb *= bloomScale;\n    gl_FragColor = color + bloomColor;\n}\n",y=function(e){function t(t){e.call(this,m,x),"number"==typeof t&&(t={threshold:t}),t=Object.assign({threshold:.5,bloomScale:1,brightness:1,kernels:null,blur:8,quality:4,pixelSize:1,resolution:r.settings.FILTER_RESOLUTION},t),this.bloomScale=t.bloomScale,this.brightness=t.brightness;var n=t.kernels,o=t.blur,i=t.quality,l=t.pixelSize,s=t.resolution;this._extractFilter=new v(t.threshold),this._extractFilter.resolution=s,this._blurFilter=n?new d(n):new d(o,i),this.pixelSize=l,this.resolution=s}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={resolution:{configurable:!0},threshold:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return t.prototype.apply=function(e,t,n,r,o){var i=e.getFilterTexture();this._extractFilter.apply(e,t,i,1,o);var l=e.getFilterTexture();this._blurFilter.apply(e,i,l,1,o),this.uniforms.bloomScale=this.bloomScale,this.uniforms.brightness=this.brightness,this.uniforms.bloomTexture=l,e.applyFilter(this,t,n,r),e.returnFilterTexture(l),e.returnFilterTexture(i)},n.resolution.get=function(){return this._resolution},n.resolution.set=function(e){this._resolution=e,this._extractFilter&&(this._extractFilter.resolution=e),this._blurFilter&&(this._blurFilter.resolution=e)},n.threshold.get=function(){return this._extractFilter.threshold},n.threshold.set=function(e){this._extractFilter.threshold=e},n.kernels.get=function(){return this._blurFilter.kernels},n.kernels.set=function(e){this._blurFilter.kernels=e},n.blur.get=function(){return this._blurFilter.blur},n.blur.set=function(e){this._blurFilter.blur=e},n.quality.get=function(){return this._blurFilter.quality},n.quality.set=function(e){this._blurFilter.quality=e},n.pixelSize.get=function(){return this._blurFilter.pixelSize},n.pixelSize.set=function(e){this._blurFilter.pixelSize=e},Object.defineProperties(t.prototype,n),t}(t.Filter),_=a,b="varying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform float pixelSize;\nuniform sampler2D uSampler;\n\nvec2 mapCoord( vec2 coord )\n{\n    coord *= filterArea.xy;\n    coord += filterArea.zw;\n\n    return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n    coord -= filterArea.zw;\n    coord /= filterArea.xy;\n\n    return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n    return floor( coord / size ) * size;\n}\n\nvec2 getMod(vec2 coord, vec2 size)\n{\n    return mod( coord , size) / size;\n}\n\nfloat character(float n, vec2 p)\n{\n    p = floor(p*vec2(4.0, -4.0) + 2.5);\n\n    if (clamp(p.x, 0.0, 4.0) == p.x)\n    {\n        if (clamp(p.y, 0.0, 4.0) == p.y)\n        {\n            if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;\n        }\n    }\n    return 0.0;\n}\n\nvoid main()\n{\n    vec2 coord = mapCoord(vTextureCoord);\n\n    // get the rounded color..\n    vec2 pixCoord = pixelate(coord, vec2(pixelSize));\n    pixCoord = unmapCoord(pixCoord);\n\n    vec4 color = texture2D(uSampler, pixCoord);\n\n    // determine the character to use\n    float gray = (color.r + color.g + color.b) / 3.0;\n\n    float n =  65536.0;             // .\n    if (gray > 0.2) n = 65600.0;    // :\n    if (gray > 0.3) n = 332772.0;   // *\n    if (gray > 0.4) n = 15255086.0; // o\n    if (gray > 0.5) n = 23385164.0; // &\n    if (gray > 0.6) n = 15252014.0; // 8\n    if (gray > 0.7) n = 13199452.0; // @\n    if (gray > 0.8) n = 11512810.0; // #\n\n    // get the mod..\n    vec2 modd = getMod(coord, vec2(pixelSize));\n\n    gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0);\n\n}\n",C=function(e){function t(t){void 0===t&&(t=8),e.call(this,_,b),this.size=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={size:{configurable:!0}};return n.size.get=function(){return this.uniforms.pixelSize},n.size.set=function(e){this.uniforms.pixelSize=e},Object.defineProperties(t.prototype,n),t}(t.Filter),S=a,F="precision mediump float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float transformX;\nuniform float transformY;\nuniform vec3 lightColor;\nuniform float lightAlpha;\nuniform vec3 shadowColor;\nuniform float shadowAlpha;\n\nvoid main(void) {\n    vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY);\n    vec4 color = texture2D(uSampler, vTextureCoord);\n    float light = texture2D(uSampler, vTextureCoord - transform).a;\n    float shadow = texture2D(uSampler, vTextureCoord + transform).a;\n\n    color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0));\n    color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0));\n    gl_FragColor = vec4(color.rgb * color.a, color.a);\n}\n",z=function(e){function t(t){void 0===t&&(t={}),e.call(this,S,F),this.uniforms.lightColor=new Float32Array(3),this.uniforms.shadowColor=new Float32Array(3),t=Object.assign({rotation:45,thickness:2,lightColor:16777215,lightAlpha:.7,shadowColor:0,shadowAlpha:.7},t),this.rotation=t.rotation,this.thickness=t.thickness,this.lightColor=t.lightColor,this.lightAlpha=t.lightAlpha,this.shadowColor=t.shadowColor,this.shadowAlpha=t.shadowAlpha,this.padding=1}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={rotation:{configurable:!0},thickness:{configurable:!0},lightColor:{configurable:!0},lightAlpha:{configurable:!0},shadowColor:{configurable:!0},shadowAlpha:{configurable:!0}};return t.prototype._updateTransform=function(){this.uniforms.transformX=this._thickness*Math.cos(this._angle),this.uniforms.transformY=this._thickness*Math.sin(this._angle)},r.rotation.get=function(){return this._angle/n.DEG_TO_RAD},r.rotation.set=function(e){this._angle=e*n.DEG_TO_RAD,this._updateTransform()},r.thickness.get=function(){return this._thickness},r.thickness.set=function(e){this._thickness=e,this._updateTransform()},r.lightColor.get=function(){return o.rgb2hex(this.uniforms.lightColor)},r.lightColor.set=function(e){o.hex2rgb(e,this.uniforms.lightColor)},r.lightAlpha.get=function(){return this.uniforms.lightAlpha},r.lightAlpha.set=function(e){this.uniforms.lightAlpha=e},r.shadowColor.get=function(){return o.rgb2hex(this.uniforms.shadowColor)},r.shadowColor.set=function(e){o.hex2rgb(e,this.uniforms.shadowColor)},r.shadowAlpha.get=function(){return this.uniforms.shadowAlpha},r.shadowAlpha.set=function(e){this.uniforms.shadowAlpha=e},Object.defineProperties(t.prototype,r),t}(t.Filter),A=function(e){function t(t,o,a,u){var c,f;void 0===t&&(t=2),void 0===o&&(o=4),void 0===a&&(a=r.settings.FILTER_RESOLUTION),void 0===u&&(u=5),e.call(this),"number"==typeof t?(c=t,f=t):t instanceof n.Point?(c=t.x,f=t.y):Array.isArray(t)&&(c=t[0],f=t[1]),this.blurXFilter=new s.BlurFilterPass(!0,c,o,a,u),this.blurYFilter=new s.BlurFilterPass(!1,f,o,a,u),this.blurYFilter.blendMode=i.BLEND_MODES.SCREEN,this.defaultFilter=new l.AlphaFilter}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var o={blur:{configurable:!0},blurX:{configurable:!0},blurY:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){var o=e.getFilterTexture();this.defaultFilter.apply(e,t,n,r),this.blurXFilter.apply(e,t,o),this.blurYFilter.apply(e,o,n,0),e.returnFilterTexture(o)},o.blur.get=function(){return this.blurXFilter.blur},o.blur.set=function(e){this.blurXFilter.blur=this.blurYFilter.blur=e},o.blurX.get=function(){return this.blurXFilter.blur},o.blurX.set=function(e){this.blurXFilter.blur=e},o.blurY.get=function(){return this.blurYFilter.blur},o.blurY.set=function(e){this.blurYFilter.blur=e},Object.defineProperties(t.prototype,o),t}(t.Filter),T=a,w="uniform float radius;\nuniform float strength;\nuniform vec2 center;\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nvoid main()\n{\n    vec2 coord = vTextureCoord * filterArea.xy;\n    coord -= center * dimensions.xy;\n    float distance = length(coord);\n    if (distance < radius) {\n        float percent = distance / radius;\n        if (strength > 0.0) {\n            coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\n        } else {\n            coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\n        }\n    }\n    coord += center * dimensions.xy;\n    coord /= filterArea.xy;\n    vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\n    vec4 color = texture2D(uSampler, clampedCoord);\n    if (coord != clampedCoord) {\n        color *= max(0.0, 1.0 - length(coord - clampedCoord));\n    }\n\n    gl_FragColor = color;\n}\n",O=function(e){function t(t){if(e.call(this,T,w),"object"!=typeof t){var n=arguments[0],r=arguments[1],o=arguments[2];t={},void 0!==n&&(t.center=n),void 0!==r&&(t.radius=r),void 0!==o&&(t.strength=o)}this.uniforms.dimensions=new Float32Array(2),Object.assign(this,{center:[.5,.5],radius:100,strength:1},t)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={radius:{configurable:!0},strength:{configurable:!0},center:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.dimensions[0]=t.filterFrame.width,this.uniforms.dimensions[1]=t.filterFrame.height,e.applyFilter(this,t,n,r)},n.radius.get=function(){return this.uniforms.radius},n.radius.set=function(e){this.uniforms.radius=e},n.strength.get=function(){return this.uniforms.strength},n.strength.set=function(e){this.uniforms.strength=e},n.center.get=function(){return this.uniforms.center},n.center.set=function(e){this.uniforms.center=e},Object.defineProperties(t.prototype,n),t}(t.Filter),D=a,P="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform sampler2D colorMap;\nuniform float _mix;\nuniform float _size;\nuniform float _sliceSize;\nuniform float _slicePixelSize;\nuniform float _sliceInnerSize;\nvoid main() {\n    vec4 color = texture2D(uSampler, vTextureCoord.xy);\n\n    vec4 adjusted;\n    if (color.a > 0.0) {\n        color.rgb /= color.a;\n        float innerWidth = _size - 1.0;\n        float zSlice0 = min(floor(color.b * innerWidth), innerWidth);\n        float zSlice1 = min(zSlice0 + 1.0, innerWidth);\n        float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize;\n        float s0 = xOffset + (zSlice0 * _sliceSize);\n        float s1 = xOffset + (zSlice1 * _sliceSize);\n        float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize);\n        vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset));\n        vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset));\n        float zOffset = fract(color.b * innerWidth);\n        adjusted = mix(slice0Color, slice1Color, zOffset);\n\n        color.rgb *= color.a;\n    }\n    gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a);\n\n}",M=function(e){function n(t,n,r){void 0===n&&(n=!1),void 0===r&&(r=1),e.call(this,D,P),this._size=0,this._sliceSize=0,this._slicePixelSize=0,this._sliceInnerSize=0,this._scaleMode=null,this._nearest=!1,this.nearest=n,this.mix=r,this.colorMap=t}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var r={colorSize:{configurable:!0},colorMap:{configurable:!0},nearest:{configurable:!0}};return n.prototype.apply=function(e,t,n,r){this.uniforms._mix=this.mix,e.applyFilter(this,t,n,r)},r.colorSize.get=function(){return this._size},r.colorMap.get=function(){return this._colorMap},r.colorMap.set=function(e){e instanceof t.Texture||(e=t.Texture.from(e)),e&&e.baseTexture&&(e.baseTexture.scaleMode=this._scaleMode,e.baseTexture.mipmap=!1,this._size=e.height,this._sliceSize=1/this._size,this._slicePixelSize=this._sliceSize/this._size,this._sliceInnerSize=this._slicePixelSize*(this._size-1),this.uniforms._size=this._size,this.uniforms._sliceSize=this._sliceSize,this.uniforms._slicePixelSize=this._slicePixelSize,this.uniforms._sliceInnerSize=this._sliceInnerSize,this.uniforms.colorMap=e),this._colorMap=e},r.nearest.get=function(){return this._nearest},r.nearest.set=function(e){this._nearest=e,this._scaleMode=e?i.SCALE_MODES.NEAREST:i.SCALE_MODES.LINEAR;var t=this._colorMap;t&&t.baseTexture&&(t.baseTexture._glTextures={},t.baseTexture.scaleMode=this._scaleMode,t.baseTexture.mipmap=!1,t._updateID++,t.baseTexture.emit("update",t.baseTexture))},n.prototype.updateColorMap=function(){var e=this._colorMap;e&&e.baseTexture&&(e._updateID++,e.baseTexture.emit("update",e.baseTexture),this.colorMap=e)},n.prototype.destroy=function(t){this._colorMap&&this._colorMap.destroy(t),e.prototype.destroy.call(this)},Object.defineProperties(n.prototype,r),n}(t.Filter),R=a,k="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec3 color;\nvoid main(void) {\n    vec4 currentColor = texture2D(uSampler, vTextureCoord);\n    vec3 colorOverlay = color * currentColor.a;\n    gl_FragColor = vec4(colorOverlay.r, colorOverlay.g, colorOverlay.b, currentColor.a);\n}\n",j=function(e){function t(t){void 0===t&&(t=0),e.call(this,R,k),this.uniforms.color=new Float32Array(3),this.color=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={color:{configurable:!0}};return n.color.set=function(e){var t=this.uniforms.color;"number"==typeof e?(o.hex2rgb(e,t),this._color=e):(t[0]=e[0],t[1]=e[1],t[2]=e[2],this._color=o.rgb2hex(t))},n.color.get=function(){return this._color},Object.defineProperties(t.prototype,n),t}(t.Filter),E=a,L="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec3 originalColor;\nuniform vec3 newColor;\nuniform float epsilon;\nvoid main(void) {\n    vec4 currentColor = texture2D(uSampler, vTextureCoord);\n    vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001));\n    float colorDistance = length(colorDiff);\n    float doReplace = step(colorDistance, epsilon);\n    gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a);\n}\n",I=function(e){function t(t,n,r){void 0===t&&(t=16711680),void 0===n&&(n=0),void 0===r&&(r=.4),e.call(this,E,L),this.uniforms.originalColor=new Float32Array(3),this.uniforms.newColor=new Float32Array(3),this.originalColor=t,this.newColor=n,this.epsilon=r}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={originalColor:{configurable:!0},newColor:{configurable:!0},epsilon:{configurable:!0}};return n.originalColor.set=function(e){var t=this.uniforms.originalColor;"number"==typeof e?(o.hex2rgb(e,t),this._originalColor=e):(t[0]=e[0],t[1]=e[1],t[2]=e[2],this._originalColor=o.rgb2hex(t))},n.originalColor.get=function(){return this._originalColor},n.newColor.set=function(e){var t=this.uniforms.newColor;"number"==typeof e?(o.hex2rgb(e,t),this._newColor=e):(t[0]=e[0],t[1]=e[1],t[2]=e[2],this._newColor=o.rgb2hex(t))},n.newColor.get=function(){return this._newColor},n.epsilon.set=function(e){this.uniforms.epsilon=e},n.epsilon.get=function(){return this.uniforms.epsilon},Object.defineProperties(t.prototype,n),t}(t.Filter),X=a,B="precision mediump float;\n\nvarying mediump vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec2 texelSize;\nuniform float matrix[9];\n\nvoid main(void)\n{\n   vec4 c11 = texture2D(uSampler, vTextureCoord - texelSize); // top left\n   vec4 c12 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - texelSize.y)); // top center\n   vec4 c13 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y - texelSize.y)); // top right\n\n   vec4 c21 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y)); // mid left\n   vec4 c22 = texture2D(uSampler, vTextureCoord); // mid center\n   vec4 c23 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y)); // mid right\n\n   vec4 c31 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y + texelSize.y)); // bottom left\n   vec4 c32 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + texelSize.y)); // bottom center\n   vec4 c33 = texture2D(uSampler, vTextureCoord + texelSize); // bottom right\n\n   gl_FragColor =\n       c11 * matrix[0] + c12 * matrix[1] + c13 * matrix[2] +\n       c21 * matrix[3] + c22 * matrix[4] + c23 * matrix[5] +\n       c31 * matrix[6] + c32 * matrix[7] + c33 * matrix[8];\n\n   gl_FragColor.a = c22.a;\n}\n",N=function(e){function t(t,n,r){void 0===n&&(n=200),void 0===r&&(r=200),e.call(this,X,B),this.uniforms.texelSize=new Float32Array(2),this.uniforms.matrix=new Float32Array(9),void 0!==t&&(this.matrix=t),this.width=n,this.height=r}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={matrix:{configurable:!0},width:{configurable:!0},height:{configurable:!0}};return n.matrix.get=function(){return this.uniforms.matrix},n.matrix.set=function(e){var t=this;e.forEach(function(e,n){return t.uniforms.matrix[n]=e})},n.width.get=function(){return 1/this.uniforms.texelSize[0]},n.width.set=function(e){this.uniforms.texelSize[0]=1/e},n.height.get=function(){return 1/this.uniforms.texelSize[1]},n.height.set=function(e){this.uniforms.texelSize[1]=1/e},Object.defineProperties(t.prototype,n),t}(t.Filter),G=a,q="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\n\nvoid main(void)\n{\n    float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);\n\n    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n\n    if (lum < 1.00)\n    {\n        if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0)\n        {\n            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n        }\n    }\n\n    if (lum < 0.75)\n    {\n        if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0)\n        {\n            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n        }\n    }\n\n    if (lum < 0.50)\n    {\n        if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0)\n        {\n            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n        }\n    }\n\n    if (lum < 0.3)\n    {\n        if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0)\n        {\n            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n        }\n    }\n}\n",K=function(e){function t(){e.call(this,G,q)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(t.Filter),W=a,Y="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec2 dimensions;\n\nconst float SQRT_2 = 1.414213;\n\nconst float light = 1.0;\n\nuniform float curvature;\nuniform float lineWidth;\nuniform float lineContrast;\nuniform bool verticalLine;\nuniform float noise;\nuniform float noiseSize;\n\nuniform float vignetting;\nuniform float vignettingAlpha;\nuniform float vignettingBlur;\n\nuniform float seed;\nuniform float time;\n\nfloat rand(vec2 co) {\n    return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n    vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n    vec2 dir = vec2(vTextureCoord.xy - vec2(0.5, 0.5)) * filterArea.xy / dimensions;\n\n    gl_FragColor = texture2D(uSampler, vTextureCoord);\n    vec3 rgb = gl_FragColor.rgb;\n\n    if (noise > 0.0 && noiseSize > 0.0)\n    {\n        pixelCoord.x = floor(pixelCoord.x / noiseSize);\n        pixelCoord.y = floor(pixelCoord.y / noiseSize);\n        float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\n        rgb += _noise * noise;\n    }\n\n    if (lineWidth > 0.0)\n    {\n        float _c = curvature > 0. ? curvature : 1.;\n        float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.;\n        vec2 uv = dir * k;\n\n        float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c;\n        float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast;\n        rgb *= j;\n        float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.);\n        rgb *= 0.99 + ceil(segment) * 0.015;\n    }\n\n    if (vignetting > 0.0)\n    {\n        float outter = SQRT_2 - vignetting * SQRT_2;\n        float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\n        rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\n    }\n\n    gl_FragColor.rgb = rgb;\n}\n",Z=function(e){function t(t){e.call(this,W,Y),this.uniforms.dimensions=new Float32Array(2),this.time=0,this.seed=0,Object.assign(this,{curvature:1,lineWidth:1,lineContrast:.25,verticalLine:!1,noise:0,noiseSize:1,seed:0,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3,time:0},t)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={curvature:{configurable:!0},lineWidth:{configurable:!0},lineContrast:{configurable:!0},verticalLine:{configurable:!0},noise:{configurable:!0},noiseSize:{configurable:!0},vignetting:{configurable:!0},vignettingAlpha:{configurable:!0},vignettingBlur:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.dimensions[0]=t.filterFrame.width,this.uniforms.dimensions[1]=t.filterFrame.height,this.uniforms.seed=this.seed,this.uniforms.time=this.time,e.applyFilter(this,t,n,r)},n.curvature.set=function(e){this.uniforms.curvature=e},n.curvature.get=function(){return this.uniforms.curvature},n.lineWidth.set=function(e){this.uniforms.lineWidth=e},n.lineWidth.get=function(){return this.uniforms.lineWidth},n.lineContrast.set=function(e){this.uniforms.lineContrast=e},n.lineContrast.get=function(){return this.uniforms.lineContrast},n.verticalLine.set=function(e){this.uniforms.verticalLine=e},n.verticalLine.get=function(){return this.uniforms.verticalLine},n.noise.set=function(e){this.uniforms.noise=e},n.noise.get=function(){return this.uniforms.noise},n.noiseSize.set=function(e){this.uniforms.noiseSize=e},n.noiseSize.get=function(){return this.uniforms.noiseSize},n.vignetting.set=function(e){this.uniforms.vignetting=e},n.vignetting.get=function(){return this.uniforms.vignetting},n.vignettingAlpha.set=function(e){this.uniforms.vignettingAlpha=e},n.vignettingAlpha.get=function(){return this.uniforms.vignettingAlpha},n.vignettingBlur.set=function(e){this.uniforms.vignettingBlur=e},n.vignettingBlur.get=function(){return this.uniforms.vignettingBlur},Object.defineProperties(t.prototype,n),t}(t.Filter),Q=a,U="precision mediump float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec4 filterArea;\nuniform sampler2D uSampler;\n\nuniform float angle;\nuniform float scale;\n\nfloat pattern()\n{\n   float s = sin(angle), c = cos(angle);\n   vec2 tex = vTextureCoord * filterArea.xy;\n   vec2 point = vec2(\n       c * tex.x - s * tex.y,\n       s * tex.x + c * tex.y\n   ) * scale;\n   return (sin(point.x) * sin(point.y)) * 4.0;\n}\n\nvoid main()\n{\n   vec4 color = texture2D(uSampler, vTextureCoord);\n   float average = (color.r + color.g + color.b) / 3.0;\n   gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\n}\n",V=function(e){function t(t,n){void 0===t&&(t=1),void 0===n&&(n=5),e.call(this,Q,U),this.scale=t,this.angle=n}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={scale:{configurable:!0},angle:{configurable:!0}};return n.scale.get=function(){return this.uniforms.scale},n.scale.set=function(e){this.uniforms.scale=e},n.angle.get=function(){return this.uniforms.angle},n.angle.set=function(e){this.uniforms.angle=e},Object.defineProperties(t.prototype,n),t}(t.Filter),H=a,$="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float alpha;\nuniform vec3 color;\n\nuniform vec2 shift;\nuniform vec4 inputSize;\n\nvoid main(void){\n    vec4 sample = texture2D(uSampler, vTextureCoord - shift * inputSize.zw);\n\n    // Premultiply alpha\n    sample.rgb = color.rgb * sample.a;\n\n    // alpha user alpha\n    sample *= alpha;\n\n    gl_FragColor = sample;\n}",J=function(e){function t(t){t&&t.constructor!==Object&&(console.warn("DropShadowFilter now uses options instead of (rotation, distance, blur, color, alpha)"),t={rotation:t},void 0!==arguments[1]&&(t.distance=arguments[1]),void 0!==arguments[2]&&(t.blur=arguments[2]),void 0!==arguments[3]&&(t.color=arguments[3]),void 0!==arguments[4]&&(t.alpha=arguments[4])),t=Object.assign({rotation:45,distance:5,color:0,alpha:.5,shadowOnly:!1,kernels:null,blur:2,quality:3,pixelSize:1,resolution:r.settings.FILTER_RESOLUTION},t),e.call(this);var o=t.kernels,i=t.blur,l=t.quality,s=t.pixelSize,a=t.resolution;this._tintFilter=new e(H,$),this._tintFilter.uniforms.color=new Float32Array(4),this._tintFilter.uniforms.shift=new n.Point,this._tintFilter.resolution=a,this._blurFilter=o?new d(o):new d(i,l),this.pixelSize=s,this.resolution=a;var u=t.shadowOnly,c=t.rotation,f=t.distance,h=t.alpha,p=t.color;this.shadowOnly=u,this.rotation=c,this.distance=f,this.alpha=h,this.color=p,this._updatePadding()}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var i={resolution:{configurable:!0},distance:{configurable:!0},rotation:{configurable:!0},alpha:{configurable:!0},color:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){var o=e.getFilterTexture();this._tintFilter.apply(e,t,o,1),this._blurFilter.apply(e,o,n,r),!0!==this.shadowOnly&&e.applyFilter(this,t,n,0),e.returnFilterTexture(o)},t.prototype._updatePadding=function(){this.padding=this.distance+2*this.blur},t.prototype._updateShift=function(){this._tintFilter.uniforms.shift.set(this.distance*Math.cos(this.angle),this.distance*Math.sin(this.angle))},i.resolution.get=function(){return this._resolution},i.resolution.set=function(e){this._resolution=e,this._tintFilter&&(this._tintFilter.resolution=e),this._blurFilter&&(this._blurFilter.resolution=e)},i.distance.get=function(){return this._distance},i.distance.set=function(e){this._distance=e,this._updatePadding(),this._updateShift()},i.rotation.get=function(){return this.angle/n.DEG_TO_RAD},i.rotation.set=function(e){this.angle=e*n.DEG_TO_RAD,this._updateShift()},i.alpha.get=function(){return this._tintFilter.uniforms.alpha},i.alpha.set=function(e){this._tintFilter.uniforms.alpha=e},i.color.get=function(){return o.rgb2hex(this._tintFilter.uniforms.color)},i.color.set=function(e){o.hex2rgb(e,this._tintFilter.uniforms.color)},i.kernels.get=function(){return this._blurFilter.kernels},i.kernels.set=function(e){this._blurFilter.kernels=e},i.blur.get=function(){return this._blurFilter.blur},i.blur.set=function(e){this._blurFilter.blur=e,this._updatePadding()},i.quality.get=function(){return this._blurFilter.quality},i.quality.set=function(e){this._blurFilter.quality=e},i.pixelSize.get=function(){return this._blurFilter.pixelSize},i.pixelSize.set=function(e){this._blurFilter.pixelSize=e},Object.defineProperties(t.prototype,i),t}(t.Filter),ee=a,te="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float strength;\nuniform vec4 filterArea;\n\n\nvoid main(void)\n{\n\tvec2 onePixel = vec2(1.0 / filterArea);\n\n\tvec4 color;\n\n\tcolor.rgb = vec3(0.5);\n\n\tcolor -= texture2D(uSampler, vTextureCoord - onePixel) * strength;\n\tcolor += texture2D(uSampler, vTextureCoord + onePixel) * strength;\n\n\tcolor.rgb = vec3((color.r + color.g + color.b) / 3.0);\n\n\tfloat alpha = texture2D(uSampler, vTextureCoord).a;\n\n\tgl_FragColor = vec4(color.rgb * alpha, alpha);\n}\n",ne=function(e){function t(t){void 0===t&&(t=5),e.call(this,ee,te),this.strength=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={strength:{configurable:!0}};return n.strength.get=function(){return this.uniforms.strength},n.strength.set=function(e){this.uniforms.strength=e},Object.defineProperties(t.prototype,n),t}(t.Filter),re=a,oe="// precision highp float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\nuniform float aspect;\n\nuniform sampler2D displacementMap;\nuniform float offset;\nuniform float sinDir;\nuniform float cosDir;\nuniform int fillMode;\n\nuniform float seed;\nuniform vec2 red;\nuniform vec2 green;\nuniform vec2 blue;\n\nconst int TRANSPARENT = 0;\nconst int ORIGINAL = 1;\nconst int LOOP = 2;\nconst int CLAMP = 3;\nconst int MIRROR = 4;\n\nvoid main(void)\n{\n    vec2 coord = (vTextureCoord * filterArea.xy) / dimensions;\n\n    if (coord.x > 1.0 || coord.y > 1.0) {\n        return;\n    }\n\n    float cx = coord.x - 0.5;\n    float cy = (coord.y - 0.5) * aspect;\n    float ny = (-sinDir * cx + cosDir * cy) / aspect + 0.5;\n\n    // displacementMap: repeat\n    // ny = ny > 1.0 ? ny - 1.0 : (ny < 0.0 ? 1.0 + ny : ny);\n\n    // displacementMap: mirror\n    ny = ny > 1.0 ? 2.0 - ny : (ny < 0.0 ? -ny : ny);\n\n    vec4 dc = texture2D(displacementMap, vec2(0.5, ny));\n\n    float displacement = (dc.r - dc.g) * (offset / filterArea.x);\n\n    coord = vTextureCoord + vec2(cosDir * displacement, sinDir * displacement * aspect);\n\n    if (fillMode == CLAMP) {\n        coord = clamp(coord, filterClamp.xy, filterClamp.zw);\n    } else {\n        if( coord.x > filterClamp.z ) {\n            if (fillMode == TRANSPARENT) {\n                discard;\n            } else if (fillMode == LOOP) {\n                coord.x -= filterClamp.z;\n            } else if (fillMode == MIRROR) {\n                coord.x = filterClamp.z * 2.0 - coord.x;\n            }\n        } else if( coord.x < filterClamp.x ) {\n            if (fillMode == TRANSPARENT) {\n                discard;\n            } else if (fillMode == LOOP) {\n                coord.x += filterClamp.z;\n            } else if (fillMode == MIRROR) {\n                coord.x *= -filterClamp.z;\n            }\n        }\n\n        if( coord.y > filterClamp.w ) {\n            if (fillMode == TRANSPARENT) {\n                discard;\n            } else if (fillMode == LOOP) {\n                coord.y -= filterClamp.w;\n            } else if (fillMode == MIRROR) {\n                coord.y = filterClamp.w * 2.0 - coord.y;\n            }\n        } else if( coord.y < filterClamp.y ) {\n            if (fillMode == TRANSPARENT) {\n                discard;\n            } else if (fillMode == LOOP) {\n                coord.y += filterClamp.w;\n            } else if (fillMode == MIRROR) {\n                coord.y *= -filterClamp.w;\n            }\n        }\n    }\n\n    gl_FragColor.r = texture2D(uSampler, coord + red * (1.0 - seed * 0.4) / filterArea.xy).r;\n    gl_FragColor.g = texture2D(uSampler, coord + green * (1.0 - seed * 0.3) / filterArea.xy).g;\n    gl_FragColor.b = texture2D(uSampler, coord + blue * (1.0 - seed * 0.2) / filterArea.xy).b;\n    gl_FragColor.a = texture2D(uSampler, coord).a;\n}\n",ie=function(e){function r(n){void 0===n&&(n={}),e.call(this,re,oe),this.uniforms.dimensions=new Float32Array(2),n=Object.assign({slices:5,offset:100,direction:0,fillMode:0,average:!1,seed:0,red:[0,0],green:[0,0],blue:[0,0],minSize:8,sampleSize:512},n),this.direction=n.direction,this.red=n.red,this.green=n.green,this.blue=n.blue,this.offset=n.offset,this.fillMode=n.fillMode,this.average=n.average,this.seed=n.seed,this.minSize=n.minSize,this.sampleSize=n.sampleSize,this._canvas=document.createElement("canvas"),this._canvas.width=4,this._canvas.height=this.sampleSize,this.texture=t.Texture.from(this._canvas,{scaleMode:i.SCALE_MODES.NEAREST}),this._slices=0,this.slices=n.slices}e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r;var o={sizes:{configurable:!0},offsets:{configurable:!0},slices:{configurable:!0},direction:{configurable:!0},red:{configurable:!0},green:{configurable:!0},blue:{configurable:!0}};return r.prototype.apply=function(e,t,n,r){var o=t.filterFrame.width,i=t.filterFrame.height;this.uniforms.dimensions[0]=o,this.uniforms.dimensions[1]=i,this.uniforms.aspect=i/o,this.uniforms.seed=this.seed,this.uniforms.offset=this.offset,this.uniforms.fillMode=this.fillMode,e.applyFilter(this,t,n,r)},r.prototype._randomizeSizes=function(){var e=this._sizes,t=this._slices-1,n=this.sampleSize,r=Math.min(this.minSize/n,.9/this._slices);if(this.average){for(var o=this._slices,i=1,l=0;l<t;l++){var s=i/(o-l),a=Math.max(s*(1-.6*Math.random()),r);e[l]=a,i-=a}e[t]=i}else{for(var u=1,c=Math.sqrt(1/this._slices),f=0;f<t;f++){var h=Math.max(c*u*Math.random(),r);e[f]=h,u-=h}e[t]=u}this.shuffle()},r.prototype.shuffle=function(){for(var e=this._sizes,t=this._slices-1;t>0;t--){var n=Math.random()*t>>0,r=e[t];e[t]=e[n],e[n]=r}},r.prototype._randomizeOffsets=function(){for(var e=0;e<this._slices;e++)this._offsets[e]=Math.random()*(Math.random()<.5?-1:1)},r.prototype.refresh=function(){this._randomizeSizes(),this._randomizeOffsets(),this.redraw()},r.prototype.redraw=function(){var e,t=this.sampleSize,n=this.texture,r=this._canvas.getContext("2d");r.clearRect(0,0,8,t);for(var o=0,i=0;i<this._slices;i++){e=Math.floor(256*this._offsets[i]);var l=this._sizes[i]*t,s=e>0?e:0,a=e<0?-e:0;r.fillStyle="rgba("+s+", "+a+", 0, 1)",r.fillRect(0,o>>0,t,l+1>>0),o+=l}n.baseTexture.update(),this.uniforms.displacementMap=n},o.sizes.set=function(e){for(var t=Math.min(this._slices,e.length),n=0;n<t;n++)this._sizes[n]=e[n]},o.sizes.get=function(){return this._sizes},o.offsets.set=function(e){for(var t=Math.min(this._slices,e.length),n=0;n<t;n++)this._offsets[n]=e[n]},o.offsets.get=function(){return this._offsets},o.slices.get=function(){return this._slices},o.slices.set=function(e){this._slices!==e&&(this._slices=e,this.uniforms.slices=e,this._sizes=this.uniforms.slicesWidth=new Float32Array(e),this._offsets=this.uniforms.slicesOffset=new Float32Array(e),this.refresh())},o.direction.get=function(){return this._direction},o.direction.set=function(e){if(this._direction!==e){this._direction=e;var t=e*n.DEG_TO_RAD;this.uniforms.sinDir=Math.sin(t),this.uniforms.cosDir=Math.cos(t)}},o.red.get=function(){return this.uniforms.red},o.red.set=function(e){this.uniforms.red=e},o.green.get=function(){return this.uniforms.green},o.green.set=function(e){this.uniforms.green=e},o.blue.get=function(){return this.uniforms.blue},o.blue.set=function(e){this.uniforms.blue=e},r.prototype.destroy=function(){this.texture.destroy(!0),this.texture=null,this._canvas=null,this.red=null,this.green=null,this.blue=null,this._sizes=null,this._offsets=null},Object.defineProperties(r.prototype,o),r}(t.Filter);ie.TRANSPARENT=0,ie.ORIGINAL=1,ie.LOOP=2,ie.CLAMP=3,ie.MIRROR=4;var le=a,se="varying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nuniform float outerStrength;\nuniform float innerStrength;\n\nuniform vec4 glowColor;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform bool knockout;\n\nconst float PI = 3.14159265358979323846264;\n\nconst float DIST = __DIST__;\nconst float ANGLE_STEP_SIZE = min(__ANGLE_STEP_SIZE__, PI * 2.0);\nconst float ANGLE_STEP_NUM = ceil(PI * 2.0 / ANGLE_STEP_SIZE);\n\nconst float MAX_TOTAL_ALPHA = ANGLE_STEP_NUM * DIST * (DIST + 1.0) / 2.0;\n\nvoid main(void) {\n    vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\n\n    float totalAlpha = 0.0;\n\n    vec2 direction;\n    vec2 displaced;\n    vec4 curColor;\n\n    for (float angle = 0.0; angle < PI * 2.0; angle += ANGLE_STEP_SIZE) {\n       direction = vec2(cos(angle), sin(angle)) * px;\n\n       for (float curDistance = 0.0; curDistance < DIST; curDistance++) {\n           displaced = clamp(vTextureCoord + direction * \n                   (curDistance + 1.0), filterClamp.xy, filterClamp.zw);\n\n           curColor = texture2D(uSampler, displaced);\n\n           totalAlpha += (DIST - curDistance) * curColor.a;\n       }\n    }\n    \n    curColor = texture2D(uSampler, vTextureCoord);\n\n    float alphaRatio = (totalAlpha / MAX_TOTAL_ALPHA);\n\n    float innerGlowAlpha = (1.0 - alphaRatio) * innerStrength * curColor.a;\n    float innerGlowStrength = min(1.0, innerGlowAlpha);\n    \n    vec4 innerColor = mix(curColor, glowColor, innerGlowStrength);\n\n    float outerGlowAlpha = alphaRatio * outerStrength * (1. - curColor.a);\n    float outerGlowStrength = min(1.0 - innerColor.a, outerGlowAlpha);\n\n    vec4 outerGlowColor = outerGlowStrength * glowColor.rgba;\n    \n    if (knockout) {\n      float resultAlpha = outerGlowAlpha + innerGlowAlpha;\n      gl_FragColor = vec4(glowColor.rgb * resultAlpha, resultAlpha);\n    }\n    else {\n      gl_FragColor = innerColor + outerGlowColor;\n    }\n}\n",ae=function(e){function t(n){var r=Object.assign({},t.defaults,n),o=r.distance,i=r.outerStrength,l=r.innerStrength,s=r.color,a=r.knockout,u=r.quality;o=Math.round(o),e.call(this,le,se.replace(/__ANGLE_STEP_SIZE__/gi,""+(1/u/o).toFixed(7)).replace(/__DIST__/gi,o.toFixed(0)+".0")),this.uniforms.glowColor=new Float32Array([0,0,0,1]),Object.assign(this,{color:s,outerStrength:i,innerStrength:l,padding:o,knockout:a})}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={color:{configurable:!0},outerStrength:{configurable:!0},innerStrength:{configurable:!0},knockout:{configurable:!0}};return n.color.get=function(){return o.rgb2hex(this.uniforms.glowColor)},n.color.set=function(e){o.hex2rgb(e,this.uniforms.glowColor)},n.outerStrength.get=function(){return this.uniforms.outerStrength},n.outerStrength.set=function(e){this.uniforms.outerStrength=e},n.innerStrength.get=function(){return this.uniforms.innerStrength},n.innerStrength.set=function(e){this.uniforms.innerStrength=e},n.knockout.get=function(){return this.uniforms.knockout},n.knockout.set=function(e){this.uniforms.knockout=e},Object.defineProperties(t.prototype,n),t}(t.Filter);ae.defaults={distance:10,outerStrength:4,innerStrength:0,color:16777215,quality:.1,knockout:!1};var ue=a,ce="vec3 mod289(vec3 x)\n{\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 mod289(vec4 x)\n{\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\nvec4 permute(vec4 x)\n{\n    return mod289(((x * 34.0) + 1.0) * x);\n}\nvec4 taylorInvSqrt(vec4 r)\n{\n    return 1.79284291400159 - 0.85373472095314 * r;\n}\nvec3 fade(vec3 t)\n{\n    return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n// Classic Perlin noise, periodic variant\nfloat pnoise(vec3 P, vec3 rep)\n{\n    vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period\n    vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period\n    Pi0 = mod289(Pi0);\n    Pi1 = mod289(Pi1);\n    vec3 Pf0 = fract(P); // Fractional part for interpolation\n    vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0\n    vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\n    vec4 iy = vec4(Pi0.yy, Pi1.yy);\n    vec4 iz0 = Pi0.zzzz;\n    vec4 iz1 = Pi1.zzzz;\n    vec4 ixy = permute(permute(ix) + iy);\n    vec4 ixy0 = permute(ixy + iz0);\n    vec4 ixy1 = permute(ixy + iz1);\n    vec4 gx0 = ixy0 * (1.0 / 7.0);\n    vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\n    gx0 = fract(gx0);\n    vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\n    vec4 sz0 = step(gz0, vec4(0.0));\n    gx0 -= sz0 * (step(0.0, gx0) - 0.5);\n    gy0 -= sz0 * (step(0.0, gy0) - 0.5);\n    vec4 gx1 = ixy1 * (1.0 / 7.0);\n    vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\n    gx1 = fract(gx1);\n    vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\n    vec4 sz1 = step(gz1, vec4(0.0));\n    gx1 -= sz1 * (step(0.0, gx1) - 0.5);\n    gy1 -= sz1 * (step(0.0, gy1) - 0.5);\n    vec3 g000 = vec3(gx0.x, gy0.x, gz0.x);\n    vec3 g100 = vec3(gx0.y, gy0.y, gz0.y);\n    vec3 g010 = vec3(gx0.z, gy0.z, gz0.z);\n    vec3 g110 = vec3(gx0.w, gy0.w, gz0.w);\n    vec3 g001 = vec3(gx1.x, gy1.x, gz1.x);\n    vec3 g101 = vec3(gx1.y, gy1.y, gz1.y);\n    vec3 g011 = vec3(gx1.z, gy1.z, gz1.z);\n    vec3 g111 = vec3(gx1.w, gy1.w, gz1.w);\n    vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\n    g000 *= norm0.x;\n    g010 *= norm0.y;\n    g100 *= norm0.z;\n    g110 *= norm0.w;\n    vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\n    g001 *= norm1.x;\n    g011 *= norm1.y;\n    g101 *= norm1.z;\n    g111 *= norm1.w;\n    float n000 = dot(g000, Pf0);\n    float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\n    float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\n    float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\n    float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\n    float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\n    float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\n    float n111 = dot(g111, Pf1);\n    vec3 fade_xyz = fade(Pf0);\n    vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\n    vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\n    float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\n    return 2.2 * n_xyz;\n}\nfloat turb(vec3 P, vec3 rep, float lacunarity, float gain)\n{\n    float sum = 0.0;\n    float sc = 1.0;\n    float totalgain = 1.0;\n    for (float i = 0.0; i < 6.0; i++)\n    {\n        sum += totalgain * pnoise(P * sc, rep);\n        sc *= lacunarity;\n        totalgain *= gain;\n    }\n    return abs(sum);\n}\n",fe="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec2 dimensions;\n\nuniform vec2 light;\nuniform bool parallel;\nuniform float aspect;\n\nuniform float gain;\nuniform float lacunarity;\nuniform float time;\nuniform float alpha;\n\n${perlin}\n\nvoid main(void) {\n    vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\n\n    float d;\n\n    if (parallel) {\n        float _cos = light.x;\n        float _sin = light.y;\n        d = (_cos * coord.x) + (_sin * coord.y * aspect);\n    } else {\n        float dx = coord.x - light.x / dimensions.x;\n        float dy = (coord.y - light.y / dimensions.y) * aspect;\n        float dis = sqrt(dx * dx + dy * dy) + 0.00001;\n        d = dy / dis;\n    }\n\n    vec3 dir = vec3(d, d, 0.0);\n\n    float noise = turb(dir + vec3(time, 0.0, 62.1 + time) * 0.05, vec3(480.0, 320.0, 480.0), lacunarity, gain);\n    noise = mix(noise, 0.0, 0.3);\n    //fade vertically.\n    vec4 mist = vec4(noise, noise, noise, 1.0) * (1.0 - coord.y);\n    mist.a = 1.0;\n    // apply user alpha\n    mist *= alpha;\n\n    gl_FragColor = texture2D(uSampler, vTextureCoord) + mist;\n\n}\n",he=function(e){function t(t){e.call(this,ue,fe.replace("${perlin}",ce)),this.uniforms.dimensions=new Float32Array(2),"number"==typeof t&&(console.warn("GodrayFilter now uses options instead of (angle, gain, lacunarity, time)"),t={angle:t},void 0!==arguments[1]&&(t.gain=arguments[1]),void 0!==arguments[2]&&(t.lacunarity=arguments[2]),void 0!==arguments[3]&&(t.time=arguments[3]),void 0!==arguments[4]&&(t.alpha=arguments[4])),t=Object.assign({angle:30,gain:.5,lacunarity:2.5,time:0,parallel:!0,center:[0,0],alpha:1},t),this._angleLight=new n.Point,this.angle=t.angle,this.gain=t.gain,this.lacunarity=t.lacunarity,this.alpha=t.alpha,this.parallel=t.parallel,this.center=t.center,this.time=t.time}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={angle:{configurable:!0},gain:{configurable:!0},lacunarity:{configurable:!0},alpha:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){var o=t.filterFrame,i=o.width,l=o.height;this.uniforms.light=this.parallel?this._angleLight:this.center,this.uniforms.parallel=this.parallel,this.uniforms.dimensions[0]=i,this.uniforms.dimensions[1]=l,this.uniforms.aspect=l/i,this.uniforms.time=this.time,this.uniforms.alpha=this.alpha,e.applyFilter(this,t,n,r)},r.angle.get=function(){return this._angle},r.angle.set=function(e){this._angle=e;var t=e*n.DEG_TO_RAD;this._angleLight.x=Math.cos(t),this._angleLight.y=Math.sin(t)},r.gain.get=function(){return this.uniforms.gain},r.gain.set=function(e){this.uniforms.gain=e},r.lacunarity.get=function(){return this.uniforms.lacunarity},r.lacunarity.set=function(e){this.uniforms.lacunarity=e},r.alpha.get=function(){return this.uniforms.alpha},r.alpha.set=function(e){this.uniforms.alpha=e},Object.defineProperties(t.prototype,r),t}(t.Filter),pe=a,de="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform vec2 uVelocity;\nuniform int uKernelSize;\nuniform float uOffset;\n\nconst int MAX_KERNEL_SIZE = 2048;\n\n// Notice:\n// the perfect way:\n//    int kernelSize = min(uKernelSize, MAX_KERNELSIZE);\n// BUT in real use-case , uKernelSize < MAX_KERNELSIZE almost always.\n// So use uKernelSize directly.\n\nvoid main(void)\n{\n    vec4 color = texture2D(uSampler, vTextureCoord);\n\n    if (uKernelSize == 0)\n    {\n        gl_FragColor = color;\n        return;\n    }\n\n    vec2 velocity = uVelocity / filterArea.xy;\n    float offset = -uOffset / length(uVelocity) - 0.5;\n    int k = uKernelSize - 1;\n\n    for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\n        if (i == k) {\n            break;\n        }\n        vec2 bias = velocity * (float(i) / float(k) + offset);\n        color += texture2D(uSampler, vTextureCoord + bias);\n    }\n    gl_FragColor = color / float(uKernelSize);\n}\n",me=function(e){function t(t,r,o){void 0===t&&(t=[0,0]),void 0===r&&(r=5),void 0===o&&(o=0),e.call(this,pe,de),this.uniforms.uVelocity=new Float32Array(2),this._velocity=new n.ObservablePoint(this.velocityChanged,this),this.velocity=t,this.kernelSize=r,this.offset=o}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={velocity:{configurable:!0},offset:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){var o=this.velocity,i=o.x,l=o.y;this.uniforms.uKernelSize=0!==i||0!==l?this.kernelSize:0,e.applyFilter(this,t,n,r)},r.velocity.set=function(e){Array.isArray(e)?this._velocity.set(e[0],e[1]):(e instanceof n.Point||e instanceof n.ObservablePoint)&&this._velocity.copyFrom(e)},r.velocity.get=function(){return this._velocity},t.prototype.velocityChanged=function(){this.uniforms.uVelocity[0]=this._velocity.x,this.uniforms.uVelocity[1]=this._velocity.y},r.offset.set=function(e){this.uniforms.uOffset=e},r.offset.get=function(){return this.uniforms.uOffset},Object.defineProperties(t.prototype,r),t}(t.Filter),ge=a,ve="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform float epsilon;\n\nconst int MAX_COLORS = %maxColors%;\n\nuniform vec3 originalColors[MAX_COLORS];\nuniform vec3 targetColors[MAX_COLORS];\n\nvoid main(void)\n{\n    gl_FragColor = texture2D(uSampler, vTextureCoord);\n\n    float alpha = gl_FragColor.a;\n    if (alpha < 0.0001)\n    {\n      return;\n    }\n\n    vec3 color = gl_FragColor.rgb / alpha;\n\n    for(int i = 0; i < MAX_COLORS; i++)\n    {\n      vec3 origColor = originalColors[i];\n      if (origColor.r < 0.0)\n      {\n        break;\n      }\n      vec3 colorDiff = origColor - color;\n      if (length(colorDiff) < epsilon)\n      {\n        vec3 targetColor = targetColors[i];\n        gl_FragColor = vec4((targetColor + colorDiff) * alpha, alpha);\n        return;\n      }\n    }\n}\n",xe=function(e){function t(t,n,r){void 0===n&&(n=.05),void 0===r&&(r=null),r=r||t.length,e.call(this,ge,ve.replace(/%maxColors%/g,r)),this.epsilon=n,this._maxColors=r,this._replacements=null,this.uniforms.originalColors=new Float32Array(3*r),this.uniforms.targetColors=new Float32Array(3*r),this.replacements=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={replacements:{configurable:!0},maxColors:{configurable:!0},epsilon:{configurable:!0}};return n.replacements.set=function(e){var t=this.uniforms.originalColors,n=this.uniforms.targetColors,r=e.length;if(r>this._maxColors)throw"Length of replacements ("+r+") exceeds the maximum colors length ("+this._maxColors+")";t[3*r]=-1;for(var i=0;i<r;i++){var l=e[i],s=l[0];"number"==typeof s?s=o.hex2rgb(s):l[0]=o.rgb2hex(s),t[3*i]=s[0],t[3*i+1]=s[1],t[3*i+2]=s[2];var a=l[1];"number"==typeof a?a=o.hex2rgb(a):l[1]=o.rgb2hex(a),n[3*i]=a[0],n[3*i+1]=a[1],n[3*i+2]=a[2]}this._replacements=e},n.replacements.get=function(){return this._replacements},t.prototype.refresh=function(){this.replacements=this._replacements},n.maxColors.get=function(){return this._maxColors},n.epsilon.set=function(e){this.uniforms.epsilon=e},n.epsilon.get=function(){return this.uniforms.epsilon},Object.defineProperties(t.prototype,n),t}(t.Filter),ye=a,_e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec2 dimensions;\n\nuniform float sepia;\nuniform float noise;\nuniform float noiseSize;\nuniform float scratch;\nuniform float scratchDensity;\nuniform float scratchWidth;\nuniform float vignetting;\nuniform float vignettingAlpha;\nuniform float vignettingBlur;\nuniform float seed;\n\nconst float SQRT_2 = 1.414213;\nconst vec3 SEPIA_RGB = vec3(112.0 / 255.0, 66.0 / 255.0, 20.0 / 255.0);\n\nfloat rand(vec2 co) {\n    return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvec3 Overlay(vec3 src, vec3 dst)\n{\n    // if (dst <= 0.5) then: 2 * src * dst\n    // if (dst > 0.5) then: 1 - 2 * (1 - dst) * (1 - src)\n    return vec3((dst.x <= 0.5) ? (2.0 * src.x * dst.x) : (1.0 - 2.0 * (1.0 - dst.x) * (1.0 - src.x)),\n                (dst.y <= 0.5) ? (2.0 * src.y * dst.y) : (1.0 - 2.0 * (1.0 - dst.y) * (1.0 - src.y)),\n                (dst.z <= 0.5) ? (2.0 * src.z * dst.z) : (1.0 - 2.0 * (1.0 - dst.z) * (1.0 - src.z)));\n}\n\n\nvoid main()\n{\n    gl_FragColor = texture2D(uSampler, vTextureCoord);\n    vec3 color = gl_FragColor.rgb;\n\n    if (sepia > 0.0)\n    {\n        float gray = (color.x + color.y + color.z) / 3.0;\n        vec3 grayscale = vec3(gray);\n\n        color = Overlay(SEPIA_RGB, grayscale);\n\n        color = grayscale + sepia * (color - grayscale);\n    }\n\n    vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\n\n    if (vignetting > 0.0)\n    {\n        float outter = SQRT_2 - vignetting * SQRT_2;\n        vec2 dir = vec2(vec2(0.5, 0.5) - coord);\n        dir.y *= dimensions.y / dimensions.x;\n        float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\n        color.rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\n    }\n\n    if (scratchDensity > seed && scratch != 0.0)\n    {\n        float phase = seed * 256.0;\n        float s = mod(floor(phase), 2.0);\n        float dist = 1.0 / scratchDensity;\n        float d = distance(coord, vec2(seed * dist, abs(s - seed * dist)));\n        if (d < seed * 0.6 + 0.4)\n        {\n            highp float period = scratchDensity * 10.0;\n\n            float xx = coord.x * period + phase;\n            float aa = abs(mod(xx, 0.5) * 4.0);\n            float bb = mod(floor(xx / 0.5), 2.0);\n            float yy = (1.0 - bb) * aa + bb * (2.0 - aa);\n\n            float kk = 2.0 * period;\n            float dw = scratchWidth / dimensions.x * (0.75 + seed);\n            float dh = dw * kk;\n\n            float tine = (yy - (2.0 - dh));\n\n            if (tine > 0.0) {\n                float _sign = sign(scratch);\n\n                tine = s * tine / period + scratch + 0.1;\n                tine = clamp(tine + 1.0, 0.5 + _sign * 0.5, 1.5 + _sign * 0.5);\n\n                color.rgb *= tine;\n            }\n        }\n    }\n\n    if (noise > 0.0 && noiseSize > 0.0)\n    {\n        vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n        pixelCoord.x = floor(pixelCoord.x / noiseSize);\n        pixelCoord.y = floor(pixelCoord.y / noiseSize);\n        // vec2 d = pixelCoord * noiseSize * vec2(1024.0 + seed * 512.0, 1024.0 - seed * 512.0);\n        // float _noise = snoise(d) * 0.5;\n        float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\n        color += _noise * noise;\n    }\n\n    gl_FragColor.rgb = color;\n}\n",be=function(e){function t(t,n){void 0===n&&(n=0),e.call(this,ye,_e),this.uniforms.dimensions=new Float32Array(2),"number"==typeof t?(this.seed=t,t=null):this.seed=n,Object.assign(this,{sepia:.3,noise:.3,noiseSize:1,scratch:.5,scratchDensity:.3,scratchWidth:1,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3},t)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={sepia:{configurable:!0},noise:{configurable:!0},noiseSize:{configurable:!0},scratch:{configurable:!0},scratchDensity:{configurable:!0},scratchWidth:{configurable:!0},vignetting:{configurable:!0},vignettingAlpha:{configurable:!0},vignettingBlur:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.dimensions[0]=t.filterFrame.width,this.uniforms.dimensions[1]=t.filterFrame.height,this.uniforms.seed=this.seed,e.applyFilter(this,t,n,r)},n.sepia.set=function(e){this.uniforms.sepia=e},n.sepia.get=function(){return this.uniforms.sepia},n.noise.set=function(e){this.uniforms.noise=e},n.noise.get=function(){return this.uniforms.noise},n.noiseSize.set=function(e){this.uniforms.noiseSize=e},n.noiseSize.get=function(){return this.uniforms.noiseSize},n.scratch.set=function(e){this.uniforms.scratch=e},n.scratch.get=function(){return this.uniforms.scratch},n.scratchDensity.set=function(e){this.uniforms.scratchDensity=e},n.scratchDensity.get=function(){return this.uniforms.scratchDensity},n.scratchWidth.set=function(e){this.uniforms.scratchWidth=e},n.scratchWidth.get=function(){return this.uniforms.scratchWidth},n.vignetting.set=function(e){this.uniforms.vignetting=e},n.vignetting.get=function(){return this.uniforms.vignetting},n.vignettingAlpha.set=function(e){this.uniforms.vignettingAlpha=e},n.vignettingAlpha.get=function(){return this.uniforms.vignettingAlpha},n.vignettingBlur.set=function(e){this.uniforms.vignettingBlur=e},n.vignettingBlur.get=function(){return this.uniforms.vignettingBlur},Object.defineProperties(t.prototype,n),t}(t.Filter),Ce=a,Se="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 thickness;\nuniform vec4 outlineColor;\nuniform vec4 filterClamp;\n\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\n\nvoid main(void) {\n    vec4 ownColor = texture2D(uSampler, vTextureCoord);\n    vec4 curColor;\n    float maxAlpha = 0.;\n    vec2 displaced;\n    for (float angle = 0.; angle <= DOUBLE_PI; angle += ${angleStep}) {\n        displaced.x = vTextureCoord.x + thickness.x * cos(angle);\n        displaced.y = vTextureCoord.y + thickness.y * sin(angle);\n        curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\n        maxAlpha = max(maxAlpha, curColor.a);\n    }\n    float resultAlpha = max(maxAlpha, ownColor.a);\n    gl_FragColor = vec4((ownColor.rgb + outlineColor.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\n}\n",Fe=function(e){function t(n,r,o){void 0===n&&(n=1),void 0===r&&(r=0),void 0===o&&(o=.1);var i=Math.max(o*t.MAX_SAMPLES,t.MIN_SAMPLES),l=(2*Math.PI/i).toFixed(7);e.call(this,Ce,Se.replace(/\$\{angleStep\}/,l)),this.uniforms.thickness=new Float32Array([0,0]),this.uniforms.outlineColor=new Float32Array([0,0,0,1]),Object.assign(this,{thickness:n,color:r,quality:o})}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={color:{configurable:!0},thickness:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.thickness[0]=this._thickness/t._frame.width,this.uniforms.thickness[1]=this._thickness/t._frame.height,e.applyFilter(this,t,n,r)},n.color.get=function(){return o.rgb2hex(this.uniforms.outlineColor)},n.color.set=function(e){o.hex2rgb(e,this.uniforms.outlineColor)},n.thickness.get=function(){return this._thickness},n.thickness.set=function(e){this._thickness=e,this.padding=e},Object.defineProperties(t.prototype,n),t}(t.Filter);Fe.MIN_SAMPLES=1,Fe.MAX_SAMPLES=100;var ze=a,Ae="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform vec2 size;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n    coord *= filterArea.xy;\n    coord += filterArea.zw;\n\n    return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n    coord -= filterArea.zw;\n    coord /= filterArea.xy;\n\n    return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n\treturn floor( coord / size ) * size;\n}\n\nvoid main(void)\n{\n    vec2 coord = mapCoord(vTextureCoord);\n\n    coord = pixelate(coord, size);\n\n    coord = unmapCoord(coord);\n\n    gl_FragColor = texture2D(uSampler, coord);\n}\n",Te=function(e){function t(t){void 0===t&&(t=10),e.call(this,ze,Ae),this.size=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={size:{configurable:!0}};return n.size.get=function(){return this.uniforms.size},n.size.set=function(e){"number"==typeof e&&(e=[e,e]),this.uniforms.size=e},Object.defineProperties(t.prototype,n),t}(t.Filter),we=a,Oe="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float uRadian;\nuniform vec2 uCenter;\nuniform float uRadius;\nuniform int uKernelSize;\n\nconst int MAX_KERNEL_SIZE = 2048;\n\nvoid main(void)\n{\n    vec4 color = texture2D(uSampler, vTextureCoord);\n\n    if (uKernelSize == 0)\n    {\n        gl_FragColor = color;\n        return;\n    }\n\n    float aspect = filterArea.y / filterArea.x;\n    vec2 center = uCenter.xy / filterArea.xy;\n    float gradient = uRadius / filterArea.x * 0.3;\n    float radius = uRadius / filterArea.x - gradient * 0.5;\n    int k = uKernelSize - 1;\n\n    vec2 coord = vTextureCoord;\n    vec2 dir = vec2(center - coord);\n    float dist = length(vec2(dir.x, dir.y * aspect));\n\n    float radianStep = uRadian;\n    if (radius >= 0.0 && dist > radius) {\n        float delta = dist - radius;\n        float gap = gradient;\n        float scale = 1.0 - abs(delta / gap);\n        if (scale <= 0.0) {\n            gl_FragColor = color;\n            return;\n        }\n        radianStep *= scale;\n    }\n    radianStep /= float(k);\n\n    float s = sin(radianStep);\n    float c = cos(radianStep);\n    mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c));\n\n    for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\n        if (i == k) {\n            break;\n        }\n\n        coord -= center;\n        coord.y *= aspect;\n        coord = rotationMatrix * coord;\n        coord.y /= aspect;\n        coord += center;\n\n        vec4 sample = texture2D(uSampler, coord);\n\n        // switch to pre-multiplied alpha to correctly blur transparent images\n        // sample.rgb *= sample.a;\n\n        color += sample;\n    }\n\n    gl_FragColor = color / float(uKernelSize);\n}\n",De=function(e){function t(t,n,r,o){void 0===t&&(t=0),void 0===n&&(n=[0,0]),void 0===r&&(r=5),void 0===o&&(o=-1),e.call(this,we,Oe),this._angle=0,this.angle=t,this.center=n,this.kernelSize=r,this.radius=o}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={angle:{configurable:!0},center:{configurable:!0},radius:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.uKernelSize=0!==this._angle?this.kernelSize:0,e.applyFilter(this,t,n,r)},n.angle.set=function(e){this._angle=e,this.uniforms.uRadian=e*Math.PI/180},n.angle.get=function(){return this._angle},n.center.get=function(){return this.uniforms.uCenter},n.center.set=function(e){this.uniforms.uCenter=e},n.radius.get=function(){return this.uniforms.uRadius},n.radius.set=function(e){(e<0||e===1/0)&&(e=-1),this.uniforms.uRadius=e},Object.defineProperties(t.prototype,n),t}(t.Filter),Pe=a,Me="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nuniform bool mirror;\nuniform float boundary;\nuniform vec2 amplitude;\nuniform vec2 waveLength;\nuniform vec2 alpha;\nuniform float time;\n\nfloat rand(vec2 co) {\n    return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n    vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n    vec2 coord = pixelCoord / dimensions;\n\n    if (coord.y < boundary) {\n        gl_FragColor = texture2D(uSampler, vTextureCoord);\n        return;\n    }\n\n    float k = (coord.y - boundary) / (1. - boundary + 0.0001);\n    float areaY = boundary * dimensions.y / filterArea.y;\n    float v = areaY + areaY - vTextureCoord.y;\n    float y = mirror ? v : vTextureCoord.y;\n\n    float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x;\n    float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y;\n    float _alpha = (alpha.y - alpha.x) * k + alpha.x;\n\n    float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude;\n    x = clamp(x, filterClamp.x, filterClamp.z);\n\n    vec4 color = texture2D(uSampler, vec2(x, y));\n\n    gl_FragColor = color * _alpha;\n}\n",Re=function(e){function t(t){e.call(this,Pe,Me),this.uniforms.amplitude=new Float32Array(2),this.uniforms.waveLength=new Float32Array(2),this.uniforms.alpha=new Float32Array(2),this.uniforms.dimensions=new Float32Array(2),Object.assign(this,{mirror:!0,boundary:.5,amplitude:[0,20],waveLength:[30,100],alpha:[1,1],time:0},t)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={mirror:{configurable:!0},boundary:{configurable:!0},amplitude:{configurable:!0},waveLength:{configurable:!0},alpha:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.dimensions[0]=t.filterFrame.width,this.uniforms.dimensions[1]=t.filterFrame.height,this.uniforms.time=this.time,e.applyFilter(this,t,n,r)},n.mirror.set=function(e){this.uniforms.mirror=e},n.mirror.get=function(){return this.uniforms.mirror},n.boundary.set=function(e){this.uniforms.boundary=e},n.boundary.get=function(){return this.uniforms.boundary},n.amplitude.set=function(e){this.uniforms.amplitude[0]=e[0],this.uniforms.amplitude[1]=e[1]},n.amplitude.get=function(){return this.uniforms.amplitude},n.waveLength.set=function(e){this.uniforms.waveLength[0]=e[0],this.uniforms.waveLength[1]=e[1]},n.waveLength.get=function(){return this.uniforms.waveLength},n.alpha.set=function(e){this.uniforms.alpha[0]=e[0],this.uniforms.alpha[1]=e[1]},n.alpha.get=function(){return this.uniforms.alpha},Object.defineProperties(t.prototype,n),t}(t.Filter),ke=a,je="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec2 red;\nuniform vec2 green;\nuniform vec2 blue;\n\nvoid main(void)\n{\n   gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r;\n   gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g;\n   gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b;\n   gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;\n}\n",Ee=function(e){function t(t,n,r){void 0===t&&(t=[-10,0]),void 0===n&&(n=[0,10]),void 0===r&&(r=[0,0]),e.call(this,ke,je),this.red=t,this.green=n,this.blue=r}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={red:{configurable:!0},green:{configurable:!0},blue:{configurable:!0}};return n.red.get=function(){return this.uniforms.red},n.red.set=function(e){this.uniforms.red=e},n.green.get=function(){return this.uniforms.green},n.green.set=function(e){this.uniforms.green=e},n.blue.get=function(){return this.uniforms.blue},n.blue.set=function(e){this.uniforms.blue=e},Object.defineProperties(t.prototype,n),t}(t.Filter),Le=a,Ie="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\n\nuniform vec2 center;\n\nuniform float amplitude;\nuniform float wavelength;\n// uniform float power;\nuniform float brightness;\nuniform float speed;\nuniform float radius;\n\nuniform float time;\n\nconst float PI = 3.14159;\n\nvoid main()\n{\n    float halfWavelength = wavelength * 0.5 / filterArea.x;\n    float maxRadius = radius / filterArea.x;\n    float currentRadius = time * speed / filterArea.x;\n\n    float fade = 1.0;\n\n    if (maxRadius > 0.0) {\n        if (currentRadius > maxRadius) {\n            gl_FragColor = texture2D(uSampler, vTextureCoord);\n            return;\n        }\n        fade = 1.0 - pow(currentRadius / maxRadius, 2.0);\n    }\n\n    vec2 dir = vec2(vTextureCoord - center / filterArea.xy);\n    dir.y *= filterArea.y / filterArea.x;\n    float dist = length(dir);\n\n    if (dist <= 0.0 || dist < currentRadius - halfWavelength || dist > currentRadius + halfWavelength) {\n        gl_FragColor = texture2D(uSampler, vTextureCoord);\n        return;\n    }\n\n    vec2 diffUV = normalize(dir);\n\n    float diff = (dist - currentRadius) / halfWavelength;\n\n    float p = 1.0 - pow(abs(diff), 2.0);\n\n    // float powDiff = diff * pow(p, 2.0) * ( amplitude * fade );\n    float powDiff = 1.25 * sin(diff * PI) * p * ( amplitude * fade );\n\n    vec2 offset = diffUV * powDiff / filterArea.xy;\n\n    // Do clamp :\n    vec2 coord = vTextureCoord + offset;\n    vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\n    vec4 color = texture2D(uSampler, clampedCoord);\n    if (coord != clampedCoord) {\n        color *= max(0.0, 1.0 - length(coord - clampedCoord));\n    }\n\n    // No clamp :\n    // gl_FragColor = texture2D(uSampler, vTextureCoord + offset);\n\n    color.rgb *= 1.0 + (brightness - 1.0) * p * fade;\n\n    gl_FragColor = color;\n}\n",Xe=function(e){function t(t,n,r){void 0===t&&(t=[0,0]),void 0===n&&(n={}),void 0===r&&(r=0),e.call(this,Le,Ie),this.center=t,Array.isArray(n)&&(console.warn("Deprecated Warning: ShockwaveFilter params Array has been changed to options Object."),n={}),n=Object.assign({amplitude:30,wavelength:160,brightness:1,speed:500,radius:-1},n),this.amplitude=n.amplitude,this.wavelength=n.wavelength,this.brightness=n.brightness,this.speed=n.speed,this.radius=n.radius,this.time=r}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={center:{configurable:!0},amplitude:{configurable:!0},wavelength:{configurable:!0},brightness:{configurable:!0},speed:{configurable:!0},radius:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.time=this.time,e.applyFilter(this,t,n,r)},n.center.get=function(){return this.uniforms.center},n.center.set=function(e){this.uniforms.center=e},n.amplitude.get=function(){return this.uniforms.amplitude},n.amplitude.set=function(e){this.uniforms.amplitude=e},n.wavelength.get=function(){return this.uniforms.wavelength},n.wavelength.set=function(e){this.uniforms.wavelength=e},n.brightness.get=function(){return this.uniforms.brightness},n.brightness.set=function(e){this.uniforms.brightness=e},n.speed.get=function(){return this.uniforms.speed},n.speed.set=function(e){this.uniforms.speed=e},n.radius.get=function(){return this.uniforms.radius},n.radius.set=function(e){this.uniforms.radius=e},Object.defineProperties(t.prototype,n),t}(t.Filter),Be=a,Ne="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform sampler2D uLightmap;\nuniform vec4 filterArea;\nuniform vec2 dimensions;\nuniform vec4 ambientColor;\nvoid main() {\n    vec4 diffuseColor = texture2D(uSampler, vTextureCoord);\n    vec2 lightCoord = (vTextureCoord * filterArea.xy) / dimensions;\n    vec4 light = texture2D(uLightmap, lightCoord);\n    vec3 ambient = ambientColor.rgb * ambientColor.a;\n    vec3 intensity = ambient + light.rgb;\n    vec3 finalColor = diffuseColor.rgb * intensity;\n    gl_FragColor = vec4(finalColor, diffuseColor.a);\n}\n",Ge=function(e){function t(t,n,r){void 0===n&&(n=0),void 0===r&&(r=1),e.call(this,Be,Ne),this.uniforms.dimensions=new Float32Array(2),this.uniforms.ambientColor=new Float32Array([0,0,0,r]),this.texture=t,this.color=n}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={texture:{configurable:!0},color:{configurable:!0},alpha:{configurable:!0}};return t.prototype.apply=function(e,t,n,r){this.uniforms.dimensions[0]=t.filterFrame.width,this.uniforms.dimensions[1]=t.filterFrame.height,e.applyFilter(this,t,n,r)},n.texture.get=function(){return this.uniforms.uLightmap},n.texture.set=function(e){this.uniforms.uLightmap=e},n.color.set=function(e){var t=this.uniforms.ambientColor;"number"==typeof e?(o.hex2rgb(e,t),this._color=e):(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],this._color=o.rgb2hex(t))},n.color.get=function(){return this._color},n.alpha.get=function(){return this.uniforms.ambientColor[3]},n.alpha.set=function(e){this.uniforms.ambientColor[3]=e},Object.defineProperties(t.prototype,n),t}(t.Filter),qe=a,Ke="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float blur;\nuniform float gradientBlur;\nuniform vec2 start;\nuniform vec2 end;\nuniform vec2 delta;\nuniform vec2 texSize;\n\nfloat random(vec3 scale, float seed)\n{\n    return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\n\nvoid main(void)\n{\n    vec4 color = vec4(0.0);\n    float total = 0.0;\n\n    float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n    vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x));\n    float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur;\n\n    for (float t = -30.0; t <= 30.0; t++)\n    {\n        float percent = (t + offset - 0.5) / 30.0;\n        float weight = 1.0 - abs(percent);\n        vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius);\n        sample.rgb *= sample.a;\n        color += sample * weight;\n        total += weight;\n    }\n\n    color /= total;\n    color.rgb /= color.a + 0.00001;\n\n    gl_FragColor = color;\n}\n",We=function(e){function t(t,r,o,i){void 0===t&&(t=100),void 0===r&&(r=600),void 0===o&&(o=null),void 0===i&&(i=null),e.call(this,qe,Ke),this.uniforms.blur=t,this.uniforms.gradientBlur=r,this.uniforms.start=o||new n.Point(0,window.innerHeight/2),this.uniforms.end=i||new n.Point(600,window.innerHeight/2),this.uniforms.delta=new n.Point(30,30),this.uniforms.texSize=new n.Point(window.innerWidth,window.innerHeight),this.updateDelta()}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return t.prototype.updateDelta=function(){this.uniforms.delta.x=0,this.uniforms.delta.y=0},r.blur.get=function(){return this.uniforms.blur},r.blur.set=function(e){this.uniforms.blur=e},r.gradientBlur.get=function(){return this.uniforms.gradientBlur},r.gradientBlur.set=function(e){this.uniforms.gradientBlur=e},r.start.get=function(){return this.uniforms.start},r.start.set=function(e){this.uniforms.start=e,this.updateDelta()},r.end.get=function(){return this.uniforms.end},r.end.set=function(e){this.uniforms.end=e,this.updateDelta()},Object.defineProperties(t.prototype,r),t}(t.Filter),Ye=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.updateDelta=function(){var e=this.uniforms.end.x-this.uniforms.start.x,t=this.uniforms.end.y-this.uniforms.start.y,n=Math.sqrt(e*e+t*t);this.uniforms.delta.x=e/n,this.uniforms.delta.y=t/n},t}(We),Ze=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.updateDelta=function(){var e=this.uniforms.end.x-this.uniforms.start.x,t=this.uniforms.end.y-this.uniforms.start.y,n=Math.sqrt(e*e+t*t);this.uniforms.delta.x=-t/n,this.uniforms.delta.y=e/n},t}(We),Qe=function(e){function t(t,n,r,o){void 0===t&&(t=100),void 0===n&&(n=600),void 0===r&&(r=null),void 0===o&&(o=null),e.call(this),this.tiltShiftXFilter=new Ye(t,n,r,o),this.tiltShiftYFilter=new Ze(t,n,r,o)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return t.prototype.apply=function(e,t,n){var r=e.getFilterTexture();this.tiltShiftXFilter.apply(e,t,r,1),this.tiltShiftYFilter.apply(e,r,n),e.returnFilterTexture(r)},n.blur.get=function(){return this.tiltShiftXFilter.blur},n.blur.set=function(e){this.tiltShiftXFilter.blur=this.tiltShiftYFilter.blur=e},n.gradientBlur.get=function(){return this.tiltShiftXFilter.gradientBlur},n.gradientBlur.set=function(e){this.tiltShiftXFilter.gradientBlur=this.tiltShiftYFilter.gradientBlur=e},n.start.get=function(){return this.tiltShiftXFilter.start},n.start.set=function(e){this.tiltShiftXFilter.start=this.tiltShiftYFilter.start=e},n.end.get=function(){return this.tiltShiftXFilter.end},n.end.set=function(e){this.tiltShiftXFilter.end=this.tiltShiftYFilter.end=e},Object.defineProperties(t.prototype,n),t}(t.Filter),Ue=a,Ve="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n    coord *= filterArea.xy;\n    coord += filterArea.zw;\n\n    return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n    coord -= filterArea.zw;\n    coord /= filterArea.xy;\n\n    return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n    coord -= offset;\n\n    float dist = length(coord);\n\n    if (dist < radius)\n    {\n        float ratioDist = (radius - dist) / radius;\n        float angleMod = ratioDist * ratioDist * angle;\n        float s = sin(angleMod);\n        float c = cos(angleMod);\n        coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n    }\n\n    coord += offset;\n\n    return coord;\n}\n\nvoid main(void)\n{\n\n    vec2 coord = mapCoord(vTextureCoord);\n\n    coord = twist(coord);\n\n    coord = unmapCoord(coord);\n\n    gl_FragColor = texture2D(uSampler, coord );\n\n}\n",He=function(e){function t(t){e.call(this,Ue,Ve),"number"==typeof t&&(t={radius:t},void 0!==arguments[1]&&(t.angle=arguments[1]),void 0!==arguments[2]&&(t.padding=arguments[2])),Object.assign(this,{radius:200,angle:4,padding:20,offset:new n.Point},t)}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={offset:{configurable:!0},radius:{configurable:!0},angle:{configurable:!0}};return r.offset.get=function(){return this.uniforms.offset},r.offset.set=function(e){this.uniforms.offset=e},r.radius.get=function(){return this.uniforms.radius},r.radius.set=function(e){this.uniforms.radius=e},r.angle.get=function(){return this.uniforms.angle},r.angle.set=function(e){this.uniforms.angle=e},Object.defineProperties(t.prototype,r),t}(t.Filter),$e=a,Je="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform vec2 uCenter;\nuniform float uStrength;\nuniform float uInnerRadius;\nuniform float uRadius;\n\nconst float MAX_KERNEL_SIZE = ${maxKernelSize};\n\n// author: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\nhighp float rand(vec2 co, float seed) {\n    const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n    highp float dt = dot(co + seed, vec2(a, b)), sn = mod(dt, 3.14159);\n    return fract(sin(sn) * c + seed);\n}\n\nvoid main() {\n\n    float minGradient = uInnerRadius * 0.3;\n    float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x;\n\n    float gradient = uRadius * 0.3;\n    float radius = (uRadius - gradient * 0.5) / filterArea.x;\n\n    float countLimit = MAX_KERNEL_SIZE;\n\n    vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord);\n    float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x));\n\n    float strength = uStrength;\n\n    float delta = 0.0;\n    float gap;\n    if (dist < innerRadius) {\n        delta = innerRadius - dist;\n        gap = minGradient;\n    } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity\n        delta = dist - radius;\n        gap = gradient;\n    }\n\n    if (delta > 0.0) {\n        float normalCount = gap / filterArea.x;\n        delta = (normalCount - delta) / normalCount;\n        countLimit *= delta;\n        strength *= delta;\n        if (countLimit < 1.0)\n        {\n            gl_FragColor = texture2D(uSampler, vTextureCoord);\n            return;\n        }\n    }\n\n    // randomize the lookup values to hide the fixed number of samples\n    float offset = rand(vTextureCoord, 0.0);\n\n    float total = 0.0;\n    vec4 color = vec4(0.0);\n\n    dir *= strength;\n\n    for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) {\n        float percent = (t + offset) / MAX_KERNEL_SIZE;\n        float weight = 4.0 * (percent - percent * percent);\n        vec2 p = vTextureCoord + dir * percent;\n        vec4 sample = texture2D(uSampler, p);\n\n        // switch to pre-multiplied alpha to correctly blur transparent images\n        // sample.rgb *= sample.a;\n\n        color += sample * weight;\n        total += weight;\n\n        if (t > countLimit){\n            break;\n        }\n    }\n\n    color /= total;\n    // switch back from pre-multiplied alpha\n    // color.rgb /= color.a + 0.00001;\n\n    gl_FragColor = color;\n}\n",et=function(e){function t(t){if("object"!=typeof t){var n=arguments[0],r=arguments[1],o=arguments[2],i=arguments[3];t={},void 0!==n&&(t.strength=n),void 0!==r&&(t.center=r),void 0!==o&&(t.innerRadius=o),void 0!==i&&(t.radius=i)}t=Object.assign({strength:.1,center:[0,0],innerRadius:0,radius:-1,maxKernelSize:32},t),e.call(this,$e,Je.replace("${maxKernelSize}",t.maxKernelSize.toFixed(1))),this.strength=t.strength,this.center=t.center,this.innerRadius=t.innerRadius,this.radius=t.radius}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={center:{configurable:!0},strength:{configurable:!0},innerRadius:{configurable:!0},radius:{configurable:!0}};return n.center.get=function(){return this.uniforms.uCenter},n.center.set=function(e){this.uniforms.uCenter=e},n.strength.get=function(){return this.uniforms.uStrength},n.strength.set=function(e){this.uniforms.uStrength=e},n.innerRadius.get=function(){return this.uniforms.uInnerRadius},n.innerRadius.set=function(e){this.uniforms.uInnerRadius=e},n.radius.get=function(){return this.uniforms.uRadius},n.radius.set=function(e){(e<0||e===1/0)&&(e=-1),this.uniforms.uRadius=e},Object.defineProperties(t.prototype,n),t}(t.Filter);return e.AdjustmentFilter=c,e.AdvancedBloomFilter=y,e.AsciiFilter=C,e.BevelFilter=z,e.BloomFilter=A,e.BulgePinchFilter=O,e.CRTFilter=Z,e.ColorMapFilter=M,e.ColorOverlayFilter=j,e.ColorReplaceFilter=I,e.ConvolutionFilter=N,e.CrossHatchFilter=K,e.DotFilter=V,e.DropShadowFilter=J,e.EmbossFilter=ne,e.GlitchFilter=ie,e.GlowFilter=ae,e.GodrayFilter=he,e.KawaseBlurFilter=d,e.MotionBlurFilter=me,e.MultiColorReplaceFilter=xe,e.OldFilmFilter=be,e.OutlineFilter=Fe,e.PixelateFilter=Te,e.RGBSplitFilter=Ee,e.RadialBlurFilter=De,e.ReflectionFilter=Re,e.ShockwaveFilter=Xe,e.SimpleLightmapFilter=Ge,e.TiltShiftAxisFilter=We,e.TiltShiftFilter=Qe,e.TiltShiftXFilter=Ye,e.TiltShiftYFilter=Ze,e.TwistFilter=He,e.ZoomBlurFilter=et,e}({},PIXI,PIXI,PIXI,PIXI.utils,PIXI,PIXI.filters,PIXI.filters);Object.assign(PIXI.filters,__filters);
//# sourceMappingURL=pixi-filters.js.map

})();

//PRAGMA: defGameParticle
function Game_Particle(){
    this.initialize.apply(this, arguments);
};
//PRAGMA_END: defGameParticle


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


var TRP_Localize = TRP_Localize || function(){};
var TRP_LocalizeString = TRP_LocalizeString || function(...args){this._value=null;this._args = args};
(()=>{
	if(TRP_Localize.localize)return;
	TRP_LocalizeString.prototype = new String();
	TRP_LocalizeString.prototype.toString = TRP_LocalizeString.prototype.valueOf = TRP_LocalizeString.prototype.toJSON = function(){
		if(this._value===null){
			this._value = TRP_Localize.localize(...this._args);
			for(let i=0; i<this._value.length; i=(i+1)|0){
				this[i] = this._value[i];
			}
		}
		return this._value.toString();
	};
	TRP_Localize.localize = function(symbol,original,id){
		if(!$gameSystem)return new TRP_LocalizeString(symbol,original,id);
		
		if($gameSystem && $gameSystem.isJapanese())return original;
		return this.DATA[symbol][id]||this.DATA.duplication[original]||original;
	};
	TRP_Localize.noLocalize = function(original,id,translated){
		if($gameSystem && $gameSystem.isJapanese())return original;
		return translated||original;
	};
//PRAGMA: localizeData
	TRP_Localize.DATA = {
		"duplication":{},"parMa":{},"parEd":{},"parGr":{},"parGe":{},"preWa":{},"parPr":{},"parSe":{},
	};
//PRAGMA_END: localizeData
})();






//PRAGMA: dataFilePath
Game_Particle.DATA_FILE_PATH = '../dataEx/TrpParticles.json';
//PRAGMA_END: dataFilePath

DataManager._databaseFiles.push({
	name:'$dataTrpParticles',
	src:Game_Particle.DATA_FILE_PATH,
});
(function(){
"use strict";

/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return extendStatics(d, b);
};
function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/***************************************************************************** */

//PRAGMA: pluginName
var pluginName = 'TRP_ParticleMZ';
//PRAGMA_END: pluginName
var parameters = PluginManager.parameters(pluginName);
var commandNames = (parameters['commandName']||NLC('particle,パーティクル',0)).split(',');
parameters.commandNames = commandNames;

var LC = TRP_Localize.localize.bind(TRP_Localize,'parMa');
var NLC = TRP_Localize.noLocalize;

var regionMargin = Number(parameters.regionMargin)||0;
var outsideMargin = isNaN(parameters.outsideMargin) ? -1 :(Number(parameters.outsideMargin)||0);
var walkOffset = Number(parameters.walkOffset)||0;
var dashOffset = Number(parameters.dashOffset)||0;
var maxParticles = Number(parameters.maxParticles);
var keepPictureOrder = parameters.keepPictureOrder==='true';

var displayCount = parameters.displayCount==='true';
var systemParticles = JSON.parse(parameters.systemParticles);
var clearScreenOnMapChange = parameters.clearScreenOnMapChange==='true';
var clearCharacterOnMapChange = parameters.clearCharacterOnMapChange==='true';
var clearPartyOnMapChange = parameters.clearPartyOnMapChange==='true';
var clearBattleScreenOnEnd = parameters.clearBattleScreenOnEnd==='true';
var clearBattleCharaOnEnd = parameters.clearBattleCharaOnEnd==='true';
var cacheBeforeTerminate = parameters.cacheBeforeTerminate==='true';

var disableState = parameters.disableState==='true';
var disableSkill = parameters.disableSkill==='true';
var disableRoute = parameters.disableRoute==='true';
var sceneTypes = parameters.sceneTypes ? JSON.parse(parameters.sceneTypes) : [];
var sceneGroups = [];

var noRewriteFunctions = parameters.noRewriteFunctions==='true';
var errorLog = parameters.errorLog === 'true';

var defaultImage = parameters.defaultImage = 'particle1';
var commandNameRegex;
(function(){
	//scene
	var length = sceneTypes.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var scene = sceneTypes[i];
        if(scene.contains('-')){
        	var group = scene.split('-');
        	sceneTypes.splice(i,1);
        	Array.prototype.push.apply(sceneTypes,group);
        	i -= 1;
        	length -= 1;
        	sceneGroups.push(group);
        }
    }

	//regex
	var regexStr = '^(?:';
	var length = commandNames.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var name = commandNames[i];
        if(i>0){
        	regexStr+='|';
        }
        regexStr += name+' ';
    }
    regexStr += ')';
    commandNameRegex = new RegExp(regexStr);
})();

function supplement(defaultValue,optionArg){
	if(optionArg === undefined){
		return defaultValue;
	}
	return optionArg;
};
function supplementNum(defaultValue,optionArg){
	return Number(supplement(defaultValue,optionArg));
};
var _supplementDefWords = ['default','def','d'];
function supplementDef(defaultValue, optionArg, otherWords) {
	var value = supplement(defaultValue,optionArg);

	var defTargetWords = otherWords || [];
	if(defTargetWords){
		defTargetWords = defTargetWords.concat(_supplementDefWords);
	}else{
		defTargetWords = _supplementDefWords;
	}

	var length = defTargetWords.length;
	for(var i=0; i<length; i=(i+1)|0){
		var target = defTargetWords[i];
		if(value === target){
			value = defaultValue;
			break;
		}
	}
	return value;
};
function supplementDefNum(defaultValue, optionArg, otherWords) {
	var value = supplementDef(defaultValue,optionArg,otherWords);
	return Number(value);
};


//PRAGMA: blendModes
(function(){
	var blendModes = PIXI.BLEND_MODES;
	var keys = Object.keys(blendModes);
	var length = Math.min(10,keys.length);
	var sorted = [];
	for(var i = 0; i<length; i=(i+1)|0){
	    var key = keys[i];
	    if(!sorted[key]){
	        sorted[key] = blendModes[key];
	    }
	}
	Game_Particle.BLEND_MODE_NAMES = sorted;
})();
//PRAGMA_END: blendModes


Game_Particle.DATA_VERSION = 4;
Game_Particle.CONFIG_PARAM_INDEXES = {
	all:["version","alpha","scale","speed","color","colorMode","acceleration","maxSpeed","startRotation","rotationSpeed","angle","mirrorType","orderedArt","lifetime","blendMode","frequency","spawnChance","particlesPerWave","emitterLifetime","maxParticles","fluctuation","spawnType","pos","spawnData","noRotation","addAtBack","image","targetType","comment"]
	// ,all4:["version","alpha","scale","speed","color","colorMode","acceleration","maxSpeed","startRotation","rotationSpeed","angle","mirrorType","orderedArt","lifetime","blendMode","frequency","spawnChance","particlesPerWave","emitterLifetime","maxParticles","fluctuation","spawnType","pos","spawnData","noRotation","addAtBack","image","targetType","comment"]
	,all3:["version","alpha","scale","speed","color","colorMode","acceleration","maxSpeed","startRotation","rotationSpeed","angle","mirrorType","lifetime","blendMode","frequency","spawnChance","particlesPerWave","emitterLifetime","maxParticles","fluctuation","spawnType","pos","spawnData","noRotation","addAtBack","image","targetType","comment"]
	,all2:["version","alpha","scale","speed","color","colorMode","acceleration","maxSpeed","startRotation","rotationSpeed","angleType","mirrorType","lifetime","blendMode","frequency","spawnChance","particlesPerWave","emitterLifetime","maxParticles","fluctuation","spawnType","pos","spawnData","noRotation","addAtBack","image","targetType","comment"]
	,all0:["alpha","scale","speed","color","colorMode","acceleration","maxSpeed","startRotation","rotationSpeed","angleType","mirrorType","lifetime","blendMode","frequency","spawnChance","particlesPerWave","emitterLifetime","maxParticles","fluctuation","spawnType","pos","spawnRect","spawnCircle","noRotation","addAtBack","image","targetType","comment"]
	,alpha:["list","start","end"]
	,scale:["list","minimumScaleMultiplier","start","end"]
	,speed:["list","minimumSpeedMultiplier","start","end"]
	,color:["list","start","end"]
	,acceleration:["x","y"]
	,startRotation:["min","max"]
	,rotationSpeed:["min","max"]
	,lifetime:["min","max"]
	,fluctuation:["max","sensitivity"]
	,pos:["x","y"]
	,spawnRect:["x","y","w","h"]
	,spawnCircle:["x","y","r","minR"]
	,spawnBurst:["particleSpacing","angleStart","bdt","brt","br","bdr","bdx","bdy"]
};
Game_Particle.SPAWN_TYPES = ['point','rect','circle','ring','burst'];
Game_Particle.TARGET_CATEGORIES = [['character','walk','tilemap','startdash'],['screen','weather','region'],['click','drag'],['others'],['hidden']];
Game_Particle.CATEGORY_NAMES = ['character','screen','system','others','hidden'];
Game_Particle.DEFAULT_DATA = {
	"alpha": {
		"list":[{
			time:0,
			value:0
		},{
			time:0.5,
			value:1
		},{
			time:1,
			value:0
		}]
	},
	"scale": {
		"list":[{
			time:0,
			value:0
		},{
			time:0.5,
			value:1
		},{
			time:1,
			value:0
		}],
		"minimumScaleMultiplier": 0.5
	},
	"speed": {
		"list":[{
			time:0,
			value:300
		},{
			time:1,
			value:100
		}],
		"minimumSpeedMultiplier": 1
	},
	"color": {
		"list":[{
			time:0,
			value:"#ffffff"
		},{
			time:1,
			value:"#ffffff"
		}]
	},
	"colorMode":0,
	"acceleration": {
		"x": 0,
		"y": 0
	},
	"maxSpeed": NaN,
	"startRotation": {
		"min": 0,
		"max": 360
	},
	"noRotation": false,
	"rotationSpeed": {
		"min": 0,
		"max": 0
	},
	"angle":0,
	"mirrorType":0,
	"orderedArt":0,
	"lifetime": {
		"min": 1,
		"max": 1
	},
	"blendMode": "add",
	"frequency": 0.01,
	"spawnChance": 1,
	"particlesPerWave":1,
	"emitterLifetime": -1,
	"maxParticles": 10000,
	"fluctuation":{
		"max":0,
		"sensitivity":0
	},
	"spawnType":"point",
	"pos": {
		"x": 0,
		"y": 0
	},
	"spawnRect":null,
	"spawnCircle":null,
	"particleSpacing":0,
	"angleStart":0,
	"bdt":0,
	"brt":0,
	"br":0,
	"bdr":0,
	"bdx":0,
	"bdy":0,
	"addAtBack": false,
	"noRotation": false,
	"image":null,
	"targetType":0,
	"comment":"",
};
Game_Particle.compressConfigDataToArray = function(data){
	var array = [];
	var dataKeys = Object.keys(data);

	var allKeys = Game_Particle.CONFIG_PARAM_INDEXES.all.concat();
	var length = allKeys.length;

    for(var i = 0; i<length; i=(i+1)|0){
        var key = allKeys[i];
        if(key === 'version'){
        	array.push(Game_Particle.DATA_VERSION);
        }else if(key === 'spawnData'){
    		var spawnType = data.spawnType;
    		if(spawnType === 'rect'){
    			allKeys.splice(i+1,0,'spawnRect');
    			length += 1;
    		}else if(spawnType==='circle'||spawnType==='ring'){
    			allKeys.splice(i+1,0,'spawnCircle');
    			length += 1;
    		}else if(spawnType==='burst'){
    			array.push([data.particleSpacing,data.angleStart,data.bdt||0,data.brt||0,data.br||0,data.bdx||0,data.bdy||0]);
    		}else{
    			array.push(null);
    		}
    	}else if(dataKeys.indexOf(key)>=0){
        	var type = typeof data[key];
        	if(data[key] && type ==='object'){
        		var childObj = data[key];
        		var childArr = [];
        		array.push(childArr);

        		var childKeys = Game_Particle.CONFIG_PARAM_INDEXES[key];
        		var childKeyLen = childKeys.length;
			    for(var j = 0; j<childKeyLen; j=(j+1)|0){
			        var childKey = childKeys[j];
			        if(childKey==='list'&&childObj[childKey]){
			        	var list = childObj[childKey];
			        	var listLen = list.length;
			        	var listArr = [];
			        	childArr.push(listArr);
					    for(var k = 0; k<listLen; k=(k+1)|0){
					        listArr.push(list[k].time);
					        listArr.push(list[k].value);
					    }
					}else if(childObj[childKey]===undefined &&(childKey==='start'||childKey==='end')){
						continue;
			        }else{
			        	childArr.push(childObj[childKey]||0);
			        }
			    }
			}else if(type==='string'){
				if(key === 'blendMode'){
					array.push(PIXI.BLEND_MODES[data[key].toUpperCase()]);
				}else if(key === 'spawnType'){
					array.push(Game_Particle.SPAWN_TYPES.indexOf(data[key]));
				}else{
					array.push(data[key]);
				}
			}else if(type==='boolean'){
				array.push(data[key]===true?1:0);
        	}else{
        		array.push(data[key]);
        	}
        }else{
        	if(Game_Particle.CONFIG_PARAM_INDEXES[key]){
        		array.push(null);
        	}else if(key==='comment'){
        		array.push('');
        	}else{
        		array.push(0);
        	}
        }
    }
    return array;
};
Game_Particle.decompressConfigDataFromArray = function(array){
	var data = JsonEx.makeDeepCopy(Game_Particle.DEFAULT_DATA);
	var allKeys;

	if(!isNaN(array[0])){
		var version = array.shift();
		if(version === Game_Particle.DATA_VERSION){
			allKeys = Game_Particle.CONFIG_PARAM_INDEXES.all.concat();
		}else{
			allKeys = Game_Particle.CONFIG_PARAM_INDEXES['all'+version].concat();
		}
		allKeys.shift();
	}else{
		allKeys = Game_Particle.CONFIG_PARAM_INDEXES.all0.concat();
	}

	var length = allKeys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = allKeys[i];
        if(key === 'spawnData'){
        	var childArr = array[i];
    		if(data.spawnType==='rect'){
    			allKeys.splice(i+1,0,'spawnRect');
    			array.splice(i+1,0,childArr);
    			length += 1;
    		}else if(data.spawnType==='circle'||data.spawnType==='ring'){
    			allKeys.splice(i+1,0,'spawnCircle');
    			array.splice(i+1,0,childArr);
    			length += 1;
    		}else if(data.spawnType==='burst'){
    			data.particleSpacing = childArr[0];
    			data.angleStart = childArr[1];
    			data.bdt = childArr[2]||0;
    			data.brt = childArr[3]||0;
    			data.br = childArr[4]||0;
    			data.bdx = childArr[5]||0;
    			data.bdy = childArr[6]||0;
    		}
    	}else if(Game_Particle.CONFIG_PARAM_INDEXES[key]){
        	var childArr = array[i];

        	if(!childArr){
        		data[key] = null;
        	}else{
	        	var childKeys = Game_Particle.CONFIG_PARAM_INDEXES[key];
	        	var childObj = {};
	        	data[key] = childObj||null;
	        	var childKeyLen = childKeys.length;
			    for(var j = 0; j<childKeyLen; j=(j+1)|0){
			        var childKey = childKeys[j];
			        if(childKey==='list'){
			        	var listArr = childArr[j];
			        	var list = [];
			        	childObj[childKey] = list;
			        	var listLen = listArr.length;
					    for(var k = 0; k<listLen; k=(k+2)|0){
					    	list.push({
					    		time:listArr[k],
					    		value:listArr[k+1]
					    	});
					    }
					}else if(key==='color'&&(childKey==='start'||childKey==='end')){
						childObj[childKey] = childArr[j]||'#ffffff';
			        }else{
			        	childObj[childKey] = childArr[j]||0;
			        }
			    }
        	}
        }else{
        	if(key==='angleType'){
        		//migrate under V3: angleType > angle
    			data.angle = (array[i]===1 ? -1 : 0);
        	}else if(key==='blendMode'){
        		data[key] = Game_Particle.BLEND_MODE_NAMES[array[i]||0];
        	}else if(key==='spawnType'){
        		data[key] = Game_Particle.SPAWN_TYPES[array[i]||0];
        	}else if(key==='noRotation'||key==='addAtBack'){
        		data[key] = array[i] ? true : false;
        	}else if(key==='image' || key==='comment'){
        		data[key] = array[i]||'';
        	}else{
        		data[key] = array[i]||0;
        	}
        }
    }
    return data;
};

ParticleEmitter.Z_INDEX = {
	screen:-1000,
	spriteset:-900,
	back:-800,
	below:1,
	above:5,
	top:9,
};

var Z_INDEX = ParticleEmitter.Z_INDEX;
ParticleEmitter.TARGET_TYPES = {
	displayObject:-1,

	character:0,
	walk:1,
	startdash:2,
	attach:3,
	tilemap:4,

	screen:5,
	weather:6,
	region:7,

	party:8,
	enemy:9,
	battle:10,
	battleWeather:11,

	click:12,
	drag:13,

	picture:14,
	skit:15,
	battlePicture:16,
	battleSkit:17,

	attachParty:18,
	attachEnemy:19,

	back:20,
	weatherBack:21,

	actor:22,
	attachActor:23,
};
var TARGET_TYPES = ParticleEmitter.TARGET_TYPES;
ParticleEmitter.DELTA_TIME = 1/60;


ParticleEmitter.NODE_PARAMS = ['alpha','speed','scale','color'];
ParticleEmitter.NODE_KEY_CONVERT = {
	alpha:'startAlpha',
	speed:'startSpeed',
	scale:'startScale',
	color:'startColor'
};

var CLEAR_ARGS = ['clear',NLC('クリア',1),NLC('クリアー',2),NLC('消去',3)];
var SET_COMMANDS = ['set','play','edit'];


//PRAGMA: registerCommands
//=============================================================================
// PluginManager
//=============================================================================
(()=>{
	const commands = ['set','play','repeat','on','off','clear','update','animate','exceed','loop','filter','max'];
	function _pluginCommand(command,args){
		//this > interpreter
		var argsArr = Object.values(args)
		var delay = Number(argsArr.pop())||0;

		var pCommand = command;
		if(command==='update'||command==='animate'){
			Array.prototype.push.apply(argsArr,argsArr.pop().split(' '));
		}else if(command==='set'||command==='play'){
			var editFlag = argsArr.pop()==='true';
			if(editFlag){
				pCommand = 'edit';
			}
			var tag = argsArr.pop();
			if(tag){
				if(!tag.contains('tag:')){
					tag = 'tag:'+tag;
				}
				argsArr.push(tag);
			}
		}

		argsArr.unshift(pCommand);

		var eventId = this.eventId();
		if(delay>0){
			$gameScreen._particle.reservePluginCommand(delay,this,argsArr,eventId);
		}else{
			$gameScreen._particle.pluginCommand(this,argsArr,eventId);
		}
	}
	for(const command of commands){
		PluginManager.registerCommand(pluginName, command, function(args){
			_pluginCommand.call(this,command,args);
		});
    }

    const filters = ['filterClear','filterBlur','filterGlow','filterRgbSplit','filterPixelate','filterDisplacement'];
    function _filterCommand(command,args){
    	//this > interpreter
		var argsArr = Object.values(args)
		var delay = Number(argsArr.pop())||0;
		var id = argsArr.shift();

		switch(command){
		case 'filterClear':
			argsArr.unshift('clear');
			break;
		case 'filterBlur':
			argsArr.unshift('blur');
			break;
		case 'filterGlow':
			argsArr.unshift('glow');
			break;
		case 'filterRgbSplit':
			argsArr.unshift('rgbSplit');
			break;
		case 'filterPixelate':
			argsArr.unshift('pixelate');
			break;
		case 'filterDisplacement':
			argsArr.unshift('displacement');
			break;
		}
		argsArr.unshift(id);
		argsArr.unshift('filter');

		var eventId = this.eventId();
		if(delay>0){
			$gameScreen._particle.reservePluginCommand(delay,this,argsArr,eventId);
		}else{
			$gameScreen._particle.pluginCommand(this,argsArr,eventId);
		}
    }
	for(const command of filters){
		PluginManager.registerCommand(pluginName, command, function(args){
			_filterCommand.call(this,command,args)
		});
    }

    /* TRP_ParticleMZ_Preset & List
	===================================*/
	var categoryNames = Game_Particle.CATEGORY_NAMES;
	var categoryLength = categoryNames.length;
	var listPlugin = 'TRP_ParticleMZ_List';
	var presetPlugin = 'TRP_ParticleMZ_Preset';
	var exPresetPlugin = 'TRP_ParticleMZ_ExPreset';
	function _listCommand(command,args){
		if(!args.id||args.id==='def'||args.id==='d'){
			args.id = args.name;
		}
		if(args.id==='-EID'){
			args.id = args.name+'-EID';
		}
		command = command.split('_')[0];
		_pluginCommand.call(this,command,args);
	}

	for(var i=0; i<2; i=(i+1)|0){
		var commandBase = i===0 ? 'set' : 'play';
		for(var j=0; j<categoryLength; j=(j+1)|0){
			var category = categoryNames[j];
			var command = commandBase+'_'+category;
			PluginManager.registerCommand(listPlugin, command, function(args){
				_listCommand.call(this,command,args);
			});
			PluginManager.registerCommand(presetPlugin, command, function(args){
				_listCommand.call(this,command,args);
			});
			PluginManager.registerCommand(exPresetPlugin, command, function(args){
				_listCommand.call(this,command,args);
			});
		}
	}
})();
//PRAGMA_END: registerCommands




//=============================================================================
// core Game_Objects
//=============================================================================
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args){
	if(commandNames.contains(command.toLowerCase())){
		var subCommand = args[0];
		if(subCommand==='test'){
			this.trpParticleTest();
		}else if(subCommand==='test2'){
			this.trpParticleTest2();
		}else{
			$gameScreen._particle.pluginCommand(this,args,this.eventId());
		}
	}else{
		_Game_Interpreter_pluginCommand.call(this,command, args);
	}
};

var _Game_Screen_initialize = Game_Screen.prototype.initialize;
Game_Screen.prototype.initialize = function(){
	_Game_Screen_initialize.call(this);
	this._particle = new Game_Particle();
};
Game_Screen.prototype.tryCreateParticle = function(){
	if(!this._particle){
		this._particle = new Game_Particle();
	}else{
		this._particle.ensureVariables();
	}
};

var _Game_Screen_update = Game_Screen.prototype.update;
Game_Screen.prototype.update = function(){
	_Game_Screen_update.call(this);

	this._particle.update();
};



/* Scene_Map
===================================*/
var _Scene_Map_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function(){
	if($gameMap && $gameScreen._particle){
		$gameScreen._particle.willStartSceneMap();
	}

	_Scene_Map_start.call(this);
};


/* Event
===================================*/
var _Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function(){
	_Game_Event_setupPage.call(this);

	if(SceneManager._scene._mapLoaded){
		this.setupParticles();
	}
};

Game_Event.prototype.setupParticles = function(){
	var page = this.page();
	if(!page)return;
	var list = page.list;
	var length = list.length;

    for(var i = 0; i<length; i=(i+1)|0){
        var command = list[i];
        if(command.code!==108&&command.code!==408)break;
        var line = command.parameters[0];
        if(typeof line === 'string'){
        	if(commandNameRegex.test(line)){
        		var args = line.split(' ');
        		args.shift();
        		if(args[0]==='edit'){
        			$gameScreen._particle.reservePluginCommand(4,$gameMap._interpreter,args,this.eventId());
        		}else{
        			$gameScreen._particle.pluginCommand($gameMap._interpreter,args,this.eventId());
        		}
        	}
        }
    }
};

/* Game_Battler
===================================*/
Game_Battler.prototype.setupStatesParticles = function(){
	var states = this._states;
	var length = states ? states.length : 0;
	for(var i=0; i<length; i=(i+1)|0){
		var state = $dataStates[states[i]];
		if(state){
			this.setupStateParticles(state);
		}
	}
};

Game_Battler.prototype.setupStateParticles = function(state){
	var meta = state.meta;
	if(!meta.particle && !meta.particle1)return;

	var targetId = this.particleTargetId();
	var tag = 'state:'+targetId+':'+state.id;
	this.setupParticlesWithMeta(meta,targetId,tag);
};

Game_Battler.prototype.particleTargetId = function(){
	var targetId;
	if(this.isEnemy()){
		targetId = 'enemy:'+(this.index()+1);
	}else{
		targetId = this.isActor() ? ('actor:'+this.actorId()) : ('party:'+(this.index()+1));
	}

	return targetId;
};


/* State
===================================*/
if(!disableState){
	var _Game_Battler_addNewState = Game_Battler.prototype.addNewState;
	Game_Battler.prototype.addNewState = function(stateId){
		_Game_Battler_addNewState.call(this,stateId);

		var state = $dataStates[stateId];
		if(state && state.meta && this.isBattleMember()){
			this.setupStateParticles(state);
		}
	};


	var _Game_Battler_clearStates = Game_Battler.prototype.clearStates;
	Game_Battler.prototype.clearStates = function(){
		var states = this._states ? this._states.concat() : null;
		_Game_Battler_clearStates.call(this,...arguments);

		if(states){
			for(const stateId of states){
				if(!this._states || !this._states.contains(stateId)){
					var state = $dataStates[stateId];
					if(state)this.eraseStateParticles(state);
				}
			}
		}
	}

	var _Game_BattlerBase_eraseState = Game_BattlerBase.prototype.eraseState;
	Game_BattlerBase.prototype.eraseState = function(stateId) {
		_Game_BattlerBase_eraseState.call(this,stateId);

		var state = $dataStates[stateId];
		if(state && state.meta){
			this.eraseStateParticles(state);
		}
	};

	Game_Battler.prototype.eraseStateParticles = function(state){
		var meta = state.meta;
		if(!meta.particle && !meta.particle1)return;

		var tag = 'state:'+this.particleTargetId()+':'+state.id;
		var targetId = 'tag:'+tag;
		$gameScreen._particle.particleClear(targetId,false);
	};
};

Game_Battler.prototype.setupParticlesWithMeta = function(meta,targetId,tag){
	tag = tag || '';

	var argsStr = meta.particle||meta.particle1;
	var idx = 1;
	var interpreter = $gameTroop._interpreter;
	var dummyEventId = 0;

	var suffix = ':'+targetId;
	$gameScreen._particle.setAutoIdSuffix(suffix);
	while(!!argsStr){
		argsStr = argsStr.replace('this',targetId);
		var args = argsStr.split(" ");
		if(tag && !argsStr.contains('tag:') && SET_COMMANDS.contains(args[0])){
			args.push('tag:'+tag);
		}
		$gameScreen._particle.pluginCommand(interpreter,args,dummyEventId);

		idx += 1;
		argsStr = meta['particle'+idx];
	}
	$gameScreen._particle.clearAutoIdSuffix();
};


var _Game_Battler_onBattleStart = Game_Battler.prototype.onBattleStart;
Game_Battler.prototype.onBattleStart = function(advantageous) {
	_Game_Battler_onBattleStart.call(this,...arguments);

	this.setupStatesParticles();
};

/* party
===================================*/
var _Game_Party_addActor = Game_Party.prototype.addActor;
Game_Party.prototype.addActor = function(actorId){
	_Game_Party_addActor.call(this,actorId);

	var actor = $gameActors.actor(actorId);
	if(actor){
		actor.setupStatesParticles();
	}
};

var _Game_Party_swapOrder = Game_Party.prototype.swapOrder;
Game_Party.prototype.swapOrder = function(index1,index2){
	_Game_Party_swapOrder.call(this,...arguments);

	var actor1 = $gameActors.actor(this._actors[index1]);
	var actor2 = $gameActors.actor(this._actors[index2]);
	if(actor1){
		actor1.setupStatesParticles();
	}
	if(actor2){
		actor2.setupStatesParticles();
	}
};




/* Troop&Enemy
===================================*/
var _Game_Troop_setup = Game_Troop.prototype.setup;
Game_Troop.prototype.setup = function(troopId) {
	_Game_Troop_setup.apply(this,arguments);
	var members = this._enemies;
	var length = members.length;
    for(var i = 0; i<length; i=(i+1)|0){
        members[i].setupParticles();
    }
};

Game_Enemy.prototype.setupParticles = function(){
	var data = this.enemy();
	if(!data)return;

	var targetId = this.particleTargetId();
	this.setupParticlesWithMeta(data.meta,targetId);
};

if(Game_Enemy.prototype.die===Game_BattlerBase.prototype.die
	||Game_Enemy.prototype.die===Game_Battler.prototype.die)
{
	Game_Enemy.prototype.die = function(){
		Game_Battler.prototype.die.call(this);
	}
}
var _Game_Enemy_die = Game_Enemy.prototype.die;
Game_Enemy.prototype.die = function() {
	_Game_Enemy_die.call(this);

	$gameScreen._particle.clearEnemyTargetParticles(this);
};


if(Game_Enemy.prototype.revive===Game_BattlerBase.prototype.revive
	|| Game_Enemy.prototype.revive===Game_Battler.prototype.revive)
{
	Game_Enemy.prototype.revive = function(){
		Game_Battler.prototype.revive.call(this);
	}
}
var _Game_Enemy_revive = Game_Enemy.prototype.revive;
Game_Enemy.prototype.revive = function() {
	_Game_Enemy_revive.call(this);
	this.setupParticles();
};

/* skill
===================================*/
if(!disableSkill){
	var _Window_BattleLog_startAction = Window_BattleLog.prototype.startAction;
	Window_BattleLog.prototype.startAction = function(subject,action,targets){
		_Window_BattleLog_startAction.apply(this,arguments);
		var item = action.item();
		if(item){
			this.showParticleEffect(subject,targets,item);
		}
	};
	Window_BattleLog.prototype.showParticleEffect = function(subject,targets,item){
		var argsStr = item.meta.particle||item.meta.particle1;
		var delayStr = item.meta.particleDelay||item.meta.particle1Delay||item.meta.particleDelay1||item.meta.particle1delay;

		var idx = 1;
		var interpreter = $gameTroop._interpreter;
		var dummyEventId = 0;

		var subjectId = subject.particleTargetId();

		var targetIds = [];
		var length = targets ? targets.length : 0;
	    for(var i = 0; i<length; i=(i+1)|0){
	        var target = targets[i];
		 	var targetId = target.particleTargetId();
		 	targetIds.push(targetId);
	    }

		while(!!argsStr){
			argsStr = argsStr.replace('this',subjectId);
			var args = argsStr.split(" ");

			var userIdx = args.indexOf('user');
			if(userIdx>=0){
				args[userIdx] = subject.particleTargetId();
			}

			var targetIdx = args.indexOf('target');
			var isAttach = false;
			if(targetIdx<0){
				targetIdx = args.indexOf('attach:target');
				if(targetIdx>=0){
					isAttach = true;
				}
			}
			if(targetIdx>=0){
				for(var i = 0; i<length; i=(i+1)|0){
					if(i>0)args=args.concat();

			        var targetId = targetIds[i];
			        args[targetIdx] = (isAttach?'attach:':'')+targetId;

			        var suffix;
			        if(args[0]==='attract'){
			        	suffix = ':'+subjectId;
			        }else{
			        	suffix = ':'+targetId;
			        }
					$gameScreen._particle.setAutoIdSuffix(suffix);
					if(!isNaN(delayStr)){
						$gameScreen._particle.reservePluginCommand(Number(delayStr),interpreter,args,dummyEventId);
					}else{
						$gameScreen._particle.pluginCommand(interpreter,args,dummyEventId);
					}
			    }
			}else{
		        var suffix = ':'+subjectId;
		        $gameScreen._particle.setAutoIdSuffix(suffix);
		        if(!isNaN(delayStr)){
					$gameScreen._particle.reservePluginCommand(Number(delayStr),interpreter,args,dummyEventId);
				}else{
					$gameScreen._particle.pluginCommand(interpreter,args,dummyEventId);
				}
			}
		
			idx += 1;
			argsStr = item.meta['particle'+idx];
			delayStr = item.meta['particle'+idx+'Delay']||item.meta['particle'+idx+'delay']||item.meta['particleDelay'+idx];
		}
		$gameScreen._particle.clearAutoIdSuffix();
	};
}

/* Scene_Battle
===================================*/
var _Scene_Battle_terminate = Scene_Battle.prototype.terminate;
Scene_Battle.prototype.terminate = function() {
	_Scene_Battle_terminate.call(this);

	if(clearBattleScreenOnEnd){
		$gameScreen._particle.removeBattleScreenParticles();
	}
	if(clearBattleCharaOnEnd){
		$gameScreen._particle.removeBattleCharacterParticles();
	}
};


//=============================================================================
// Manager
//=============================================================================
ImageManager.loadParticle = function(filename, hue) {
    return this.loadBitmap('img/particles/', filename, hue, true);
};

var _SceneManager_changeScene = SceneManager.changeScene;
SceneManager.changeScene = function(){
	if(this.isSceneChanging() && !this.isCurrentSceneBusy() && $gameScreen && $gameScreen._particle){
		$gameScreen._particle.willSceneChange();
	}
	_SceneManager_changeScene.call(this);
};

var _DataManager_loadDataFile = DataManager.loadDataFile;
DataManager.loadDataFile = function(name, src) {
	if(src.contains('Test_')&&src.contains('TrpParticles')){
		src = Game_Particle.DATA_FILE_PATH;
	}
	_DataManager_loadDataFile.call(this,name,src);
};


var _DataManager_extractSaveContents = DataManager.extractSaveContents;
DataManager.extractSaveContents = function(contents) {
	_DataManager_extractSaveContents.call(this,contents);

	$gameScreen.tryCreateParticle();
};


//=============================================================================
// Scene
//=============================================================================
var _Scene_Base_initialize = Scene_Base.prototype.initialize;
Scene_Base.prototype.initialize = function(){
	_Scene_Base_initialize.call(this);
	this.initializeParticleSystem();
};
Scene_Base.prototype.initializeParticleSystem = function(){
	this._particleSystem = null;
};

var _Scene_Base_create = Scene_Base.prototype.create;
Scene_Base.prototype.create = function(){
	_Scene_Base_create.call(this);
	if($gameScreen&&$gameScreen._particle&&this.useParticleSystem()){
		this.createParticleSystem();
	};
};
Scene_Base.prototype.createParticleSystem = function(){
	if(ParticleSystem.temporallyCacheForGroupedScene){
		this._particleSystem = ParticleSystem.temporallyCacheForGroupedScene;
		ParticleSystem.temporallyCacheForGroupedScene = null;
	}else{
		this._particleSystem = new ParticleSystem();
	}
};
var _Scene_Base_start = Scene_Base.prototype.start;
Scene_Base.prototype.start = function(){
	_Scene_Base_start.call(this);
	if(this._particleSystem){
		this._particleSystem.tryRestoreFromCache(this);
	}
};

Scene_Base.prototype.useParticleSystem = function(){
	return true;
};

var _Scene_Base_update = Scene_Base.prototype.update;
Scene_Base.prototype.update = function(){
	_Scene_Base_update.call(this);
	if(this._particleSystem){
		this._particleSystem.update(this);
	}
};

Scene_Base.prototype.isParticleTargetTypeValid = function(type,targetId){
	switch(type){
	case TARGET_TYPES.click:
	case TARGET_TYPES.drag:
	case TARGET_TYPES.displayObject:
		return true;
	case TARGET_TYPES.scene:
	default:
		if(type<-1){
			return sceneTypes[-type-2]===this.constructor.name;
		}
		return false;
	}
};

/* Scene_Boot
===================================*/
var _Scene_Boot_start = Scene_Boot.prototype.start;
Scene_Boot.prototype.start = function() {
	_Scene_Boot_start.call(this);
	ParticleSystem.setupSystemParticles();
};

/* Scene_Map
===================================*/
Scene_Map.prototype.initializeParticleSystem = function(){
	Scene_Base.prototype.initializeParticleSystem.call(this);
	this._useCachedParticleSystem = false;
};
Scene_Map.prototype.createParticleSystem = function(){
	if(ParticleSystem.temporallyCacheForSceneMap && ParticleSystem.cacheMapId===$gameMap.mapId()){
		this._particleSystem = ParticleSystem.temporallyCacheForSceneMap;
		ParticleSystem.clearCache();
		this._useCachedParticleSystem = true;
	}else{
		Scene_Base.prototype.createParticleSystem.call(this);
	}
};
Scene_Map.prototype.useParticleSystem = function(){
	return true;
};
Scene_Map.prototype.isParticleTargetTypeValid = function(type,targetId){
	if(type<-1)return false;

	switch(type){
	case TARGET_TYPES.party:
	case TARGET_TYPES.enemy:
	case TARGET_TYPES.attachParty:
	case TARGET_TYPES.attachEnemy:
	case TARGET_TYPES.battle:
	case TARGET_TYPES.battleWeather:
	case TARGET_TYPES.battlePicture:
	case TARGET_TYPES.battleSkit:
	case TARGET_TYPES.actor:
	case TARGET_TYPES.attachActor:
		return false;
	default:
		return true;
	}
};

var _Scene_Map_terminate = Scene_Map.prototype.terminate;
if(cacheBeforeTerminate){
	Scene_Map.prototype.terminate = function() {
		if(SceneManager.isNextScene(Scene_Menu)){
			if(this._particleSystem){
				this._particleSystem.cacheForMap();
				this._particleSystem = null;
			}
		}
		_Scene_Map_terminate.call(this);
	};
}else{
	Scene_Map.prototype.terminate = function() {
		_Scene_Map_terminate.call(this);
		if(SceneManager.isNextScene(Scene_Menu)){
			if(this._particleSystem){
				this._particleSystem.cacheForMap();
				this._particleSystem = null;
			}
		}
	};
}


var _Scene_Base_terminate = Scene_Base.prototype.terminate;
Scene_Base.prototype.terminate = function(){
	this.tryCacheParticleSystem();
	_Scene_Base_terminate.call(this);
};
Scene_Base.prototype.tryCacheParticleSystem = function(){
	if(!this._particleSystem)return;
	var length = sceneGroups.length;

	var next = SceneManager._nextScene ? SceneManager._nextScene.constructor.name : '';
	if(!next)return;

	var constructor = this.constructor.name;
    for(var i = 0; i<length; i=(i+1)|0){
        var group = sceneGroups[i];
        if(group.contains(constructor) && group.contains(next)){
        	this._particleSystem.cacheForGroupedScene();
        	return;
        }
    }
};


/* Scene_Battle
===================================*/
Scene_Battle.prototype.useParticleSystem = function(){
	return true;
};
Scene_Battle.prototype.isParticleTargetTypeValid = function(type,targetId){
	if(type<-1)return false;

	switch(type){
	case TARGET_TYPES.character:
	case TARGET_TYPES.attach:
	case TARGET_TYPES.tilemap:
	case TARGET_TYPES.screen:
	case TARGET_TYPES.weather:
	case TARGET_TYPES.walk:
	case TARGET_TYPES.startdash:
	case TARGET_TYPES.region:
	case TARGET_TYPES.picture:
	case TARGET_TYPES.skit:
		return false;
	default:
		return true;
	}
};

/* Scene_Load
===================================*/
var _Scene_Load_onLoadSuccess = Scene_Load.prototype.onLoadSuccess;
Scene_Load.prototype.onLoadSuccess = function() {
	ParticleSystem.clearCache();
	_Scene_Load_onLoadSuccess.call(this);
};



//=============================================================================
// Game_Character
//=============================================================================
if(!disableRoute){
	var _Game_Character_processMoveCommand = Game_Character.prototype.processMoveCommand;
	Game_Character.prototype.processMoveCommand = function(command){
		if(command.code===Game_Character.ROUTE_SCRIPT &&
			/particle /.test(command.parameters[0]))
		{
			var params = command.parameters[0].split(' ');
			params.shift();
			var charaId = (this instanceof Game_Event ? this._eventId : 0);
			$gameScreen._particle.pluginCommand($gameMap._interpreter,params,charaId);
		}else{
			_Game_Character_processMoveCommand.call(this,command);
		}
	};
}



//=============================================================================
// Game_Particle
//=============================================================================
Game_Particle.displayObjects = {};
Game_Particle.clearDisplayObjects = function(){
	Game_Particle.displayObjects = {};
};
Game_Particle.defaultImage = function(){
	return parameters.defaultImage||'particle1';
};
Game_Particle.isPlayCommands = function(sub){
	return sub==='play'||sub==='set'||sub==='edit';
};

Game_Particle.prototype.initialize = function() {
	this._data = {};
	this._keys = [];
	this._lastMapId = 0;
	this._tagInfo = {};
	this.maxParticles = maxParticles||0;
	this._suffix = '';
	this._skitIds = [];
	this._reservedCommands = [];

	this.resetMaxParticles();
};

Game_Particle.prototype.ensureVariables = function(){
};

Game_Particle.EVENT_ID_REGEXP = /-EID$/;
Game_Particle.prototype.processArgsEventId = function(args,eventId){
	var length = args.length;
	var regexp = Game_Particle.EVENT_ID_REGEXP;
    for(var i = 0; i<length; i=(i+1)|0){
        var arg = args[i];
        if(typeof arg === 'string' && regexp.test(arg)){
    		args[i] = arg.replace(regexp,'-'+String(eventId));
        }
    }
};

Game_Particle.prototype.convertEscapeCharacters = function(args){
	var length = args.length;
    for(var i=0; i<length; i=(i+1)|0){
        if(typeof args[i] !== 'string')continue;
        var arg = args[i];
        arg = arg.replace(/\\/g, "\x1b");
	    arg = arg.replace(/\x1bV\[(\d+)\]/gi, (_, p1) =>
	        $gameVariables.value(parseInt(p1))
	    );
	    arg = arg.replace(/\x1bV\[(\d+)\]/gi, (_, p1) =>
	        $gameVariables.value(parseInt(p1))
	    );
    	arg = arg.replace(/\x1bJ\[(.+?)]/gi,function(_, p1){
		    return eval(p1)||'';
		})
        args[i] = arg;
    }
};

Game_Particle.prototype.pluginCommand = function(interpreter,args,eventId){
	var sub = args.shift().toLowerCase();
	this.convertEscapeCharacters(args);

	//process eid
	if(!isNaN(eventId)){
		this.processArgsEventId(args,eventId);
	}

	this._pluginCommand(interpreter,sub,args,eventId);
};

Game_Particle.prototype._pluginCommand = function(interpreter,sub,args,eventId){
	var tag;
	if(Game_Particle.isPlayCommands(sub)){
		tag = this.extractTagRegister(args);

		var targetId = '';
		if(sub==='set'){
			args.unshift(eventId);
			Game_Particle.prototype.particleSet.apply(this,args);
			targetId = args[1];
		}else if(sub==='play'){
			args.unshift(eventId);
			Game_Particle.prototype.particlePlay.apply(this,args);
			targetId = args[1];
		}else if(sub==='edit'){
			var copyName = '';
			if(typeof args[args.length-1] === 'string'){
				if(args[args.length-1].indexOf('copy:')===0){
					copyName = args.pop().replace('copy:','');
				}
			}
			args.unshift(copyName);
			args.unshift(eventId);
			if(Game_Particle.prototype._particleEdit.apply(this,args) && interpreter){
				interpreter.wait(1);
			}
			targetId = args[2];
		}
		//register tag
		if(tag){
			this.particleTag(targetId,tag);
		}
	}else if(sub==='repeat'){
		Game_Particle.prototype.particleRepeat.apply(this,args);
	}else if(sub==='on'){
		Game_Particle.prototype.particleOn.apply(this,args);
	}else if(sub==='off'){
		Game_Particle.prototype.particleOff.apply(this,args);
	}else if(sub==='clear'){
		Game_Particle.prototype.particleClear.apply(this,args);
	}else if(sub==='update'){
		this.particleUpdate(args);
	}else if(sub==='animate'){
		this.particleAnimate(args);
	}else if(sub==='exceed'){
		Game_Particle.prototype.particleExceed.apply(this,args);
	}else if(sub==='screenLoop'||sub==='loop'){
		Game_Particle.prototype.particleLoop.apply(this,args);
	}else if(sub==='filter'){
		this.particleFilter(args);
	}else if(sub==='max'){
		if(isNaN(args[0])){
			this.resetMaxParticles();
		}else{
			this.maxParticles = Number(args[0]);
		}

	}else if(sub==='flash'){
		$gameScreen.startFlash([Number(args[0]),Number(args[1]),Number(args[2]),Number(args[3])],Number(args[4]));
	}else if(sub==='shake'){
		$gameScreen.startShake(Number(args[0]),Number(args[1]),Number(args[2]));
	}else if(sub==='se'){
		AudioManager.playSe({name:args[0],volume:Number(args[1])||90,pitch:Number(args[2])||100,pan:Number(args[3])||0})

	}else if(sub==='reserve'){
		this.reservePluginCommand(Number(args.shift()),interpreter,args,eventId);
	}
};

Game_Particle.prototype.reservePluginCommand = function(delay,interpreter,args,eventId){
	this._reservedCommands = this._reservedCommands||[];
	this._reservedCommands.push([Number(delay),interpreter,args,eventId,this._suffix]);
};

Game_Particle.prototype.update = function(){
	if(this._reservedCommands&&this._reservedCommands.length>0){
		this.updateReservedCommands();
	}

	var keys = this._keys;
	var length = keys.length;
	var destroyed = false;
    for(var i = length-1; i>=0; i=(i-1)|0){
        var key = keys[i];
        var data = this._data[key];
        if(!data || data.destroy){
        	this._remove(key,keys,true);
        	destroyed = true;
        }else if(data.animations){
        	this.updateAnimations(key,data);
        }
    }
    if(destroyed){
    	this.truncateTagInfo();
    }
};
Game_Particle.prototype._remove = function(key,keys=this._keys,skipTruncateTagInfo=false){
	var idx = keys.indexOf(key);
	if(idx<0)return;

	keys.splice(idx,1);
	delete this._data[key];

	if(Game_Particle.displayObjects[key]){
		delete Game_Particle.displayObjects[key];
	}
	if(!skipTruncateTagInfo){
		this.truncateTagInfo();
	}
};

Game_Particle.prototype.updateReservedCommands = function(){
	var length = this._reservedCommands.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var command = this._reservedCommands[i];
        command[0]-=1;
        if(command[0]<=0){
        	var hasSuffix = command.length >= 5;
        	if(hasSuffix){
        		this.setAutoIdSuffix(command[4]);
        	}
        	this.pluginCommand(command[1],command[2],command[3]);
        	if(hasSuffix){
        		this.clearAutoIdSuffix();
        	}
        	this._reservedCommands.splice(i,1);
        	length -= 1;
        	i -= 1;
		}
    }
}

Game_Particle.prototype.idWithSuffix = function(id){
	var idx = id.indexOf(this._suffix);
	if(this._suffix && 
		(idx<0 || idx!==id.length-this._suffix.length))
	{
		id+=this._suffix;
	}
	return id;
};
Game_Particle.prototype.particleSet = function(eventId,id,target,name,z,x,y,image){
	name = supplementDef(id,name)||id;
	id = this.idWithSuffix(id);
	
	if(!!this._data[id]){
		if(this._data[id].destroy){
			this._remove(id);
		}else{
			this.particleOn(id);
			return;
		}
	}

	var data = this.particleData(eventId,id,target,name,z,x,y,image);
	if(!data)return;

	this._data[id] = data;
	this._keys.push(id);
	return data;
};

Game_Particle.prototype.particleData = function(eventId,id,target,name,z,x,y,image,ignoreError=false){
	x = Number(x)||0;
	y = Number(y)||0;
	
	if(!ignoreError && !Game_Particle.configDataWithName(name)){
		if(errorLog){
			throw new Error(LC('設定名:%1のパーティクル設定データが存在しません。',4).format(name));
		}
		return;
	}
	if(!ignoreError && errorLog && target===undefined){
		throw new Error(LC('パーティクル表示コマンドの対象が設定されてません。',6)+'(ID:'+id+')');
	}

	var targetType = TARGET_TYPES.character;
	var targetId = 0;
	var exData = null;
	var elems;
	if(target instanceof PIXI.Container){
		targetType = TARGET_TYPES.displayObject;
		targetId = id;
		Game_Particle.displayObjects[id] = target;
	}else if(target === 'displayObject'){
		targetType = TARGET_TYPES.displayObject;
		targetId = id;
	}else if(target.toLowerCase().contains('scene_')){
		targetType = sceneTypes.indexOf(target);
		if(errorLog && targetType<0){
			throw new Error(LC('対象のシーンが登録されてませんされてません。(対象:%1)',7).foramt(target));
		}
		targetType = -targetType-2;
	}else if(target === 'this'){
		targetId = eventId;
	}else if(!isNaN(target)){
		targetId = Number(target);
	}else if(target==='player'){
		targetId = 0;
	}else if(target==='tilemap'){
		targetType = TARGET_TYPES.tilemap;
	}else{
		var targetElems = target.split(':');
		targetId = targetElems.length>=2 ? Number(targetElems[1]) : 0;
		switch(targetElems[0].toLowerCase()){
		case 'follower':
			targetType = TARGET_TYPES.character;
			targetId *= -1;
			break;
		case 'attach':
			targetElems.shift();
			if(targetElems[0]==='party'){
				targetType = TARGET_TYPES.attachParty;
				targetId = targetElems[1];
			}else if(targetElems[0]==='enemy'){
				targetType = TARGET_TYPES.attachEnemy;
				targetId = targetElems[1];
			}else if(targetElems[0]==='actor'){
				targetType = TARGET_TYPES.attachActor;
				targetId = targetElems[1];
			}else{
				targetType = TARGET_TYPES.attach;
				targetId = this.processCharacterTargetId(targetElems,eventId);
			}
			break;
		case 'walk':
		case 'startdash':
			targetType = TARGET_TYPES[targetElems.shift()];
			targetId = this.processCharacterTargetId(targetElems,eventId);

			if(targetElems[0]){
				exData = exData||{};
				exData.regions = [];
				targetElems[0].split(',').forEach(function(regionId){
					exData.regions.push(Number(regionId));
				});
			}
			if(targetType === TARGET_TYPES.walk){
				exData = exData||{};
				exData.dashing = false;
				exData.lastMoving = false;
				exData.frequency = 0;
			}else if(targetType === TARGET_TYPES.startdash){
				exData = exData||{};
				exData.dashing = false;
				exData.lastDashing = false;
				exData.dir = 0;
			}
			break;
		case 'stay':
			targetType = TARGET_TYPES.tilemap;
			var event = $gameMap.event(targetId||eventId);
			x += event._x;
			y += event._y;
			break;
		case 'weather':
			targetType = TARGET_TYPES.weather;
			if(targetElems.length>1){
				exData = exData||{};
				elems = targetElems[1].split(',');
				exData.px = Number(elems[0]);
				exData.py = elems.length>=2?Number(elems[1]):1;
			}
			break;
		case 'skit':
		case 'battleSkit':
			targetType = TARGET_TYPES[targetElems[0]];
			if(!this._skitIds.contains(targetElems[1])){
				this._skitIds.push(targetElems[1]);
			}
			targetId = this._skitIds.indexOf(targetElems[1]);
			break;
		case 'event':
			targetType = TARGET_TYPES.character;
			break;
		default:
			if(TARGET_TYPES[targetElems[0]]){
				targetType = TARGET_TYPES[targetElems[0]];
				if(targetElems[0]==='region'){
					targetId = targetElems[1];
					exData = {
						lastX:-1,
						lastY:-1,
						frequency:1,
						maxParticles:0,
						particlesPerWave:0,
						allPos:null
					}
				}
			}
		}
	}

	//supplement z
	if(isNaN(z)){
		if(!isNaN(Z_INDEX[z])){
			z = Z_INDEX[z];
		}else{
			z = this.defaultZIndexForType(targetType);
		}
	}
	z = Number(z)||0;

	//make data
	var data = {
		targetType:targetType,
		targetId:targetId,
		name:name,
		image:image||null,
		x:x,
		y:y,
		z:z,
		stop:false,
		clear:false,
		quit:false,
		interval:0,
		params:{},
		pChanged:false,
		filters:{},
		fid:0,
		exceed:null,
		loop:null,
		animations:null,
		repeat:0,
		destroy:false,
		ex:exData
	};
	return data;
}

Game_Particle.prototype.defaultZIndexForType = function(targetType){
	var z = 0;
	if(targetType < -1){
		z = Z_INDEX.below;
	}else if(targetType === TARGET_TYPES.character){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.walk){
		z = Z_INDEX.below;
	}else if(targetType === TARGET_TYPES.startdash){
		z = Z_INDEX.below;
	}else if(targetType === TARGET_TYPES.attach){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.screen){
		z = Z_INDEX.spriteset;
	}else if(targetType === TARGET_TYPES.displayObject){
		z = 1;
	}else if(targetType === TARGET_TYPES.weather){
		z = Z_INDEX.spriteset;
	}else if(targetType === TARGET_TYPES.party){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.actor){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.attachActor){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.enemy){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.attachParty){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.attachEnemy){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.battle){
		z = Z_INDEX.screen;
	}else if(targetType === TARGET_TYPES.battleWeather){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.region){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.picture){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.skit){
		z = Z_INDEX.above;
	}else if(targetType === TARGET_TYPES.battleSkit){
		z = Z_INDEX.above;
	}
	return z;
};


Game_Particle.prototype.processCharacterTargetId = function(targetElems,eventId){
	var elem0 = targetElems.shift();
	if(elem0==='player'){
		return 0;
	}else if(elem0==='follower'){
		return -Number(targetElems.shift()) || -1;
	}else if(elem0==='this'){
		return eventId;
	}else if(elem0==='event'){
		return Number(targetElems.shift())||eventId;
	}else if(!isNaN(elem0)){
		return Number(elem0);
	}else{
		throw new Error(LC('パーティクルの対象の値に誤りがあります。',8));
	}
};

Game_Particle.prototype.particlePlay = function(eventId,id,target,name,z,x,y,image){
	var data = this._data[this.idWithSuffix(id)];
	if(!data){
		data = this.particleSet(eventId,id,target,name,z,x,y,image);
	}
	data.clear = true;
};

Game_Particle.prototype.particleRepeat = function(id,interval){
	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			if(interval === undefined){
				data.repeat = 1;
			}else if(isNaN(interval)){
				data.repeat = 0;
			}else{
				data.repeat = Number(interval)||0;
			}
		}
	}
};

Game_Particle.prototype.particleOn = function(id){
	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			data.stop = false;
		}
	}
};

Game_Particle.prototype.particleOff = function(id){
	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			data.stop = true;
		}
	}
};

Game_Particle.prototype.stopAll = function(){
	var keys = this._keys;
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = keys[i];
        this.particleOff(key);
    }
};
Game_Particle.prototype.resumeAll = function(){
	var keys = this._keys;
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = keys[i];
        this.particleOn(key);
    }
};

Game_Particle.prototype.particleClear = function(id,quit){
	if(quit==='false'||quit==='f'){
		quit = false;
	}else if(quit==='true'||quit==='t'){
		quit = true;
	}else{
		quit = supplementDef(false,quit);
	}

	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
    		data.clear = true;
			data.stop = true;
			data.quit = quit;
			data.repeat = 0;
        }
    }
};

Game_Particle.SPAWN_PARAMS = ['pos','point','spawnPos','burst','ring','circle','rect'];
Game_Particle.prototype.particleUpdate = function(args){
	var id = args.shift();
	var key = args.shift();
	var targetIds = this.targetIds(id);
	var length = targetIds.length;

    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			this.tryUpdateSpawnType(key,data);

			data.params[key] = i===0 ? args : args.concat();
			data.pChanged = true;
		}
	}
};

Game_Particle.prototype.tryUpdateSpawnType = function(type,data){
	if(!Game_Particle.SPAWN_PARAMS.contains(type))return;

	var animations = data.animations;
	Game_Particle.SPAWN_PARAMS.forEach(function(spawnKey){
		if(spawnKey==='pos'||spawnKey==='point'||spawnKey==='spawnPos')return;
		
		delete data.params[spawnKey];
		if(animations){
			var length = animations.length;
		    for(var i = length-1; i>=0; i=(i-1)|0){
		        if(animations[i].key === spawnKey){
		        	animations.splice(i,1);
		        }
		    }
		}
	});
};

Game_Particle.prototype.particleAnimate = function(args){
	var id = args.shift();
	var duration = args.shift();
	var key = args.shift();

	var targetIds = this.targetIds(id);
	var length = targetIds.length;
	if(duration<=0){
		//apply particleUpdate
	    for(var i = 0; i<length; i=(i+1)|0){
	        var id = targetIds[i];
	        args.unshift(id);
	        Game_Particle.prototype.particleUpdate.call(this,args);
	        args.shift();
	    }
		return;
	}


	var coeff = 1;
	var last = args[args.length-1];
	if(typeof last === 'string'){
		if(last.indexOf('coeff:')===0){
			coeff = Number(args.pop().replace('coeff:',''));
		}else if(last.indexOf(NLC('係数:',9))===0){
			coeff = Number(args.pop().replace(NLC('係数:',10),''));
		}
	}

    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
        	this.tryUpdateSpawnType(key,data);
			if(!data.animations){
				data.animations = [];
			}
			var animation = {
				d:duration,
				key:key,
				args:i===0 ? args : args.concat(),
				coeff:coeff
			};
			data.animations.push(animation);
		}
	}
};

Game_Particle.prototype.updateAnimations = function(id,data){
	var animations = data.animations;
	var length = animations.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
        var animation = animations[i];
        animation.d -= 1;
        if(animation.d <= 0){
        	animations.splice(i,1);
        	var args = animation.args;
        	args.unshift(animation.key);
        	args.unshift(id);
        	this.particleUpdate(args);
        }
    }
};


/* exceed
===================================*/
Game_Particle.prototype.particleExceed = function(id,arg,waitEmit=false){
	var targetIds = this.targetIds(id);
	var length = targetIds.length;

	var value = Number(arg)||0;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			if(!data.exceed){
				data.exceed = {
					id:0,
					value:value,
					waitEmit:waitEmit,
				};
			}else{
				data.exceed.id = data.exceed.id+1;
				data.exceed.value = value;
				data.exceed.waitEmit = waitEmit
			}
        }
    };
};

/* loop
===================================*/
Game_Particle.prototype.particleLoop = function(id,x=48,y=x){
	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
    		if(isNaN(x)){
				data.loop = null;
			}else{
				if(!x && !y){
					data.loop = null;
				}else{
					data.loop = [Number(x),Number(y)];
				}
			}
        }
    }
};


/* filter
===================================*/
Game_Particle.prototype.particleFilter = function(args){
	var id = args.shift();
	var filterType = args.shift().toLowerCase();

	var targetIds = this.targetIds(id);
	var length = targetIds.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var id = targetIds[i];
        var data = this.dataWithId(id,true);
        if(data){
			if(CLEAR_ARGS.contains(filterType)){
				data.filters = {};
				return;
			};
			if(!FILTER.classWithType[filterType]){
				return;
			}
			if(CLEAR_ARGS.contains(args[0])){
				delete data.filters[filterType];
			}else{
				data.filters[filterType] = args;
			}

			data.fid += 1;
		}
	}
};

Game_Particle.prototype.particleEdit = function(){};
Game_Particle.prototype._particleEditWithExData = function(){};
Game_Particle.prototype._particleEdit = function(){};


Game_Particle.configData = function(data){
	return this.configDataWithName(data.name);
};
Game_Particle.configDataWithName = function(name){
	var config = $dataTrpParticles[name];
	if(config){
		if(Array.isArray(config)){
			$dataTrpParticles[name] = this.decompressConfigDataFromArray(config);
			return $dataTrpParticles[name];
		}else{
			this.migrateConfig(config);
		}
		return config;
	}

	config = $dataTrpParticlePreset[name];
	if(config){
		if(Array.isArray(config)){
			$dataTrpParticlePreset[name] = this.decompressConfigDataFromArray(config);
			return $dataTrpParticlePreset[name];
		}else{
			this.migrateConfig(config);
		}
		return config;
	}

	if(name.indexOf('/h')!==name.length-2){
		return this.configDataWithName(name+'/h');
	}

	return null;
};
Game_Particle.migrateConfig = function(config){
	// under V3: angleType > angle
	if(config.angle === undefined){
		if(config.angleType===1){
			config.angle = -1;
		}else{
			config.angle = 0;
		}
	}
};


/* maxParticles
===================================*/
Game_Particle.prototype.resetMaxParticles = function(){
	this.maxParticles = maxParticles;
};

/* cache & auto clear
===================================*/
Game_Particle.prototype.removeAll = function(){
	var keys = this._keys;
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
        var key = keys[i];
        var data = this._data[key];
        data.clear = true;
        data.quit = true;
    }
    this._keys.length = 0;
    this._data = {};
    this.truncateTagInfo();
};

Game_Particle.prototype.willSceneChange = function(){
	Game_Particle.clearDisplayObjects();

	if(this._reservedCommands){
		this._reservedCommands.length = 0;
	}

	var keys = this._keys;
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
        var key = keys[i];
        var data = this._data[key];
        if(data.type === ParticleEmitter.TARGET_TYPES.displayObject){
        	keys.splice(i,1);
        	delete data[key];
        }
    }
};


Game_Particle.prototype.willStartSceneMap = function(){
	var newMapId = $gameMap.mapId();
	if(this._lastMapId !== newMapId){
		this._lastMapId = newMapId;

		if(clearCharacterOnMapChange){
			this.removeCharacterTargetParticles();
		}
		if(clearPartyOnMapChange){
			this.removePartyTargetParticles();
		}
		if(clearScreenOnMapChange){
			this.removeScreenTargetParticles();
		}

		var events = $gameMap.events();
		var length = events.length;
	    for(var i = 0; i<length; i=(i+1)|0){
	        events[i].setupParticles();
	    }
	}
};


Game_Particle.SCREEN_TARGET_TYPES = [
	TARGET_TYPES.screen,TARGET_TYPES.weather,TARGET_TYPES.region,
];
Game_Particle.CHARACTER_TARGET_TYPES = [
	TARGET_TYPES.character,TARGET_TYPES.walk,TARGET_TYPES.startdash,TARGET_TYPES.attach
];
Game_Particle.BATTLE_SCREEN_TARGET_TYPES = [
	TARGET_TYPES.battle,TARGET_TYPES.battleWeather
];
Game_Particle.BATTLE_CHARACTER_TARGET_TYPES = [
	TARGET_TYPES.actor,TARGET_TYPES.attachActor,TARGET_TYPES.party,TARGET_TYPES.enemy,TARGET_TYPES.attachParty,TARGET_TYPES.attachEnemy
];
Game_Particle.BATTLE_ENEMY_TARGET_TYPES = [
	TARGET_TYPES.enemy,TARGET_TYPES.attachEnemy
];
Game_Particle.BATTLE_PARTY_TARGET_TYPES = [
	TARGET_TYPES.party,TARGET_TYPES.attachParty
];
Game_Particle.BATTLE_ACTOR_TARGET_TYPES = [
	TARGET_TYPES.actor,TARGET_TYPES.attachActor
];

Game_Particle.prototype.removeParticlesWithTargetTypes = function(types){
	this._removeParticlesWithTargetTypes(types,this._keys,this._data);
	this.truncateTagInfo();
};
Game_Particle.prototype._removeParticlesWithTargetTypes = function(types,keys,allData){
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
    	var key = keys[i];
        var data = allData[key];
        if(types.contains(data.targetType)){
        	if(!this.isStateTagged(key,data)){
        		keys.splice(i,1);
	        	delete allData[key];
        	}
        }
    }
};

Game_Particle.prototype.isStateTagged = function(key,data){
	if(disableState)return false;

	var info = this._tagInfo;
	if(!info)return true;

	var tags = Object.keys(info);
	var length = tags.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var tag = tags[i];
        if(tag.indexOf('state:party:')!==0)continue;

        if(info[tag].contains(key)){
        	return true;
        }
    }
	return false;
};

Game_Particle.prototype.removeScreenTargetParticles = function(){
	this.removeParticlesWithTargetTypes(Game_Particle.SCREEN_TARGET_TYPES);
};
Game_Particle.prototype.removeBattleScreenParticles = function(){
	this.removeParticlesWithTargetTypes(Game_Particle.BATTLE_SCREEN_TARGET_TYPES);
};
Game_Particle.prototype.removeBattleCharacterParticles = function(){
	this.removeParticlesWithTargetTypes(Game_Particle.BATTLE_CHARACTER_TARGET_TYPES);
};

Game_Particle.prototype.removeCharacterTargetParticles = function(){
	this._removeCharacterTargetParticles(this._keys,this._data);
	this.truncateTagInfo();
};
Game_Particle.prototype._removeCharacterTargetParticles = function(keys,allData){
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
    	var key = keys[i];
        var data = allData[key];

        var isForEvent = Game_Particle.CHARACTER_TARGET_TYPES.contains(data.targetType) && data.targetId>0;
        var isTilemap = data.targetType === TARGET_TYPES.tilemap;
        if(isForEvent || isTilemap){
        	keys.splice(i,1);
        	delete allData[key];
        }
    }
};
Game_Particle.prototype.removePartyTargetParticles = function(){
	this._removePartyTargetParticles(this._keys,this._data);
	this.truncateTagInfo();
};
Game_Particle.prototype._removePartyTargetParticles = function(keys,allData){
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
    	var key = keys[i];
        var data = allData[key];
        if(Game_Particle.CHARACTER_TARGET_TYPES.contains(data.targetType) && data.targetId<=0){
        	if(!this.isStateTagged(key,data)){
        		keys.splice(i,1);
	        	delete allData[key];
        	}
        }
    }
};

Game_Particle.prototype.clearEnemyTargetParticles = function(enemy){
	var types = Game_Particle.BATTLE_ENEMY_TARGET_TYPES
	var targetId = enemy.index()+1;
	this.clearTargetsParticles(types,targetId,this._keys,this._data);
};
Game_Particle.prototype.clearActorTargetParticles = function(actor,quit){
	if(actor.index()<0)return;

	var types = Game_Particle.BATTLE_PARTY_TARGET_TYPES;
	var targetId = actor.index()+1;
	this.clearTargetsParticles(types,targetId,this._keys,this._data,quit);

	types = Game_Particle.BATTLE_ACTOR_TARGET_TYPES;
	targetId = actor.particleTargetId();
	this.clearTargetsParticles(types,targetId,this._keys,this._data,quit);
};
Game_Particle.prototype.clearTargetsParticles = function(targetTypes,targetId,keys,allData,quit=false){
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
    	var key = keys[i];
        var data = allData[key];

        if(!targetTypes.contains(data.targetType))continue;
    	if(String(data.targetId)!==String(targetId))continue;

        allData[key].clear = true;
        allData[key].stop = true;
        if(quit){
        	allData[key].quit = true;
        }
    	keys.splice(i,1);
    	delete allData[key];
    }
    this.truncateTagInfo();
};


/* tag
===================================*/
Game_Particle.prototype.extractTagRegister = function(args){
	var tag = '';

	var length = args.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var arg = args[i];
        if(typeof arg === 'string' && arg.indexOf('tag:')===0){
        	tag = arg.replace('tag:','');
        	args.splice(i,1);
        	break;
        }
    }

    return tag;
};
Game_Particle.prototype.particleTag = function(id,tag){
	if(!this._tagInfo)this._tagInfo = {};
	id = this.idWithSuffix(id);

	var info = this._tagInfo;
	if(!info[tag]){
		info[tag] = [];
	}
	if(!info[tag].contains(id)){
		info[tag].push(id);
	}
};
Game_Particle.prototype.truncateTagInfo = function(){
	if(!this._tagInfo)return;

	var keys = Object.keys(this._tagInfo);
	var length = keys.length;
    for(var i = length-1; i>=0; i=(i-1)|0){
    	var key = keys[i];
    	var ids = this._tagInfo[key];
    	var idLen = ids.length;
	    for(var j = idLen-1; j>=0; j=(j-1)|0){
	        var id = ids[j];
	        if(!this._data[id]){
	        	ids.splice(j,1);
	        }
	    }
	    if(ids.length===0){
	    	delete this._tagInfo[key];
	    }
    }
};



/* helper&accessor
===================================*/
Game_Particle.prototype.dataWithId = function(id,noErrorLog){
	if(this._suffix){
		var suffixIdx = id.indexOf(this._suffix);
		if(suffixIdx<0 || suffixIdx!==id.length-this._suffix.length){
			id += this._suffix;
		}
	}

	var data = this._data[id]||null;
	if(!data && !noErrorLog && errorLog){
		throw new Error(LC('管理ID:%1のパーティクルは再生されてません。',11).format(id));
	}
	return data;
};
Game_Particle.prototype.data = function(){
	return this._data;
};
Game_Particle.prototype.keys = function(){
	return this._keys;
};
Game_Particle.prototype.setAutoIdSuffix = function(suffix){
	this._suffix = suffix;
};
Game_Particle.prototype.addAutoIdSuffix = function(suffix){
	this._suffix += suffix;
};
Game_Particle.prototype.removeAutoIdSuffix = function(suffix){
	var index = this._suffix.indexOf(suffix);
	this._suffix = this._suffix.substring(0,index);
};
Game_Particle.prototype.clearAutoIdSuffix = function(){
	this._suffix = '';
};

Game_Particle.TEMP_TARGET_ARRAY = [];
Game_Particle.TEMP_TARGET_TYPES_ARRAY = [];
Game_Particle.prototype.targetIds = function(idStr){
	var ret = Game_Particle.TEMP_TARGET_ARRAY;
	ret.length = 0;

	if(typeof idStr === 'number'){
		ret.push(idStr);
		return ret;
	}

	var id_lc = idStr.toLowerCase();
	if(id_lc.indexOf('group:')===0){
		idStr = 'tag:'+idStr;
		id_lc = 'tag:'+id_lc;
	}

	var types = null;
	if(id_lc.indexOf('all:')===0){
		idStr = idStr.substr(4);
		if(idStr.contains(',')){
			types = idStr.split(',');
		}else{
			types = Game_Particle.TEMP_TARGET_TYPES_ARRAY;
			types.length = 0;
			types.push(idStr);
		}
		var length = types.length;
	    for(var i = 0; i<length; i=(i+1)|0){
    		var targetType = TARGET_TYPES[types[i]];
    		if(isNaN(targetType)){
				if(errorLog){
					throw new Error(idStr + ' > '+LC('対象タイプが不正です。',12));
				}
			}else{
				this.pushIdsWithTargetType(ret,targetType);
			}
	    }
	}else if(id_lc==='all'){
		ret = this._keys;
	}else if(id_lc.indexOf('tag:')===0){
		var tagStr = idStr.substr(4);
		if(tagStr.contains(',')){
			types = tagStr.split(',');
		}else{
			types = Game_Particle.TEMP_TARGET_TYPES_ARRAY;
			types.length = 0;
			types.push(tagStr);
		}
		var length = types.length;
		if(this._tagInfo){
		    for(var i = 0; i<length; i=(i+1)|0){
		        var tag = types[i];
		        if(this._tagInfo[tag]){
		        	Array.prototype.push.apply(ret,this._tagInfo[tag]);
				}
				if(this._suffix && this._tagInfo[tag+this._suffix]){
					Array.prototype.push.apply(ret,this._tagInfo[tag+this._suffix]);
				}
		    }
		}
	}else{
		ret.push(idStr);
	}
	return ret;
};

Game_Particle.prototype.pushIdsWithTargetType = function(array,type){
	var keys = this._keys;
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = keys[i];
        var data = this._data[key];
        if(data.targetType === type){
        	array.push(key);
        }
    }
};

Game_Particle.prototype.skitPictureId = function(id){
	var actor = $gameSkit._skitActors[this._skitIds[id]];
	if(!actor)return -1;
	return actor.pictureId();
};




//=============================================================================
// ParticleSystem
//=============================================================================
ParticleSystem.cacheMapId = -1;
ParticleSystem.temporallyCacheForSceneMap = null;
ParticleSystem.temporallyCacheForGroupedScene = null;
ParticleSystem.clearCache = function(){
	this.temporallyCacheForSceneMap = null;
	this.cacheMapId = -1;
};

ParticleSystem.systemParticles = null;
ParticleSystem.systemParticleIds = null;
ParticleSystem.setupSystemParticles = function(){
	if(this.systemParticles)return;

	var particle = new Game_Particle();

	this.systemParticles = [];
	this.systemParticleIds = [];

	var length = systemParticles.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var args = systemParticles[i].split(' ');
        if(commandNames.contains(args[0])){
        	args.shift();
        }

        var command = args[0];
        var id = args[1];
        if(id){
        	particle.pluginCommand(null,args);
        	var data = particle._data[id];
        	if(!data)continue;

        	this.systemParticles.push(data);
        	this.systemParticleIds.push(id);
        }
    }

    particle._keys.length = 0;
    particle._data = {};
};

ParticleSystem.prototype.initialize = function() {
    this._emitters = {};
    this._keys = [];
    this._useCapacityLimit = false;
    this._maxParticles = 0;
    this._isCapacityLimitted = false;
    this._cached = false;

    if(displayCount){
    	this._particleCount = -1;
    	this._displayCountFrame = 15;
    	this._countSprite = null;
    	this._limitedSprite = null;
    	this.createCountSprite();
    }
};

ParticleSystem.prototype.cacheForMap = function(){
	this.prepareCache();
	ParticleSystem.temporallyCacheForSceneMap = this;
	ParticleSystem.cacheMapId = $gameMap.mapId();
};
ParticleSystem.prototype.cacheForGroupedScene = function(){
	this.prepareCache();
	ParticleSystem.temporallyCacheForGroupedScene = this;
};
ParticleSystem.prototype.prepareCache = function(){
	this._cached = true;

	if(displayCount){
		if(this._countSprite && this._countSprite.parent){
			this._countSprite.parent.removeChild(this._countSprite);
		}
		if(this._limitedSprite && this._limitedSprite.parent){
			this._limitedSprite.parent.removeChild(this._limitedSprite);	
		}
	}

	var keys = this._keys;
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var emitter = this._emitters[keys[i]];
        var container = emitter.container();
        if(emitter._targetType===TARGET_TYPES.click||emitter._targetType===TARGET_TYPES.drag){
        	emitter.cleanup();
        }else if(emitter._targetType===TARGET_TYPES.displayObject){
        	emitter.destroy();
        	delete this._emitters[keys[i]];
        	keys.splice(i,1);
        	i -= 1;
        	length -= 1;
        }
        if(container.parent){
	        container.parent.removeChild(container);
        }
    }
};

ParticleSystem.prototype.tryRestoreFromCache = function(scene){
	if(!this._cached)return;
	this._cached = false;

	var keys = this._keys;
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var emitter = this._emitters[keys[i]];
        this.addEmitterToParent(emitter,scene);
    }
};

ParticleSystem.prototype.updateForEditor = function(scene){
	this.update(scene);
};

ParticleSystem.prototype.update = function(scene){
	var emitters = this._emitters;
	var particle = $gameScreen._particle
	var particles = particle.data();
	var dataKeys = particle.keys();
	
	var changed = false;

	var length = dataKeys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = dataKeys[i];
        if(emitters[key])continue;

    	var data = particles[key];
    	if(!data || !scene.isParticleTargetTypeValid(data.targetType,data.targetId))continue;
    	if(!data.destroy){
    		changed = true;
    		var emitter = this.createParticleEmitter(key,data,scene);
    		if(!emitter._destroyed){
	        	emitters[key] = emitter;
	        	this._keys.push(key);
    		}
    	}
    }

    var systemKeys = ParticleSystem.systemParticleIds;
    var length = systemKeys.length;
    for(var i = 0; i<length; i=(i+1)|0){
    	var key = systemKeys[i];
    	if(emitters[key])continue;

        var data = ParticleSystem.systemParticles[i];
        if(!data || !scene.isParticleTargetTypeValid(data.targetType))continue;
		if(!data.destroy){
    		changed = true;
        	emitters[key] = (this.createParticleEmitter(key,data,scene));
        	this._keys.push(key);
    	}
    }

    var emitterKeys = this._keys;
    length = emitterKeys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        if(emitters[emitterKeys[i]].update()){
        	changed = true;
        }
    }

    if(this._maxParticles !== particle.maxParticles){
    	changed = true;
    	this._maxParticles = particle.maxParticles;
    	this._useCapacityLimit = this._maxParticles>0;
    	this.refreshCapacity();
    }else if(this._useCapacityLimit && changed){
		this.refreshCapacity();
    }

    for(i=length-1; i>=0; i=(i-1)|0){
    	var emitter = emitters[emitterKeys[i]];
    	emitter.updateEmitter();
    	if(emitter._destroyed){
        	changed = true;
        	delete emitters[emitterKeys[i]];
        	emitterKeys.splice(i,1);
        }
    }

    if(displayCount){
    	this._displayCountFrame -= 1
    	if(this._displayCountFrame<=0){
    		// this._displayCountFrame = 15;
    		this._displayCountFrame = 5;
    		this.refreshParticleCount();
    	}
    }
};


ParticleSystem.prototype.createParticleEmitter = function(key,data,scene){
	var emitter = new ParticleEmitter(key,data);
	if(!emitter._destroyed){
		this.addEmitterToParent(emitter,scene);
	}
	return emitter;
};

ParticleSystem.prototype.addEmitterToParent = function(emitter,scene){
	var data = emitter._data;
	var container = emitter.container();
	var z = data.z||0;

	var target,index,sprset,parent;

	switch(data.targetType){
	case TARGET_TYPES.displayObject:
		target = Game_Particle.displayObjects[data.targetId];
		if(target && target.parent){
			index = target.parent.children.indexOf(target);
			index = (index+z).clamp(0,target.parent.children.length);
			target.parent.addChildAt(container,Math.min(target.parent.children.length,index));
			if(window["Tilemap"] && target.parent instanceof Tilemap){
				container.z = target.z+z;
			}
		}
		break;
	case TARGET_TYPES.actor:
	case TARGET_TYPES.attachActor:
	case TARGET_TYPES.party:
	case TARGET_TYPES.enemy:
	case TARGET_TYPES.attachParty:
	case TARGET_TYPES.attachEnemy:
	case TARGET_TYPES.battleWeather:
		target = emitter.target();
		if(!target){
			emitter.destroy();
			return emitter;
		}
		container.z = z;
		parent = target.parent || this.battleField(scene);
		if(z<=Z_INDEX.below){
		    for(var i = 0; i<parent.children.length; i=(i+1)|0){
		        if(parent.children[i] instanceof Sprite_Battler){
		        	parent.addChildAt(container,i);
		        	break;
		        }
		    }
		}else{
			parent.addChild(container);
		}
		break;
	case TARGET_TYPES.battle:
		sprset = this.battleSpriteset(scene);
		parent = sprset.parent;
		parent.addChildAt(container,parent.children.indexOf(sprset)+1);
		break;
	case TARGET_TYPES.click:
	case TARGET_TYPES.drag:
		SceneManager._scene.addChild(container);
		break;
	case TARGET_TYPES.picture:
	case TARGET_TYPES.battlePicture:
		sprset = this.spriteset(scene);
		target = sprset._pictureContainer;
		if(keepPictureOrder){
			parent = target;
			parent.children.some(function(child){
				if(child instanceof Sprite_Picture){
					if(child._pictureId === data.targetId){
						target = child;
						return true;
					}
				}
				return false;
			});
		}else{
			parent = target.parent;
		}
		index = parent.children.indexOf(target);
		if(z<=Z_INDEX.below){
			parent.addChildAt(container,index);
		}else{
			parent.addChildAt(container,index+1);
		}
		break;
	case TARGET_TYPES.skit:
	case TARGET_TYPES.battleSkit:
		sprset = this.spriteset(scene);
		target = sprset._bustPictureContainer;
		parent = target.parent;
		index = parent.children.indexOf(target);
		if(z<=Z_INDEX.below){
			parent.addChildAt(container,index);
		}else{
			parent.addChildAt(container,index+1);
		}
		break;
	default:
		if(data.targetType<0){
			index = scene.children.indexOf(scene._windowLayer)||0;
			if(z<0){
				scene.addChildAt(container,(-z-1).clamp(0,scene.children.length));
			}else if(z===Z_INDEX.below){
				scene.addChildAt(container,index);
			}else{
				scene.addChild(container);
			}
		}
		break;
	}


	if(z===Z_INDEX.screen){
		scene.addChild(container);
	}else if(z===Z_INDEX.spriteset && this.spriteset(scene)){
		this.spriteset(scene).addChild(container);
	}else if(z===Z_INDEX.back && this.spriteset(scene)){
		var sprset = this.spriteset(scene);
		sprset._tilemap.parent.addChildAt(container,sprset._tilemap.parent.children.indexOf(sprset._tilemap));
	}else if(!container.parent){
		if(z>=0){
			container.z = z;
			var baseField = this.baseField(scene);
			if(baseField){
				baseField.addChild(container);
			}
		}else{
			var sprset = this.spriteset(scene);
			if(sprset){
				sprset.addChildAt(container,(-z+1).clamp(0,sprset.children.length));
			}else{
				scene.addChildAt(container,(-z+1).clamp(0,scene.children.length));
			}
		}
	}
	return emitter;
};

ParticleSystem.prototype.baseField = function(scene){
	if(scene instanceof Scene_Map){
		return this.spriteset(scene)._tilemap;
	}else if(this.spriteset(scene)){
		return this.spriteset(scene);
	}else{
		return null;
	}
};

ParticleSystem.prototype.spriteset = function(scene){
	return scene._spriteset;
};
ParticleSystem.prototype.battleSpriteset = function(scene){
	return scene._spriteset;
};
ParticleSystem.prototype.battleField = function(scene){
	return this.battleSpriteset(scene)._battleField;
};


ParticleSystem.prototype.createCountSprite = function(){
	var bitmap = new Bitmap(256,16);
	var sprite = new Sprite(bitmap);
	bitmap.fontSize = 14;
	bitmap.drawText(LC('パーティクル数:',13),0,0,100,16,'right');
	this._countSprite = sprite;

	//limited sprite
	bitmap = new Bitmap(128,16);
	sprite = this._limitedSprite = new Sprite(bitmap);
	sprite.visible = false;
	sprite.y = 16;
	bitmap.textColor = 'red';
	bitmap.fontSize = 14;
	bitmap.drawText(LC('最大数制限中！',14),0,0,128,16);
};

ParticleSystem.prototype.refreshParticleCount = function(){
	var emitters = this._emitters;
	var keys = this._keys;
	var length = keys.length;
	var count = 0;
    for(var i = 0; i<length; i=(i+1)|0){
        var emitter = emitters[keys[i]];
        if(emitter){
        	count += emitter.particleCount();
        }
    }

    if(this._particleCount === count)return;
    this._particleCount = count;

    var sprite = this._countSprite;
    if(!sprite)this.createCountSprite();
    if(sprite.parent !== SceneManager._scene){
	    SceneManager._scene.addChild(sprite);
    }

    var bitmap = sprite.bitmap;
    var x = 100;
    var width = bitmap.width-x;
    var height = bitmap.height;
    bitmap.clearRect(x,0,width,height);
    bitmap.drawText(count,x+1,0,width-2,height);

    if(this._isCapacityLimitted){
    	sprite = this._limitedSprite;
    	if(sprite.parent!==SceneManager._scene){
    		SceneManager._scene.addChild(sprite);
    	}
		sprite.visible = true;
    }else if(this._limitedSprite){
    	this._limitedSprite.visible = false;
    }
};

/* capacity
===================================*/
ParticleSystem.prototype.refreshCapacity = function(){
	var keys = this._keys;
	var emitters = this._emitters;
	var length = keys.length;
	var capacity = 0;

    for(var i = 0; i<length; i=(i+1)|0){
        capacity += emitters[keys[i]].particleCapacity();
    }
    var capacityRate;
    if(this._maxParticles<=0){
    	if(!this._isCapacityLimitted){
			return;
    	}
    	capacityRate = 1;
    }else if(capacity<=this._maxParticles){
    	if(this._isCapacityLimitted){
    		capacityRate = 1;
    	}else{
    		return;
    	}
    }else{
    	capacityRate = this._maxParticles/(capacity||1);
    }
    this._isCapacityLimitted = capacityRate<1;

    for(var i = 0; i<length; i=(i+1)|0){
		emitters[keys[i]].setParticleCapacity(capacityRate);
    }
};



//=============================================================================
// ParticleEmitter
//=============================================================================
ParticleEmitter.rgbWithStr = function(string){
	var values = string.match(/\((.+)\)/)[1].split(',');
	if(string.indexOf('rgba')>=0){
		return {
			r:Number(values[0]),
			g:Number(values[1]),
			b:Number(values[2]),
			a:Number(values[3])
		};
	}else{
		return {
			r:Number(values[0]),
			g:Number(values[1]),
			b:Number(values[2])
		};
	}
};

ParticleEmitter.prototype.initialize = function(id,data){
	this.initMembers();

	var config = Game_Particle.configData(data);
	var container = new PIXI.Container();
	this._container = container;
	this._id = id;
	this._data = data;
	this._config = config;
	this._image = data.image;

	this._isSceneMap = SceneManager._scene instanceof Scene_Map;
	this._tileWidth = $gameMap ? $gameMap.tileWidth() : ($dataSystem.tileSize||48);
	this._tileHeight = $gameMap ? $gameMap.tileHeight() : ($dataSystem.tileSize||48);
	this._loopXThreshold = (this._isSceneMap && $gameMap.isLoopHorizontal()) ? $dataMap.width/2*this._tileWidth : 0;
	this._loopYThreshold = (this._isSceneMap && $gameMap.isLoopVertical()) ? $dataMap.height/2*this._tileHeight : 0;
	this._characterTargetMargin = isNaN(outsideMargin) ? -1 : this._tileWidth*Number(outsideMargin);

	this.setupTarget(data);

	var image = this.imageName(data.image);
	var bitmaps = this.bitmapsWithImage(image);
	this.setupBitmaps(image,bitmaps);
};
ParticleEmitter.prototype.setupBitmaps = function(image,bitmaps){
    var length = bitmaps.length;
    for(var i = 0; i<length; i=(i+1)|0){
        bitmaps[i].addLoadListener(ParticleEmitter.prototype.tryStart.bind(this,image,bitmaps));
    }
};

ParticleEmitter.prototype.initMembers = function(){
	this._container = null;
	this._data = null;
	this._image = null;
	this._id = null;

	this._started = false;
	this._isSceneMap = true;
	this._freezed = false;
	this._lastFreezed = false;

	this._targetType = 0;
	this._target = null;
	this._targetId = -1;
	this._isCharacterTarget = false;
	this._characterTargetMargin = isNaN(outsideMargin) ? -1 : 48*Number(outsideMargin);

	this._fid = -1;
	this._filterArgs = {};
	this._filterKeys = [];

	this._exceedId = -1;

	this._emitter = null;
	this._destroyed = false;
	this._stop = false;
	this._restartCount = 0;

	this._x = 0;
	this._y = 0;
	this._dispX = 0;
	this._dispY = 0;
	this._loopXThreshold = 0;
	this._loopYThreshold = 0;
	this._followScroll = false;
	this._scrollXRate = 1.0;
	this._scrollYRate = 1.0;
	this._updatePos = false;
	this._isWeather = false;
};

ParticleEmitter.prototype.paramWithRate = function(target,current,rate){
	if(rate===1)return target;
	return current + (target-current)*rate;
};

ParticleEmitter.prototype.target = function(){
	return this._target;
};

ParticleEmitter.prototype.bitmapsWithImage = function(imageStr){
	var images = imageStr.split(',');
	var length = images.length;
	var bitmaps = [];
	var bitmap;
    for(var i = 0; i<length; i=(i+1)|0){
    	var image = images[i];
    	if(image.indexOf('tile:')===0){
    		// var bitmapIndex = Number(image.match(/tile:(\d+?):/)[1]);
    		// bitmap = SceneManager._scene._spriteset._tilemap.bitmaps[bitmapIndex];

    		var tilesetImage = image.match(/tile:(.+?):/)[1];
    		bitmap = ImageManager.loadTileset(tilesetImage);
    	}else if(image.indexOf('ANIM:')===0){
    		if(this.hasSplitAnimationImage(image)){
    			bitmap = ImageManager.loadParticle(this.splitAnimationImage(image));
    		}else{
    			bitmap = ImageManager.loadAnimation(image.match(/ANIM:(.+?):/)[1]);
    		}
    	}else{
    		bitmap = ImageManager.loadParticle(image);
    	}
        bitmaps.push(bitmap);
    }
	return bitmaps;
};
ParticleEmitter.prototype.splitAnimationImage = function(image){
	return '_'+image.replace(/:/gi,'_');
};
ParticleEmitter.prototype.hasSplitAnimationImage = function(image){
	var params = PluginManager._parameters.trp_particlemz_list;
	if(!params||!params.animImages)return false;
	if(image.indexOf('_ANIM')!==0){
		image = this.splitAnimationImage(image);
	}
	return params.animImages.contains(image);
};

ParticleEmitter.prototype.setupTarget = function(data){
	var type = data.targetType;
	var id = data.targetId;

	var target = null;
	var followScroll = false;
	var updatePos = false;
	var isWeather = false;
	switch(type){
	case TARGET_TYPES.displayObject:
		updatePos = true;
		target = {
			x:data.x,
			y:data.y
		}
		break;

	case TARGET_TYPES.walk:
		this._data.ex.frequency = this._config.frequency;
	case TARGET_TYPES.startdash:
	case TARGET_TYPES.character:
		followScroll = true;
	case TARGET_TYPES.attach:
		updatePos = true;
		if(id === 0){
			target = $gamePlayer;
		}else if(id<0){
			target = $gamePlayer._followers.follower(id*-1-1);
			if(!target || !target.actor()){
				target = null;
			}
		}else{
			target = $gameMap.event(id);
		}
		break;
	case TARGET_TYPES.screen:
		target = {
			x:Graphics.width/2,
			y:Graphics.height/2
		};
		break;
	case TARGET_TYPES.tilemap:
		followScroll = true;
		updatePos = true;
		target = {
			x:data.x,
			y:data.y
		};
		break;
	case TARGET_TYPES.weather:
		followScroll = true;
		updatePos = false;
		isWeather = true;
		target = {
			x:Graphics.width/2,
			y:Graphics.height/2 
		};
		if(data.ex){
			this._scrollXRate = data.ex.px;
			this._scrollYRate = data.ex.py;
		}
		break;
	case TARGET_TYPES.actor:
	case TARGET_TYPES.attachActor:
		updatePos = true;
		var battler = $gameActors.actor(id);
		target = this._actorSpriteTarget(battler);
		this._data.ex = {
			index:battler.index(),
		};

		break;
	case TARGET_TYPES.party:
	case TARGET_TYPES.attachParty:
		updatePos = true;
		target = this._actorSpriteTarget($gameParty.members()[id-1]);
		break;
	case TARGET_TYPES.enemy:
	case TARGET_TYPES.attachEnemy:
		updatePos = true;
		target = this._enemySpriteTarget($gameTroop.members()[id-1]);
		break;
	case TARGET_TYPES.battle:
	case TARGET_TYPES.battleWeather:
		target = {
			x:Graphics.width/2,
			y:Graphics.height/2
		};
		break;
	case TARGET_TYPES.region:
		followScroll = true;
		target = [];
		this._data.ex.frequency = this._config.frequency;
		this._data.ex.maxParticles = this._config.maxParticles;
		this._data.ex.particlesPerWave = this._config.particlesPerWave;
		this._data.ex.allPos = this.positionsWithRegionIds(id);
		this._data.ex.lastX = -1;
		this._data.ex.lastY = -1;
		break;
	case TARGET_TYPES.click:
	case TARGET_TYPES.drag:
		break;
	case TARGET_TYPES.picture:
	case TARGET_TYPES.battlePicture:
		updatePos = true;
		target = id;
		break;
	case TARGET_TYPES.skit:
	case TARGET_TYPES.battleSkit:
		updatePos = true;
		target = id;
		break;
	default:
		if(type<-1){
			target = {
				x:Graphics.width/2,
				y:Graphics.height/2
			};
		}
	}

	this._targetType = type;
	this._target = target;
	this._targetId = id;
	this._followScroll = followScroll;
	this._updatePos = updatePos;
	this._isWeather = isWeather;

	this._isCharacterTarget = Game_Particle.CHARACTER_TARGET_TYPES.contains(type);
	if(this._isCharacterTarget && target){
		if(target instanceof Game_Event){
			if(target.event().meta.pMargin !== undefined){
				this._characterTargetMargin = this._tileWidth*Number(target.event().meta.pMargin);
			}
		}
	}
};

ParticleEmitter.prototype._enemySpriteTarget = function(target){
	var sprites = SceneManager._scene._spriteset._enemySprites;
    return this._battlerSpriteTarget(target,sprites);
};

ParticleEmitter.prototype._actorSpriteTarget = function(target){
    var sprites = SceneManager._scene._spriteset._actorSprites;
	return this._battlerSpriteTarget(target,sprites);
};
ParticleEmitter.prototype._battlerSpriteTarget = function(target,sprites){
	var length = sprites.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var sprite = sprites[i];
        if(sprite && sprite._battler === target){
        	return sprite;
        }
    }
    return null;
};

ParticleEmitter.prototype.positionsWithRegionIds = function(regionIdStr){
	var regionIds = regionIdStr.split(',');
	var length = regionIds.length;
	var positions = [];
    for(var i = 0; i<length; i=(i+1)|0){
        regionIds[i] = Number(regionIds[i]);
    }

    var width = $dataMap.width;
    var height = $dataMap.height;
    var zIdx = 5 * height;
    for(var y=0; y<height; y=(y+1)|0){
    	var yIdx = (zIdx + y)*width;
    	for(var x=0; x<width; x=(x+1)|0){
    		var idx = yIdx + x;
    		var regionId = $dataMap.data[idx];
    		if(regionIds.indexOf(regionId)>=0){
    			positions.push(x);
    			positions.push(y);
    		}
    	}
    }
    return positions;
};

ParticleEmitter.prototype.tryDestroy = function(force=false){
	this.destroy(force);
};

ParticleEmitter.prototype.destroy = function(force){
	if(this._destroyed)return;
	this._destroyed = true;
	this._data.destroy = true;

	this._data = null;
	this._target = null;

	if(this._emitter){
		this._emitter.emit = false;
		this._emitter.destroy();
		this._emitter = null;
	}

	if(this._container.parent){
		this._container.parent.removeChild(this._container);
	}
	this._container = null;
};

/* util interface
===================================*/
ParticleEmitter.prototype.setParticleCapacity = function(value){
	if(this._freezed)return;
	if(this._targetType===TARGET_TYPES.click||this._targetType===TARGET_TYPES.drag){
		return;
	}
	if(this._emitter){
		this._emitter.capacityRate = value;
	}
};
ParticleEmitter.prototype.particleCapacity = function(){
	if(this._freezed){
		return 0;
	}
	if(this._targetType===TARGET_TYPES.click||this._targetType===TARGET_TYPES.drag){
		return 0;
	}

	var emitter = this._emitter;
	if(!emitter) return 0;

	return emitter.particleCapacity();
};

/* start
===================================*/
ParticleEmitter.prototype.tryStart = function(image,bitmaps){
	if(this._started)return;

	var length = bitmaps.length;
    for(var i = 0; i<length; i=(i+1)|0){
    	if(!bitmaps[i].isReady())return;
    }
    this.start(image,bitmaps);
};
ParticleEmitter.prototype.particleConstructor = function(){
	return TRP_Particle;
};
ParticleEmitter.prototype.emitterConstructor = function(){
	return TRP_Emitter;
};

ParticleEmitter.prototype.start = function(image,bitmaps){
	if(this._destroyed)return;
	if(this._started)return;

	this._started = true;
	var data = this._data;
	var container = this._container;

	var config = this._config;
	var textures = this._texturesWithBitmaps(image,bitmaps);

	var emitterConstructor = this.emitterConstructor();
	var emitter = new emitterConstructor(container,textures,config);
    this._emitter = emitter;

    emitter.particleConstructor = this.particleConstructor();

    if(this._targetType!==TARGET_TYPES.click&&this._targetType!==TARGET_TYPES.drag){
		emitter.emit = true;
	}else{
		emitter.emit = false;
	}
    
    if(this._targetType === TARGET_TYPES.region){
    	emitter._spawnFunc = emitter._spawnRegion.bind(emitter,this._target);
    }
    this.updateParams(data);

    if(this._isWeather ||
    	(!this._updatePos && !this._followScroll))
    {
    	if(this._target){
	    	container.x = this._target.x;
	    	container.y = this._target.y;
    	}
    }else{
		this.updatePosition();
    }
};



ParticleEmitter.prototype._texturesWithBitmaps = function(imageStr,bitmaps){
	var hasTile = imageStr.contains('tile:');
	var hasAnimation = imageStr.contains('ANIM:');
	var images = null;
	if(hasTile||hasAnimation){
		images = imageStr.split(',');
	}

	var config = this._config;
	var frames = config.frames;

	var textures = [];
	var length = bitmaps.length;
    for(var i = 0; i<length; i=(i+1)|0){
    	var bitmap = bitmaps[i];
    	var frameData = frames ? (frames[i]||null) : null;
    	var frame = null;
    	if(frameData){
    		frame = new Rectangle(frameData[0],frameData[1],frameData[2],frameData[3]);
    	}else if(hasTile){
    		var image = images[i];
    		if(image.indexOf('tile:')===0){
	    		frame = this.frameForTileIndex(Number(image.split(':')[2]));
    		}
    	}else if(hasAnimation && !this.hasSplitAnimationImage(images[i])){
    		var image = images[i];
    		if(image.indexOf('ANIM:')===0){
	    		frame = this.frameForAnimationIndex(Number(image.split(':')[2]));
    		}
    	}
    	if(frame){
    		frame.x = frame.x.clamp(0,bitmap.width);
    		frame.width = frame.width.clamp(0,bitmap.width-frame.x);
    		frame.y = frame.y.clamp(0,bitmap.height);
    		frame.height = frame.height.clamp(0,bitmap.height-frame.y);
    	}
    	var texture = new PIXI.Texture(bitmap.baseTexture,frame);
        textures.push(texture);
    }
    return textures;
};

ParticleEmitter.TILESET_COLUMNS = 16;
ParticleEmitter.prototype.frameForTileIndex = function(tileIndex){
	var cols = ParticleEmitter.TILESET_COLUMNS;
	var col = tileIndex%cols;
	var row = Math.floor(tileIndex/cols);
	return new Rectangle(this._tileWidth*col,this._tileHeight*row,this._tileWidth,this._tileHeight);
};
ParticleEmitter.ANIMATION_SIZE = 192;
ParticleEmitter.ANIMATION_COLUMNS = 5;
ParticleEmitter.prototype.frameForAnimationIndex = function(index){
	var frameSize = ParticleEmitter.ANIMATION_SIZE;
	var cols = ParticleEmitter.ANIMATION_COLUMNS;
	var col = index%cols;
	var row = Math.floor(index/cols);
	return new Rectangle(frameSize*col,frameSize*row,frameSize,frameSize);
};

ParticleEmitter.prototype.cleanup = function(){
	if(!this._emitter)return;
	this._emitter.emit = false;
	this._emitter.cleanup();
};

/* update
===================================*/
ParticleEmitter.prototype.particleCount = function(subId=''){
	if(this._freezed || !this._emitter)return 0;
	if(subId){
		return this.subEmitter(subId).particleTotalCount();
	}else{
		return this._emitter.particleTotalCount();
	}
};
ParticleEmitter.prototype.update = function(){
	var changed = false;

	var emitter = this._emitter;
	if(!emitter || this._destroyed)return changed;

	var data = this._data;
	if(this._stop !== data.stop){
		this._stop = data.stop;
		if(this._targetType!==TARGET_TYPES.click&&this._targetType!==TARGET_TYPES.drag){
			emitter.emit = !this._stop;
		}
		changed = true;
	}


	if((this._targetType===TARGET_TYPES.click && TouchInput.isTriggered())
		|| (this._targetType===TARGET_TYPES.drag&&TouchInput.isPressed()))
	{
		this._stop = false;
		if(TouchInput.isTriggered()){
			emitter.resetPositionTracking();
			if(this._targetType===TARGET_TYPES.click){
				emitter.emit = true;
			}
		}else if(this._targetType===TARGET_TYPES.drag){
			emitter.emit = (emitter.ownerPos.x!==TouchInput.x || emitter.ownerPos.y!==TouchInput.y);
		}
		emitter.updateOwnerPos(TouchInput.x,TouchInput.y);
		this._container.parent.addChild(this._container);
    }

	if(!this._stop){
		if(this._targetType===TARGET_TYPES.region){
	    	if(this.updateForRegion(false)){
	    		changed = true;
	    	}
		}
		if(!this._freezed && data.exceed && data.exceed.id!==this._exceedId){
			if(!data.waitEmit || (this._emitter._poolFirst || this._emitter._activeParticlesFirst)){
				this._emitter.update(data.exceed.value);
				this._exceedId = data.exceed.id;
			}
		}

		if(data.animations){
			this.updateAnimations(data);
			changed = true;
		}
		if(data.pChanged){
			this.updateParams(data);
			data.pChanged = false;
			changed = true;
		}
		if(this._fid !== data.fid){
			this.updateFilters(data);
			changed = true;
		}

		if(this._image !== data.image){
			this._image = data.image;
			this.changeImage(data.image);
		}

		switch(this._targetType){
		case TARGET_TYPES.walk:
			if(this.updateForWalk()){
				changed = true;
			}
			break;
		case TARGET_TYPES.startdash:
			if(this.updateForStartDash()){
				changed = true;
			}
	    	break;
	    default:
	    	if(data.loop){
		    	this.loopParticles(data.loop[0],data.loop[1]);
		    }
		};
	}

	if(this._lastFreezed !== this._freezed){
    	changed = true;
    	this._lastFreezed = this._freezed;
    }

	return changed;
};

ParticleEmitter.prototype.updateDeltaTime = function(){
	return ParticleEmitter.DELTA_TIME;
};
ParticleEmitter.prototype.updateEmitter = function(){
	var emitter = this._emitter;
	if(!emitter || this._destroyed)return;

	if(this._data.quit){
		this.tryDestroy(true);
		return;
	}
	if(this._stop && emitter.particleTotalCount()===0){
		if(this._data.clear && emitter._emitterLife<=0){
			this.tryDestroy(false);
		}
		return;
	}

	//update position
	if(this._followScroll||this._updatePos){
		this.updatePosition();
		if(this._destroyed)return;
	}

	if(this._freezed){
		return;	
	}

	var dt = this.updateDeltaTime();
	this._updateEmitter(dt);
};

ParticleEmitter.prototype._updateEmitter = function(dt){
	var emitter = this._emitter;
	if(dt!==0){
		emitter.update(dt);
	}

	if(!emitter.emit && emitter.particleTotalCount()===0){ 
		if(!this.isEmitByOriginalTrigger()){
			if(this._restartCount>0){
				this._restartCount -= 1;
				if(this._restartCount <= 0){
					this._restartCount = 0;
					this._emitter.emit = true;
					this._stop = false;
					this._data.stop = false;
				}
			}else if(this._data.repeat>0){
				emitter.emit = false;
				this._restartCount = this._data.repeat;
			}
			if(!emitter.emit && this._restartCount<=0){
				if(this._data.clear){
					this.tryDestroy();
				}else{
					this._stop = this._data.stop = true;
				}
			}
		}else{
			if(this._data.clear){
				this.tryDestroy();
			}
		}
	}
};

ParticleEmitter.prototype.changeImage = function(image,emitter=this._emitter){
	image = this.imageName(image);
	var bitmaps = this.bitmapsWithImage(image);
    var length = bitmaps.length;
    for(var i = 0; i<length; i=(i+1)|0){
        bitmaps[i].addLoadListener(ParticleEmitter.prototype._tryChangeImage.bind(this,image,bitmaps,emitter));
    }
};
ParticleEmitter.prototype._tryChangeImage = function(image,bitmaps,emitter=this._emitter){
	var length = bitmaps.length;
    for(var i = 0; i<length; i=(i+1)|0){
        if(!bitmaps[i].isReady())return;
    }
    this._changeImage(image,bitmaps,emitter);
};
ParticleEmitter.prototype._changeImage = function(image,bitmaps,emitter=this._emitter){
	emitter.particleImages = this._texturesWithBitmaps(image,bitmaps);
};


ParticleEmitter.prototype.updatePosition = function(){
	var scrolled = false;
	if(this._followScroll){
		scrolled = this._updateFollowScroll();
	}

	if(this._isWeather)return;

	if(this._updatePos){
		this._updatePosition(scrolled);
	}
};

ParticleEmitter.prototype._updateFollowScroll = function(){
	var scrolled = false;
	var dispX = 0;
	var dispY = 0;
	if(this._isSceneMap){
		dispX = $gameMap._displayX*this._tileWidth;
		dispY = $gameMap._displayY*this._tileHeight;
	}
	if(this._dispX !== dispX || this._dispY !== dispY){
		scrolled = true;
		var dx = (dispX-this._dispX)*this._scrollXRate;
		var dy = (dispY-this._dispY)*this._scrollYRate;
		if(this._loopXThreshold>0){
			if(dx>this._loopXThreshold){
				this._emitter.shiftParticlePosX($dataMap.width*this._tileWidth)
				this._emitter.resetPositionTracking();
			}else if(dx<-this._loopXThreshold){
				this._emitter.shiftParticlePosX(-$dataMap.width*this._tileWidth)
				this._emitter.resetPositionTracking();
			}
		}
		if(this._loopYThreshold){
			if(dy>this._loopYThreshold){
				this._emitter.shiftParticlePosY($dataMap.height*this._tileHeight)
				this._emitter.resetPositionTracking();
			}else if(dy<-this._loopYThreshold){
				this._emitter.shiftParticlePosY(-$dataMap.height*this._tileHeight)
				this._emitter.resetPositionTracking();
			}
		}
		this._container.x -= dx;
		this._container.y -= dy;

		this._dispX = dispX;
		this._dispY = dispY;

		if(this._isWeather){
			this._x += dx;
			this._y += dy;
			this._emitter.updateOwnerPos(this._x,this._y);
		}
	}
	return scrolled;
};

ParticleEmitter.prototype._updatePosition = function(scrolled){
	var x,y;
	var target = this._target;
	switch(this._targetType){
	case TARGET_TYPES.displayObject:
		target = Game_Particle.displayObjects[this._targetId];
		if(!target || !target.parent){
			this.destroy();
			return;
		}else{
			x = target.x;
			y = target.y;
		}
		break;
	case TARGET_TYPES.character:
		if(!target){
			this.destroy();
			return;
		}
		x = target.screenX();
		y = target.screenY();
		this.updateCharacterOutsideFreeze(x,y);
		break;
	case TARGET_TYPES.walk:
		if(!target){
			this.destroy();
			return;
		}
		if(!this._emitter.emit)return;
		x = target.screenX();
		y = target.screenY();
		this.updateCharacterOutsideFreeze(x,y);

		switch(target._direction){
		case 2: y+=walkOffset; break;
		case 4: x-=walkOffset; break;
		case 6: x+=walkOffset; break;
		case 8: y-=walkOffset; break;
		}
		break;
	case TARGET_TYPES.startdash:
		if(!target){
			this.destroy();
			return;
		}
		if(!this._emitter.emit)return;
		x = target.screenX();
		y = target.screenY();
		this.updateCharacterOutsideFreeze(x,y);

		switch(target._direction){
		case 2: y+=dashOffset; break;
		case 4: x-=dashOffset; break;
		case 6: x+=dashOffset; break;
		case 8: y-=dashOffset; break;
		}
		break;
	case TARGET_TYPES.attach:
		if(!target){
			this.destroy();
			return;
		}
		x = target.screenX();
		y = target.screenY();
		this._container.x = x;
		this._container.y = y;
		this.updateCharacterOutsideFreeze(x,y);

		return;
	case TARGET_TYPES.tilemap:
		if(scrolled){
			x = Math.round($gameMap.adjustX(target.x)*this._tileWidth+24);
			y = Math.round($gameMap.adjustY(target.y)*this._tileHeight+24);
		}else{
			x = this._x;
			y = this._y;
		}
		break;
	case TARGET_TYPES.actor:
		if(this._data.ex.index !== $gameActors.actor(this._targetId).index()){
			this._data.ex.index = $gameActors.actor(this._targetId).index();
			target = this._target = this._actorSpriteTarget($gameActors.actor(this._targetId));
		}
	case TARGET_TYPES.party:
	case TARGET_TYPES.enemy:
		if(!target){
			this.destroy();
			return;
		}
		x = target.x;
		y = target.y - this.battlerSpriteHeight(target)/2;
		break;
	case TARGET_TYPES.attachActor:
		if(this._data.ex.index !== $gameActors.actor(this._targetId).index()){
			this._data.ex.index = $gameActors.actor(this._targetId).index();
			target = this._target = this._actorSpriteTarget($gameActors.actor(this._targetId));
		}
	case TARGET_TYPES.attachParty:
	case TARGET_TYPES.attachEnemy:
		if(!target){
			this.destroy();
			return;
		}
		x = target.x;
		y = target.y - this.battlerSpriteHeight(target)/2;
		this._container.x = x;
		this._container.y = y;
		return;
	case TARGET_TYPES.picture:
	case TARGET_TYPES.battlePicture:
		target = $gameScreen.picture(target);
		if(!target){
			this.destroy();
			return;
		}
		x = target.x();
		y = target.y();
		break;
	case TARGET_TYPES.skit:
	case TARGET_TYPES.battleSkit:
		target = $gameScreen.picture($gameScreen._particle.skitPictureId(target));
		if(!target){
			this.destroy();
			return;
		}
		x = target.x();
		y = target.y();
		break;
	default:
		if(this._target){
			this._container.x = target.x;
			this._container.y = target.y;
		}
	};

	if(scrolled || (this._x!==x ||this._y!==y)){
		this._applyPosition(x,y);
	}
}

ParticleEmitter.prototype._applyPosition = function(x,y){
	x += this._dispX;
	y += this._dispY;
	this._x = x;
	this._y = y;
	this._emitter.updateOwnerPos(x,y);
};



ParticleEmitter.prototype.battlerSpriteHeight = function(sprite){
	var targetSprite = sprite._mainSprite||sprite;
	return targetSprite.height * targetSprite.scale.y;
};


ParticleEmitter.prototype.updateAnimations = function(data){
	var animations = data.animations;
	var length = animations.length;
    for(var i = 0; i<length; i=(i+1)|0){
        this._updateAnimation(animations[i]);
    }
};

ParticleEmitter.prototype._updateAnimation = function(animation){
	var coeff = animation.coeff;
	var rate = coeff === 1 ? 1/animation.d : 1/Math.pow(animation.d,coeff);
	this._updateParam(animation.key,animation.args,rate);
};

ParticleEmitter.prototype.updateParams = function(data,emitter=this._emitter){
	var params = data.params;

	var keys = Object.keys(params);
	var length = keys.length;
    for(var i = 0; i<length; i=(i+1)|0){
        var key = keys[i];
        this._updateParam(key,params[key],1,emitter);
    }
};

ParticleEmitter.prototype._updateParam = function(key,args,rate,emitter=this._emitter){
	rate = rate || 1;

	emitter = emitter || this._emitter;

	if(ParticleEmitter.NODE_PARAMS.contains(key)){
		this._updateNodeParam(emitter,key,args,rate);
	}else{
		this._updateNormalParam(emitter,key,args,rate);
	}
};

ParticleEmitter.prototype._updateNodeParam = function(emitter,key,args,rate){
	var list,node,data;

	var isUpdate = rate===1;
	key = ParticleEmitter.NODE_KEY_CONVERT[key]||key;
	if(isUpdate){
		list = [];
		data = {list:list};
	}
	if(!isUpdate){
		node = emitter[key];
	}
	var isColor = key==='color'||key==='startColor';
	var length = args.length;
	var time;
    for(var i = 0; i<length; i=(i+1)|0){
    	var elems = args[i].split('@');
    	if(elems.length>=2){
    		time = Number(elems[1]);
    	}else if(i===0){
    		time = 0;
    	}else{
    		time = 1;
    	}
    	var value;
    	if(isColor){
    		if(elems[0][0]==='#'){
    			value = PIXI.particles.ParticleUtils.hexToRGB(elems[0]);
    		}else{
    			value = ParticleEmitter.rgbWithStr(elems[0]);
    		}
    		if(!isUpdate){
    			value.r = Math.floor(this.paramWithRate(value.r,node.value.r,rate));
    			value.g = Math.floor(this.paramWithRate(value.g,node.value.g,rate));
    			value.b = Math.floor(this.paramWithRate(value.g,node.value.g,rate));
    		}
    	}else{
    		if(isUpdate){
    			value = Number(elems[0]);
    		}else{
	    		value = this.paramWithRate(Number(elems[0]),node.value,rate);
    		}
    	}
    	if(isUpdate){
	        list.push({
	        	time:time,
	        	value:value
	        });
    	}else{
    		node.value = value;
    		node = node.next;
    	}
    }
    if(isUpdate){
	    emitter[key] = PIXI.particles.PropertyNode.createList(data);
    }
};
ParticleEmitter.prototype._updateNormalParam = function(emitter,key,args,rate){
	var value = Number(args[0]);
	var value2 = args[1]===undefined ? value : Number(args[1]);
	switch(key){
	case 'acceleration':
		if(value||value2){
			emitter.acceleration.x = this.paramWithRate(value||0,emitter.acceleration.x,rate);
			emitter.acceleration.y = this.paramWithRate(value2||0,emitter.acceleration.y,rate);
			// emitter.startSpeed.next = null;

			// if(args[2]){
			// 	emitter.maxSpeed = this.paramWithRate(args[2]||0,emitter.maxSpeed,rate);
			// }else{
			// 	emitter.maxSpeed = emitter.maxSpeed||NaN;
			// }
		}else{
			emitter.acceleration.x = this.paramWithRate(value||0,emitter.acceleration.x,rate);
			emitter.acceleration.y = this.paramWithRate(value2||0,emitter.acceleration.y,rate);
		}
		break;
	// case 'maxSpeed':
	// 	if(args[0]==='NaN'){
	// 		emitter.maxSpeed = NaN;
	// 	}else{
	// 		emitter.maxSpeed = this.paramWithRate(value,emitter.maxSpeed,rate);
	// 	}
	// 	break;
	case 'startRotation':
		emitter.minStartRotation = this.paramWithRate(value,emitter.minStartRotation,rate);
		emitter.maxStartRotation = this.paramWithRate(value2,emitter.maxStartRotation,rate);
		break;
	case 'rotationSpeed':
		emitter.minRotationSpeed = this.paramWithRate(value,emitter.minRotationSpeed,rate);
		emitter.maxRotationSpeed = this.paramWithRate(value2,emitter.maxRotationSpeed,rate);
		break;
	case 'imageOption':
		emitter.angle = this.paramWithRate(value,emitter.angle,rate);
		emitter.mirrorType = this.paramWithRate(value2,emitter.mirrorType,rate);
		break;
	case 'lifetime':
		emitter.minLifetime = this.paramWithRate(value,emitter.minLifetime,rate);
		emitter.maxLifetime = this.paramWithRate(value2,emitter.maxLifetime,rate);
		break;
	case 'blendMode':
		if(isNaN(args[0])){
			emitter.particleBlendMode = PIXI.BLEND_MODES[args[0].toUpperCase()]||0;
		}else{
			emitter.particleBlendMode = value;
		}
		emitter.particleBlendMode = emitter.particleBlendMode.clamp(0,10);
		break;
	case 'rect': //x,y,w,h
		if(this._targetType===TARGET_TYPES.region){
			return;
		}
		emitter.spawnType = 'rect';
		emitter._spawnFunc = emitter._spawnRect;
		if(!emitter.spawnRect)emitter.spawnRect = new PIXI.Rectangle(0,0,0,0);

		emitter.spawnRect.x = this.paramWithRate(value,emitter.spawnRect.x,rate);
		emitter.spawnRect.y = this.paramWithRate(value2,emitter.spawnRect.y,rate);
		emitter.spawnRect.width = this.paramWithRate(Number(args[2]),emitter.spawnRect.width,rate);
		emitter.spawnRect.height = this.paramWithRate(Number(args[3]),emitter.spawnRect.height,rate);
		// emitter.spawnRect = new PIXI.Rectangle(value,value2,Number(args[2]),Number(args[3]));
		break;
	case 'circle': //x,y,r
		if(this._targetType===TARGET_TYPES.region){
			return;
		}
        emitter.spawnType = 'circle';
        emitter._spawnFunc = emitter._spawnCircle;
        if(!emitter.spawnCircle)emitter.spawnCircle = new PIXI.Circle(0,0,1);
        emitter.spawnCircle.x = this.paramWithRate(value,emitter.spawnCircle.x,rate);
        emitter.spawnCircle.y = this.paramWithRate(value2,emitter.spawnCircle.y,rate);
        emitter.spawnCircle.radius = this.paramWithRate(Number(args[2]),emitter.spawnCircle.radius,rate);
        // emitter.spawnCircle = new PIXI.Circle(value, value2, Number(args[2]));
        break;
    case 'ring': //x,y,r,minR
	    if(this._targetType===TARGET_TYPES.region){
			return;
		}
        emitter.spawnType = 'ring';
        emitter._spawnFunc = emitter._spawnRing;
        if(!emitter.spawnCircle)emitter.spawnCircle = new PIXI.Circle(0,0,1);
        emitter.spawnCircle.x = this.paramWithRate(value,emitter.spawnCircle.x,rate);
        emitter.spawnCircle.y = this.paramWithRate(value2,emitter.spawnCircle.y,rate);
        emitter.spawnCircle.radius = this.paramWithRate(Number(args[2]),emitter.spawnCircle.radius,rate);
        emitter.spawnCircle.minRadius = this.paramWithRate(Number(args[3]),emitter.spawnCircle.minRadius||0,rate);
        break;
    case 'burst':
	    if(this._targetType===TARGET_TYPES.region){
			return;
		}
        emitter.spawnType = 'burst';
        emitter._spawnFunc = emitter._spawnBurst;
        emitter.particleSpacing = this.paramWithRate(value,emitter.particleSpacing,rate);
        emitter.angleStart = this.paramWithRate(value2,emitter.angleStart,rate);
        emitter.bdt = this.paramWithRate(Number(args[2]||0),emitter.bdt,rate);
        emitter.brt = this.paramWithRate(Number(args[3]||0),emitter.brt,rate);
        emitter.br = this.paramWithRate(Number(args[4]||0),emitter.br,rate);
        emitter.bdr = this.paramWithRate(Number(args[5]||0),emitter.bdr,rate);
        emitter.bdx = this.paramWithRate(Number(args[6]||0),emitter.bdx,rate);
        emitter.bdy = this.paramWithRate(Number(args[7]||0),emitter.bdy,rate);
        break;
    case 'point':
	    if(this._targetType===TARGET_TYPES.region){
			return;
		}
    	emitter.spawnType = 'point';
        emitter._spawnFunc = emitter._spawnPoint;
    case 'position':
    case 'pos':
    case 'spawnPos':
        if(args[0]!==undefined){
        	emitter.spawnPos.x = this.paramWithRate(value,emitter.spawnPos.x,rate);
        	emitter.spawnPos.y = this.paramWithRate(value2,emitter.spawnPos.y,rate);
        }
        break;

   	case 'fluctuation':
	   	emitter.fluc = this.paramWithRate(value,emitter.fluc,rate);
	   	emitter.flucSense = this.paramWithRate(value2,emitter.flucSense,rate);
   		break;
	case 'minimumSpeedMultiplier':
		emitter.minimumSpeedMultiplier = value;
		break;
	case 'minimumScaleMultiplier':
		emitter.minimumScaleMultiplier = value;
		break;
	case 'rotationAcceleration':
		emitter.rotationAcceleration = this.paramWithRate(value,emitter.rotationAcceleration,rate);
		break;
	case 'particlesPerWave':
		if(this._targetType === TARGET_TYPES.region){
			this._data.ex.particlesPerWave = this.paramWithRate(value,emitter.particlesPerWave,rate)||1;
			this.updateForRegion(true);
		}else{
			emitter.setParticlesPerWaveToApplyCapacity(Math.round(this.paramWithRate(value,emitter.particlesPerWave,rate))||1);
		}
		break;
	case 'frequency':
		if(this._targetType === TARGET_TYPES.region){
			this._data.ex.frequency = this.paramWithRate(value,emitter.frequency,rate);
			this.updateForRegion(true);
		}else if(this._targetType === TARGET_TYPES.walk){
			this._data.ex.frequency = this.paramWithRate(value,emitter.frequency,rate);
		}else{
			emitter.setFrequencyToApplyCapacity(this.paramWithRate(value,emitter.frequency,rate));
		}
		break;
	case 'spawnChance':
		emitter.spawnChance = this.paramWithRate(value,emitter.spawnChance,rate)||1;
		break;
	case 'emitterLifetime':
		emitter.emitterLifetime = this.paramWithRate(value,emitter.emitterLifetime,rate);
		emitter._emitterLife = emitter.emitterLifetime;
		break;
	case 'maxParticles':
		if(this._targetType === TARGET_TYPES.region){
			this._data.ex.maxParticles = this.paramWithRate(value,emitter.maxParticles,rate);
			this.updateForRegion(true);
		}else{
			emitter.setMaxParticlesToApplyCapacity(Math.round(this.paramWithRate(value,emitter.maxParticles,rate)));
		}
		break;
	case 'colorMode':
		emitter.colorDistribution = value!==0;
		break;
	default:
		console.log('no param with key:',key,args);
		return;
	}
};

/* loop
===================================*/
ParticleEmitter.prototype.loopParticles = function(loopX,loopY,emitter=this._emitter){
	var p = emitter._activeParticlesFirst;
	var width = Graphics.width + 2*loopX;
	var height = Graphics.height + 2*loopY;
	while(p){
		var x = p.x;
		var node = p.parent;
	    while (node) {
	        x += node.x;
	        node = node.parent;
	    }
	    var pw_half = p.width/2;
	    while(x+pw_half < -loopX){
	    	x += width+pw_half;
	    	p.x += width+pw_half;
	    }
	    while(x-pw_half > Graphics.width+loopX){
	    	x -= width+pw_half;
	    	p.x -= width+pw_half;
	    }

	    var y = p.y;
		node = p.parent;
	    while (node) {
	        y += node.y;
	        node = node.parent;
	    }
	    var ph_half = p.height/2;
	    while(y+ph_half < -loopY){
	    	y += height+pw_half;
	    	p.y += height+pw_half
	    }
	    while(y-ph_half > Graphics.height+loopY){
	    	y -= height+pw_half;
	    	p.y -= height+pw_half
	    }

	    p = p.next;
	}
};

/* each targets
===================================*/
ParticleEmitter.prototype.updateCharacterOutsideFreeze = function(x,y){
	if(this._data.stop){
		this._freezed = false;
		return;
	}

	var margin = this._characterTargetMargin;
	if(margin<0)return;

	if(x<-margin || x>Graphics.width+margin
		|| y<-margin || y>Graphics.height+margin)
	{
		this._freezed = true;
	}else{
		this._freezed = false;
	}
	this._container.visible = !this._freezed;
};

ParticleEmitter.prototype.updateForStartDash = function(){
	var target = this._target;
	if(!target)return false;

	var dashing = target.isDashing()&&target.isMoving();

	var emit = dashing &&((!this._data.ex.dashing&&!this._data.ex.lastDashing)||(this._data.ex.dir!==target._direction));
	this._data.ex.lastDashing = this._data.ex.dashing;
	this._data.ex.dashing = dashing;
	this._data.ex.dir = target._direction;

	if(emit !== this._emitter.emit){
		this._emitter.resetPositionTracking();
		this._emitter.emit = emit
		return true;
	}else{
		return false;
	}
};

ParticleEmitter.prototype.updateForWalk = function(){
	var target = this._target;
	if(!target)return false;
	var emit;
	if(target.isMoving()){
		emit = true;
		this._data.ex.lastMoving = true;
	}else{
		emit = (this._data.ex.lastMoving||false);
		this._data.ex.lastMoving = false;
	}
	if(emit){
		if(this._data.ex && this._data.ex.regions){
			var regionId = $gameMap.regionId(Math.round(target._realX), Math.round(target._realY));
			if(!this._data.ex.regions.contains(regionId)){
				emit = false;
			}
		}
	}

	if(emit){
		var dashing = target.isDashing()&&target.isMoving();
		if(dashing !== this._data.ex.dashing){
			var freq = this._data.ex.frequency * (dashing ? 1 : 2);
			this._emitter.setFrequencyToApplyCapacity(freq);
			this._data.ex.dashing = dashing;
		}
	}
	if(emit !== this._emitter.emit){
		this._emitter.resetPositionTracking();
		this._emitter.emit = emit;
		return true;
	}else{
		return false;
	}
};

ParticleEmitter.prototype.updateForRegion = function(force){
	var ex = this._data.ex;
	var sx = Math.round($gameMap._displayX);
	var sy = Math.round($gameMap._displayY);

	if(!force && ex.lastX===sx && ex.lastY===sy)return false;

	ex.lastX = sx;
	ex.lastY = sy;

	var x0 = sx - regionMargin;
	var y0 = sy - regionMargin;
	var x1 = sx + Graphics.width/this._tileWidth + regionMargin;
	var y1 = sy + Graphics.height/this._tileHeight + regionMargin;

	var target = this._target;
	target.length = 0;
	var allPos = ex.allPos;
	var length = allPos.length;

    for(var i = 0; i<length; i=(i+2)|0){
        var x = allPos[i];
        if(x<x0 || x>x1){
        	if(this._loopXThreshold>0){
        		x += $dataMap.width;
        		if(x<x0 || x>x1)continue;
        	}else{
        		continue;
        	}
        }
        var y = allPos[i+1];
        if(y<y0 || y>y1){
        	if(this._loopYThreshold>0){
        		y += $dataMap.height;
        		if(y<y0 || y>y1)continue;
        	}else{
        		continue;
        	}
        }

        target.push(x);
        target.push(y);
    }
    length = target.length/2;
    var emit = length>0;
    if(this._emitter.emit !== emit){
    	this._emitter.emit = emit;
    }
    if(emit){
    	this._emitter.setFrequencyToApplyCapacity(ex.frequency/length);
    	this._emitter.setMaxParticlesToApplyCapacity(ex.maxParticles*length);
    	this._emitter.setParticlesPerWaveToApplyCapacity(ex.particlesPerWave);
    }

    return true;
};



/* accessor
===================================*/
ParticleEmitter.prototype.container = function(){
	return this._container;
};

/* helper
===================================*/
ParticleEmitter.TRIGGER_TYPE_TARGETS = [
	TARGET_TYPES.walk,TARGET_TYPES.startdash,TARGET_TYPES.click,TARGET_TYPES.drag,TARGET_TYPES.region
];

ParticleEmitter.prototype.isEmitByOriginalTrigger = function(){
	return ParticleEmitter.TRIGGER_TYPE_TARGETS.contains(this._targetType);
};

ParticleEmitter.prototype.imageName = function(image){
	return image||this._config.image||defaultImage;
};


/* filters
===================================*/
if(PIXI.filters){
	var FILTER = {
		classWithType:{
			blur:PIXI.filters.BlurFilter,
			glow:PIXI.filters.GlowFilter,
			rgbsplit:PIXI.filters.RGBSplitFilter,
			pixelate:PIXI.filters.PixelateFilter,
			displacement:PIXI.filters.DisplacementFilter,
		},
		applyArgs:{
			blur:function(filter,args){
				filter.blur = supplementDefNum(filter.blur,args[0]);
				filter.quality = supplementDefNum(filter.blur,args[1]);
			},
			glow:function(filter,args){
				filter.innerStrength = supplementDefNum(filter.innerStrength,args[0]);
				filter.outerStrength = supplementDefNum(filter.outerStrength,args[1]);
				if(filter.distance!==undefined){
					filter.distance = supplementDefNum(filter.distance,args[2]);
				}

				if(args[5]!==undefined){
					var r = Number(args[3]).toString(16);
					var g = Number(args[4]).toString(16);
					var b = Number(args[5]).toString(16);
					if(r.length===1)r='0'+r;
					if(g.length===1)g='0'+g;
					if(b.length===1)b='0'+b;
					var color = '0x'+r+g+b;
					filter.color = Number(color)
				}
			},
			rgbsplit:function(filter,args){
				filter.red = [supplementDefNum(filter.red[0],args[0]),supplementDefNum(filter.red[1],args[1])];
				filter.green = [supplementDefNum(filter.green[0],args[2]),supplementDefNum(filter.green[1],args[3])];
				filter.blue = [supplementDefNum(filter.blue[0],args[4]),supplementDefNum(filter.blue[1],args[5])];
			},
			pixelate:function(filter,args){
				filter.size.x = supplementDefNum(filter.size.x,args[0]);
				filter.size.y = supplementDefNum(filter.size.y,args[1]);
			},
			displacement:function(filter,args){
				filter.scale.x = supplementDefNum(filter.scale.x,args[0]);
				filter.scale.y = supplementDefNum(filter.scale.y,args[1]);
				filter.maskSprite.texture.baseTexture.wrapMode = PIXI.WRAP_MODES.REPEAT;
			}
		},
	};
	
	ParticleEmitter.prototype.updateFilters = function(data){
		this._fid = data.fid;
		var filterData = data.filters;
		var keys = Object.keys(filterData);

		var container = this._container;
		
		//remove erased filter
		var filter;
		var filters = container.filters||[];
		var currentKeys = this._filterKeys;
		var filterArgs = this._filterArgs;

		var length = currentKeys.length;
	    for(var i = length-1; i>=0; i=(i-1)|0){
	        var key = currentKeys[i];
	        if(!keys.contains(key)){
	        	currentKeys.splice(i,1);
	        	delete this._filterArgs[key];

	        	filter = this.filterWithTypeInFilters(filters,key);
	        	if(filter){
	        		filters.splice(filters.indexOf(filter));
	        	}
	        }
	    }

	    //create & update filter
		var length = keys.length;
	    for(var i = 0; i<length; i=(i+1)|0){
	        var key = keys[i];
	        var args = filterData[key];
	        var updateArgs = false;
	        if(currentKeys.contains(key)){
	        	updateArgs = !args.equals(filterArgs[key]);
	        	filter = this.filterWithTypeInFilters(filters,key);
	        }else{
	        	var filterClass = this.filterClassWithType(key);
	        	if(filterClass === PIXI.filters.DisplacementFilter){
	        		var bitmap = ImageManager.loadPicture('displacement');
	        		var sprite = new Sprite(bitmap);
		        	filter = new filterClass(sprite);
		        	filter.enabled = false;
		        	bitmap.addLoadListener(function(filter){
		        		filter.enabled = true;
		        	}.bind(this,filter));
	        	}else{
		        	filter = new filterClass();
	        	}
	        	filters.push(filter);
	        	currentKeys.push(key);
	        	updateArgs = true;
	        	// filter.autoFit =false ;
	        }
	        if(updateArgs){
	        	filterArgs[key] = args;
	        	this.applyFilterArgs(key,filter,args);
	        }
	    }

	    container.filters = filters;
	};

	ParticleEmitter.prototype.applyFilterArgs = function(type,filter,args){
    	FILTER.applyArgs[type](filter,args);
	};
	ParticleEmitter.prototype.filterClassWithType = function(type){
		return FILTER.classWithType[type];
	};

	ParticleEmitter.prototype.filterWithTypeInFilters = function(filters,type){
		var filterClass = this.filterClassWithType(type);
    	var filterLen = filters.length;
	    for(var i = 0; i<filterLen; i=(i+1)|0){
	        var filter = filters[i];
	        if(filter instanceof filterClass){
	        	return filter;
	        }
	    }
	    return null;
	};

}else{
	ParticleEmitter.prototype.updateFilters = function(data){
		this._fid = data.fid;
	}
};



//=============================================================================
// TRP_Particle
//=============================================================================
var TRP_Emitter = /** @class */(function(_super){
	__extends(TRP_Emitter,_super);

	var utils = PIXI.particles.ParticleUtils;
	function TRP_Emitter(particleParent, particleImages, config){
		var _this = _super.call(this, particleParent, particleImages, config)||this;
		_this.fluc = _this.fluc||0;
		_this.flucSense = _this.flucSense||0;
		_this.colorDistribution = _this.colorDistribution||false;
		_this.mirrorType = _this.mirrorType||0;
		_this.angle = _this.angle||0;

		_this.bdt = _this.bdt||0;
		_this.brt = _this.bdr||0;
		_this.br = _this.br||0;
		_this.bdr = _this.bdr||0;
		_this.bdx = _this.bdx||0;
		_this.bdy = _this.bdy||0;

		_this._capacityRate = _this._capacityRate||1;
		_this._capacityTarget = _this._capacityTarget||0;
		_this._originalFrequency = _this._originalFrequency||0;
		_this._originalMaxParticles = _this._originalMaxParticles||0;
		_this._originalParticlesPerWave = _this._originalParticlesPerWave||0;

		_this._tileWidth = $gameMap ? $gameMap.tileWidth() : ($dataSystem.tileSize||48);
		_this._tileHeight = $gameMap ? $gameMap.tileHeight() : ($dataSystem.tileSize||48);

		return _this;
	};
	TRP_Emitter.prototype.particleTotalCount = function(){
		return this.particleCount;
	};
	TRP_Emitter.prototype.init = function(art, config){
		_super.prototype.init.call(this,art,config);
		if(!noRewriteFunctions){
			if(config.speed){
				this.startSpeed = PIXI.particles.PropertyNode.createList(config.speed);
			}
		}

		if(config.fluctuation){
			this.fluc = config.fluctuation.max||0;
			this.flucSense = config.fluctuation.sensitivity||0;
		}else{
			this.fluc = 0;
			this.flucSense = 0;
		}
		this.colorDistribution = config.colorMode!==undefined && config.colorMode!==0;
		if(config.angle !== undefined){
			this.angle = config.angle||0;
		}else{
			this.angle = config.angleType===1 ? -1 : 0;
		}
		this.mirrorType = config.mirrorType||0;

		this.bdt = config.bdt||0;
		this.brt = config.brt||0;
		this.br = config.br||0;
		this.bdr = config.bdr||0;
		this.bdx = config.bdx||0;
		this.bdy = config.bdy||0;

		this._originalFrequency = this._frequency;
		this._originalMaxParticles = this.maxParticles;
		this._originalParticlesPerWave = this.particlesPerWave||1;
		this._capacityTarget = this.realParticleCapacity();
	};

	Object.defineProperty(TRP_Emitter.prototype, 'capacityRate', {
	    get: function() {
	        return this._capacityRate;
	    },set: function(value){
	    	if(this._capacityRate===value)return;
	    	if(value>=1){
	    		this._capacityRate = value;
	    		this.didResetCapacityLimit();
	    	}else{
		    	this._capacityTarget = this.particleCapacity() * value;
		    	this._capacityRate = value;
		    	this.applyCapacityLimit();
	    	}
	    },
	    configurable: true
	});
	TRP_Emitter.prototype.didResetCapacityLimit = function(){
		this.frequency = this._originalFrequency;
		this.maxParticles = this._originalMaxParticles;
		this.particlesPerWave = this._originalParticlesPerWave||1;
	};
	TRP_Emitter.prototype.setFrequencyToApplyCapacity = function(value){
		this._originalFrequency = value;
		if(this._capacityRate<1){
			this.applyCapacityLimit();
		}else{
			this.frequency = value;
		}
	};
	TRP_Emitter.prototype.setMaxParticlesToApplyCapacity = function(value){
		this._originalMaxParticles = value;
		if(this._capacityRate<1){
			this.applyCapacityLimit();
		}else{
			this.maxParticles = value;
		}
	};
	TRP_Emitter.prototype.setParticlesPerWaveToApplyCapacity = function(value){
		this._originalParticlesPerWave = value||1;
		if(this._capacityRate<1){
			this.applyCapacityLimit();
		}else{
			this.particlesPerWave = value||1;
		}
	};
	TRP_Emitter.prototype.applyCapacityLimit = function(){
		var target = this._capacityTarget;
		var naturalCapacity = this.naturalCapacity(this._originalFrequency,this._originalParticlesPerWave);

		this.maxParticles = target;
		if(this.particlesPerWave>1){
			this.particlesPerWave = Math.ceil(Math.min(this._originalParticlesPerWave,this._originalParticlesPerWave*(target/naturalCapacity)))||1;
			naturalCapacity = this.naturalCapacity(this._originalFrequency,this.particlesPerWave);
		}
		this.frequency = Math.max(this._originalFrequency,this._originalFrequency / (target/naturalCapacity));
	};
	TRP_Emitter.prototype.particleCapacity = function(){
		return Math.min(this._originalMaxParticles,this.naturalCapacity(this._originalFrequency,this._originalParticlesPerWave));
	};
	TRP_Emitter.prototype.realParticleCapacity = function(){
		return Math.min(this.maxParticles,this.naturalCapacity(this._frequency,this.particlesPerWave||1));
	};
	TRP_Emitter.prototype.naturalCapacity = function(frequency,particlesPerWave){
		var emitterLife = this._emitterLife<0 ? this.emitterLifetime : this._emitterLife;
		if(emitterLife<0){
			return (this.minLifetime+this.maxLifetime)/2
				 	*this.spawnChance*particlesPerWave/frequency;
		}else{
			return Math.min(emitterLife,(this.minLifetime+this.maxLifetime)/2)
				 	*this.spawnChance*particlesPerWave/frequency;
		}
	};

	TRP_Emitter.prototype.applyAdditionalProperties = function (p) {
		_super.prototype.applyAdditionalProperties.call(this,p);
		if(this.minimumSpeedMultiplier===1){
			p.speedMultiplier = 1;
		}
		if(this.minimumScaleMultiplier===1){
			p.scaleMultiplier = 1;
		}
		
		p.fluc = this.fluc;
		p.flucSense = this.flucSense;
		p.colorDistribution = this.colorDistribution;
		
		p.wait = 0;

		p.mirror = this.mirrorType===0 ? false : (this.mirrorType===1 ? true : (Math.random()<=0.5));
		p._angle = this.angle;
    };

    var helperPoint = new PIXI.Point();
	TRP_Emitter.prototype._spawnRegion = function(validPositions,p,emitPosX,emitPosY){
		if(validPositions.length === 0){
			return;
		}

		var rand = Math.randomInt(validPositions.length/2)*2;
	    if (this.minStartRotation == this.maxStartRotation){
	        p.rotation = this.minStartRotation + this.rotation;
	    }else{
	        p.rotation = Math.random() * (this.maxStartRotation - this.minStartRotation) + this.minStartRotation + this.rotation;
	    }

	    //place the particle at a random point in the rectangle
	    helperPoint.x = validPositions[rand]*this._tileWidth + Math.random() * this._tileWidth;
	    helperPoint.y = validPositions[rand+1]*this._tileHeight + Math.random() * this._tileHeight;
	    if (this.rotation !== 0){
	        utils.rotatePoint(this.rotation, helperPoint);
	    }
	    p.position.x = emitPosX + helperPoint.x;
	    p.position.y = emitPosY + helperPoint.y;
	};


	TRP_Emitter.prototype.shiftParticlePosX = function(value){
		var particle = this._activeParticlesFirst;
		while(!!particle){
			particle.x += value;
			particle = particle.next;
		}
	};
	TRP_Emitter.prototype.shiftParticlePosY = function(value){
		var particle = this._activeParticlesFirst;
		while(!!particle){
			particle.y += value;
			particle = particle.next;
		}
	};

	TRP_Emitter.prototype._spawnCircle = function (p, emitPosX, emitPosY) {
        //set the initial rotation/direction of the particle based on starting
        //particle angle and rotation of emitter
        if (this.minStartRotation == this.maxStartRotation)
            p.rotation = this.minStartRotation + this.rotation;
        else
            p.rotation = Math.random() * (this.maxStartRotation - this.minStartRotation) +
                this.minStartRotation + this.rotation;
        //place the particle at a random radius in the circle

        helperPoint.x = (1-Math.random()*Math.random()) * this.spawnCircle.radius;
        helperPoint.y = 0;
        //rotate the point to a random angle in the circle
        utils.rotatePoint(Math.random() * 360, helperPoint);
        //offset by the circle's center
        helperPoint.x += this.spawnCircle.x;
        helperPoint.y += this.spawnCircle.y;
        //rotate the point by the emitter's rotation
        if (this.rotation !== 0)
            utils.rotatePoint(this.rotation, helperPoint);
        //set the position, offset by the emitter's position
        p.position.x = emitPosX + helperPoint.x;
        p.position.y = emitPosY + helperPoint.y;
    };

	TRP_Emitter.prototype._spawnBurst = function (p, emitPosX, emitPosY, i) {
	        //set the initial rotation/direction of the particle based on spawn
	        //angle and rotation of emitter
	        var angle,r;
	        if (this.particleSpacing === 0){
	            p.rotation = Math.random() * 360;
	            r = this.br + this.bdr*i;
	        }else{
	        	if(this.bdr<0){
	        		p.rotation =  (this.particleSpacing*i);
		            r = this.br + -1*Math.floor(p.rotation/360)*this.bdr;
		            p.rotation += this.angleStart + this.rotation;
	        	}else{
	        		p.rotation = this.angleStart + (this.particleSpacing*i) + this.rotation;
	        		r = this.br + this.bdr*i;
	        	}
	        }
	        //drop the particle at the emitter's position
	        p.position.x = emitPosX;
	        p.position.y = emitPosY;

	        p.x += r*Math.cos(p.rotation*Math.PI/180)+this.bdx*i;
	        p.y += r*Math.sin(p.rotation*Math.PI/180)+this.bdy*i;

	        if(this.brt===1){
	        	if (this.minStartRotation == this.maxStartRotation)
		            p.rotation = this.minStartRotation + this.rotation;
		        else
		            p.rotation = Math.random() * (this.maxStartRotation - this.minStartRotation) + this.minStartRotation + this.rotation;
	        }else if(this.brt===2){
	        	if(this.minStartRotation == this.maxStartRotation)
		            p.rotation += this.minStartRotation + this.rotation;
		        else
		            p.rotation += Math.random() * (this.maxStartRotation - this.minStartRotation) + this.minStartRotation + this.rotation;
	        }

	        if(this.bdt && i>0){
	        	p.wait = this.bdt*i;
	        }
	    };

	return TRP_Emitter;
}(PIXI.particles.Emitter));
ParticleEmitter.TRP_Emitter = TRP_Emitter;

var TRP_Particle = /** @class */(function(_super){
	__extends(TRP_Particle,_super);

	var utils = PIXI.particles.ParticleUtils;
	function TRP_Particle(emitter){
		var _this = _super.call(this,emitter) || this;
		_this.colorDistribution = false;
		_this.aVelocity = new PIXI.Point(0,0);
		//inertiaVelocity
		_this.iVelocity = new PIXI.Point(0,0);
		_this._doInertia = false;

		_this.fluc = 0;
		_this.flucSense = 0;
		_this._doFluctuation = false;
		_this._flucSpeed = 0;
		_this.rotatePoint = utils.rotatePoint;

		_this.mirror = false;
		_this._angle = 0;

		_this._doWait = false;
		_this.wait = 0;

		return _this;
	};

	if(noRewriteFunctions){
		TRP_Particle.prototype.init = function(){
			_super.prototype.init.call(this);

			this.aVelocity.x = 0;
	        this.aVelocity.y = 0;
	        this.iVelocity.x = 0;
	        this.iVelocity.y = 0;
	        
			this._doWait = this.wait>0;
			if(this._doWait){
				this.alpha = 0;
			}

			this._doFluctuation = this.fluc>0;
			this._flucSpeed = 0;

			if(this.colorDistribution){
				this._doColor = false;
				if(this.colorList.next){
					this.tint = this.colorList.interpolate(Math.random());
				}
			}

			if(this._angle<0){
				this.rotation = Math.random()*(Math.PI*2);
			}else if(this._angle>0){
				this.rotation += this._angle*utils.DEG_TO_RADS;
			}

			this._doInertia = this.iVelocity.x!==0 || this.iVelocity.y!==0;
		};
		TRP_Particle.prototype.update = function (delta) {
			if(this._doWait){
				this.wait -= delta;
				if(this.wait>0){
					return -1;
				}
				this._doWait = false;
				this.wait = 0;
			}

			var lerp = _super.prototype.update.call(this,delta);

			if(this._doFluctuation){
				this._flucSpeed = this.flucSense*(-1+2*Math.random())*this.fluc 
						+ (1-this.flucSense)*(this._flucSpeed||0);
				this.rotatePoint(this._flucSpeed,this.velocity);
			}
			if(this._doInertia){
				this.position.x += delta*this.iVelocity.x;
				this.position.y += delta*this.iVelocity.y;
			}
			return lerp;
		};
	}else{
		TRP_Particle.prototype.init = function () {
	        //reset the age
	        this.age = 0;
	        //set up the velocity based on the start speed and rotation
	        this.velocity.x = this.speedList.current.value * this.speedMultiplier;
	        this.velocity.y = 0;
	        this.aVelocity.x = 0;
	        this.aVelocity.y = 0;
	        this.iVelocity.x = 0;
	        this.iVelocity.y = 0;

	        utils.rotatePoint(this.rotation, this.velocity);
	        if(this._angle < 0){
				this.rotation = Math.random()*(Math.PI*2);
			}else if(this.noRotation) {
	            this.rotation = 0;
	        }else{
	        	if(this._angle > 0){
					this.rotation += this._angle;
				}

	            //convert rotation to Radians from Degrees
	            this.rotation *= utils.DEG_TO_RADS;
	        }
	        //convert rotation speed to Radians from Degrees
	        this.rotationSpeed *= utils.DEG_TO_RADS;
	        this.rotationAcceleration *= utils.DEG_TO_RADS;
	        //set alpha to inital alpha
	        this.alpha = this.alphaList.current.value;
	        //set scale to initial scale
	        this.scale.x = this.scale.y = this.scaleList.current.value*this.scaleMultiplier;
	        if(this.mirror)this.scale.x*=-1;
	        //figure out what we need to interpolate

	        this._doAlpha = !!this.alphaList.current.next;
	        this._doSpeed = !!this.speedList.current.next;
	        this._doScale = !!this.scaleList.current.next;
	        this._doColor = !this.colorDistribution && !!this.colorList.current.next;
	        this._doAcceleration = this.acceleration.x !== 0 || this.acceleration.y !== 0;
	        //_doNormalMovement can be cancelled by subclasses
	        this._doNormalMovement = this._doSpeed || this.speedList.current.value !== 0 || this._doAcceleration;
	        //save our lerp helper
	        this._oneOverLife = 1 / this.maxLife;
	        //set the inital color
	        if(this.colorDistribution&&this.colorList.next){
	        	this.tint = this.colorList.interpolate(Math.random());
	        }else{
	        	var color = this.colorList.current.value;
		        this.tint = utils.combineRGBComponents(color.r, color.g, color.b);
	        }

	        this._doWait = this.wait>0;
	        if(this._doWait){
				this.alpha = 0;
			}

	        this._doFluctuation = this.fluc>0;
			this._flucSpeed = 0;

			this._doInertia = this.iVelocity.x!==0 || this.iVelocity.y!==0;

	        //ensure visibility
	        this.visible = true;
	    };
		TRP_Particle.prototype.update = function (delta) {
			if(this._doWait){
				this.wait -= delta;
				if(this.wait>0)return -1;
				this._doWait = false;
			}

	        //increase age
	        this.age += delta;
	        //recycle particle if it is too old
	        if (this.age >= this.maxLife || this.age < 0) {
	            this.kill();
	            return -1;
	        }
	        //determine our interpolation value
	        var lerp = this.age * this._oneOverLife; //lifetime / maxLife;
	        if (this.ease) {
	            if (this.ease.length == 4) {
	                //the t, b, c, d parameters that some tween libraries use
	                //(time, initial value, end value, duration)
	                lerp = this.ease(lerp, 0, 1, 1);
	            } else {
	                //the simplified version that we like that takes
	                //one parameter, time from 0-1. TweenJS eases provide this usage.
	                lerp = this.ease(lerp);
	            }
	        }
	        //interpolate alpha
	        if (this._doAlpha){
	            this.alpha = this.alphaList.interpolate(lerp);
	        }
	        //interpolate scale
	        if (this._doScale) {
	            var scale = this.scaleList.interpolate(lerp) * this.scaleMultiplier;
	            this.scale.x = this.scale.y = scale;
    	        if(this.mirror)this.scale.x*=-1;
	        }
	        //handle movement
	        if (this._doNormalMovement) {
	            //interpolate speed
	            var oldVX = void 0;
	            var oldVY = void 0;
	            if(this._doAcceleration){
					oldVX = this.velocity.x;
	                oldVY = this.velocity.y;
	            }
	            if (this._doSpeed) {
	                var speed = this.speedList.interpolate(lerp) * this.speedMultiplier;
	                utils.normalize(this.velocity);
	                utils.scaleBy(this.velocity, speed);
	            }

	            if (this._doAcceleration) {
	            	if(this._doSpeed){
	            		this.aVelocity.x += this.acceleration.x * delta;
		            	this.aVelocity.y += this.acceleration.y * delta;
		            	this.velocity.x += this.aVelocity.x;
		            	this.velocity.y += this.aVelocity.y;
	            	}else{
	            		this.velocity.x += this.acceleration.x * delta;
		            	this.velocity.y += this.acceleration.y * delta;
	            	}
	            	if(this._doFluctuation){
						this._flucSpeed = this.flucSense*(-1+2*Math.random())*this.fluc 
								+ (1-this.flucSense)*(this._flucSpeed||0);
						this.rotatePoint(this._flucSpeed,this.velocity);
					}

					this.position.x += (oldVX + this.velocity.x) / 2 * delta;
	                this.position.y += (oldVY + this.velocity.y) / 2 * delta;

	                
	            } else {
	            	if(this._doFluctuation){
						this._flucSpeed = this.flucSense*(-1+2*Math.random())*this.fluc 
								+ (1-this.flucSense)*(this._flucSpeed||0);
						this.rotatePoint(this._flucSpeed,this.velocity);
					}
	                this.position.x += this.velocity.x * delta;
	                this.position.y += this.velocity.y * delta;
	            }
	        }

	        //inertia movement
	        if(this._doInertia){
				this.position.x += delta*this.iVelocity.x;
				this.position.y += delta*this.iVelocity.y;
			}

	        //interpolate color
	        if (this._doColor) {
	            this.tint = this.colorList.interpolate(lerp);
	        }
	        //update rotation
	        if (this.rotationAcceleration !== 0) {
	            var newRotationSpeed = this.rotationSpeed + this.rotationAcceleration * delta;
	            this.rotation += (this.rotationSpeed + newRotationSpeed) / 2 * delta;
	            this.rotationSpeed = newRotationSpeed;
	        }
	        else if (this.rotationSpeed !== 0) {
	            this.rotation += this.rotationSpeed * delta;
	        }
	        else if (this._doAcceleration && !this.noRotation && !this._angle) {
	            this.rotation = Math.atan2(this.velocity.y, this.velocity.x); // + Math.PI / 2;
	        }
	        return lerp;
	    };
	}

	return TRP_Particle;
}(PIXI.particles.Particle));
ParticleEmitter.TRP_Particle = TRP_Particle;



/* test command
===================================*/
//PRAGMA: testCommands
Game_Interpreter.prototype.trpParticleTest = function(){
	var eventId = this.isOnCurrentMap() ? this._eventId : 0;
	var list = [
		{"code":101,"indent":0,"parameters":["",0,0,2]},
		{"code":401,"indent":0,"parameters":[NLC("\\>パーティクルプラグインの基本動作のテストを行います。",15)]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]1.パーティクルの再生(寿命あり)\\C[0]",16)]},{"code":401,"indent":0,"parameters":[NLC("\\>└particle play ID this 設定名",17)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","play",NLC("play/１回だけ再生",18),{"id":"fuss_startdash","target":"this","name":"def","z":"def","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = fuss_startdash",19)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = this",20)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",21)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",22)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",23)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",24)]},{"code":230,"indent":0,"parameters":[45]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]2.パーティクルの表示(寿命なし)\\C[0]",25)]},{"code":401,"indent":0,"parameters":[NLC("\\>└particle set ID this 設定名",26)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",27),{"id":"particle","target":"this","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = particle",28)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = this",29)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",30)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",31)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",32)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",33)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",34)]},{"code":230,"indent":0,"parameters":[45]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]3.パーティクルの停止と再開\\C[0]",35)]},{"code":401,"indent":0,"parameters":["\\>└particle off ID"]},{"code":401,"indent":0,"parameters":["\\>└particle on ID"]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","off",NLC("off/一時停止",36),{"targetId":"particle","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",37)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",38)]},{"code":230,"indent":0,"parameters":[45]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","on",NLC("on/再生の再開",39),{"targetId":"particle","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",40)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",41)]},{"code":230,"indent":0,"parameters":[30]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]4.パラメータの変更\\C[0]",42)]},{"code":401,"indent":0,"parameters":[NLC("\\>└particle update ID パラメータ名 値...",43)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","update",NLC("update/パラメータ変更",44),{"targetId":"particle","key":"color","values":"#ffffff #ffff00@0.5 #ff0000","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",45)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = color",46)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = #ffffff #ffff00@0.5 #ff0000",47)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",48)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","update",NLC("update/パラメータ変更",49),{"targetId":"particle","key":"blendMode","values":"0","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",50)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = blendMode",51)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = 0",52)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",53)]},{"code":230,"indent":0,"parameters":[30]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]5.パラメータを徐々に変化\\C[0]",54)]},{"code":401,"indent":0,"parameters":[NLC("\\>└particle animate ID 時間 パラメータ名 値...",55)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","animate",NLC("animate/パラメータを徐々に変化",56),{"targetId":"particle","duration":"30","key":"pos","values":"-200 -200","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",57)]},{"code":657,"indent":0,"parameters":[NLC("所要時間 = 30",58)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = pos",59)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = -200 -200",60)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",61)]},{"code":230,"indent":0,"parameters":[60]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","animate",NLC("animate/パラメータを徐々に変化",62),{"targetId":"particle","duration":"30","key":"speed","values":"100 0","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",63)]},{"code":657,"indent":0,"parameters":[NLC("所要時間 = 30",64)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = speed",65)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = 100 0",66)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",67)]},{"code":230,"indent":0,"parameters":[30]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","animate",NLC("animate/パラメータを徐々に変化",68),{"targetId":"particle","duration":"30","key":"pos","values":"0 0","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",69)]},{"code":657,"indent":0,"parameters":[NLC("所要時間 = 30",70)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = pos",71)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = 0 0",72)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",73)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","animate",NLC("animate/パラメータを徐々に変化",74),{"targetId":"particle","duration":"30","key":"speed","values":"400 0","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",75)]},{"code":657,"indent":0,"parameters":[NLC("所要時間 = 30",76)]},{"code":657,"indent":0,"parameters":[NLC("パラメータ名 = speed",77)]},{"code":657,"indent":0,"parameters":[NLC("変更値(スペースつなぎ) = 400 0",78)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",79)]},{"code":230,"indent":0,"parameters":[30]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","off",NLC("off/一時停止",80),{"targetId":"particle","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",81)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",82)]},{"code":230,"indent":0,"parameters":[30]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]6.強制的に時間を進める\\C[0]",83)]},{"code":401,"indent":0,"parameters":[NLC("\\>└particle exceed ID フレーム数",84)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","on",NLC("on/再生の再開",85),{"targetId":"particle","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",86)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",87)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","exceed",NLC("exceed/時間を進める",88),{"targetId":"particle","time":"10","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",89)]},{"code":657,"indent":0,"parameters":[NLC("スキップ時間(秒数) = 10",90)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",91)]},{"code":230,"indent":0,"parameters":[30]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]7.停止してクリア\\C[0]",92)]},{"code":401,"indent":0,"parameters":["\\>└particle clear ID"]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",93),{"targetId":"particle","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = particle",94)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",95)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",96)]},{"code":230,"indent":0,"parameters":[30]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]8.対象:screen\\C[0]",97)]},{"code":401,"indent":0,"parameters":[NLC("\\>└画面上で固定表示",98)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",99),{"id":"thunder_w","target":"screen","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = thunder_w",100)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = screen",101)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",102)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",103)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",104)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",105)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",106)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",107),{"id":"thunder_w2","target":"screen","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = thunder_w2",108)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = screen",109)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",110)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",111)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",112)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",113)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",114)]},{"code":230,"indent":0,"parameters":[60]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",115),{"targetId":"thunder_w","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = thunder_w",116)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",117)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",118)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",119),{"targetId":"thunder_w2","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = thunder_w2",120)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",121)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",122)]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]9.対象:weather\\C[0]",123)]},{"code":401,"indent":0,"parameters":[NLC("\\>└画面上で固定表示＆スクロールに連動",124)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",125),{"id":"rain_w3","target":"weather","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = rain_w3",126)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = weather",127)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",128)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",129)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",130)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",131)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",132)]},{"code":204,"indent":0,"parameters":[6,8,5]},{"code":204,"indent":0,"parameters":[4,8,5]},{"code":230,"indent":0,"parameters":[60]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",133),{"targetId":"rain_w3","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = rain_w3",134)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",135)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",136)]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]10.対象:リージョン\\C[0]",137)]},{"code":401,"indent":0,"parameters":[NLC("\\>└指定したリージョンのタイルから発生",138)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",139),{"id":"light_r","target":"region:1","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = light_r",140)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = region:1",141)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",142)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",143)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",144)]},{"code":657,"indent":0,"parameters":[NLC("_Editモード = false",145)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",146)]},{"code":230,"indent":0,"parameters":[90]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",147),{"targetId":"light_r","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = light_r",148)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",149)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",150)]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]11.対象:歩き\\C[0]",151)]},{"code":401,"indent":0,"parameters":[NLC("\\>└対象キャラが歩いてるときに表示",152)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","set",NLC("set/表示",153),{"id":"fuss_walk","target":"walk:player","name":"def","z":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = fuss_walk",154)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = walk:player",155)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",156)]},{"code":657,"indent":0,"parameters":[NLC("Z値 = def",157)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",158)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",159)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",160)]},{"code":205,"indent":0,"parameters":[-1,{"list":[{"code":29,"parameters":[5],"indent":null},{"code":37,"indent":0},{"code":3,"indent":null},{"code":3,"indent":null},{"code":3,"indent":0},{"code":3,"indent":0},{"code":3,"indent":null},{"code":3,"indent":null},{"code":2,"indent":0},{"code":2,"indent":0},{"code":2,"indent":null},{"code":2,"indent":null},{"code":2,"indent":null},{"code":2,"indent":null},{"code":29,"parameters":[4],"indent":null},{"code":38,"indent":null},{"code":0}],"repeat":false,"skippable":false,"wait":true}]},{"code":505,"indent":0,"parameters":[{"code":29,"parameters":[5],"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":37,"indent":0}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":0}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":0}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":3,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":0}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":0}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":2,"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":29,"parameters":[4],"indent":null}]},{"code":505,"indent":0,"parameters":[{"code":38,"indent":null}]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",161),{"targetId":"fuss_walk","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = fuss_walk",162)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",163)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",164)]},{"code":101,"indent":0,"parameters":["",0,0,2,""]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]12.グループ機能＆サブエミッター\\C[0]",165)]},{"code":401,"indent":0,"parameters":[NLC("\\>└グループ機能：まとめてコマンドを実行",166)]},{"code":401,"indent":0,"parameters":[NLC("\\>└サブエミッター：パーティクルから子パーティクル発生",167)]},{"code":401,"indent":0,"parameters":[NLC("\\>└\\C[2]※上部に遠景が見える場所で実行してください。",168)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ_Group","set",NLC("set/表示",169),{"id":"fireworks","target":"this","name":"def","tag":"","edit":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("管理ID = fireworks",170)]},{"code":657,"indent":0,"parameters":[NLC("ターゲット = this",171)]},{"code":657,"indent":0,"parameters":[NLC("データ名 = def",172)]},{"code":657,"indent":0,"parameters":[NLC("管理タグ = ",173)]},{"code":657,"indent":0,"parameters":[NLC("Editモード = false",174)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",175)]},{"code":230,"indent":0,"parameters":[90]},{"code":101,"indent":0,"parameters":["",0,0,2,""]},{"code":401,"indent":0,"parameters":[NLC("\\>\\C[14]13.グループ停止",176)]},{"code":357,"indent":0,"parameters":["TRP_ParticleMZ","clear",NLC("clear/クリア",177),{"targetId":"tag:group:fireworks","quitFlag":"false","delay":"0"}]},{"code":657,"indent":0,"parameters":[NLC("対象の管理ID = tag:group:fireworks",178)]},{"code":657,"indent":0,"parameters":[NLC("即座に消去 = false",179)]},{"code":657,"indent":0,"parameters":[NLC("_ディレイ = 0",180)]},{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>以上で基本動作テストを終わります。",181)]},{"code":0,"indent":0,"parameters":[]}];

	this.setupChild(list,eventId);
};
//PRAGMA_END: testCommands

Game_Interpreter.prototype.trpParticleTest2 = function(){
	var eventId = this.isOnCurrentMap() ? this._eventId : 0;
	var list = [{"code":101,"indent":0,"parameters":["",0,0,2]},{"code":401,"indent":0,"parameters":[NLC("\\>パーティクルエディタの動作テストを行います。",182)]},{"code":230,"indent":0,"parameters":[10]},{"code":356,"indent":0,"parameters":["particle edit test this"]},{"code":0,"indent":0,"parameters":[]}];
	this.setupChild(list,eventId);
};




/* instant bug fix
===================================*/
(()=>{
if(parameters.windowBugFix==='false'||parameters.windowBugFix===false){
	return;
}

var Window_drawShape = Window.prototype.drawShape;
Window.prototype.drawShape = function(graphics){
    if(this.opacity===0)return;
    Window_drawShape.call(this,graphics);
}
})();



/* cache config
===================================*/
(function(){
	'use strict';
	if(!parameters.useCache||parameters.useCache==='false')return;

	//=============================================================================
	// TRP_Emitter
	//=============================================================================
	var Emitter = PIXI.particles.Emitter;
	var TRP_Emitter = ParticleEmitter.TRP_Emitter;

	TRP_Emitter._particleCache = {};

	var _TRP_Emitter_destroy = TRP_Emitter.prototype.destroy;
	TRP_Emitter.prototype.destroy = function(){
		this.cleanup();

		var constructorName = this._particleConstructor.name;;
		if(!TRP_Emitter._particleCache[constructorName]){
	    	TRP_Emitter._particleCache[constructorName] = [];
	    }

	    var next;
	    for (var particle = this._poolFirst; particle; particle = next) {
	        //store next value so we don't lose it in our destroy call
	        next = particle.next;

	        particle.emitter = null;
	        particle.next = null;
	        particle.prev = null;
	        if(constructorName==='TRP_ParticleEx'){
	        	particle.subEmitters = null;
	        	particle.subEmitterData.length = 0;
	        }
	        particle.applyArt(null);

	        TRP_Emitter._particleCache[constructorName].push(particle);
	    }
	    this._poolFirst = null;

		Emitter.prototype.destroy.call(this);
	};

	var _TRP_Emitter_init = TRP_Emitter.prototype.init;
	TRP_Emitter.prototype.init = function(art, config){
		_TRP_Emitter_init.call(this,art,config);
		this.preparePoolFromCache();
	};

	TRP_Emitter.prototype.preparePoolFromCache = function(rate=1){
		var capacity = rate * this.naturalCapacity(this._originalFrequency,this._originalParticlesPerWave);

		var constructorName = this._particleConstructor.name;;
		var cache = TRP_Emitter._particleCache[constructorName];
		if(!cache)return;

		var particle = cache.pop();
		if(!particle)return;
		if(!this._poolFirst){
			this._poolFirst = particle;
		}

		var prev = null;
		particle.emitter = this;

	    for(var i=0; i<capacity; i=(i+1)|0){
	    	particle.emitter = this;

	    	if(prev){
	    		prev.next = particle;
	    		particle.prev = prev;
	    	}
	    	prev = particle;

	    	particle = cache.pop();
	    	if(!particle){
	    		break;
	    	}
	    }
	};
})();

})();