ホムンクルスAIについての独り言
[ラグナロクオンライン]のホムンクルスシステムで使用する ホムンクルスAIのカスタマイズについてのメモ
プロフィール

モルティシア

Author:モルティシア
何時の間にやら貧乏キャラが定着しそのまま「安ケミ」と呼ばれるようになった「安っぽいケミ」
一時休止していたものの、最近ふたたびホムンクルスのカスタムAIの開発&公開を再開
メマー無しPC3の42転職
[完全製薬・完全露店]キャラ

カテゴリー

月別アーカイブ

最近の記事

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

リンク

このブログをリンクに追加する

ブログ内検索

RSSフィード

FC2カウンター

メールフォーム

名前:
メール:
件名:
本文:

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GV用のAIについて メモ
---
>411 :(○口○*)さん :06/09/04 02:46 ID:uqVZKrGHO
>ちなみに狩り用AIだと敵のIDを取得する部分で、シーズ独特の仕様のせいで敵を判別できないため殴らない
>既存のAIをGV用にするならGetEnemyの中の、ID保存の条件を変えなきゃならない
---
AI雑談スレでちょっとGVでのAIの動作について話が出ていました

GVでもホムは有効だと思うし、私は使ってもいいかなと思うのでGV用のAIに必要な情報で私が知っていることをここにメモメモ

まず対人マップでは[IsMonster()]で帰ってくる値が、
「同ギルドメンバー」以外だと 0 が帰ってくるようです
(ちなみにPVマップだと「同PTメンバー」が 0 でそれ以外は全て敵とみなし 1 が返ってきます)

つまり対人マップでの最低限の敵味方の判別はデフォルトAIでも行えます

さらにGVでホムを使う時、問題となる点は次の二点
:ラグ中も攻撃パケや移動パケを送り続けるため、数秒の長いラグが発生すると回線に負担がかかる
:IDを取り込む処理が重い
(ホムをつれてプロの露店地帯を歩くと、ホム無しよりラグいハズです)

この二点です

「ホムをGVで使う時は良いPCを」と思われているようですが、「大事なのは回線」であり、
過去にAI開発スレで出てきた情報では確か、GVでホムを使うとラグで動けないまま鯖キャンが連続で起こり移動できないという現象があるらしいですがこれはパケットの送りすぎで回線にポリンが詰ってしまったのです

つまりGVでAIを使う再は「無駄なパケットを送り過ぎない」これが最も重要だと思います
あとは極力ループ処理やID取得の処理を減らし、動作を軽くすればGVでも使用可能なはずです

そのために移動まわりとAttack命令のまわりに特に気を配らないといけません

また、敵を殴りに行く時の座標ズレの対策も行う必要があります(これがもっとも難儀です)

実績のある◆g37UcEp//g さんのGV用AIのコードを見てみると、
最初のInit()で中の値が変化しないグローバル変数を格納し、今後同じGetVを行わないようにすることで処理をなるべく軽くしようという工夫が見られます
また、Move処理とAttack命令を省きホムを固定砲台とすることで無駄なパケットを抑え、スキル使用の条件を「敵の詠唱」「主人のモーション」「スキルディレイ」で管理し、スキル命令のパケットも無駄に飛ばさないように抑えています

これらによりラグいGVでも快適に動作するのだと思います


以上のことからGV用のAIに必要な最低限の機能は、
・パケット送信とPCへの負担に気を使った極力無駄を省いた設計

・ホムはシーズでの 同盟メンバー と PTメンバー を判別できないのでそれら同盟の人を友達登録して殴らないようにする必要があること

・そして余計な設定でキャラクターIDを全て除外してしまわないID取得処理

この三つだと考えています

三つ目の「余計な設定でキャラクターIDを全て除外してしまわない」というのは、狩用AIが横殴り防止でプレイヤーを判別しているとシーズでは誤作動を起こし敵を殴りにいけないという現象がおこるので、この機能を取り付けないことを指します
狩用AIをGV用に改造したい方は以上の点を参考にしてください

以下、アンテナの主なAIのID取得の流れを軽く見てみて、対人で敵を正常に取得できるかどうかを見たいと思います


まず私自身のAI、「安っぽいAIVer7.0」

