//=============================================================================
//  Keke_FreeAnime - フリーアニメ
// バージョン: 1.3.2
//=============================================================================
// Copyright (c) 2022 ケケー
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @target MZ
 * @plugindesc パーティクルアニメの自由度を拡張する
 * @author ケケー
 * @url https://kekeelabo.com
 * 
 * @help
 * 【ver.1.3.2】
 * パーティクルアニメの自由度を拡張する
 * 
 * ● 特徴 ●
 *
 * ◎好きな位置にアニメを表示
 * ◎好きな対象に向かってアニメを移動
 * ◎アニメ表示レイヤーの変更。キャラより下に表示など
 * ◎アニメを複数発生、各自を移動、拡縮、回転など自在に改造
 * ◎アニメをキャラの向きに応じて滑らかに回転
 * ◎アニメのマップオブジェクト化
 * ◎アニメの背景エフェクト化
 * ◎アニメのズーム対応
 *
 *
 * ● 使い方 ●
 *
 * 【基本1】マップでアニメを表示
 * => プラグインコマンド → アニメ表示-マップ
 * ◎再生する「アニメファイル」と、
 * 　「表示・移動対象」(キャラ or マップ位置 or 画面位置)を設定する
 * ◎「表示対象」を複数設定した場合(キャラとマップ位置 など)は、
 *　その全てにアニメが表示される
 * ◎「表示キャラ」は , で区切って複数指定でき(リード, プリシア など)、
 * 　その全てにアニメが表示される
 * ◎「表示キャラ」で位置固定すると、そのキャラの位置にアニメ表示した後、
 * 　キャラが移動しても追わずその場に固定される
 * ◎「移動先」を設定するとそこに向かって移動する
 * ◎必要なら「アニメ設定」もする。様々な動作設定が可能
 * ◎「アニメ設定」にはコモンが使える(後述)
 * ◎各パラメータは ~ を使ってランダム設定できる
 * 　50~100 なら 50 から 100 の間のランダム
 * ◎&r を付けるとランダムで反転させられる
 * 　100&r なら 100 か -100 のランダム
 * ◎各パラメータは \v[変数番号] で変数使用できる
 * 　\v[10]なら 変数10番 を使用
 * ◎移動X・移動Y・各パラメータ変動は「動作文字での動作制御」が可能
 *　詳しくは後述
 *
 *
 * 【基本2】バトルでアニメを表示
 * => プラグインコマンド → アニメ表示-バトル
 * ◎基本的にマップの場合と同じ
 *
 *
 * 【基本3】アニメコモン
 * => プラグインパラメータ → アニメコモン登録
 * ◎アニメコモンとは、「アニメ設定」の共有データのこと
 * 　コモンを下敷きにすることで手軽にアニメ設定ができる
 * ◎まずはプラグインパラメータでアニメコモンを登録
 * 　そしてプラグインコマンドでアニメ表示をする際、
 * 　「コモン使用」に設定したコモン名を書くことで呼び出せる
 * ◎コモンを呼び出すと「アニメ設定」の下敷きとなる
 * 　「アニメ設定」で空欄の部分はコモンのデータが使われ、
 * 　入力した部分はそれが優先して使用される
 * 　コモンから変更する部分だけ入力すればいいということ
 * ◎コモンを使わなくてもいいのだが、基本的には使うことを推奨
 *　より手軽なアニメ設定が可能になるので
 *
 *
 * 【基本4】フリーアニメ・スキル
 * 　戦闘中、スキル・アイテム使用時にフリーアニメを再生できる
 * ◎設定のしかた
 * 　スキル・アイテムのメモ欄に
 * <フリーアニメ: アニメーションID, コモン名, 移動時間, ウェイト>
 * ※ウェイト・移動時間は省略化
 * 　移動時間がある場合は、スキル使用者から対象者に向けてアニメが移動する
 * 　10~20 で10フレームから20フレームの間のランダムにするといったことも可能
 * 　移動時間を -1 にすると、移動はせずスキル使用者を対象にアニメ再生する 
 * 　ウェイトがある場合は、5 なら 5フレーム待ってからアニメ再生する
 * 例)
 *  <フリーアニメ:  37, インパクト>
 * 　ID37 のアニメを アニメコモン『インパクト』 の動作で再生する
 *  <フリーアニメ:  37, インパクト, -1>
 * 　ID37 のアニメを アニメコモン『インパクト』 の動作で、
 *　スキル使用者を対象に再生する
 *　<フリーアニメ:  8, 連射, 20~30, 10>
 * 　10フレーム待った後、ID8 のアニメを アニメコモン『連射』 の動作で再生する
 * 　かつ、使用者から対象者へと 20～30 フレームかけて移動させる
 *
 *
 * 【応用1】動作文字での動作制御
 * 　移動X・移動Y・各パーティくる変動の末尾に
 * ----------これらイージング系はいずれかひとつだけ
 *  e
 * 　イージングインアウト。ゆっくり-速い-ゆっくり。標準はこれ
 *  ei
 * 　イージングイン。ゆっくり-速い
 *  eo
 * 　イージングアウト。速い-ゆっくり
 *  tn
 * 　ターン。→←。進んで戻る
 *  cg
 * 　チャージ。←→→。少し戻ってから一気に進む。cg(**)で戻り幅が **倍
 *  fk
 * 　フック。→→←。一気に進んでから少し戻る。fk(**)で戻り幅が **倍
 *  cf
 * 　チャージフック。←→→←。チャージとフックの融合。cf(**)で戻り幅が **倍
 *  rd
 * 　ラウンド。→←←→。ぐるりと円を描く
 *  bk
 * 　バック。←。戻ってくる
 * ----------イージング系を表記しない場合は自動的にイージングインアウトになる
 * 例)
 * →拡大率　2
 * 　拡大率をイージングインアウトをかけながら 2倍 にする
 * →拡大率　2ei
 * 　拡大率をイージングインをかけながら 2倍 にする
 * →拡大率　2tn
 * 　拡大率を 2倍 にして、元に戻す
 * 移動X　100cg
 * 　左に 100ピクセル 戻った後、右に 200ピクセル 進む
 * 移動X　100cg(0.5)
 * 　左に 50ピクセル 戻った後、右に 150ピクセル 進む
 *
 *
 * 【注釈1】名前でのキャラ指定について
 * ◎語句を入力すると、
 * 　入力語句が名前+メモ欄に“含まれている”イベントを指定する
 * 　『zoom』なら、名前+メモ欄に zoom が含まれているイベント
 * ◎プレイヤー と入力すると プレイヤー を指定
 * ◎セルフ と入力すると、動作中のイベント自身 を指定
 * ◎フォロワー1 と入力すると 1番目 のフォロワーを指定。フォロワー2 なら 2番目
 * ◎乗り物1 と入力すると 1番目 の乗り物を指定。乗り物2 なら 2番目
 * ◎\v[***] と入力すると変数使用。\v[5] なら 変数5番 と置換される
 * ◎ , で区切ると複数指定。プリシア, リード ならプリシアとリード
 *
 *
 * 【注釈2】IDでのキャラ指定について
 * ◎数値を入力すると、イベントIDがその値のイベントを指定する
 * 　5なら、ID 5 のイベント
 * ◎-1 を入力すると プレイヤー を指定
 * ◎0 を入力すると、動作中のイベント自身 を指定
 * ◎-11 を入力すると 1番目 のフォロワーを指定。-12 なら 2番目
 * ◎-101 を入力すると 1番目 の乗り物を指定。-101 なら 2番目
 * ◎\v[***] と入力すると変数使用。\v[5] なら 変数5番 と置換される
 * ◎ , で区切ると複数指定。5, 7 なら 5 と 7
 * ◎ ~ でまとめて指定。5~7 なら 5 と 6 と 7
 *
 *
 * 【付属】サンプルアニメの作り方
 * プラグイン公開サイト『ケケーラボ』で見れる本プラグインの宣伝動画
 * そこで使われているアニメの作り方を解説する
 * まずそのまま作ってみて、それに手を加えていく中で要領を掴んでいくとよい
 *
 * ▪︎火炎放射
 * アニメ名 => 火炎放射 (何でもよい)
 * アニメファイル => 炎/単体1
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示キャラ-名前: プレイヤー (イベント名を入れるとそのイベントに表示)
 * アニメ設定 =>
 * 　再生回数: -1 (ループさせる)
 * 　移動
 * 　　移動X: -300
 * 　　移動Y: -100~100 (-100 から 100 の間のランダム値にしている)
 * コモン使用 => バースト
 *
 * ▪︎火炎放射(追尾ver)
 * アニメ名 => 火炎放射 (何でもよい)
 * アニメファイル => 炎/単体1
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示キャラ-名前: プレイヤー (イベント名を入れるとそのイベントに表示)
 * 　移動先
 * 　　移動時間: 20
 * 　　移動先キャラ-名前: (追尾させるイベントの名前を入れる)
 * 　　追尾モード: true (false だと大雑把な追尾となる)
 * アニメ設定 =>
 * 　再生回数: -1 (ループさせる)
 * 　移動
 * 　　移動Y: -100~100 (-100 から 100 の間のランダム値にしている)
 * コモン使用 => バースト
 *
 * ▪︎キャンドル
 * アニメ名 => キャンドル (何でもよい)
 * アニメファイル => 炎/単体1
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示マップX: 表示させたい位置のX座標
 * 　　表示マップY: 表示させたい位置のY座標
 * アニメ設定 =>
 * 　位置
 * 　　位置ずらしX: 適宜X位置を調整する。5 なら右に 5ピクセル ずれる
 * 　　位置ずらしY: 適宜Y位置を調整する。5 なら下に 5ピクセル ずれる
 * コモン使用 => ループ_2k
 *
 * ▪︎キラキラ
 * アニメ名 => キラキラ (何でもよい)
 * アニメファイル => 蘇生2
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示画面X: 800 (画面左端から 800ピクセル の位置に)
 * 　　表示画面Y: 30 (画面上端から 30ピクセル の位置に)
 * アニメ設定 =>
 * 　パーティクル設定
 * 　　拡大率Y: -100 (上下反転している)
 * 　　回転Z: -45 (傾けている)
 * コモン使用 => ループ_2k
 *
 * ▪︎アビスゲート
 * アニメ名 => アビスゲート (何でもよい)
 * アニメファイル => 闇/単体2
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示画面X: 408 (画面中央にしている)
 * 　　表示画面Y: 312 (画面中央にしている)
 * アニメ設定 =>
 * 　パーティクル設定
 * 　　拡大率Y: -100 (上下反転している)
 * 　　回転Z: -45 (傾けている)
 * コモン使用 => バック_2k
 *
 * ▪︎滝
 * アニメ名 => 滝 (何でもよい)
 * アニメファイル => 水/全体2
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示画面X: 408 (画面中央にしている)
 * 　　表示画面Y: 312 (画面中央にしている)
 * アニメ設定 =>
 * 　パーティクル設定
 * 　　拡大率X: 200
 * 　　拡大率Y: 150
 * コモン使用 => バック
 *
 * ▪︎花火
 * アニメ名 => 花火 (何でもよい)
 * アニメファイル => 無属性/単体2
 * 表示・移動対象 => 
 * 　表示対象
 * 　　表示画面X: 408 (画面中央にしている)
 * 　　表示画面Y: 700 (画面下の方)
 * アニメ設定 =>
 * 　移動
 * 　　移動時間: 60
 * 　　移動X: -100~100
 * 　　移動Y: -300~-600
 * 　パーティクル設定
 * 　　拡大率: 30~60
 * 　パーティクル変動
 * 　　変動時間: 60
 * 　　変動ディレイ: 30 (変動開始を 30フレーム 遅らせている)
 * 　　拡大率: *2eo (*2 は 2倍、eo はイージングアウト命令)
 * 　　回転X: 360~720
 * コモン使用 => バック_乱
 *
 *
 * ● 利用規約 ●
 * MITライセンスのもと、自由に使ってくれて大丈夫です
 *
 *
 *
 * Extend the freedom of particle animation
 *
 * ● Features ●
 *
 * ◎ Display the animation at your favorite position
 * ◎ Move the animation to your favorite target
 * ◎ Change animation display layer. Display below the character, etc.
 * ◎ Generate multiple animations, move, scale, rotate, etc.
 * ◎ Rotate the animation smoothly according
 *   to the direction of the character
 * ◎ Turning animation into a map object
 * ◎ Anime background effects
 * ◎ Animation zoom support
 *
 *
 * ● How to use ●
 *
 * [Basic 1] Display animation on the map
 * => Plugin Command → Animate-Map
 * ◎ The "animation file" to be played,
 *   Set the "display/movement target"
 *   (character or map position or screen position)
 * ◎ If you set multiple "display targets"
 *   (characters and map positions, etc.),
 *   Animation is displayed in all of them
 * ◎ Multiple characters can be specified by separating them with a ,
 *   (Reed, Priscilla, etc.),Animation is displayed in all of them
 * ◎ If you fix the position with "display character",
 *   after the animation is displayed at that character's position,
 *   Even if the character moves, it will be fixed in place without chasing
 * ◎ If you set a "destination", it will move towards it.
 * ◎ If necessary, "animation setting" is also done.
 *   Various operation settings are possible
 * ◎ Common can be used for "animation settings" (described later)
 * ◎ Each parameter can be set randomly using ~
 *   Random between 50 and 100 if 　50~100
 * ◎ Add &r to randomly flip
 *   If 100&r then 100 or -100 random
 * ◎ Each parameter can be used as a variable with \v[variable number]
 *   Use variable number 10 if \v[10]
 * ◎ Move X, Move Y, and each parameter variation can be
 *   "controlled by action characters"
 *   See below for details
 *
 *
 * [Basic 2] Show animation in battle
 * => plug-in command → show animation-battle
 * ◎ Basically same as map
 *
 *
 * [Basic 3] Anime Common
 * => Plugin parameter → Anime common registration
 * ◎ Anime common is the shared data of "animation settings"
 *   You can easily set animation by using Common as a base
 * ◎ First, register the anime common with the plug-in parameter
 *   And when displaying animation with a plug-in command,
 *   Can be called by writing the common name set in "Use common"
 * ◎ When you call Common, it becomes the underlay of "Anime Settings"
 *   Common data is used for blanks in "Anime settings",
 * 　The input part is used with priority
 *   It means that you only need to enter the part to be changed from common
 * ◎ You don't have to use Common, but basically it is recommended to use it.
 *   Since it will be possible to make animation settings more easily
 *
 *
 * [Basic 4] Free animation skills
 * During battle, free animation can be played when using skills/items
 * ◎ How to set
 *   In the skill/item memo field
 * <freeAnime: animation ID, common name, weight>
 * ※ Wait and travel time are omitted
 *   If there is time to move, the animation moves from
 *   the skill user to the target
 *   It is also possible to make it random between 10 and 20 frames with 10~20
 *   If the movement time is set to -1,
 *   animation will be played for the skill user without moving.
 *   If there is a weight, if it is 5 he will wait 5 frames
 *   before playing the animation
 * example)
 * <Free Anime: 37, Impact>
 *   Play ID37's anime with his anime common "Impact" action
 * <Free Anime: 37, Impact,, -1>
 * 　The animation of ID37 with the action of Anime Common "Impact",
 *   Playback for skill users　
 * <Free animation: 8, rapid fire, 20~30, 10>
 *   After waiting for 10 frames,
 *   play the ID8 animation with the action of Anime Common "Rush"
 *   And move from the user to the target over between 20 and 30 frames
 *
 *
 * [Applied 1] Motion control with action characters
 * At the end of movement X, movement Y, and each party's change
 * ---------- only one of these easing systems
 * e
 * 　Easing in/out. Slow-fast-slow. the standard is this
 * ei
 *   Easing in. slow-fast
 * eo
 *   Easing out. fast-slow
 * tn
 *   Turn. →←. willing to go back
 * cg
 *   Charge. ←→→.
 *   Backtrack a little and then move on. cg(**) returns width ** times
 * fk
 *   hook. →→←.
 *   Go forward and then back up a bit. Return width is ** times with fk(**)
 * cf
 *   Charge hook. ←→→←.
 *   Fusion of charge and hook. cf(**) returns width ** times
 * rd
 *   Round. →←←→. draw a circle around
 * bk
 *   Back. ←. Come back
 * ---------- If you do not indicate the easing system,
 *   it will automatically be easing in-out
 * example)
 * → Magnification 2
 *   Double the magnification while applying easing in and out
 * → Magnification rate 2ei
 *   Double the magnification while easing in
 * → Magnification rate　2tn
 *   Double the magnification and restore
 * Movement X 100cg
 *   Go back 100 pixels to the left, then go 200 pixels to the right
 * Movement X 100cg (0.5)
 *   Go back 50 pixels to the left, then go 150 pixels to the right
 *
 *
 * [Note 1] About character designation by name
 * ◎ When you enter a word,
 *   Specify events where the input phrase is "included"
 *   in the name + memo field
 *   For "zoom", events that include "zoom" in the name + memo field
 * ◎ When you type player, he specifies the player
 * ◎ When you enter self, specify the event itself in action.
 * ◎ Enter follower 1 to specify the first follower. 2nd follower
 * ◎ Enter vehicle 1 to specify the first vehicle. 2nd if vehicle 2
 * ◎ Enter \v[***] to use variables. \v[5] is replaced with variable number 5
 * ◎ Multiple specifications can be specified by delimiting with,
 *   Priscilla, Reed If Priscilla and Reed
 *
 *
 * [Note 2] Regarding character designation by ID
 * ◎If you enter a number, the event ID specifies the event with that value.
 *   If 　5, the event with ID 5
 *   Enter ◎-1 and he will specify a player
 * ◎Entering 0 specifies the active event itself.
 *   Enter ◎-11 to specify the first follower. -12 is second
 *   Enter ◎-101 to specify the first ride. -101 is second
 * ◎ Enter \v[***] to use variables. \v[5] is replaced with variable number 5
 * ◎ Multiple specifications can be specified by delimiting with,
 *   5, 7 then 5 and 7
 * ◎ Specified collectively with ~. 5~7 then 5 and 6 and 7
 *
 *
 * ● Terms of Use ●
 * Feel free to use it under the MIT license.
 * 
 * 
 * 
 * @param アニメコモン登録
 * @desc アニメ設定をコモンとして登録しておき、必要に応じて呼び出す。アニメコモン1～も同じ。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default 
 * 
 * 
 * 
 * @param アニメコモン_1
 * @desc アニメコモンその1。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■基本\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"ノーマル\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スピード\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"200\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スピード_小\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"75\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"200\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ハイスピード\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"400\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スロウ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"50\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ビッグ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"150\",\"拡大率Y\":\"150\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ミニマム\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ミニマム_大\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"70\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"200\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ミニマム-速\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"200\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スピン\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"30\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"1080\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スピン_小\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"80\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"200\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"60\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"2160\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ランダム\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"100&r\",\"拡大率Y\":\"100&r\",\"拡大率Z\":\"100&r\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ランダム_小\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"50&r\",\"拡大率Y\":\"50&r\",\"拡大率Z\":\"50&r\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"サイレント\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * 
 * 
 * @param アニメコモン_2
 * @desc アニメコモンその2。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■複合\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"インパクト\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"250\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"*2.5\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"インパクト_遅\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"100\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"*2.5\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"フラッシュ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"C1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"250\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"オーラ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"A1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"100\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"*2.5\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"バリア\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"100\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"60\",\"変動ディレイ\":\"\",\"→拡大率\":\"30\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"1800\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"クラッシュ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"10\",\"変動ディレイ\":\"\",\"→拡大率\":\"*1.5\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ボスクラッシュ\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"25\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"*3\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"720\",\"→回転Y\":\"720\",\"→回転Z\":\"720\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"フラワー\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"30\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"10\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"10\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"60~120\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"250\",\"オフセットX\":\"-200~200\",\"オフセットY\":\"-300~100\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * 
 * 
 * @param アニメコモン_3
 * @desc アニメコモンその3。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■連射\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"スプレッド\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"4\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"5\",\"■移動\":\"\",\"移動時間\":\"30\",\"移動ディレイ\":\"\",\"移動X\":\"-50\",\"移動Y\":\"-5~5\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"20\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"30\",\"変動ディレイ\":\"\",\"→拡大率\":\"75tn\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スプレッド_大\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"3\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"5\",\"■移動\":\"\",\"移動時間\":\"30\",\"移動ディレイ\":\"\",\"移動X\":\"-50\",\"移動Y\":\"-5~5\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"30\",\"変動ディレイ\":\"\",\"→拡大率\":\"75tn\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"スプレッド_大_遅\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"3\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"5\",\"■移動\":\"\",\"移動時間\":\"30\",\"移動ディレイ\":\"\",\"移動X\":\"-50\",\"移動Y\":\"-5~5\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"100\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"30\",\"変動ディレイ\":\"\",\"→拡大率\":\"75tn\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ラピッド\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"3\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"10\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"-100~100\",\"移動Y\":\"-10~10\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"30\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"手裏剣\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"-30\",\"位置ずらしY\":\"-24\",\"■発生\":\"\",\"発生数\":\"4\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"10\",\"■移動\":\"\",\"移動時間\":\"50\",\"移動ディレイ\":\"\",\"移動X\":\"-100~100\",\"移動Y\":\"-10~10\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"45\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"50\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * 
 * 
 * @param アニメコモン_4
 * @desc アニメコモンその4。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■ループ\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"ループ\",\"再生回数\":\"-1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"150\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"ループ_2k\",\"再生回数\":\"-1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"150\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"2\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"200\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"20\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"true\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * 
 * 
 * @param アニメコモン_5
 * @desc アニメコモンその5。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■マップ\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"アタック\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"-30\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"true\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"true\",\"回転時間\":\"5\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"バースト\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"-30\",\"位置ずらしY\":\"-24\",\"■発生\":\"\",\"発生数\":\"4\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"10\",\"■移動\":\"\",\"移動時間\":\"50\",\"移動ディレイ\":\"\",\"移動X\":\"-100~100\",\"移動Y\":\"-10~10\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"25\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"50\",\"変動ディレイ\":\"\",\"→拡大率\":\"75tn\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"バースト_多\",\"再生回数\":\"1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"-30\",\"位置ずらしY\":\"-24\",\"■発生\":\"\",\"発生数\":\"7\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"10\",\"■移動\":\"\",\"移動時間\":\"30\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"50\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"300\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"50\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"\",\"効果音なし\":\"\",\"■パーティクル変動\":\"\",\"変動時間\":\"30\",\"変動ディレイ\":\"\",\"→拡大率\":\"75tn\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"360\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"true\",\"向き回転Y\":\"true\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * @param アニメコモン_6
 * @desc アニメコモンその6。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default ["{\"コモン名\":\"■背景\",\"再生回数\":\"1\",\"開始ウェイト\":\"0\",\"中間ウェイト\":\"0\",\"レイヤー\":\"B1\",\"ズーム対応\":\"true\",\"表示範囲\":\"0\",\"■位置\":\"\",\"位置ずらしX\":\"0\",\"位置ずらしY\":\"0\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"[]\",\"発生ずらしX\":\"0\",\"発生ずらしY\":\"0\",\"最初は初期位置\":\"false\",\"発生ディレイ\":\"0\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"0\",\"移動X\":\"0\",\"移動Y\":\"0\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"false\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"false\",\"効果音なし\":\"false\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"0\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"false\",\"回転時間\":\"15\"}","{\"コモン名\":\"バック\",\"再生回数\":\"-1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"A1\",\"ズーム対応\":\"false\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"1\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"200\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"20\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"true\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"バックフラワー\",\"再生回数\":\"-1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"30\",\"レイヤー\":\"A1\",\"ズーム対応\":\"false\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"10\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"15~30\",\"■移動\":\"\",\"移動時間\":\"20\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"30~60\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"\",\"オフセットX\":\"-408~408\",\"オフセットY\":\"-312~312\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"true\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}","{\"コモン名\":\"バック_2k\",\"再生回数\":\"-1\",\"開始ウェイト\":\"\",\"中間ウェイト\":\"\",\"レイヤー\":\"\",\"ズーム対応\":\"false\",\"表示範囲\":\"\",\"■位置\":\"\",\"位置ずらしX\":\"\",\"位置ずらしY\":\"\",\"■発生\":\"\",\"発生数\":\"2\",\"発生ルート\":\"\",\"発生ずらしX\":\"\",\"発生ずらしY\":\"\",\"最初は初期位置\":\"\",\"発生ディレイ\":\"240\",\"■移動\":\"\",\"移動時間\":\"\",\"移動ディレイ\":\"\",\"移動X\":\"\",\"移動Y\":\"\",\"移動リセットX\":\"true\",\"移動リセットY\":\"true\",\"■パーティクル設定\":\"\",\"拡大率\":\"200\",\"拡大率X\":\"\",\"拡大率Y\":\"\",\"拡大率Z\":\"\",\"回転X\":\"\",\"回転Y\":\"\",\"回転Z\":\"\",\"速度\":\"20\",\"オフセットX\":\"\",\"オフセットY\":\"\",\"下揃え\":\"\",\"効果音-音量率\":\"\",\"効果音-ピッチ率\":\"\",\"フラッシュなし\":\"true\",\"効果音なし\":\"true\",\"■パーティクル変動\":\"\",\"変動時間\":\"20\",\"変動ディレイ\":\"\",\"→拡大率\":\"\",\"→拡大率X\":\"\",\"→拡大率Y\":\"\",\"→拡大率Z\":\"\",\"→回転X\":\"\",\"→回転Y\":\"\",\"→回転Z\":\"\",\"■向き対応\":\"\",\"向き回転X\":\"false\",\"向き回転Y\":\"false\",\"向き回転R\":\"\",\"回転時間\":\"15\",\"■特殊効果\":\"\",\"画面ストップ\":\"0, 0\"}"]
 * 
 * @param アニメコモン_7
 * @desc アニメコモンその7。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default 
 * 
 * @param アニメコモン_8
 * @desc アニメコモンその8。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default 
 * 
 * @param アニメコモン_9
 * @desc アニメコモンその9。どれを使ってもよい
 * @type struct<animeCommon>[]
 * @default 
 * 
 *
 *
 * @command アニメ表示-マップ
 * @desc マップの好きな場所にパーティクルアニメを表示する
 *
 * @arg アニメ名
 * @desc アニメに付ける名前。アニメ消去の際の対象指定に使う
 *
 * @arg アニメファイル
 * @desc 表示するアニメファイル
 * @type animation 
 *
 * @arg 表示・移動対象
 * @desc アニメを表示する対象と移動先。キャラ、マップ位置、画面位置
 * @type struct<targetMap>
 *
 * @arg アニメ設定
 * @desc アニメの各種設定
 * @type struct<animeCfg>
 *
 * @arg …コモン使用
 * @desc アニメコモンを呼び出し、アニメ設定として使用する。呼び出しには登録したコモン名を書く
 * @type 
 * @default 
 *
 *
 *
 * @command アニメ表示-バトル
 * @desc バトルの好きな場所にパーティクルアニメを表示する
 *
 * @arg アニメ名
 * @desc アニメに付ける名前。アニメ消去の際の対象指定に使う
 *
 * @arg アニメファイル
 * @desc 表示するアニメファイル
 * @type animation 
 *
 * @arg 表示・移動対象
 * @desc アニメを表示する対象。アクター、エネミー、画面位置
 * @type struct<targetBattle>
 *
 * @arg アニメ設定
 * @desc アニメの拡大率、速度などを変更する
 * @type struct<animeCfg>
 *
 * @arg …コモン使用
 * @desc アニメコモンを呼び出し、アニメ設定として使用する。呼び出しには登録したコモン名を書く
 * @type 
 * @default 
 *
 *
 *
 * @command アニメ削除
 * @desc 表示中のパーティクルアニメを削除する
 *
 * @arg 名前で削除
 * @desc アニメ名でアニメを選択し削除する。, で区切って複数指定可能
 *
 * @arg すべて削除
 * @desc 全てのアニメを削除する
 * @type boolean
 * @default false 
 */
 
 
 
