解析情報/最適戦闘距離

Last-modified: 2020-10-02 (金) 22:43:11

仲間と敵の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_maxD_maxN_minD_min
    レーザー・カービン7157×15×2
    =210
    77×15÷3
    =35
    7
    レーザー・カービン71577
    パンチ313÷2
    =1
    パンチ31
    キック414÷2
    =2
    キック41
    合計210×2
    =420
    7×2+1×2+2×2
    =20
    35×2
    =70
    7×2
    =14
    • 以上より、OptMax = 420 ÷ 20 = 21 , OptMin = 70 ÷ 14 = 5 となる。
    • 近距離射程より前に出ると後退し始める。
  • レーザー・ライフル、パンチDC2,キックDC3
    武器DC射程N_maxD_maxN_minD_min
    レーザー・ライフル102110×21×2
    =420
    1010×21=21010
    パンチ212÷2
    =1
    パンチ21
    キック313÷2
    =1
    キック31
    合計42010+1×4
    =14
    21010
    • 以上より、OptMax = 420 ÷ 14 = 30 , OptMin = 210 ÷ 10 = 21 となる。
    • 最大射程より前に出ると後退し始める。
  • レーザー・ライフル、モノ・ソード、パンチDC9,キックDC10
    武器DC射程N_maxD_maxN_minD_min
    レーザー・ライフル102110×21×2
    =420
    1010×21=21010
    モノ・ソード10110÷2
    =5
    10×6
    =60
    パンチ919÷2
    =4
    パンチ91
    キック10110÷2
    =5
    キック101
    合計42010+5+4×2+5×2
    =33
    21010+60
    =70
    • 以上より、OptMax = 420 ÷ 33 = 12 , OptMin = 210 ÷ 70 = 3 となる。
    • 白兵武器と格闘攻撃で大きく中和されて接近傾向になる。
  • レーザー・ライフル、ソーラー・スピア×3、パンチDC9,キックDC10
    武器DC射程N_maxD_maxN_minD_min
    レーザー・ライフル102110×21×2
    =420
    1010×21=21010
    ソーラー・スピア15215×2×2
    =60
    1515×2÷3
    =10
    15
    ソーラー・スピア1521515
    ソーラー・スピア1521515
    パンチ919÷2
    =4
    パンチ91
    キック10110÷2
    =5
    キック101
    合計420+60×3
    =600
    10+15×3+4×2+5×2
    =73
    210+10×3
    =240
    10+15×3
    =55
    • 以上より、OptMax = 600 ÷ 73 = 8 , OptMin = 240 ÷ 55 = 4 となる。
    • ソーラー・スピアはExtend属性のため射程2で計算する。Thrown属性の投擲射程は考慮されない。