MUGENメモ ( フォント環境:MS ゴシック 標準 サイズ10 )   Varの初歩   ○ 砕いて言うと ○  Varは数字だけ書き込めるメモ帳みたいなものです。   整数だけを掛けるVarのメモが60枚 (数字は[2147483647,-2147483648]の範囲まで。)   小数(0.xx)も使えるFvarのメモが30枚 (細かい数字は僅かながら変動しますが、整数は7桁まで安定。)  計100枚あり、メモにはそれぞれ番号が振ってあります。  その数字をVar(xx)やFar(xx)の()に入れることでそのメモを使うことができます。  そしてメモに数字を書いておけば、後でその数字を確認することができるのです。  このメモのことは「Var」や「変数」と呼び、メモに数字を書くことは「代入」と呼びます。   ■変数の初歩  Varとは変数(Variable)、数値を入れたり数値を変えたりの記録できるものです。  Var(xx)のxxに数字を入れてそのスロットの変数を参照することができます。  「小数の使えない整数のみのVar」と、  「小数を使えるFvar」が存在し、性質が若干異なります。  どちらも同じことは「数値を入れて、それを参照できる」ってことです。 ■性質  Varは、0~59のスロット Fvarは0~39のスロット 合計100スロットが用意され、   これは本体やヘルパーなど問わず、それぞれが100スロットずつ保有しています。 ( それ以外のスロットは存在しない為、範囲外の数値を指定した場合、記録されません。 )  Var(*スロット番号*)やFvar(*スロット番号*)でスロットに記録した数値を呼び出せます。  Varのスロット番号「0」を呼び出す場合はVar(0)という風に記述する形です。  Varは1つ9桁までの整数を安定して記憶することが可能で、   最大と最低数は[2147483647,-2147483648]です。(32bit-int型と呼ばれるもの。)  問題を起こさない為にも、9桁で留めておくべきかと。  fvarはFloat型、浮動型と呼ばれる方式で小数(0.xx)が使える代わりに   数値や桁数によって細かい数字が変動してしまう他、   整数でなければいけない処理に使うとエラーを起こしたりしますので注意。  Float型の数値が不安定になるのは大体以下の条件が当てはまる数値   1.整数値が大きく、キリの悪い小数値も使っている 2.桁数がとても多い   その為、なるべく整数は使わず、整数を使うなら小数を使わない方が安定します。  整数で使いたい場合、小数を使いさえしなければ7桁(0~9999999)まではおおよそ安定。   ただし、8桁の大きい数字になると、小数と同様下の位が浮動しやすくなります。 ■ラウンドによるリセット  ラウンドをまたいだ場合、VarはキャラクターのCns記述[data]にある IntPersistIndex = 60 FloatPersistIndex = 40  この記述にしたがって、Int~~はVar(**)、Float~~はFvar(**)の、   「設定数値より小さい数」のスロットをリセットします。 ( 設定数値以上の番号のスロットをリセットしないわけです。   Int~~が20なら、Var(20)~Var(59)までのスロットが持ち越されます。 )  次のラウンドへ変数数値を持ち越したい場合、ここの設定をしなければいけません。  ちなみに基本的に、キャラクターは「試合中初めてのラウンド」の時、   5900,State内で全てのVarを一度リセットしたりしています。 ■代入  数字を記憶させる方法は大きく2つ。  ステートコントローラーを使う方法と、条件式に特殊な代入式を用いる事。  ステートコントローラーには、 ParentVarAdd ;ヘルパーである場合、呼び出した親の指定Varへ加算する ParentVarSet ;ヘルパーである場合、呼び出した親の指定Varへ数値を代入する。 VarAdd ;指定Varへ加算を行う。 VarSet ;指定Varへ数値を代入する VarRandom ;指定Varへランダムな数字を代入する VarRangeSet ;指定範囲内のスロットにあるVarへ同じ数値を代入する。  というものがあり、また条件式中であっても、「:=」という代入を行う式があり、  Var(xx):=zz や fvar(xx):=zz というような記述で代入が可能。  その場合代入が0だと、Trigger***=0と同様に処理する模様なので、  Trigger*** = 1||Var(xx):=zz;というような用い方をすると次の条件式へといく。  条件式等、細かい使用方法は他を調べてください。 [State a, varset];記述例 Type = Varadd ;Var加算 Trigger1 = 1 ;毎フレーム V = 20 ;Var(20)へ Value = 10 ;10を加算する。 ;※VarRangeSetと:=代入以外は、1つのステートコントローラーで1つしか代入できません。 ;fvar()へ代入したい場合は、V→FVです。 [State a, varset];記述例2 Type = varset ;Var代入 Trigger1 = 1 ;毎フレーム var(21) = var(21) + (MoveType=H&&StateType=L)*10 ;倒れ中に10を、それ以外(起き上がり含む)で0を、Var(21)に加算してvar(21)に代入する。 ;※var(xx)でも代入させることができますが、こちらは「var,小文字」でないとエラーを返します。 [State a, varset];記述例3 Type = Null Trigger1 = var(22) := var(22) + (Ctrl)*10 ;Ctrlがある時に10をvar(22)に加算して、var(22)に代入する。 ■注意点  できない使用方法などは存在します。  例えば、Float型の数値に%(余りの数値を出す)を用いるとエラーを起こすなど、   Fvarなどを使用する際は特に気をつけること。  Float型(fvarなど)をInt型(varなど)に代入したりするときなどは、   Floor(*小数点切捨て*)などを使わないと、エラーを流します。  単なる補足ですが、Var(**)に記述するスロット番号は   別のVarや数値情報を使っても参照させることができます。  例えばVar( 0 )はVar( 1-1 )でも参照してくれますし、   Var( Var(xx) )というような参照方法もあります。  基本的な処理には一切使いませんが。 ■SysVar,Sysfvarについて  システム用変数というもので、CommonステートにSysvar(0)とSysvar(1)が使われています。  通常のVarと違いVarsetかVaraddでしか制御できませんし、それぞれ0~4の5個ずつしかありません。  余程のことがない限り、使わないようにしましょう。 ■スロット一覧  使っているスロットをメモしておくと混乱することが少なくて済みます。  必要なら[varスロット表/VarSlot.txt]とかを使ってみてください。 補足■:=代入とTriggerの性質などについて  ↑の例で出ているType = Nullは「条件式が合っていても何も処理をしないステートコントローラー」です。   条件式は参照しますので、条件式中に:=代入を書いても処理されます。Type=Nullでなくても:=代入は使えます。  ( 数式の入れられる場所ならTrigger内でなければならない必要もありません。value=100 +(var(1):=1)*0 )  :=が処理されない条件は「その行のTriggerが参照されなかった場合。」  砕いて言えば『Triggerは必要な分だけTriggerを参照します』ので、   条件が合わなければそれ以降読み込みません+条件が揃ってもそれ以降読み込みません。  同じステコンの「TriggerAll」が偽(条件が合わなかった,数値=0)の場合、   それ以降のTriggerを参照する意味が無いため、それより下にあるTrigger1などは参照されません。 TriggerAll = var(1) := 5 ;5を代入する TriggerAll = 0 ;偽 TriggerAll = var(1) := 10 ;×↑で偽のため参照されない。 Trigger1 = Var(1) := 5 ;×↑参照されない。  もちろんTriggerAllだけでなく、番号のTrigger1やTrigger2でも上側にある条件が偽の場合、   下にある同じ番号のTriggerは参照されません。参照する意味がありませんので。 Trigger1 = Var(1) := 5 ;5を代入する Trigger1 = Var(1) = 10 ;×5=10なので偽 Trigger1 = Var(1) :=10 ;×↑が偽なので参照されない。 Trigger2 = Var(1) = 5 ;5=5なので真 Trigger2 = Var(1) := 9 ;9を代入する。  またTriggerの条件が出揃った場合は、それ以降のTriggerも参照されません。 Trigger1 = Var(1) := 0 ;0を代入する。×代入数値が0なのでTrigger的には「偽」となる。 Trigger2 = Var(1) := 5 ;5を代入する。また、Trigger2の真揃いました。 Trigger3 = Var(1) :=10 ;×↑でTrigger2の真が揃った為、参照されない。  ※その行が偽でも、参照さえされれば:=代入は行われますので注意。  ※他に注意する点としては、ChangeStateを上の方で行われると、   それ以降のステートコントローラーが処理されませんので、:=代入もしません。上に書けってことです。  ちなみに:=代入しながら常に次の同じ番号Triggerを参照させたい場合は、   1||var(xx):=xxという風に書き「1(真)または〜」で絶対に真となります。   させたくない場合は0&&を追加し「0(偽)に加えて〜」で偽にできます。   ただし、→の条件式に||がある場合は0&&(*他の条件式*)みたいに()で囲ってください。 Trigger1 =1|| Var(1) := StateNo ; StateNoを代入する。(絶対真なので0番ステートでも真) Trigger1 =1|| Var(2) := Time ; Timeを代入する。(絶対真なのでTime=0でも真) Trigger1 =0&&(Var(3):= Anim ); Animを代入する。(絶対偽なのでAnim=0以外でも偽) Trigger2 =1|| var(5) := 0 ;0を代入する。(絶対真) Trigger2 = P2MoveType = A ;条件:相手の動作状態が「攻撃」 Trigger2 =0&& var(5) := 1 ;1を代入する。↑の条件が有っているなら。(絶対偽) Trigger3 = var(11) != StateNo ;var(11)がStateNoと違うなら Trigger3 =1|| var(12) := var(11) ;Var(12)にVar(11)を代入する。↑の条件が有っているなら。(絶対真) Trigger3 =0&& var(11) := StateNo ;var(11)にStateNoを代入する。(絶対偽)  という感じで、1||や0&&を使うことによって、複数の処理を混合させることが可能です。  同じ番号のTriggerを参照させたい、条件を合わせて処理をさせたい場合は、【1||*条件式*】で絶対真  次の番号のTriggerを参照させたい、条件を合わせず処理させない場合は【0&&(*条件式*)】で絶対偽  ステートコントローラーの命令数値(Valueなど)はTriggerが真で揃って処理が行われる際に参照されます。 [State a] Type = ChangeState value = var(11) := 200 TriggerAll =*条件式云々* Trigger1 =*条件式云々* Trigger2 =*条件式云々*  という書き方であれば、200番へChangeStateする時にVar(11)へ200を代入します。  もし処理に反映させたくない数字であったら value = 200 +(var(12):=51)*0 ;←200で処理をしつつ、var(12)に51を代入する。  +(var(xx):=xx)*0という感じで「0を加算する式」にすれば、代入数値は命令数値に影響を与えません。  これらの仕様は簡単なキャラ,AIではまず使いませんが、   これらを使うことで、色々なことを簡単にできたりもします。  特に【同時に複数のVarset】を行いたい場合は、:=代入が一番簡単です。 補足■共有圧縮  全100スロット。  使ったことが無いと多いように感じられるかもしれませんが、   むやみやたら圧縮もせずに使うと、足りません。  そうした場合に用いられる技術が「共有」による使用Varの圧縮です。  例えば、3桁までしか使わないVar処理と、2桁までしか使わないVar処理とを、   1つのVarを共有し処理を行えば、使用するVarを減らすことができます。    その場合は、「xxxyy」という1つVarに収まるでしょう。  前記したとおり、9桁までであれば、安定して使うことが可能ですので、   「xxxyyyzzz」と言うように、複数種類の処理を纏めることも可能ではあります。  ただし、その分記述自体は膨れ上がりますので、   あくまでVarが足りない場合時にしか、使う必要はありませんが。  参照方法はFloor(var/xx)やvar%xxなどを用いる方式。   代入方法は、それらで代入する桁以外の桁の数字を出すか、   参照方法でだした数値を引いて出した数値に代入数値を加えて代入を行う形になる。 ( 細かい方法は割愛。 )  共有圧縮は多くの情報を記憶させる場合、必須です。  ただしFvarに使うことはできません。  ■bit演算による共有  詳しくは[ビット演算のメモ/bit.txt]を参照  bit演算子がある為、31個までの処理が可能です。  bit演算子とは、&,|,^などのこと。  それを駆使することによってbit方式で数値を管理することができます。  ただ0〜4までの数値+5のON,OFF×9個であれば、bit方式よりも多い情報量を保持できます。   0〜4の数値はbitの場合、最低でも3bit(0~7)必要で+1bitならば4bit。    それが9個である場合、36bitも必要になります。