//==================================================
/*~struct~animeCfg:
//==================================================
 * @param 再生回数
 * @desc アニメの再生回数。2 なら 2回。-1 なら 無限ループ
 * @default 
 *
 * @param 開始ウェイト
 * @desc アニメ開始時のウェイト。5 なら 5フレーム。演算可
 * @default 
 *
 * @param 中間ウェイト
 * @desc 再生回数が2回以上の時のアニメ再生間のウェイト。5 なら 5フレーム。演算可
 * @default 
 * 
 * @param レイヤー
 * @desc 表示レイヤー。A はキャラの下、B はキャラの上、Cはウインドウの下、Dはウインドウの上。数字が大きいほど上に表示
 * @type select
 * @option A1
 * @option A2
 * @option A3
 * @option B1
 * @option B2
 * @option B3
 * @option C1
 * @option C2
 * @option C3
 * @option D1
 * @option D2
 * @option D3
 * @default 
 *
 * @param ズーム対応
 * @desc 画面のズームに合わせて大きさを変動させる
 * @type boolean
 * @default 
 *
 * @param 表示範囲
 * @desc 表示範囲外ではアニメを表示せず軽量化する。150 なら 画面の 150% の大きさの範囲内でのみ表示。0 なら常に表示
 * @default 
 *
 * @param ■位置
 *
 * @param 位置ずらしX
 * @parent ■位置
 * @desc アニメ位置のXずらし幅。5 なら右に 5 ピクセル
 * @default 
 *
 * @param 位置ずらしY
 * @parent ■位置
 * @desc アニメ位置のYずらし幅。5 なら右に 5 ピクセル
 * @default 
 *
 * @param ■発生
 *
 * @param 発生数
 * @parent ■発生
 * @desc アニメを発生させる数。2 なら 2個
 * @default 
 *
 * @param 発生ルート
 * @parent ■発生
 * @desc アニメを複数発生させる場合の移動ルート設定
 * @type struct<ariseRoute>[]
 * @default 
 *
 * @param 発生ずらしX
 * @parent ■発生
 * @desc アニメを複数発生させる場合のXずらし量。5 なら 右に 5ピクセル ずつずれていく。演算可
 * @default 
 *
 * @param 発生ずらしY
 * @parent ■発生
 * @desc アニメを複数発生させる場合のYずらし量。5 なら 下に 5ピクセル ずつずれていく。演算可
 * @default 
 *
 * @param 最初は初期位置
 * @parent ■発生
 * @desc 一発目のアニメには移動効果を適用せず、初期位置に表示する
 * @type boolean
 * @default 
 *
 * @param 発生ディレイ
 * @parent ■発生
 * @desc アニメを複数発生させる場合の遅延時間。5 なら 発生を一つあたり 5フレーム ずつ遅らせる。演算可
 * @default 
 *
 * @param ■移動
 *
 * @param 移動時間
 * @parent ■移動
 * @desc アニメの移動時間。5 なら 5フレーム 。演算可
 * @default 
 *
 * @param 移動ディレイ
 * @parent ■移動
 * @desc アニメ移動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 
 *
 * @param 移動X
 * @parent ■移動
 * @desc アニメのX移動量。5 なら右に 5ピクセル。演算可。動作文字対応
 * @default 
 *
 * @param 移動Y
 * @parent ■移動
 * @desc アニメのY移動量。5 なら下に 5ピクセル。演算可。動作文字対応
 * @default 
 *
 * @param 移動リセットX
 * @parent ■移動
 * @desc アニメを繰り返す時、X方向の移動量を元に戻す
 * @type boolean
 * @default 
 *
 * @param 移動リセットY
 * @parent ■移動
 * @desc アニメを繰り返す時、Y方向の移動量を元に戻す
 * @type boolean
 * @default 
 *
 * @param ■パーティクル設定
 *
 * @param 拡大率
 * @parent ■パーティクル設定
 * @desc アニメの拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率X
 * @parent ■パーティクル設定
 * @desc アニメのX拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率Y
 * @parent ■パーティクル設定
 * @desc アニメのY拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率Z
 * @parent ■パーティクル設定
 * @desc アニメのZ拡大率。200 なら 200%大。演算可
 *
 * @param 回転X
 * @parent ■パーティクル設定
 * @desc アニメのX軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 回転Y
 * @parent ■パーティクル設定
 * @desc アニメのY軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 回転Z
 * @parent ■パーティクル設定
 * @desc アニメのZ軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 速度
 * @parent ■パーティクル設定
 * @desc アニメの速度。200 なら 200%速。演算可
 *
 * @param オフセットX
 * @parent ■パーティクル設定
 * @desc アニメのX位置ずらし。5 なら右に 5ピクセル。演算可
 *
 * @param オフセットY
 * @parent ■パーティクル設定
 * @desc アニメのY位置ずらし。5 なら右に 5ピクセル。演算可
 *
 * @param 下揃え
 * @parent ■パーティクル設定
 * @desc アニメを下揃えにする
 * @type boolean
 * @default 
 *
 * @param 効果音-音量率
 * @parent ■パーティクル設定
 * @desc 効果音の音量率。50 なら元の値の 50%
 * @default
 *
 * @param 効果音-ピッチ率
 * @parent ■パーティクル設定
 * @desc 効果音のピッチ率。50 なら元の値の 50%
 * @default
 *
 * @param フラッシュなし
 * @parent ■パーティクル設定
 * @desc アニメのフラッシュをなくす
 * @type boolean
 * @default  
 *
 * @param 効果音なし
 * @parent ■パーティクル設定
 * @desc アニメの効果音をなくす
 * @type boolean
 * @default  
 *
 * @param ■パーティクル変動
 *
 * @param 変動時間
 * @parent ■パーティクル変動
 * @desc パーティクルの変動時間。5 なら 5フレーム 。演算可
 * @default 
 *
 * @param 変動ディレイ
 * @parent ■パーティクル変動
 * @desc パーティクル変動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 
 *
 * @param →拡大率
 * @parent ■パーティクル変動
 * @desc アニメの拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率X
 * @parent ■パーティクル変動
 * @desc アニメのX拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率Y
 * @parent ■パーティクル変動
 * @desc アニメのY拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率Z
 * @parent ■パーティクル変動
 * @desc アニメのZ拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →回転X
 * @parent ■パーティクル変動
 * @desc アニメのX軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param →回転Y
 * @parent ■パーティクル変動
 * @desc アニメのY軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param →回転Z
 * @parent ■パーティクル変動
 * @desc アニメのZ軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param ■向き対応
 *
 * @param 向き回転X
 * @parent ■向き対応
 * @desc キャラの向きに応じてアニメのX位置を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default 
 *
 * @param 向き回転Y
 * @parent ■向き対応
 * @desc 表示キャラの向きに応じてアニメの位置を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default 
 *
 * @param 向き回転R
 * @parent ■向き対応
 * @desc 表示キャラの向きに応じてアニメの回転角を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default 
 *
 * @param 回転時間
 * @parent ■向き対応
 * @desc 向き回転の動作時間。5 なら 5フレーム
 * @default 
 * 
 * @param ■特殊効果
 * 
 * @param 画面ストップ
 * @parent ■特殊効果
 * @desc 画面を止める演出。5, 7 なら 5フレーム 待ってから 7フレーム 止める。プラグイン『Keke_HitStop』が必要
 * @default 
 */
 
 
 
