+ Mercurius Flask -
 
What's this page ?

 ようやっと実装されたホムンクルスについて、主にAIスクリプトを中心にチラシの裏的に書きなぐるメモ書きページです。

RagNav AI Download

 うちで使用しているAIです。自己責任にて、ご自由にご使用ください。
 なお、カスタマイズについてはAI.lua内の動作カスタマイズ定数定義のあたりを見て下さい。
 そろそろ機能や操作方法について、もうちょっとちゃんとした説明ページ作った方がいい気がしてきました……。

【 最新版 : RagNav AI version 1.14

[ 主な機能 ]
・基本は非先攻モード
・先攻モードでの横殴り軽減処理(+索敵範囲を調整可能)
・お散歩モード(HP、SPが一定以上の時、待機中にうろうろ移動します。二種類から選択可能 New!
・見回りモード(Alt + 右クリックで移動させた時、指定座標周辺でくるくると索敵をしてから戻ってくる)
・HPが一定以下になると、ケミの側へ逃げてくる(攻撃しなくなります)
・ホムンクルス種別毎の思考によるオートスキル(リーフ未対応、バニルミーのカオティックベネディクション未対応)
・くさむしれモード(指定した草を見つけたら先攻モード問わず自発的に刈りに行きます。草よりは敵優先)
New! PCキャラの足元をAlt + 右クリックで友達登録(ケミが立っていればリロードで忘れる一時友達、座っていれば記憶する友達)
New! 任意の地面をAlt + Shift + 右クリックで、指定座標に留まる(攻撃可能な敵がいれば先攻モードに従って攻撃)

[ バグについて ]
 挙動としておかしなものの他に、構文エラーや「にるぽ!」等によるAIのエラー停止があります。当AIでは、こうした回復不能なエラーが発生した場合にUSER_AI以下にerror_log.txtを書き出してホムンクルスが一歩も動かなくなります。こうした状況になりましたら、error_log.txtの中身をお知らせいただけると幸いです。なお、その際にTraceAIの出力結果ももしあれば、一緒に教えてもらえると助かります。

[ 今後の予定 ]
 今までデフォルトAIをベースに色々書き足した無駄だらけのコードでしたが、現在全面的にリライトした次期バージョンver2.xの開発を行っています。公開までにはもうしばらくかかりますが、リライトしてコードを整理するだけでなく色々な機能が追加される予定です。全面改訂を前提としている為、現行のver1.xからのConfig.luaの引継ぎはできなくなる予定です。ご了承下さい。
 ……とか言いつつ、最近停滞しっぱなしです。特に意欲がわいてないというのも大きいのですが(ノ∀`)
 ver1.x系列のぷちバージョンアップが続く日々。

[ 履歴 ]
・ver1.13 ( 2008/1/27 release )
 - 草判定にて、黒きのこと赤きのこが識別できていなかったのを修正。
・ver1.13 ( 2008/1/18 release )
 - 羊用うろうろ散歩に、各ポイント滞在時間と一周毎のウェイト時間設定をConfig.luaに追加。
・ver1.12 ( 2007/12/19 release )
 - 非移動長射程モンスターに対して、攻撃中も一定間隔で再移動を行う処理を追加。(重力座標対策テスト版)
 - 非移動モンスターに最近追加された新モンスターの一部を追加。(ドロセラ、マスキプラー)
・ver1.11 ( 2007/5/6 release )
 - 戦闘中等にホムをリロードした場合、同じ敵に攻撃させようとすると横殴り判定に引っかかって指示を受け付けなかったのを修正。
・ver1.10 ( 2007/3/24 release )
 - 先攻モードなのに先攻しなくなっていたので修正。
・ver1.09 ( 2006/11/12 release )
 - 友達を攻撃している敵へ向かう際、友達のターゲットがその敵にあるとホムが動かなくなる不具合を修正。
・ver1.08 ( 2006/9/17 release )
 - FOLLOW_ATTACK_CANCELの距離設定で、交戦中にケミへ戻ろうとするとフリーズ状態に陥る不具合を修正。
・ver1.07 ( 2006/9/13 release )
 - ホムのタイプ判定ミスの副作用(進化・未進化含む)で、オートスキルが正しく発動できなかった不具合を修正。
・ver1.06 ( 2006/9/4 release )
 - 友達登録機能を実装。
  ケミが座っている時に相手の足元をAlt + 右クリックで友達リストファイルに追加・削除(トグル切り替え)
  ケミが立っている時に相手の足元をAlt + 右クリックすると、ファイルには記録しない一時的な友達として扱います。
  友達登録されたキャラは主人に準じる扱いとなり、共闘を行います。(優先度は主人ケミの方が上)
 - 指定座標から動かず攻撃できる相手にだけ攻撃を行うホールドモードを実装。
  任意の地面をAlt + Shift + 右クリックすると、その座標へ移動し、以後は攻撃可能な距離に近づいてきた敵にだけ攻撃。
  敵の選択は先攻・非先攻の設定に従います。
  基本的に隣接してきた敵にだけ攻撃しますが、ホムンクルスの種類・オートスキルの設定によっては遠距離攻撃あり。
  ケミから最大距離以上離れたり、Alt + Tを指定することで戻ってきます。
・ver1.05 ( 2006/8/30 release )
 - 先攻設定時、プパ・ペコ卵等の非反撃Mobの隣で攻撃せずにスタックしていたのを修正。
  ひとまず自分から攻撃にはいかないようになりました。
 - 先攻設定時、索敵反応距離の設定を無視して、全画面が対象になっていたのを修正。
 - 攻撃した敵が死亡した後、一旦ケミのそばに戻ってきてから次の行動を行っていたのを
  その場で次の敵がいたら、ケミのそばに戻らずに連続して攻撃を行うよう変更。
  多少テンポはよくなると思います。
・ver1.04 ( 2006/5/6 release )
 - バイオプラントのうち、ジオグラファーが召喚者にヒールすると攻撃してしまうのを修正。
・ver1.03 ( 2006/4/30 release )
 - バイオプラント系を攻撃対象候補から外すようにしました。
  マリンスフィアだけ区別つきませんが、非反撃Mobの方でチェックしてるのでいいかな、と…。
 - Config.luaに ATTACK_DELAY 定数を追加。攻撃モーションをしっかり見せる為の間引き間隔設定。
  2〜3程度が妥当で、それ以上にすると実際の攻撃速度まで低下してしまうので注意。
・ver1.02 ( 2006/3/26 release )
 - オートスキルの拡張実装(アミストル全般、及びバニルミルトのカプリス)
 - アミストル専用うろうろモード実装(時計周りに円を一歩ずつ刻みます。催眠効果アリ)
 - カスタマイズ変数群をConfig.luaに分離。
・ver1.01 ( 2006/3/25 release )
 - 草にムーンライト等を使ってしまう不具合を修正。
 - 非反撃Mobについて、ケミが殴っている間だけ一緒に攻撃するように。
 - 初撃確定ムーンライトを実装。
  通常のオートムーンライト以外に、初回攻撃に必ず指定Lvムーンライトが使えます。初期設定ではLv1。
 - 攻撃中、ケミに置いていかれそうになったら攻撃をやめてケミを追いかけます。初期設定では12セルが判定距離。
・ver1.00 ( 2006/3/21 release )
 - オートスキルはフィーリル専用。

Homunculus type

 ホムンクルスは種類によってその特性やスキル傾向が結構違います。この為、オートスキルに限らず行動パターンそのものについても、本当はホムンクルス毎に別々にコーディングした方が最適かと思います。以下は、そんなコーディングに関するメモ書き。
リーフ
 回復支援特化です。直接戦闘については多分果てしなく茨の道。MATKは結構伸びるようですが、MATKを生かすようなスキルがまだ実装されてません。メンタルチェンジがやってくるまでの辛抱です。当面は、プレイヤー支援と自己回復、緊急回避を主体にしたアルゴリズムでいいと思います。ただし、治癒の手ヒールがレッドスリムを使うので、緊急回避を主体にしたコードのが多分使いやすいかも。治癒の手って、なんかプレイヤーを回復させると言いながら内部的には自分をターゲット指定して召喚者を回復させる?という話も聞いたりするので、そうなるとヒール砲としては使えないのかもしれません。が、ヒール砲として運用することがもしできたら、それを軸にした攻撃系アルゴリズムも面白いかも。

アミストル
 眠れる 執事 羊。攻撃に関しては可も不可もなく。防御が高いということですが、乗算DEFじゃなくて減算DEFという噂。結構育ってからじゃないと、防御力については実感できないかもしれませんね。これといった攻撃スキルがないので、これもプレイヤー支援、ピンチ時の防御を主体にしたアルゴリズムでいい筈。ブラッドラストが来たら、攻撃アルゴリズムを強化するのも面白そうです。
 その防御アルゴリズムですが、ディフェンスは正直使いにくい気がしますので、低Lvを常時かけ直しというスタイルでもいいかも。高Lvは持続時間が短いくせにSP消費がでかいですし。むしろキャッスリングによる位置・タゲ交換を如何に駆使させるかを追及すると面白いでしょう。ケミがピンチの時に使わせて急場を凌いだり(羊が死んでも泣かない)、その後羊を犠牲にして逃げようとするケミを羊が強引に引き戻してご主人様殺しをさせたり、色々とネタも考えられますが、使い方によっては上手いタゲコントロールを実現できる可能性があります。……が、逆に変なアルゴリズムにすると迷惑になりかねないので、ご注意を。

フィーリル
 みんな大好き、直接戦闘ならお任せの鳥。耐久力以外ではピカイチ。逆に言えば耐久力がない為、回避しきれない敵に対しては慎重に行動させる必要があります。敵の魔法攻撃等にも注意。ある程度、そうした敵を指定して戦闘を避けるようにするのも手。ただし囲まれFLEE低下がありませんので、そうした危険性がない相手なら割合無茶が出来ます。特にムーンライトの使い勝手は非常によく、大抵の公開されているAIではこれのオート発動を実装しています。が、設定Lvのみを使うコーディングが多いのも事実。ここはひとつ差をつける為に、敵によって使うLvを分けるようにコーディングしてみるというのはいかがでしょうか。実際、SP効率としてはLv1の方が優秀だったりします。Lv1に対してLv5は威力3倍、SP5倍。相手のDEF適用がいずれも一回だった場合(不明ですが)、DEFが低い敵にはLv1を5回やるのがいいですが、硬い敵にLv1を連打するとDEFで引かれまくって損しかねませんので、そうなるとLv5が有効になります。この辺は今後の検証と実際の運用で決めていってもらうと吉ですが、狩場毎に設定を書き換えるか、基本Lv1にして硬い敵を個別にLv5用として記述しておくというのもよさげ。
 フリットムーブとオーバードスピードはディレイが長い為、色々とアルゴリズムのタイプが分かれるところ。常時発動でLv1が多分楽なのですが、状況に応じて殲滅速度を上げた方がいい場合、また回避性能を上げた方がいい場合に高Lvを使うといったコーディングもあり。……なお、2006年3月現在、どうもオーバードスピードは表示のみで実際のFLEE上昇効果が未実装という噂ですので、しばらくは使わなくていい筈ですorz
 いずれS.B.R.44という威力がはっきりしない大威力スキルがくるという話がありますが、どうも親密度を低下させるようですのでAI使用の対象にするのはやめるのが吉っぽいですね。

バニルミルト
 殺伐としたミッドガルドにようかんマンが!……ただし進化してしまうと可愛らしさが一気に減りますのでご注意。そんな魔法・物理ハイブリッドな万能型です。フィーリルには負けますが、それでも羊よりも通常攻撃力は高いことが多いですので、特に後衛特化でカプリス使いまくりなアルゴリズムにする必要は全然ありません。ボルト魔法を落とす際の射程にもよりますが。でも射程が長ければ、後衛特化なアルゴリズムも面白いでしょう。
 使いどころが難しいのが、カオティックベネディクション。敵にも結構な確率でヒールが行く(最低でも25%)為に、どんな判定をさせるにしても、AIでこれを使わせるのはあまりお勧めできません。まぁ、その辺はお好みで。周りに敵がいない時に使うように記述するのはありかもしれません。
 なお、将来バイオエクスプロージョンが来るでしょうが、個人的には使っちゃダメだと思うんだorz
 自爆死亡で親密度が最低になるとか、もうね(ノ∀`)
 威力は9×9でMHP依存なので協力っぽいのですが、まぁ素直にイクラ投げましょうってところです。

About Lua, About AI

 ホムンクルスのAIは、「Lua」と呼ばれる汎用プログラム言語をベースにしたスクリプトとして記述します。ROのインストールフォルダの下に「AI」というフォルダがあり、この中に以下の三つのLuaコードが置かれています。

  • AI.lua
  • Const.lua
  • Util.lua

 AI.lua がスクリプトの本体です。Const.lua は定数定義、Util.luaはAI.luaで使用されている開発下標準提供の便利関数群となっています。このAIフォルダは基本的にデフォルトであり、パッチによって更新される可能性がありますので、各自ユーザーがオリジナルなAIを記述するには、AIフォルダの下に USER_AI フォルダを作成し、そこにオリジナルのAI.luaを入れることになります。ゲーム中で「/hoai」で切替が可能です。なお、USER_AI下に入れるAI.luaでも、多くはそのコードの中に

require "./AI/Const.lua"
require "./AI/Util.lua"

という記述によって定数定義コード、ユーティリティ定義コードを参照するようになっています。「 ./AI/ 」という記述になっているので、実はUSER_AIに置いたAI.luaから参照されるConst.luaやUtil.luaはデフォルトのAIフォルダのものになります。 /hoai でユーザー側に切り替えても、USER_AIフォルダに同じConst.luaやUtil.luaを置いても読み込んではくれません。これらのサブスクリプトコードもカスタマイズしたい場合は、USER_AIフォルダにもサブスクリプトを置いた状態で、AI.lua内のインクルード記述を

require "./AI/USER_AI/Const.lua"
require "./AI/USER_AI/Util.lua"

と書き換えます。ただし、Const.luaやUtil.luaは基本定数や基本関数が提供されており、これらは今後開発元によって追加・拡張が行われる可能性があります。この為、これらはデフォルトのものを参照する形が望ましいかと思います。ユーザーで拡張・改変したい場合は、別途AI.lua内か自分で書き起こしたサブスクリプトを用意し、そちらに記述するのが安全です。
 なお、Luaそのものについての簡単なFAQをこちらに用意しておきましたので、スクリプトの記述の仕方について・読み方について分からないという方は参考にしてみてください。

AI Memo

 AIのコーディングを行うにあたって、気がついたこと・留意すべきことを雑多に書き連ねてみました。自分でコーディングする際に参考になる……かも、しれません。
■ Move、Attack、SkillObject等の関数が結果を返してくれない
 移動を行う際、その移動目標が実は進入不可能座標だったり、また間に障害物があって移動できないということはよくあります。また、攻撃やスキルの場合も、ディレイ中だったり敵が先に死んだり等でリクエスト通りに実行できるとは限りません。AIの記述を行う時に、これらの成否をトリガにした処理をしたいケースは多々あるでしょう。しかしながら、これらの成否の情報はサーバーにリクエストが届いてからでないと分かりません。この為にこれらの関数は戻り値を持たないものと思われます。では前回リクエストしたこれらが成功したかどうかを知る術はあるのかというと、多分ないです。クライアントは画面内の情報を単純に更新するだけで、ホムンクルスの処理が後付けであることから、これの為だけに新たなパケットを増設しているとは思えませんので。どうしても知りたい場合は、リクエストを出した後で、期待される状態に変わったかどうかでチェックするしかなさそうです。例えば、移動失敗判定はリクエストをした後に長らく移動モーションに変化せず、なおかつ目標座標にも近づかずに座標が変化しなかったら移動失敗といったように。攻撃やスキルについては少々難しいですね。スキルの場合は、ディレイ中などで発動できなかったらSPがそのスキル分減らなかったら失敗 or ディレイ中で不発と見ていいかもしれません。が、SPは途中で回復することもありますので、それを考慮する必要があります(スキルで減る分より回復する分が大きい時に誤判定が起こりえる)。SP自然回復量を算出した上で加味して判定というのもできなくはないのでしょうが、MSP以外に内部情報としてのINTにも回復量は依存していそうなので、それを知ることができない以上、完全に正しく判定することはできなさそうです。通常攻撃ディレイともなれば尚更です。

■ ホムンクルスの攻撃の射程は?
 通常攻撃については、プレイヤーと同じで 2 のようです。ただしムーンライト等のアクティブスキルは 1 となっています。バニルミルトのボルト系(カプリス)、リーフのヒール等は未確認。

■ フリットムーブ、緊急回避等のディレイって未実装?
 はい、未実装です(2006/3/21現在)。が、いつか実装される可能性は高そうですので、AIで自動的に使う場合にはその変更の可能性を予め考慮して対応できるようにしておくとよさそうです。これらのディレイはえらい長いのですが……特にフィーリルでフリットムーブLv5だと、効果時間40秒に対してディレイ120秒……。うーん。

■ ホムンクルスが使うスキルのIDは?
 8001番から、4つずつリーフ・アミストル・フィーリル・バニルミルトに割り当てられているようです(四つ目は将来追加分。バニルミルトの自爆とか)。ムーンライトは例えば8009、とか。パッシブスキルにもIDがありそうですが、習得Lvを参照できる訳でもないので使うことはなさそうです。

■ 敵の種類の区別ってできるの?
 GetActor()で得られる配置IDを元に、GetV( V_HOMUNTYPE, id )で識別IDが取得できるようです。引数の定義がHOMUNTYPEってなっているのが気になるのですが、現状では別にホムンクルスの種類と限らずにすべてのキャラの種類に割り振られている識別IDと同じ部分が使われているようです。これを使って攻撃対象のIDをTraceAIでログ出力させれば、特別な処理を行いたい敵のIDを知ることができますので、特定の敵には攻撃をしないといった処理も実装可能です。

■ V_MOTIONでホムンクルスのモーション(動作状態)って取れる?
 取れますが、現在はプレイヤーキャラやモンスターと違って極めて限定されています。具体的には、MOTION_ATTACK等がありません。MOTION_STANDが返ってきます。将来的に取れるようになるのかどうかは不明。

■ スクリプトのメイン関数が呼び出される間隔って?
 攻撃ディレイとか、スキルディレイとかそんなのお構いなしに等間隔っぽいです。厳密には調べてませんが(GetTickの差分を毎回ログ出力すれば分かるはず)、多分秒間10回近くは呼ばれてそうな雰囲気です。この為、あまり複雑な計算を一度にやりすぎるとマズいかもしれません。また、この関係で攻撃・移動リクエストを毎回無制限に行うとパケット過多になって通信に負担をかけるかもしれません。でもデフォルトのAIの攻撃処理が毎回ディレイとかお構いなしに連続でAttack呼んでたりもするので、あまり気にしなくてもいいかも?が、自分のROプレイ環境で通信回線が弱いなら、ちょっと留意してみるといいのかもしれません。

■ デバッグログの見方
 エラーが発生したらダイアログがその場で出て、回復不能ならROを強制終了するしかないのですが、単純に思ったとおりの動作してない時や、前述した敵IDの確認をしたい場合にログを見たいことがあると思います。これはホムンクルスが動作中に、 /traceai コマンドを実行することでログ出力の有無を切り替えられます。出力されたログはROのインストールフォルダにTraceAI.txtという名前で作成されます。スクリプト中のTraceAI関数の出力が列挙されますので、コーディングによっては大量に吐き出されることになります。必要な区間で出力・非出力を切り替えるとよいでしょう。

2006ウ・3ソ・21タマ 4ステ 56コミ 45テハ [IDLE] 待機ステート
2006ウ・3ソ・21タマ 4ステ 56コミ 45テハ [IDLE] -> [CHASE] 召喚者を攻撃している敵を追尾ターゲットにします
2006ウ・3ソ・21タマ 4ステ 56コミ 46テハ [CHASE] 追跡ステート
2006ウ・3ソ・21タマ 4ステ 56コミ 46テハ [CHASE] -> [CHASE] 敵が移動しました。再追跡します
2006ウ・3ソ・21タマ 4ステ 56コミ 46テハ [CHASE] -> [ATTACK] 射程に捉えました。攻撃します
2006ウ・3ソ・21タマ 4ステ 56コミ 46テハ [ATTACK] 攻撃ステート
2006ウ・3ソ・21タマ 4ステ 56コミ 46テハ [ATTACK] -> [ATTACK] 通常攻撃を行いました
2006ウ・3ソ・21タマ 4ステ 56コミ 49テハ [AutoSkill] ムーンライト発動判定確率 = 3%
2006ウ・3ソ・21タマ 4ステ 56コミ 49テハ [AutoSkill] ムーンライト Lv.5 発動します
2006ウ・3ソ・21タマ 4ステ 56コミ 49テハ [ATTACK] -> [ATTACK] スキル攻撃を行いました
2006ウ・3ソ・21タマ 4ステ 56コミ 49テハ [ATTACK] -> [ATTACK] 通常攻撃を行いました
2006ウ・3ソ・21タマ 4ステ 56コミ 50テハ [ATTACK] -> [IDLE] 敵消滅。待機します

 こんな感じです。日時部分がハングルのままなのか、文字化けしてしまうのはご愛嬌。

■ 先攻設定でも、極力横殴りをなくしたい
 攻撃目標として選択した敵が、自分・ケミ以外の誰かを攻撃ターゲットにしていたら候補から外すという処理を入れるのが一番簡単です。が、非移動Mob(ジオグラファーとか)の場合はそれだけでは不十分ですので、自分たちが攻撃してないのにその敵がダメージモーションだったり、画面内の他のプレイヤーキャラのターゲットを調べて、それが選んだ敵と一致していたら候補から外すとか、そういった処理まで行えば万全かもしれません。でも前者はともかく後者は面倒と言えば面倒ですし、先攻時に敵として選ぶ際の距離を狭めるという処理でも十分な気がします。それでも殴りに行こうとしちゃったらALT+Tで。

■ V_TARGETでケミが攻撃してる敵のIDを取ろうとしたら、攻撃している敵がいない時でも0以外の値が取れた……
 どうも、しばらく前回倒した敵のターゲット情報が残ったままのことがあるようです。なので、逆にケミへ攻撃している敵の数も記録しておいて合わせて判定しないと、敵がもういない座標へホムンクルスが攻撃をしようとして留まり続けることになってしまいます。ご注意を。

■ V_SKILLATTACKRANGEの戻り値が0なんですけど!
 ホムンクルスのアクティブ攻撃スキルについて、現在は戻り値どころか実際にも射程未設定のようで、画面内であればどこまでも攻撃が届いてしまうようです。修正されるまでは余計な横殴りの元になるので射程は見ないといけないのですが、戻り値が0の為、射程まで移動しようとすると一旦敵に重なろうとして押し出されてからスキルを使うという変なことになります。ですので、無難な方法としては、通常攻撃V_ATTACKRANGEの値で判定する手があります。スキル攻撃に切り替える際に移動し直しが発生せず、横殴りにもならないので安心です。

 
  このページ内における「ラグナロクオンライン」から転載された全てのコンテンツの著作権につきましては、
運営元であるガンホー・オンライン・エンターテイメント株式会社と
開発元である株式会社グラヴィティ並びに原作者であるリー・ミョンジン氏に帰属します。
(C)2004 Gravity Corp. & Lee Myoungjin (studio DTDS),All Rights Reserved.
(C)2004 GungHo Online Entertainment, Inc. All Rights Reserved.
なお、当ページに掲載しているコンテンツの再利用(再転載・配布など)は、禁止しています。
また、当ページは、「ラグナロクオンライン」公式サイトhttp://www.ragnarokonline.jp/
(または、ガンホー公式サイトhttp://www.gungho.jp/)の画像(またはテキスト)を利用しております。
戻ル。