Glenelg開発メモ/優先度処理メモ

2017-04-10 (月) 21:24:11 (14d)

Glenelgの機能についてのメモ。 自分のための覚書でもあり、利用者のための豆知識でもあり、他AI開発者のための参考情報でもあり。

すご〜〜く恐ろしいことなんですが。
Glenelg のファーストリリースから、すでに10年以上経っているんですね。
いろいろコメントを突っ込んであってわかりやすくしてはいるつもりですが、それでもやっぱり時間が経つと忘れることも多く。
ソースもごちゃごちゃしている部分もあるので、アルゴリズムの仕様記録もかねてのメモ。

このメモでは、Glenelgの特徴の1つである「優先度」について、その設計も含めて記録します。
ちなみにプログラムファイル的には、actor.lua 内の『function CheckEnemyPriority()』の中の話。

「優先度」とは、画面内にモンスターが複数いる場合に、「どれから攻撃していくか」を決める順番のことです。
Glenelg では、 視界内のすべての敵に対して以下の計算を行い、その後「最大の優先度」を持った相手を攻撃対象にしています。
この計算後の値がゼロ以下になる対象は、攻撃を仕掛けない相手として扱います。

  1. 基本:敵の種類による優先度。
    • 学習操作で、敵の種類ごとに「0〜9」の範囲で優先度をつけることができます。
      例えば「ポリンの優先度は3」「スケルワーカーは6」「草はゼロ(無視)」・・・というようにです。
      • AIの実装的には、この値を「x100」した値を基本優先度として扱っています。
      • ただし、後述の別判断との兼ね合いで、優先度7以上では「x10000」で計算します。
      • さらに特例で、ノックバックさせるスキル(シュタルホーン)で飛ばした相手は、元の優先度に関係なく「優先度1.9」扱いにしています。
        吹っ飛ばした相手を「追いかけていく」のを避けるための処理です。
  2. 上記に対して、距離による補正を与えます。
    • 「ボスPC」により近い敵の優先度が、より高いです。
    • あくまで「種類基準の優先度」の次の判断基準です。
      「近くにいる優先度4」と「遠くにいる優先度5」では、優先度5のほうを選びます。
      • 実装的には、前述の「優先度x100」に「-距離セル数」としています。
        距離があるほど「小さい値」になるわけです。
  3. その対象が、誰を狙っているかで補正します。
    • 味方:特別な友達・ボスPC・友達・ホム自身のいずれかならば、「その時点で最も多数の敵を抱えている」味方をチェックし、それによって重み付けします。
      • 特別な友達なら、+8000
      • ボスPCなら、+6000
      • 友達なら、+4000
      • ホム自身なら +2000
    • 第三者なら、「ゼロ」に指定。(+0ではない)
    • それが攻撃をしていない==フリーの敵で、かつホムが一度でも攻撃した相手ならば、特別な重みづけせずに進める。
      敵がスキルを使用した場合などで、「誰も狙っていない」状態になることがあるための特例処理。
    • 上記以外でのフリーの敵なら、アクティブ攻撃してよいか否か判断。 具体的には、以下のいずれかなら「攻撃しない」==「ゼロ」に指定。
    1. 学習指定で「パッシブ対象」にしてある敵種類
    2. ホムの体力条件でアクティブ禁止状態
    3. AIロード後、一定時間の「アクティブ禁止」期間
    4. 敵の位置が「アクティブ索敵範囲」よりも外にいる
  4. 「ボスPCとの同時攻撃」の確認。
    • ボスPCが攻撃している敵の種類が「同時攻撃する敵」に設定されている場合、 優先度+100000。
      これは事実上「最優先」の目標。
  5. 手加減モードのチェック。
    • 手加減条件に当てはまっていれば、「ゼロ」に指定。
  6. 横殴りチェック。
    • 横殴り条件に当てはまっていれば、「ゼロ」に指定。

横殴りチェックが最後段にあるので、「横殴り状態の敵は攻撃しない」ことになります。

なお、この処理はあくまで「ホムが自律的に敵を探す」ときの話です。
ユーザが手動で攻撃対象を指定した場合には、この判定は行いません。