IsNoNearPlayer()という、ターゲットの周囲に他プレイヤーがいるかどうかの判断でシーズの敵も「プレイヤー」と認識し、攻撃を行わない可能性が有ります
曖昧な表現なのは、最初に「敵リスト」と「その他リスト」の二つにIDを分別してからこれらの処理を行っているので、
最初の分類がうまく行われていれば、シーズの敵は「プレイヤーと認識しない」かもしれないからです
味方IDの認識が3人までな上に、そのIDを敵としない分類も行われていないため、同盟キャラも無差別に殴っていきそうです
また、誰かが敵を殴っていたらその相手を殴らない恐れがあります
--

次に、利用者の多い「こっこAI」
敵ID取得のパターンが多く、その優先度も設定できるのが特徴だと感じました

IDELの「近くにプレイヤーが居るかどうか検知」処理が働いて友達の自動登録処理が動いてしまいそうです

その中で「主人の近くにいて且つフリーな敵」を取得する処理が対人ではプレイヤーと敵を誤認して殴らなくなってしまいそうです
しかしこれは設定を弄ってこの条件での敵取得を行わなければ問題はないので
友達登録の無差別動作の可能性を無視すれば対人でも使えるかもしれません
また、誰かが敵を殴っていたらその相手を殴らない恐れがあります

--
次は初期の配布AIであり元祖ぐるぐるの「どきどきAI」
これは基本非先行で、戦闘面では大人しい印象を受けました

デフォルトAIの原型が大分残っているので、デフォAIの解読からLuaを始めた私にとっては見やすい部類のAIです
構造も非常にシンプルです

デフォAIのGetMyEnemyA()がIsMonster()を使用していないため、ホムをタゲった相手へは無差別に攻撃しようとする可能性があります
主人が行うホムへのPP、他人が行ったホムへのPP、同盟キャラがホムを間違えて攻撃してしまった時などなど

対人でもちゃんと敵を認識しますが、タゲ取得での誤動作が非常に多そうです
また友達登録がないのでGVでは自分と主人を殴るものを無差別に殴っていくでしょう
--
次に初期にその機能をほぼ完成させてしまった工体AI
これの解読は正直骨が折れます
・゚・(ノД`)・゚・

しかし横殴り防止の部分は意外とシンプルで、工体さんの横殴り防止機能の部分のコードはもはや殆どのAIでも利用されているため横殴り防止に関する構造は読み易いです
GetNearestPlayer()でターゲットに最も近いプレイヤーを調べる処理を行っていますが、ここでプレイヤーと敵を同一認識し敵を殴らなくなる恐れが有ります
しかしこれはコンフィグで[PLAYER_DISTANCE]を無効にすることで動作しなくなるので対人での利用は可能です

敵取得の部分はサラッと読み流しただけなので(解読が大変なので途中で放棄)
自信はありませんが、
trget_noneで先行の敵、非先行の敵の情報からその敵を先行して叩きにいくかどうかを判断してるのですが、ここが多分動作しないと思われます
多分対人では非先行な大人しいホムになるのではないかと思います

また、誰かが敵を殴っていたらその相手を殴らない恐れがあります
--
次に難解続きでGlenelgさん

横殴りの判定で、敵のタゲが間違いなくこちらか、だけでなく相手プレイヤーのモーションが継続かどうか、でも攻撃を中止するかどうかの判断をしていたのがイイナと思いました
あと4セル以上離れれば草を誤爆で叩いてしまってもタゲがリセットされるみたいですね
重力が用意した「リセットされないタゲ」をメインの利用から外して、仮のタゲ保持の入れ物を用意しそっちをメインに使ってるように見えます
(この辺ぱっと見なので間違ってるかもしれません)
そのためか、工体以上にデフォルトの面影がありません
さらにホムごとに設定iniがあるのと、内部で取得できるIDを非常に細かく分類して処理していたのが印象に残りました

全体的にローカル変数同士でのデータ受け渡しが多く、関数もやたら細かいため、処理があっち行ったりこっち行ったりしてて解読に骨が折れます
・゚・(ノД`)・゚・
ただ、一度仕組みを熟知すればメンテや拡張は簡単そうだと思いました