//==================================================
/*~struct~animeCommon:
//==================================================
 * @param コモン名
 * @desc コモンの名前。呼び出しに使う
 * @default
 *
 * @param 再生回数
 * @desc アニメの再生回数。2 なら 2回。-1 なら 無限ループ
 * @default 1
 *
 * @param 開始ウェイト
 * @desc アニメ開始時のウェイト。5 なら 5フレーム。演算可
 * @default 
 *
 * @param 中間ウェイト
 * @desc 再生回数が2回以上の時のアニメ再生間のウェイト。5 なら 5フレーム。演算可
 * @default 
 *
 * @param レイヤー
 * @desc 表示レイヤー。A はキャラの下、B はキャラの上、Cはウインドウの下、Dはウインドウの上。数字が大きいほど上に表示
 * @type select
 * @option A1
 * @option A2
 * @option A3
 * @option B1
 * @option B2
 * @option B3
 * @option C1
 * @option C2
 * @option C3
 * @option D1
 * @option D2
 * @option D3
 * @default B1
 *
 * @param ズーム対応
 * @desc 画面のズームに合わせて大きさを変動させる
 * @type boolean
 * @default true
 *
 * @param 表示範囲
 * @desc 表示範囲外ではアニメを表示せず軽量化する。150 なら 画面の 150% の大きさの範囲内でのみ表示。0 なら常に表示
 * @default 
 * 
 * @param ■位置
 *
 * @param 位置ずらしX
 * @parent ■位置
 * @desc アニメ位置のXずらし幅。5 なら右に 5 ピクセル
 * @default 
 *
 * @param 位置ずらしY
 * @parent ■位置
 * @desc アニメ位置のYずらし幅。5 なら右に 5 ピクセル
 * @default 
 *
 * @param ■発生
 *
 * @param 発生数
 * @parent ■発生
 * @desc アニメを発生させる数。2 なら 2個
 * @default 1
 *
 * @param 発生ルート
 * @parent ■発生
 * @desc アニメを複数発生させる場合の移動ルート設定
 * @type struct<ariseRoute>[]
 * @default 
 *
 * @param 発生ずらしX
 * @parent ■発生
 * @desc アニメを複数発生させる場合のXずらし量。5 なら 右に 5ピクセル ずつずれていく。演算可
 * @default 
 *
 * @param 発生ずらしY
 * @parent ■発生
 * @desc アニメを複数発生させる場合のYずらし量。5 なら 下に 5ピクセル ずつずれていく。演算可
 * @default 
 *
 * @param 最初は初期位置
 * @parent ■発生
 * @desc 一発目のアニメには移動効果を適用せず、初期位置に表示する
 * @type boolean
 * @default 
 *
 * @param 発生ディレイ
 * @parent ■発生
 * @desc アニメを複数発生させる場合の遅延時間。5 なら 発生を一つあたり 5フレーム ずつ遅らせる。演算可
 * @default 
 *
 * @param ■移動
 *
 * @param 移動時間
 * @parent ■移動
 * @desc アニメの移動時間。5 なら 5フレーム 。演算可
 * @default 20
 *
 * @param 移動ディレイ
 * @parent ■移動
 * @desc アニメ移動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 
 *
 * @param 移動X
 * @parent ■移動
 * @desc アニメのX移動量。5 なら右に 5ピクセル。演算可。動作文字対応
 * @default 
 *
 * @param 移動Y
 * @parent ■移動
 * @desc アニメのY移動量。5 なら下に 5ピクセル。演算可。動作文字対応
 * @default 
 *
 * @param 移動リセットX
 * @parent ■移動
 * @desc アニメを繰り返す時、X方向の移動量を元に戻す
 * @type boolean
 * @default true
 *
 * @param 移動リセットY
 * @parent ■移動
 * @desc アニメを繰り返す時、Y方向の移動量を元に戻す
 * @type boolean
 * @default true
 *
 * @param ■パーティクル設定
 *
 * @param 拡大率
 * @parent ■パーティクル設定
 * @desc アニメの拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率X
 * @parent ■パーティクル設定
 * @desc アニメのX拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率Y
 * @parent ■パーティクル設定
 * @desc アニメのY拡大率。200 なら 200%大。演算可
 *
 * @param 拡大率Z
 * @parent ■パーティクル設定
 * @desc アニメのZ拡大率。200 なら 200%大。演算可
 *
 * @param 回転X
 * @parent ■パーティクル設定
 * @desc アニメのX軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 回転Y
 * @parent ■パーティクル設定
 * @desc アニメのY軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 回転Z
 * @parent ■パーティクル設定
 * @desc アニメのZ軸の回転角。5 なら 5度、-5 なら -5度。演算可
 *
 * @param 速度
 * @parent ■パーティクル設定
 * @desc アニメの速度。200 なら 200%速。演算可
 *
 * @param オフセットX
 * @parent ■パーティクル設定
 * @desc アニメのX位置ずらし。5 なら右に 5ピクセル。演算可
 *
 * @param オフセットY
 * @parent ■パーティクル設定
 * @desc アニメのY位置ずらし。5 なら右に 5ピクセル。演算可
 *
 * @param 下揃え
 * @parent ■パーティクル設定
 * @desc アニメを下揃えにする
 * @type boolean
 * @default 
 *
 * @param 効果音-音量率
 * @parent ■パーティクル設定
 * @desc 効果音の音量率。50 なら元の値の 50%
 * @default
 *
 * @param 効果音-ピッチ率
 * @parent ■パーティクル設定
 * @desc 効果音のピッチ率。50 なら元の値の 50%
 * @default
 *
 * @param フラッシュなし
 * @parent ■パーティクル設定
 * @desc アニメのフラッシュをなくす
 * @type boolean
 * @default 
 *
 * @param 効果音なし
 * @parent ■パーティクル設定
 * @desc アニメの効果音をなくす
 * @type boolean
 * @default 
 *
 * @param ■パーティクル変動
 *
 * @param 変動時間
 * @parent ■パーティクル変動
 * @desc パーティクルの変動時間。5 なら 5フレーム 。演算可
 * @default 20
 *
 * @param 変動ディレイ
 * @parent ■パーティクル変動
 * @desc パーティクル変動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 
 *
 * @param →拡大率
 * @parent ■パーティクル変動
 * @desc アニメの拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率X
 * @parent ■パーティクル変動
 * @desc アニメのX拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率Y
 * @parent ■パーティクル変動
 * @desc アニメのY拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →拡大率Z
 * @parent ■パーティクル変動
 * @desc アニメのZ拡大率の変動目標。200 で 200%になる。演算可。動作文字対応
 *
 * @param →回転X
 * @parent ■パーティクル変動
 * @desc アニメのX軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param →回転Y
 * @parent ■パーティクル変動
 * @desc アニメのY軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param →回転Z
 * @parent ■パーティクル変動
 * @desc アニメのZ軸の回転角の変動目標。5 なら 5度、-5 なら -5度になる。演算可。動作文字対応
 *
 * @param ■向き対応
 *
 * @param 向き回転X
 * @parent ■向き対応
 * @desc キャラの向きに応じてアニメのX位置を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default true
 *
 * @param 向き回転Y
 * @parent ■向き対応
 * @desc 表示キャラの向きに応じてアニメの位置を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default true
 *
 * @param 向き回転R
 * @parent ■向き対応
 * @desc 表示キャラの向きに応じてアニメの回転角を回転する。左向きが基準。左向きを前提に各種数値設定をすること
 * @type boolean
 * @default 
 *
 * @param 回転時間
 * @parent ■向き対応
 * @desc 向き回転の動作時間。5 なら 5フレーム
 * @default 15
 * 
 * @param ■特殊効果
 * 
 * @param 画面ストップ
 * @parent ■特殊効果
 * @desc 画面を止める演出。5, 7 なら 5フレーム 待ってから 7フレーム 止める。プラグイン『Keke_HitStop』が必要
 * @default 0, 0
 */
 
 
 
//==================================================
/*~struct~ariseRoute:
//==================================================
 * @param ずらしX
 * @desc アニメのXずらし幅。5 なら 右に 5ピクセル ずれる
 *
 * @param ずらしY
 * @desc アニメのYずらし幅。5 なら 下に 5ピクセル ずれる
 *
 * @param ディレイ
 * @desc アニメの遅延時間。5 なら発生を 5フレーム 遅らせる
 */
 
 
 
//==================================================
/*~struct~targetMap:
//==================================================
 * @param ■表示対象
 *
 * @param 表示キャラ-名前
 * @parent ■表示対象
 * @desc 名前で対象を選択。***→イベント検索、セルフ→イベント自身、プレイヤー→プレイヤー、全て→全キャラ。, で複数選択
 *
 * @param /表示キャラ-ID
 * @parent ■表示対象
 * @desc IDで対象を選択。1〜→イベントID。0→イベント自身、-1→プレイヤー、-2→全キャラ。 , で複数選択、~ でまとめて選択
 *
 * @param …位置固定
 * @parent ■表示対象
 * @desc キャラに表示させたアニメの位置を固定する
 * @type select
 * @option 固定しない
 * @option マップに固定
 * @option 画面に固定
 * @default 固定しない
 * 
 * @param …可視連動
 * @parent ■表示対象
 * @desc アニメの可視状態をキャラと連動する。キャラが非表示の時はアニメも非表示になる
 * @type boolean
 * @default 
 *
 * @param 表示マップX
 * @parent ■表示対象
 * @desc アニメを表示するマップX位置。5 ならマップ左端から 5マス目
 *
 * @param 表示マップY
 * @parent ■表示対象
 * @desc アニメを表示するマップY位置。5 ならマップ上端から 5マス目
 *
 * @param 表示画面X
 * @parent ■表示対象
 * @desc アニメを表示する画面X座標。50 なら画面左端から 50ピクセル
 *
 * @param 表示画面Y
 * @parent ■表示対象
 * @desc アニメを表示する画面Y座標。50 なら画面上端から 50ピクセル
 *
 * @param ■移動先
 *
 * @param 移動時間
 * @parent ■移動先
 * @desc アニメの移動時間。5 なら 5フレーム 。演算可
 * @default 
 *
 * @param 移動ディレイ
 * @parent ■移動先
 * @desc アニメ移動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 
 *
 * @param 移動先キャラ-名前
 * @parent ■移動先
 * @desc 名前で対象を選択。***→イベント検索、セルフ→イベント自身、プレイヤー→プレイヤー、全て→全キャラ。, で複数選択
 *
 * @param /移動先キャラ-ID
 * @parent ■移動先
 * @desc IDで対象を選択。1〜→イベントID。0→イベント自身、-1→プレイヤー、-2→全キャラ。 , で複数選択、~ でまとめて選択
 *
 * @param 移動先マップX
 * @parent ■移動先
 * @desc アニメを移動させるマップX位置。5 ならマップ左端から 5マス目
 *
 * @param 移動先マップY
 * @parent ■移動先
 * @desc アニメを移動させるマップY位置。5 ならマップ上端から 5マス目
 *
 * @param 移動先画面X
 * @parent ■移動先
 * @desc アニメを移動させる画面X座標。50 なら画面左端から 50ピクセル
 *
 * @param 移動先画面Y
 * @parent ■移動先
 * @desc アニメを移動させる画面Y座標。50 なら画面上端から 50ピクセル
 *
 * @param 移動リセット
 * @parent ■移動先
 * @desc アニメを繰り返す時、移動量を元に戻す
 * @type boolean
 * @default true
 *
 * @param 追尾モード
 * @parent ■移動先
 * @desc 移動先を追尾させる。追尾する場合は追いかけ、しない場合は移動開始時のキャラの位置に向かっていく
 * @type boolean
 * @default 
 */
 
 
 
//==================================================
/*~struct~targetBattle:
//==================================================
 * @param ■表示対象
 *
 * @param 表示アクター-名前
 * @parent ■表示対象
 * @desc アクターを名前で選択。全て→全キャラ。, で複数選択
 *
 * @param /表示アクター-ID
 * @parent ■表示対象
 * @desc アクターをIDで選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param /表示アクター-順番
 * @parent ■表示対象
 * @desc アクターを並び順で選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param 表示エネミー-名前
 * @parent ■表示対象
 * @desc エネミーを名前で選択。全て→全キャラ。, で複数選択
 *
 * @param /表示エネミー-ID
 * @parent ■表示対象
 * @desc エネミーをIDで選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param /表示エネミー-順番
 * @parent ■表示対象
 * @desc エネミーを並び順で選択。1〜。 で複数選択、~ でまとめて選択
 *
 * @param 表示画面X
 * @parent ■表示対象
 * @desc アニメを表示する画面X座標。50 なら画面左端から 50ピクセル
 *
 * @param 表示画面Y
 * @parent ■表示対象
 * @desc アニメを表示する画面Y座標。50 なら画面上端から 50ピクセル
 *
 * @param ■移動先
 *
 * @param 移動時間
 * @parent ■移動先
 * @desc アニメの移動時間。5 なら 5フレーム 。演算可
 * @default 0
 *
 * @param 移動ディレイ
 * @parent ■移動先
 * @desc アニメ移動の遅延時間。5 なら移動開始を 5フレーム 遅らせる。演算可
 * @default 0
 *
 * @param 移動先アクター-名前
 * @parent ■移動先
 * @desc アクターを名前で選択。全て→全キャラ。, で複数選択
 *
 * @param /移動先アクター-ID
 * @parent ■移動先
 * @desc アクターをIDで選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param /移動先アクター-順番
 * @parent ■移動先
 * @desc アクターを並び順で選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param 移動先エネミー-名前
 * @parent ■移動先
 * @desc エネミーを名前で選択。全て→全キャラ。, で複数選択
 *
 * @param /移動先エネミー-ID
 * @parent ■移動先
 * @desc エネミーをIDで選択。1〜。 , で複数選択、~ でまとめて選択
 *
 * @param /移動先エネミー-順番
 * @parent ■移動先
 * @desc エネミーを並び順で選択。1〜。 で複数選択、~ でまとめて選択
 *
 * @param 移動先画面X
 * @parent ■移動先
 * @desc アニメを移動先する画面X座標。50 なら画面左端から 50ピクセル
 *
 * @param 移動先画面Y
 * @parent ■移動先
 * @desc アニメを移動先する画面Y座標。50 なら画面上端から 50ピクセル
 *
 * @param 移動リセット
 * @parent ■移動先
 * @desc アニメを繰り返す時、移動量を元に戻す
 * @type boolean
 * @default true
 *
 * @param 追尾モード
 * @parent ■移動先
 * @desc 移動先を追尾させる。追尾する場合は追いかけ、しない場合は移動開始時のキャラの位置に向かっていく
 * @type boolean
 * @default false
 */
 
 
 
