ニコニコMUGEN ( フォント環境:MS ゴシック 標準 サイズ10 )   ストーリーという舞台劇におけるAI byADI ( Story )  MUGENストーリーにおいて、AIは一人の役者である。  ストーリーにおいて、重要になるAIは「ストーリーに合うAI」  もちろん細かく見られるわけではないが、そうあるべき、と言ったAI。  ■殺陣(たて)  ただ単に強い人物であれば、ただ単に強いものでかまわない。  狡猾な人物であれば、狡猾さを映し出すものであるべき。  戦いになれたものであれば、無闇な攻撃を受けたりしにくく。  戦いに未熟なものであれば、攻撃が稚拙となるように。  通常使いえないようなレベルであったとしても、   その舞台劇にふさわしい立ち回りであればいいのである。  簡単に言えば、ストーリーさえそうであれば、   「相手を封殺するレベル」や「何も出来ないレベル」も、使いうるのである。  ただし、「拮抗する試合」をする場合に、全力は相手を選ぶが。  そうしたことを考慮した場合、「勝つためだけのAI」が不要とは言いがたい。  勿論、魅せを考慮するにこしたことはない。  ■拮抗  拮抗した戦いをさせるというのは、キャラ同士の性能に差があると困難である。  また性能差が無くとも相性が関係して、一方的な展開になることもありうるなど、   絶対の拮抗は難しい。  が、おおよそ同じ程度であれば、そこそこ拮抗した戦いをすることが多く、   それなら、きわどい戦いも何度か取り直せば撮れる為、望みはある。  ただダブルKOは拮抗したキャラ同士でも、自爆技でもなければ困難だが。  Double K.O.の条件は「ほぼ同時に両者のライフが0になる」こと。  その為、ほぼ同時に命中することが必要となるが、   同キャラであっても相殺の起きることすら珍しい。  むしろ飛び道具対打撃の方が、Double K.O.を起こしやすいのではないか   と私は感じている。(※確証は無い。)  ほぼ同時に相手にダメージを与え、自身もダメージを食らうことを   行わせる、再現することも難しく、そう狙って出せるものでもない。  元々両者大ダメージの技などであれば、ダブルKOも出やすいが、   自爆を含む技は大抵ネタ性が強く、ネタ性の強い場合以外は使いづらく、   自爆技をわざと使わせる試合でも無い限り、ネタ試合になりうる。  ■劇場型AIの案  戦いにおいて、魅せを特に重視しているAIの案。  性質上実用性よりも展開の魅せを優先している為、強さは不安定になりやすい。 ( モード設定で劇場、全開など変えられれば便利。 )  調整としては  .どちらとも一方的な展開になるようにしない。    勝負が拮抗するような調整を行う。  .攻撃パターンなどが単調にならないよう気をつける。    複数の攻撃方法を決め、状況に応じて用いる。  >相手の強さを見極める為、基本最初は効率の悪い攻撃を用いる。  >自分のライフより相手のライフの方がかなり少ない場合、    キャラの性格に合わせて行動。(待ちor舐めor 関係ない )  >相手のライフが自分のライフより特に多い場合、    行動レベルをより向上させ、差を巻き返そうとする。  ・〆はハデになるよう、ゲージ量を計算して技を使う。    また防御面も気をつけ、ハデにやられるようにする。  >可能な限り、超必殺技で〆られるようゲージ管理する。    またゲージを無闇に残さないよう、倒れそうなら使う。  >超必殺技で〆るため、小技でトドメをささないように制限をつける。    反対に小技で〆られないよう、体力が少ない時は防御を優先に。  かなり際どい部分としては、相手の攻撃を覚える記憶装置をつけ、   相殺を発生させるようなタイミングを計るといった事を行うなど。  そこまでいくと、やりすぎ、かもしれないが。  ■無粋  ただし、そうしたAIを作らない、もしくは使わないからといって   とやかく言うものではない。  ■ ■ ■ ■ ■ ■ ■ ■ ■ ■   補整用メモ  大原則.こうした調整を行ってもよいかを確認すること。  1.行った補整を明記すること。  2.明確な理由無く用いないこと。  ストーリー動画においては意図的な展開を表現する為に、補正を加えている場合もある。  それは、ATKやDEFなどのCns.Date調整だけでなく、   ステートに記述を加えている場合もある程度ある。  特別な力を手に入れた〜とかでは、特に。  ちなみに、これらはあくまで性能調整であり、AI動作調整ではない。   使用方法  -2ステートの先頭と最後尾を探す。 ( 最後尾は [Statedef -2] を探し、そこから [Statedef と検索をかける。   あればその直前が最後尾、無ければ基本そのファイルの最後が最後尾となる。)  そこへ記述を追加する。  ものによっては-3ステートの方が好ましいものもある。  -1,-3 は相手にステートを奪われているときは参照しない。(準常時参照)  -2 はその時でも参照を行う。(常時参照)   その為、ChangeStateを行うのは-1と-3。-2はSelfStateで、可能な限り使わない。  ■パワーゲージ補整(PowerMaxがWin版用だったりする)   >推奨:-2,先頭 [State a, Power Max];パワーゲージほぼ常時マックス。 Type = PowerAdd ;ゲージ増加 Value = PowerMax ;ゲージ総量 Trigger1 = !IsHelper ;ヘルパーでない IgnoreHitPause = 1;ヒットポーズ無視 [State a, Power Add];パワーゲージ自動増加 Type = PowerAdd ;ゲージ増加 Trigger1 = !IsHelper ;ヘルパーでない Trigger1 = RoundState = 2 ;試合中 IgnoreHitPause = 1;ヒットポーズ無視 ;その他 Value = 1 ;約16秒で1ゲージ Value = 3 ;約5.5秒で1ゲージ Value = 6-(GameTime%2=0) ;約3秒で1ゲージ Value = 17-(GameTime%3=0) ;約1秒で1ゲージ Value = Floor(PowerMax/1000) ;約16秒でMaxになる程度の量  Valueの数値に-を加えることで、その分減少させる。  Var管理の特殊ゲージの増加はPowerAddをVarAddにし、V=**を加えればいい。  ■体力補整(LifeMaxがWin版用)   >推奨:-2,先頭 ;減少系 [State a, Life add];ライフ自動減少 Type = LifeAdd ;ライフ増減 Value = -Ceil(LifeMax/1000) ;最大の1000分の1。 Trigger1 = GameTime % 2 = 0 ;2F1回。(ライフ1000で約2000F。) Trigger1 = RoundState = 2 ;試合中 IgnoreHitPause = 1;ヒットポーズ無視 ;ライフ1000なら約33秒。ダメージを考慮するとそれ以下 [State a, Life add];ライフ自動減少 Type = LifeAdd ;ライフ増減 Value = -1 ;-1 Trigger1 = GameTime % 12 = 0 ;12F1回。(ライフ1000で約12000F。) Trigger1 = RoundState = 2 ;試合中 IgnoreHitPause = 1;ヒットポーズ無視 kill = 0 ;このライフ減少でK.O.にならない。(省略時1でK.O.になる) ;ライフ1000なら約200秒。ダメージを考慮するとそれ以下 ;指定値に変更する。 [State a, Life Add];ライフセット Type = LifeSet ;ライフ指定 Value = Floor(LifeMax/2) ;体力半分 Trigger1 = RoundState = 0 ;試合前・暗転中 [State a, Life Add];ライフセット Type = LifeSet ;ライフ指定 Value = Floor(LifeMax*0.8) ;体力八割 Trigger1 = RoundState = 0 ;試合前・暗転中 ;*1=100% *0.5=50%に出来ます。 ;Valueを特定数値にしても可。 ;※最大値より増やすことはできません。 [State a, Life add];ライフ自動増加 Type = LifeAdd ;ライフ増減 Value = 1 Trigger1 = GameTime % 6 = 0 ;6F1回。(ライフ100まで約600F。) Trigger1 = RoundState = 2 ;試合中 IgnoreHitPause = 1;ヒットポーズ無視  ■倒れない(倒れてはいけない状況的な時に)   >推奨:-3,最後尾 もしくは-1,最後尾 ;■倒れ状態になったらすぐしゃがみ状態に移行させるだけ [State a, SelfState] ;-3か-1ステート推奨 Type = SelfState ;自分のステートへ Value = 11 ;しゃがみ状態 Trigger1 = StateType = L && Alive ;生きている倒れ状態 Ctrl = 1 ;コントロール戻し ;※バグをはらんでいる危険性もある為注意。 [State a, SelfState] ;-3か-1ステート推奨 Type = SelfState ;自分のステートへ Value = 11 ;しゃがみ状態 Trigger1 = StateType = L && Alive ;生きている倒れ状態 Trigger1 = Random < (LifeMax/Life -1) * 100 ;体力が多い(少ないと成功率が減る) Ctrl = 1 ;バグをはらんでいる危険性もある為注意。 ;※バグをはらんでいる危険性もある為注意。  ■ひるまない(ただし攻撃などは中断するみたい)(同上)   >推奨:-3 もしくは-1 ;■簡易アーマー [State a, Damage];ダメージ Type = LifeAdd Value = -GetHitVar(Damage);ダメージ分 Trigger1 = GetHitVar(Damage) [State a, Hit];ヒット時を明確に Type = PalFX Trigger1 = GetHitVar(Damage) Time = 6 add = 200,200,200 IgnoreHitPause = 1;ヒットポーズ無視 [State a, Ctrl];コントロールを入れる Type = CtrlSet Trigger1 = GetHitVar(Damage) value = 1 IgnoreHitPause = 1;ヒットポーズ無視 [State a, HitOverride]; Type = HitOverride ;攻撃判定を受けたとき Trigger1 = 1 Attr = SCA,AA,AT,AP StateNo = StateNo [State a, NoGuard];ガード制限 Type = AssertSpecial Trigger1 = 1 Flag = NoStandGuard Flag2 = NoCrouchGuard Flag3 = NoAirGuard IgnoreHitPause = 1;ヒットポーズ無視  ■縮小について  Scaleを調整することになりますが、   それだけだと本体の画像だけ小さくなってしまいます。  移動速度や、エフェクトなども調整しないと、変な状態になります。  Cns記述にある全てのXY処理・情報に*(Const(Size.XScale))と*(Const(Size.YScale))を追加すれば、   大きさに合わせてエフェクトなども調整されます。根気の要る作業ですが。  ExplodやProjectileにHelperなどにScaleのパラメーターが無い場合は追加してやったり、   Commonの記述がキャラ側に無い場合は持ってきてその記述を変更してやったりする必要が。  ちなみに、元々のスケールが0.5(いわゆるD4)のキャラなどは(Const(Size.**Scale)*2)と言う風に、   元々の数値が1として扱われるよう調整してやる必要が。スプライトが横長である場合も同様。  より正確に縮小するためには[Movement]のairjump.heightやyaccel、   [Size]のground.backやhead.posなどの諸々の数値変更も必要。  [Velocity]は参照を行っている方を変更すればこちらの数値は変える必要なし。   倍率指定であるstand.frictionなどの変更は必要なし。  ただ、全画面演出系を縮小すると寂しい事になるため注意  ■イントロ  調整の話ではありませんが、   大半のキャラは少し記述を変更するだけで、イントロを省略できます。  まず仕組みを説明しておくと、   画面に登場したキャラクターは初めに「State,5900」、   つまり[Statedef 5900]の処理を行うようになっています。  しかし5900番ステートがイントロを表示するステートではありません。  5900番ステートで行われる処理は「システム関係の処理」と   「イントロステート(190番,他)への移行」が基本となっています。  基本2ラウンド以降にイントロが発生しないのは、   5900番ステートからイントロステートへと移行する条件に、   RoundNo=1(1ラウンド目)やRoundsExisted=0(消費ラウンド数0)などがあり、   一番最初のラウンドやキャラが始めて登場する時に限定されているためです。  そしてイントロを省略したいときの調整は   [StateDef 5900]にあるType = ChangeStateの行の下へ TriggerAll = 0 ;封印 というような行を追加することで、   そのキャラクターは試合開始まで[Statedef 5900]から動かなくなります。 ( ※キャラによっては特殊な処理を行う為にステートを飛ばしている場合があります※   ※その場合は、必要なステート処理は最低限行わせるよう調整する必要があります※ )  5900から他のステートへ飛ばなくて大丈夫なのか? と言えば   MUGENは試合開始のタイミングを合わせるため、MUGEN側の処理で試合開始時に   State,0(立ちステート)のCtrl=1(キー入力受付可能)状態になるため、   5900ステートから別のステートへ移行しなくても問題が無いのです。  ちなみに特殊イントロについては、[Statedef 5900]にChangeStateを追加し、   適当な条件で「特殊イントロ用のステート」へと飛ぶよう記述することでできます。  もちろん「特殊イントロステート」は自分で作る必要がありますけど。