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

モルティシア

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

カテゴリー

月別アーカイブ

最近の記事

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

リンク

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

ブログ内検索

RSSフィード

FC2カウンター

メールフォーム

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

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

pairsを使ってて気がついたこと
mobdata.luaの中身を一個一個手書きで書き換えるのが非常に手間だったので
mobdataから読んだモンスターのデータを元に、自分が使い易いデータファイルを作るようなLuaプログラムを作成してました
その途中で気がついたこと
どうやらpairsは600を超えるテーブルを扱えないらしい
正確には699くらい
なのでmobdata付属のMOBDATAテーブルを全部読み込もうとしたらループが止まります
エラーじゃなくてループを勝手に脱出する様子
不便だけどwhileを使った方が安定するみたい

とりあえずmobdataからモンスター情報を自分で見易いように組替えて、データ100ずつのiniに分ける
さらにテーブル番号とモンスターの名前が分からなくなったときのために対応表も出力させて下準備完了
後は空いてる所に使いたい情報をチマチマ入れていけばデータベースは完成
明日から過去にメモ書きしたVer8でMobDataを使ってやりたいこと、を見直してアルゴリズムをあれこれ考えてみよ
ホムが自分のステを知らないっていうのが辛いです
・゚・(ノД`)・゚・
スポンサーサイト
Ver8α版とりあえず完成
αの動作テストとバグ取りも終わり、後は実用に向けての調整を残すのみとなったためβに取り掛かろうと思いMobDataの中身をジーっと見てたのだけど
んー・・・、これをどうやって専用ライブラリにするか
その後Mobの能力によって行動の分岐もさせないといけないからさらに処理がゴタゴタしそうだし、βの公開には時間がかかりそう


とりあえず、β版も時間がかかりそうなのでひとまず、今までの成果であるα版をちょこっと公開
Ver8α版
α版はここ限定として配布ページで正式に公開することはしないつもり
性能はVer7_5とあまり変わらないです
Ver7_5に比べるとちょこっと早くて軽くなってるのかな?
Ver8は状態遷移をガチガチに固めてるから中途半端な追加をするとエラーを吐くけど、(このAI作った本人にとって)見やすくなってるので処理の追加とかはやりやすくなってます


[続きを読む...]
α版もちょっとでしゅーりょー
23日から27日までの五日間、一日の大半がバイト→寝る で流れていき全く動作テスト出来ず
明日の午後か明後日にようやく動作テストできそう
本当は・・・今日休みになるはずだったのに・・・
急に人がたりなk
=□○_ ~○0
 
とりあえず、少ない時間でちょちょtっと旧Verから
おまけモードとダンスモードを除く機能を移植してみる
動作テストはしてないのでエラーあるかもしんない

この作業中に気付いたんだけど、Ver7は継ぎ足しに次ぐ継ぎ足しで中身がなかなか混沌としていました
Σ(゜Д゜=;゜д゜)
コンフィグにあるべきグローバル変数が二つほど消えとった
いつ消したんだろう・・・修復してひっそりアップ
一応、変数の値が無くてもバグにならないつくりになってるから、ちょっと動きが遅くなるくらいで大きなエラーは出ないため今まで気がつきませんでした
っていうかこないだ使って感じたモッサリ感ってこれだったのかな・・・

27日 7時現在 は修正したものがアップされています
非常に軽度のものと判断したため特に告知はなし

そのままVer7の機能をVer8用にカスタマイズ&スリム化して組み込み
中身がちょっと見づらくなったからまた少し手を加える必要があるかな?
これでエラーがなければ80%ほど完成といった感じ
後は動作の微調整かなー・・・
思ったよりα版の作成が難航してます
βの公開はもちょっと先になりそう

またVer8は今までの安っぽいAIとは内部構造の基本的部分が別物になっているため、新しいAIとして公開したほうがいいかなーと言う考えが最近浮かんできています
「安っぽいAI Second Edition」 とか!?
デファクトスタンダードなOSからネーミングセンスを拝借しています
Verアップ重ねてきてるうちに古いVerの更新記録が増えてきて大変なことになってきてるので、
心気一転、根本から作り変え!ということでセカンドエディション!

最近あんまし寝てなくて一日中眠いから頭がやばいわー~
あははははははは・・・
|||orz
そろそろβ作成
21日のAI日記にのっけたコード、文法上のエラーありまくりだったので今朝はそれのバグ取り、+処理追加

大体今朝の時点でα版は構想の70%くらい
あれこれ空想してたはずなんだけどある程度実装されてくると満足したのか、細かい部分を忘れてる・・・から80%でもいいのかな?

動作テストとコードの整理が終わったら完成度さらにアップで9割ほど完成となるため、ぼちぼちMobDataを使用したβ版の作成にとりかかります

モンスターと画面上のキャラクターの移動先を予測して、そこからタゲが被る可能性があるかどうかという判断をさせる処理と
主人から5セル以上の距離の敵に対して、そのまま殴りにいくと画面外が見えないことからたまに横殴りスレスレとなってしまうものを解消する為の処理
主人と自分のタゲの数から殴る敵の優先度を若干変更する処理(4匹以上溜まってたらより多い方の殲滅を優先する)
モンスターがアクティブなら5セルくらいのあたりで立ち止まってMobがこっちを殴るのを待つ、ノンアクなら攻撃の成否を判定してから主人の側までモンスターを誘導して攻撃
攻撃の成否は敵のターゲットとターゲットの画面内の有無。モーションから判断
アクティブかノンアクティブかはMobDataを実際に使う処理になってから判断させる予定

動作テストは多分月曜

地面指定攻撃をある程度察知する処理も追加予定
地面指定を詠唱中の時のターゲットの状態、そのターゲットが画面内に居るかどうかから判断させる予定

とにかくデフォAIのまま、または今までのAIの先行型だと勝手に動かれて困る事が多いのでそのあたりをとにかく減らす
勝手に動くべき時と勝手に動いてはいけない時の状況を徐々に判断させていくつもり
また処理を追加するごとにメンテ性と拡張性を意識してコードをあっちこっちに移動しては、メンテしやすいか、拡張しやすいかを見てあれこれ試行錯誤

あとケミスキルの自動化封じにプラスしio.openにも制限を加えてみました
悪意のあるコードを含めた二次配布を気軽に出来ないようにしてイタズラのやる気を削ぐ
「自動スキルを追加するより自分でAI作った方がはえーよ」
というのが理想

[続きを読む...]
役に立つか分からないもの
れぽーととかバイトとかまだまだ忙しい今日この頃

頭のなかでおぼろげに浮かんでいる動作をさせるために「必要だろうなぁ」と思う補助関数をぽちぽち作成
でもいざ組みあがると、もっと短くて効率のいい方法があるんじゃないかって気がしてくる

そもそも数学好きだったけど苦手だったので方程式とかあまり思い出せない
数字とにらめっこしつつ机上デバックでチマチマ作成
実際の動作テストはまた後日

以下、今日作ってみたもの
(※動作未テスト)

[続きを読む...]
Ver8の進み具合
今日中になんとか、

・手動操作による攻撃のキャンセルを認識しそのモンスターが死ぬまで攻撃を行わない
・キャンセルが同じ種類のモンスターに2回行われたらそのモンスターの種類を記憶し、今後同じ種類のモンスターを勝手に殴りに行かない

といった判断をAIに組み込みました

さらに一度記憶しても、その後同じ種類のモンスターが完全にフリーな状態の時に手動での戦闘が三回行われたら
勝手に殴ってはいけない、という命令が解除されたと判断してリストから削除、また勝手に殴るように

暫く狩場をうろつきながら必要な機能なのか邪魔な機能なのかを検証することにします

Ver8のα版は52%といったところ
基本的な部分(MobDataを利用せずに、ケミのサポートとしての判断と行動を自分で出来る)が構想の95%以上出来上がったら
今度は実際にMobDataを使用した処理を組み込むβ版に取り掛かります
配布はβ版からの予定


[続きを読む...]
久々に旧Verを使ってみる
久々に狩りをしてみようということで
不完全なVer8ではなく一通り安定してる旧Verの7.5を使用したところ
Ver8に比べると動きがなんだかもっさりしてることに気がついた
主人の移動モーションから行動パターンを切り替えてるのだけど、どうもラグいマップだとそこがうまく働いてないらしい
あと防衛機能をPT戦に応用してみると、タゲとりのあたりが動いたり動かなかったり
よく見てると登録したキャラが被弾するとタゲを取りに行く様子
攻撃がmissだともしかしてV_TARGETとれないのかな・・・・

あとルートMob対策の部分の実装で防衛機能の登録のあたりに軽い不具合が出てたので修正、ひっそりと1時半に再アップ
いくつかの機能はVer8にそのまま引き継ぐので、早めにバグ特定して潰したいですね

あと私のAIは移動狩りに弱いのを痛感
主人のモーションが正常にとれないとそのまま出遅れ、歩く速度によっては歩き出す前に置いていかれることも
このあたり、なんとかしたいなぁ・・
ん・・・??
距離順にIDを並べ替える関数が完成
テストが上手くいき満足したところでふと疑問に

・・・これって実際の効果どうなんだろう?

プレイヤーとモンスターでテーブルをあらかじめ分ける必要があるから最初のActer処理とループは仕方ないとして

デフォだとGetEnemyと最短距離のMobを取り出すのとで2回ループをまわす

今の方法だと、テーブルの中身を並べ替える為に2回ほどループをまわすことに
並べ替えで2回、条件に合うモンスターを探すので1回で計3回
こっちだと、一番距離の近いモンスターから見ていくため条件に合うIDがあったら即Breakすればいいとして
少しは軽いのだろうか??

とここまで考えて、プログラム弄りが本来の目的だからこういう無駄な技術満載の方が私としては正しいのかなという考えが頭をよぎる

深く考えるのはやめよ・・
ホムにプレイヤー並みの動きをさせたい、この理想を目指してまっしぐら!


う゛ー
ただでさえ寝つきが悪いのに睡眠時間も減り、食欲が沸かなくなってきてる今日この頃
今週末にはいいかげん卒業就活の準備を進めないと・・・

Ver8、自己コードチェックのスクリプトを改良
あと横殴り対策について新しい案が出たのでメモメモ

元々、安っぽいAIでは
敵IDを取る時に主人から一定の距離のもので且つ近くにプレイヤーが居ないものだけ選び出し、
その後敵を追いかける時にさらにプレイヤーが近くに居るかどうかと敵がフリーかを見ています

長時間、人の多いところで余所見をしつつボーっと狩るなら
主人を中心とした索敵範囲の設定を狭くすれば主人のそばのMobしか殴りません
デフォルトはホムと一緒にぺちぺち叩くときの最適値になっているため
そのままだと余所見狩りでは危なっかしいですが

Ver8では、今までの戦闘マクロとしてのAIに、自分で状況を見て考えて判断させる処理をいくつか追加します
今まで以上に「今の状況」を分析し、その状況から起こすべき行動を行います

・・・といってもあくまでそうなるといいなという感じで、どこまで実現できるかは分かりません

さて、新しい案ですが、モンスターは元々ターゲットに直線移動を行います
つまりモンスターの座標を秒刻みで監視すれば、その移動経路から一次関数の直線グラフの式が作れるはずです
その延長線上の近くにモンスターのターゲットとなりうる何かがあるかどうか、を見るというアルゴリズムが今回の思いつき
これを活用することによってトレインの有無も見ることが出来るはずです
そして画面上のプレイヤーの移動進路の直線式を作り、その延長戦上にターゲットが居たらターゲットを一旦破棄という遠慮機能にも使えます
さらにタゲを奪う時、モンスターの起動を直線で予想した後その進路上に先回りして待ち伏せするといったことが出来ます
   
   ←  敵ホ  ←
より
   ← ホ敵   ←
と敵の前に回りこんで攻撃したほうが、2セルの移動分多く殴ることが出来、よりタゲを剥がし易くなります
・・・といってもホムにターゲットが集まり易い現在の仕様でこれがどれだけ効果があるかは分かりません
あくまで、万が一の仕様変更に備えたものです

どのみち放置なんてしないでちゃんと自分で面倒見てやればこんなのも必要はないんですが

[続きを読む...]
おもいつき
もしも/トレース コマンド関数に関数を入れられるとしたら
事前にトレースtxtの中身削除、即クローズ→
トレース関数の実行をキーに関数が起動

/トレース をトリガーにしてモード切り替え
そのときはデバックモードと通常モード、コンフィグから切り替え可能に

ホムンタイプを第一添え字にしてIDを格納させる二次元テーブル
テーブル[type] == nil
ならその種類は存在しない→
検索すら要らないホムタイプの有無判断

存在するならさらに
テーブル[type,1]、テーブル[type,2]、テーブル[type,3]、...
とIDを取り出す
(Luaでは二元テーブルどう表記したっけ・・・)
ホムタイプを昇順にソートして二分探索でホムタイプからIDを絞り込める→
ホムタイプごとの処理をする際ループ数を減らせられる

最初のループですべての用途別テーブルにIDを入れておいて
用途別に違う指標で昇順→
全てを二分探索で半分の時間と負担で処理→
テーブル多用によるメモリへの負荷は?

最初のループである程度IDを絞り込み→
用途別テーブルとソート、二分探索→
GetEnemyの存在意義と処理簡略化の可能性

効率の良いソート方法の模索
テーブルごとのIndexの保持
ローカル変数の使い方と関数の置き方、グローバル変数のリセット、ローカルな関数
Luaにおける関数の実行順とルールについてのさらなる把握
Ver8製作状況3
自己診断処理の原型が完成
AI()を実行する前に他の処理を先に実行する方法が分かったのでそれを応用
さらにエラーの時クライアントが止まらない処理をちょこっとカスタマイズ

これらの改良のせいでAI.luaに通常処理を入れることが出来なくなってどうしてもファイルが二つ以上になってしまうけど、そのおかげでメイン処理に移って各ファイルをrequireでくっつける前にAIファイルをオープンして中身を見ることが可能に
AI内の指定箇所以外のところにSkilObjectが存在していたらエラーを吐きます
さらにSkilObjectのIDの部分にオーナーのIDが入ってたら同じくエラーを吐きます(これはまだ不完全なので他の関数による単純なチェックです)
これらの処理を多重的に行い、解除の難易度をアップ
さらあちこちにダミーデータを用意し、エラーにならない様にして安定性も確保
エラーが起こった時にはトレースでエラーの該当箇所が分かるようにダミーデータが要所要所の分岐で値が変わるようにしてメンテ性も確保
これでホムが動かない不具合が起こった時は、ダミーデータを出力させそこで不具合を特定することが出来ます
今のところはエラーも出さずに動いています

これを作るに当たって使用したネットから拾ってきた様々な技術はまだまだ未知な部分が多いので、もちょっとあれこれと検証する予定

さらにConst.luaとUtil.luaが無くても大丈夫な様にし、専用の関数&グローバル変数ライブラリを作成
事実上、requireするファイル数を二つ減らすことに成功
またテーブル編集の関数も工体さんのところのライブラリを解析しつつ自分で使い易い用に改良中

各AIファイルの中身もメンテ性重視でかなり組替えています
今までのVerを使っていて気になっていた細かい挙動を変えるために細かいデータの取得と受け渡しを明確化させ、それによって得られる情報を元に気付くかどうかの些細なレベルで微調整中です

完成度は50%といった感じ、まだまだ基本を固めています

現時点で AIの一週目のみ 、自己診断の処理のためにちょっと動作が重い気がするので処理を見直して可能な範囲で軽くする必要もあります

[続きを読む...]
不正?対策?
AI雑談スレで私がちょろっと書いた自動PPを妨害する処理の発言が元でなにやら議論になりつつある模様・・・
ここまで話題に取り上げられるとは思っても無かったので戸惑ってます

私が自動PPを妨害する処理を組み込もうとあれこれやってる理由は、
知的好奇心的な気持ちと、"無抵抗のまま"おもしろくない使い方をされるのがつまらない、といった軽い気持ちからなので、
不正悪とかいった思想ではなく
「自動PPしたい? ならまずはこの課題を乗り越えてからだ!」みたいなノリなのです
一部を書き換え~といったものも、削除するためではなく
変なコードあったからワザとエラーを出してAI止めて警告、といった用途のための構想です
このコード自体も変な使われ方すると危ないので実際に配布AIに備えるかはまた別の話となります

勝手に本体と無関係なファイルを削除したりすると、それはウイルスに近い動きで怖いなというのが私の感想です
今色々実験して徐々に完成させている関数は、自分のAI内部を自己チェックしてAIを自主的に停止させる程度のものでそれ以上のことをするつもりもありません

あくまでプログラムやAIを全く知らない人がちょっとしたコピー&ペーストで簡単に変な改造が出来るのをすこし邪魔する程度です
自己流のプログラミング独学
私の独学方法はいつもこんな感じ
1.解説サイトを軽く回ったり入門本を入手して2回くらい読み直しおおまかなプログラム構文の使い方をイメージする。
2.ネット検索で環境を最低限整えて、実際にプログラムを組んでみる。
3.検索や本で原因を調べながらエラーを取る。
4.解説サイトを回って他の機能も試してみる。
5.3に戻る。

これを繰り返して少しずつ、自分のイメージと実際の使われ方の差を把握してプログラム構文の使い方を把握していきます。

ものすごく効率が悪いのは自覚してます
でもやはり、何十回本を読むよりも実際に組んでみてエラーを自分の力で理解しながら潰していった方が理解は早いような気がします
そのエラーの出方から、
「このライブラリ関数はこういう内部処理っぽいからこうしたらこういう結果になるんじゃないかな?」
と予想できるようになったり
「この命令文はこういうこういう使い方は出来ない」
という、「○○が出来る」という説明では知ることが出来ないことを知ることができたり

ただ「○○は□□が出来ます」としか書いてない説明だけでは分からないことを沢山知ることができて、それで知ったことは処理を応用する時に幅広いアイディアの引き出しとなります

少なくとも私の体感ではそう感じています
そんな具合で何度もエラーを出し、それを一個一個解析しながらLuaを理解して、「プログラム」を理解して、ホムAIを作っていってます

最近はLuaが少し分かってきたためか、昔はさっぱり意味がわからなかったC言語の教本の内容が理解できる様になってきました
そしてC言語の説明がわかるようになってきた所で、改めてLua言語の解説をしているサイトを見るとまた新しい理解と発見があります
そんな具合でゆっくりゆっくりと、エラーと付き合いながら実験を重ねてホムAIを作ってます

-続き-

[続きを読む...]
Ver7.5
Ver8でMobData使用と共に同時に備え付けていく予定だった
「戦略的判断」の機能の一部を ルートMobをメインに狩る際の配慮に特化してVer7.5で実装しました

以下、Ver7.5の詳細と日記

[続きを読む...]

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。