;細かい調整をしてないのであまりオススメできないけど一応。 ;11:40 2011/11/08 ちゃんと一撃目を認識するように修正。できたはず。 ; 8:05 2011/11/08 ちょっと追記 ; 7:09 2011/11/08 ちょっと調整 ;16:31 2011/10/02 余分なメモを削除 ;15:54 2011/10/02 スク水ゆうかりん用に作った改良型当て身投げ用記憶システムと対投げ記憶装置。 ;66000〜66101のステートを使用しています。 ;※スク水ゆうかりんADIAIの記憶装置とほぼ同型。 ; ; ■■機能概要■■ ;■当て身投げ用記憶システム ■記憶数:20個(重複有り) ; 1Hit目の打撃を受けた際に相手のStateNo,発生フレーム,X距離、 ;  相手のID,直前のステート番号,直前が攻撃状態だったか、を記憶し、 ;  同じステートの攻撃に対して反応をさせることができる。 ; ただし、同じ攻撃でも距離が大幅に違う場合は反応をさせないようにしている他、 ;  複数の記憶を行ってより座標的に近しい方を参考にしている。 ; また(失敗値が無く)直前が攻撃状態だった場合、そのステートの入った時から反応フラグを立て、 ;  より確実に反応動作を行えるようにしている。※不安定そうなら立てない。 ; 乱用禁物。 ; 反応動作フラグを立てることで失敗した場合の失敗値を加算できる。 ; 2回失敗したら「不可」とするフラグを立てる。両方不可となった場合、反応フラグを立てない。 ; ;■対投げ記憶システム ■記憶数:10個(重複無し) ; 投げ技を受けた時に相手のAnim番号,発生フレーム,Enemy(x),を記憶し、 ;  同じAnimの攻撃に対して反応させることができる。※反応してしまうとも言う。 ;( 同じStateNoでも別々のAnimで制御している場合、別々に反応ができる。 ) ; 同じ投げ技を受けても重複記憶はせず、 ;  発生フレームの比較を行い短い方に上書きをする。 ; こちらは失敗値やら空中管理やらは無い。 ; ;↓★★★★★の部分は必須の調整箇所。 ;こちらを-3ステートに導入。 ;[State -3, AI Helper 1];当て身投げ用の記憶システム ;Type = Helper ; ;TriggerAll =!isHelper ;Trigger1 = !NumHelper(66000) ;射出制限 ;ID = 66000 ;Pos = 0,0; ;StateNo = 66000 ; ;OwnPal = 1 ;Size.XScale = 0 ;Size.YScale = 0 ;★★★★★EnemyNear,ID の部分をEnemyNear(x生きてる相手x),IDになるよう各自変更。(デフォルトRoot,var(0)) ;残りの必須調整箇所は多分無し。 ;★★★★★Anim の部分を判定のないアニメに変更。可能なら。 ;当て身用記憶装置の環境条件 ;Trigger1 = Helper(66000),Fvar(39) = 1;反応 ;Trigger1 = Random < Helper(66000),Fvar(32)*Var(-AILv-)*1.0 *Helper(66000),fvar(16) || Var(-AILv-) > 10 ;Timeを含んだ確率 ;Trigger2 = Helper(66000),Fvar(39) = 2;準備(状況判断用) ;Trigger2 = Random < EnemyNear(x),Time*Var(-AILv-)*1.5 *Helper(66000),fvar(16) || Var(-AILv-) > 10 ;Timeを含んだ確率 ;技側の条件 ;Trigger1 = Helper(66000),Fvar(32) - Helper(66000),Fvar(10) = [受付開始Time,受付終了Time]; ;終了Timeを半分〜2/3程度まで減らして、開始Timeを+2~3増やして使うほうがブレに対して対応しやすいかも。 ; ;失敗認識条件 ;TriggerAll = NumHelper(60000) ;TriggerAll = !Helper(66000),fvar(23);無敵技不可フラグ確認 ;Trigger1 = Helper(60000),Var(14) = 10 ;無敵技反応時 ;TriggerAll = NumHelper(60000) ;TriggerAll = !Helper(66000),fvar(22);当て身投げ不可フラグ確認 ;Trigger1 = Helper(60000),Var(14) = 1 ;当て身投げ反応時 ;★★★★★★★★★★←で検索すれば↑の調節するための行が出てくる。 ; ;追記:当て身技は「攻撃が当たりそう」だと認識して反応しますので技の範囲条件は基本的にいりません。 ;投げ記憶装置の環境条件 ;Trigger1 = Helper(66000),Fvar(29) = 1;反応 ;Trigger1 = Random < Helper(66000),Fvar(28)*Var(-AILv-)*1.0 || Var(-AILv-) > 10 ;Timeを含んだ確率 ;技側の条件 ;Trigger1 = Helper(66000),Fvar(28) - Helper(66000),Fvar(10) = [受付開始Time,受付終了Time]; ;使う技は「投げに無敵の技」です。バックステップでも昇竜でも可。場合によってはジャンプも。 ;※受付終了Timeは半分程度まで減らして使いましょう。投げ判定が持続するタイプで攻撃が当たらない場合、投げられる可能性有り。 ; ;空中云々の認識はさせていません。このゆうかりん空中機動悪いんだもの。 ;bit的な空きはあるので無理でもない。 ;追記:不安定なら技の範囲条件を指定して使いましょう。 ;■■ ;■ ;■ AIの当て身投げ用記憶システムの改良版 ;■ ;■■■■■AI用Helper,記憶システムState ;■■■■■■■■■■■ [Statedef 66000];■■■読み込み開始 Type = A MoveType = I Physics = N Ctrl = 0 Anim = 9999;★★★★★Anim 画像・判定のないものに。 SprPriority = -5; ;欠点:Stateの処理が特殊な相手には不具合を起こす ;  :Helperでの攻撃に対応していない ;  :Ctrlのある相手には対応していない(意図的に) [State 60000, varreset] Type = Null Trigger1 = Var(0):=( root,Var(0) ) ;★★★★★EnemyNear,ID Trigger1 =(var(1):=0)||(var(2):=0)||(var(3):=0)||(var(4):=0) ;リセット Trigger2 =(fvar(0):=0)||(fvar(1):=0)||(fvar(2):=0)||(fvar(3):=0)||(fvar(4):=0) ;リセット Trigger3 =(fvar(5):=0)||(fvar(6):=0)||(fvar(7):=0)||(fvar(8):=0)||(fvar(9):=0) ;リセット IgnoreHitPause = 1 [State 60000, varreset] Type = Null Trigger1 = Var(0)=0 Trigger1 = 0 && Var(0):=( enemy,ID ) ; Trigger2 = Var(7)=0 Trigger2 = 0 && Var(7):=( enemy,ID ) ; [State 66000, start chnagestate] Type = ChangeState value = 66001 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66001];■■■記録開始 Type = A [State 66000, var 5];記憶進展:相手攻撃開始 Type = varset ;;攻撃開始時からにすると溜め攻撃にうまく動きにくい為;;Trigger1 = var(5) = 0 Trigger1 = PlayerID(var(0)),Time = 1 Trigger1 = PlayerID(var(0)),MoveType = A Trigger1 = PlayerID(var(0)),Ctrl = 0 Trigger1 = 1 || var(6):=PlayerID(var(0)),StateNo ;ステート番号記録 Trigger1 = 1 || var(7):=var(0) ;ID記録 var(5) = 1 ;相手の始動時に [State 66000, RecAI-Turn];振り向き Type = Turn TriggerAll = PlayerIDExist(var(7)) && var(5) = 1 ;処理前提 Trigger1 = Facing != root,Facing [State 66000, RecAI-Posset and P2BDset];!TimeでPosを本体に +距離数値代入 Type = Posadd X = Floor(RootDist X) Y = Floor(RootDist Y) TriggerAll = PlayerIDExist(var(7)) && var(5) = 1 ;処理前提 Trigger1 = 1 || fvar(0) := Floor(root,P2BodyDist X) ;temp1代入 [State 66000, RecAI-recDist];数値設定 Type = Varset var(9) = 9999;無理数値 TriggerAll = PlayerIDExist(var(7)) && var(5) = 1 ;処理前提 Trigger1 = var(9) := Floor( fvar(0) + 512 ) ; Trigger1 = var(9) != [ 0,1023 ];記憶可能数値でない場合無理数値に [State 66000, start chnagestate] Type = ChangeState value = 66002 Trigger1 = 1 || var(5) := 2 ;次へ Trigger1 = 1 || var(1) := 0 ;temp1,次のループ処理管理 ;■■■■■■■■■■■ [Statedef 66002];■■■ステート番号・ID照合 Type = A [State 66000, var 1];記憶参照 Type = varset TriggerAll = var(1) = 0 Trigger1 = 1 || fvar(0) := PlayerID(var(7)),StateNo ;temp1 Trigger1 = 1 || var(2) := 0 ;temp2 Trigger1 = 1 || (fvar(1):=99)||(fvar(2):=99)||(fvar(3):=99)||(fvar(4):=99) ;リセット Trigger1 = 1 || (fvar(7):= 0)||(fvar(8):= 0);失敗回数計算 var(1) = 20 ;temp1,読み込み開始位置 [State 66000, RecAI-StateNoCheck 01];tempを複数使い20個から4つまで番号を取り出す。 Type = Null TriggerAll = PlayerIDExist(var(7)) ;処理前提 Trigger1 = (var(var(1)+1)&127) = var(7) && (var(var(1))&16383) = fvar(0);ID,StateNo確認 Trigger1 = var(2) := (var(2)+1) ;加算 Trigger1 = fvar( var(2) ) := var(1) ;1~4に記録 ; fvar(0) temp1 = StateNo ; fvar(1) temp2 = スロット番号1 ; fvar(2) temp3 = スロット番号2 ; fvar(3) temp4 = スロット番号3 ; fvar(4) temp5 = スロット番号4 ; var(1) temp1 = ループ回数 ; var(2) temp2 = fvar位置指定 [State 66000, RecAI-MistakeCheck 1];失敗回数を加算。もしかしたら使わないかも。特に無敵技の方は。 Type = Null TriggerAll = fvar( var(2) ) < 99 ;記録された場合 Trigger1 = 1 || fvar(7) := fvar(7) + ( (var(var(1)+1)&49152)/16384 ) ;当て身投げ失敗値 Trigger1 = 1 || fvar(8) := fvar(8) + ( (var(var(1)+1)&12288)/ 4096 ) ;無敵技失敗値 ;--bit-13-14=(&12288)/4096 =(3) 失敗回数/無敵技 ;--bit-15-16=(&49152)/16384=(3) 失敗回数/当て身投げ [State 66000, start chnagestate] Type = ChangeState value = 66002 Trigger1 = var(1) < 58 && var(2) < 4 Trigger1 = 1 || var(1) := var(1) + 2 ;加算 [State 66000, RecAI-MistakeCheck 1]; Type = Null TriggerAll = 1 || (fvar(22) := 0) || (fvar(23) := 0) Trigger1 = 1 || fvar(22) := (fvar(7) > 1) ;当て身投げ不可 Trigger1 = 1 || fvar(23) := (fvar(8) > 1) ;無敵技不可 Trigger1 = fvar(22) && fvar(23) ;両方共不可なら不可に。 Trigger1 = fvar(1) := 99 [State 66000, start chnagestate] Type = ChangeState value = 66003 Trigger1 = 1 || fvar(16) := var(2) ;重複制限用 Trigger1 = 1 || var(1) := 0 ;temp1,次のループ処理管理 ;■■■■■■■■■■■ [Statedef 66003];■■■重複確認・最も近しい距離に Type = A [State 66000, var 1];記憶参照 Type = varset TriggerAll = var(1) = 0 Trigger1 = 1 || fvar(0) := PlayerID(var(7)),StateNo ;temp1 Trigger1 = 1 || var(2) := 0 ;temp2 Trigger1 = 1 || (fvar(6):= 0)||(fvar(7):= 0)||(fvar(8) := 9999) var(1) = 1 ;temp1,読み込み開始位置 [State 66000, RecAI-RepeatCheck] Type = Null TriggerAll = PlayerIDExist(var(7)) && fvar(16) && !(fvar(22)&&fvar(23));処理前提 Trigger1 = 1 || var(2) := Floor(fvar( var(1) )) ; fvar1~4 Trigger1 = var(2) < 99 Trigger1 = 1 || fvar(7) := ( var( var(2) ) & 2145386496 ) / 2097152 ;temp8距離代入 Trigger1 = abs(fvar(8))>abs( fvar(7) - var(9) - Floor(RootDist X) ) ; temp9に代入 Trigger1 = 1 || fvar(8) := ( fvar(7) - var(9) - Floor(RootDist X) ) ; temp9に代入 Trigger1 = 0 && fvar(6) := var(2) ;temp7 ;一番「絶対値が近しい距離」を選ぶ。 ;その為、微妙な距離の違いだと数F程度の誤差が生まれる。 [State 66000, start chnagestate] Type = ChangeState value = 66003 Trigger1 = var(1) < fvar(16) && fvar(16) > 1 Trigger1 = 1 || var(1) := var(1) + 1 ;加算 [State 66000, RecAI-dist over check]; Type = Null TriggerAll = abs(fvar(8)) > 30 ;記憶より差異が30以上なら不可に。 Trigger1 = fvar(1) := 99 [State 66000, start chnagestate] Type = ChangeState value = 66010 Trigger1 = 1 || var(2) := Floor(fvar(6)-1) ;参照の方法が、xに対して+1,+2のvarを参照する式だったので、-1して処理。 ;■■■■■■■■■■■ [Statedef 66010];■■■;反応処理用 Type = A ;■記憶読み込み [State 66000, RecAI-Check Set] Type = Null TriggerAll = PlayerIDExist(var(7)) && fvar(16); && !(fvar(22)&&fvar(23));処理前提 TriggerAll = fvar(1) != 99 ;ある&&危険でない Triggerall = var(2) < 99 && var(2) TriggerAll = Fvar(31) != fvar(0) ;ステート番号非合致確認 TriggerAll = fvar(30)!=9999 && !fvar(34) ;処理条件 Trigger1 = 1 || Fvar(30) := var(2) ;temp(temp7)を代入 Trigger1 = 1 || Fvar(31) := ( var( var(2)+1 )& 16383) ;反応用StateNo Trigger1 = 1 || Fvar(32) := ( var( var(2)+1 )& 2080768) / 16384 ;反応用Time Trigger1 = 1 || Fvar(33) := ( var( var(2)+1 )& 2145386496) /2097152 ;反応用BodyDist X Trigger1 = 1 || Fvar(34) := ( var( var(2)+2 )& 127 ) ;反応用相手ID ;無し;Trigger1 = 1 || Fvar(35) := ( var( var(2)+1 )& 3968 ) / 128 ;反応用・保留 Trigger1 = 1 || Fvar(36) := ( var( var(2)+2 )& 12288 ) / 4096 ;反応用失敗回数/無敵技 Trigger1 = 1 || Fvar(37) := ( var( var(2)+2 )& 49152 ) /16384 ;反応用失敗回数/当て身投げ Trigger1 = 1 || Fvar(39) := 1 ;反応フラグ [State 66000, RecAI-Check Reset 1] Type = Varset fvar(39) = 0 ;反応フラグのみリセット TriggerAll = PlayerIDExist(var(7)) ;ID対象存在確認 Trigger1 = Fvar(31) != Fvar(0) ;ステート番号非合致確認 Trigger2 = Fvar(31) = Fvar(0) ;合致 Trigger2 = Fvar(32) - fvar(10) <= 0 ;攻撃後 Trigger3 = Fvar(31) = Fvar(0) ;合致 Trigger3 = abs(var(9)-512)-RootDist X > abs(Fvar(33)-512)+50 ;範囲外 Trigger4 = Fvar(31) = Fvar(0) && Root,P2Dist X > 0 ;合致・相手が前 Trigger4 =!( Root,Pos X <=PlayerID( var(7) ),Pos X ^^ PlayerID( var(7) ),Facing = 1 );相手がこちらから見て後ろ向き Trigger5 = Root,MoveType != I ;本体が攻撃かくらい状態 Trigger6 = fvar(34) = 0 ;ID無し [State 66000, RecAI-Check Reset 2] Type = Null Trigger1 = Fvar(31) != Fvar(0) ;ステート番号非合致確認 Trigger1 =(Fvar(31) := 0)&&(Fvar(32) := 0)&&(Fvar(33) := 0) ; fvar(0) temp1 = StateNo(引継ぎ) ; fvar(1) temp2 = スロット番号1(引継ぎ) ; fvar(2) temp3 = スロット番号2(引継ぎ) ; fvar(3) temp4 = スロット番号3(引継ぎ) ; fvar(4) temp5 = スロット番号4(引継ぎ) ; fvar(5) temp6 = スロット番号5(引継ぎ) ; fvar(6) temp7 = スロット番号管理(引継ぎ) [State 66000, start chnagestate] Type = ChangeState value = 66011 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66011];■■■;成否の確認・記録 Type = A ;失敗確認 [State 66000, RecAI-Check Mistake];無敵技 Type = Varadd fvar(36) = 1 TriggerAll = fvar(30)!=9999 && fvar(34) ;処理条件 TriggerAll = NumHelper(60000) TriggerAll = Helper(60000),Var(14) = 10 ;反応 Trigger1 = Root,MoveType = H && Fvar(19) = 0 ;1回限定 [State 66000, RecAI-Check Mistake];当て身投げ Type = Varadd fvar(37) = 1 TriggerAll = fvar(30)!=9999 && fvar(34) ;処理条件 TriggerAll = NumHelper(60000) TriggerAll = Helper(60000),Var(14) = 1 ;反応 Trigger1 = Root,MoveType = H && Fvar(19) = 0 ;1回限定 ;★★★★★★★★★★ ;■成否他の反映 ;var( Floor(fvar(30)+2) ) [State 66000, RecAI-RecUpdate temp] Type = Null TriggerAll = fvar(30)!=9999 && fvar(34) ;処理条件 Trigger1 = 0 && fvar(1) := ( var( Floor(fvar(30)+2) )& 127 ) ;temp2反応用相手ID Trigger2 = 0 && fvar(2) := ( var( Floor(fvar(30)+2) )& 3968 ) / 128 ;temp3反応用・保留 Trigger3 = 0 && fvar(3) := Ifelse(fvar(36)<3, fvar(36), 3) ;temp4反応用無敵技失敗値 Trigger4 = 0 && fvar(4) := Ifelse(fvar(37)<3, fvar(37), 3) ;temp5反応用当て身投げ失敗値 Trigger5 = 0 && fvar(5) := ( var( Floor(fvar(30)+2) ) &1073676288 ) / 65536 ;temp6準備用 Trigger6 = 0 && fvar(6) :=(( var( Floor(fvar(30)+2) ) &1073741824 ) = 1073741824);temp7 [State 66000, RecAI-RecUpdate set] Type = Null Trigger1 = fvar(30)!=9999 && fvar(34) ;処理条件 Trigger1 =1 || var( Floor(fvar(30)+2) ) := Floor(fvar(1)) + Floor(fvar(2)) * 128 ;代入1 Trigger1 =1 || var( Floor(fvar(30)+2) ) := var( Floor(fvar(30)+2) ) + Floor(fvar(3))*4096 ;代入2 Trigger1 =1 || var( Floor(fvar(30)+2) ) := var( Floor(fvar(30)+2) ) + Floor(fvar(4))*16384;代入3 Trigger1 =1 || var( Floor(fvar(30)+2) ) := var( Floor(fvar(30)+2) ) + Floor(fvar(5))*65536;代入4 Trigger1 =1 || var( Floor(fvar(30)+2) ) := var( Floor(fvar(30)+2) ) + Floor(fvar(6))*1073741824;代入5 ; fvar(0) temp1 = StateNo(引継ぎ) ; fvar(1) temp2 = 反応用相手ID ; fvar(2) temp3 = 反応用・保留 ; fvar(3) temp4 = 反応用無敵技失敗値 ; fvar(4) temp5 = 反応用当て身投げ失敗値 ; fvar(5) temp6 = PrevStateNo ; fvar(6) temp7 = PrevMoveType ; fvar(7) temp8 = HitCount ; fvar(8) temp9 = PrevStateNoチェック ;■処理条件リセット [State 66000, RecAI-ID Reset] Type = Null TriggerAll = fvar(31) != Fvar(0) ;ステート番号非合致 TriggerAll = Helper(60000),var(14) = 0; Trigger1 = fvar(34) := 0 [State 66000, RecAI-MoveType A] Type = Null Trigger1 = Fvar(19) :=( Root,MoveType = H ) [State 66000, start chnagestate] Type = ChangeState value = 66020 Trigger1 = 1 || var(1) := 0 ;temp1,次のループ処理管理 ;■■■■■■■■■■■ [Statedef 66020];■■■;事前動作確認 Type = A [State 66000, var 1];記憶参照 Type = varset TriggerAll = var(1) = 0 Trigger1 = 1 || fvar(0) := PlayerID(var(7)),StateNo ;temp1 Trigger1 = 1 || var(2) := 10+1 ;temp2 Trigger1 = 1 || var(3) := 1073741824 ;temp3 Trigger1 = 1 || var(4) := 1073676288 ;temp4 Trigger1 = 1 || (fvar(3):= 0) var(1) = 1 ;temp1,読み込み開始位置 [State 66000, RecAI-PreparationStateNoCheck];tempを複数使い1つだけ見つける。 Type = Null TriggerAll = PlayerIDExist(var(7)) ;処理前提 Trigger1 = ( Var( var(2) ) & var(3) ) && ( Var( var(2) ) & 127 ) = ( var(7) );直前が攻撃動作か/ID照合 Trigger1 = fvar(0) = ( fvar(1) := ( Var( var(2) ) & var(4) ) / 65536 );ステート番号判定 Trigger1 = fvar(3) := 1 [State 66000, start chnagestate] Type = ChangeState value = 66020 Trigger1 = var(2) < 58 && fvar(3) = 0 Trigger1 = 1 || var(2) := var(2) + 2 ;加算 ; fvar(0) temp1 = PlayerID(var(7)),StateNo ; fvar(1) temp2 = 記録PrevStateNo ; fvar(2) temp3 = 参照Varスロット番号 ; fvar(3) temp4 = 適合フラグ [State 66000, RecAI-Preparation] Type = Null TriggerAll = PlayerIDExist(var(7)) ;処理前提 Trigger1 = fvar(3) != 0 ;記憶にあてはまっている Trigger1 = !(var( var(2) )& (12288+49152) ) ;失敗値が無い Trigger1 = fvar(39) := 2 && fvar(38) := var(2);準備 ; ※これがある為、攻撃を中断して別の技ができる技を1度くらうと ;   攻撃を中断しない技側に一切反応しなくなる。 ; ※事前動作感知中に攻撃を受けた場合、↓で失敗値を付けるので事前動作感知をしなくなる。 [State 66000, start chnagestate] Type = ChangeState value = 66021 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66021];■■■;事前動作・攻撃確認 Type = A ;MoveContact条件でなく、Timeなどの条件でキャンセルするタイプの場合に対応させる。 [State 66000, RecAI-Preparation] Type = Null TriggerAll = PlayerIDExist(var(7)) ;処理前提 TriggerAll = fvar(39) = 2 && ( var(2) := Floor(fvar(38)) ) && fvar(38) ;準備 TriggerAll = root,Movetype = H ;ヒットされ TriggerAll = var( var(2) ) TriggerAll = PlayerID(var(7)),StateNo = (( var( var(2) ) &1073676288 ) / 65536) ;準備StateNoと現状がまだ一緒か Trigger1 = 0 && fvar(1) := ( var( var(2) )& 127 ) ;temp2反応用相手ID Trigger2 = 0 && fvar(2) := ( var( var(2) )& 3968 ) / 128 ;temp3反応用・保留 Trigger3 = 1 || Fvar(36) := ( var( var(2) )& 12288 ) / 4096 ;反応用失敗回数/無敵技 Trigger3 = 1 || fvar(36) := fvar(36) + 1 Trigger3 = 0 && fvar(3) := Ifelse(fvar(36)<3, fvar(36), 3) ;temp4反応用無敵技失敗値 Trigger4 = 1 || Fvar(37) := ( var( var(2) )& 49152 ) /16384 ;反応用失敗回数/当て身投げ Trigger4 = 0 && fvar(4) := Ifelse(fvar(37)<3, fvar(37), 3) ;temp5反応用当て身投げ失敗値 Trigger5 = 0 && fvar(5) := ( var( var(2) ) &1073676288 ) / 65536 ;temp6準備用 Trigger6 = 0 && fvar(6) :=(( var( var(2) ) &1073741824 ) = 1073741824);temp7 Trigger7 = 1 || var( var(2) ) := Floor(fvar(1)) + Floor(fvar(2)) * 128 ;代入1 Trigger7 = 1 || var( var(2) ) := var( var(2) ) + Floor(fvar(3))*4096 ;代入2 Trigger7 = 1 || var( var(2) ) := var( var(2) ) + Floor(fvar(4))*16384;代入3 Trigger7 = 1 || var( var(2) ) := var( var(2) ) + Floor(fvar(5))*65536;代入4 Trigger7 = 1 || var( var(2) ) := var( var(2) ) + Floor(fvar(6))*1073741824;代入5 ;無敵技側の失敗値を加算 [State 66000, RecAI-Preparation] Type = Null Trigger1 = Root,MoveType != I Trigger1 = fvar(38) := 0 ;準備終了(使ってない) [State 66000, start chnagestate] Type = ChangeState value = 66050 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66050];■■■ Type = A ;■ ;■ ;■■■記憶処理 ;記録確認の前に座標・向き設定と、距離数値処理をしている。 ;■記録用スロット指定Varリセット [State 66000, RecAI-reset] Type = Varset var(8) = 19 Trigger1 = var(8) != [19,58] ;範囲外+上限に達した場合1から上書き Trigger2 = var(8) %2 != 1 ;数値不具合 ;■記録処理 [State 66000, RecAI-rec] Type = Varadd var(8) = 2 ;管理Var TriggerAll = PlayerIDExist(var(7)) ;処理前提 TriggerAll = var(8) < 58 ;限界 TriggerAll = var(5) > 0 ;自分と相手の情報を確認する Trigger1 = Root,MoveType = H && Root,Time = 1 ;くらい状態になった時 Trigger1 = PlayerID( var(7) ),HitDefAttr = SCA, AA;,AP ;受け止められる属性(APは基本的に使われない) Trigger1 = PlayerID( var(7) ),MoveContact ;相手攻撃命中 Trigger1 = PlayerID( var(7) ),MoveType = A ;相手攻撃動作中 Trigger1 = !PlayerID( var(7) ),IsHelper ;相手ヘルパーでない Trigger1 = !fvar(11) && !fvar(17);1撃目 ;記録可能数値かどうか Trigger1 = ( fvar(0) := fvar(12) ) = [0,16383] ;StateNo 14bit +temp1代入 Trigger1 = ( fvar(1) := fvar(10) ) = [1,127] ; 7bit +temp2代入 Trigger1 = ( fvar(2) := (var(9)-Floor(RootDist X)) ) = [0,1023] ;10bit +temp3代入 Trigger1 = fvar(13) = [0,16383] ;PrevStateNo 14bit Trigger1 = PlayerID( var(7) ),ID = [0,127] ; 7bit ;記録処理の条件 Trigger1 = fvar(16) < 4 ;重複記憶制限(4つまで) Trigger1 = fvar(15) = 0 ;連続記憶制限・チェック Trigger1 = fvar(15) := PlayerID( var(7) ),StateNo ;連続記録制限・記録 ;代入 Trigger1 = 1 || Var( var(8)+1 ):= Floor(fvar(0)) + (Floor(fvar(1))*16384) + (Floor(fvar(2))*2097152);代入 Trigger1 = 1 || fvar(0) := PlayerID( var(7) ),ID ;temp1 ID番号 Trigger1 = 1 || fvar(1) := fvar(13) ;temp2 PrevStateNo Trigger1 = 1 || fvar(2) := ( fvar(14) = 11 ) ;temp3 PrevMoveType=A Trigger1 = 1 || Var( var(8)+2 ):= Floor(fvar(0)) + (Floor(fvar(1))*65536) + (Floor(fvar(2))*1073741824);代入 ignorehitpause = 1 ;停止無視 ; fvar(0~2) temp1~3 = 代入記述簡略化 [State 66000, StateNoReset] Type = Null TriggerAll = PlayerIDExist( var(7) ) ;ID対象存在確認 Trigger1 = fvar(15) != PlayerID( var(7) ),StateNo ;連続記憶制限・チェック Trigger1 = fvar(15) := 0 ;■確認・他 [State -2, クリップボード] type = DisplayToClipboard trigger1 = 0 text = "AI-Helper1 %d ,%d ,%d ,%d ,%d \n" params = floor(var(9)-512),floor(fvar(10)),floor(fvar(17)),0,0 [State 66000, start chnagestate] Type = ChangeState value = 66070 Trigger1 = 1 || var(1) := 0;ループ処理用 ;■■■■■■■■■■■ [Statedef 66070];■■■;投げ技記憶用のところです。 Type = A [State 66000, var 1];記憶参照 Type = varset TriggerAll = var(1) = 0 Trigger1 = 1 || fvar(0) := PlayerID(var(0)),StateNo ;temp1 Trigger1 = 1 || var(2) := 0 ;temp2 Trigger1 = 1 || var(3) := 0 ;temp2 Trigger1 = 1 || var(4) := 0 ;temp2 var(1) = 10 ;temp1,読み込み開始位置 [State 66000, RecAI-StateNoCheck 01];無駄にenemy(3),四人目まで感知 Type = Null TriggerAll = PlayerIDExist(var(0)) ;処理前提 Trigger1 = Enemy(0),ID = var(0) Trigger1 =1|| var(2) := 0 Trigger2 = Enemy(1),ID = var(0) Trigger2 =1|| var(2) := 1 Trigger3 = Enemy(2),ID = var(0) Trigger3 =1|| var(2) := 2 Trigger4 = Enemy(3),ID = var(0) Trigger4 =1|| var(2) := 3 ;この数値は最期(66100,State)まで使う。 [State 66000, RecAI-StateNoCheck 01]; Type = Null TriggerAll = PlayerIDExist(var(0)) ;処理前提 Trigger1 = var(var(1))!=0 Trigger1 = var(2) = ( (var(var(1))&786432)/262144 ) ;enemy,確認 Trigger1 = Enemy(var(2)),Anim = ( var(var(1))&4095 );Anim確認 ;Trigger1 = Enemy(var(2)),StateNo = ( var(var(1))&4095 );StateNo確認 Trigger1 = 1 || fvar(26) := ( var(var(1))&4095 );StateNo代入 Trigger1 = 1 || fvar(27) := ( (var(var(1))&786432)/262144 ) ;enemy,代入 Trigger1 = 1 || fvar(28) := ( (var(var(1))&258048)/4096 ) ;Time代入 Trigger1 = 1 || fvar(29) := 1 ;フラグ Trigger1 = 1 || var(3) := 1 Trigger1 = 1 || var(4) := var(1) [State 66000, start chnagestate] Type = ChangeState value = 66070 Trigger1 = var(1) < 19 && var(3) = 0 Trigger1 = 1 || var(1) := var(1) + 1 ;加算 [State 66000, start chnagestate] Type = ChangeState value = 66071 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66071];■■■;投げ技記憶 Type = A [State 66000, RecAI-Check] Type = Null TriggerAll = 1 || var(3) := 0 Trigger1 = fvar(29) ;記憶がある場合 Trigger1 = fvar(28) > fvar(10) ;記憶よりTimeが少ないなら Trigger1 = 1 || var(3) := Floor(fvar(25)) ;現状の記憶スロットをvar3に。 Trigger1 = 1 || fvar(25) := var(4) ;参照したスロットを記憶スロットに変更 ;参照した記憶よりTimeが早かったならデータを上書きする。 ;■記録用スロット指定Varリセット [State 66000, RecAI-reset] Type = Varset fvar(25) = 10 Trigger1 = fvar(25) != [10,19] ;範囲外+上限に達した場合1から上書き ;■記録処理 [State 66000, RecAI-rec] Type = Varadd fvar(25) = 1 ;管理Var TriggerAll = PlayerIDExist(var(0)) ;処理前提 TriggerAll = fvar(25) < 20 ;限界 TriggerAll = var(5) > 0 TriggerAll = var(3) || !fvar(29) ;自分と相手の情報を確認する Trigger1 = Root,MoveType = H;くらい状態になった時 Trigger1 = Enemy(var(2)),NumTarget > 0 && fvar(24) ;相手が投げ判定を出した後にターゲットを確保した。 Trigger1 = Enemy(var(2)),MoveType = A ;相手攻撃動作中 Trigger1 = !Enemy(var(2)),IsHelper ;相手ヘルパーでない trigger1 = !fvar(17) ;直前がくらい状態でない。 ; && Root,Time = 1 ;Trigger1 = Enemy(var(2)),HitDefAttr = SCA, AT ; ;Trigger1 = Enemy(var(2)),MoveContact ;相手攻撃命中 ;記録可能数値かどうか Trigger1 = ( fvar(0) := fvar(24) ) = [0,4095] ;StateNo 12bit +temp1代入 Trigger1 = ( fvar(1) := fvar(10) ) = [1,63] ; 7bit +temp2代入 Trigger1 = ( fvar(2) := var(2) ) = [0,3] ; 2bit +temp2代入 ;代入 Trigger1 = 1 || Var( Floor(fvar(25)) ):= Floor(fvar(0)) + (Floor(fvar(1))*4096) + (Floor(fvar(2))*262144);代入 ignorehitpause = 1 ;停止無視 ; fvar(0~2) temp1~3 = 代入記述簡略化 [State 66000, RecAI-Check] Type = Null TriggerAll = var(3) != 0 Trigger1 = fvar(25) := var(3) ;記憶スロットを復元。 [State 66000, RecAI-Check Reset 2];リセット Type = Null Trigger1 = Fvar(26) != Enemy(var(2)),Anim || var(2) != fvar(27) ;ステート番号,enemy(x),差異認識 ;Trigger1 = Fvar(26) != Enemy(var(2)),StateNo || var(2) != fvar(27) ;ステート番号,enemy(x),差異認識 Trigger1 = (Fvar(26) := 0)&&(Fvar(27) := 0)&&(Fvar(28) := 0)&&(Fvar(29) := 0) ;■確認・他 [State 66000, start chnagestate] Type = ChangeState value = 66100 Trigger1 = 1 ;■■■■■■■■■■■ [Statedef 66100];■■■最終ステート Type = A ;最低限処理他 [State 66000, AssertSpecial] Type = AssertSpecial Trigger1 = 1 flag = Invisible ;インヴィシブル 見えなくする。 flag2 = Noshadow ;ノーシャドウ 影を表示しない。 ignorehitpause = 1 [State 66000, NotHitBy] Type = NotHitBy Value = SCA Trigger1 = 1 IgnoreHitPause = 1 [State 66000, var 5];記憶進展:相手攻撃でない Type = varset Trigger1 = PlayerIDExist(var(7)) = 0 Trigger2 = PlayerID(var(7)),Ctrl Trigger3 = PlayerID(var(7)),MoveType != A var(5) = 0 [State 66000, RecAI-recENStateNo] Type = Null TriggerAll = PlayerIDExist(var(7)) ;ID対象存在確認 Trigger1 = fvar(12) != PlayerID(var(7)),StateNo Trigger1 = 1 || fvar(13) := fvar(12) Trigger1 = 1 || fvar(14) := (Floor(fvar(14))%10)*10 + (PlayerID(var(7)),MoveType=A) Trigger1 = fvar(12) := PlayerID(var(7)),StateNo [State 66000, start chnagestate];読み込み開始ステートへ Type = ChangeState value = 66000 Trigger1 = Time ;最後に処理 [State 66000, var 5];直前のヒットを認識(連続ヒット制限用) Type = Null Trigger1 = var(5) != 0 Trigger1 = 1 || fvar(11) := PlayerID(var(7)),MoveContact Trigger2 = fvar(11) := 0 [State 66000, var 5];稼動可能Time(何F後に攻撃が発生するかの認識) Type = Null Trigger1 = var(5) != 0 Trigger1 = 1 || fvar(10) := fvar(10) + 1 Trigger2 = fvar(10) := 0 [State 66000, var 5];くらい状態の感知 Type = Null Trigger1 = Root,Movetype =H Trigger1 = 1 || fvar(17) := fvar(17) + 1 Trigger2 = Root,Ctrl Trigger2 = fvar(17) := 0 [State 66000, var 5];投げ動作の感知 Type = Null Trigger1 = fvar(24) := (Enemy(var(2)),HitDefAttr = SCA, AT) Trigger1 = fvar(24) := (Enemy(var(2)),Anim) ;Trigger1 = fvar(24) := (Enemy(var(2)),StateNo) [State 66000, var 5];デバッグ表示用 Type = Null TriggerAll = 10 Trigger1 =1|| fvar(1) := ( var(10)&4095 );StateNo代入 Trigger1 =1|| fvar(2) := ( (var(10)&786432)/262144 ) ;enemy,代入 Trigger1 =1|| fvar(3) := ( (var(10)&258048)/4096 ) ;Time代入 [State 66000, var 5];デバッグ表示用 Type = Null TriggerAll = 0 Trigger1 = 1 || Fvar(1) := var(2) ;temp(temp7)を代入 Trigger1 = 1 || Fvar(2) := ( var( 10 )& 16383) ;反応用StateNo Trigger1 = 1 || Fvar(3) := ( var( 10 )& 2080768) / 16384 ;反応用Time Trigger1 = 1 || Fvar(4) := ( var( 10 )& 2145386496) /2097152 ;反応用BodyDist X Trigger1 = 1 || Fvar(5) := ( var( 11 )& 127 ) ;反応用相手ID Trigger1 = 1 || Fvar(6) := ( var( 11 )& 12288 ) / 4096 ;反応用失敗回数/無敵技 Trigger1 = 1 || Fvar(7) := ( var( 11 )& 49152 ) /16384 ;反応用失敗回数/当て身投げ Trigger1 = 1 || Fvar(8) := ( var( 11 )& 1073676288 ) / 65536 ;反応用直前のステート番号 Trigger1 = 1 || Fvar(1) := ( var( 11 )&1073741824 ) /1073741824 ;反応用直前のステートが攻撃動作であったか [State -2, クリップボード] type = DisplayToClipboard trigger1 = 1 text = "AI-Helper1 %d ,%d ,%d ,%d ,%d \n" params = floor(fvar(29)),floor(fvar(28)),floor(fvar(10)),var(10),var(11) [State -2, デバッグ表示 レベル用] Type = AppendToClipboard;null;DisplayToClipBoard Trigger1 = 1 Text = "%d, %d, %d, %d, %d, \n" params = floor(fvar(1)),floor(fvar(2)),floor(fvar(3)),floor(var(4)),floor(fvar(25)) ;params = Floor(),0,0,0,0 ;params = floor(fvar(1)),floor(fvar(2)),floor(fvar(3)),floor(fvar(4)),floor(fvar(5)) ;Params = floor(fvar(6)),floor(fvar(7)),floor(fvar(8)),floor(var(10)),floor(var(11)) IgnoreHitPause = 1 ;■■■■■■■■■■■ ;■■■■■■■■■■■ [Statedef 66101];■■■ Type = A [State 66000, start chnagestate] Type = ChangeState value = 6600 Trigger1 = 1 ;■■■■■■■■■■■ ;記憶形式 ;Var(+1)1-14 =(&16383) =(16383) StateNo ;--bit-15-21 =(&2080768)/16384 = (127) Time ;--bit-22-31 =(&2145386496)/2097152= (1023) BodyDist X+512 ;,,,,,,,,,,,,,,,,,11111111111111 ;,,,,,,,,,,111111100000000000000 ;1111111111000000000000000000000 ;Var(+2)1- 7=(&127) =(127) 相手ID番号 ;--bit--8-12=(&3968)/128 =(31) 保留 ;--bit-13-14=(&12288)/4096 =(3) 失敗回数/無敵技 ;--bit-15-16=(&49152)/16384=(3) 失敗回数/当て身投げ ;--bit-17-30=(&1073676288)/65536 =(16383) 直前のステート番号 ;--bit-31 =(&1073741824)=(1) 直前のステートが攻撃動作であったか ; 1111111 ; 111110000000 ; 11000000000000 ; 1100000000000000 ; 111111111111110000000000000000 ;1000000000000000000000000000000 ;1111111111111110000000001111111 ;Var(xx)1-12 =(&4095) =(4095) Anim ;--bit-13-18 =(&258048)/4096 = (63) Time ;--bit-19-20 =(&786432)/262144 = (3) Enemy(x), ;,,,,,,,,,,,,,,,,,,,111111111111 ;,,,,,,,,,,,,,111111000000000000 ;,,,,,,,,,,,11000000000000000000 ;0000000000100000000000000000000保留 ;■■■■■■■■■■■ ;■スロット一覧,66000; ;Helper(66000),varスロット ;;Helper(66000),var(0) = PlayerID(var(0)),xxxx ;;Helper(66000),var(1) =temp1 ;;Helper(66000),var(2) =temp2 ;;Helper(66000),var(3) =temp3 ;;Helper(66000),var(4) =temp4 ;;Helper(66000),var(5) =記憶進展判断Var ;;Helper(66000),var(6) =StateNo ;;Helper(66000),var(7) =ID ;;Helper(66000),var(8) =記憶スロット記録 ;;Helper(66000),var(9) =距離数値 ※ここまで処理用 ;Helper(66000),var(10)〜 =ここから記憶用/対投げ技記憶 ;Helper(66000),var(19) = ;Helper(66000),var(20)〜 =ここから記憶用/当て身投げ用技記憶 ;Helper(66000),var(59) = ;Helper(66000),fvarスロット ;;Helper(66000),fvar(0) =temp1 ;;Helper(66000),fvar(1) =temp2 ;;Helper(66000),fvar(2) =temp3 ;;Helper(66000),fvar(3) =temp4 ;;Helper(66000),fvar(4) =temp5 ;;Helper(66000),fvar(5) =temp6 ;;Helper(66000),fvar(6) =temp7 ;;Helper(66000),fvar(7) =temp8 ;;Helper(66000),fvar(8) =temp9 ;;Helper(66000),fvar(9) =temp10 ;Helper(66000),fvar(10) =Prev,Time(稼動可能Time) ;Helper(66000),fvar(11) =Prev,MoveContact ;Helper(66000),fvar(12) =Prev,StateNo ;Helper(66000),fvar(13) =Prev,prevStateNo ;Helper(66000),fvar(14) =Prev,movetime ;Helper(66000),fvar(15) =重複制限用 ;Helper(66000),fvar(16) =重複制限用 ;Helper(66000),fvar(17) =重複制限用 ;Helper(66000),fvar(18) =記録位置 ;Helper(66000),fvar(19) =成否判定 ;Helper(66000),fvar(20) =記憶からの試行確認 ;Helper(66000),fvar(21) =反応用/記憶回数 ;Helper(66000),fvar(22) =当て身投げ不可フラグ ;Helper(66000),fvar(23) =無敵技不可フラグ ;Helper(66000),fvar(24) =投げ用/hitdefattr ;Helper(66000),fvar(25) =投げ用/スロット記憶 ;Helper(66000),fvar(26) =投げ反応/StateNo ;Helper(66000),fvar(27) =投げ反応/enemy ;Helper(66000),fvar(28) =投げ反応/Time ;Helper(66000),fvar(29) =投げ反応/フラグ ;Helper(66000),fvar(30) =反応用ID ;反応用データ読み込み ;Helper(66000),fvar(31) =反応用StateNo ;Helper(66000),fvar(32) =反応用Time ;Helper(66000),fvar(33) =反応用BodyDist X ;Helper(66000),fvar(34) =反応用相手ID ;Helper(66000),fvar(35) =反応用・保留 ;Helper(66000),fvar(36) =反応用失敗回数/無敵技 ;Helper(66000),fvar(37) =反応用失敗回数/当て身投げ ;Helper(66000),fvar(38) =反応用 ;Helper(66000),fvar(39) =当て身投げ可能フラグ