はじめに
「へっぽこのホムンクルス、『ぽっぽこ』ちゃんの、AIですー。
もともとはバニルミルト用のAIですけど、他のホムンクルスにも対応しましたので、ホム使いの方々で、欲しい方はどうぞもってっちゃってくださいませ。
ちょこっといろいろな機能が付いているので、入門ホムAIの先に行く方はどうぞですよー」
「へっぽこのホムンクルス、『ぽっぽこ』ちゃんの、AIですー。
もともとはバニルミルト用のAIですけど、他のホムンクルスにも対応しましたので、ホム使いの方々で、欲しい方はどうぞもってっちゃってくださいませ。
ちょこっといろいろな機能が付いているので、入門ホムAIの先に行く方はどうぞですよー」
ファイル名 | MD5 | SHA-1 | サイズ(byte) |
---|---|---|---|
AI.zip | 0280C15164B8E9F6D8739243442479AF | D6695458830F35AB66029FBDD7DECEE93D56802E | 33,065 |
AI.lua | 50FF89EC248F57C490ED475617B9393B | CE225F17FA2FAA33F56051E6B805AF58DD024CA8 | 2,837 |
AttackList.ini | D41D8CD98F00B204E9800998ECF8427E | DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 | 0 |
AttackList.lua | C230213F72D1E5F7C0DA075F65ACFDDF | 527C867D715F20A71D4F7875C7D1D0B1508A34B | 4,089 |
Const.lua | E9FF4B92D9A94B4E628BDDC32A34794C | EBC7EFF72BD49820D4F71AA95DB2F2915BAAFDD6 | 6,400 |
CustomAI.lua | E30A73912C2668A370BC564B5D5FD79C | 20106A3F299D98AA23CA412BADA80B69ADC157DA | 31,841 |
CustomConst.lua | 819492BA6C706A3E5A5E3B87BA48EBB7 | 90E84668BD4B90A21706D403215F22B318C6F3C5 | 5,247 |
CustomProcess.lua | 88CF5627251F2ECC8A1112219AEAB5A3 | B95A7866C58D894CF8B1D424556EB322E982D2FB | 6,050 |
CustomState.lua | 43A9498B95FA7EC396AD44B0791DBE47 | 427BE63D6882276F5AD4B66C75CCA89090EA2F13 | 12,725 |
CustomUtil.lua | 44BBC21CD24B1EE30666E6DBC426710A | CF2678F66921936541E5D8C946354DF153EC6B46 | 15,475 |
Friend.ini | D41D8CD98F00B204E9800998ECF8427E | DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 | 0 |
Friend.lua | 65D3FE19E8FEC7396088E1C94815DB67 | 5387164D8ADB60F71F7DB3CC6F6CACC18345C426 | 1,809 |
GlobalVariable.lua | 6EFA6916E66AAF777873DC91298BC7DB | D6FA12146E23FEB200138D064696DFA8753308C0 | 685 |
MoveCommand.lua | 90E39CF87A055D7647D808741CF33D20 | D1E3B5FC9E033A4CE050242BEE98971A2925CB84 | 11,171 |
Setting.ini | D41D8CD98F00B204E9800998ECF8427E | DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 | 0 |
Setting.lua | 4A9788AC56E7DE32AACAE1FD66BC7D03 | 961FB4A495BC346E92F477C15FBA21ADBFA20CED | 12,049 |
TraceUtil.lua | 3533CCD89D49C8AE0543B0E9D8C503B4 | 78222883EEDFF22C51F8DA74FFF5E8E1FA817F9E | 2,939 |
Util.lua | B8B127426039587D72A6C4F57EEF748B | 1E796AA68892F414643C8FD51FB06C7E04168AD8 | 2,663 |
Vector.lua | C86957F7659AD17A36995F131E711DB9 | 7D0D0D0939EC9F63754926000A1ABC532402B148 | 2,800 |
「つーわけで、へっぽこAIについてですー。
一般の利用者の方は、ここから先の使い方をご覧下さい。
AIをカスタムする方、一部の機能だけを実装したい方は、開発者向けをご覧下さい。
普通に使う分には、移動コマンドを覚えていただければ、大抵の事は設定できるようになってます。
あと、以下で使用される言葉の定義を先に書いておきますので、確認してくださいね」
移動コマンド以外でホムンクルスの設定を変えるには、Setting.luaを直接メモ帳等のエディタで編集します。
ただし、Setting.luaの設定よりも、Setting.iniに書かれた設定が優先されますので、Setting.luaを変更した後は、Setting.iniの中身を全て消す事をオススメします。
名称 | 取り得る値 | デフォルト | 説明 |
---|---|---|---|
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なのに、あたしが細かく説明する必要、あんのかなー」
ファイル名 | 説明 |
---|---|
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次元ベクトルを用いて、アクタをベクトルとして演算するためのものです。 |
へっぽこAIではTraceAIメソッドを直接呼ぶことはしません。
これはトレースログを収集する際に、TraceAIがコードの様々な場所に埋め込まれていると、ログが煩雑になって問題を把握しにくくなるからです。
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)より得られる文字列は、現在のステートを文字列としたものです。
へっぽこAIでは、ホムの移動や距離に関しては、二次元ベクトルを多用しています。
基本的に使っているのは、ベクトルの足し算、引き算、回転、正規化(単位ベクトル)ですが、ベクトルの知識があると、少し楽ができるかも知れません。
例えば、オーナーとモブの2点があるとき、ホムをモブとオーナーを結ぶ直線の、モブに対するオーナーの背後に移動させたいとき(自動逃亡のロジックです)、ベクトルを用いれば、オーナーのベクトルをov、モブをoeとすると、oe-ovによって求められるevは(位置的な問題ではなく、方向的な問題として)、モブからオーナーへのベクトルとなります。このベクトルの単位ベクトル(ノーマライズ)を求め、ovに足すと、それによって求められるxとyは、オーナーの背後セルの位置になります。
Vectorではベクトルを用いた様々な処理がありますが、足し算、引き算、回転、正規化以外では、象限をえるQuadrantがあります。これは単純にアクタのx,yから求められた値では1しか返しませんが、3つの点が存在するとき、在る点に向かって、2つの点がどのような向きになっているかを知ることができます。(自動逃亡で利用しています。つまり、ホムとモブはオーナーを中心にして、必ず向き合うようになるのです)
自動逃亡のロジックについては、CostomAI.luaのAutoEscapeか、またはCustomState.luaの、OnESCAPE_STあります。
移動コマンドでは、すでにあげているように、全ての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の値を変更します。
このファイルには定数が書き込まれています。
実際にへっぽこAIでは使われていないものもあります。
もしもスキルの詠唱時間やディレイが変更になった場合は、このファイルを修正してください。
なお、ステートに追加されているSTANDBY_STは、初期状態のステートで、ここからIDLEに変わります。
ホムがAIをロードしたタイミングで何かをさせるには、このステート時か、またはCustomAI.luaのCustomAIInitializeに実装するといいです。(例えばスキルの持続時間やディレイはマップ移動をサポートしないので、それらをサポートするように、ファイルに書き出すように修正するのならば、このタイミングでロードできる。ちなみにスキルのディレイ等はCustomAIにまとめられている)
このファイルはAIのキモとなる部分です。
基本的にへっぽこAIはこのファイル内にある様々なメソッドにより、動作を決定します。
呼び出しを変更しないのであれば、機能の追加、及び修正は容易です。例えば回転に関しての動きをスムーズにするためにどきどきAIにあるような8点の回転に修正する場合、BeginRotateメソッド、Rotateメソッドを修正すれば可能です。(へっぽこAIの回転が美しくないのは手抜きです)
戦闘開始時、ホムに何かしらの動作(スキル等)をさせるには、OnStartAutoFightイベントを拡張します。
アイドル中のお遊び動作を増やすには、IdleMotionメゾッドを拡張します。(このメソッドはいい加減なので、少々骨が折れるかも知れませんが)
このファイルは、汎用的なカスタムされたメソッドを提供します。
Setting.luaやCustomConst.lua、Vector.luaにある程度依存しますが、ここで提供されるメソッドは他のAIにも利用できるものです。
以下にCustomUtilの全メソッドとその戻り値、引数、機能を記載します。
メソッド名 | 戻り値 | 引数 | 説明 |
---|---|---|---|
Random | number | number max |
maxを最大とした乱数を生成します。その値の範囲は1〜maxまでです。 へっぽこAIでは、math.randomを直接呼びません。必ずこのメソッドを通して呼び出します。なぜならば、Luaの乱数がどの程度のものなのかわからないためです。 乱数の精度を気にするのであれば、このメソッドを修正してください。 |
Contains | bool | table list, object value |
指定されたlistテーブルの中にvalueが含まれていればtrueを返します。 |
メソッド名 | 戻り値 | 引数 | 説明 |
---|---|---|---|
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を返します。 |
メソッド名 | 戻り値 | 引数 | 説明 |
---|---|---|---|
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に依存します。 |
メソッド名 | 戻り値 | 引数 | 説明 |
---|---|---|---|
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を取得します。 |
メソッド名 | 戻り値 | 引数 | 説明 |
---|---|---|---|
MoveToOwnerEx | void | number myId |
myIdをオーナーに近づけます。 MoveToOwnerとの違いは、このメソッドではオーナーの1距離の位置に接近することです。 |
「とまぁ、そんな感じで。
開発者向けセクションに追加して欲しい説明等がありましたら、BBSにでも。
つーか、へっぽこのホムのために作ったAIなんだよなー。(2回目)」