仲間と敵のAIが持つ最適な戦闘距離(=間合いの取り方)の計算方法を解説。
最適戦闘距離
Function Seek_And_Destroy(aibrain.pp)
Function CheckOptimumRange(aibrain.pp)
Function GetOptimumRange(aibrain.pp)
Function XMoveTowardsGoal(aibrain.pp)
最小距離(OptMin)・最大距離(OptMax)
戦闘中のAIには相手との接近してよい最小距離(OptMin)、離れてよい最大距離(OptMax)の2つ項目がある。
- OptMinより前に出ると後退し、OptMaxより後ろに下がると接近する。
- OptMin > OptMax で距離が逆転しているとOptMinより前に接近しなくなる。
仲間の作戦
仲間と会話する事で作戦を決定できるが、その際にOptMin・OptMax が以下に設定される。
- 後方に待機してくれ
- OptMin = 20 、OptMax = 32 が設定される。
武器にかかわらず常に距離20~32を維持する。 - 各自で接近戦を展開してくれ
- OptMin = 0 、OptMax = 1 が設定される。
常に敵に接近し、一切後退しない。 - 最善と思える行動を取ってくれ
- OptMin = 0 、OptMax = 0 が設定される。
この設定値だと戦闘時に最適な戦闘距離の計算が毎ターン実行される。
仲間の作戦の変更
仲間の作戦は「GamaData\lmtactics.txt」内のマクロ(SetLMTactics)で設定されている。
「lmtactics.txt」に自分で作戦を追加したり、OptMin・OptMaxの設定値を変更した方が
後述の最適距離の計算をコントロールするより簡単かもしれない。
- GamaData\lmtactics.txt
greeting <NewChat Say 1 AddChat 1 AddChat 2 AddChat 3> result1 <NewChat Say 2 SetLMTactics 32 20> result2 <NewChat Say 2 SetLMTactics 1 0> result3 <NewChat Say 2 SetLMTactics 0 0> ...中略... % Prompt1 <Stay in the back in combat.> Prompt1 <後方に待機してくれ。> % Prompt2 <Get up close and personal in combat.> Prompt2 <各自で接近戦を展開してくれ。> % Prompt3 <Do whatever you think is best.> Prompt3 <%JSが最善と思える行動を取ってくれ。>
最適戦闘距離の重み付け評価(CheckOptimumRange)
AIは使用可能な武器を全てリストアップし、DCと射程を用いて最適な距離を計算する。
- 使用可能な武器に腕・脚・尾の格闘攻撃は含まれる。
- Extend属性の白兵武器は射程2で計算される。
- 射撃武器の射程は最大射程で計算される。(5-10-15 なら射程15で計算)
- 持ち物内のThrown属性の武器も使用可能に含まれるが、投擲射程がチェックされず射程1で計算。
- 再使用待ち・弾切れ・破壊済み・安全装置適用の武器は使用不可扱い。
- 計算式概要
- 大まかには以下の法則で最適距離の計算を行う。高DCの武器の射程ほど優先されやすい。
最適距離 = 使用可能な武器のDC×射程の合計 ÷ 使用可能な武器のDCの合計
- 高DC白兵武器が多いと接近戦仕様、高DC射撃武器が多いならその射程に応じた距離になる。
- 実際にはOptMin・OptMax、武器の種類・射程に応じて異なる重み付けで評価される。
計算過程
まず合計を計算するために初期値を用意する。
- 武器のDC×射程の合計(N)
- OptMin・OptMax用に2つ初期化する。
N_max = 0 N_min = 0
- 武器のDC合計(D)
- 0で割らない様に初期値が1になる。
D_max = 1 D_min = 1
そして、武器の種類と射程ごとに異なる重み付けで評価しNとDに加算していく。
- 格闘攻撃
- 人間型なら腕2本・脚2本の4本分加算される。OptMinに影響しないが接近傾向になる。
D_max に DC ÷ 2 を加算
- 射程1の武器
- Extend属性の白兵武器は含まれない。OptMinに強く影響し、ほとんど後退しなくなる。
D_max に DC ÷ 2 を加算 D_min に DC × 6 を加算
- 射程2~17の武器
- 射撃武器基準でOptMaxが最大射程の2倍、OptMinが最大射程の1/3(=近距離射程)で計算される。
N_max に DC × 射程 × 2 を加算 N_min に DC × 射程 ÷ 3 を加算 D_max と D_min に DC をそのまま加算
- 射程18~の武器
- 射撃武器基準でOptMaxが最大射程の2倍、OptMinが最大射程で計算される。
かなり極端な後退傾向になり、射程外で何もせずうろつく事もある。N_max に DC × 射程 × 2 を加算 N_min に DC × 射程 を加算 D_max と D_min に DC をそのまま加算
上記で計算したNとDを用いてOptMin・OptMaxを決定する。
- 最適距離の決定
OptMax = N_max ÷ D_max OptMin = N_min ÷ D_min
実例
ここまで計算過程を書いても非常に分かりにくいため、実際の例で説明する。
これは全ての武器が使用可能な状態の計算であり、再使用待ち・弾切れなどで最適距離が変化する。
- つまり最適距離の計算をうまくコントロールするのは相当困難である。
以下の割り算は全て小数点以下切り捨てとなる。
- レーザー・カービン×2、パンチDC3,キックDC4
武器 DC 射程 N_max D_max N_min D_min レーザー・カービン 7 15 7×15×2
=2107 7×15÷3
=357 レーザー・カービン 7 15 7 7 パンチ 3 1 3÷2
=1パンチ 3 1 キック 4 1 4÷2
=2キック 4 1 合計 210×2
=4207×2+1×2+2×2
=2035×2
=707×2
=14- 以上より、OptMax = 420 ÷ 20 = 21 , OptMin = 70 ÷ 14 = 5 となる。
- 近距離射程より前に出ると後退し始める。
- レーザー・ライフル、パンチDC2,キックDC3
武器 DC 射程 N_max D_max N_min D_min レーザー・ライフル 10 21 10×21×2
=42010 10×21=210 10 パンチ 2 1 2÷2
=1パンチ 2 1 キック 3 1 3÷2
=1キック 3 1 合計 420 10+1×4
=14210 10 - 以上より、OptMax = 420 ÷ 14 = 30 , OptMin = 210 ÷ 10 = 21 となる。
- 最大射程より前に出ると後退し始める。
- レーザー・ライフル、モノ・ソード、パンチDC9,キックDC10
武器 DC 射程 N_max D_max N_min D_min レーザー・ライフル 10 21 10×21×2
=42010 10×21=210 10 モノ・ソード 10 1 10÷2
=510×6
=60パンチ 9 1 9÷2
=4パンチ 9 1 キック 10 1 10÷2
=5キック 10 1 合計 420 10+5+4×2+5×2
=33210 10+60
=70- 以上より、OptMax = 420 ÷ 33 = 12 , OptMin = 210 ÷ 70 = 3 となる。
- 白兵武器と格闘攻撃で大きく中和されて接近傾向になる。
- レーザー・ライフル、ソーラー・スピア×3、パンチDC9,キックDC10
武器 DC 射程 N_max D_max N_min D_min レーザー・ライフル 10 21 10×21×2
=42010 10×21=210 10 ソーラー・スピア 15 2 15×2×2
=6015 15×2÷3
=1015 ソーラー・スピア 15 2 15 15 ソーラー・スピア 15 2 15 15 パンチ 9 1 9÷2
=4パンチ 9 1 キック 10 1 10÷2
=5キック 10 1 合計 420+60×3
=60010+15×3+4×2+5×2
=73210+10×3
=24010+15×3
=55- 以上より、OptMax = 600 ÷ 73 = 8 , OptMin = 240 ÷ 55 = 4 となる。
- ソーラー・スピアはExtend属性のため射程2で計算する。Thrown属性の投擲射程は考慮されない。