MUGENメモ ( フォント環境:MS ゴシック 標準 サイズ10 ) MUGENのAI記述 当身返しの為の擬似学習AIの案 byADI (※当身返しは、いわゆる「当身技」です。) (728)(735) 『学習型AIの真理は「限界への挑戦」であり、「娯楽」ではありません』 >学習装置を、書いてみたけども 記憶系統もあくまで反応手段、「条件式の一つ」のようなもの。 行動を考えないと条件式に意味は無いし、条件式が無いと行動に意味は無い。 分からない条件式を使うのは無理だし、それで思うように動かないとかは、ただの笑い話ですよね。 ※擬似学習によって補える、補う部分はフリー状態での防御くらい。 ※しかも、様々な場合を考慮して作らないと、情報として使い物にならないこともある。 3:18 2009/10/08 そういえば、向きが考慮外だったわ。 0:05 2009/09/30 追記 21:25 2009/09/20 まあ、ちょこちょこ。 9:34 2009/09/18 記述云々をすこし。 9:13 2009/09/18 ちょいちょい修正 8:40 2009/09/18 重複記憶に対する対応の記述を追加。Ver,0.9くらい? 3:11 2009/09/12 微修正 00:45 2009/09/12 とりあえずこれでいいや。 ..... 16:59 2009/09/07 19:57 2009/12/31メモ  これらで攻撃のタイミングを学習させておくことで、   反撃や回避を確実にするという使い方もある。  自分の最速攻撃よりも相手の攻撃が遅ければそれでつぶそうとしたりとか、  (※無敵がある場合、それを学習させる必要有り。)   無敵のある技の無敵を相手の攻撃に合わせて出すなど。 ※ 一応、注意書き ※  ここにある記述は、私が想像から作成したものです。  これらを使用、流用などを行う場合、私の名前を表記してくださるとありがたいです。  ただし不具合や誤作動など、私の想像に無い動作を行う可能性もありえますが、   そうした事によって損害・トラブルがあったとしても、私は一切の責任を負いません。  お約束ごとですが、自己責任でご利用ください。 改造云々も自己責任で、ご自由に。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■■■記述例メモ ■仮■ ;色々補足した記述。 ; 9:31 2009/09/18 Ver,0.900くらい? ; 複数の記憶から参照するようにする記述に。若干不安定になるかも。 ;■使用の前提条件 ; 発生Fが早めの当身技を有している(持続Fは問わない)。 ; 多少なら相手の攻撃を受けても大丈夫な耐久力。 ;■動作概要 「ヘルパーによって計算した距離と敵の時間を記録。 ; それを用いて本体は特定のタイミングで動作を行わせるもの。」 ;■反応精度:同じ状態からであれば持続1Fの当身をも可能。 ;     :ただし、戦闘中全く同じ状態という事は少ないが、 ;     : 持続が長く移動する攻撃などでないのなら、ほぼ確実、かと。 ;■対人(Anti-Player)と、娯楽を考えたら ; 記憶にRandomの制御を加えてやる方がいいかも。 ; 対人としては、騙されかねない為の簡易対策。 ; 娯楽としては、精度を下げての弱体化。 ;本体-3 ;ID記録 ;▲ [State -3] Type = Varset var(**) = EnemyNear,ID Trigger1 = 1 ;▲反応 ;Trigger1 = Helper(***),Var(59)-EnemyNear,Time = [(受付開始Time),(受付終了Time)] ;メモ:Timeを上げると反応が早くなる。・Timeを下げるとギリギリの反応を行う。 ;4:24 2009/09/20記述修正:F→Time。換算の仕方を間違えてた。 ;▲ ;ヘルパー射出 [State -3, Record-Helper01];記録ヘルパー01 Type = Helper Trigger1 = !IsHelper Trigger1 = !NumHelper(***ヘルパーID***) Trigger1 = alive Trigger1 = RoundState = 2 HelperType = Normal Name = "Recording-AI";記録するAI ID = ***ヘルパーID*** StateNo = ***ヘルパー用ステート番号*** Pos = 0, 1000 PosType = p1 KeyCtrl = 0 Facing = 1 SuperMoveTime = 9999999999 PaiseMoveTime = 9999999999 IgnoreHitPause = 1 ;●ヘルパー(稼動式) ;●●● [StateDef ***ヘルパー用ステート番号***];基本設定 Type = A Ctrl = 0 Anim = ***適当なアニメ***;0でもいいが、できれば当たり判定のないもの SprPriority = -3 [State a, RecAI-NotHitBy];攻撃に当たらない一応 Type = NotHitBy Trigger1 = 1 value = SCA Time = 1 ignorehitpause=1 [State a, RecAI-StateTypeSet];ステートタイプ一応 Type = StateTypeSet Trigger1 = 1 MoveType = I; Physics = N ignorehitpause=1 [State a, RecAI-AssertSpecial];見えないように Type = AssertSpecial Trigger1 = 1 flag = Invisible flag1 = Noshadow ignorehitpause=1 ;0:56 2009/09/10から追記 ;0を数値管理Var ;1~40辺りを記憶Var ;41以降を数値処理Var ;47 しらふステートチェック ;48 チェックスロット記憶2 ;49 チェックスロット記憶 ;50 スロットチェックの処理 ;51 P2BD X+z+Y ;52 P2BD Y ;53 スロットチェック用 and 反応用X and 記録用X+Y ;54 スロットチェック用 and 反応用Y and 計算用Y ; ;55 対象ID ;56 記録チェック用Var ;57 更新チェック用Var ;58 当身返しチェック ;◆本体へ◆59 反応の有無andTime算出 ;●空きVar ;Var 41~46 ;Fvar 全て ;>距離はP2~~なので、リダイレクトを使える。 ;>ヘルパーから呼び出すことが可能なので、ヘルパー管理に。 ;● [State a, RecAI-enID];対象ID取得 Type = Varset var(55) = Parent,Var(**); Trigger1 = 1 ;●●●●● 記録確認棟 ●●●●● [State a, RecAI-Check];チェック Type = Varadd var(0) = 0 TriggerAll = Var(55)!=0;ID取得不備の為の対処 TriggerAll = 1 || Var(56) := 999999999;リセット Trigger1 = Var(2) = Var(55);ID確認 Trigger1 = Floor(Var(1)/100) = PlayerID(Var(55)),StateNo Trigger1 = 1 || Var(56) := 0 Trigger2 = Var(6) = Var(55);ID確認 Trigger2 = Floor(Var(5)/100) = PlayerID(Var(55)),StateNo Trigger2 = 1 || Var(56) := 4 Trigger3 = Var(10) = Var(55);ID確認 Trigger3 = Floor(Var(9)/100) = PlayerID(Var(55)),StateNo Trigger3 = 1 || Var(56) := 8 Trigger4 = Var(14) = Var(55);ID確認 Trigger4 = Floor(Var(13)/100) = PlayerID(Var(55)),StateNo Trigger4 = 1 || Var(56) := 12 Trigger5 = Var(18) = Var(55);ID確認 Trigger5 = Floor(Var(17)/100) = PlayerID(Var(55)),StateNo Trigger5 = 1 || Var(56) := 16 Trigger6 = Var(22) = Var(55);ID確認 Trigger6 = Floor(Var(21)/100) = PlayerID(Var(55)),StateNo Trigger6 = 1 || Var(56) := 20 Trigger7 = Var(26) = Var(55);ID確認 Trigger7 = Floor(Var(25)/100) = PlayerID(Var(55)),StateNo Trigger7 = 1 || Var(56) := 24 Trigger8 = Var(30) = Var(55);ID確認 Trigger8 = Floor(Var(29)/100) = PlayerID(Var(55)),StateNo Trigger8 = 1 || Var(56) := 28 Trigger9 = Var(34) = Var(55);ID確認 Trigger9 = Floor(Var(33)/100) = PlayerID(Var(55)),StateNo Trigger9 = 1 || Var(56) := 32 Trigger10 = Var(38) = Var(55);ID確認 Trigger10 = Floor(Var(37)/100) = PlayerID(Var(55)),StateNo Trigger10 = 1 || Var(56) := 36 ;リセット Trigger11 = 1 || Var(56) := 999999999;リセット ;リセット数値で重複記憶に制限をかけず、 ; あえて重複記憶に制限をかけず、記憶を塗り替えさせる。 ;( 正確さの確認が取れない為、更新によって安定させる狙い。 ) [State a, RecAI-Check 2];重複・2個目チェック Type=Null TriggerAll = Var(55)!=0;ID取得不備の為の対処 TriggerAll = Var(56)!= 999999999;リセットでない Trigger1 = Var(56) != [0,99]; Trigger1 = 0;0が2つ目になることはないし、処理が面倒。 Trigger2 = Var(56) < 4 && Var(6) = Var(55);ID確認 Trigger2 = Floor(Var(5)/100) = PlayerID(Var(55)),StateNo Trigger2 = 1 || Var(56) := 400+Var(56) Trigger3 = Var(56) < 8 && Var(10) = Var(55);ID確認 Trigger3 = Floor(Var(9)/100) = PlayerID(Var(55)),StateNo Trigger3 = 1 || Var(56) := 800+Var(56) Trigger4 = Var(56) < 12 && Var(14) = Var(55);ID確認 Trigger4 = Floor(Var(13)/100) = PlayerID(Var(55)),StateNo Trigger4 = 1 || Var(56) := 1200+Var(56) Trigger5 = Var(56) < 16 && Var(18) = Var(55);ID確認 Trigger5 = Floor(Var(17)/100) = PlayerID(Var(55)),StateNo Trigger5 = 1 || Var(56) := 1600+Var(56) Trigger6 = Var(56) < 20 && Var(22) = Var(55);ID確認 Trigger6 = Floor(Var(21)/100) = PlayerID(Var(55)),StateNo Trigger6 = 1 || Var(56) := 2000+Var(56) Trigger7 = Var(56) < 24 && Var(26) = Var(55);ID確認 Trigger7 = Floor(Var(25)/100) = PlayerID(Var(55)),StateNo Trigger7 = 1 || Var(56) := 2400+Var(56) Trigger8 = Var(56) < 28 && Var(30) = Var(55);ID確認 Trigger8 = Floor(Var(29)/100) = PlayerID(Var(55)),StateNo Trigger8 = 1 || Var(56) := 2800+Var(56) Trigger9 = Var(56) < 32 && Var(34) = Var(55);ID確認 Trigger9 = Floor(Var(33)/100) = PlayerID(Var(55)),StateNo Trigger9 = 1 || Var(56) := 3200+Var(56) Trigger10 = Var(56) < 36 && Var(38) = Var(55);ID確認 Trigger10 = Floor(Var(37)/100) = PlayerID(Var(55)),StateNo Trigger10 = 1 || Var(56) := 3600+Var(56) [State a, RecAI-Check 3];重複・3個目チェック Type=Null TriggerAll = Var(55)!=0;ID取得不備の為の対処 TriggerAll = Var(56)!= 999999999;リセットでない Trigger1 = Var(56) != [100,9900]; Trigger2 = 0;最低でも0と4は重複する。 Trigger3 = Var(56) < 800 && Var(10) = Var(55);ID確認 Trigger3 = Floor(Var(9)/100) = PlayerID(Var(55)),StateNo Trigger3 = 1 || Var(56) := 80000+Var(56) Trigger4 = Var(56) < 1200 && Var(14) = Var(55);ID確認 Trigger4 = Floor(Var(13)/100) = PlayerID(Var(55)),StateNo Trigger4 = 1 || Var(56) := 120000+Var(56) Trigger5 = Var(56) < 1600 && Var(18) = Var(55);ID確認 Trigger5 = Floor(Var(17)/100) = PlayerID(Var(55)),StateNo Trigger5 = 1 || Var(56) := 160000+Var(56) Trigger6 = Var(56) < 2000 && Var(22) = Var(55);ID確認 Trigger6 = Floor(Var(21)/100) = PlayerID(Var(55)),StateNo Trigger6 = 1 || Var(56) := 200000+Var(56) Trigger7 = Var(56) < 2400 && Var(26) = Var(55);ID確認 Trigger7 = Floor(Var(25)/100) = PlayerID(Var(55)),StateNo Trigger7 = 1 || Var(56) := 240000+Var(56) Trigger8 = Var(56) < 2800 && Var(30) = Var(55);ID確認 Trigger8 = Floor(Var(29)/100) = PlayerID(Var(55)),StateNo Trigger8 = 1 || Var(56) := 280000+Var(56) Trigger9 = Var(56) < 3200 && Var(34) = Var(55);ID確認 Trigger9 = Floor(Var(33)/100) = PlayerID(Var(55)),StateNo Trigger9 = 1 || Var(56) := 320000+Var(56) Trigger10 = Var(56) < 3600 && Var(38) = Var(55);ID確認 Trigger10 = Floor(Var(37)/100) = PlayerID(Var(55)),StateNo Trigger10 = 1 || Var(56) := 360000+Var(56) [State a, RecAI-Check 4];重複・4個目チェック Type=Null TriggerAll = Var(55)!=0;ID取得不備の為の対処 TriggerAll = Var(56)!= 999999999;リセットでない Trigger1 = Var(56) != [10000,990000]; Trigger2 = 0;4 Trigger3 = 0;8 Trigger4 = Var(56) < 120000 && Var(14) = Var(55);ID確認 Trigger4 = Floor(Var(13)/100) = PlayerID(Var(55)),StateNo Trigger4 = 1 || Var(56) := 12000000+Var(56) Trigger5 = Var(56) < 160000 && Var(18) = Var(55);ID確認 Trigger5 = Floor(Var(17)/100) = PlayerID(Var(55)),StateNo Trigger5 = 1 || Var(56) := 16000000+Var(56) Trigger6 = Var(56) < 200000 && Var(22) = Var(55);ID確認 Trigger6 = Floor(Var(21)/100) = PlayerID(Var(55)),StateNo Trigger6 = 1 || Var(56) := 20000000+Var(56) Trigger7 = Var(56) < 240000 && Var(26) = Var(55);ID確認 Trigger7 = Floor(Var(25)/100) = PlayerID(Var(55)),StateNo Trigger7 = 1 || Var(56) := 24000000+Var(56) Trigger8 = Var(56) < 280000 && Var(30) = Var(55);ID確認 Trigger8 = Floor(Var(29)/100) = PlayerID(Var(55)),StateNo Trigger8 = 1 || Var(56) := 28000000+Var(56) Trigger9 = Var(56) < 320000 && Var(34) = Var(55);ID確認 Trigger9 = Floor(Var(33)/100) = PlayerID(Var(55)),StateNo Trigger9 = 1 || Var(56) := 32000000+Var(56) Trigger10 = Var(56) < 360000 && Var(38) = Var(55);ID確認 Trigger10 = Floor(Var(37)/100) = PlayerID(Var(55)),StateNo Trigger10 = 1 || Var(56) := 36000000+Var(56) ;1つ目はFloor(Var(56)%100) ;2つ目はFloor(Var(56)/100)%100 ;3つ目はFloor(Var(56)/10000)%100 ;4つ目はFloor(Var(56)/1000000)%100 ;5つ目以降の重複は考慮外。(5つ目まではシステム上ありうる。) ;● [State a, RecAI-RepeatCheck1-1];重複確認・最も大きい距離 Type=Null TriggerAll = Var(56)!=999999999; Trigger1 = 0 && Var(53) := Var(56)%100 Trigger2 = 1&&( Var(50) := Floor(Var(56)/100)%100 ) Trigger2 = Floor(Var(3+(Var(53)%100))/100000) < Floor(Var(3+(Var(50)%100))/100000);距離 Trigger2 = 0 && Var(53):=Var(50) Trigger3 = 1&&( Var(50) := Floor(Var(56)/10000)%100 ) Trigger3 = Floor(Var(3+(Var(53)%100))/100000) < Floor(Var(3+(Var(50)%100))/100000);距離 Trigger3 = 0 && Var(53):=Var(50) Trigger4 = 1&&( Var(50) := Floor(Var(56)/1000000)%100 ) Trigger4 = Floor(Var(3+(Var(53)%100))/100000) < Floor(Var(3+(Var(50)%100))/100000);距離 Trigger4 = 0 && Var(53):=Var(50) [State a, RecAI-RepeatCheck1-2];重複確認・最も短い時間 Type=Null TriggerAll = Var(56)!=999999999; Trigger1 = 0 && Var(54) := Var(56)%100 Trigger2 = 1&&( Var(50) := Floor(Var(56)/100)%100 ) Trigger2 = Floor(Var(1+(Var(54)%100))%100) > Floor(Var(1+(Var(50)%100))%100);時間 Trigger2 = 0 && Var(54):=Var(50) Trigger3 = 1&&( Var(50) := Floor(Var(56)/10000)%100 ) Trigger3 = Floor(Var(1+(Var(54)%100))%100) > Floor(Var(1+(Var(50)%100))%100);時間 Trigger3 = 0 && Var(54):=Var(50) Trigger4 = 1&&( Var(50) := Floor(Var(56)/1000000)%100 ) Trigger4 = Floor(Var(1+(Var(54)%100))%100) > Floor(Var(1+(Var(50)%100))%100);時間 Trigger4 = 0 && Var(54):=Var(50) [State a, RecAI-RepeatCheck2];重複確認・記憶距離の近似による判定 Type=Null TriggerAll = Var(56)!=999999999; TriggerAll = 1 || Var(49):=Var(51)-Floor(ParentDist X);位置計算 Trigger1 = 1&&( Var(50) := Floor(Var(56)%100) ) Trigger1 = Floor( Var(3+(Var(50)%100)) /100000)-10 =[Var(49)-15,Var(49)+15];距離 Trigger1 = 1 || Var(53):=Var(50) && Var(54):=Var(50) Trigger2 = 1&&( Var(50) := Floor(Var(56)/100)%100 ) Trigger2 = Floor( Var(3+(Var(50)%100)) /100000)-10 =[Var(49)-15,Var(49)+15];距離 Trigger2 = 1 || Var(53):=Var(50) && Var(54):=Var(50) Trigger3 = 1&&( Var(50) := Floor(Var(56)/10000)%100 ) Trigger3 = Floor( Var(3+(Var(50)%100)) /100000)-10 =[Var(49)-15,Var(49)+15];距離 Trigger3 = 1 || Var(53):=Var(50) && Var(54):=Var(50) Trigger4 = 1&&( Var(50) := Floor(Var(56)/1000000)%100 ) Trigger4 = Floor( Var(3+(Var(50)%100)) /100000)-10 =[Var(49)-15,Var(49)+15];距離 Trigger4 = 1 || Var(53):=Var(50) && Var(54):=Var(50) ;● [State a, RecAI-CheckSet] Type=Varset var(49) = Var(53)%100 Trigger1 = Var(56)!=999999999; Trigger1 = 1||Var(48) := Var(54)%100;Time側 ;Var(56) = s4s3s2s1 ;Var(49) = XX(Var 53 ;Var(48) = Time(Var 54 ;Yは(Var(56)%100) ;始めのスロット ;Xは(Var(49)) ;距離数値が最も大きいスロット ;Tは(Var(48));最も短いTimeのスロット ;● [State a, RecAI-Dist];距離計算 Type= Varset var(53) = Floor(Var(3+Var(49)%100)/100000)-10 Trigger1 = Var(56) != 999999999;リセットでない。 Trigger1 = 1|| var(54):=(Var(3+Var(56)%100)%100000)-10000 ;Var(53) xxxx ;Var(54) yyyy ;yyyy=Y ;xxxx=X ;● [State a, RecAI-DistAndTime];反応の有無とTimeの算出 Type = Varset var(59) = (Var(1+Var(48)%100)%100);Timeを記録。 TriggerAll = var(59):=999999999;リセット TriggerAll = Var(56)!=999999999;リセットされていない。 Trigger1 = Var(51)-Floor(ParentDist X) =[-20,(Var(53))+20];+は範囲調整 Trigger1 = Var(52)-Floor(ParentDist Y+500) =[(Var(54))-20,(Var(54))+20];+-は範囲調整 ;調整範囲は各自適当な目安をもって行う。 ;補整が小さい場合、根元で受け→先の方に当たるという事が起きうる。 ;先の方で受けた場合は、補整によって根元まで判定を広げているので、判定発生のタイミング次第。 ;●●●●● 測定記憶棟 ●●●●● [State a, RecAI-Turn];振り向き Type = turn Trigger1 = Facing != Parent,Facing Trigger1 = PlayerID(var(55)),Time=1 ;相手の後ろに回ってから振り向き、そこで攻撃に当たると、 ; 長距離レンジ攻撃だと勘違いする為、座標あわせと同時に行わせる。 ;● [State a, RecAI-Posset];!TimeでPosを本体にあわせる。 Type = Posadd X = Floor(ParentDist X) Y = Floor(ParentDist Y) Trigger1 = PlayerID(var(55)),Time=1 ;0だと反応できない。 ;● [State a, RecAI-Posadd];Pos Yに+a。 Type = Posadd Y = 500 Trigger1 = Floor(ParentDist Y) = 0 ;位置を敵の動作開始時にX=0 Y=+500の場所に定め、Yは計算時に利用。 ;そして、命中した時の位置との差異を、相手の攻撃距離に加える。 ;> -Floor(ParentDist X)と-Floor(ParentDist Y+500)。 ;起点より前(+)の場合、その分距離から減算(−)し、短いことを把握する。 ;起点より後(−)の場合、その分を距離に加算(+)し、長いことを把握する。 ;● [State a, RecAI-P2BD];距離用Varセット Type = Varadd var(0) = 0 Trigger1 = PlayerID(var(55)),Time=1 ;0だと反応できない。 Trigger1 = 1 || Var(51):=Floor(Parent,P2BodyDist X) Trigger1 = 1 || Var(52):=Floor(Parent,P2BodyDist Y) ignorehitpause = 1 ;停止無視 ;開始距離を把握することで、「その技自体のリーチ」の算出できるようにする。 ;● [State a, RecAI-recDist];記憶用距離記録 Type = Varset var(53) = (var(51)-Floor(ParentDist X)+10)*100000+Var(54);距離 Trigger1 = 1||var(54) :=(Var(52)-Floor(ParentDist Y+500))+10000 ignorehitpause = 1 ;停止無視 ;● [State a, RecAI-recDist-Reset];記憶用距離・範囲外の場合リセット Type = Varset var(53) = 999999999 Trigger1 = Var(51)-Floor(ParentDist X)+10 !=[0,9999];記憶制限 Trigger2 = Var(52)-Floor(ParentDist Y+500)!=[-9999,9999];記憶制限 ignorehitpause = 1 ;停止無視 ;Var(53) xxxxzyyyy z=Yの-フラグ ;yyyy=Y+10000(マイナス猶予) ;xxxx=X+10(マイナス猶予) ;●未使用 [State a, RecAI-EnMoveReversed] Type = Null;Varset var(58) = (PlayerID(var(55)),MoveReversed) Trigger1 = 0 ;Trigger1 = 当身を成功させた直後の状態 ;統一した処理ができない為、保留。 ;● [State a, RecAI-reset];記憶Varリセット Type = Varset var(0) = 0;管理Varリセット(古い方から上書き) Trigger1 = Var(0) >= 40 ;記録限界 Trigger2 = Var(0)%4 != 0 ;Var数値不具合対策。 ;● [State a, RecAI-rec];記憶 Type = Varadd var(0) = 4;管理Var(使用するVarの分増やす) TriggerAll = Var(0) < 40 ;記録限界。 ;封印;TriggerAll = Var(56)=999999999;リセット確認・初期封印 ;自分と相手の状態情報 Trigger1 = Parent,MoveType=H && Parent,Time=1 ;本体がくらい状態になった時。 Trigger1 = PlayerID(var(55)),MoveContact ;相手が攻撃を当てた。 Trigger1 = PlayerID(var(55)),MoveType=A ;相手が攻撃動作中。 ;記憶制限 Trigger1 = var(53)!=999999999;記憶範囲内。 Trigger1 = Var(57)!=(PlayerID(var(55)),StateNo);連続記憶制限・チェック Trigger1 = Var(57):=(PlayerID(var(55)),StateNo);連続記憶制限・記憶 ;相手情報による記憶制限 Trigger1 = PlayerID(var(55)),HitDefAttr=(***当身可能な対象***);当身可能かどうか Trigger1 = PlayerID(var(55)),Time > (***最短F***) ;当身可能な技であるか。 Trigger1 = PlayerID(var(55)),Time < 100 ;相手のTimeが記録すべき長さか。 Trigger1 = PlayerID(var(55)),StateNo < 10000000 ;相手のStetaNo数値が記録可能な長さか。 Trigger1 = Var(47) = 2 ;始動タイプの技である。 ;封印;Trigger1 = PlayerID(var(55)),PrevStateNo=[0,119];始動タイプの技であるか。 ;記憶処理 Trigger1 = 1 || Var(1+Var(0)):=(PlayerID(var(55)),StateNo*100)+(PlayerID(var(55)),Time);記憶 Trigger1 = 1 || Var(2+Var(0)):=Var(55);記憶ID Trigger1 = 1 || Var(3+Var(0)):=Var(53);距離記憶 Trigger1 = 1 || Var(4+Var(0)):=1+(PlayerID(var(55)),StateType=C)+(PlayerID(var(55)),StateType=A)*2;相手の状態 ignorehitpause = 1 ;停止無視 ;Var内容 ;Var(1+Var(0)) = xxxxxxyyy ;xxxxxx = (Floor(Var(*)/100)) = 命中StateNo(StateNo,10000000以上は記憶不可) ;yyy = (Var(*)%100) = 命中Time(Time,100以上(およそ1.6667秒)は記録せず) ;Var(2+Var(0)) ;対象となるID ;Var(3+Var(0)) ;距離。xxxxyyyyy ;Var(4+Var(0)) ;1+(PlayerID(var(55)),StateType=C)+(PlayerID(var(55)),StateType=A)*2;※使用せず※ ;● [State a, RecAI-enState];敵ステートの移り変わりを監視 Type = Varadd var(47) = 0 TriggerAll = PlayerID(var(55)),Time = 1 Trigger1 = PlayerID(var(55)),StateNo = [0,139];しらふ〜ガード待機。 Trigger1 =1||Var(47):= 1 ; Trigger2 = PlayerID(var(55)),StateNo != [0,139];その他。 Trigger2 = Parent,GetHitVar(HitCount) > 3 ; Trigger2 = Parent,MoveType=H && Parent,StateType=A ;敵エアリアル中 Trigger2 =1||Var(47):= 3 ; Trigger3 = Var(47) = 2 && PlayerID(var(55)),StateNo != [0,139];その他→その他。 Trigger3 =1||Var(47):= 3 ; Trigger4 = Var(47) = 1 && PlayerID(var(55)),StateNo != [0,139];しらふ→その他。 Trigger4 =1||Var(47):= 2 ; ignorehitpause = 1 ;停止無視 ;2:しらふ状態→攻撃状態の場合を始動技と考慮する。 ;1と3は基本的に使わない。 ;ここまで ;●●● ;■欠点まとめ ;.一度攻撃を受ける必要がある。(当身ではそれに応じた記述を必要とする。初期不可。) ;.Pauseなどを考慮していない。 ;.上下段云々の判別ができない。 ;.飛び道具に対する当身に用いることはできない。 ;.ヘルパーなので、記憶は1ラウンドごとにリセット ;.反応処理がヘルパー管理の為、[1F]反応が遅れる。 ; (HelperのVarを本体で処理し、1P側であれば0F反応が可能。) ;.衝突により位置の補整が無い為、距離の記憶が曖昧。 ;.距離やタイミングを複数の記憶から考慮するが、確実ではない。 ;( ほぼ「反応しない」だけであり、無闇な反応は少ない。(一応ある。) ) ;.例えば、同一ステートで攻撃のタイミング ; もしくは移動距離などの調整が可能な攻撃に対して、引っかかる可能性有り。 ; 空中からの飛び込み技などの速度も考慮しない。 ;.同様に、同一ステートで攻撃の種類が違う場合にも対応ができない。 ;初期設定での欠点 ;.始動技からしか記憶しない為、 ; 途中でStateの変わる攻撃などには対応しない。 ;.現在の距離考慮値の設定上、本体と当たり判定との間に隙間のある攻撃にも ; 反応をしてしまう。 ;.向きが考慮外。 ;記述改造案 ; [重複記憶無し]の状態にすれば、 ;  柔軟性はなくなるも記述を削減することができる。 ; また重複記憶無しであれば、記憶の数の削減にもなり、 ;  コンボ以外のStateの変わる攻撃に対応させられる、かも。 ; 始動技制限を、 ;Trigger1 = Parent,GetHitVar(HitCount) < 3 ; ; こうした記述にすることで、多少の変化に対応できる。 ; ただし、そうした場合、途中でステートを変える事の出来る技に対応できない。 ;( ステートを変えなくても攻撃、変えた場合タイミングをずらしての攻撃、というフェイント系の技。 ) ■メモ2 意味が無い。 (前文削除) 加えてXとYの数値4桁を度外視し、IDが2桁以内であれば「 xxxzyyyID 」と9桁に入りきる。 これならメモの記述例なら使うVarが半分で済む。その分記述は膨れ上がるけど。 >って言うかそれは+10000で記録し、-10000してやる方がわかりやすい。 >99999999+100010000+zと計算してやれば、-9999,9999+-9999,9999まで可能だと思った。 ;プレイヤー達のIDは、HelperMaxの数から始まる。 ;その為、4~59の間に収まる「はず」だが、「もしも」の場合を考えて使用しない。 Int式は2000000000も可能みたいなので、1000010000+zxxxxzyyyyみたいな管理で可能だわさ。 ■メモ3 [0,119]からの攻撃の距離やTimeを計り、 どの程度のリーチがあり、どの程度の速度なのかを知ることは一応できる。 例えば、相手の最速攻撃が自分の最速攻撃より早い場合に近接を避けたり、 同程度であっても、相手のリーチの方がはるかに長い場合は堅実にガードするなど。 と言っても、あくまで大体、参考にする程度だが。 ■メモ4  HitDefAttr=*** 当身可能なものが複数種類ある場合は、まあお察しの通りVar管理。 ただしその場合は、(HitDefAttr=***)*1+(HitDefAttr=***)*10などで、一括管理。 一応、1,2,4であれば1桁で3種類のONOFFが可能で、 また[全て]や[不可]の判断として8,9も使えば、1桁で5パターンの判断ができる。  StateType=*** その他Attr以外の条件がある場合も同様。 改良例では1+(StateType=C)+(StateType=A)*2を入れているが使ってはいない。 ■メモ5 [State -3, ChangeStateTest];学習装置のチェック Type = ChangeState Value = 120;ガードステート Trigger1 = RoundState = 2 && Ctrl Trigger1 = Helper(******),Var(59)-EnemyNear,Time = 1 で動作チェックをしてみた。 結果:いくつか問題点が見つかり、それを改善。    また、一度受けた攻撃へガードを行うことを確認した。 [State 29990, nothitby];一応のっとひっとばい Type = NotHitBy Trigger1 = Helper(999999),Var(59)-EnemyNear,Time = 0 value = SCA Time = 10 タイミングは0が確実で1は安定しなかった。(よくわからない。) 浮き彫りになった問題点は、  持続性の高い攻撃に対して異なるタイミングで受けても、適応されるのは若いVar側の情報のみ。   距離に関しても同様。  また距離の方は補整で調整は可能だが、   現在の設定では根元で当たった場合、遠い側の距離を考慮してくれない。 以上の問題点から、距離やタイミングの更新の機能を考慮すべきであると結論付ける。  勿論、記憶に適応しない場合には、通常と同様のAIを動作させる為、   無防備になるというわけではないが、何らかの対処を要する。 独り言>想像記述だったけど、実際動いたのにはビックリ。    >細かいミスはあったものの、重大なミスは無く、修正も楽だった。    >というか、こういう大量の情報を一括して処理する場合の:=の便利さが凄い。 ■メモ6 1:27 2009/09/12  Var(4+var(0))が空いているので、そこに重複記憶用処理を加えるか。  999999999でない場合は、重複していない、という事。  何かしらの番号である場合はVar(x+var(56))で1つだけなら確認が可能。  Varはまだいくつも残っているので、困難なことじゃないと思うけど、   眠い。 □メモ7 2009/09/18  重複確認をつけてみよう、と書いて見たはいいものの不具合。うーん、眠い。 [State -2,テスト用];補整無し発生7f-12f 補整有り4f-5f Type = ChangeState value = 1000000 Trigger1 = Ctrl &&0; Trigger1 = Helper(999999),Var(59)-EnemyNear,Time = [4,5]  適当な技をつくって試してみた所、「不可」ではないと分かる。  ただし、「可」とも言いがたい。 ■メモ7 2009/09/18  記述ミスを修正した結果、発生4F 持続2Fの当身技の成功を確認。  発生4F持続1Fでも、成功させることが可能。  実質CPUにしか扱えない当身技の使用も可能になる、という話。 10:05 2009/09/18 独り言>作ってて、なんか重複を調べる方法が「泥臭い」と思った。   ■追記 2009/09/30  ヘルパー管理なのは、「自身の移動距離の計算」だけでなく「タイミング」にもある。  例えば-3ステートなどは、自分の処理中にしか行われない(はずの)為、プレイヤーの位置で反応タイミングがずれてしまう。  だが「それらよりも遅い」ヘルパーでタイミングを統一していれば、少なくとも本体での攻撃はそれで反応が可能である。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ■■■ ■「簡易当身警戒」記述例 ;概要:一度食らったことのある当身技を確認する。主に様子見を行う。 ;記述例の使用Var ;本体 ;Var(27) = EnemyNear(Var(54)),ID ;Var(54) = !(EnemyNear,Alive||NumEnemy=1)みたいなの。 ;学習用ヘルパー ;Var(41) = 記録引継ぎ用敵StateNo ;Var(42) = 記憶1つ目 ;Var(43) = 記憶2つ目 ;Var(44) = 記憶3つ目 ;Var(45) = 記憶4つ目 ; 仕組み ;Var(41)には相手のStateNoをセットする。 ;[本体が当身技を受けていない状態]の時、Var(41)へセット・リセットを行う。 ;セットは[本体が攻撃動作中]に行い、それ以外ではリセット(0)する。 ; ;[当身を受けた状態]へなったと同時に、Var(41)の記憶処理を行う。 ; 記憶処理は ;Var(42)で[Var(42)が空]→記憶 ;Var(43)で[Var(43)が空][Var(42)で記憶していて、記憶しているStateNoでない。]→記憶 ;Var(44) [Var(44)が空][Var(42),Var(43)があり、記憶しているStateNoでない。]→記憶 ;Var(45) [Var(45)が空][Var(42),Var(43),Var(44)があり、記憶しているStateNoでない。]→記憶 ;という状態。多用な当身を持つ相手が少ない為、4つまで。 ; ; 反応処理は、単純にこんなもん。 ;TriggerAll = NumHelper(29000);ヘルパー確認 ;TriggerAll = EnemyNear(var(54)),StateNo!=0 ;Trigger1 = Helper(29000),Var(42) = EnemyNear(var(54)),StateNo ;Trigger2 = Helper(29000),Var(43) = EnemyNear(var(54)),StateNo ;Trigger3 = Helper(29000),Var(44) = EnemyNear(var(54)),StateNo ;Trigger4 = Helper(29000),Var(45) = EnemyNear(var(54)),StateNo ; 欠点 ;.一度でも当身されないと覚えない。 ;.反応できるのは当身動作中に対してのみ。 ;.中段・下段どの当身であるかを判断できない。 ;.対飛び道具当身には反応できない。 ;.0F攻撃は対応できない。 ;.MoveReversedに当身技でないものが引っかかった場合、まずい。 ;■学習ヘルパー用記述 ;簡易・学習AI 当身警戒 4つまで記憶 [State 29990];相手の技を確認 Type = Varset var(41) = PlayerID(root,var(27)),StateNo trigger1 = !Root,MoveReversed && Root,MoveType = A [State 29990];相手の技をリセット Type = Varset var(41) = 0 trigger1 = !Root,MoveReversed && Root,MoveType != A [State 29990];当身である→記憶 Type = Varset var(42) = var(41) TriggerAll = !Var(42) trigger1 = Root,MoveReversed ignorehitpause = 1 [State 29990];当身である→1つ記憶している+記憶しているものと異なる→記憶 Type = Varset var(43) = var(41) TriggerAll = Var(42) && !var(43) Trigger1 = var(42)!=var(41) trigger1 = Root,MoveReversed ignorehitpause = 1 [State 29990];当身である→2つ記憶している+記憶しているものと異なる→記憶 Type = Varset var(44) = var(41) TriggerAll = Var(42) && var(43) && !var(44) Trigger1 = var(42)!=var(41) && var(43)!=var(41) trigger1 = Root,MoveReversed ignorehitpause = 1 [State 29990];当身である→3つ記憶している+記憶しているものと異なる→記憶 Type = Varset var(45) = var(41) TriggerAll = Var(42) && var(43) && var(44) && !var(45) Trigger1 = var(42)!=var(41) && var(43)!=var(41) && var(44)!=var(41) trigger1 = Root,MoveReversed ignorehitpause = 1 ;■本体記述 Var(31)で攻撃を行わない。 [State -3, 待ち];反応記述 type = Varset var(31) = 5; TriggerAll = NumHelper(29000);ヘルパー確認 TriggerAll = EnemyNear(var(54)),StateNo!=0 Trigger1 = Helper(29000),Var(42) = EnemyNear(var(54)),StateNo Trigger2 = Helper(29000),Var(43) = EnemyNear(var(54)),StateNo Trigger3 = Helper(29000),Var(44) = EnemyNear(var(54)),StateNo Trigger4 = Helper(29000),Var(45) = EnemyNear(var(54)),StateNo ▼簡略化記述メモ。 ;圧縮記述。使用Var数+1。 ;Var(41)をIfElse(Root,MoveType=A, 敵のStateNo, 0)のように。 ;Var(42)~(45)の記憶を:=を使って統一 ;Var(40)で、反応用ヘルパー記述を追加。自信無い。 ;ヘルパー側記述 [State 29990];攻撃時・相手のStateNo確認 Type = Varset var(41) = PlayerID(root,var(27)),StateNo * (Root,MoveType=A) trigger1 = !Root,MoveReversed [State 29990];記憶記述簡略化。 Type = Varset var(41) = 0;引継ぎ用Varリセット ;基本条件 TriggerAll = Root,MoveReversed ;記憶していない。 TriggerAll = Var(42)!=Var(41) && Var(43)!=Var(41) TriggerAll = Var(44)!=Var(41) && Var(45)!=Var(41) ;記録処理var(**):=Var(41) Trigger1 = !Var(42) ;空確認 Trigger1 = Var(42):=Var(41);記録 Trigger2 = !Var(43) ;空確認 Trigger2 = Var(43):=Var(41);記録 Trigger3 = !Var(44) ;空確認 Trigger3 = Var(44):=Var(41);記録 Trigger4 = !Var(45) ;空確認 Trigger4 = Var(45):=Var(41);記録 ignorehitpause = 1 [State 29990];動くはずだけど自信無い。 Type = Varset var(40) = (Var(42)=Var(40)||Var(43)=Var(40)||Var(44)=Var(40)||Var(45)=Var(40)) Trigger1 = 1|| Var(40):=PlayerID(root,var(27)),StateNo ;Var(40)を反応兼記述圧縮用Varにして、反応は(xx||yy)でまとめ。 ;本体側・反応記述 [State -3] Type = Varset var(31) = 5 ;反応用。 TriggerAll = NumHelper(29000);ヘルパー確認 Trigger1 = Helper(29000),Var(40) ▼ID判別追加・他記述方法改良※■※未確認※■※ Var(40)~(49) 40 対象のステート+IDの判別(xxxxxxyyy x=StateNo y=ID) 41 感知判定 42~49 8つの記憶範囲。1行2つ。6つくらいでいいかも。 ;ヘルパー側記述 [State 29990];相手のStateNo+ID確認 Type = Varset var(40) = (PlayerID(root,var(27)),StateNo*1000)+(root,var(27)) trigger1 = !Root,MoveReversed [State 29990];記憶させるVarをVarで管理すれば記述はもっと圧縮できる Type = Varset var(40) = 0;引継ぎ用Varリセット TriggerAll = Root,MoveReversed&& Var(40)!=0 TriggerAll = Var(42)!=Var(40) && Var(43)!=Var(40) TriggerAll = Var(44)!=Var(40) && Var(45)!=Var(40) TriggerAll = Var(46)!=Var(40) && Var(47)!=Var(40) TriggerAll = Var(48)!=Var(40) && Var(49)!=Var(40) Trigger1 = !Var(42) Trigger1 = Var(42):=Var(40);記録 Trigger2 = !Var(43) Trigger2 = Var(43):=Var(40);記録 Trigger3 = !Var(44) Trigger3 = Var(44):=Var(40);記録 Trigger4 = !Var(45) Trigger4 = Var(45):=Var(40);記録 Trigger5 = !Var(46) Trigger5 = Var(46):=Var(40);記録 Trigger6 = !Var(47) Trigger6 = Var(47):=Var(40);記録 Trigger7 = !Var(48) Trigger7 = Var(48):=Var(40);記録 Trigger8 = !Var(49) Trigger8 = Var(49):=Var(40);記録 ignorehitpause = 1 [State 29990];動くはず。 Type = Varset var(41) = 1 TriggerAll = 1||var(41):=0 ;リセット Trigger1 = (Var(42)=Var(40)||Var(43)=Var(40)) Trigger2 = (Var(44)=Var(40)||Var(45)=Var(40)) Trigger3 = (Var(46)=Var(40)||Var(47)=Var(40)) Trigger4 = (Var(48)=Var(40)||Var(49)=Var(40)) ;本体側・反応記述 [State -3] Type = Varset Trigger1 = NumHelper(29000);ヘルパー確認 Trigger1 = Helper(29000),Var(41);ヘルパー確認 var(*反応用Var*) = 1 ;反応用数値 ;0:無反応 1:記憶反応 ;Var管理記述 ;こちらは全て溜まった場合に、古い順から上書きしていく。 [State 29990];記憶Var・Var管理型 Type = Varadd var(39) = 1 TriggerAll = Root,MoveReversed TriggerAll = Var(42)!=Var(40) && Var(43)!=Var(40) TriggerAll = Var(44)!=Var(40) && Var(45)!=Var(40) TriggerAll = Var(46)!=Var(40) && Var(47)!=Var(40) TriggerAll = Var(48)!=Var(40) && Var(49)!=Var(40) Trigger1 = 1||Var(42+var(39)):=var(40);記録 ignorehitpause = 1 [State 29990];管理用Varリセット Type = Varset var(39) = 0 Trigger1 = Var(39) > 8;記憶限界値 ignorehitpause = 1 0:27 2009/09/11 眠い。 ■擬似学習AIの要領  >欲しい情報を取得する。 >情報を数値化し、記録する。  (>記録の整頓処理などを行う) >条件式に用い行動へ反映させる。  記録や行動の反映は情報を処理するだけなので簡単。  「欲しい情報を取得する」という項目が本題であり課題。  例えば、相手の攻撃の中下段を知る場合は、   参照するトリガー情報が無い為、[ガードの成否]で判断する必要がある。  (PrevStateNo=[130,159])&&EnemyNear,MoveHit&&(Var(ガード中StateType)が*S*)  (PrevStateNo=[130,159])&&EnemyNear,MoveHit&&(Var(ガード中StateType)が*C*)  というようなトリガー情報などを用いて、ガードの失敗を判別することになるが、  それだけでは「ガード不可」を判別することができない為、   両方不可であった場合の判別などの情報処理が必要となるなど、簡単ではない。 ( 勿論、それが本当に正確かどうかも、分からない。 )  不可視ヘルパーをコモンなどもいじって完全に制御し、   自身のガードがSならC、CならSのガードをさせることによって、   一括した情報を得る、という事もできなくは無さそう。(ただし、困難であろうが。)  当身の学習も、  当身用であれば「当身返しできる技の当身返しする為の情報」を得ること、  対当身であれば「当身技の情報」を得ることが重要になるが、   どうやって情報を取得するかは工夫を凝らし、より正確な情報を得ようとする事になるだろう。  ただし、そうした学習も本体で何かしらVar管理をしない限り、   1ラウンド毎にリセットされてしまうこともあり、頼り切れるものではない。  例えば対当身なども、当身は乱発するものではない以上、   記憶しても使う機会が無いなんてこともありうるのである。  何回か当たっている技に限定で本体に記憶し持ち越す、と言った対処も考えるべきか。 20:29 2009/09/11 ■記憶限定案  以前記憶している>重複回数の記録>試合終了時(RoundState=3)記憶の1つを本体に。  簡易案  以前記憶している>本体記憶用Varへ