GBAFEの敵AIについてまとめ

対象は烈火のみですが、それについての解析スレッドを見たので、取り上げてみました。
他の作品にもかなり通用する内容だと思います。

作ったのでこちらもどうぞ「烈火・聖魔の敵AI表

AIの概要

AIは4つの設定がある。

  • AI1 – 攻撃AI
  • AI2 – 移動AI
  • AI3 – 回復AI + 標的AI
  • AI4

まず、敵の行動は攻撃AIで決められる。そしてそれが、不可能だったり完了済みならば、移動AIで決められた行動をする。基本的に、攻撃AIは、攻撃・杖・盗むなどの行動の指定であり、移動AIは主に移動の指定である。

攻撃AIポインタテーブル: 0xC07C54(20個)《聖魔:0x5D308C》
移動AIポインタテーブル: 0xC07BC8(35個)《聖魔:0x5D3040》

ポインタテーブルに4Byte刻みで順にアドレスが並び、AIは16Byteで構成されている。

メモリ上に展開されたAI

Bytes 64-69: [AI3] [AI4] [AI1] [AI1C] [AI2] [AI2C]
AI1C = AI 1 counter. AI2C = AI 2 counter.
These bytes keep track of the next 16-byte AI command to execute.

参考までに。

攻撃AI – AI byte 1

行動の優先順位は 杖>盗み>攻撃(アーチ含む) となっている。

烈火・聖魔の敵AI表

リーダーについて

「リーダー」はProjects_FEでいうユニット設定の「指揮官」を読み込みます。
指揮官の攻撃範囲に相手が侵入した場合、突撃します。ただし、指揮官自身のAIがある程度影響する模様であり、指揮官が”移動しない場合攻撃するAI”だと正常動作しない事を確認しています。

杖について

複数の杖を所持していた場合は、武器ランクが高い方を使う。
同じ武器ランクだった場合、下にある方を使う。

攻撃杖について

バサークとスリープは武器を装備していないキャラを対象にしない。
サイレスは使える杖を持っていないキャラを対象にしない。

命中率が4以下の場合は使わない。この計算は、敵が動く前の位置でされるので、近づけば命中が上がる場合でも使わない。他にも、杖を使用する際、敵が近すぎる場合は離れようとするが、その影響で命中が4以下になっても構わず使う。

上の条件を満たしている中で出撃順が最も後ろのキャラを狙う。

回復杖について

回復杖を所持しているユニットは回復モードに入ったユニットが範囲内に居たら回復を行う。(回復モードについては後に)
攻撃AIが0x0Eの場合は、回復モードに入っていなくても回復を行う。

移動AI – AI byte 2

烈火・聖魔の敵AI表

ランダムについて

文字通り、乱数を利用して適当に移動します。
ファルコン法を不可能(移動経路に乱数を利用しない)にしていると、「近づく移無視」と同じ動きになります。

リーダーについて

「リーダー」は移動AIで指定しても機能します。指揮官の攻撃範囲に相手が進入した場合、動き出します。指揮官が撃破された場合は突撃します。
なお、何故か若いIDの指揮官が撃破されると、それより大きいIDのユニットを指揮官としているAIも突撃します。具体的には、ひとつのマップにB0かB1を指揮官としたAIが混在してるとすると、B0が撃破された場合、B0が指揮官のAIとB1が指揮官のAIが両方とも突撃になります。逆にB1が撃破されても、B0が指揮官のAIは突撃しません。

座標移動AI

0x13, 0x14, 0x15, 0x16, 0x1Dは、地点と範囲を指定する。基本的に指定した地点を目指すが、指定した範囲に進入した場合、AI2-0x00に変わる(範囲型)。0x17, 0x19, 0x1A, 0x1Eは地点のみを指定する。到着完了すると、1ターン待機したら突撃するという行動に変わる(待機型)。

標的移動AI

0x0D-0x11は、標的が味方の場合、標的が攻撃範囲内に居る時は、攻撃範囲外であろうと敵に向かっていく。しかし、その移動によって標的が攻撃範囲外に出てしまうと、また標的の元に戻るのを繰り返す。(遊撃型)
0x21と0x22は、標的が味方の場合、標的が攻撃範囲内に居る時は、そのまま待機する。攻撃範囲内に敵がいれば、攻撃に向かう。(護衛型)

回復AI + 標的AI – AI Byte 3

3Byte目の下位3bitsが回復AIの設定に使われており、残りの上位4-8bitsが標的AIに使われています。
実際の値は、ふたつを足したものです。 (AI3 0x09 = 回復AI 0x01 + 標的AI 0x08)

回復AI

ユニットはHPが決められた割合以下になると、回復モードに入ります。
回復モードに入ると、以下の状態になります。

  • 回復アイテムを持っていた場合、AI1やAI2に関わらず退避してそれを使う
  • 味方の回復対象になる(三体以上が回復モードになったらヒーラーに壁を作る?)
  • ヒーラーに向かって退避する(敵の攻撃範囲外に立てる場合のみ)
  • 近くの砦に退避する(敵の攻撃範囲外の砦のみ)

