対象は烈火のみですが、それについての解析スレッドを見たので、取り上げてみました。
他の作品にもかなり通用する内容だと思います。
目次
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
行動の優先順位は 杖>盗み>攻撃(アーチ含む) となっている。
リーダーについて
「リーダー」はProjects_FEでいうユニット設定の「指揮官」を読み込みます。
指揮官の攻撃範囲に相手が侵入した場合、突撃します。ただし、指揮官自身のAIがある程度影響する模様であり、指揮官が”移動しない場合攻撃するAI”だと正常動作しない事を確認しています。
杖について
複数の杖を所持していた場合は、武器ランクが高い方を使う。
同じ武器ランクだった場合、下にある方を使う。
攻撃杖について
バサークとスリープは武器を装備していないキャラを対象にしない。
サイレスは使える杖を持っていないキャラを対象にしない。
命中率が4以下の場合は使わない。この計算は、敵が動く前の位置でされるので、近づけば命中が上がる場合でも使わない。他にも、杖を使用する際、敵が近すぎる場合は離れようとするが、その影響で命中が4以下になっても構わず使う。
上の条件を満たしている中で出撃順が最も後ろのキャラを狙う。
回復杖について
回復杖を所持しているユニットは回復モードに入ったユニットが範囲内に居たら回復を行う。(回復モードについては後に)
攻撃AIが0x0Eの場合は、回復モードに入っていなくても回復を行う。
移動AI – AI byte 2
ランダムについて
文字通り、乱数を利用して適当に移動します。
ファルコン法を不可能(移動経路に乱数を利用しない)にしていると、「近づく移無視」と同じ動きになります。
リーダーについて
「リーダー」は移動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)あります。
それによって、標的を選ぶにあたって何を優先するかが変わります。
例えば標的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】のような挙動になる。