MUGEN ( フォント環境:MS ゴシック 標準 サイズ10 )   速度計算のメモ byADI 0:53 2012/12/14 Another YUKAに使用した技術の追記 13:05 2012/11/27 -( ID-10*(Movetype=A)>EnemyNear(xx),ID-10*(EnemyNear(xx),Movetype=A) ) 8:09 2012/08/16 ちょい更新 21:38 2012/05/17  16:42 2011/11/07 性質を移動。 ・・・ 15:12 2011/05/28 散らばっていたのをまとめてみた  MUGENでは速度数値(Vel)によって相手の動く距離をある程度把握することができます。  と言ってもコンボなどでない限り、相手は自由に動くこともできるし、   相手が特殊な移動処理を行っている場合、これらの計算は役に立ちません。  100%当たる記述なんてありません。  一部速度用の計算に用いる情報をVarに入れて処理させている他、   とても細かい計算を行うためその条件式中でのみ使用するTempVarも用いています。  これらは直に数値を入力すれば条件をvarの数を減らせますが、記述量的にvarを使うほうがいいでしょう。 ●TempVar(一時処理Var)についての砕いた説明(Varの使い方は[Varの初歩/Var.txt]を参照)  Varはメモ帳のようなもので、1枚1枚に覚えておきたいことをそこに書いて保管することができます。  1枚の紙(同じ番号のVar)に同じ事だけを書いておくこと(例えば特殊ゲージなら特殊ゲージ用のVar)も多いですが、  使い終わった後に残す必要が無い情報なら紙に書いてあることを消してしまい、   別の使い終わったら残す必要のない事を書いてまた消してと使いまわすこともできます。  そうした「一時的な情報だけを使うVar」をTemporary Variable(一時的な変数)、略してTempVarと呼ぶのです。  反対にずっと同じ情報だけを扱うVarを私は利便上、常用しているVar、「常用Var」と呼んでいます。  使い終わらないのが常用Var、使い終わったら別のことに使っていいのがTempVarですね。  ↓にある中では「fvar(#発生F#)」や「fvar(#距離#) 」がその条件式中にしか使われていないTempVar、  「fvar(#相手向き#)」や「fvar(#相手摩擦#)」が別の所で勝手に変えられると困る常用Varです。 ■■■■■ 補足説明は下側に移動。  Xの距離条件は実際の広さよりやや狭く(-5~-10程度)見積もって指定しましょう。   ただし吹き飛び直後の相手を狙う場合は、判定が広いこともあるのでその場合は広めに。   あと近接は[0,30]という0~指定ではなく、[-20,30]という風にややめり込ませておきましょう。  Yの距離条件はAnimの指定範囲[上側-5~-10,下側+5~+10]程度広く見積もって指定しましょう。 ■ ■■■1.単純な移動速度  まず一切相手の速度に変化のない場合、速度×時間で移動距離を認識することができます。  例えば相手の空中でのX移動速度は技や空中ダッシュで速度の変化をさせない限り一定です。  なので「 EnemyNear,Vel X * F数 」でX移動距離を認識でき TriggerAll =1 || fvar(#発生F#) := *発生フレーム数* ;発生フレーム数値 TriggerAll =1 || fvar(#距離#) := EnemyNear,Vel X ;速度を代入 TriggerAll =1 || fvar(#距離#) := Floor( fvar(#距離#) * fvar(#発生F#) ) ;速度×時間 TriggerAll = P2BodyDist X - fvar(#距離#) = [ xx , xxx ] ;距離条件  という風な形で認識させることができます。 ■ただし↑の数式では「相手がこちらに背を向けている場合」   相手が遠ざかっているにも関わらず近付いていると認識してしまいます。  向きの計算が入っていないため、そうなってしまうわけです。  そのため相手がこちらへ向いていれば速度がプラス、向いていなければ速度がマイナスの計算になるように Trigger1 = fvar(#相手向き#) := IfElse((Pos X <= EnemyNear,Pos X ^^ EnemyNear,Facing = 1),1,-1) ;向き数値(常用Var。IfElse条件を計算に加えても良い)  「相手が右側か相手が右向きかの[どちらか]なら1、そうでないなら-1」というような情報を用いることになります。 ( ×-1,自__相> ○1,自_<相 ○1,相>_自 ×-1,<相__自 IfElseの内約はこういうこと。 )  向きを計算に入れた条件式にすれば相手がどちらに向いていようと   向かってくる際に+速度、遠ざかっている際は-速度として扱えます。 TriggerAll =1 || fvar(#距離#) := EnemyNear,Vel X ;速度を代入 TriggerAll =1 || fvar(#距離#) := Floor( fvar(#距離#) * fvar(#発生F#) * fvar(#相手向き#) ) ;速度×時間×向き TriggerAll = P2BodyDist X - fvar(#距離#) = [ xx , xxx ] ;距離条件 ■自身の速度も空中などで一定の場合、相手の速度計算に加算する形で TriggerAll =1 || fvar(#距離#) := fvar(#距離#) + Floor( Vel X * fvar(#発生F#) ) ;速度×時間  このように計算させて、距離条件に加わるようにします。 ■コンボ中の相手の速度は「EnemyNear,GetHitVar(XVel)*EnemyNear,Facing」から算出できる模様。  ヒットポーズに差がある場合、その分速度の掛かり始めが前後するのでかけるフレーム数などを調整する感じになるかと。 ■↑らだけでは「衝突中」を計算していないので注意。  壁や相手と衝突しても速度自体はそのままなので、上手く計算出来ない場合があります。  相手距離条件を↓のような記述で0にして調整する感じかと。 ;相手の速度計算後に > 壁に向かっている場合移動距離数値を0に。 TriggerAll =1 || fvar(#距離#):= fvar(#距離#)*(EnemyNear,Vel X > 0 || EnemyNear,BackEdgeDist >5);相手が壁際でないか、 TriggerAll =1 || fvar(#距離#):= fvar(#距離#)*(EnemyNear,Vel X < 0 || EnemyNear,FrontEdgeDist>5);相手が壁に向かってない。 ;両者速度の合計値に > 移動距離が相手までの距離より大きく、相手と自分が衝突する場合、移動距離の超過分をマイナスして計算する。(距離条件が=0になる。) TriggerAll =1 || fvar(#距離#):= fvar(#距離#)+(fvar(#距離#)>P2Bodydist X&&(P2Dist Y =[-Const(Size.Height),(EnemyNear,Const(Size.Height))]))*(P2Bodydist X-fvar(#距離#)) ;(※動作未確認) ;EnemyNear,Const(Size.Height)>P2Dist Y && Const(Size.Height)*-1 0 || EnemyNear,BackEdgeDist >5);相手が壁際でないか、 TriggerAll =1 || fvar(#距離#) := fvar(#距離#)*(EnemyNear,Vel X < 0 || EnemyNear,FrontEdgeDist>5);相手が壁に向かってない。 TriggerAll =1 || fvar(#距離#) := fvar(#距離#)*Ifelse(EnemyNear,Statetype = A ,1 , 0.6 );★摩擦の大体の目安 TriggerAll =1 || fvar(#距離#) := fvar(#距離#) + Floor( Vel X * fvar(#発生F#) ) ;速度×時間 TriggerAll =1 || fvar(#距離#) := fvar(#距離#)+(fvar(#距離#)>P2Bodydist X&&EnemyNear,Const(Size.Height)10+fvar(#距離#));1 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));2 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));3 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));4 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));5 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));6 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));7 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));8 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));9 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));10 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));11 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));12 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));13 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));14 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));15 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));16 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));17 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));18 TriggerAll=1||fvar(#距離#):=fvar(#距離#)+(fvar(#速度#):=fvar(#速度#)*fvar(#相手摩擦#))*(EnemyNear,BackEdgeDist>10+fvar(#距離#));19 TriggerAll= P2DistBody X-fvar(8) < xx && P2Dist X > 0;P2BodyDist X  このような計算になります。フレーム数に応じて計算の行を増やしたり減らしたりします。  相手の摩擦は下記の情報で常用させます。 Trigger1 =1|| fvar(#相手摩擦#) := 1;相手空中の場合 Trigger1 = EnemyNear,StateType != A ;相手地上の場合 Trigger1 =1|| fvar(#相手摩擦#) := IfElse((EnemyNear,StateType = S), (EnemyNear,Const(Movement.Stand.Friction)),(EnemyNear,Const(Movement.Crouch.Friction))) ;  なぜこんなにややこしい記述にしなければいけないかと言うと、   重力加速度の「速度+加速度」と違い『摩擦係数は「速度*摩擦」という計算である』上、   『MUGENではn乗計算が使えない』ため全ての数値を一挙にまとめる計算ができず、  一回一回を一行一行計算していく↑のような記述になるわけです。同じ記述を使いまわせる分マシです。  ★追記>一行での計算も不可能ではないらしいです。DHQさんがそれようの記述を公開しています。    +>あと硬直時間などの特殊な関係を処理したい場合、別途計算が必要ですね。  ヒット直後でもないと相手の動きは安定しませんし、特殊な処理を行われると無意味な記述になります。  なので摩擦計算をするのはヒット後「相手の摩擦が小さい場合に〜」という状況を察知させたい場合でもない限り不要でしょう。 ■ ■■■4.着地硬直関係  ↑でも自身が着地するかしないかを目安にしていましたが、速度を計算すれば   「空中攻撃ヒット後、いつまでに着地できるか」や「相手が着地するのはいつか」もある程度分かります。  もちろん、特殊な処理をしている場合分かりませんが。  例えば空中攻撃ヒット後、最速攻撃が入るかどうか、というのがこちらの記述で分かります。 Trigger1 = StateNo = xxxx && MoveContact = 1 && fvar(#時間#) := #有利F#-#着地硬直f#-#最速攻撃F#;★それぞれを入力 Trigger1 = Pos Y + ( (Vel Y*fvar(#時間#)) + (Const(Movement.Yaccel))*( (fvar(#時間#)*(fvar(#時間#)-1))/2 ) ) > 0;着地フレーム算出  <0で着地しないことを確認できるので反対の>0であれば着地することも確認できます。  そこで有利フレームから着地硬直と最速攻撃フレームを引いた時間内で着地できれば〜というものです。   技用の記述ではなく状況varを変更させて着地→攻撃を行わせるためのものですが。  また着地硬直を狙いたい場合は TriggerAll =1 || fvar(#時間#) := xx ;大体の発生フレーム TriggerAll =1 || fvar(#距離#) := ( (EnemyNear,Vel Y*fvar(#時間#)) + (EnemyNear,Const(Movement.YAccel))*( (fvar(#時間#)*(fvar(#時間#)-1))/2 ) );相手の速度 TriggerAll = EnemyNear,StateType = A && EnemyNear,Pos Y + fvar(#距離#) > 0 ;着地しそう。  こんな感じの記述になります。突進型の攻撃の場合は、移動開始前のフレーム数+(距離÷速度)で算出。  くどいようですが空中ダッシュや空中ジャンプなどをされた場合速度はあっさり変化しますし、   それ以前に相手がConst(Movement.YAccel)で下降しているとも限らず、いつも上手く機能するわけではありません。 ( 物理的状況(Physics)がAの場合のみConst(Movement.YAccel)の重力加速度が毎F加算されますが、   そのPhysicsを参照する記述がないため、本当にそれで下降しているかも分からないのです。 )  あくまでそれっぽい目安の計算なわけです。 ■ ■■■5.突進技・直進型飛び道具到達計算(未検証)  判定が動く場合は5F刻み程度を分けて、並べて描くのが確実ですが、   等速で前進するタイプならある程度計算は可能です。 TriggerAll =1 || fvar(#発生F#) := *移動開始フレーム* ;★飛び道具の場合は飛び道具が射出されるタイミングとか。 TriggerAll =1 || fvar(#距離#) := EnemyNear,Vel X ;★速度を代入(キャンセルコンボ時はEnemyNear,GetHitVar(XVel)*EnemyNear,Facing) TriggerAll =1 || fvar(#距離#) := P2BodyDist X - (fvar(#距離#)*Fvar(#発生F#)) - *判定の長さ* ;★第一計算・移動開始時の距離:判定の長さはBofyDist Xからの距離−α TriggerAll = P2BodyDist X - (fvar(#距離#)*Fvar(#発生F#)) > -10 && fvar(#距離#) > -10 ;★初動で密着していないかどうか(調整可) TriggerAll =1 || fvar(#距離#) := Floor( (fvar(#距離#) / (#相手の移動速度#+#攻撃の移動速度#) ) ;★第二計算・到達予測F−始動F:相手の速度は↑で使ったものと同じもの。 TriggerAll =1 || fvar(#発生F#) := Floor(Ifelse( (fvar(#距離#)+fvar(発生F))*(#相手の速度#) < #前側の壁までの距離# , fvar(#距離#) , #前側の壁までの距離#/(#相手の移動速度#+#攻撃の移動速度#) ))+fvar(発生F));★壁際用補正: TriggerAll = fvar(#発生F#) = [ x , xx ] ;★攻撃判定が存在する時間かどうか。(飛び道具ならfvaR(#距離#)>x) ; ここまでで「相手に到達するまでのフレーム」を計算。あとは通常の落下速度計算でOK。 TriggerAll =1 || fvar(#距離#) := EnemyNear,const(Movement.Yaccel) ;★相手の重力加速度(コンボ中はEnemyNear,Gethitvar(Yaccel)) TriggerAll =1 || fvar(#距離#) := Floor(( EnemyNear,Vel Y * fvar(#発生F#) ) + ( Fvar(#距離#)*( (fvar(#発生F#)*(fvar(#発生F#)-1))/2) ));速度×時間 TriggerAll =1 || fvar(#距離#) := fvar(#距離#) * (EnemyNear,StateType = A) ;相手が地上なら0に TriggerAll =1 || fvar(#距離#) := fvar(#距離#) - Floor( Vel Y * fvar(#発生F#) );速度×時間 TriggerAll =1 || fvar(#距離#) := fvar(#距離#) - ( Const(Movement.YAccel)*( (fvar(#発生F#)*(fvar(#発生F#)-1))/2) );加速度×時間×〜 Trigger1 = P2Dist Y + EnemyNear,Const(Size.Mid.Pos.Y) + fvar(#距離#) = [-yyy , -yy ] ;★距離条件  第一計算の−αは判定ギリギリだとギリギリ到達する距離になってしまうため多少短めにする方が良いです。  基本的に「敵を吹き飛ばしたあとの目押し追撃用」です。 ■■■■■  最初に言ったことをもう一度。 「100%当たる記述なんてありません」  速度計算はVelが変化したりPosAddなどで動いていると上手く認識できませんし、  基準位置はおろか当たり判定すら多少前後するものなので、   速度計算をしようとしまいと範囲条件はアバウトに指定するべきです。  目安としては発生の早い技ほど狭く、遅い技ほど大雑把に。  あと100%当たる記述が無いように、実は100%外れる記述もありません。  もし相手が異様な処理をしている場合、外そうとしたって当たってしまう可能性もあります。  速度計算をせずとも大雑把な記述で上手く動いてくれることもあります。  大雑把な記述というのが甘くとも、繊細な記述というのは脆いのです。  無駄な繊細さを削り落とすという考え方もあります。 ■■■■■ >捕捉追記  処理的に2P側が見る1P側の座標は「そのF分の移動を終えている数値」になっている。   その為、計算上2P側の場合計算Fに−1して処理する必要がありそう。  ただタッグの場合、2Pでも3P4PはそのF分の移動をする前なので、   -(EnemyNear(**),ID < ID)という感じで処理させるといいかもしれません。 ( 相手の方がIDが若い=相手の方が先に処理をする=そのF分の移動を終えた状態で参照する )  とはいえ1F程度の違いなら大差ないはずなので考慮しない、という手もありますが。 >再度追記  ※Movetype=Aだと処理の順番が変化するので通常時,キャンセルコンボ時は↑の1P2P補正だけじゃ不十分。  ※-(EnemyNear(**),IDEnemyNear(xx),ID-10*(EnemyNear(xx),Movetype=A) ) で後であるか確認可能。(後の場合-1) >細かい計算式を調査中。 >調査報告:やはり(時間*(時間-1)/2)が正しいみたいです。 >    :+-0や+1の場合、ジャンプ,空中ジャンプからの落下フレーム算出を観測していくと特定のタイミングで、1F減へらない事がありました。 >    :-1の場合、空中ジャンプしつづけさせて観測を行なっても、落下中は常に落下までのフレームが1Fずつ減っていました。 >    :つまり-1でないと、正確な観測ができないみたいです。 なんで、+1と勘違いしてた私。 > 追記:勘違いじゃなくて実は私の使ってる「時間」が+1状態だったのかも。でも正常に動くなら問題ないよね。ね。 >再追記:いや、合ってた? というのも状態参照の加速度の加算は「位置に速度を加算した(動いた)後、速度に加速度を」という処理順番なので、 >   :計算上は( (時間-1)*((時間-1)+1)/2 )という感じ。ただし、GetHitVar(Yaccel)は速度処理の前に加算処理のため、+1が正しいはずです。 >補正値の調査 >調査報告:補正値はやはり↑にある「-(EnemyNear(**),ID=現在の速度」の場合に、   重力加速度の計算や、摩擦係数計算を停止させるといった処理をさせればいいかも。 (ただヒットポーズ中は速度処理も止まるので、そこらへんも要考慮。) >2012追記  ※ヒット硬直中は「Vel X = 0 && Vel Y = 0」の状態で硬直し、   HitShakeOver後HitVelSet処理が行われて初めてVelが設定される。  ※その為ヒット硬直時は下記みたいな記述を用いて判定し、使う速度を選ぶ必要がある。  IFelse(P2Movetype=H&&(EnemyNear(x),StatENo<5030||EnemyNear(x),HitShakeOver=0), EnemyNear(x),gethitvar(yvel) , EnemyNear(x),Vel Y )  ※また自分と相手のPauseTimeに違いがある場合、そのF分を速度計算に補正を入れる必要がある。  例:PauseTime=3,6の技は相手より3F速く自分が動き始める=相手側用の速度計算に-3Fのズレが生じる ■■■■■ Velの性質は[Vels.txt]に移動。 ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■記述のテンプレート 速度計算の視覚化の動画(http://www.nicovideo.jp/watch/sm16002429)で要望されたので。 ※私の使ってる記述を↑のテンプレートに差し替え、調整したものです。※一部未調査  ●注意点  くどいようですが、全ての動作にこれらを使うのはよくありません。  当たらないような範囲で攻撃を振らせることも牽制という戦術の一つです。  昇竜や超必殺技での迎撃技や空中戦時、コンボ時の追撃程度にしておきましょう。  ●用意しておかないといけないもの   >発生フレーム・攻撃範囲などの情報   >TempFvarを3つ以上  ●出来ればVarで管理しておきたいもの(私は大体Varで管理させてます。) ※一部は暫定条件。調整が必要な場合もあります。 Trigger1 = fvar(#発生補正値#) := (EnemyNear,IDfvar(#X距離#) ,(Root,P2Dist X-var(#壁距離,前#)), fvar(#X距離#)) ;相手が壁にぶつかる場合,壁までの距離 TriggerAll =1 || fvar(#X距離#) := fvar(#X距離#)+(fvar(#X距離#)>P2Bodydist X && Const(Size.Height)*-1*0.5= Floor(Enemynear,Vel X*100)*0.01 || (EnemyNear,Statetype=A||Enemynear,StateType=L) || Ctrl, 1 ,0.6) ;相手速度が低下していないor相手が空中or相手Ctrl=1なら摩擦目安に ; ; 相手が着地するかどうか(Y距離計算の後に) Trigger1 = EnemyNear,Pos Y + fvar(#Y距離#) > 0 ;相手が着地する Trigger1 = EnemyNear,Pos Y + fvar(#Y距離#) = [0, Enemynear,Vel Y + (EnemyNear,const(Movement.Yaccel)*fvar(#発生F#)) ] ;相手が着地するタイミング。(※未確認) Trigger1 = EnemyNear,Pos Y + fvar(#Y距離#) - ifelse((anim = [5051,5059]) || (anim = [5061,5069]), 0, 25) = [0, Enemynear,Vel Y + (EnemyNear,GetHitVar(Yaccel)*fvar(#発生F#)) ] ;相手がバウンドするタイミング。(※未確認) Trigger1 = EnemyNear,Pos Y + fvar(#Y距離#) <= 0;相手が着地しない ; ※攻撃を当てた直後のEnemyNear,Vel XとEnemyNear,VelYについて ; ※攻撃を当てたヒットポーズ中は「enemyNear,GetHitVar(XVel)*enemyNear,Facing」や ; ※「enemyNear,GetHitVar(YVel)」から、ヒットポーズが解けた後の速度を認識できます。 ; ※技をキャンセルして出す技の場合は注意してください。 ; ※その最中を認識する主な条件は↓こちら。 Trigger1 = enemynear,movetype=h && (enemynear,gethitvar(hitshaketime) || (enemynear,vel X=0&&enemynear,vel y=0)) ; ※ただし場合によってズレのでる可能性があるのでいくらか条件式を揃えておいて、 ; ※速度自体をfvar(#XVel#)だとかで管理する方式の方がいいかもしれません。 :■迎撃or追撃用地上技のテンプレート・基本 [State adi,template]; Type = ChangeState value = *技* TriggerAll = Alive && RoundState = 2 && var(xAIフラグx) TriggerAll = StateType != A && Ctrl;技の前提条件 TriggerAll = Random < 300 ;確率 TriggerAll = EnemyNear,Statetype != L ;相手倒れでない(速度計算を安定させるため) ; ●ここから速度計算 TriggerAll =1 || fvar(#発生F#) := *発生フレーム数* ;★★★発生フレーム数値 TriggerAll =1 || fvar(#発生F#) := fvar(#発生F#)-(EnemyNear,IDx) TriggerAll = P2BodyDist X - (Enemynear,VelX*Fvar(#Y距離#)) > -10 ;★初動で密着していないかどうか(調整可) TriggerAll =1 || fvar(#発生F#) := fvar(#発生F#)-(EnemyNear,IDP2Bodydist X&&EnemyNear,Const(Size.Height)*0.55+fvar(#X距離#));1★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));2★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));3★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));4★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));5★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));6★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));7★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));8★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));9★★★ TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)+(fvar(#発生F#):=fvar(#発生F#)*fvar(#Y距離#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#));10★★★フレーム数に応じて行を増減させる。 TriggerAll=1||fvar(#X距離#):=fvar(#X距離#)-(fvar(#発生F#))*(EnemyNear,BackEdgeDist>5+fvar(#X距離#))*(EnemyNear,ID 0;★★★P2BodyDist X TriggerAll = Ifelse(P2Statetype=C ,(EnemyNear,Const(Size.Mid.Pos.Y)), Ifelse(P2StateType=S,(EnemyNear,Const(Size.Head.Pos.Y)), -999 ) ) < -yy ;★★★攻撃の高さ(低い相手に当たるか) ; ●ここまで Trigger1 = StateNo = xxxx ;キャンセルをかける技  ●上手くいかない時の3ヵ条  1.キチンと記述を確認する  2.条件を減らして試してみる  3.相手を変えて試してみる ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■実際の記述例 ■ ■ ■スク水ゆうかりんの対空投げ [State 60000, neutral];アイアンクロー Type = varset TriggerAll = var(10) = -1 && var(15) = 1 ;前提 TriggerAll = (var(20)&11) = 1 && (var(20)&16) Triggerall = !(var(12) & (4|8)) && random < var(59)*95 || random > var(59)*95 ;!inguarddist TriggerAll = (var(25)&3) != 3 && (var(26)!=[5000,5299]) || (var(25)&11) = 3 && PlayerID(var(0)),Gethitvar(hittime) < 5;相手くらいでない TriggerAll = root,var(29) < 7 && root,var(27) < 4 TriggerAll = Random < 600 ;中+ TriggerAll = Random < var(59)*var(59)*10 || Random < 100 TriggerAll =1 || fvar(1) := 5 ; TriggerAll =1 || fvar(2) := PlayerID(var(0)),const(Movement.Yaccel) ;相手の重力加速度 TriggerAll =1 || fvar(2) := Floor(( PlayerID(var(0)),Vel Y * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 TriggerAll =1 || fvar(2) := Ifelse( (var(25)&12)=8 ,fvar(2) ,0 ) TriggerAll =1 || fvar(3) := Floor( PlayerID(var(0)),Vel X * fvar(1) * fvar(20) );X速度×時間 TriggerAll =1 || fvar(3) := fvar(3) * Ifelse( (var(25)&8)=8 ,1,0.6 );A,L TriggerAll = var(22) != 1600 TriggerAll = !fvar(35) || Random < 800 ;弱体化 TriggerAll = var(59) > 10 || Random var(59)*95 ;!inguarddist TriggerAll = root,var(18) >= 10 Triggerall = root,var(20) < 5 TriggerAll = Random < 200;低 Triggerall = var(18) > 3 || Random < 200 || Root,var(55)>0 ;Life条件 TriggerAll = Random < var(59)*var(59)*10 || Random < 100 TriggerAll = fvar(32) < -45 ;pos TriggerAll = var(22) != 1000 TriggerAll = !fvar(35) || Random < 800 ;弱体化 Trigger1 =1 || fvar(1) := 7 ; Trigger1 =1 || fvar(2) :=fvar(8) ;相手の重力加速度 Trigger1 =1 || fvar(2) := Floor(( fvar(6) * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 Trigger1 =1 || fvar(2) := Ifelse( (var(25)&12)=8 ,fvar(2) ,0 ) Trigger1 =1 || fvar(3) := Floor( fvar(5) * fvar(1) * fvar(20) );X速度×時間 Trigger1 =1 || fvar(3) := fvar(3) * Ifelse( (var(25)&8)=8 ,1,0.6 );A,L Trigger1 =1 || fvar(3) := Ifelse( (Root,P2Dist X-var(30))>fvar(3) ,(Root,P2Dist X-var(30)), fvar(3)) ;壁までの距離 Trigger1 = fvar(30) - fvar(3)= [-50,0];dx Trigger1 = fvar(31) + fvar(2) = [-70,-45];dy Trigger2 =1 || fvar(1) := 7+2 ; Trigger2 =1 || fvar(2) :=fvar(8) ;相手の重力加速度 Trigger2 =1 || fvar(2) := Floor(( fvar(6) * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 Trigger2 =1 || fvar(2) := Ifelse( (var(25)&12)=8 ,fvar(2) ,0 ) Trigger2 =1 || fvar(3) := Floor( fvar(5) * fvar(1) * fvar(20) );X速度×時間 Trigger2 =1 || fvar(3) := fvar(3) * Ifelse( (var(25)&8)=8 ,1,0.6 );A,L Trigger2 =1 || fvar(3) := Ifelse( (Root,P2Dist X-var(30))>fvar(3) ,(Root,P2Dist X-var(30)), fvar(3)) ;壁までの距離 Trigger2 = fvar(30) - fvar(3)= [-37,15];dx Trigger2 = fvar(31) + fvar(2) = [-70,-45];dy Trigger3 =1 || fvar(1) := 7+4 ; Trigger3 =1 || fvar(2) :=fvar(8) ;相手の重力加速度 Trigger3 =1 || fvar(2) := Floor(( fvar(6) * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 Trigger3 =1 || fvar(2) := Ifelse( (var(25)&12)=8 ,fvar(2) ,0 ) Trigger3 =1 || fvar(3) := Floor( fvar(5) * fvar(1) * fvar(20) );X速度×時間 Trigger3 =1 || fvar(3) := fvar(3) * Ifelse( (var(25)&8)=8 ,1,0.6 );A,L Trigger3 =1 || fvar(3) := Ifelse( (Root,P2Dist X-var(30))>fvar(3) ,(Root,P2Dist X-var(30)), fvar(3)) ;壁までの距離 Trigger3 = fvar(30) - fvar(3)= [-37,30];dx Trigger3 = fvar(31) + fvar(2) = [-70,-45];dy Trigger4 =1 || fvar(1) := 7+7 ; Trigger4 =1 || fvar(2) :=fvar(8) ;相手の重力加速度 Trigger4 =1 || fvar(2) := Floor(( fvar(6) * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 Trigger4 =1 || fvar(2) := Ifelse( (var(25)&12)=8 ,fvar(2) ,0 ) Trigger4 =1 || fvar(3) := Floor( fvar(5) * fvar(1) * fvar(20) );X速度×時間 Trigger4 =1 || fvar(3) := fvar(3) * Ifelse( (var(25)&8)=8 ,1,0.6 );A,L Trigger4 =1 || fvar(3) := Ifelse( (Root,P2Dist X-var(30))>fvar(3) ,(Root,P2Dist X-var(30)), fvar(3)) ;壁までの距離 Trigger4 = fvar(30) - fvar(3)= [-5,45];dx Trigger4 = fvar(31) + fvar(2) = [-70,-45];dy trigger5 = fvar(30) > 200 && var(59) <= 10 Trigger5 = random < 100 var(10) = 1000 ■ ■ ■スク水ゆうかりんの移動攻撃2 [State 60000, Combo];Lv1,ショルダーチャージ Type = varset TriggerAll = var(10) = -1 && var(15) = 30 ;前提 TriggerAll = (var(20)&11) = 1 && (var(20)&16) TriggerAll = power >= 1000 && root,var(18) TriggerAll = var(30)>100 && power >= 2000 TriggerAll =1 || fvar(1) :=Floor( 4 +(( fvar(30)-70 )/8) );到達予測F TriggerAll =1 || fvar(1) := Ifelse( fvar(1)<4 ,4 ,fvar(1) );最速4F Trigger1 =1 || fvar(2) :=fvar(8) ;相手の重力加速度 Trigger1 =1 || fvar(2) := Floor(( fvar(6) * fvar(1) ) + ( Fvar(2)*( (fvar(1)*(fvar(1)-1))/2) ));速度×時間 Trigger1 = PlayerID(var(0)),Pos Y + fvar(2) > 0 || var(27) > -40;着地直前orちっちゃい Trigger1 = fvar(31) + fvar(2) = [-72,33];dy var(10) = 2200 +(var(8):=1)*0 ;+(var(15):=999)*0 ■ ■ ■七星付き生足美鈴の空中2A [State -1,Neutral Action - Kihon - J2A] Type = ChangeState Value = 610 TriggerAll = Var(31)%10=0 &&(Var(31) =[10,49]) || Var(31) = 5 ;基本動作,対当身 TriggerAll = Var(34) > Var(36) ;始動遅延 TriggerAll = Var(37) < Var(59)*95 ;確率 TriggerAll = Random < 400-Var(59)*50 || !(Var(30) & 512) || StateNo !=[110,115] ;グレイズでない TriggerAll = Random < 999-Var(59)*90 || EnemyNear(var(39)),MoveType != A ;P2MoveType != A TriggerAll = ( Ctrl || StateNo = 500 && Time ) && StateType = A ;前提条件 TriggerAll = P2Dist X > -20 TriggerAll = fvar(9) := 12 ;発生フレーム TriggerAll = Pos Y + ( (Vel Y*fvar(9)) + (Const(Movement.Yaccel))*( (fvar(9)*(fvar(9)-1))/2 ) ) < 0;発生まで着地しない Trigger1 = 1 || fvar(8) := ( (EnemyNear(var(39)),Vel Y*fvar(9)) + (EnemyNear(var(39)),Const(Movement.YAccel))*( (fvar(9)*(fvar(9)-1))/2 ) );相手の速度 Trigger1 = 1 || fvar(8) := fvar(8) * (EnemyNear(var(39)),StateType=A) Trigger1 = 1 || fvar(8) := fvar(8) - ( (Vel Y*fvar(9)) + (Const(Movement.YAccel))*( (fvar(9)*(fvar(9)-1))/2 ) );自分の速度 Trigger1 = EnemyNear(var(39)),Pos Y > -10 &&(Pos Y - Fvar(32) + fvar(8) = [-73,4])|| fvar(31) + fvar(8) = [-73,4] ;P2Dist Y Trigger1 = 1 || fvar(8) := 0-(EnemyNear(var(39)),Vel X*fvar(14)*fvar(9)*(Ifelse(EnemyNear(var(39)),StateType!=A,0.5,1)))-(Vel X*fvar(9)) ;適当な速度 Trigger1 = (fvar(30) = [-80,10])|| fvar(30) + fvar(8) = [ -100 , 59 ] ;P2BodyDist X trigger1 = Var(31)!=5 || EnemyNear(var(39)),AnimTime + ((Random%5)*(Var(59)<11)) > fvar(9)*-1 ;対当身でないorアニメ終わり際狙い ■ ■ ■七星付き生足美鈴のキャンセルバニシングストライク。 [State -1,Normal Chain - Kihon - Banishing Strike] Type = ChangeState Value = 380 +(Var(32):=0) TriggerAll = (Var(31)%10)=0 &&(Var(31) =[10,49]) ;基本動作 TriggerAll = Var(37) < Var(59)*Var(59)*12 ;確率 TriggerAll = Movecontact && StateType != A ;前提条件 TriggerAll = Movecontact < 5 && enemyNear(var(39)),StateType != A TriggerAll = MoveGuarded || EnemyNear(Var(39)),GetHitVar(HitCount) < 10 TriggerAll=1||fvar(8):=0&&Fvar(9):=enemyNear(var(39)),GetHitVar(XVel)*enemyNear(var(39)),Facing;相手速度 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));1 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));2 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));3 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));4 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));5 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));6 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));7 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));8 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));9 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));10 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));11 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));12 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));13 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));14 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));15 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));16 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));17 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));18 TriggerAll=1||fvar(8):=Fvar(8)+(Fvar(9):=Fvar(9)*Fvar(7))*(var(58)-P2Dist X>10+fvar(8));19 ;Fvar(7)=相手の摩擦係数。 Trigger1 = fvar(30)-fvar(8) < 70 - (fvar(32)>-45)*15&& P2Dist X > 0;P2BodyDist X Trigger1 = StateNo = 202 || StateNo = 210 || StateNo = 220 || StateNo = 700 || StateNo = 720 Trigger1 = Random < 850-Var(59)*90 || MoveHit ;MoveHit Trigger1 = Random < 850-Var(59)*90 || P2StateType != A Trigger2 = Var(16) > 100 || Var(23) = 1 && Var(16) > 50 ;ブーストある Trigger2 = fvar(30)-fvar(8) < 100 - (fvar(32)>-45)*15&& P2Dist X > 0;P2BodyDist X Trigger2 = StateNo = 202 || StateNo = 210 || StateNo = 220 || StateNo = 700 || StateNo = 720 Trigger2 = Random < 850-Var(59)*90 || MoveHit ;MoveHit Trigger2 = Random < 850-Var(59)*90 || P2StateType != A Trigger2 = 1 || fvar(35) := -3 Trigger3 = fvar(30)-fvar(8) < 70 - (fvar(32)>-45)*15&& P2Dist X > 0;P2BodyDist X Trigger3 = StateNo = 205 || StateNo = 206 Trigger3 = Random < 850-Var(59)*90 || MoveGuarded ;MoveGuarded ■ ■ ■Another YUKA・空中通常記述 [State -1, Normal Air Lv 4];通常攻撃/空中下/1 type = ChangeState value = 630 triggerall = Var(59) > 0 && RoundState = 2 && Alive && var(51) = 1 TriggerAll = random < var(59) * var(59) * 9 ;一応 TriggerAll = 1 || var(2) := 4 ;★★★攻撃Lv TriggerAll = StateType = A && Pos Y < -30 && ( Ctrl || MoveContact && var(5) <= var(2) ) TriggerAll = !InguardDist && Random < 800 || Random < 300 || P2Movetype = H TriggerAll = 1 || var(1) := 630 ;●重複確認用 TriggerAll = 1 || var(1) := ( (Floor(var(1)/100)*50 + (var(1)%100) -100 )/5 );記録圧縮処理 Triggerall = var(1) != (Var(9)&(63)) ;直前の攻撃と被っていない TriggerAll = Random > var(59)*var(59)*21 || var(1) != ((Var(9)&(63*64))/64) ;記録2 TriggerAll = Random > var(59)*var(59)*18 || var(1) != ((Var(9)&(63*64*64))/64/64) ;記録3 TriggerAll = Random > var(59)*var(59)*15 || var(1) != ((Var(9)&(63*64*64*64))/64/64/64) ;記録4 TriggerAll = Random > var(59)*var(59)*12 || var(1) != ((Var(9)&(63*64*64*64*64))/64/64/64/64) ;記録5 TriggerAll = Random < 300 || P2Movetype = H TriggerAll = P2Dist X > 10 ;相手前 ; trigger1 = 1 || var(4) := 5 ;●発生F Trigger1 = 1 || fvar(4) := ( ID-100*(Movetype=A)>EnemyNear(var(0)),ID-100*(P2Movetype=A) ) ;処理順調整用 ; Trigger1 = P2Statetype = A || Pos Y + (Vel Y)*(var(4)+1) + Const(Movement.Yaccel)*((var(4)+1)*(var(4)+2)/2) < -60 ;着地に余裕を持って Trigger1 = Vel Y > 0 || P2Movetype =H ;落下中限定 Trigger1 = P2Movetype != H || P2Statetype = A || EnemyNear(var(0)),gethitvar(hittime) > var(4)+2 ;ヒットが間に合う Trigger1 = Pos Y + (Vel Y)*(var(4)+1) + Const(Movement.Yaccel)*((var(4)+1)*(var(4)+2)/2) < 0 ;着地にも間に合う ; trigger1 = 1 || var(3) := IFelse(P2Statetype = S, EnemyNear(var(0)),const(size.head.pos.Y) ,EnemyNear(var(0)),const(size.mid.pos.Y) ) ;相手体格 Trigger1 = 1 || fvar(1):= IFelse(P2Movetype=H,EnemyNear(var(0)),gethitvar(yaccel) ,EnemyNear(var(0)),Const(Movement.Yaccel) ) ;重力加速度 Trigger1 = 1 || fvar(2):= IFelse(P2Movetype=H&&(EnemyNear(var(0)),StatENo<5030||EnemyNear(var(0)),HitShakeOver=0), EnemyNear(var(0)),gethitvar(yvel) , EnemyNear(var(0)),Vel Y ) ;相手Y速度 Trugger1 = 1 || var(4) := var(4) - Floor(fvar(4));調整 Trigger1 = 1 || fvar(3) := Floor( (fvar(2)*(var(4)) + fvar(1)*((var(4)*(var(4)+1))/2)) ) Trugger1 = 1 || var(4) := var(4) + Floor(fvar(4));調整戻し Trigger1 = 1 || fvar(3) := fvar(3) * (P2statetype = A) ;相手地上 Trigger1 = 1 || fvar(1) := Const(Movement.Yaccel) || fvar(2) := (Vel Y) ;自分速度 Trigger1 = 1 || fvar(3) := fvar(3) - Floor( (fvar(2)*(var(4)) + fvar(1)*((var(4)*(var(4)+1))/2)) ) trigger1 =(P2Dist Y +fvar(3) +var(3) = [-60 , -9-10]);●Y範囲 ; Trigger1 = 1 || fvar(2):= IFelse(P2Movetype=H&&(EnemyNear(var(0)),StatENo<5030||EnemyNear(var(0)),HitShakeOver=0), (EnemyNear(var(0)),gethitvar(xvel)* EnemyNear(var(0)),Facing) , EnemyNear(var(0)),Vel x ) ;相手X速度 Trigger1 = 1 || fvar(2):= fvar(2) * Ifelse(P2StateType!=A,0.5*(EnemyNEar(var(0)),Ctrl=0) ,1) ;摩擦目安 Trigger1 = 1 || var(1):= Floor( P2BodyDist X - fvar(2)*var(4)*fvar(0) ) ;距離計算1 Trigger1 = 1 || var(1):= Floor( Ifelse(var(1) < fvar(34), var(1) ,fvar(34)) ) ;相手の移動距離制限 Trigger1 = 1 || Ifelse( var(1) > vel X*var(4),var(1), IFelse((P2Dist Y+fvar(3)=[ -Const(Size.height)+20 , EnemyNear(var(0)),Const(Size.height)-20 ]),0, var(1) ) ) ;すれ違いそうで範囲内なら0に。 Trigger1 =(var(1) = [ 5+10 , 66 -10]) || var(1) = 0 ;●X範囲 ■余談・Helper型AIの場合の発生フレーム補正値について。  Helperで動作を指定して、本体でそれを認識して行動するタイプのAIの場合、発生フレーム補正値はいらない。  フレーム補正値は「速度が1F分、既に処理を終えているから」補正するのですが、  Helperはプレイヤーの後に処理をするので「速度は既に処理を終えている状態」です。  しかしHelper型AIは「次のフレームから行動を始める」ので+1F分補正しなければなりません。  つまり-1Fの補正と+1Fの補正が必要になっているため、補正値がいらないのです。  ※ただし、「相手の速度の変動を認識する」場合、SuperPause中も動けるAIだと暗転を誤認するので注意。  ※とはいえ暗転とかの最中はそんな判断が必要な状態じゃなさそうですが。 ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■■ 古い更新記録 13:22 2011/10/30 ↓やっぱり正しかった。 勘違い。 13:09 2011/10/30 特殊速度感知のY速度処理が間違ってた。 12:55 2011/10/30 差し替えテンプレート追加 11:31 2011/10/30 11:15 2011/10/30 空中技テンプレートのミス(自分のX速度を-してた)を修正 10:41 2011/10/30 テンプレートに壁衝突計算追加 19:44 2011/10/29 空中技用のテンプレートを修正。発生フレーム補正処理を戻して、自分の速度を計算させないといけなかった。 17:37 2011/10/29 補正値処理に捕捉 9:40 2011/10/29 補正値処理を追加 7:47 2011/10/29 ちょっと調整。 5:31 2011/10/29 要望にお答えして記述のテンプレートを追加。ただ確認してないんで読み込まないとかの不具合あるかも 21:17 2011/10/28 tempvarについて補足説明。 18:17 2011/10/28 調査報告 16:09 2011/10/28 一部計算式を修正。(時間*(時間+1)/2)ではなく(時間*(時間-1)/2)が丁度っぽいです。ただ、まだ調査中。差が僅かなんでほとんど分からんよ。 4:14 2011/06/08 Velの性質を更新 3:22 2011/06/06 Velの性質を0605 17:38に更新してました。あとそれにともなって補足追記 1:35 2011/06/03 そういえば衝突判定の記述、前にいる相手〜という前提で作ってた。修正計算面倒。 16:50 2011/05/28 衝突判定の記述を調整,(P2Dist Y =[-Const(Size.Height),(EnemyNear,Const(Size.Height))]) 16:39 2011/05/28 衝突判定の記述を修正,EnemyNear,Const(Size.Height)P2Dist Y