回復モードの条件は以下
0x00 弱気 = 50%以下で回復モードに入り、100%回復したら戻る
0x01 ふつう = 30%以下で回復モードに入り、80%以上回復したら戻る
0x02 強気 = 10%以下で回復モードに入り、50%以上回復したら戻る
0x03 オオヨワ = 80%以下で回復モードに入り、100%回復したら戻る
0x04 いけいけ = 回復モードにならない

基準
0x00: C06550 (64 32)
0x01: C06554 (50 1E)
0x02: C06558 (32 0A)
0x03: C0655C (64 50)

<聖魔: 5D2298~>

標的AI

AIは、ターゲットポイント(TP)を計算し、それがもっとも高くなった攻撃対象を攻撃します。
TPの計算は、手持ちの装備を上から順に計算します。そして、装備ごとに範囲内の敵を出撃表の上から順に計算します。TPの量が被った場合は、武器、出撃表、共に下にある物を優先します。

標的AIは6種類(0x00、0x08、0x10、0x18、0x20、0x28)あります。
それによって、標的を選ぶにあたって何を優先するかが変わります。

0x1D8F88
名称未設定

例えば標的AIが0x08ならば「③敵との距離優先度」は2で、2倍です。

標的選択の判断基準は8項目があり、それぞれに優先度(警戒度)を設定できます。優先度は0含むα倍を設定できます(ゼロなら無視)。
TP計算結果に優先度を乗算し、最後にすべて合算したものが、最終TPです。

なお、主に0x00、0x08の標的AIが使われています。

▽以下項目の説明

①致死ダメージ&最終ダメージ優先度【0x00】(0x394c4)

もし致死ダメージを与えられる敵なら、この項目のTPは50固定です(優先度無視)

致死ダメージを与えられない場合のTPは「命中率xダメージ/100」の値を計算します。なお、この計算に追撃は考慮されません。
加算されるTP上限は40です。(上限は優先度を乗算した値にかかります)

②敵の残りHP優先度【0x01】(0x39524)

「20-敵の残りHP」で計算されます。全部の攻撃が当たると想定して計算します。この計算が0以下になれば0です。
例を挙げると、HP30の敵に25ダメージを与えられるとすると、敵の残りHPは5なので、20-5=15で「15」が計算結果です。

③敵との距離優先度【0x02】(0x39548)

動く前の位置関係もTPに加算されます。

名称未設定

なんか図が欠けてますが、これはプログラムのバグだそうです。

加算されるTP上限は10です。

④敵のクラス優先度【0x03】(0x395ec)

優先して狙うクラスの設定ができます。項目00~09に設定してある値と優先度を乗算したものがTPです。
優先クラス設定のポインタは0xC0639C以降にあり、敵がどのクラスでもない場合は、09(ゼロ)を乗算します。

例えば、0xC063A0のポインタで指定されたクラスは「④の値」と「01の値」を乗算したものがTPです。
ただし、烈火・聖魔ではポインタのクラス指定がすべてゼロなので、意味がありません。封印だけに設定されています。

加算されるTP上限は20です。

⑤現在ターン優先度【0x04】(0x39620)

現在のターン数がTPに加算されます(?)

⑥反撃ダメージ警戒度【0x05】(0x39638)

反撃されない場合は、10の優先ポイントとなります。(警戒度無視)

反撃を受ける場合のTPは「命中率xダメージ/100」の値を計算します。なお、この計算に追撃は考慮されません。

減算されるTP下限は40です。

⑦包囲警戒度【0x06】(0x39698)

標的AIには攻撃するときの位置取りにも影響します。
攻撃すると敵の攻撃範囲に入る場合、敵ごとに「力+一番強い武器の威力/2」の値を計算し、それを合算した値を8で除算した結果をTPから減算します。

力8、てつ剣(威力5)のリン: (8 + 5)/2 = 6
力13、手槍(威力6)はがね槍(威力10)のセイン: (13 + 10)/2 = 11
攻撃するとリンの攻撃範囲に入る場合: TP penalty = 6/8 = 0
攻撃するとセインの攻撃範囲に入る場合: TP penalty = 11/8 = 1
攻撃するとリンとセインの攻撃範囲に入る場合: TP penalty = (6 + 11)/8 = 2

減算されるTP下限は20です。

⑧自分の残りHP警戒度【0x07】(0x396d0)

「20-自分の残りHP」で計算されます。全部の攻撃が当たると想定して計算します。この計算が0以下になれば0です。

①~⑧すべての値を足して40倍したものが合計TPです。

TP from each weapon-target option gets compared at 080386F0

AI byte 4

AI4 = 0x20: 回復モードに入っても、退避行動を起こさない。

回復アイテムも動かないで使用し、砦にも逃げない。また、攻撃AI【0x03】のような挙動になる。

(元スレ)
[FE7] The Official AI Documentation Thread

自作AIについては次

コメントを残す

メールアドレスが公開されることはありません。