;当身学習装置・旧記述 ;ステート番号999999 ;本体Var(27)を的IDとする。 ;[Ver,0.900くらい?]の1つ前。 ;デバック表示では、最後に覚えた技を確認できる。(覚えてない場合表示しない。) [StateDef 999999];当身用学習装置のテスト Type = A Ctrl = 0 Anim = 3062 SprPriority = -3 [State 29990, nothitby];一応のっとひっとばい Type = NotHitBy Trigger1 = 1 value = SCA Time = 1 ignorehitpause=1 [State 29990];ステートタイプ Type = StateTypeSet Trigger1 = 1 MoveType = I Physics = N ignorehitpause=1 [State 29990] Type = AssertSpecial Trigger1 = 1 flag = Invisible flag1 = Noshadow ignorehitpause=1 ;● [State a, RecAI-enID];対象ID取得 Type = Varset var(55) = Parent,Var(27); Trigger1 = 1 ;● [State a, RecAI-Check];チェック Type = Varadd var(0) = 0 TriggerAll = Var(55)!=0;ID取得不備の為の対処 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-Dist];距離計算 Type= Varset var(53) = Floor(Var(3+Var(56))/100000)-10 Trigger1 = Var(56) != 999999999;リセットでない。 Trigger1 = 1|| var(54):=(Var(3+Var(56))%100000)-10000 ;Var(53) xxxxyyyyy ;yyyyy=Y+10000 ;xxxx=X+10 ;● [State a, RecAI-DistAndTime];反応の有無とTimeの算出 Type = Varset var(59) = Var(1+Var(56))%100;Timeを記録。 TriggerAll = var(59):=999999999;リセット TriggerAll = Var(56)!=999999999;リセットされていない。 Trigger1 = Parent,P2BodyDist X-Floor(ParentDist X) =[-20,(Var(53))+20];+は範囲調整 Trigger1 = Parent,P2BodyDist Y-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-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)),MoveType=A ;相手が攻撃動作中。 Trigger1 = PlayerID(var(55)),MoveContact ;相手が攻撃を当てた。 ;相手情報による記憶制限 ;Trigger1 = PlayerID(var(55)),HitDefAttr=;当身可能かどうか Trigger1 = PlayerID(var(55)),PrevStateNo=[0,119];始動タイプの技であるか。 Trigger1 = PlayerID(var(55)),Time > 0 ;当身可能な技であるか。 Trigger1 = PlayerID(var(55)),Time < 100 ;相手のTimeが記録すべき長さか。 Trigger1 = PlayerID(var(55)),StateNo < 10000000 ;相手のStetaNo数値が記録可能な長さか。 ;記憶制限 Trigger1 = var(53)!=999999999;記憶範囲内。 Trigger1 = Var(57)!=(PlayerID(var(55)),StateNo);連続記憶制限・チェック Trigger1 = Var(57):=(PlayerID(var(55)),StateNo);連続記憶制限・記憶 ;記憶処理 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 -2, デバッグ表示] Type = DisplayToClipBoard Trigger1 = !var(0) && !var(37) Text = "var(0)=%d" Params = var(0) IgnoreHitPause = 1 [State -2, デバッグ表示] Type = DisplayToClipBoard Trigger1 = var(0) Text = "var(0)=%d, var(1)=%d, var(2)=%d, var(3)=%d, var(4)=%d" Params = var(0), var(var(0)-3), var(var(0)-2), var(var(0)-1), var(var(0)) IgnoreHitPause = 1 [State -2, デバッグ表示] Type = DisplayToClipBoard Trigger1 = !var(0) && var(37) Text = "var(0)=%d, var(1)=%d, var(2)=%d, var(3)=%d, var(4)=%d" Params = var(0), var(37), var(38), var(39), var(40) IgnoreHitPause = 1 ■■■■旧・記述例■■■  当身用に相手の攻撃が命中したTimeを記憶させる記述の想像。   デバック確認を取っていないため、正常に作動するのかは不明。  また、EnemyNear,Timeみたいなものを用いる為、   技の途中でStateが変化するタイプの技には対応できない。  ※■※ 動作は未確認です。 ※■※ ;1:28 2009/09/10メモ Root***は「本体」へのリダイレクト Parent***は「呼び出した親」へのリダイレクト (本体がヘルパーAを、ヘルパーAがヘルパーBを呼び出した場合、  ヘルパーAはRoot Parent両方本体  ヘルパーBはRootが本体、ParentがヘルパーA) ;本体を前提にしているのでRootでいいかも。。。 ;本体Varに、相手のIDを記録させておくこと。 ;PlayerID(Parent,var(**)),←これで、対象へのリダイレクトを行う。 ;■当身用学習装置ヘルパーステート記述 ;ヘルパー生成時、SuperMoveTime と PaiseMoveTime はつけておく。 ; 処理 ;記憶するタイミングになったら、必要なものを := の記述で記憶させていく。 ;Var(0)を管理Varとし、Var 1~59まで記憶Varとする形。例では10まで。 ;管理Varをリセットさせることで一番古い記憶を塗り替えることも可。 ; 備考 ;この例では対象のIDを記録させていない為、単独敵専用(タッグ不対応)。 ;また距離を記憶していない為、攻撃が届き得ないのに反応する可能性があるなど精度は低い。 ;ちなみにMoveContactが条件である為、対飛び道具は記憶できない。別の方法を用いる事。 [State a];テスト記述 ※■※未確認※■※ Type = Varadd var(0) = 1;管理Var(使用するVarの分増やす) TriggerAll = Var(0) < 10 ;記録限界。 Trigger1 = Parent,MoveType=H && Parent,Time=1 ;本体がくらい状態になった時。 Trigger1 = PlayerID(Parent,var(**)),MoveType=A ;相手が攻撃動作中。 Trigger1 = PlayerID(Parent,var(**)),MoveContact ;相手が攻撃を当てた。 Trigger1 = PlayerID(Parent,var(**)),Time < 1000 ;相手のTimeが記録すべき長さか。 Trigger1 = PlayerID(Parent,var(**)),StateNo < 1000000 ;相手のStetaNo数値が記録可能な長さか。 ;▼オプション ;Trigger1 = PlayerID(Parent,var(**)),Time > (最短F) ;当身可能な技であるか ;Trigger1 = PlayerID(Parent,var(**)),PrevStateNo=[0,119];始動タイプの技であるか。 ;Trigger1 = Parent,Var(*)!=999999999;リセット数値でない。(下記の本体用記述参照。) ;▲記憶制限 Trigger1 = var(58)!=PlayerID(Parent,var(**)),StateNo;重複記憶の制限 Trigger1 = var(58):=PlayerID(Parent,var(**)),StateNo;これが無いと、一度に二度記憶する。 ;記憶処理 Trigger1 = 1 || Var(1+Var(0)):=(PlayerID(Parent,var(**)),StateNo*1000)+(PlayerID(Parent,var(**)),Time);記憶 ignorehitpause = 1 ;Var内容 : Var(zz) = xxxxxxyyy ;xxxxxx = (Floor(Var(*)/1000)) = 命中StateNo(StateNo,1000000以上は記憶不可) ;yyy = (Var(*)%1000) = 命中Time(Time,1000以上(およそ16.667秒)は記録せず) ;複数のVarを使う場合はVar(2+Var(0)):=〜〜 Var(3+Var(0)):=〜〜。 ;※オプション※記憶できる量は多く無い為、記憶する際は記憶する技を限定させること。 ;1.当身の最短発生Fより短い攻撃も記憶させる必要が無い。 ;Trigger1 = PlayerID(Parent,var(**)),Time > (最短F) ;当身可能な技であるか ;2.MoveHitからのキャンセル限定技とかは、記憶しても使いようが無い。 ;Trigger1 = PlayerID(Parent,var(**)),PrevStateNo=[0,119];始動タイプの技であるか。 ;>もしくはこちらは別途Varなどを使用して、コンボ系の技かどうかを確認する。 ;>技の途中でStateが変化するタイプの技が元々対応しにくい事を考えると、 ;> 始動タイプの技であるかも基本として用いていいかも。 ; 追記>ただし、PrevStateNoを使うと、!timeでStateNoの変える分岐タイプの攻撃に対応できない。 ;3.一度記憶した技を二度と記憶させないようにする。 ;TriggerAll = Parent,Var(*)!=999999999;リセット数値でない。(下記の本体用記述参照。) ;か、もしくは、記録したStateNoと記録を照合させる。 ;4.Timeは持続性の攻撃に対して上手く反応できない場合がある為、短めにするのも手。 ;999限界を99限界にする、など。その場合の反応は1.65秒まで。 ;5.PlayerID(Parent,var(**)),HitDefAttr=(当身可能な対象);当身が可能かどうか ;忘れてた。 ;■本体用記述 -3ステート ;記述例では、対象IDの記憶に便乗させている。 ; 処理 ;相手のステートが記憶しているStateの場合、 ;記憶したTimeを := の記述でVar(*)に入れる。 ;記憶していないStateの場合は999999999をVar(*)に入れる。 ; 補足 ;複数のVarに記憶させている場合、Var(*)はHelPer(***),Var(ここの数値)を記憶させ。 ;別途Varを使用して各種情報を得るか、もしくは技の条件で情報を用いる形にする。 [State -3];テスト記述 ※■※未確認※■※ Type = Varset var(**) = EnemyNear,ID Trigger1 = Floor(Helper(***),Var(1)/1000) = PlayerID(Var(**)),StateNo Trigger1 = 1 || Var(*) := Helper(***),Var(1)%1000 Trigger2 = Floor(Helper(***),Var(2)/1000) = PlayerID(Var(**)),StateNo Trigger2 = 1 || Var(*) := Helper(***),Var(2)%1000 Trigger3 = Floor(Helper(***),Var(3)/1000) = PlayerID(Var(**)),StateNo Trigger3 = 1 || Var(*) := Helper(***),Var(3)%1000 Trigger4 = Floor(Helper(***),Var(4)/1000) = PlayerID(Var(**)),StateNo Trigger4 = 1 || Var(*) := Helper(***),Var(4)%1000 Trigger5 = Floor(Helper(***),Var(5)/1000) = PlayerID(Var(**)),StateNo Trigger5 = 1 || Var(*) := Helper(***),Var(5)%1000 Trigger6 = Floor(Helper(***),Var(6)/1000) = PlayerID(Var(**)),StateNo Trigger6 = 1 || Var(*) := Helper(***),Var(6)%1000 Trigger7 = Floor(Helper(***),Var(7)/1000) = PlayerID(Var(**)),StateNo Trigger7 = 1 || Var(*) := Helper(***),Var(7)%1000 Trigger8 = Floor(Helper(***),Var(8)/1000) = PlayerID(Var(**)),StateNo Trigger8 = 1 || Var(*) := Helper(***),Var(8)%1000 Trigger9 = Floor(Helper(***),Var(9)/1000) = PlayerID(Var(**)),StateNo Trigger9 = 1 || Var(*) := Helper(***),Var(9)%1000 Trigger10 = Floor(Helper(***),Var(10)/1000) = PlayerID(Var(**)),StateNo Trigger10 = 1 || Var(*) := Helper(***),Var(10)%1000 ;この記述長いが目障りである場合は、別途のHelperでループ処理を行わせる。 Trigger11 = 1 || Var(*) := 999999999;リセットをかける。 ;置換処理用。切り取り→ ★貼り付け→###を数字に置換→★貼り付け ;Trigger### = Floor(Helper(***),Var(###)/1000) = PlayerID(Var(**)),StateNo ;Trigger### = 1 || Var(*) := Helper(***),Var(###)%1000 ;■技側記述 ;記憶発生Timeから現在のTimeを引き、それが受身であるかどうか、の条件。 ;Trigger1 = Var(*)-EnemyNear,Time = [(受付開始F),(受付終了F)] ;上でも書いている通り、この記述だけでは情報が足りない為、精度は低い。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ;;;;;対当身