横殴りの判断はタゲが被ってるかどうか、だけで近くに他プレイヤーが居るかどうかの判断は行っていない様なので、対人でも十分動作すると思われます

ただ、誰かが敵を殴っていたらその相手を殴らない恐れがあります

--
最後に初回限定さんのAI

待機時の処理がちょっと独特だという印象があります
ホムの動作に個性が出そうです

また、主人が攻撃モーションの時、キャスリングのとき、にタゲを取り直していました
確かにキャスリング後に古い敵を追いかけられると面倒なことになりそうです
自分のオートキャスリングは敵IDの処理どうやってたかな・・・(汗
あとで見直してみましょう

GetFreeEnemy内部で敵とオーナー以外のオブジェクトが敵の側に居た場合、その敵の取得を放棄してますが
おそらく対人やシーズではこのあたりの処理の
IsPlayer_SelectActors ()
の動作で敵プレイヤーもプレイヤーと認識し、殴らなくなると思われます

また、処理内部でIsMonster()をほとんど使用していない構造上、対人マップかどうかに関係なく「プレイヤーを敵と認識する機能が無い」ため対人マップでは「プレイヤー」は全く殴りません
ガーディアンにだけは攻撃をしかけるかもしれません

初回さんのAIは、対人ではペットと化してしまいます

--
そしてくまーAI
分岐をシンプルにするためか、同じ処理が何度も書かれており
コードが重複しているためかえって見づらい印象があります

横殴り防止はいたってシンプル、攻撃前と攻撃中に、敵がすでに他人を殴っていたら破棄です

タゲ取得も、主人や友達をタゲっている相手がモンスターかどうか、そして主人が叩いてる相手は無差別に敵と認識

非先行では自分をタゲっている相手を無差別に敵と見なす様子
相手が味方だろうと、主人以外がホムへスキルなどを行うと敵とみなして追いかけていってしまいそうです
先行では一度画面内の敵を敵として認識した後に距離判断を行っている様子

対人では登録キャラ以外は、指定距離に入ったものは手当たり次第に攻撃すると思われます
非先行の状態の時に問題がありますが、先行型にしておけばおそらく対人でもそれなりに動くと思います

ただ、誰かが敵を殴っていたらその相手を殴らない恐れがあります
--
最後に我らが重力星人作成のデフォルトAI

特に余計なものは入ってません
非常にシンプルです

・主人をターゲットにする「敵は」全て 殺 す
・「主人が殴ってる相手は」全て 殺 す

・非先行
:「自分をターゲットにする者は」「味方だろうと主人以外は全て」 殺 す
・先行型
:「敵は」目に入ったやつから 殺 す

ものすごく好戦的なAIです
シンプルって恐ろしいですね
--

以上がAIアンテナにある主なAIとデフォルトAIのコードを見た限りでの対人で想定できる動きです


「狩り」と「GV」そして「PV」では敵を認識する基準がすでにズレているため、狩り特化のAIは対人では使えません
特に横殴り防止のためのアレコレの機能が妨害をしてしまいます

以上のコードの覗き見から、狩りと対人で両立できそうなAIは
工体AI、GlenelgAI、こっこAI(友達の自動登録の誤作動の恐れが有り)、くまーAI、安っぽいAI(理論上は大丈夫なはずなんだけど(;´ω`))の五つかと思われます

しかしいずれも「タゲが被ったら攻撃をしなくなる」ため実用度はあまり無いです
あくまで「対人で遊べなくも無い」といったレベルだと思います

MoveとAttackを出すタイミングまで解析すると頭から煙が出そうなのでGVでの回線への負担までは見てません
ただ安っぽいAIだと座標ズレになった時怖いことになる気がします

配布している「GV用の試作AI」も座標ズレには対応していません
・゚・(ノД`)・゚・

いい方法が見つかったら組み込んでみたいとは思うのですが・・・既存の狩り用AIを悩ませるスタック問題と同じ構造なので
解決はほぼ不可能かと思われます
|||orz

現状で一番無難なのは◆g37UcEp//g さんのGV用AIみたいに「ホムを移動させない」「自分から殴りに行かせない」というのが一番なのです

スポンサーサイト
この記事に対するコメント

この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://yasukemi.blog49.fc2.com/tb.php/27-bf812af3
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。