傭兵AIまわり
傭兵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では利用できません。
そのため以下のようなことができません。
- 自分の種別に基づく行動変更。
- 敵の種別に基づく行動変更。
- 例えば「きのことスケルトンが視界内にいる。きのこは後回しにしよう」ができない。
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