傭兵AIまわり

2016-05-02 (月) 09:57:25
お名前:

傭兵AIを扱っているサイトってあまりないので。
いじっていて気づいた、ホムAIとの差異についてのメモ。

ありていにいって、「この辺りが違うので、ホムAI同等のことはできないよ/手間がかかるよ」という話の材料です。

そもそも傭兵AIってどこにあるのよ。

ホムAIと同様に、LUA で記述されたプログラムです。
これもホムAI同様、<ROフォルダ>\AI の下にあります。
さらにホムAI同様、ユーザが個別カスタマイズすることができます:<ROフォルダ>\AI\USER_AI の下です。

具体的には。

ホムAIが AI.lua となっているファイルなのに対して、傭兵AI は AI_M.lua となっています。

LUAレベルの問題

「ホムAIと同様に」とは書いたのですが、細部は結構違います。
ありていに言って、ROクライアント自体のつくりがホムAI・傭兵AIとで異なっており。
傭兵AI用の仕組みはかなり貧弱で、ホムAIを「そのままコピー」しても動かないようになっています。

種別情報について

AI用の標準メソッドのGetV()で、対象オブジェクトの種別を取得できない。
定義上は GetV (V_MERTYPE,MyID)で自分の種別がとれるはずなのですが・・・
またホムAIでは、明記された仕様ではないものの実装的に、GetV (V_HOMTYPE,TargetID) で任意対象の種別を取得できていましたが、これも傭兵AIでは利用できません。

そのため以下のようなことができません。

  • 自分の種別に基づく行動変更。
    • 例えば「自分はロキだから、マインドブレイカーを使おう」ができない。
    • これができないといろいろ問題なので、Glenelgでは「今はxxxの傭兵」という情報をGlenelgWatchで外部から供給している。
    • 傭兵の最大HP/SPから予想できることがわかったので、そういう対応をしています(参考:過去の日記その2)
  • 敵の種別に基づく行動変更。
    • 例えば「きのことスケルトンが視界内にいる。きのこは後回しにしよう」ができない。

pcall。

pcall は LUA におけるエラーキャッチ用の関数。

Glenelg ホムAIでは、そもそもAIのメイン関数自体をこれで拾っています:万一のエラー時に、ROクライアントが止まるのが嫌なので。
が、傭兵AIで同様の処理を行ったところ、「C stack overflow」で落ちてます。

どこまでやるとエラーになるのかの検証は未実施。

傭兵とホムとの特性差に起因する問題

スキルの詠唱時間

傭兵スキルには詠唱時間がかかるものがある。
詠唱中には他のことができないので、そこにちょっと頭を使う必要がある。

端的には、自分のモーションを監視して「詠唱中」なら何もしない、など。

	if(GetV(V_MOTION,MyID)==8)then
		TraceAI("CastWait: on Casting")
		return false
	end
お名前: