studio Odyssey



へっぽこAI


はじめに

へっぽこ 「へっぽこのホムンクルス、『ぽっぽこ』ちゃんの、AIですー。

 もともとはバニルミルト用のAIですけど、他のホムンクルスにも対応しましたので、ホム使いの方々で、欲しい方はどうぞもってっちゃってくださいませ。
 ちょこっといろいろな機能が付いているので、入門ホムAIの先に行く方はどうぞですよー」


Update Logs

04.04.13
Version1.02をリリースしました。
1.01に、自動逃亡のバグがあります。1.02にしてください。
タゲかぶり時の動きをちょっと修正しました。(追わないです。戻るです)
移動コマンドの処理をちょっと修正しました。(7距離以内はキャンセルされないです)

利用規約

AIの使用上の注意
このAIはへっぽこの個人的なホムンクルス用に作られたものです。
一応、いろんな種類のホムの設定がありますが、バニルミルト以外では確認していません。
バグがあるかも知れません。
バグを見つけたら、Ragnarok BBSでお知らせ下さい。
再現性を教えてもらえると、直しやすいです。
でも、必ず直すとは言えないです。
Luaのエラーが出た場合は、使用を中止した方がいいです。
場合によっては、ROクライアントを強制終了するしかなくなります。
利用の際には、studio Odyssey-ダウンロード上の注意内にある、必ずお読み下さいをご覧になり、同意していただく必要があります。
転載・修正について
へっぽこAIは基本的にパブリックドメイン的なものです。
日本の法律だと、パブリックドメインはできないんですけど。
再利用、転載、修正等の行為について、特にご連絡いただく必要はありません。
コピーライト的なものや、謝辞等も、特に必要ありません。
謝辞
このAIは、Protection。TM様(http://www.inguild.com/)のAIにある機能(いわゆる韓国ユーザーAI)を元に、同等(くらい)の機能を実装したものです。
0-MATERIAL様のどきどきAIも参考にさせていただきました。
生体研究所様のAIも参考にさせていただきました。

ファイルリスト

Ver 1.02
ファイル名 MD5 SHA-1 サイズ(byte)
AI.zip0280C15164B8E9F6D8739243442479AFD6695458830F35AB66029FBDD7DECEE93D56802E33,065
AI.lua50FF89EC248F57C490ED475617B9393BCE225F17FA2FAA33F56051E6B805AF58DD024CA82,837
AttackList.iniD41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD807090
AttackList.luaC230213F72D1E5F7C0DA075F65ACFDDF527C867D715F20A71D4F7875C7D1D0B1508A34B4,089
Const.luaE9FF4B92D9A94B4E628BDDC32A34794CEBC7EFF72BD49820D4F71AA95DB2F2915BAAFDD66,400
CustomAI.luaE30A73912C2668A370BC564B5D5FD79C20106A3F299D98AA23CA412BADA80B69ADC157DA31,841
CustomConst.lua819492BA6C706A3E5A5E3B87BA48EBB790E84668BD4B90A21706D403215F22B318C6F3C55,247
CustomProcess.lua88CF5627251F2ECC8A1112219AEAB5A3B95A7866C58D894CF8B1D424556EB322E982D2FB6,050
CustomState.lua43A9498B95FA7EC396AD44B0791DBE47427BE63D6882276F5AD4B66C75CCA89090EA2F1312,725
CustomUtil.lua44BBC21CD24B1EE30666E6DBC426710ACF2678F66921936541E5D8C946354DF153EC6B4615,475
Friend.iniD41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD807090
Friend.lua65D3FE19E8FEC7396088E1C94815DB675387164D8ADB60F71F7DB3CC6F6CACC18345C4261,809
GlobalVariable.lua6EFA6916E66AAF777873DC91298BC7DBD6FA12146E23FEB200138D064696DFA8753308C0685
MoveCommand.lua90E39CF87A055D7647D808741CF33D20D1E3B5FC9E033A4CE050242BEE98971A2925CB8411,171
Setting.iniD41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD807090
Setting.lua4A9788AC56E7DE32AACAE1FD66BC7D03961FB4A495BC346E92F477C15FBA21ADBFA20CED12,049
TraceUtil.lua3533CCD89D49C8AE0543B0E9D8C503B478222883EEDFF22C51F8DA74FFF5E8E1FA817F9E2,939
Util.luaB8B127426039587D72A6C4F57EEF748B1E796AA68892F414643C8FD51FB06C7E04168AD82,663
Vector.luaC86957F7659AD17A36995F131E711DB97D0D0D0939EC9F63754926000A1ABC532402B1482,800

使い方

へっぽこ 「つーわけで、へっぽこAIについてですー。

 一般の利用者の方は、ここから先の使い方をご覧下さい。
 AIをカスタムする方、一部の機能だけを実装したい方は、開発者向けをご覧下さい。

 普通に使う分には、移動コマンドを覚えていただければ、大抵の事は設定できるようになってます。
 あと、以下で使用される言葉の定義を先に書いておきますので、確認してくださいね」

ホム
ホムンクルスのことです。
自分のホムンクルスである場合、他人のホムンクルスである場合は、文脈に依存します。
オーナー
ホムンクルスの召還者の事です。
基本的には、プレイヤーである貴方です。
アクタ、またはアクター
画面上に存在する全てのオブジェクト。(タゲれないものも含む)
ここで言うオブジェクトは、PC、NPC、モンスター、ホム等です。
モブ
RO用語でのモンスターの事です。
ターゲット
名詞としては、タゲる事のできる全て。ユーザーやモブ、その他を含みます。
動詞としては、「攻撃対象としている」という意味です。
お友達、または友達
ホムンクルスのAIによって、ホムンクルスに覚えさせたキャラクターのIDの事です。
移動コマンド
ALT+Tでホムンクルスを待機状態にした後、規定時間(デフォルトで30秒)の間にホムンクルスをALT+右クリックで移動させることによって、設定を変更する動作のことです。
n距離(nは任意の整数)
多くの場合、あるキャラクターAとあるキャラクターBの、その2点間の距離。
あるキャラクターAの位置座標をx1,y1とし、あるキャラクターB位置座標をx2,y2とした時、math.floor(math.sqrt((x1-x2)^2+(y1-y2)^2))によって求められるもの。(三角関数)

一般的な使い方:インストールから切り替え、アップデート

インストール
へっぽこAIを利用するには、AI.zipを適当な場所にダウンロードします。
解凍すると、ファイルリストのファイルが解凍されます。(AI.zipは含まない)
これらのファイルを、Ragnarok Onlineのインストールフォルダにある、AIフォルダの中にUSER_AIフォルダを作って、コピーします。
アンインストール
アンインストールは、ファイルを全て消すだけです。
カスタムAIへ切り替える方法
インストールしたら、カスタムAIを作動させます。発言ウィンドウに/hoaiと入力し、Enterキーを押します。
メッセージウィンドウに、黄色いメッセージが流れます。
カスタムAIに切り替わっているか確認する方法
へっぽこAIでは、オーナーが座っている時、ホムをALT+右クリックで遠くに動かしても戻りません。
よって、へっぽこAIで動いているかを確認する最も簡単な方法は、座って、オーナーから5セル程度離れた場所をALT+右クリックすることです。
ホムが戻ってこなければ、へっぽこAIは絶賛稼働中です。
アップデート
現在のへっぽこAIのバージョンは、AI.luaに書いてあります。
公開されているバージョンよりも古い場合は、アップデートをオススメします。
設定や、お友達リスト、攻撃対象モブリストは、Setting.ini、Friend.ini、AttackList.iniに書かれていますので、初期化したくない場合は、このファイルを上書きしないでください。

一般的な使い方:何もしていないとき

おしゃべり中のホム
ROで最も多い時間である、おしゃべり中。ホムを出しっぱなしにしている方も多いと思います。
この時、ホムはHPとSPが規定以上であれば(設定によります)、暇つぶしに以下の動作のいずれかを規定の間隔と確率で行います。
北、南、東、西のいずれかに1セル動く。
自分の位置か、オーナーの位置か、お友達の位置を中心に回る。
ランダムに選ばれたお友達の、現在の位置から最も近い近接セルに移動。
オーナーが座っているとき
オーナーが座っている時、ホムをALT+右クリックで移動させても、戻ってきません。
あまり遠くにやると、コントロールできなくなるので注意してください。
さらに、先攻型の場合、ホムが見える範囲に殴っていいモブがいると殴りに行ってしまうので注意してください。
オーナーが立つと、ホムは戻ってきます。

一般的な使い方:戦闘の準備

ホムンクルスの攻撃属性
へっぽこAIでは、ホムの攻撃属性を3つの中から選べます。
決して攻撃に参加しない。
攻撃を受ける、オーナーが攻撃する等、一定の条件を満たしたときにのみ攻撃に参加する、非先攻。(または専守防衛)
オーナーが「攻撃していい」と設定したモブが、一定の範囲に入ったとき、そのモブを攻撃する、先攻。
オーナーの敵を優先的に攻撃する。
へっぽこAIでは、オーナーが戦闘中、ホムが自分の敵よりもオーナーの敵を優先するかしないかを設定できます。(規定ではする)
設定の方法
各種の設定を変更するには、移動コマンドを利用します。
攻撃属性は、ホムンクルスをALT+Tで待機させたあと、北に1セル動かしてから設定します。
まず、ALT+Tを押すと、ホムンクルスはオーナーの近くに、以下の画像のように寄ってきます。
ALT+Tで接近してくるホム
この状態で、規定時間、ホムは移動コマンドを受け付けます。(詳しくは移動コマンドの詳細を確認してください)
この時、北に1セル動かすと、攻撃属性の変更になります。
各種設定の変更は、以下です。ホムを1歩ずつ動かしてください。(ここでは上が北です)
攻撃属性変更の移動コマンド
ALT+Tの後、緑(北)に動かします。ここが、攻撃属性の移動コマンド開始点です。
緑からピンク(東)に移動すると、非先攻になります。
緑から赤(西)に移動すると、先攻になります。
緑から水色(北)に移動すると、決して攻撃しないになります。
緑から黄色(南)に移動すると、オーナーの敵を優先するかの設定になります。ここから緑(北)に移動すると「する」。ここから紫(南)に移動すると「しない」になります。
設定がうまくいくと、ホムはくるりと回ります。

一般的な使い方:戦闘

敵を探す
ホムが敵を探す設定は、その攻撃属性に寄ります。
戦う
戦闘中、ホムンクルスは設定に基づき、スキルを自動で使用します。
この設定の変更は、移動コマンドの東で変更できます。
攻撃時のスキル使用の移動コマンド
ALT+Tの後、緑(東)に動かします。ここが、攻撃時スキル使用の移動コマンド開始点です。
緑からピンク(北)に移動すると、スキル1の設定です。このあと、北に動かすと自動的に使用「する」。ここから南に移動すると「しない」です。
緑から水色(青)に移動すると、スキル2の設定です。このあと、北に動かすと自動的に使用「する」。ここから南に移動すると「しない」です。
緑から赤(南)に移動すると、スキル3の設定です。このあと、北に動かすと自動的に使用「する」。ここから南に移動すると「しない」です。
スキル1、2、3は、ホムの種類によって違います。
スキル1は「治癒の手」「キャスリング」「ムーンライト」「カプリス」のいずれかです。
スキル2は「緊急回避」「ディフェンス」「フリートムーブ」「カオティックベネディクション」のいずれかです。
スキル3は「オーバードスピード」です。
スキルの使用確率など
各種設定はSetting.luaで変更できます。(この時、Setting.iniがあると、その設定が優先されるので、直接Setting.luaを変更したときはSetting.iniの中身を消すといいです)
使用SP限界が設定できます。
確率が設定できます。
使用するレベルを設定できます。(一部のスキルを除き、デフォルトでランダムです)
ホムがあぶない!
戦闘中、ホムのHPが規定以下になると、ホムはオーナーと自分の敵との距離から、オーナーの背後に回ります。
モブのターゲットから自分から外れないと、ホムはオーナーを中心に、常にモブと逆方向に逃げ続けます。
ターゲットが外れると、ホムは危険状態から抜けるまで、攻撃を控えて、じっとします。
移動すれは、ホムは付いてきますが、この時、ホムはオーナーよりちょっと離れた位置で停止します。(規定ではオーナーの近接セルに停止する)
オーナーの敵の判定方法
オーナーの敵の判定は、デフォルトで「オーナーがターゲットされている」か「オーナーが攻撃モーションをとっている時、最も近い敵」です。
「オーナーが攻撃モーションをとっている時、最も近い敵」を敵としないようにするには、AISetting["OWNER_ATTACK_LENGTH"]を0にします。
敵とは?
AISetting["TARGET_ENEMY_MONSTER_ONLY"]に寄ります。
プレイヤーも含めて、敵と考える時は、これを0にします。

一般的な使い方:お友達

お友達機能とは?
プレイヤーをホムにお友達として覚えさせると、何もしていないとき、お友達に対して近づいたり、戦闘中、お友達の敵を攻撃したり、支援をしたりします。
お友達は、移動コマンドで追加します。
お友達設定の移動コマンド
ALT+Tの後、緑(南)に動かします。ここが、お友達機能の移動コマンド開始点です。
緑から赤(東)に移動すると、お友達を追加します。続けて、追加したいプレイヤーの近接セルをクリックします。移動先のセルの1距離以内にいるプレイヤーをお友達に(いなければ)追加します。
緑からピンク(西)に移動すると、お友達を削除します。続けて、削除したいプレイヤーの近接セルをクリックします。移動先のセルの1距離以内にいるプレイヤーをお友達から(あれば)削除します。
緑から水色(南)に移動すると、お友達の敵を攻撃するかの設定を変更できます。北に動かすと攻撃を「する」。ここから南に移動すると「しない」です。

一般的な使い方:学習機能

学習機能とは?
へっぽこAIでは、先攻型にしても、オーナーに「殴っていい」と認められたモンスター以外は攻撃しません。
つまり、たとえ先攻型にしても、「初めて見たモブ」を攻撃することはありません。オーナーが攻撃していいと認めた上で、ホムが「攻撃しても負けないと思う」敵以外は攻撃しません。
オーナーが「攻撃していい」と認めるには、ALT+右クリックを、ゆっくりと2回です。(ホムに攻撃させるコマンドです)
これによって攻撃を開始したモブが、規定時間内(デフォルトでは5秒)に倒せれば、ホムは「攻撃しても負けないと思う」と認識して、リストに追加します。
以降、ホムは先攻型の時、この敵を見つけると自動で攻撃を開始します。
学習機能をオフにする、または強制的に追加する
多くの場合、ホムが5秒以内で倒せる敵というのは、ダメージをまず受けない、攻撃力が明らかに勝っているという、経験値的にはおいしくない敵です。
オーナーと共に行動するホムであれば、もう少し強い敵を攻撃しても、オーナーが護ってくれるでしょう。
オーナーはホムに「殴っていい敵」を、移動コマンドで強制する事ができます。
学習機能の移動コマンド
ALT+Tの後、緑(西)に動かします。ここが、学習機能の移動コマンド開始点です。
緑から水色(北)に移動すると、学習機能がオンになります。
緑からピンク(南)に移動すると、学習機能がオフになります。
緑から赤(西)に移動すると、次に攻撃するモブを叩いていいリストにくわえます。
この設定はリログ、マップ移動、安息されるまでが、次に攻撃するモブです。
ALT+右クリックゆっくり2回で、攻撃を開始してください。これは先攻時でも、非先攻時でも使えます。

一般的な使い方:移動コマンドあれこれ

移動コマンドの開始点
移動コマンドはALT+Tによってホムが近づいてきた場所が開始点です。
この時、ホムの到達点にオブジェクトがあって、ホムが勝手にずれたときは、もう一度ALT+Tする方がいいです。
移動コマンドが切れるとき
移動コマンドはALT+Tを押してから、規定で30秒間有効になります。
この時、オーナーが歩き回っても、規定では7距離以内であれば、ホムは移動しませんので、ホムを移動させるのに自分が邪魔になるときは、歩いてしまって結構です。
移動コマンドが切れると、ホムはオーナーの近接セルに寄ってきます。
移動コマンドにない順序でクリックすると、ホムはオーナーの元に戻ります。(移動コマンドは切れています)
一回の移動が2セル以上になっても、切れます。
移動コマンドが切れたときの注意
ALT+Tを押してホムを呼び寄せた後、一度もホムを動かさないで、(規定では)7距離以上離れると、ホムはオーナーに寄ってきますが、この時、先攻型、非先攻型を問わず、決して攻撃に参加しなくなります。
これは仕様です。
この状態から抜けるには、ALT+右クリックで、適当な位置にホムを一度動かすと、解除されます。(少なくとも2距離以上動けば)
何故このような仕様があるのかというと、先攻型ホムは、殴っていい敵がいると、たとえその近くに強いアクティブの敵がいても、そこに駆け寄ってしまうからです。
この時はALT+Tでホムを呼び戻すと、都合、「決して攻撃しない」モードになるので、オーナーと共に逃亡できるのです。
移動コマンドを受け取ったとき
正常に移動コマンドを受け取ると、ホムは回ります。
何もせずに戻ってきたときは、コマンドを間違えています。

Setting.luaで指定できる全ての設定項目

 移動コマンド以外でホムンクルスの設定を変えるには、Setting.luaを直接メモ帳等のエディタで編集します。

 ただし、Setting.luaの設定よりも、Setting.iniに書かれた設定が優先されますので、Setting.luaを変更した後は、Setting.iniの中身を全て消す事をオススメします。

  • Setting.luaでは、0はオフ、1はオンです。
  • 時間の単位はミリ秒です。(_TICKとなるものです)
  • HP、SP、または_PROBと書かれているものは、基本的に%で設定します。
  • ここに書かれている名称は、AISettin["ATTACK_TYPE"]で言うところの、ATTACK_TYPEの部分です。
ホムンクルスの攻撃に関する設定
名称 取り得る値 デフォルト 説明
ATTACK_TYPE BAT_FIRST_DISABLE = 0 -- 非先攻
BAT_FIRST_ENABLE = 1 -- 先攻
BAT_NONE = 2 -- 決して攻撃に参加しない
BAT_FIRST_DISABLE  この設定はホムの攻撃属性を変更します。
 移動コマンドからも変更可能です。
OWNER_ATTACK_LENGTH 任意の整数 2  この設定は、オーナーが攻撃している敵を敵と認識する時、その最大の範囲を指定します。
 例えば、草を殴るときにホムに手伝わせるには、2程度あれば十分です。
 この距離を-1にすると、オーナーが攻撃しても、その敵を敵と認識しなくなります。(-1にすると、草刈りを手伝ってくれなくなります)
TARGET_ENEMY_DISTANCE 任意の整数 10  先攻時、この距離以内にいる敵を敵と見なします。
 これより遠くにいるモブには、タゲられても無視します。
TARGET_ENEMY_MONSTER_ONLY 0、または1 1  ターゲットする敵をモブのみとするには1とします。
 これが0の時、ユーザーキャラクターもターゲットの対象になります。Pvや攻城戦で利用します。
TARGET_ENEMY_FRIENDS_TARGET 0、または1 0  お友達機能を使っている時、お友達がターゲットされた敵を、敵と認識するかを設定します。
 移動コマンドから設定可能です。
OTHER_TARGET_ENEMY_BUTTING_RANGE 任意の整数 6  他人をターゲットしているモブを盗む距離。
 この設定は、他人をタゲっていて、戦闘状態にない(その他人がモブに攻撃をしていない)モブに、先攻で攻撃に行くとき、他人とモブの距離がこの距離以上であれば、先に殴ります。
 この値を100等の大きな値にすると、他人をタゲっていて、戦闘状態にないモブに対しての攻撃をしなくなります。
FOLLOW_OWNER_TARGET 0、または1 6  攻撃時、オーナーのターゲットを優先して攻撃する場合は1。ホムが自分の敵を優先する場合は0。
 移動コマンドから設定できます。
ホムンクルスの学習に関する設定
名称 取り得る値 デフォルト 説明
MONSTER_LIST_ADD 0、または1 1  オーナーの指示で攻撃したとき、その攻撃対象となったモブを、殴っていいリストにくわえていいかを指定します。
 1でくわえ、0でくわえません。
 移動コマンドから設定可能です。
MONSTER_LIST_ADD_TICK 任意の自然数 5000  オーナーの指示で攻撃したとき、その攻撃対象となったモブを、殴っていいリストにくわえていい場合、ここで指定されたミリ秒以下で倒せれば、リストに追加します。
 この値が0の時は、MONSTER_LIST_ADDが0である時と同じです。
ホムンクルスの移動に関する設定
名称 取り得る値 デフォルト 説明
AUTO_FOLLOW_DISTANCE 任意の自然数 3  ホムが移動コマンド中でないとき、オーナーがこの距離より遠くになったときにホムはオーナーに近づきます。
MOVECOMMAND_CANCEL_DISTANCE 任意の自然数 7  ホムが移動コマンド中の時、オーナーがこの距離より遠くになったときにホムはオーナーに近づき、移動コマンドをキャンセルします。
FAST_WALK 0、または1 1  ホムが移動するとき、現在の位置からオーナーへの、最も近い近接セルに対して移動をするかを指定します。
 1でオン、0でオフです。
AUTO_ESCAPE 0、または1 1  ホムが戦闘中、HPが危険な状態になったとき、攻撃をやめてオーナーとモブを結ぶ直線上の、モブに対するオーナーの背後に回り込むかを設定します。
 この行為を「自動逃亡」と言います。
AUTO_ESCAPE_HP 0〜100の自然数。 30  自動逃亡を開始するHPを、パーセントで指定します。
 ここで0を指定すると、AUTO_ESCAPEを0にするのと同じです。
 この値を100か、またはそれ以上にはしないでください。
AUTO_ESCAPE_PROB 0〜100の自然数。 80  自動逃亡をする確率を指定します。
 100にすると、HPが危険になったときは、必ず自動逃亡します。
 0にすると、UTO_ESCAPEを0にするのと同じです。
AUTO_ESCAPE_STOP_OWNER_HP 0〜100の自然数。 10  自動逃亡全ての自動逃亡の設定を無視して、逃亡を禁止する、オーナーのHPをパーセントで指定します。
 ホムはオーナーのHPがこのパーセント以下になると、自分が危険であっても、踏みとどまります。
 0にすると、この機能をオフにするのと同等です。
ホムンクルスのスキルに関する設定
名称 取り得る値 デフォルト 説明
AUTO_TOUCH_OF_HEAL_LEVEL 0〜5の自然数。 5  自動で治癒の手を使う時のレベルを指定します。
 0でランダムです。
AUTO_EMERGENCY_AVOID_LEVEL 0〜5の自然数。 0  自動で緊急回避を使う時のレベルを指定します。
 0でランダムです。
AUTO_CASTLING_LEVEL 0〜5の自然数。 5  自動でキャスリングを使う時のレベルを指定します。
 0でランダムです。
AUTO_DEFENCE_LEVEL 0〜5の自然数。 0  自動でディフェンスを使う時のレベルを指定します。
 0でランダムです。
AUTO_MOONLIGHT_LEVEL 0〜5の自然数。 0  自動でムーンライトを使う時のレベルを指定します。
 0でランダムです。
AUTO_FLEET_MOVE_LEVEL 0〜5の自然数。 0  自動でフリートムーブを使う時のレベルを指定します。
 0でランダムです。
AUTO_OVERED_SPEED_LEVEL 0〜5の自然数。 0  自動でオーバードスピードを使う時のレベルを指定します。
 0でランダムです。
AUTO_CAPRICE_LEVEL 0〜5の自然数。 5  自動でカプリスを使う時のレベルを指定します。
 0でランダムです。
AUTO_CHAOTIC_VENEDICTION_LEVEL 0〜5の自然数。 5  自動でカオティックベネディクションを使う時のレベルを指定します。
 0でランダムです。
リーフのスキルに関する設定
名称 取り得る値 デフォルト 説明
AUTO_TOUCH_OF_HEAL 0、または1。 1  1でホム自身への治癒の手を有効にします。0で無効です。
AUTO_TOUCH_OF_HEAL_HP 0〜100の自然数。 20  ホムのHPがこれ以下のパーセントになったとき、治癒の手を使用します。
AUTO_TOUCH_OF_HEAL_PROB 0〜100の自然数。 60  ホムのHPが指定されたパーセント以下になったとき、治癒の手を発動する確率です。
AUTO_TOUCH_OF_HEAL_OWNER 0、または1。 1  1でオーナーへの治癒の手を有効にします。0で無効です。
AUTO_TOUCH_OF_HEAL_HP_OWNER 0〜100の自然数。 20  オーナーのHPがこれ以下のパーセントになったとき、治癒の手を使用します。
AUTO_TOUCH_OF_HEAL_PROB_OWNER 0〜100の自然数。 60  オーナーのHPが指定されたパーセント以下になったとき、治癒の手を発動する確率です。
AUTO_TOUCH_OF_HEAL_FRIENDS 0、または1。 1  1でお友達への治癒の手を有効にします。0で無効です。
AUTO_TOUCH_OF_HEAL_HP_FRIENDS 0〜100の自然数。 20  お友達のHPがこれ以下のパーセントになったとき、治癒の手を使用します。
AUTO_TOUCH_OF_HEAL_PROB_FRIENDS 0〜100の自然数。 60  お友達のHPが指定されたパーセント以下になったとき、治癒の手を発動する確率です。
MUST_TOUCH_OF_HEAL_HP 0〜100の自然数。 60  自分、オーナー、またはお友達(設定による)のHPがこのパーセント以下になったときは、確率に寄らず、必ず治癒の手を使う。
 この設定は全ての治癒の手に関しての設定に優先されるので、治癒の手を完全に禁止するには、これを0にしなければならない。
AUTO_EMERGENCY_AVOID 0、または1。 1  1でホムが危険な時、緊急回避を行う。
AUTO_EMERGENCY_AVOID_HP 0〜100の自然数。 10  ホムのHPがこれ以下のパーセントになったとき、緊急回避を使用します。
AUTO_EMERGENCY_AVOID_PROB 0〜100の自然数。 80  ホムのHPが指定されたパーセント以下になったとき、緊急回避を発動する確率です。
AUTO_EMERGENCY_AVOID_OWNER 0、または1。 1  1でオーナーが危険な時、緊急回避を行う。
AUTO_EMERGENCY_AVOID_OWNER_HP 0〜100の自然数。 10  オーナーのHPがこれ以下のパーセントになったとき、緊急回避を使用します。
AUTO_EMERGENCY_AVOID_OWNER_PROB 0〜100の自然数。 90  オーナーのHPが指定されたパーセント以下になったとき、緊急回避を発動する確率です。
アミストルのスキルに関する設定
名称 取り得る値 デフォルト 説明
AUTO_CASTLING 0、または1。 1  1でホムからオーナーへのキャスリングを有効にします。0で無効です。
 キャスリングは、ホムは自分のオーナーをできる限り危険にさらさないようにします。
AUTO_CASTLING_HP 0〜100の自然数。 10  ホムのHPがこれ以下のパーセントになったとき、キャスリングを使用します。
AUTO_CASTLING_STOP_HP_OWNER 0〜100の自然数。 60  キャスリングしようとしたとき、オーナーのHPがこのパーセント以上でなければ、キャスリングしない。
AUTO_CASTLING_PROB 0〜100の自然数。 90  ホムのキャスリングが発動する確率です。
AUTO_CASTLING_OWNER 0、または1。 1  1でホムは、オーナーの状態をみて、キャスリングします。
 この設定はオーナーの危機にホムがキャスリングする設定ですので、ホムはオーナーを危険から遠ざけるためにキャスリングします。
 よって、ホムは自分がタゲを抱えている時などは、キャスリングしません。
AUTO_CASTLING_HP_OWNER 0〜100の自然数。 10  オーナーのHPがこれ以下のパーセントになったとき、キャスリングを使用します。
AUTO_CASTLING_PROB_OWNER 0〜100の自然数。 90  オーナーへのキャスリングの発動する確率です。
AUTO_DEFENCE 0、または1。 1  1でホムは、戦闘開始前に持続時間が切れていれば、ディフェンスを使用します。
AUTO_DEFENCE_SP 0〜100の自然数。 20  ホムのSPがこれ以下の時は、ディフェンスを使用しません。
フィーリルのスキルに関する設定
名称 取り得る値 デフォルト 説明
AUTO_MOONLIGHT 0、または1。 1  ムーンライトを自動で使用する場合は1。使用しない場合は0。
AUTO_MOONLIGHT_SP 0〜100の自然数。 20  ホムのSPがこれ以下の時は、ムーンライトを使用しません。
AUTO_MOONLIGHT_PROB 0〜100の自然数。 20  ムーンライトを使用するときの、使用する確率です。
AUTO_FLEET_MOVE 0、または1。 1  戦闘開始前にフリートムーブを自動で使用する場合は1。使用しない場合は0。
AUTO_FLEET_MOVE_SP 0〜100の自然数。 20  ホムのSPがこれ以下の時は、フリートムーブを使用しません。
AUTO_OVERED_SPEED 0、または1。 1  戦闘開始前にオーバードスピードを自動で使用する場合は1。使用しない場合は0。
AUTO_OVERED_SPEED_SP 0〜100の自然数。 20  ホムのSPがこれ以下の時は、オーバードスピードを使用しません。
バニルミルトのスキルに関する設定
名称 取り得る値 デフォルト 説明
AUTO_CAPRICE 0、または1。 1  カプリスを自動で使用する場合は1。使用しない場合は0。
AUTO_CAPRICE_SP 0〜100の自然数。 20  ホムのSPがこれ以下の時は、カプリスを使用しません。
AUTO_CAPRICE_PROB 0〜100の自然数。 5  カプリスを使用するときの、使用する確率です。
AUTO_CHAOTIC_VENEDICTION 0、または1。 1  カオティックベネディクションを自動で使用する場合は1。使用しない場合は0。
AUTO_CHAOTIC_VENEDICTION_HP 0〜100の自然数。 10  ホムのHPがこれ以下の時、カオティックベネディクションを使用します。
AUTO_CHAOTIC_VENEDICTION_HP_OWNER 0〜100の自然数。。 10  オーナーのHPがこれ以下の時、カオティックベネディクションを使用します。
AUTO_CHAOTIC_VENEDICTION_PROB 0〜100の自然数。 50  カオティックベネディクションを使用する確率です。
その他の設定
名称 取り得る値 デフォルト 説明
IDLE_MOTION 0、または1。 1  何もしていないとき、ホムが何かをするかを指定します。
 1で何かをします。0で何もしません。
IDLE_MOTION_REST 0〜100の自然数。 90  何もしていないとき、ホムは自分のHPとSPが両方ともこのパーセントより大きいとき、何かをする。
IDLE_MOTION_PROB 0〜100の自然数。 20  何もしていないとき、ホムは勝手に何かをする確率です。
 あまり大きくすると、ホムがせわしなく動くのでオススメしません。
IDLE_MOTION_INTERVAL 任意の自然数。 20  ホムが勝手に動く、最低限のインターバルをミリ秒で設定します。
 あまり小さくするとせわしなく動くのでオススメしません。

開発者向け

ルキノ 「はい、そんなわけで、へっぽこAIの、開発者向けセクションですよ。

 このセクションでは、AIの設計方針的なものとか、サポートする汎用の関数とかの仕様の話をメインにしつつ、プログラムの拡張がしてーよとかって人、AI作ってる人とかに向けた話をしますよ。

 何はともあれ、使用される言葉の定義と、Setting.luaで指定できる全ての設定項目は目を通しておいてくださいませよ。

 つーか、へっぽこのホムのために作ったAIなのに、あたしが細かく説明する必要、あんのかなー」

開発者向けセクションで使用される言葉の定義

メソッド
関数の事はメソッドで統一します。
ベクタ
ベクトルのことを言っています。
ベクトルで統一しているつもりですが、表記揺れがあるかも知れません。

基本的な方針

ファイルの数
ファイルは意図的に数が多いです。
これはLuaスクリプトがオブジェクト指向的な書き方よりも構造化言語的なプログラミングスタイル向けに作られていると思うからです。
各ファイルはそれぞれ、意図的な「あるひとつの機能」のために存在しています。
例えば、AI.luaはAIの開始点のためにあります。CustomAI.luaは、カスタムされたホムのAIを書くために存在しています。
なので、オブジェクト指向的に言えば、ファイルは1つのクラス的なものです。
それぞれのファイルが何のために存在していて、どんな機能を提供するかは、以下のテーブルを参照してください。
複雑性の回避
可能な限り複雑性を回避するようにしています。
可読性と速度では、可読性を意識しています。
ファイル内でも、機能毎にあえて、do endで囲って、その責務を明確にしています。
メソッド、または変数の命名規則
メソッドはパスカル形式で命名しています。
変数はキャメルです。
グローバル変数(do endで囲まれてはいるが、グローバルの意味あいのものを含む)は、プロパティと同様に、パスカル形式で命名しています。
定数は慣例に習い、全て大文字の_で繋いだ形式を使用しています。
エディタ
タブサイズは4です。
TepaEditorを使用しましたので、TepaEditor用のLuaスクリプト定義ファイルを用意しました。
TepaEditor用のLuaスクリプト定義ファイルを、このAI用に(Constの値や、Globalの値、AI仕様書にある関数に色が付く)、Lua(Ragnarok)用スクリプト定義ファイルを用意しました。
各ファイルとその責務
ファイル名 説明
AI.lua  エントリポイントであるAIメソッドがあります。
 ステートマシンであるホムのAIのステートを判定するものだけがあります。
 バージョンはここに記載されています。
AttackList.lua  ホムに許可する攻撃対象のリスト、及びその設定へのメソッドを公開するファイルです。
 攻撃対象は移動コマンドから設定できますが、その責務はありません。
Const.lua  デフォルトにあるものです。
 何も足さない、何も引かない。
 あ、コメント足したかも。
CustomConst.lua  追加定義された定数を記述するものです。
 スキルのIDや、ディレイ、持続時間、キャラクターの職ID等がまとめられています。
CustomAI.lua  デフォルトのAI.luaを元に、拡張されたAIの基本となるファイルです。
 すなわち、AI.luaはすでにデフォルトのものではなく、その原型をとどめていません。これは、このファイル、及び、CustomState.lua、CostomProcess.luaに分割、拡張されています。
 CustomAIは、機能毎にdo endで囲まれています。(例えば戦闘、例えば移動)
 それらを分割して拡張して行くこともできます。
CustomProcess.lua  デフォルトのAI.luaから、ProcessCommandの部分を抜いて拡張したものです。
 これはユーザーからの入力を受け取って、ホムのステートを変更するためのものです。
CustomState.lua  デフォルトのAI.luaから、StateProcessの部分を抜いて拡張したものです。
 これは現在のホムのステートを処理するもので、CustomAI.luaに強く依存します。
CustomUtil.lua  拡張された、AIそのものとは無関係とも言えるメソッドを集めたものです。
 これはCunstomConst.luaとVector.lua、Setting.luaを必要としますが、メソッドによってはコピペで別のAIにも組み込めるものです。
Friend.lua  お友達機能を提供するものです。
 お友達機能は移動コマンドから追加削除ができますが、その責務はここにはありません。
GlobalVariable.lua  デフォルトのAI.luaに記述されたGlobalVariableを書き出し、追加したものです。
 ここに記述された変数は、何時何時変更されるかは、保証されるものではありません。
MoveCommand.lua  移動による設定変更、すなわち、移動コマンド機能を記述するものです。
 これはFriend.luaやSetting.luaに強く依存します。
Setting.lua  ホムの設定の全てを統括するもので、ユーザーによって書き換えられる事を前提とするものです。
 変更されうる可能性のあるものは、可能な限り定数やコードへの埋め込みは行わず、このファイルに記述しています。そのため、かなり大きいです。
TraceUtil.lua  TraceAIをラップしたようなものです。
 TraceAIを普通にコードに埋め込んでしまうと、必要なログが埋もれてTraceAI.txtの可読性が落ちるので、これを利用しています。
Util.lua  デフォルトのUtil.luaです。
Vector.lua  2次元ベクトルを用いて、アクタをベクトルとして演算するためのものです。

TraceUtilについて

 へっぽこAIではTraceAIメソッドを直接呼ぶことはしません。
 これはトレースログを収集する際に、TraceAIがコードの様々な場所に埋め込まれていると、ログが煩雑になって問題を把握しにくくなるからです。

 TraceUtil名前空間(としているもの)は、いくつかのメソッドを持ち、それらは各々、役割を担って、ログを書き出します。
 以下はログを書き出すためのメソッドと、その主な使われ方です。

TraceUtil名前空間のメソッド
メソッド名 戻り値 引数 説明
TraceUtil.Debug void string message  TraceAIにデバッグとして書き込みます。
 主に値の確認、及びデバッグ時に利用して、終わった後には消すものを書き出すために使います。
TraceUtil.Hack void string message  TraceAIにハックとして書き込みます。
 主に値の調査に利用します。終わった後には消すものです。
TraceUtil.EventRaised void string message  TraceAIにイベントが起こったとして書き込みます。
 Luaには明確なイベントの定義はないので、主にOn〜のためにあります。元々組み込まれていたOn〜のメソッドは大抵これです。
 イベントメソッドの頭でそのイベント名を書きだし、消さずに残しておくべきものです。(経路把握のため)
TraceUtil.FunctionCall void string message  TraceAIにメソッドを呼び出した時に、その事実を書き込むために使用します。
 メソッドの頭でそのイベント名を書きだし、消さずに残しておくべきものです。(経路把握のため)
TraceUtil.StateChanged void string beforState, string afterState, string reason  TraceAIにステートが変更された時に、その事実を書き込むために使用します。
 ステートが変更される時に、その直前か直後に変更前と変更後の文字列を送り、その理由を書き出します。
 このメソッドはステートの変更状況を把握するために、残しておくべきもので、ステートを変更する際には、必ず使用するべきです。

 このように、トレースしたい内容毎に呼び出すものを変え、実際にTraceAIを呼び出すかどうかをTraceUtil.〜Enabledメソッドによって決定しています。
 これはデフォルトでは全てfalseですが、不具合の追跡や、ステートの変更状況を知りたいとき等に、必要に応じてtrueにして、トレースログを収集できます。

 現在のステートがわからないとき(MyStateは文字列ではないので、基本的にはわからない)、TraceUtil.StateChangedの第一引数には、TraceUtil.GetStateStringメソッドの戻り値を使うことができます。
 TraceUtil.GetStateString(MyState)より得られる文字列は、現在のステートを文字列としたものです。

Vectorについて

 へっぽこAIでは、ホムの移動や距離に関しては、二次元ベクトルを多用しています。
 基本的に使っているのは、ベクトルの足し算、引き算、回転、正規化(単位ベクトル)ですが、ベクトルの知識があると、少し楽ができるかも知れません。

 例えば、オーナーとモブの2点があるとき、ホムをモブとオーナーを結ぶ直線の、モブに対するオーナーの背後に移動させたいとき(自動逃亡のロジックです)、ベクトルを用いれば、オーナーのベクトルをov、モブをoeとすると、oe-ovによって求められるevは(位置的な問題ではなく、方向的な問題として)、モブからオーナーへのベクトルとなります。このベクトルの単位ベクトル(ノーマライズ)を求め、ovに足すと、それによって求められるxとyは、オーナーの背後セルの位置になります。

 Vectorではベクトルを用いた様々な処理がありますが、足し算、引き算、回転、正規化以外では、象限をえるQuadrantがあります。これは単純にアクタのx,yから求められた値では1しか返しませんが、3つの点が存在するとき、在る点に向かって、2つの点がどのような向きになっているかを知ることができます。(自動逃亡で利用しています。つまり、ホムとモブはオーナーを中心にして、必ず向き合うようになるのです)

 自動逃亡のロジックについては、CostomAI.luaのAutoEscapeか、またはCustomState.luaの、OnESCAPE_STあります。

MoveCommandについて

 移動コマンドでは、すでにあげているように、全てのSetting.luaの設定を網羅していませんし、網羅する予定もありません。
 ただし、それほど難しいものでもないので、追加する事は可能でしょう。

 移動コマンドはCheckMoveCommandが移動の度に呼ばれます。
 ここで、「1歩目の移動方向」によって、分岐します。呼び出されるOn〜Commandは、(現在では)戦闘の設定、スキルの設定、お友達の設定、学習機能の設定です。

 コードを見ればわかるように、これは8つの方向(斜めを含む)にまで拡張できます。

 現在の移動回数をnとすると(それはMovingList.Length(MoveCommand)で知れます)、ひとつ前の位置と現在の位置は、MoveCommand[n-1], MoveCommand[n]です。
 この2つの位置が、果たしてどのような方向に向かって動いたのかを知るには、GetMoveDirectionです。GetMoveDirection(MoveCommand[n-1], MoveCommand[n])とすることにより、8つの方向属性のいずれか(またはMOVE_UNKOWN)が取得できます。

 何歩をどのように歩いてきたかで、AISettingの値を変更します。

CustomConstについて

 このファイルには定数が書き込まれています。
 実際にへっぽこAIでは使われていないものもあります。

 もしもスキルの詠唱時間やディレイが変更になった場合は、このファイルを修正してください。

 なお、ステートに追加されているSTANDBY_STは、初期状態のステートで、ここからIDLEに変わります。
 ホムがAIをロードしたタイミングで何かをさせるには、このステート時か、またはCustomAI.luaのCustomAIInitializeに実装するといいです。(例えばスキルの持続時間やディレイはマップ移動をサポートしないので、それらをサポートするように、ファイルに書き出すように修正するのならば、このタイミングでロードできる。ちなみにスキルのディレイ等はCustomAIにまとめられている)

CustomAIについて

 このファイルはAIのキモとなる部分です。

 基本的にへっぽこAIはこのファイル内にある様々なメソッドにより、動作を決定します。
 呼び出しを変更しないのであれば、機能の追加、及び修正は容易です。例えば回転に関しての動きをスムーズにするためにどきどきAIにあるような8点の回転に修正する場合、BeginRotateメソッド、Rotateメソッドを修正すれば可能です。(へっぽこAIの回転が美しくないのは手抜きです)

 戦闘開始時、ホムに何かしらの動作(スキル等)をさせるには、OnStartAutoFightイベントを拡張します。

 アイドル中のお遊び動作を増やすには、IdleMotionメゾッドを拡張します。(このメソッドはいい加減なので、少々骨が折れるかも知れませんが)

CustomUtilについて

 このファイルは、汎用的なカスタムされたメソッドを提供します。
 Setting.luaやCustomConst.lua、Vector.luaにある程度依存しますが、ここで提供されるメソッドは他のAIにも利用できるものです。

 以下にCustomUtilの全メソッドとその戻り値、引数、機能を記載します。

汎用的なCustomUtilのメソッド
メソッド名 戻り値 引数 説明
Random number number max  maxを最大とした乱数を生成します。その値の範囲は1〜maxまでです。
 へっぽこAIでは、math.randomを直接呼びません。必ずこのメソッドを通して呼び出します。なぜならば、Luaの乱数がどの程度のものなのかわからないためです。
 乱数の精度を気にするのであれば、このメソッドを修正してください。
Contains bool table list, object value  指定されたlistテーブルの中にvalueが含まれていればtrueを返します。
ホムや、指定されたidを判定するIsなCustomUtilのメソッド
メソッド名 戻り値 引数 説明
IsLIF bool  GlobalVariableに依存します。
 MyIDがリーフの種類であればtrueを返します。
IsAMISTR bool  GlobalVariableに依存します。
 MyIDがアミストルの種類であればtrueを返します。
IsFILIR bool  GlobalVariableに依存します。
 MyIDがフィーリルの種類であればtrueを返します。
IsVANILMIRTH bool  GlobalVariableに依存します。
 MyIDがバニルミルトの種類であればtrueを返します。
IsHomunclus bool number id  idがホムであればtrueを返します。
IsPet bool number id  idがペットであればtrueを返します。
IsAlive bool number id  idが生きていればtrueを返します。
 モンスターが死んでいるか等に利用します。
IsPlayer bool number id  idがプレイヤーであればtrueを返します。
状態を取得するためのCustomUtilのメソッド
メソッド名 戻り値 引数 説明
GetHPPercent number number id  idのHPをパーセントで取得します。
GetSPPercent number number id  idのSPをパーセントで取得します。
GetSkillDelay number number skillId, number level  skillIdで指定されたスキルの、level時のディレイを取得します。
 これはCustomConst.luaに依存します。
GetSkillDuration number number skillId, number level  skillIdで指定されたスキルの、level時の持続時間を取得します。
 これはCustomConst.luaに依存します。
GetCastLevel number number skillId  skillIdで指定されたスキルの、詠唱レベルを取得します。
 これはCustomConst.luaとSetting.luaに依存します。
周囲の状態を取得するためのCustomUtilのメソッド
メソッド名 戻り値 引数 説明
GetUsers table  周りのユーザーを取得します。ここで言うユーザーは、モンスターでなく、オーナーでなく、自分でないものです。
 取得される結果は、tablelistです。
GetTargetCount number number id  指定されたidをターゲットしている数を取得します。
 モンスターであるかプレイヤーであるかは判定しません。
GetTargetActors table number id  指定されたidをターゲットしているアクタを取得します。
 取得される結果はtablelistで、モンスターであるかプレイヤーであるかは判定しません。
GetTargets number, table number id  指定されたidをターゲットしている数と、アクタを取得します。
 返される2つの値のうち、アクタはtablelistで、どちらとも、この数、及びリストでは、モンスターであるかプレイヤーであるかは判定しません。
GetActorsForId table number id  指定されたidをの1距離以内にいるアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetActorsForPosition table number x, number y  指定されたx, y位置から、1距離以内にいるアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetActorsForIdA table number id, number dis  指定されたidのdis距離以内にいるアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetActorsForPositionA table number x, number y, number dis  指定されたx,y位置から、dis距離以内にいるアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetNearestActor number number id, table actors  指定されたidに最も近いアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetNearestActorA number number id, table actors, number dis  指定されたidに、dis距離以内で最も近いアクタを取得します。
 このアクタはモンスターであるかプレイヤーであるかは判定しません。
GetVector Vector number id  指定されたidのベクトルを取得します。
 Vector.luaに依存します。
ToTargetVector Vector number myId, number targetId  myIdからtargetIdへのベクトルを取得します。実際はSubtractしているだけです。
 Vector.luaに依存します。
GetPositionToOwnerForNearestDistance number x, number y number myId, number dis  myIdからオーナーへの、dis距離の位置にある、最も近いx, yを取得します。
GetPositionForNearestDistance number x, number y number myId, number targetId, number dis  myIdからtargetIdへの、dis距離の位置にある、最も近いx, yを取得します。
その他のCustomUtilのメソッド
メソッド名 戻り値 引数 説明
MoveToOwnerEx void number myId  myIdをオーナーに近づけます。
 MoveToOwnerとの違いは、このメソッドではオーナーの1距離の位置に接近することです。

ルキノ 「とまぁ、そんな感じで。

 開発者向けセクションに追加して欲しい説明等がありましたら、BBSにでも。

 つーか、へっぽこのホムのために作ったAIなんだよなー。(2回目)」