(() => {
    //- プラグイン名
    const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
    
    
    
    //==================================================
    //--  スプライト追加 /ベーシック
    //==================================================
    
    //- 破棄付きスプライト
    function SpriteKeFran() {
        this.initialize(...arguments);
    }

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

    SpriteKeFran.prototype.destroy = function() {
        if (this.bitmap && !this.bitmap._url) { this.bitmap.destroy(); }
        if (!this._texture) { return; }
        Sprite.prototype.destroy.apply(this);
    };

    SpriteKeFran.prototype.endAnimation = function() {
        this._inAnimeKe = false;
    };


    //- 破棄付きスプライト-バトラー
    function SpriteKeFranBattler() {
        this.initialize(...arguments);
    }

    SpriteKeFranBattler.prototype = Object.create(Sprite_Battler.prototype);
    SpriteKeFranBattler.prototype.constructor = SpriteKeFranBattler;

    SpriteKeFranBattler.prototype.destroy = function() {
        if (this.bitmap && !this.bitmap._url) { this.bitmap.destroy(); }
        if (!this._texture) { return; }
        Sprite.prototype.destroy.apply(this);
    };

    SpriteKeFranBattler.prototype.endAnimation = function() {
        this._inAnimeKe = false;
    };

    SpriteKeFranBattler.prototype.update = function() {
        Sprite.prototype.update.call(this);
    };
    
    
    //- 独自アニメーションスプライト
    function Sprite_AnimationKeFran() {
        this.initialize(...arguments);
    };

    Sprite_AnimationKeFran.prototype = Object.create(Sprite_Animation.prototype);
    Sprite_AnimationKeFran.prototype.constructor = Sprite_AnimationKeFran;
    
    Sprite_AnimationKeFran.prototype.destroy = function(options) {
        if (!this._texture) { return; }
        Sprite_Animation.prototype.destroy.apply(this);
    };
    
    
    
    //==================================================
    //--  文字列オート変換 /ベーシック
    //==================================================
    
    // 文字列のハッシュ化
    function strToHash(str) {
        if (!str || !str.length) { return {}; }
        let hash = {};
        const strs = JSON.parse(str);
        let val = null;
        let val2 = null;
        for (let key in strs) {
            val = strs[key];
            if (!key || !val) { continue; }
            val2 = strToAuto(val, key);
            hash[key] = val2;
        }
        return hash;
    };
    
    
    // 文字列のリスト化
    function strToList(str) {
        if (!str || !str.length) { return []; }
        let array = JSON.parse(str);
        return array.map((val, i) => {
            return strToAuto(val);
        });
    };
    
    
    // 文字列の自動処理
    function strToAuto(val, key = "") {
        let val2 = null;
        let match = null;
        let end = false;
        if (!end) {
            if (val[0] == "{") {
                val2 = strToHash(val);
                end = true;
            }
        }
        if (!end) {
            if (val[0] == "[") {
                val2 = strToList(val);
                end = true;
            }
        }
        if (!end) { val = val + ","; }
        if (!end) {
            match = val.match(/^\s*(-?\d+,\s*-?\d+,\s*-?\d+,?\s*-?\d*\.?\d*)\s*,$/);
            if (match && !val.match(/[^\d\.\-,\s]/)) {
                if (key.match(/(カラー|色)/) && !key.includes("トーン") && !key.includes("ブレンド") && !key.includes("配色") && !key.includes("着色") &&  !key.includes("フラッシュ") && !key.includes("チェンジ") &&  !key.includes("選択")) {
                    val2 = "rgba(" +  match[1] + ")";
                } else {
                    val2 =  JSON.parse("[" +  match[1] + "]");
                }
                end = true;
            }
        }
        if (!end) {
            match = val.match(/(-?\d+\.?\d*),\s*/g);
            if (match && match.length >= 2 && !val.match(/[^\d\.\-,\s]/)) {
                val2 = JSON.parse("[" + match.reduce((r, s) => r + s).replace(/,$/, "") + "]");
                end = true;
            }
        }
        if (!end) {
            match = val.match(/^(true|false)\s*,/);
            if (match) {
                val2 =  match[1] == "true" ? true : false;
                end = true;
            }
        }
        if (!end) {
            match = val.match(/^(-?\d+\.?\d*)\s*,/);
            if (match && !val.match(/[^\d\.\-,\s]/)) {
                val2 = Number(match[1]); end = true;
                end = true;
            }
        }
        if (!end) {
            match = val.match(/^.+,.+/);
            if (match) {
                val2 = val.replace(/\s/g, "").split(",").filter(v => v);
                end = true;
            }
        }
        if (!end) {
            if (val[0] == "\"") { val = val.slice(1); }
            val2 = val.slice(0, -1);
        }
        return val2;
    };
    
    
    
    //==================================================
    //--  パラメータ受け取り
    //==================================================
    
    //- 真偽化
    function toBoolean(str) {
        if (!str) { return false; }
        const str2 = str.toString().toLowerCase();
        if (str2 == "true") { return true; }
        if (str2 == "false") { return false; }
        return Number(str);
    };

    const parameters = PluginManager.parameters(pluginName);
    
    let keke_animeCommons = parameters["アニメコモン登録"] ? JSON.parse(parameters["アニメコモン登録"]).map(c => JSON.parse(c)) : [];

    for (let i = 1; i <= 9; i++) {
        const common =  parameters["アニメコモン_" + i] ? JSON.parse(parameters["アニメコモン_" + i]).map(c => JSON.parse(c)) : [];
        keke_animeCommons = [...keke_animeCommons, ...common]
    }

    
    
    //==================================================
    //--  プラグインコマンド
    //==================================================
    
    
    // アニメ表示-マップ
    PluginManager.registerCommand(pluginName, "アニメ表示-マップ", args => {
        // フリーアニメの開始-マップ
        startFreeAnimeMap(args, getPlcmEvent());
    });
    
    
    // アニメ表示-バトル
    PluginManager.registerCommand(pluginName, "アニメ表示-バトル", args => {
        // フリーアニメの開始-バトル
        startFreeAnimeBattle(args, getPlcmEvent());
    });
    
    
    // アニメ削除
    PluginManager.registerCommand(pluginName, "アニメ削除", args => {
        // フリーアニメの削除
        delFreeAnime(args, getPlcmEvent());
    });
    
    
    
    //==================================================
    //--  共通開始
    //==================================================
    
    //- スプライトセット・バトル(コア追加)
    const _Spriteset_Map_initialize = Spriteset_Map.prototype.initialize;
    Spriteset_Map.prototype.initialize = function() {
        _Spriteset_Map_initialize.apply(this);
        // フリーアニメの再形成
        setTimeout(recreateFreeAnime, 50, this);
    };
    
    
    //- スプライトセット・バトル(コア追加)
    let inOpenBattle = null;
    const _Spriteset_Battle_initialize = Spriteset_Battle.prototype.initialize;
    Spriteset_Battle.prototype.initialize = function() {
        _Spriteset_Battle_initialize.apply(this);
        // フリーアニメの再形成
        recreateFreeAnime(this);
    };
    
    
    //- ウインドウレイヤーの作成(コア追加)
    const _Scene_Base_createWindowLayer = Scene_Base.prototype.createWindowLayer;
    Scene_Base.prototype.createWindowLayer = function() {
        // アニメレイヤーの作成
        createAnimeLayer(this);
        _Scene_Base_createWindowLayer.apply(this);
    };
    
    
    //- シーンマップ・表示物の作成(コア追加)
    const _Scene_Map_createDisplayObjects = Scene_Map.prototype.createDisplayObjects;
    Scene_Map.prototype.createDisplayObjects = function() {
        _Scene_Map_createDisplayObjects.apply(this);
        // アニメレイヤーの作成_2
        createAnimeLayer_2(this);
    };
    
    
    //- シーンバトル・表示物の作成(コア追加)
    const _Scene_Battle_createDisplayObjects = Scene_Battle.prototype.createDisplayObjects;
    Scene_Battle.prototype.createDisplayObjects = function() {
        _Scene_Battle_createDisplayObjects.apply(this);
        // アニメレイヤーの作成_2
        createAnimeLayer_2(this);
    };
    
    
    
    //==================================================
    //--  共通更新
    //==================================================
    
    //- スプライトセット・マップ更新(コア追加)
    const _Spriteset_Map_update = Spriteset_Map.prototype.update;
    Spriteset_Map.prototype.update = function() {
        _Spriteset_Map_update.apply(this);
        // フリーアニメの更新
        updateFreeAnime();
    };
    
    
    //- スプライトセット・バトル更新(コア追加)
    const _Spriteset_Battle_update = Spriteset_Battle.prototype.update;
    Spriteset_Battle.prototype.update = function() {
        _Spriteset_Battle_update.apply(this);
        // フリーアニメの更新
        updateFreeAnime();
    };
    
    
    
    //==================================================
    //--  共通終了
    //==================================================
    
    //- スプライトセット・マップ(コア追加)
    const _Spriteset_Map_destroy = Spriteset_Map.prototype.destroy
    Spriteset_Map.prototype.destroy = function(options) {
        // スプライトの全破棄
        destroySpriteAll(this);
        _Spriteset_Map_destroy.apply(this, arguments);
    };
    
    
    //- スプライトセット・バトル(コア追加)
    const _Spriteset_Battle_destroy = Spriteset_Battle.prototype.destroy
    Spriteset_Battle.prototype.destroy = function(options) {
        // スプライトの全破棄
        destroySpriteAll(this);
        _Spriteset_Battle_destroy.apply(this, arguments);
    };
    
    
    //- スプライトの全破棄(コア追加)
    function destroySpriteAll(spriteset) {
        // アニメパック内のスプライトを破棄
        const packs = getFreeAnimePack("pre");
        if (!packs || !packs.length) { return; }
        let del = false;
        packs.forEach((pack, i) => {
            if (!pack.sprite) { return; }
            // ターゲットスプライトを破棄
            destroySprite(pack.sprite);
            pack.sprite = null;
            // アニメスプライトを破棄
            destroySprite(pack.aniSprite);
            pack.aniSprite = null;
            // パックの回数を減らす
            if (pack.num > 0) {
                pack.num--;
                // 回数がなくなったら終了
                if (!pack.num) {
                    packs[i] = null;
                    del = true;
                }
            }
            // ズームスケール値を消去
            pack.preZoomScale = null;
        });
        // null を消去
        if (del) { nullcutFreeAnimePack("pre"); }
    };
    
    
    //- スプライトの破棄(コア追加)
    function destroySprite(sprite) {
        if (!sprite) { return; }
        sprite.children.forEach(s => destroySprite(s));
        if (sprite.bitmap && !sprite.bitmap._url) { sprite.bitmap.destroy(); }
        if (sprite._texture) { sprite.destroy(); }
    };
    
    
    //- シーンマップ終了(コア追加)
    const _Scene_Map_terminate = Scene_Map.prototype.terminate;
    Scene_Map.prototype.terminate = function() {
        _Scene_Map_terminate.apply(this);
        // マップ・バトル移行時
        const nextScene = SceneManager._nextScene;
        if (nextScene.constructor.name == "Scene_Map") {
            clearFreeAnimePack();
        }
        // アニメレイヤーの破棄
        destroyAnimeLayer();
    };
    
    
    //- シーンバトル終了(コア追加)
    const _Scene_Battle_terminate = Scene_Battle.prototype.terminate;
    Scene_Battle.prototype.terminate = function() {
        _Scene_Battle_terminate.apply(this);
        // マップ移行時
        const nextScene = SceneManager._nextScene;
        if (nextScene && nextScene.constructor.name == "Scene_Map") {
            // フリーアニメパックのクリア
            clearFreeAnimePack();
        }
        // アニメレイヤーの破棄
        destroyAnimeLayer();
    };
    
    
    //- フリーアニメの削除
    function delFreeAnime(args) {
        // すべて削除
        if (toBoolean(args["すべて削除"])) {
            // フリーアニメの完全消去
            vanishFreeAnime();
            return;
        }
        // 名前で削除
        if (args["名前で削除"]) {
            const names = args["名前で削除"].replace(/\s/g, "").split(",");
            // フリーアニメの完全消去
            vanishFreeAnime(names);
        }
    };
    
    
    //- フリーアニメの完全消去
    function vanishFreeAnime(names) {
        const packs = getFreeAnimePack();
        if (!packs || !packs.length) { return; }
        let del = false;
        packs.forEach((pack, i) => {
            let delOk = !names || names.some(name => name == pack.name);
            if (!delOk) { return; }
            pack.endsInstant = true;
            pack.num = 0;
        });
    };
    
    
    
    //==================================================
    //--  共通処理
    //==================================================
    
    //- フリーアニメパックのセット
    function setFreeAnimePack(pack, timing) {
        const sm = SceneManager;
        const scene = timing == "pre" ? sm._previousScene : timing == "next" ? sm._nextScene : sm._scene;
        const gm = $gameMap;
        if (scene.constructor.name == "Scene_Map") {
            if (!gm._freeAnimePacksKeMap) { gm._freeAnimePacksKeMap = []; }
            gm._freeAnimePacksKeMap.push(pack);
            pack.scene = "map";
        } else {
            if (!gm._freeAnimePacksKeBattle) { gm._freeAnimePacksKeBattle = []; }
            gm._freeAnimePacksKeBattle.push(pack);
            pack.scene = "battle"
        }
    };
    
    
    //- フリーアニメパックの取得
    function getFreeAnimePack(timing) {
        const sm = SceneManager;
        const scene = timing == "pre" ? sm._previousScene : timing == "next" ? sm._nextScene : sm._scene;
        const gm = $gameMap;
        if (scene.constructor.name == "Scene_Map") {
            return gm._freeAnimePacksKeMap;
        } else {
            return gm._freeAnimePacksKeBattle;
        }
    };
    
    
    //- フリーアニメパックのnullカット
    function nullcutFreeAnimePack(timing) {
        const sm = SceneManager;
        const scene = timing == "pre" ? sm._previousScene : timing == "next" ? sm._nextScene : sm._scene;
        const gm = $gameMap;
        if (scene.constructor.name == "Scene_Map") {
            gm._freeAnimePacksKeMap = gm._freeAnimePacksKeMap.filter(p => p);
        } else {
            gm._freeAnimePacksKeBattle = gm._freeAnimePacksKeBattle.filter(p => p);
        }
    };
    
    
    //- フリーアニメパックのクリア
    function clearFreeAnimePack(timing) {
        const sm = SceneManager;
        const scene = timing == "pre" ? sm._previousScene : timing == "next" ? sm._nextScene : sm._scene;
        const gm = $gameMap;
        if (scene.constructor.name == "Scene_Map") {
            gm._freeAnimePacksKeMap = [];
        } else {
            gm._freeAnimePacksKeBattle = [];
        }
    };
    
    
    //- フリーアニメの取得
    function getFreeAnime(names) {
        if (!names || !names.length) { return; }
        const packs = getFreeAnimePack();
        if (!packs || !packs.length) { return; }
        const gets = [];
        packs.forEach((pack, i) => {
            if (names.some(name => name == pack.name)) { gets.push(pack); }
        });
        return gets;
    };
    
    
    //- フルアニメステータスの取得
    function getFullAnimeStatus() {
        if ($gameSystem.isSideView()) { return null; }
        return $gameTemp._fullAnimeStatusKe;
    };
    
    
    //- フルアニメステータスASIの取得
    function getFullAnimeStatusAsi(battler) {
        if ($gameSystem.isSideView()) { return null; }
        if (!getFullAnimeStatus()) { return null; }
        const asi = $gameTemp.getFullAnimeStatusAsiKe(battler);
        if (!asi || !asi.faceBaseSprite) { return null; }
        return asi;
    };
    
    
    //- フルアニメステータス顔グラの取得
    function getFullAnimeStatusFace(battler) {
        if ($gameSystem.isSideView()) { return null; }
        if (!getFullAnimeStatus()) { return null; }
        const asi = $gameTemp.getFullAnimeStatusAsiKe(battler);
        if (!asi) { return null; }
        return asi.faceBaseSprite;
    };
    
    
    
    //==================================================
    //--  レイヤー
    //==================================================
    
    //- アニメレイヤーの作成
    function createAnimeLayer(scene) {
        const sceneName = scene.constructor.name;
        if (sceneName != "Scene_Map" && sceneName != "Scene_Battle") { return; }
        const spriteset = scene._spriteset;
        if (!spriteset) { return; }
        // レイヤーA
        scene._animeLayersKeA = [];
        for (let i = 0; i < 3; i++) {
            sprite = new SpriteKeFran();
            scene._animeLayersKeA[i] = sprite;
            const field = scene.constructor.name == "Scene_Map" ? spriteset._tilemap : scene.constructor.name == "Scene_Battle" ? spriteset._battleField : scene;
            field.addChildAt(sprite, 1);
        };
        // レイヤーB(無効)
        /*scene._animeLayersKeB = [];
        for (let i = 0; i < 3; i++) {
            sprite = new SpriteKeFran();
            scene._animeLayersKeB[i] = sprite;
            const effectsContainer = spriteset ?  spriteset._effectsContainer : scene;
            effectsContainer.addChild(sprite);
        };*/
        // レイヤーC
        scene._animeLayersKeC = [];
        for (let i = 0; i < 3; i++) {
            sprite = new SpriteKeFran();
            scene._animeLayersKeC[i] = sprite;
            scene.addChild(sprite);
        };
    };
    
    
    //- アニメレイヤーの作成_2
    function createAnimeLayer_2(scene) {
        const spriteset = scene._spriteset;
        if (!spriteset) { return; }
        scene._animeLayersKeD = [];
        // レイヤーD
        for (let i = 0; i < 3; i++) {
            sprite = new SpriteKeFran();
            scene._animeLayersKeD[i] = sprite;
            scene.addChild(sprite);
        };
    };
    
    
    //- アニメレイヤーの破棄
    function destroyAnimeLayer() {
        const scene = SceneManager._scene;
        scene._animeLayersKeA.forEach(layer => destroySprite(layer));
        //scene._animeLayersKeB.forEach(layer => destroySprite(layer));
        scene._animeLayersKeC.forEach(layer => destroySprite(layer));
        scene._animeLayersKeD.forEach(layer => destroySprite(layer));
    };
    
    
    //- アニメのチルド
    function childAnime(sprite, tage) {
        if (!sprite) { return; }
        const scene = SceneManager._scene;
        if (!scene._animeLayersKeA) { createAnimeLayer(scene); }
        const match = tage.match(/(レイヤー|)([ABCD])(\d?)/);
        if (!match) { return; }
        // レイヤーBの場合はエフェクトコンテナに
        if (match[2] == "B") {
            scene._spriteset._effectsContainer.addChild(sprite);
            return;
        }
        const layers = scene["_animeLayersKe" + match[2]];
        if (!layers) { return; }
        const layer = layers[Math.max(Number(match[3]) - 1, 1)];
        if (!layer) { return; }
        layer.addChild(sprite);
    };
    
    
    
    //==================================================
    //--  フリーアニメの開始
    //==================================================
    
    //- フリーアニメの開始-マップ
    function startFreeAnimeMap(args, self) {
        const animeName = convertVariable(args["アニメ名"]);
        const animeId = Number(convertVariable(args["アニメファイル"]));
        const tages = args["表示・移動対象"] ? JSON.parse(args["表示・移動対象"]) : {};
        const posFix = convertVariable(tages["…位置固定"]);
        // アニメ設定の作成
        const animeCfg = makeAnimeConfig(args);
        const num = animeCfg ? (calcMulti(0, convertVariable(animeCfg["発生数"]))[0].val || 1) : 1;
        // 発生数パラム
        let ariseParam = { x:0, y:0, moveX:0, moveY:0, delay:0 };
        // 発生数だけ繰り返す
        for (let i = 0; i < num; i++) {
            // 発生パラムの取得
            ariseParam = getAriseParam(ariseParam, animeCfg, i);
            // 表示キャラを取得
            let charas = [...getCharasByName(convertVariable(tages["表示キャラ-名前"]), self), ...getCharasById(convertVariable(tages["/表示キャラ-ID"]), self)];
            // フリーアニメの開始-キャラ
            if (charas.length) {
                startFreeAnimeChara(animeName, animeId, tages, animeCfg, charas, posFix, ariseParam);
            }
            // フリーアニメの開始-マップ
            if (tages["表示マップX"] || tages["表示マップY"]) {
                startFreeAnimePos(animeName, animeId, tages, animeCfg, tages["表示マップX"], tages["表示マップY"], "map", ariseParam);
            }
            // フリーアニメデータの作成-画面
            if (tages["表示画面X"] || tages["表示画面Y"]) {
                startFreeAnimePos(animeName, animeId, tages, animeCfg, tages["表示画面X"], tages["表示画面Y"], "screen", ariseParam);
            }
        }
        // 画面ストップの開始
        startScreenStop(animeCfg["画面ストップ"]);
    };
    
    
    //- アニメ設定の作成
    function makeAnimeConfig(args) {
        const cfg = {};
        const commonName = convertVariable(args["…コモン使用"]);
        const animeCommon = commonName ? (keke_animeCommons.find(c => c["コモン名"] == commonName) || {}) : {};
        const animeCfg = args["アニメ設定"] ? JSON.parse(args["アニメ設定"]) : {};
        if (!Object.keys(animeCommon).length) { return animeCfg; }
        if (!Object.keys(animeCfg).length) { return animeCommon; }
        const body = Object.keys(animeCfg).length ? animeCfg : animeCommon
        Object.keys(body).forEach(key => {
            cfg[key] = animeCfg[key] || animeCommon[key];
        });
        return cfg;
    };
    
    
    //- 発生パラムの取得
    function getAriseParam(ariseParam, animeCfg, i) {
        if (!animeCfg) { return ariseParam; }
        const route = animeCfg["発生ルート"] ? JSON.parse(animeCfg["発生ルート"]) : [];
        const topBase = toBoolean(convertVariable(animeCfg["最初は初期位置"]));
        if (!(!i && topBase)) {
            // 移動ルート
            if (route && route.length) {
                const index = Math.min(i, route.length - 1);
                const poss = route[index] ? JSON.parse(route[index]) : null;
                if (poss) {
                    ariseParam.x = calcMulti(0, convertVariable(poss["ずらしX"]))[0].val || 0;
                    ariseParam.y = calcMulti(0, convertVariable(poss["ずらしY"]))[0].val || 0;
                    ariseParam.delay += calcMulti(0, convertVariable(poss["ディレイ"]))[0].val || 0;
                }
            }
            // 移動
            ariseParam.moveX += calcMulti(0, convertVariable(animeCfg["発生ずらしX"]))[0].val || 0;
            ariseParam.moveY += calcMulti(0, convertVariable(animeCfg["発生ずらしY"]))[0].val || 0;
        }
        // ディレイ
        ariseParam.delayOri = Math.round(calcMulti(0, convertVariable(animeCfg["発生ディレイ"]))[0].val || 0);
        if (i) {
            ariseParam.delay += ariseParam.delayOri;
        }
        return ariseParam;
    };
    
    
    //- フリーアニメの開始-バトル
    function startFreeAnimeBattle(args, self, targets, mirror, moveTime, moveTage) {
        const animeName = convertVariable(args["アニメ名"]);
        const animeId = Number(convertVariable(args["アニメファイル"]));
        const tages = args["表示・移動対象"] ? JSON.parse(args["表示・移動対象"]) : {};
        const posFix = convertVariable(tages["…位置固定"]);
        // アニメ設定の作成
        const animeCfg = makeAnimeConfig(args);
        const num = animeCfg ? (calcMulti(0, convertVariable(animeCfg["発生数"]))[0].val || 1) : 1;
        // 発生数パラム
        let ariseParam = { x:0, y:0, moveX:0, moveY:0, delay:0 };
        // 発生数だけ繰り返す
        for (let i = 0; i < num; i++) {
            // 発生パラムの取得
            ariseParam = getAriseParam(ariseParam, animeCfg, i);
            // 表示バトラーを取得
            const battlers = targets || [...getBattlersByName(tages["表示アクター-名前"], "actor"), ...getBattlersById(tages["/表示アクター-ID"], "actor"), ...getBattlersByIndex(tages["/表示アクター-順番"], "actor"), ...getBattlersByName(tages["表示エネミーー-名前"], "enemy"), ...getBattlersById(tages["/表示エネミー-ID"], "enemy"), ...getBattlersByIndex(tages["/表示エネミー-順番"], "enemy")];
            // フリーアニメの開始-バトラー
            if (battlers.length) {
                startFreeAnimeBattler(animeName, animeId, tages, animeCfg, battlers, false, ariseParam, mirror, moveTime, moveTage);
            }
            // フリーアニメデータの作成-画面
            if (tages["表示画面X"] || tages["表示画面Y"]) {
                startFreeAnimePos(animeName, animeId, tages, animeCfg, tages["表示画面X"], tages["表示画面Y"], "screen", ariseParam);
            }
        }
        // 画面ストップの開始
        startScreenStop(animeCfg["画面ストップ"]);
    };


    //- 画面ストップの開始
    function startScreenStop(str) {
        if (!PluginManager._scripts.some(n => n == "Keke_HitStop")) { return; }
        // 画面ストップ
        $gameTemp.screenStopKe(str);
    };
    
    
    //- フリーアニメの開始-キャラ
    function startFreeAnimeChara(animeName, animeId, tages, animeCfg, charas, posFix, ariseParam, mirror, moveTime, moveTage) {
        // キャラ全てに処理
        charas.forEach(chara => {
            // 位置データの作成
            const posData = { chara:chara, posType:"chara", posFix:posFix };
            // フリーアニメの開始
            startFreeAnime(animeName, animeId, tages, animeCfg, posData, "chara", null, ariseParam, mirror, moveTime, moveTage);
        });
    };
    
    
    //- フリーアニメの開始-バトラー
    function startFreeAnimeBattler(animeName, animeId, tages, animeCfg, battlers, posFix, ariseParam, mirror, moveTime, moveTage) {
        // キャラ全てに処理
        battlers.forEach(battler => {
            // 位置データの作成
            const posData = { battler:battler, posType:"battler" };
            // フルアニメステータス対応
            const asf = getFullAnimeStatusFace(battler);
            if (asf) { posData.asf = asf; }
            // フリーアニメの開始
            startFreeAnime(animeName, animeId, tages, animeCfg, posData, "chara", null, ariseParam, mirror, moveTime, moveTage);
        });
    };
    
    
    //- フリーアニメの開始-位置
    function startFreeAnimePos(animeName, animeId, tages, animeCfg, x, y, posType, ariseParam) {
        // 位置データの作成
        const posData = { x:x, y:y, posType:posType };
        // フリーアニメの開始
        startFreeAnime(animeName, animeId, tages, animeCfg, posData, posType, null, ariseParam);
    };
    
    
    //- フリーアニメの開始
    function startFreeAnime(animeName, animeId, tages, animeCfg, posData, type, pack, ariseParam, mirror, moveTime, moveTage) {
        // ターゲットスプライト形成
        const tageSprite = $gameParty.inBattle() ? new SpriteKeFranBattler : new SpriteKeFran();
        // フリーアニメフラグ
        tageSprite._isFreeAnimeKe = true;
        // キャラの高さを設定
        if (posData.chara) {
            const charaSprite = searchSprite(posData.chara);
            if (charaSprite && charaSprite.heigth) { tageSprite.height = charaSprite.height * charaSprite.scale.y }
        }
        // 高さがなければタイル高に
        if (!tageSprite.height) {
            tageSprite.height = $gameMap.tileHeight();
        }
        // アニメ中フラグをオン
        tageSprite._inAnimeKe = true;
        // フリーアニメパックのセット
        if (pack) {
            pack.sprite = tageSprite;
            tageSprite._packKe = pack;
        } else {
            pack = setFreeAnimePacks(tageSprite, type, animeName, animeId, tages, animeCfg, posData, ariseParam, mirror, moveTime, moveTage);
            tageSprite._packKe = pack;
        }
        // ターゲットスプライトのチルド
        childAnime(tageSprite, pack.layer);
        // アニメーションの即時形成
        createAnimationInstant(pack, animeId, animeCfg);
        // 移動パックのセット
        setMovePack(animeCfg, pack);
        // 移動先のセット
        setMoveTage(pack);
        return tageSprite;
    };
    
    
    //- フリーアニメパックスのセット
    function setFreeAnimePacks(tageSprite, type, animeName, animeId, tages, animeCfg, posData, ariseParam, mirror, moveTime, moveTage) {
        // 再生回数とウェイト
        let num = calcMulti(0, convertVariable(animeCfg["再生回数"]))[0].val || 1;
        if (num > 0) { num--; }
        let startWait = Math.round(calcMulti(0, convertVariable(animeCfg["開始ウェイト"]))[0].val || 0);
        let middleWait = Math.round(calcMulti(0, convertVariable(animeCfg["中間ウェイト"]))[0].val || 0);
        // 位置
        const offsetX = calcMulti(0, convertVariable(animeCfg["位置ずらしX"]))[0].val || 0;
        const offsetY = calcMulti(0, convertVariable(animeCfg["位置ずらしY"]))[0].val || 0;
        // レイヤー
        const layer = animeCfg["レイヤー"] || "レイヤーB1";
        // ズーム対応
        const zoomAdjust = !animeCfg["ズーム対応"] ? true : toBoolean(convertVariable(animeCfg["ズーム対応"]));
        // 表示範囲
        const scopeRate = (convertVariable(animeCfg["表示範囲"]) / 100) || 0;
        // 向き対応
        let direSpinX = false;
        let direSpinY = false;
        let direSpinR = false;
        if (posData.chara) {
            direSpinX = toBoolean(convertVariable(animeCfg["向き回転X"]));
            direSpinY = toBoolean(convertVariable(animeCfg["向き回転Y"]));
            direSpinR = toBoolean(convertVariable(animeCfg["向き回転R"]));
        }
        const spinTimeMax = calcMulti(0, convertVariable(animeCfg["回転時間"]))[0].val || 10;
        // 効果音
        const volumeRate = calcMulti(0, convertVariable(animeCfg["効果音-音量率"]))[0].val / 100 || 1;
        const pitchRate = calcMulti(0, convertVariable(animeCfg["効果音-ピッチ率"]))[0].val / 100 || 1;
        // キャラとの可視連動
        const visibleLinkChara = posData.posType == "chara" && toBoolean(tages["…可視連動"]) ? true : false;
        // パックを作成
        const pack = { sprite:tageSprite, x:0, y:0, type:type, name:animeName, animeId:animeId, tages:tages, animeCfg:animeCfg, posData:posData, num:num, startWait:startWait, middleWait:middleWait, layer:layer, zoomAdjust:zoomAdjust, scopeRate:scopeRate, offsetX:offsetX, offsetY:offsetY, offsetXori:offsetX, offsetYori:offsetY, ariseX:ariseParam.x, ariseY:ariseParam.y, ariseMoveX:ariseParam.moveX, ariseMoveY:ariseParam.moveY, ariseDelayOri:ariseParam.delayOri, ariseDelay:ariseParam.delay, ariseXori:ariseParam.x, ariseYori:ariseParam.y, ariseMoveXori:ariseParam.moveX, ariseMoveYori:ariseParam.moveY, movedX:0, movedY:0, movedToX:0, movedToY:0, chaseX:0, chaseY:0, preChaseX:0, preChaseY:0, direSpinX:direSpinX, direSpinY:direSpinY, direSpinR:direSpinR, animeDire:"" , spinTimeMax:spinTimeMax, reverseX:1, reverseY:1, spinX:0, spinY:0, volumeRate:volumeRate, pitchRate:pitchRate, isOpen:true, mirror:mirror || 1, moveTime:moveTime, moveTage:moveTage, visibleLinkChara:visibleLinkChara };
        // フリーアニメパックのセット
        setFreeAnimePack(pack);
        return pack;
    };
    
    
    //- 移動パックのセット
    function setMovePack(animeCfg, pack, preX = 0, preY = 0) {
        pack.moveTimeMax = Math.round(calcMulti(0, convertVariable(animeCfg["移動時間"]))[0].val || 20);
        pack.moveDura = pack.moveTimeMax;
        pack.moveDelayMax = Math.round(calcMulti(0, convertVariable(animeCfg["移動ディレイ"]))[0].val || 0);
        pack.moveDelay = pack.moveDelayMax;
        pack.moveResetX = !animeCfg["移動リセットX"] ? true : toBoolean(convertVariable(animeCfg["移動リセットX"]));
        pack.moveResetY = !animeCfg["移動リセットY"] ? true : toBoolean(convertVariable(animeCfg["移動リセットY"]));
        pack.moveXs = [];
        pack.moveYs = [];
        const words = ["移動X", "移動Y"];
        words.forEach(word => {
            const moves = word == "移動X" ? pack.moveXs : pack.moveYs;
            const pre =  word == "移動X" ? preX : preY;
            let rs = calcMulti(0, convertVariable(animeCfg[word] || 0));
            rs.forEach((r, i) => {
                if (!r.val) { return; }
                // 変動のセット
                const d = setDrift(moves, pre, pre + r.val, r.easing, r.easingRate);
                d.reverse = 1;
                d.spin = 0;
            });
        });
    };
    
    
    //- 移動先のセット
    function setMoveTage(pack, preX = 0, preY = 0) {
        const tages = pack.tages;
        pack.moveToXs = [];
        pack.moveToYs = [];
        if (!tages) { return; }
        // 移動時間
        pack.moveToTimeMax = Math.round(calcMulti(0, pack.moveTime)[0].val || calcMulti(0, convertVariable(tages["移動時間"]))[0].val || 0);
        pack.moveToDura = pack.moveToTimeMax;
        if (!pack.moveToTimeMax) { return; }
        pack.moveToDelayMax = Math.round(calcMulti(0, convertVariable(tages["移動ディレイ"]))[0].val || 0);
        pack.moveToDelay = pack.moveToDelayMax;
        pack.moveToReset = toBoolean(convertVariable(tages["移動リセット"]));
        pack.moveChase = pack.moveTage || toBoolean(convertVariable(tages["追尾モード"]));
         // 移動先画面
        if (tages["移動先画面X"], tages["移動先画面Y"]) {
            // 移動先画面のセット
            setMoveToScreen(pack, tages, preX, preY);
        // 移動先マップ
        } else if (tages["移動先マップX"], tages["移動先マップY"]) {
            // 移動先マップのセット
            setMoveToMap(pack, tages, preX, preY);
        // 移動先キャラ
        } else {
            // 移動先キャラのセット
            setMoveToChara(pack, tages, preX, preY);
        }
    };
    
    
    //- 移動先画面のセット
    function setMoveToScreen(pack, tages, preX = 0, preY = 0) {
        const screenPos = { x:calcMulti(0, convertVariable(tages["移動先画面X"]))[0].val || 0, y:calcMulti(0, convertVariable(tages["移動先画面Y"]))[0].val || 0 };
        // 位置の更新
        updatePos(pack.sprite, pack);
        // 追尾のセット
        if (pack.moveChase) {
             // 追尾の開始処理
            processChaseStart(pack);
            pack.chaseTarget = { type:"screen", x:screenPos.x, y:screenPos.y };
            return;
        }
        // 画面地点への移動距離をセット
        preX = pack.moveResetX ? 0 : preX;
        preY = pack.moveResetY ? 0 : preY;
        const goX = screenPos.x - pack.sprite.x;
        if (goX) { setDrift(pack.moveToXs, preX, preX + goX, "e", 1, "toChara"); }
        const goY = screenPos.y  - pack.sprite.y;
        if (goY) { setDrift(pack.moveToYs, preY, preY + goY, "e", 1, "toChara"); }
    };
    
    
     //- 移動先マップのセット
    function setMoveToMap(pack, tages, preX = 0, preY = 0) {
        const mapPos = { x:calcMulti(0, convertVariable(tages["移動先マップX"]))[0].val || 0, y:calcMulti(0, convertVariable(tages["移動先マップY"]))[0].val || 0 };
        // 位置の更新
        updatePos(pack.sprite, pack);
        // 追尾のセット
        if (pack.moveChase) {
             // 追尾の開始処理
            processChaseStart(pack);
            pack.chaseTarget = { type:"map", x:mapPos.x, y:mapPos.y };
            return;
        }
        // マップ地点への移動距離をセット
        preX = pack.moveResetX ? 0 : preX;
        preY = pack.moveResetY ? 0 : preY;
        const goX = screenX(mapPos.x) - pack.sprite.x;
        if (goX) { setDrift(pack.moveToXs, preX, preX + goX, "e", 1, "toChara"); }
        const goY = screenY(mapPos.y)  - pack.sprite.y;
        if (goY) { setDrift(pack.moveToYs, preY, preY + goY, "e", 1, "toChara"); }
    };
    
    
    //- 移動先キャラのセット
    function setMoveToChara(pack, tages, preX = 0, preY = 0) {
        let charaSprite = null;
        const posType = pack.posData.posType;
        // 移動先バトラーを取得
        if (posType == "battler") {
            pack.moveToChara = pack.moveTage || [...getBattlersByName(tages["移動先アクター-名前"], "actor"), ...getBattlersById(tages["/移動先アクター-ID"], "actor"), ...getBattlersByIndex(tages["/移動先アクター-順番"], "actor"), ...getBattlersByName(tages["移動先エネミー-名前"], "enemy"), ...getBattlersById(tages["/移動先エネミー-ID"], "enemy"), ...getBattlersByIndex(tages["/移動先エネミー-順番"], "enemy")][0];
            if (!pack.moveToChara) { return; }
            // フルアニメステータス対応
            const asf = getFullAnimeStatusFace(pack.moveToChara);
            // バトラースプライトを取得
            charaSprite = asf ? asf : searchSpriteBattler(pack.moveToChara);
        // 移動先キャラを取得
        } else {
            pack.moveToChara = [...getCharasByName(convertVariable(tages["移動先キャラ-名前"]), self), ...getCharasById(convertVariable(tages["/移動先キャラ-ID"]), self)][0];
            if (!pack.moveToChara) { return; }
            // キャラスプライトを取得
            charaSprite = searchSpriteChara(pack.moveToChara);
        }
        if (!charaSprite) { return; }
        // 位置の更新
        updatePos(pack.sprite, pack);
        // 追尾のセット
        if (pack.moveChase) {
            // 追尾の開始処理
            processChaseStart(pack);
            pack.chaseTarget = { type:posType, chara:pack.moveToChara };
            return;
        }
        // キャラへの移動距離をセット
        preX = pack.moveResetX ? 0 : preX;
        preY = pack.moveResetY ? 0 : preY;
        const goX = charaSprite.x - pack.sprite.x;
        if (goX) { setDrift(pack.moveToXs, preX, preX + goX, "e", 1, "toChara"); }
        const goY = charaSprite.y - pack.sprite.y;
        if (goY) { setDrift(pack.moveToYs, preY, preY + goY, "e", 1, "toChara"); }
    };
    
    
    //- 追尾の開始処理
    function processChaseStart(pack) {
        const inBattle = $gameParty.inBattle();
        // 非リセット時は追尾を移動量に代入
        if (!pack.moveToReset) {
            pack.preChaseX += pack.chaseX * (inBattle ? 1 : $gameMap.tileWidth()) || 0;
            pack.preChaseY += pack.chaseY * (inBattle ? 1 : $gameMap.tileHeight()) || 0;
        }
        const posType = pack.posData.posType;
        if (posType == "chara") {
            pack.chaseStart= { type:"chara", chara:pack.posData.chara };
        } else if (posType == "battler") {
            pack.chaseStart= { type:"battler", chara:pack.posData.battler };
        } else if (posType == "map") {
            pack.chaseStart= { type:"screen", x:canvasToMapX(pack.sprite.x), y:canvasToMapY(pack.sprite.y) };
        } else if (posType == "screen") {
            pack.chaseStart= { type:"screen", x:pack.sprite.x, y:pack.sprite.y };
        }
    };
    
    
    //- 変動のセット
    function setDrift(drifts, start, end, easing, easingRate, type) {
        const d = {};
        d.start = start || 0;
        d.end = end || 0;
        d.vol = d.end - d.start;
        d.pre = d.start;
        d.easing = easing || "e";
        d.easingRate = easingRate || 1;
        d.type = type;
        if (drifts) { drifts.push(d); }
        return d;
    };
    
    
    //- フリーアニメの再形成
    function recreateFreeAnime(spriteset) {
        const packs = getFreeAnimePack();
        if (!packs || !packs.length) { return; }
        // パックを検索
        packs.forEach((pack, i) => {
            if (!pack.num) { return; }
            // フリーアニメの開始
            pack.isOpen = true;
            pack.sprite = startFreeAnime(pack.name, pack.animeId, pack.tage, pack.animeCfg, pack.posData, pack.type, pack);
            if (pack.num > 0) { pack.num-- }
        });
    };
    
    
    
    //==================================================
    //--  アニメーション即時再生
    //==================================================
    
    //- アニメーションの即時形成
    function createAnimationInstant(pack, animeId, animeCfg, replay) {
        const spriteset = SceneManager._scene._spriteset;
        // アニメ位置の取得
        getAnimePos(pack);
        // ディレイを取得
        let delay = (pack.isOpen ? pack.startWait : pack.middleWait) + (pack.isOpen ? pack.ariseDelay || 0 : 0);
        pack.delay = delay || 0;
        // パーティクルの作成
        let animation = makeParticle(animeId, animeCfg, pack);
        // アニメーションスプライトの即時形成
        createAnimationSpriteInstant(spriteset, pack, animation, delay);
        // 開始時フラグをオフ
        pack.isOpen = false;
    };
    
    
    //- アニメーションスプライトの即時形成
    function createAnimationSpriteInstant(spriteset, pack, animation, delay) {
        const tageSprite = pack.sprite;
        const aniSprite = pack.aniSprite || new Sprite_AnimationKeFran();
        aniSprite.targetObjects = [tageSprite];
        const mirror = pack.mirror < 0 ? true : false;
        aniSprite.setup([tageSprite], animation, mirror, delay);
        // アニメのチルド
        childAnime(aniSprite, pack.layer);
        // 変数セット
        spriteset._animationSprites.push(aniSprite);
        pack.aniSprite = aniSprite;
        // フリーアニメフラグ
        aniSprite._isFreeAnimeKe = true;
    };
    
    
    //- アニメ位置の取得
    function getAnimePos(pack) {
        const posData = pack.posData;
        const posType = posData.posType;
        // キャラ
        if (posType == "chara") {
            const chara = posData.chara;
            const posFix = posData.posFix;
            // 位置固定の処理
            if (!posFix || posFix == "固定しない") {
                posData.posType = "chara";
            } else if (posFix == "マップに固定") {
                pack.x = chara._realX;
                pack.y = chara._realY;
                posData.posType = "map";
            } else if (posFix == "画面に固定") {
                pack.x = screenX(chara._realX);
                pack.y = screenY(chara._realY);
                posData.posType = "screen";
            }
        // マップ or スクリーン
        } else if (posType.match(/(map|screen)/i)) {
            pack.x = calcMulti(0, convertVariable(posData.x))[0].val;
            pack.y = calcMulti(0, convertVariable(posData.y))[0].val;
        }
    };
    
    
    //- 前回のキャラ移動量の取得
    function getCharaPreMove(pack) {
        let preX = 0;
        let preY = 0;
        if (!pack.moveResetX) {
            const preMove = pack.moveXs.filter(m => m.type == "toChara")[0];
            if (preMove) { preX = preMove.pre; }
        }
        if (!pack.moveResetY) {
            const preMove = pack.moveYs.filter(m => m.type == "toChara")[0];
            if (preMove) { preX = preMove.pre; }
        }
        return { x:preX, y:preY }
    };
    
    
    //- パーティクルの作成
    function makeParticle(animeId, animeCfg, pack) {
        const anime = $dataAnimations[animeId];
        if (!animeCfg || !Object.keys(animeCfg).length) { return anime; }
        // パーティクル設定
        let newAnime = copyHash(anime);
        if (animeCfg["拡大率"]) { newAnime.scale = !animeCfg["拡大率"] ? anime.scale : calcMulti(0, convertVariable(animeCfg["拡大率"]))[0].val; }
        newAnime.scaleX = newAnime.scale;
        newAnime.scaleY = newAnime.scale;
        newAnime.scaleZ = newAnime.scale;
        if (animeCfg["拡大率X"]) { newAnime.scaleX = calcMulti(0, convertVariable(animeCfg["拡大率X"]))[0].val; }
        if (animeCfg["拡大率Y"]) { newAnime.scaleY = calcMulti(0, convertVariable(animeCfg["拡大率Y"]))[0].val; }
        if (animeCfg["拡大率Z"]) { newAnime.scaleZ = calcMulti(0, convertVariable(animeCfg["拡大率Z"]))[0].val; }
        if (animeCfg["拡大率"]) { newAnime.scale = calcMulti(0, convertVariable(animeCfg["拡大率"]))[0].val || anime.scale; }
        if (animeCfg["速度"]) { newAnime.speed = calcMulti(0, convertVariable(animeCfg["速度"]))[0].val || anime.speed; }
        if (animeCfg["回転X"]) { newAnime.rotation.x = calcMulti(0, convertVariable(animeCfg["回転X"]))[0].val || anime.rotation.x; }
        if (animeCfg["回転Y"]) { newAnime.rotation.y = calcMulti(0, convertVariable(animeCfg["回転Y"]))[0].val || anime.rotation.y; }
        if (animeCfg["回転Z"]) { newAnime.rotation.z = calcMulti(0, convertVariable(animeCfg["回転Z"]))[0].val || anime.rotation.z; }
        if (animeCfg["オフセットX"]) { newAnime.offsetX = calcMulti(0, convertVariable(animeCfg["オフセットX"]))[0].val || anime.offsetX; }
        if (animeCfg["オフセットY"]) { newAnime.offsetY = calcMulti(0, convertVariable(animeCfg["オフセットY"]))[0].val || anime.offsetX; }
        if (animeCfg["下揃え"]) { newAnime.alignBotton = convertVariable(animeCfg["下揃え"], "boolean") || anime.alignBotton; }
        if (toBoolean(animeCfg["フラッシュなし"])) {
            newAnime.flashTimings = [];
        }
        if (toBoolean(animeCfg["効果音なし"])) {
            newAnime.soundTimings = [];
        }
        newAnime.displayType = 0;
        // パーティクル変動パックのセット
        setParticleDriftPack(animeCfg, pack, newAnime);
        return newAnime;
    };
    
    
    //- パーティクル変動パックのセット
    function setParticleDriftPack(animeCfg, pack, newAnime, prePack = {}) {
        pack.driftTimeMax = Math.round(calcMulti(0, convertVariable(animeCfg["変動時間"]))[0].val || 20);
        pack.driftDura = pack.driftTimeMax;
        pack.driftDelayMax = Math.round(calcMulti(0, convertVariable(animeCfg["変動ディレイ"]))[0].val || 0);
        pack.driftDelay = pack.driftDelayMax;
        words = ["→拡大率", "→拡大率X", "→拡大率Y", "→拡大率Z", "→回転X", "→回転Y", "→回転Z"];
        const keys = ["scale", "scaleX", "scaleY", "scaleZ", "rotationX", "rotationY", "rotationZ"];
        const particleDrifts = {};
        words.forEach((word, i) => {
            if (!animeCfg[word]) { return; }
            const drifts= []
            const key = keys[i];
            const pre = prePack[key] || newAnime[key] || 0;
            rs = calcMulti(pre, convertVariable(animeCfg[word]));
            rs.forEach(r => {
                if (!r.val) { return; }
                // 変動のセット
                setDrift(drifts, pre, r.val, r.easing, r.easingRate, key);
            });
            particleDrifts[key] = drifts;
        });
        pack.particleDrifts = particleDrifts;
    };
    
    
    //- フリーアニメはバトルを止めない(コア再定義)
    Spriteset_Base.prototype.isAnimationPlaying = function() {
        return this._animationSprites.length && this._animationSprites.filter(ani => !ani._isFreeAnimeKe).length > 0;
    };
    
    
    
    
    //==================================================
    //--  フリーアニメの更新
    //==================================================
    
    
    //- フリーアニメの更新
    function updateFreeAnime() {
        const packs = getFreeAnimePack();
        if (!packs || !packs.length) { return; }
        let del = false;
        // 発生数パラム
        let ariseParam = { x:0, y:0, moveX:0, moveY:0, delay:0 };
        packs.forEach((pack, i) => {
            // ディレイ
            if (pack.delay) {
                pack.delay--;
                return;
            } 
            const sprite = pack.sprite;
            if (!sprite) { return; }
            // アニメフラグがオフなら終了
            if (!sprite._inAnimeKe) {
                // ループする場合
                if (pack.num) {
                    // 画面範囲内か
                    checkInScreen(pack);
                    // 画面範囲外ならリターン
                    if (pack.outScreen) { return; }
                    // アニメの各種初期化
                    initAnimeEach(pack);
                    // アニメーションの即時形成
                    createAnimationInstant(pack, pack.animeId, pack.animeCfg, true);
                    // 移動の再起動
                    restartMove(pack);
                    sprite._inAnimeKe = true;
                    if (pack.num > 0) { pack.num-- }
                // しない場合
                } else {
                    // ターゲットスプライトを破棄
                    destroySprite(pack.sprite);
                    pack.sprite = null;
                    packs[i] = null;
                    del = true;
                }
                return;
            }
            // 可視連動の更新
            if (updateVisibleLink(sprite, pack)) { return; }
            // 移動の更新
            updateMove(pack);
            // 目標移動の更新
            updateToMove(pack);
            // 位置の更新
            updatePos(sprite, pack);
        });
        // null を消去
        if (del) {
            nullcutFreeAnimePack();
        }
    };


    //- 可視連動の更新
    function updateVisibleLink(sprite, pack) {
        if (!pack.visibleLinkChara) { return; }
        const posData = pack.posData;
        const chara = posData.chara;
        if (!chara) { return; }
        let hide = false;
        if ((chara._visibleKe != null && !chara._visibleKe)) { hide = true; }
        if (!chara._characterName && !chara._oneImageKe) { hide = true; }
        if (hide) {
            sprite.x = 10000;
            return true;
        }
        return false;
    };
    
    
    //- 発生パラムの再取得
    function regetAriseParam(ariseParam, animeCfg, i) {
        // 発生パラムの取得
        ariseParam = getAriseParam(ariseParam, pack.animeCfg, i);
        pack.ariseX = ariseParam.x;
        pack.ariseY = ariseParam.y;
        pack.ariseMoveX = ariseParam.moveX;
        pack.ariseMoveY = ariseParam.moveY;
        pack.ariseDelay = ariseParam.delay;
        pack.ariseXori = pack.ariseX;
        pack.ariseYori = pack.ariseY;
        pack.ariseMoveXori = ariseParam.ariseMoveX;
        pack.ariseMoveYori = ariseParam.ariseMoveY;
    };
    
    
    //- アニメの各種初期化
    function initAnimeEach(pack) {
        // 向き対応を初期化
        pack.animeDireTakeOver = pack.animeDire;
        pack.animeDire = "";
        // 回転パラメータを初期化
        pack.spinScaleX = null;
        pack.spinRotationZ = null;
        // ズーム対応を初期化
        pack.preZoomScale = null;
    };
    
    
    //- 移動の更新
    function updateMove(pack) {
        if ((!pack.moveXs.length && !pack.moveYs.length) || !pack.moveDura) { return; }
        // ディレイ
        if (pack.moveDelay) {
            pack.moveDelay--;
            return;
        }
        // カウントを減らす
        pack.moveDura--;
        // 移動量を更新
         pack.movedX = 0;
         pack.movedY = 0;
        if (pack.moveXs.length) {
            pack.movedToX = 0;
            pack.moveXs.forEach(move => {
                move.pre = applyEasing(move.pre, move.start, move.end, pack.moveDura, pack.moveTimeMax, move.easing, move.easingRate);
                const vs = getSpinX(move.pre, pack);
                pack.movedX += vs.x;
                pack.movedY += vs.y;
            });
        }
       if (pack.moveYs.length) {
            pack.movedToY = 0;
            pack.moveYs.forEach(move => {
                move.pre = applyEasing(move.pre, move.start, move.end, pack.moveDura, pack.moveTimeMax, move.easing, move.easingRate);
                const vs = getSpinY(move.pre, pack);
                pack.movedX += vs.x;
                pack.movedY += vs.y;
            });
        }
    };
    
    
    //- 目標移動の更新
    function updateToMove(pack) {
        if ((!pack.moveToXs.length && !pack.moveToYs.length && !pack.chaseTarget) || !pack.moveToDura) { return; }
        // ディレイ
        if (pack.moveToDelay) {
            pack.moveToDelay--;
            return;
        }
        // カウントを減らす
        pack.moveToDura--;
        // 移動量を更新
        pack.movedToX = 0;
        pack.movedToY = 0;
        if (pack.moveToXs.length) {
            pack.movedToX = 0;
            pack.moveToXs.forEach(move => {
                move.pre = applyEasing(move.pre, move.start, move.end, pack.moveToDura, pack.moveToTimeMax, move.easing, move.easingRate);
                pack.movedToX += move.pre;
            });
        }
       if (pack.moveToYs.length) {
            pack.movedToY = 0;
            pack.moveToYs.forEach(move => {
                move.pre= applyEasing(move.pre, move.start, move.end, pack.moveToDura, pack.moveToTimeMax, move.easing, move.easingRate);
                pack.movedToY += move.pre;
            });
        }
        // 追尾の更新
        updateChase(sprite, pack);
    };
    
    
    //- 追尾の更新
    function updateChase(sprite, pack) {
        if (!pack.moveChase) { return; }
        const volX =  getChaseTargetX(pack) - getChaseStartX(pack);
        pack.chaseX = (Math.sin(Math.PI * ((pack.moveToTimeMax - pack.moveToDura) / pack.moveToTimeMax + 1.5)) * volX + volX) / 2;
        const volY = getChaseTargetY(pack) - getChaseStartY(pack);
        pack.chaseY = (Math.sin(Math.PI * ((pack.moveToTimeMax - pack.moveToDura) / pack.moveToTimeMax + 1.5)) * volY + volY) / 2;
    };
    
    
    //- 追尾ターゲットXの取得
    function getChaseTargetX(pack) {
        const chaseTarget = pack.chaseTarget;
        if (chaseTarget.type == "chara") {
            return chaseTarget.chara._realX;
        } else if (chaseTarget.type == "battler") {
            return searchBattlerSpriteFullAnime(chaseTarget.chara).x;
        } else {
            return chaseTarget.x;
        }
    };
    
    
    //- 追尾ターゲットYの取得
    function getChaseTargetY(pack) {
        const chaseTarget = pack.chaseTarget;
        if (chaseTarget.type == "chara") {
            return chaseTarget.chara._realY;
        } else if (chaseTarget.type == "battler") {
            return searchBattlerSpriteFullAnime(chaseTarget.chara).y;
        } else {
            return chaseTarget.y;
        }
    };
    
    
    //- 追尾スタートXの取得
    function getChaseStartX(pack) {
        const chaseStart = pack.chaseStart;
        if (chaseStart.type == "chara") {
            return chaseStart.chara._realX;
        } else if (chaseStart.type == "battler") {
            return searchBattlerSpriteFullAnime(chaseStart.chara).x;
        } else {
            return chaseStart.x;
        }
    };
    
    
    //- 追尾スタートYの取得
    function getChaseStartY(pack) {
        const chaseStart = pack.chaseStart;
        if (chaseStart.type == "chara") {
            return chaseStart.chara._realY;
        } else if (chaseStart.type == "battler") {
            return searchBattlerSpriteFullAnime(chaseStart.chara).y;
        } else {
            return chaseStart.y;
        }
    };
    
    
    //- バトラースプライトの検索-フルアニメ
    function searchBattlerSpriteFullAnime(battler) {
        const asf = getFullAnimeStatusFace(battler);
        if (asf) {
            return asf || { x:0, y:0 };
        } else {
            return searchSpriteBattler(battler)|| { x:0, y:0 };
        }
    };


    //- 移動の再起動
    function restartMove(pack) {
        // 移動リセットの処理
        if (pack.moveResetX) { pack.movedX = 0; }
        if (pack.moveResetY) { pack.movedY = 0; }
        if (pack.moveToReset) {
            pack.movedToX = 0;  pack.movedToY = 0;;
            pack.chaseX = 0;  pack.chaseY = 0;
        }
        // 移動パックのセット
        setMovePack(pack.animeCfg, pack, pack.movedX, pack.movedY);
        // 移動先のセット
        setMoveTage(pack, pack.movedToX, pack.movedToY);
    };
    
    
    //- 位置の更新
    function updatePos(sprite, pack) {
        const posData = pack.posData;
        const posType = posData.posType;
        const inBattle = $gameParty.inBattle();
        // オフセットを取得
        let offsetX = 0;
        let offsetY = 0;
        let vs = getSpinX(pack.offsetX, pack);
        offsetX += vs.x;
        offsetY += vs.y;
        vs = getSpinY(pack.offsetY, pack, true);
        offsetX += vs.x;
        offsetY += vs.y;
        vs = getSpinX(pack.ariseX, pack);
        offsetX += vs.x;
        offsetY += vs.y;
        vs = getSpinY(pack.ariseY, pack);
        offsetX += vs.x;
        offsetY += vs.y;
        vs = getSpinX(pack.ariseMoveX, pack);
        offsetX += vs.x;
        offsetY += vs.y;
        vs = getSpinY(pack.ariseMoveY, pack);
        offsetX += vs.x;
        offsetY += vs.y;
        // キャラ位置
        if (posType == "chara") {
            const chara = posData.chara;
            sprite.x = screenX(chara._realX + (pack.movedX + pack.movedToX) / $gameMap.tileWidth());
            sprite.y = screenY(chara._realY + (pack.movedY + pack.movedToY) / $gameMap.tileHeight());
        // バトラー位置
        } else if (posType == "battler") {
            const battler = posData.battler;
            const asf = posData.asf;
            const battlerSprite = asf ? asf : searchSpriteBattler(battler);
            if (battlerSprite) { 
                sprite.x = battlerSprite.x + pack.movedX + pack.movedToX;
                sprite.y = battlerSprite.y + pack.movedY + pack.movedToY - battlerSprite.height / 2;
            }
        // マップ位置
        } else if (posType == "map") {
            sprite.x = screenX(pack.x + (pack.movedX + pack.movedToX) / $gameMap.tileWidth());
            sprite.y = screenY(pack.y + (pack.movedY + pack.movedToY) / $gameMap.tileWidth());
        // 画面位置
        } else if (posType == "screen") {
            sprite.x = pack.x + pack.movedX + pack.movedToX;
            sprite.y = pack.y + pack.movedY + pack.movedToY;
            // ズーム画面固定
            const zoomOffset = getZoomScreenFix(sprite);
            //sprite.x += zoomOffset.x;
            //sprite.y += zoomOffset.y;
        }
        sprite.x += offsetX + pack.chaseX * (inBattle ? 1 : $gameMap.tileWidth()) + pack.preChaseX;
        sprite.y += offsetY + pack.chaseY * (inBattle ? 1 : $gameMap.tileHeight()) + pack.preChaseY;
        sprite.visible = false;
    };
    
    
    
    //==================================================
    //--  フリーアニメの状態更新
    //==================================================
    
    //- フリーアニメの状態更新 追加(コア追加)
    const _Sprite_Animation_update = Sprite_Animation.prototype.update;
    Sprite_Animation.prototype.update = function() {
        // フリーアニメの状態更新
        updateFreeAnimeState(this, this._targets[0]);
        _Sprite_Animation_update.apply(this);
    };
    
    
    //- フリーアニメの状態更新
    function updateFreeAnimeState(aniSprite, tageSprite) {
        if (!tageSprite || !tageSprite._isFreeAnimeKe || !aniSprite._effect) { return; }
        const pack = tageSprite._packKe;
        // アニメの即終了
        endAnimeInstant(aniSprite, pack);
        // 画面範囲内か
        checkInScreen(pack, aniSprite, true);
        // パーティクルの変動
        driftParticle(aniSprite, tageSprite, pack);
        // 向き対応の更新
        updateAdjustDire(aniSprite, tageSprite, pack);
        // 回転変動の更新
        updateSpinDrift(aniSprite, tageSprite, pack);
        // 回転パラメータの更新
        updateSpinParam(aniSprite, tageSprite, pack);
        // ズーム対応
        adjustZoom(aniSprite, tageSprite, pack);
    };
    
    
    //- 画面範囲内か
    function checkInScreen(pack, aniSprite, inAnime) {
        if (!pack.scopeRate) { return; }
        let result = true;
        const sprite = pack.sprite;
        // 位置の更新
        updatePos(sprite, pack);
        // 画面内か判定
        const gw = Graphics.width;
        const gh = Graphics.height;
        const zoomRate = 1 / $gameScreen.zoomScale();
        const scopeRate = pack.scopeRate * zoomRate;
        const plusRate = (scopeRate - 1) / 1 + 1;
        const minusRate = (scopeRate - 1) / 1;
        if (sprite.x < -gw * minusRate || sprite.x > gw * plusRate || sprite.y < -gh *minusRate || sprite.y > gh * plusRate) { result = false; }
        // アニメ中に範囲外になったとき
        if (!result && inAnime) {
            // アニメ即終了を予約
            pack.endsInstant = true;
            // 画面外フラグをオン
            pack.outScreen = true; 
        }
        // 待機中に範囲内になったとき
        if (!inAnime && result) {
            setTimeout(omitOutScreen, 50, getPacksByPack(pack));
        }
        return result;
    };
    
    
    //- パックからのパックス取得
    function getPacksByPack(pack) {
        if (pack.scene == "map") {
            return $gameMap._freeAnimePacksKeMap;
        } else {
            return $gameMap._freeAnimePacksKeBattle;
        }
    };


    //- 画面外フラグの解除
    function omitOutScreen(packs) {
        if (!packs) { return; }
        packs.forEach(p => {
            if (!p) { return; }
            p.outScreen = false;
        }); 
    };
    
    
    // パーティクルの変動
    function driftParticle(aniSprite, tageSprite, pack) {
        if (!pack.driftDura) { return; }
        // ディレイ
        if (pack.delay) { return; }
        if (pack.driftDelay) {
            pack.driftDelay--;
            return;
        }
        // カウントを減らす
        pack.driftDura--;
        const particleDrifts = pack.particleDrifts;
        const animation = aniSprite._animation;
        Object.keys(particleDrifts).forEach(key => {
            const drifts = particleDrifts[key];
            if (!drifts || !drifts.length) { return; }
            drifts.forEach(drift => {
                drift.pre = applyEasing(drift.pre, drift.start, drift.end, pack.driftDura, pack.driftTimeMax, drift.easing, drift.easingRate);
                // スケール
                if (key.includes("scale")) {
                    if (key == "scale") {
                        animation["scaleX"] = drift.pre;
                        animation["scaleY"] = drift.pre;
                        animation["scaleZ"] = drift.pre;
                    } else {
                        animation[key] = drift.pre;
                    }
                     // ズームスケールを取得
                     const zoomScale = $gameScreen.zoomScale();
                     if (zoomScale != 1 && pack.zoomAdjust) { aniSprite._animation[key] *= zoomScale; }
                // 回転
                } else {
                    if (key.includes("X")) {
                        animation.rotation.x = drift.pre;
                    } else if (key.includes("Y")) {
                        animation.rotation.y = drift.pre;
                    } else {
                        animation.rotation.z = drift.pre;
                    }
                }
            });
        });
    };
    
    
    //- ズーム対応
    function adjustZoom(aniSprite, tageSprite, pack) {
        if (!pack.zoomAdjust) { return; }
        // ディレイ
        if (pack.delay) { return; }
        const animation = aniSprite._animation;
        // 前回のスケールを戻す
        if (pack.preZoomScale) {
            animation.scale /= pack.preZoomScale;
            animation.scaleX /= pack.preZoomScale;
            animation.scaleY /= pack.preZoomScale;
            animation.scaleZ /= pack.preZoomScale;
            animation.offsetX /= pack.preZoomScale;
            animation.offsetY /= pack.preZoomScale;
            animation.offsetXori /= pack.preZoomScale;
            animation.offsetYori /= pack.preZoomScale;
            pack.preZoomScale = null;
        }
        // ズームスケールを取得
        const zoomScale = $gameScreen.zoomScale();
        if (zoomScale == 1) { return; }
        // スケールを適用
        pack.preZoomScale = $gameScreen.zoomScale();
        animation.scale *= pack.preZoomScale;
        animation.scaleX *= pack.preZoomScale;
        animation.scaleY *= pack.preZoomScale;
        animation.scaleZ *= pack.preZoomScale;
        animation.offsetX *= pack.preZoomScale;
        animation.offsetY *= pack.preZoomScale;
        animation.offsetXori *= pack.preZoomScale;
        animation.offsetYori *= pack.preZoomScale;
    };
    
    
    //- ズーム画面固定値の取得
    function getZoomScreenFix(sprite) {
        const gs = $gameScreen;
        const zoomScale = gs.zoomScale();
        if (zoomScale == 1) { return { x:0, y:0 }; }
        const rate = 1 / zoomScale;
        const offsetX = (sprite.x - gs.zoomX()) * (rate - 1);
        const offsetY = (sprite.y - gs.zoomY()) * (rate - 1);
        return { x:offsetX, y:offsetY };
    };
    
    
    //- アニメの拡大率XYZを追加
    const _Sprite_Animation_updateEffectGeometry = Sprite_Animation.prototype.updateEffectGeometry
    Sprite_Animation.prototype.updateEffectGeometry = function() {
        _Sprite_Animation_updateEffectGeometry.apply(this);
        if (this._handle && (this._animation.scaleX || this._animation.scaleY || this._animation.scaleZ || this._animation.scale)) {
            const scale = this._animation.scale / 100;
            const scaleX = (this._animation.scaleX / 100) || scale;
            const scaleY = (this._animation.scaleY / 100) || scale;
            const scaleZ = (this._animation.scaleZ / 100) || scale;
            this._handle.setScale(scaleX, scaleY, scaleZ);
        }
    };
    
    
    // サウンド変更
    const _Sprite_Animation_processSoundTimings = Sprite_Animation.prototype.processSoundTimings;
    Sprite_Animation.prototype.processSoundTimings = function() {
        if (this._isFreeAnimeKe) {
            const pack = this._targets[0]._packKe;
            for (const timing of this._animation.soundTimings) {
                if (timing.frame === this._frameIndex) {
                    AudioManager.playSe(overwriteSe(timing.se, pack));
                }
            }
            return;
        }
        _Sprite_Animation_processSoundTimings.apply(this);
    };
    
    
    //- 効果音の上書き
    function overwriteSe(se, pack) {
        newSe = {};
        newSe.name = se.name;
        newSe.volume = se.volume * pack.volumeRate;
        newSe.pitch = se.volume * pack.pitchRate;
        newSe.pan = se.pan;
        return newSe;
    };
    
    
    //- 向き対応の更新
    function updateAdjustDire(aniSprite, tageSprite, pack) {
        if (!pack.posData.chara || $gameParty.inBattle()) { return; }
        //- 向き対応の引き継ぎ
        takeOverAdjustDire(aniSprite, pack);
        const chara = pack.posData.chara;
        const animeDire = pack.animeDire;
        switch(chara._direction) {
            // 左
            case 4:
                if (pack.direSpinX && animeDire != "left") {
                    // アニメ向きの回転-左
                    spinAnimeDireLeft(aniSprite, pack);
                    pack.animeDire = "left";
                }
                break;
            // 右
            case 6:
                if (pack.direSpinX && animeDire != "right") {
                    // アニメ向きの回転-右
                    spinAnimeDireRight(aniSprite, pack);
                    pack.animeDire = "right";
                }
                break;
            // 上
            case 8:
                if (pack.direSpinY && animeDire != "up") {
                    // アニメ向きの回転-上
                    spinAnimeDireUp(aniSprite, pack);
                    pack.animeDire = "up";
                }
                break;
            // 下
            case 2:
                if (pack.direSpinY && animeDire != "down") {
                    // アニメ向きの回転-下
                    spinAnimeDireDown(aniSprite, pack);
                    pack.animeDire = "down";
                }
                break;
        }
    };
    
    
    //- 向き対応の引き継ぎ
    function takeOverAdjustDire(aniSprite, pack) {
        if (!pack.animeDireTakeOver) { return; }
        switch(pack.animeDireTakeOver) {
            // 左
            case "left":
                // アニメ向きの回転-左
                spinAnimeDireLeft(aniSprite, pack);
                break;
            // 右
            case "right":
                // アニメ向きの回転-右
                spinAnimeDireRight(aniSprite, pack);
                break;
            // 上
            case "up":
                // アニメ向きの回転-上
                spinAnimeDireUp(aniSprite, pack);
                break;
            // 下
            case "down":
                // アニメ向きの回転-下
                spinAnimeDireDown(aniSprite, pack);
                break;
        }
        pack.animeDireTakeOver = null;
    };
    
    
    //- アニメ向きの回転-左
    function spinAnimeDireLeft(aniSprite, pack) {
        const animation = aniSprite._animation;
        // アニメ回転変動の初期化
        initSpinDrift(pack);
        drifts = pack.spinDrifts;
        // 回転パラメータを変動セット
        setDrift(drifts.reverseX, pack.reverseX, 1, "e", 1);
        setDrift(drifts.spinX, pack.spinX, 0, "e", 1);
        setDrift(drifts.reverseY, pack.reverseY, 1, "e", 1);
        setDrift(drifts.spinY, pack.spinY, 0, "e", 1);
    };
    
    
    //- アニメ向きの回転-右
    function spinAnimeDireRight(aniSprite, pack) {
        const animation = aniSprite._animation;
        // アニメ回転変動の初期化
        initSpinDrift(pack);
        drifts = pack.spinDrifts;
        // 回転パラメータを変動セット
        setDrift(drifts.reverseX, pack.reverseX, -1, "e", 1);
        setDrift(drifts.spinX, pack.spinX, 0, "e", 1);
        setDrift(drifts.reverseY, pack.reverseY, 1, "e", 1);
        setDrift(drifts.spinY, pack.spinY, 0, "e", 1);
    };
    
    
    //- アニメ向きの回転-上
    function spinAnimeDireUp(aniSprite, pack) {
        const animation = aniSprite._animation;
        // アニメ回転変動の初期化
        initSpinDrift(pack);
        drifts = pack.spinDrifts;
        // 回転パラメータを変動セット
        setDrift(drifts.reverseX, pack.reverseX, 1, "e", 1);
        setDrift(drifts.spinX, pack.spinX, 1, "e", 1);
        setDrift(drifts.reverseY, pack.reverseY, 1, "e", 1);
        setDrift(drifts.spinY, pack.spinY, -1, "e", 1);
    };
    
    
    //- アニメ向きの回転-下
    function spinAnimeDireDown(aniSprite, pack) {
        const animation = aniSprite._animation;
        // アニメ回転変動の初期化
        initSpinDrift(pack);
        drifts = pack.spinDrifts;
        // 回転パラメータを変動セット
        setDrift(drifts.reverseX, pack.reverseX, 1, "e", 1);
        setDrift(drifts.spinX, pack.spinX, -1, "e", 1);
        setDrift(drifts.reverseY, pack.reverseY, 1, "e", 1);
        setDrift(drifts.spinY, pack.spinY, 1, "e", 1);
    };
    
    
    // 回転変動の初期化
    function initSpinDrift(pack) {
        pack.spinTimeMax = pack.spinTimeMax;
        pack.spinDura = !pack.animeDire ? 1 : pack.spinTimeMax;
        pack.spinDrifts = {};
        const drifts = pack.spinDrifts;
        drifts.reverseX = [];
        drifts.reverseY = [];
        drifts.spinX = [];
        drifts.spinY = [];
    };
    
    
    // 回転変動の更新
    function updateSpinDrift(aniSprite, tageSprite, pack) {
        if (!pack.spinDura) { return; }
        // カウントを減らす
        pack.spinDura--;
        Object.keys(pack.spinDrifts).forEach((key, i) => {
            const drifts = pack.spinDrifts[key];
            if (!drifts.length) { return; }
            const drift = drifts[0];
            switch (key) {
                case "reverseX":
                    pack.reverseX = applyEasing(drift.pre, drift.start, drift.end, pack.spinDura, pack.spinTimeMax, drift.easing, drift.easingRate);
                    break;
                case "reverseY":
                    pack.reverseY = applyEasing(drift.pre, drift.start, drift.end, pack.spinDura, pack.spinTimeMax, drift.easing, drift.easingRate);
                    break;
                case "spinX":
                    pack.spinX = applyEasing(drift.pre, drift.start, drift.end, pack.spinDura, pack.spinTimeMax, drift.easing, drift.easingRate);
                    break;
                case "spinY":
                    pack.spinY = applyEasing(drift.pre, drift.start, drift.end, pack.spinDura, pack.spinTimeMax, drift.easing, drift.easingRate);
                    break;
            }
        });
    };
    
    
    //- 回転値Xの取得
    function getSpinX(v, pack, onlyRvs) {
        const r = { x:0, y:0 }
        if (pack.spinY && !onlyRvs) {
            r.y = v * pack.spinX;
            r.x = v * (1 - Math.abs(pack.spinX)) * pack.reverseX * pack.mirror;
        } else {
            r.x = v * pack.reverseX * pack.mirror;
        }
        return r;
    };
    
    
    //- 回転値Yの取得
    function getSpinY(v, pack, onlyRvs) {
        const r = { x:0, y:0 }
        if (pack.spinY && !onlyRvs) {
            r.x = v * pack.spinY;
            r.y = v * (1 - Math.abs(pack.spinY)) * pack.reverseY;
        } else {
            r.y = v * pack.reverseY;
        }
        return r;
    };
    
    
    // 回転パラメータの更新
    function updateSpinParam(aniSprite, tageSprite, pack) {
        if (!pack.direSpinR) { return; }
        const animation = aniSprite._animation;
        if (pack.spinScaleX) { animation.scaleX /= pack.spinScaleX; }
        if (pack.spinRotationZ) { animation.rotation.z -= pack.spinRotationZ; }
        pack.spinScaleX = pack.reverseX;
        pack.spinRotationZ = pack.spinY > 0 ? Math.round(90 * pack.spinY) : pack.spinY < 0 ? Math.round(270 * Math.abs(pack.spinY)) : 0;
        animation.scaleX *= pack.spinScaleX;
        animation.rotation.z += pack.spinRotationZ;
    };
    
    
    
    //==================================================
    //--  フリーアニメの終了
    //==================================================
    
     // スプライト・アニメーションの破棄
    const _Sprite_Animation_destroy = Sprite_Animation.prototype.destroy;
    Sprite_Animation.prototype.destroy = function(options) {
        // 回数が残っていたらストップだけ
        const tageSprite = this._targets[0];
        if (tageSprite && tageSprite._isFreeAnimeKe) {
            const pack = tageSprite._packKe;
            if (pack.num) {
                // アニメーションの停止
                stopAnimation(this, pack);
               
                return;
            }
        }
        if (!this._texture) { return; }
        _Sprite_Animation_destroy.apply(this, arguments);
    };
    
    
    //- アニメーションの停止
    function stopAnimation(aniSprite, pack) {
        if (aniSprite._handle) {  aniSprite._handle.stop(); }
        aniSprite._handle = null;
        aniSprite._playing = false;
        aniSprite._started = false;
        aniSprite._frameIndex = 0;
        aniSprite._flashColor = [0, 0, 0, 0];
        aniSprite._flashDuration = 0;
    };
    
    
    //- アニメの即終了
    function endAnimeInstant(aniSprite, pack) {
        if (!pack.endsInstant) { return; }
        // アニメーションの停止
        stopAnimation(aniSprite, pack);
        pack.isOpen = true;
        pack.delay = 0;
        pack.getsAriseDelay = true;
        pack.endsInstant = false;
    };
    
    
    
    //==================================================
    //--  フリーアニメ・スキル
    //==================================================
    
    //- フリーアニメ・スキルの実行 呼び出し
    const _Window_BattleLog_showAnimation = Window_BattleLog.prototype.showAnimation;
    Window_BattleLog.prototype.showAnimation = function(
    subject, targets, animationId) {
        // フリーアニメ・スキルの実行
        doFreeAnimeSkill(subject, targets);
        _Window_BattleLog_showAnimation.apply(this, arguments);
    };
    
    
    //- フリーアニメ・スキルの実行
    function doFreeAnimeSkill(subject, targets) {
        const bm = BattleManager;
        const action = bm._action;
        // アニメファイルとコモンを取得
        const obje = action.item();
        const metaList = metaAll(obje.note, ["フリーアニメ", "freeAnime"]);
        if (!metaList || !metaList.length) { return; }
        metaList.forEach(meta => {
            //-フリーアニメ・スキルの実行-個別
            BattleManager.doFreeAnimeSkillKe(meta, subject, targets);
        });
    };
    
    
    //- フリーアニメ・スキルの実行-個別
    BattleManager.doFreeAnimeSkillKe = function(meta, subject, targets) {
        const metas = meta.replace(/\s/g, "").split(",");
        if (metas.length < 2) { return; }
        // パラメータ取得
        const file = Number(metas[0]);
        const commonName = metas[1];
        let moveTime = metas[2];
        const wait = Number(metas[3]);
        // ターゲットを判定
        let moveTages = null;
        // 移動時間がある場合
        if (moveTime) {
            // 行動者対象の場合
            if (moveTime == -1) {
                targets = [subject];
                moveTime = 0;
            // 移動する場合
            } else {
                const targets2 = targets;
                targets = [subject];
                moveTages = targets2;
            }
        }
        // アルグスを作成
        const args = {};
        args["アニメファイル"] = file;
        args["…コモン使用"] = commonName;
        // フリーアニメ・スキルの開始
        if (wait) {
            const time = Math.round(wait * 1000 / 60);
            setTimeout(startFreeAnimeSkill, time, args, targets, moveTime, moveTages);
        } else {
            startFreeAnimeSkill(args, targets, moveTime, moveTages);
        }
    };
    
    
    //- フリーアニメ・スキルの開始
    function startFreeAnimeSkill(args, targets, moveTime, moveTages) {
        if (!targets[0]) { return; }
        // フリーアニメの開始-バトル
        if (!moveTages) {
            const mirror = targets[0]._actorId ? -1 : 1;
            startFreeAnimeBattle(args, null, targets, mirror);
        } else {
            moveTages.forEach(moveTage => {
                const mirror = moveTage._actorId ? -1 : 1
                startFreeAnimeBattle(args, null, targets, mirror, moveTime, moveTage);
            });
        }
    };
    
    
    
    //==================================================
    //--  計算基本 /ベーシック
    //==================================================
    
    //- マルチ演算
    function calcMulti(cur, tage, ori, cmds = []) {
        if (tage == null) { return [{}]; }
        const datas = [cur, tage.toString(), ori, cmds];
        cur = cur || 0;
        let tageStr = tage.toString();
        let tageLine = tageStr.split(",");
        tageLine = tageLine.map(v => v.replace(/\s/g, ""));
        let sols = [];
        tageLine.forEach((tages, i) => {
             const match = tages.match(/^(r*m*s*\/|)([\+\*\/\%←→↑↓]*)(\-*\d+\.*\d*)~*(\-*\d*\.*\d*)([\+\*\/\%←→↑↓]*)(tn|cg|fk|cf|rd|bk|ei|eo|er|e|)(\(?\-*\d*\.*\d*\)?)(&*b*j*d*c*t*o*r*)(\_*\-?\d*\.*\d*)$/i);
            if (!match) {
                sols.push({ val:tages, header:"", easing:"", easingRate:1, extra:"", num:0, datas:datas });
                return;
            }
            let val = 0;
            let rvs = 1;
            let header = "";
            let easing = "";
            let easingRate = 1;
            let extra = "";
            let num = 1;
            if (match[1]) {
                header = match[1].replace(/\//g, "").toUpperCase();
                if (header.match(/r/i)) { rvs = -1; }
            }
            if (match[6]) {
                easing = match[6].toUpperCase();
            }
            if (match[7]) {
                const mt = match[7].match(/\-*\d+\.*\d*/);
                easingRate = mt ? Number(mt[0]) : 1;
            }
            if (match[8]) {
                extra = match[8].replace(/&/g, "").toUpperCase();
                if (extra.includes("R") && Math.randomInt(2)) {
                    rvs *= -1;
                }
            }
            if (match[9]) {
                num = Number(match[9].replace(/\_/g, ""));
            }
            let v = 0;
            if (match[4]) {
                const vs = [Number(match[3]), Number(match[4])];
                vs.sort((a, b) => a - b);
                v = vs[0] + Math.random() * (vs[1] - vs[0]);
            } else {
                v = Number(match[3]);
            }
            const symbol = (match[2] || "") + (match[5] || "");
            if (symbol.includes("+")) {
                val = Number(cur) + v * rvs;
            } else if (symbol.includes("*")) {
                val = Number(cur) * v * rvs;
            } else if (symbol.includes("/")) {
                val = Number(cur) / v * rvs;
            } else if (symbol.includes("%")) {
                val = Number(cur) % v * rvs;
            } else if (symbol.includes("←")) {
                val = Number(cur) - v * rvs;
            } else if (symbol.includes("→")) {
                val = Number(cur) + v * rvs;
            } else if (symbol.includes("↑")) {
                val = Number(cur) - v * rvs;
            } else if (symbol.includes("↓")) {
                val = Number(cur) + v * rvs;
            } else {
                val = v * rvs;
                if (ori) {
                    if (ori.toString().includes("*")) {
                        val *= Number(ori.replace(/\*/g, ""));
                    } else {
                        val += ori;
                    }
                }
            }
            cmds.forEach(cmd => {
                if (cmd.includes("+")) {
                    val += Number(cmd.replace(/\+/g, ""));
                } else if (cmd.includes("*")) {
                    val *= Number(cmd.replace(/\*/g, ""));
                } else if (cmd.includes("/")) {
                    val /= Number(cmd.replace(/\//g, ""));
                } else if (cmd.includes("%")) {
                    val %= Number(cmd.replace(/\%/g, ""));
                } else {
                    val = Number(cmd);
                }
            });
            sols.push({ val:val, header:header, easing:easing, easingRate:easingRate, extra:extra, num:num, datas:datas });
        });
        return sols;
    };
    
    

    //==================================================
    //--  イージング /ベーシック
    //==================================================

    //- イージングの適用
    function applyEasing(current, start, target, duration, timeMax, easing, easingRate = 1) {
        // イージングの処理
        if (easing.match(/ei|eo|e/i)) {
            return processEasing(current, target, duration + 1, timeMax, easing, easingRate);
        }
        // カービング
        if (easing.match(/tn|cg|fk|cf|rd|bk/i)) {
            return processCurving(current, start, target, duration + 1, timeMax, easing, easingRate);
        }
    };
    
    
    //- イージングの処理
    function processEasing(current, target, duration, timeMax, easing, easingRate = 1) {
        const lt = calcEasing((timeMax - duration) / timeMax, easing, easingRate);
        const t = calcEasing((timeMax - duration + 1) / timeMax, easing, easingRate);
        const start = (current - target * lt) / (1 - lt);
        return start + (target - start) * t;
    };
    
    
    //- イージングの計算
    function calcEasing(t, easing, easingRate = 1) {
        const exponent = 2 * easingRate;
        switch (easing.toUpperCase()) {
            case "EI":
                return easeIn(t, exponent);
            case "EO":
                return easeOut(t, exponent);
            case "E":
                return easeInOut(t, exponent);
            default:
                return t;
        }
    };
    
    
    //- 各イージング処理
    function easeIn(t, exponent) {
        return Math.pow(t, exponent) || 0.001;
    };
    
    function easeOut(t, exponent) {;
        return 1 - (Math.pow(1 - t, exponent) || 0.001);
    };
    
    function easeInOut(t, exponent) {
        if (t < 0.5) {
            return easeIn(t * 2, exponent) / 2;
        } else {
            return easeOut(t * 2 - 1, exponent) / 2 + 0.5;
        }
    };
    
    
    //- カービングの処理
    function processCurving(current, start, target, duration, timeMax, easing, easingRate = 1) {
        // 0 の時の処理
        if (duration <= 0) { return easing.match(/tn|rd|bk/i) ? start : target; }
        let result = 0;
        // ターン
        if (easing.toUpperCase() == "TN") {
            result = processTurn(current, start, target, duration, timeMax, easingRate);
        // チャージ
        } else if (easing.toUpperCase() == "CG") {
            result = processCharge(current, start, target, duration, timeMax, easingRate);
        // フック
        } else if (easing.toUpperCase() == "FK") {
            result = processFook(current, start, target, duration, timeMax, easingRate);
        // チャージフック
        } else if (easing.toUpperCase() == "CF") {
            result = processChargeFook(current, start, target, duration, timeMax, easingRate);
        // ラウンド
        } else if (easing.toUpperCase() == "RD") {
            result = processRound(current, start, target, duration, timeMax, easingRate);
        // バック
        }  else if (easing.toUpperCase() == "BK") {
            result = processBack(current, start, target, duration, timeMax, easingRate);
        }
        return result;
    };
    
    
    //- ターンの処理
    function processTurn(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = Math.round(timeMax / 2);
        const d2 = timeMax - d1;
        if (duration > d2) {
            result = processEasing(current, target, duration - d2, d1, "e", easingRate);
        } else {
            result = processEasing(current, start, duration, d2, "e", easingRate);
        }
        return result;
    };
    
    
    //- チャージの処理
    function processCharge(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = Math.round(timeMax / 3);
        const d2 = timeMax - d1;
        if (duration > d2) {
            result = processEasing(current, start + (start - target) * easingRate, duration - d2, d1, "e");
        } else {
            result = processEasing(current, target, duration, d2, "e");
        }
        return result;
    };
    
    
    //- フックの処理
    function processFook(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = Math.round(timeMax * 2 / 3);
        const d2 = timeMax - d1;
        if (duration > d2) {
            result = processEasing(current, target + (target - start) * easingRate, duration - d2, d1, "e");
        } else {
            result = processEasing(current, target, duration, d2, "e");
        }
        return result;
    };
    
    
    //- チャージフックの処理
    function processChargeFook(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = Math.round(timeMax / 4);
        const d3 = Math.round(timeMax / 4);
        const d2 = timeMax - d1 - d3;
        if (duration > (d2 + d3)) {
            result = processEasing(current, start + (start - target) * easingRate, duration - d2 - d3, d1, "e");
        } else if (duration > d3) {
            result = processEasing(current, target + (target - start) * easingRate, duration - d3, d2, "e");
        } else {
            result = processEasing(current, target, duration, d3, "e");
        }
        return result;
    };
    
    
    //- ラウンドの処理
    function processRound(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = Math.round(timeMax / 4);
        const d2 = Math.round(timeMax / 2);
        const d3 = timeMax - d1 - d2;
        if (duration > (d2 + d3)) {
            result = processEasing(current, target, duration - d2 - d3, d1, "eo");
        } else if (duration > d3) {
            result = processEasing(current, start + (start - target) * easingRate, duration - d3, d2, "e");
        } else {
            result = processEasing(current, start, duration, d3, "ei");
        }
        return result;
    };
    
    
    //- バックの処理
    function processBack(current, start, target, duration, timeMax, easingRate) {
        let result = 0;
        const d1 = 1;
        const d2 = timeMax - d1;
        if (duration > d2) {
            result = processEasing(current, target, duration - d2, d1, "e", easingRate);
        } else {
            result = processEasing(current, start, duration, d2, "e", easingRate);
        }
        return result;
    };
    
    
    
    //==================================================
    //--  文字列基本 /ベーシック
    //==================================================
    
    //- 変数の置換
    function convertVariable(str, convert = "") {
        if (!str) { return str; }
        str = str.toString();
        const matches = str.match(/[\x1b\\]v\[(\d+)\]/gi);
        if (matches) {
            matches.forEach(parts => {
                const match = parts.match(/\\[vV]\[(\d+)\]/);
                const id = Number(match[1]);
                const val = $gameVariables.value(id);
                str = str.replace(match[0], val);
            });
        }
        if (str != null) {
            if (convert.match(/number/i)) { str = Number(str); }
            if (convert.match(/boolean/i)) { str = toBoolean(str); }
        }
        return str;
    };
    
    
    
    //==================================================
    //--  プラグインコマンド基本 /ベーシック
    //==================================================
    
    let plcmPreter = null;
    
    //- プラグインコマンド呼び出しプリターを保存
    const _PluginManager_callCommand = PluginManager.callCommand;
    PluginManager.callCommand = function(self, pluginName, commandName, args) {
        plcmPreter = self;
        _PluginManager_callCommand.apply(this, arguments);
        plcmPreter = null;
    };
    
    
    //- プラグインコマンド呼び出しイベントを取得
    function getPlcmEvent() {
        if (!plcmPreter) { return; }
        const preter = plcmPreter;
        return preter.character(preter.eventId());
    };
    
    //- 名前でのキャラリスト取得
    function getCharasByName(names, self) {
        if (!names) { return []; }
        const nameList = names.replace(/\s/g, "").split(",");
        let charas = [];
        let match = null;
        for (const name of nameList) {
            // イベントを取得
            $gameMap.events().forEach(event => {
                const note = event.event().name + " " + event.event().note;
                if (note.includes(name)) { charas.push(event); }
            });
            // セルフを取得
            if (name.match(/^(セルフ|自分|自身|self)$/)) {
                self = self || getPlcmEvent() || charaSpritePlcm._character;
                if (self) { charas.push(self); }
            }
            // プレイヤーを取得
            if (name.match(/^(プレイヤー|操作キャラ|player)$/)) {
                charas = [...charas, $gamePlayer];
            }
            // フォロワーを取得
            match = name.match(/^(フォロワー|フォロアー|隊列|隊列キャラ|follower)(\d*)$/)
            if (match) {
                const id = match[2] ? Number(match[2]) - 1 : 0;
                charas = id != null ? [...charas, $gamePlayer._followers._data[id]] : [...charas, ...$gamePlayer._followers._data];
            }
            // パーティを取得
            if (name.match(/^(パーティ|味方|味方全員|味方全体|party)$/)) {
                charas = [...charas, $gamePlayer, ...$gamePlayer._followers._data];
            }
            // 乗り物を取得
            match = name.match(/^(乗り物|乗物|乗機|vehicle)(\d*)$/);
            if (match) {
                const id = match[2] ? Number(match[2]) - 1 : 0;
                charas = id ? [...charas, $gameMap._vehicles[id]] : [...charas, ...$gameMap._vehicles];
            }
            // 全て取得
            if (name.match(/^(全て|すべて|全部|全体|all)$/)) {
                charas = [...$gameMap.events(), $gamePlayer, ...$gamePlayer._followers._data, ...$gameMap._vehicles];
            }
            // 選択なし
            if (name.match(/^(なし|無し|none)$/)) {
            }
        }
        charas = charas.filter(chara => chara);
        return charas;
    };
    
    
    //- IDでのキャラリスト取得
    function getCharasById(ids, self) {
        if (!ids) { return []; }
        const idList = !ids ? [] : strToNumList(ids.toString());
        let charas = [];
        for (const id of idList) {
            // イベントを取得
            if (id > 0) { charas.push($gameMap.event(id)); }
            // セルフを取得
            if (id == 0) {
                self = self || getPlcmEvent() || charaSpritePlcm._character;
                if (self && !idList.includes(self._eventId)) { charas.push(self); }
            }
            // プレイヤーを取得
            if (id == -1) { charas = [...charas, $gamePlayer]; }
            // フォロワーを取得
            if (id <= -10 && id >= -99) {
                charas = id == -10 ? [...charas, ...$gamePlayer._followers._data] : [...charas, $gamePlayer._followers._data[Math.abs(id) - 11]];
            }
            // 乗り物を取得
            if (id <= -100) {
                charas = id == -100 ? [...charas, ...$gameMap._vehicles] : [...charas, $gameMap._vehicles[Math.abs(id) - 101]];
            }
            // 全て取得
            if (id == -2) {
                charas = [...$gameMap.events(), $gamePlayer, ...$gamePlayer._followers._data, ...$gameMap._vehicles];
            }
        }
        charas = charas.filter(chara => chara);
        return charas;
    };
    
    
    //- 全てのキャラを取得
    function getAllCharacter() {
        return  [...$gameMap.events(), $gamePlayer, ...$gamePlayer._followers._data, ...$gameMap._vehicles];
    };
    
    
    //- 名前でのバトラーリスト取得
    function getBattlersByName(names, target) {
        if (!names) { return []; }
        const nameList = names.replace(/\s/g, "").split(",");
        let members = [];
        if (!target || target.includes("actor")) {
            members = [...members, ...$gameParty.members()];
        }
        if (!target || target.includes("enemy")) {
            members = [...members, ...$gameTroop.members()];
        }
        let battlers = [];
        for (const name of nameList) {
            // メンバーを取得
            members.forEach(battler => {
                if (battler.name().includes(name)) {
                    battlers.push(battler);
                }
            });
            // パーティを取得
            if (name.match(/^(パーティ|アクター|味方|味方全員|味方全体|party)$/)) {
                battlers = [...$gameParty.members()];
            }
            // 敵パーティを取得
            if (name.match(/^(敵パーティ|敵軍|トループ|敵|敵全員|敵全体|troop)$/)) {
                battlers = [...$gameTroop.members()];
            }
            // 全て取得
            if (name.match(/^(全て|すべて|全部|全体|all)$/)) {
                battlers = members;
                break;
            }
            // 選択なし
            if (name.match(/^(なし|無し|none)$/)) {
                break;
            }
        }
        battlers = battlers.filter(battler => battler);
        return battlers;
    };
    
    
    //- IDでのバトラーリスト取得
    function getBattlersById(ids, target) {
        if (!ids) { return []; }
        const idList = !ids ? [] : strToNumList(ids);
        let members = [];
        if (!targets || target.includes("actor")) {
            members = [...members, ...$gameParty.members()];
        }
        if (!target || target.includes("enemy")) {
            members = [...members, ...$gameTroop.members()];
        }
        let battlers = [];
        for (const id of idList) {
            // IDで対象取得
            if (id > 0) { battlers = [...battlers, ...members.filter(battler => battler._battlerId == id)]; }
            // 全て取得
            if (id == -2) {
                battlers = members;
                break;
            }
        }
        battlers = battlers.filter(battler => battler);
        return battlers;
    };
    
    
    //- インデックスでのバトラーリスト取得
    function getBattlersByIndex(indexs, target) {
        if (!indexs) { return []; }
        const indexList = !indexs ? [] : strToNumList(indexs);
        let members = [];
        if (!target || target.includes("actor")) {
            members = [...members, ...$gameParty.members()];
        }
        if (!target || target.includes("enemy")) {
            members = [...members, ...$gameTroop.members()];
        }
        let battlers = [];
        for (const index of indexList) {
            // インデックスで対象取得
            if (index > 0) { battlers.push(members[index - 1]); }
            // 全て取得
            if (index == -2) {
                battlers = members;
                break;
            }
        }
        battlers = battlers.filter(battler => battler);
        return battlers;
    };
    
    
    
    //==================================================
    //--  配列基本 /ベーシック
    //==================================================
    
    //- ハッシュのディープコピー
    function copyHash(hash) {
        const copy = {};
        Object.keys(hash).forEach(k => {
            if (hash[k].constructor.name == "Object") {
                copy[k] = copyHash(hash[k]);
            } else if (hash[k].constructor.name == "Array") {
                copy[k] = copyArray(hash[k]);
            } else {
                copy[k] = hash[k];
            }
        });
        return copy;
    };
    
    
    //- 配列のディープコピー
    function copyArray(array) {
        const copy = [];
        array.forEach((v, i) => {
            if (v.constructor.name == "Object") {
                copy[i] = copyHash(v);
            } else if (v.constructor.name == "Array") {
                copy[i] = copyArray(v);
            } else {
                copy[i] = v;
            }
        });
        return copy;
    };
    
    
    
    //==================================================
    //--  スプライト基本 /ベーシック
    //==================================================
    
    //- スプライトの検索
    function searchSprite(subject) {
        let sprite = null;
        if (!$gameParty.inBattle()) {
            sprite = searchSpriteChara(subject);
        } else {
            sprite = searchSpriteBattler(subject);
        }
        return sprite;
    };
    
    
    //- スプライトの検索-キャラクター
    function searchSpriteChara(chara) {
        let result = null;
        const sprites = SceneManager._scene._spriteset._characterSprites;
        for (let sprite of sprites) {
            if (isSameChara(sprite._character, chara)) {
                result = sprite;
                break;
            }
        }
        return result;
    };
    
    
    //- スプライトの検索-バトラー
    function searchSpriteBattler(battler) {
        const spriteset = SceneManager._scene._spriteset;
        let result = null;
        const sprites = battler._enemyId ? spriteset._enemySprites : spriteset._actorSprites;
        for (const sprite of sprites) {
            if(!sprite._battler) { continue; }
            if ((battler._actorId && sprite._battler._actorId == battler._actorId) || (battler._enemyId && sprite._battler.index() == battler.index())) {
                result = sprite;
                break;
            }
        }
        return result;
    };
    
    
    //- 同じキャラか
    function isSameChara(a, b) {
        if (!a) { return !b; }
        if (!b) { return !a; }
        if (a._eventId) {
            if (!b._eventId) { return false; }
            return a._eventId == b._eventId;
        }
        if (a._followers && b._followers) { return true; }
        if (a._memberIndex && a._memberIndex == b._memberIndex) { return true; }
        if (a._type && a._type == b._type) { return true; }
        return false;
    };
    
    
    
    //==================================================
    //---  位置基本 /ベーシック
    //==================================================
    
    //- スクリーンX
    function screenX(x, anchor = 0.5) {
        const tw = $gameMap.tileWidth();
        return Math.floor($gameMap.adjustX(x) * tw + tw * anchor);
    };
    
    
    //- スクリーンY
    function screenY(y, anchor = 0.5) {
         const th = $gameMap.tileHeight();
        return Math.floor( $gameMap.adjustY(y) * th + th * anchor);
    };
    
    
    //- 画面X座標をマップX座標へ
    function canvasToMapX(x) {
        const gm = $gameMap;
        const tileWidth = gm.tileWidth();
        const originX = gm._displayX * tileWidth;
        const mapX = (originX + x) / tileWidth;
        return gm.roundX(mapX);
    };
    
    
    //- 画面X座標をマップX座標へ
    function canvasToMapY(y) {
        const gm = $gameMap;
        const tileHeight = gm.tileHeight();
        const originY = gm._displayY * tileHeight;
        const mapY = (originY + y) / tileHeight;
        return gm.roundY(mapY);
    };
    
    
    
    //==================================================
    //--  メタ配列 /ベーシック
    //==================================================
     
    // 全てのメタ配列を合算
    function totalAllMetaArray(battler, words, action) {
        // イニット
        let data = null
        let array = [];
        // バトラー値
        data = battler.actorId ? battler.actor() : battler.enemy();
        if (data) { metaAll(data.note, words).forEach(e => array.push(e)); }
        if (battler._actorId) {
            // 職業値
            data = battler.currentClass();
            if (data) { metaAll(data.note, words).forEach(e => array.push(e)); }
            // 装備値
            battler._equips.forEach(equip => {
                data = equip.object();
                if (data) { metaAll(data.note, words).forEach(e => array.push(e)); }
            });
        }
        // ステート値
        battler._states.forEach(stateId => {
            data = $dataStates[stateId];
            if (data) { metaAll(data.note, words).forEach(e => array.push(e)); }
        }, battler);
        // アクション値
        if (action) {
            data = action.item();
            if (data) { metaAll(data.note, words).forEach(e => array.push(e)); }
        }
        // スペース削除
        array = array.map(e => e.replace(/\s/g, ""));
        // 空の要素は削除
        array = array.filter(e => e);
        return array;
    };
    
    
   //- 全取得メタ
    function metaAll(note, words) {
        var result = [];
        words.forEach(word => {
            var regText = '\<' + word + ':([^\>]*)\>';
            var regExp_g = new RegExp(regText, 'g');
            var regExp = new RegExp(regText);
            var matches = note.match(regExp_g);
            var match = null;
            if (matches) {
                matches.forEach(function(line) {
                    result.push(line.match(regExp)[1]);
                });
            }
        });
        return result;
    };
    
})();