MUGENメモ ( フォント環境:MS ゴシック 標準 サイズ12 ) 22:00 2012/01/21 22→21 12:52 2012/01/21 着地リカバリーについて追記 12:20 2012/01/21 初版   AIでのリカバリー制御について byADI  ■空中受身、空中体勢立て直し、空中リカバリーについて  基本的なキャラは、State,5050(吹き飛び動作)内のChangeStateで行われています。  コモンステートなので単純なキャラだとステート自体記述されてません。  条件は「落下中」「生きてる」「リカバリー可能時(CanRecover)」で   「リカバリーコマンド」を押すことでリカバリー処理が行われます。  キャラによっては「落下中」の条件が無かったりしますが。  AIではリカバリーコマンドの代わりに、AI用の条件やフラグ処理で制御します。  ■AIでのリカバリーの考え方  基本的に最速が望ましいです。  空中コンボをするキャラの中には、最速リカバリーされると出来ないことがある他、   リカバリーしない限り永久にコンボが続くということもあるので、   そうした空中コンボを回避するためにリカバリーは重要と言えます。  ただし必ず最速リカバリーの場合、受身動作直後を狙う   「受身狩り」にハマってしまうので、最速リカバリーだけでも良くありません。  通常の空中リカバリーの硬直は基本21Fで無敵は15Fなので、6Fもの隙が存在し、   そこへ的確に攻撃を重ねられると何もできずに食らってしまうのです。  ( 着地リカバリーはまた異なりますが )  一番無難なのは「相手の攻撃始動に反応してリカバリーする」というもの。  発生+持続が15F辺りを超えていない限り、避ける事ができます。  もちろん、フラグで調整制御ができるならそれでするべきですが。 ;記述例 trigger1 =!var(*AIフラグ*) && Command = "recovery" ;手操作用 Trigger2 = var(*AIフラグ*) && enemynear,movetype=A && !enemynear,movehit ;AI用 Trigger2 = enemynear,time <= 6 || enemynear,hitdefattr = SCA,AA,AT ;始動or判定定義有り  ■着地リカバリーについて  リカバリー時地上に近い(Pos Y >= -20)場合、そのまま着地をするリカバリーになります。  ただし、State,5050から、State,5200に飛んだすぐには無敵はありません。  5200に飛んだ後Pos Y >= 10(地面より低い基準位置)になると、State,5201へ飛び、   そこ初めてでNotHitBy(無敵)が付加されます。   5201からは「着地ステート(52)」から元のステートへ戻ります。  すぐに無敵が発生するわけではないのと、着地硬直が存在する点に注意。  とは言え倒れ追撃・起き攻めなども回避できるので、基本リカバリーした方が良いです。  しない方がいいのは着地に攻撃を重ねられたりする(倒れた方が回避できる)場合くらい。 ※注意点として、空中・着地で別々のリカバリー条件を設定すると ※ 着地リカバリーしかできない時に空中リカバリーをしてしまうことがあります。 ※ そうしたブレを無くすためにも、フラグでの制御の方が望ましいです。  ■空中リカバリーの方向制御  通常の空中リカバリーでは、方向キーによって受身の向きを多少制御できます。  後ろキーならやや後ろ側、上キーならやや上、下キーならやや下。※前キーは変化しません。  ただし吹き飛び速度は多少減速する程度なので、下でもブレーキがかかる程度ですが。  ベストな方向は状況によって違うでしょうが一番ベターなのは「後ろ」の方向。   相手との距離を確実に取り、追撃を受けにくくします。相手が後ろなら無しで。  上下についてはケースバイケース。相手の追撃が近そうなら上がいいし、   可能な限り早く着地したい場合は下側の方が良いです。 ;記述例 [State 5210, 2] ;Go up type = VelAdd triggerall = Time = 4 trigger1 =!var(*AIフラグ*) && Command = "holdup";手操作用 Trigger2 = var(*AIフラグ*) && random < 750 &&(P2Dist Y > 0||abs(P2Bodydist)<50);AI用,相手が下or近い y = -2 [State 5210, 2] ;Go down type = VelAdd triggerall = Time = 4 trigger1 =!var(*AIフラグ*) && Command = "holddown";手操作用 Trigger2 = var(*AIフラグ*) && random < 750 &&!(P2Dist Y > 0||abs(P2Bodydist)<50);AI用,↑の条件に当てはまらない y = 1.5 ;※!()の条件にしているのは、手操作では不可能な上も下もという状態を制限するため [State 5210, 2] ;Go fwd type = VelMul triggerall = Time = 4 trigger1 =!var(*AIフラグ*) && Command = "holdfwd";手操作用 Trigger2 = var(*AIフラグ*) &&(P2Dist X < 0);AI用,相手がう後ろ(不要だけど一応) x = 1 ;※これだけ「VelMul」で「速度を1倍に変更する」という意味のない処理。 [State 5210, 2] ;Go back type = VelAdd triggerall = Time = 4 trigger1 =!var(*AIフラグ*) && Command = "holdback";手操作用 Trigger2 = var(*AIフラグ*) &&!(P2Dist X < 0);AI用,相手が後ろでない x = -1  ■ステートを奪われている際のリカバリー  技によっては「ステートを奪っているけどリカバリーが可能」な場合があります。  制御はコマンドの"recovery"で行わているので、AIの場合、MUGEN側のAIから   そのコマンドが入力されること以外にその状態からリカバリーすることはできません。  意図的に最速リカバリーをさせたい場合は、recoveryのコマンドを増やすことが効果的。  手操作から見ると性能改変とも言えるので注意が必要。するならAI専用ファイル限定。  ただし、最速リカバリーだけするようになると、   今度は受身狩りにハマりやすくなってしまいます。使う場合は注意。  ちなみにそういうステートへ飛ばす側のキャラのコンボを作る場合、   最速リカバリーは自分側の処理を調整してテストしたりしないと、   実際にはほとんどリカバリーされてできないコンボをしてしまうこともあるので、注意。 ;増やす例 ; 全てのコマンド入力に対して反応する→ほぼ確実に最速リカバリー ; ※手操作でもあらゆるコマンドに反応してしまう ;---受け身-------------------------------------------- [Command] name = "recovery"; "a" command = a time = 1 [Command] name = "recovery"; "b" command = b time = 1 [Command] name = "recovery"; "c" command = c time = 1 [Command] name = "recovery"; "x" command = x time = 1 [Command] name = "recovery"; "y" command = y time = 1 [Command] name = "recovery"; "z" command = z time = 1 [Command] name = "recovery"; "up" command = U time = 1 [Command] name = "recovery"; "down" command = D time = 1 [Command] name = "recovery"; "fwd" command = F time = 1 [Command] name = "recovery"; "back" command = B time = 1 [Command] name = "recovery"; "start" command = s time = 1 [Command] name = "recovery"; "hold_x" command = /x time = 1 [Command] name = "recovery"; "hold_y" command = /y time = 1 [Command] name = "recovery"; "hold_z" command = /z time = 1 [Command] name = "recovery"; "hold_a" command = /a time = 1 [Command] name = "recovery"; "hold_b" command = /b time = 1 [Command] name = "recovery"; "hold_c" command = /c time = 1 [Command] name = "recovery"; "hold_start" command = /s time = 1 [Command] name = "recovery"; "holdfwd" command = /$F time = 1 [Command] name = "recovery"; "holdback" command = /$B time = 1 [Command] name = "recovery"; "holdup" command = /$U time = 1 [Command] name = "recovery"; "holddown" command = /$D time = 1