一から始めるAI講座~第9回:定義された関数を知ろう~
【重要】新しいBlogに移転しています:あるネットゲーマーの日常
2006年03月26日 (日)
前回まではデフォルトのAIを読み解いていきました
その時は全体の流れを重視したために、
細かい関数の解説はあえてしませんでした
しかし、これから具体的に改造を加えるにあたり、
関数を使い方を知らないとお話になりません
そこで今回は、具体的な改造の前に、
ホムAIで使える関数を見ていきましょう
その時は全体の流れを重視したために、
細かい関数の解説はあえてしませんでした
しかし、これから具体的に改造を加えるにあたり、
関数を使い方を知らないとお話になりません
そこで今回は、具体的な改造の前に、
ホムAIで使える関数を見ていきましょう
~間章~ 定義された関数一覧
A-1:クライアント定義関数
まずは、マニュアルにもある、
クライアントで定義された関数を見ていきます
1) MoveToOwner (id)
id : ホムンクルスの id
戻り値 : なし
機能 : ホムンクルスを召喚者の近くに移動させる
主人の元にホムを帰還させる関数です
ホムの主人はクライアントが知っているので、
主人のIDは指定する必要がありません
2) Move (id, x, y)
id : ホムンクルスの id
x : 目的地X 座標
y : 目的地Y 座標
戻り値 : なし
機能 : ホムンクルスを目的地に移動させる
ホムを指定座標に移動させます
座標はMAP内の絶対座標なので、
画面がスクロールしても関係ありません
3) Attack (id1, id2)
id1 : ホムンクルスの id
id2 : 攻撃対象の id
戻り値 : なし
機能 : ホムンクルスに id2 を攻撃させる
ホムに攻撃させます
攻撃範囲内に対象がいないと意味が無いので、
まずは追跡と、攻撃範囲判定が必要です
4) GetV (V_***, id)
V_*** : 対象の情報を表す定数値
id : 対象のid
戻り値 : V_***によって異なる
※例えば、V_POSITION の場合は x、y 座標、V_HP の場合は HP
機能 : id の情報(V_***)を得る。情報を表す定数値は Util.lua に定義されている
さまざまな情報を取得するのに使います
使える定数は以下の通りです
V_OWNER = 0 -- 召喚者のID
V_POSITION = 1 -- 座標 (x、y)
V_TYPE = 2 -- タイプ(未実装)
V_MOTION = 3 -- 現在の命令
V_ATTACKRANGE = 4 -- 物理攻撃範囲(未実装。現在は1 セルに固定)
V_TARGET = 5 -- 攻撃、スキル使用対象のID
V_SKILLATTACKRANGE = 6 -- スキル攻撃範囲(未実装)
V_HOMUNTYPE = 7 -- ホムンクルスの種類
V_HP = 8 -- HP (ホムンクルスと召喚者)
V_SP = 9 -- SP (ホムンクルスと召喚者)
V_MAXHP = 10 -- 最大 HP (ホムンクルスと召喚者)
V_MAXSP = 11 -- 最大 HP (ホムンクルスと召喚者)
5) GetActors ()
戻り値 : id を返還(LUA の table 形式に返還される)
機能 : キャラクターの視界内のキャラクター、NPC、モンスター、
アイテム、スキルなどの id を取得する
他の関数を見ればわかるように、
動作には対象のIDが必要です
この関数は画面内の全てのIDを取得しますが、
それが何であるかの区別は別に必要です
6) GetTick ()
戻り値 : 1/1000 秒単位の数字
機能 : コンピューターの現在の時間を取得。
この値は、コンピューター起動時に 0 からカウントし、
1/1000 秒ごとに 1 ずつの増加する
時間を取得する関数です
一定時間ごとに何かをさせたい、スキルの持続時間は・・・など、
改造の際には良く使うことになるでしょう
7) GetMsg (id)
id : ホムンクルスの id
戻り値 : ROクライアントから伝達したメッセージ(LUA の table 形式に返還される
機能 : 使用者の直接的な命令等をスクリプトで伝達する
プレイヤーが出した命令を取得します
対象のID、スキルのIDなどが配列になって格納されます
8) GetResMsg (id)
id : ホムンクルスの id
戻り値 : RO クライアントから伝達した予約メッセージ(LUA の table 形式に返還される)
機能 : 使用者の直接的な予約命令等をスクリプトで伝達する
予約メッセージというのがどういうものかわかりません・・・
デフォルトの骨組みを流用する限り、
考えなくても良いでしょう
10) SkillObject (id, level, skill, target)
id : ホムンクルスの id
level : レベル(skill に対応)
skill : スキルの id
target : 対象の id
戻り値 : なし
機能 : ホムンクルスが、対象(target)に対して level 値に対応したスキル(skill)を使用
ホムにスキルを使わせます
射程内に対象がいないと意味が無いので、追跡等が必須です
スキルのIDはTraceAI関数(後述)で調べましょう
11) SkillGround (id、level、skill、x、y)
id : ホムンクルスの id
level : レベル(skill に対応)
skill : スキルの id
x : x 座標
y : y 座標
戻り値 : なし
機能 : ホムンクルスが、x、y 座標に対して level 値に対応したスキル(skill)を使用
現在は未実装ですが、範囲攻撃スキルを使用する関数です
12) IsMonster (id)
id : 対象のid
戻り値 : id にあたるのがモンスターなら 1 を、そうでなければ 0 を返還する。
機能 : モンスターを判別する
GetActors関数で取得したIDが、
モンスターであるのかを判別するのに使います
13) TraceAI (string)
string : TraceAI.txt ファイルに記録される内容。文字列
戻り値 : なし
機能 : 実行中のスクリプトの現在状態を記録する
この説明ではわかりづらいですよね
要するに、デバック文を出力する関数です
ゲーム中に「/traceai」と打ち込むと、
実行中のAIがTraceAI関数を通過する際に、
デバックログに引数の文字列を出力します
プログラムは目に見えないものですが、
必要なところにデバック文を入れておくことで、
プログラムがどこを通ったのか、IDが何だったのか、
そういった情報を後から確認できます
A-2:Util定義関数
Util.luaに定義された関数です
こちらも重要なものが多いです
1) リスト系関数
List.new ():新規リスト生成
List.pushleft (list, value):左から値を挿入
List.pushright (list, value):右から値を挿入
List.popleft (list):左から値を取り出す
List.popright (list):右から値を取り出す
List.clear (list):リストをクリアする
List.size (list):リストのサイズを取得する
情報処理関係の試験勉強をした方ならご存知だと思いますが、
ここではわからない方向けの説明を
例えば、値を格納する管があったとすると・・・
pushleft
----------------------
○→ ○○○
----------------------
pushright
----------------------
○○○○ ←○
----------------------
popleft
----------------------
←○ ○○○○
----------------------
popright
----------------------
○○○ ○→
----------------------
・・・なんとなくわかりますかね?
2) GetDistance (x1,y1,x2,y2)
二点間の距離を計算します(整数)
ベクトルのサイズを計算してますので、
ホムの距離感覚は円形に広がっていることになります
3) GetDistance2 (id1, id2)
2つの対象の間の距離を計算します
どちらかが画面外にいる場合は-1が返ります
4) GetOwnerPosition (id)
主人の座標を返します
5) GetDistanceFromOwner (id)
主人との距離を計算します
どちらかが画面外にいる場合、-1が返ります
6) IsOutOfSight (id1,id2)
2つの対象が「見えない位置」にいるかを判断します
画面外にいるか、20より離れているとtrue
20以内にいる場合はfalseを返します
7) IsInAttackSight (id1,id2)
id1の対象がid2の対象を攻撃可能であるか、
射程内にいるかを返します
以上、関数を見てきました
これでAI改造の準備はばっちりです
最後に、第1回でも書きましたが、
「USER_AI」フォルダの準備をしておきましょう
次回からはここにあるAIを改造していきます
A-1:クライアント定義関数
まずは、マニュアルにもある、
クライアントで定義された関数を見ていきます
1) MoveToOwner (id)
id : ホムンクルスの id
戻り値 : なし
機能 : ホムンクルスを召喚者の近くに移動させる
主人の元にホムを帰還させる関数です
ホムの主人はクライアントが知っているので、
主人のIDは指定する必要がありません
2) Move (id, x, y)
id : ホムンクルスの id
x : 目的地X 座標
y : 目的地Y 座標
戻り値 : なし
機能 : ホムンクルスを目的地に移動させる
ホムを指定座標に移動させます
座標はMAP内の絶対座標なので、
画面がスクロールしても関係ありません
3) Attack (id1, id2)
id1 : ホムンクルスの id
id2 : 攻撃対象の id
戻り値 : なし
機能 : ホムンクルスに id2 を攻撃させる
ホムに攻撃させます
攻撃範囲内に対象がいないと意味が無いので、
まずは追跡と、攻撃範囲判定が必要です
4) GetV (V_***, id)
V_*** : 対象の情報を表す定数値
id : 対象のid
戻り値 : V_***によって異なる
※例えば、V_POSITION の場合は x、y 座標、V_HP の場合は HP
機能 : id の情報(V_***)を得る。情報を表す定数値は Util.lua に定義されている
さまざまな情報を取得するのに使います
使える定数は以下の通りです
V_OWNER = 0 -- 召喚者のID
V_POSITION = 1 -- 座標 (x、y)
V_TYPE = 2 -- タイプ(未実装)
V_MOTION = 3 -- 現在の命令
V_ATTACKRANGE = 4 -- 物理攻撃範囲(未実装。現在は1 セルに固定)
V_TARGET = 5 -- 攻撃、スキル使用対象のID
V_SKILLATTACKRANGE = 6 -- スキル攻撃範囲(未実装)
V_HOMUNTYPE = 7 -- ホムンクルスの種類
V_HP = 8 -- HP (ホムンクルスと召喚者)
V_SP = 9 -- SP (ホムンクルスと召喚者)
V_MAXHP = 10 -- 最大 HP (ホムンクルスと召喚者)
V_MAXSP = 11 -- 最大 HP (ホムンクルスと召喚者)
5) GetActors ()
戻り値 : id を返還(LUA の table 形式に返還される)
機能 : キャラクターの視界内のキャラクター、NPC、モンスター、
アイテム、スキルなどの id を取得する
他の関数を見ればわかるように、
動作には対象のIDが必要です
この関数は画面内の全てのIDを取得しますが、
それが何であるかの区別は別に必要です
6) GetTick ()
戻り値 : 1/1000 秒単位の数字
機能 : コンピューターの現在の時間を取得。
この値は、コンピューター起動時に 0 からカウントし、
1/1000 秒ごとに 1 ずつの増加する
時間を取得する関数です
一定時間ごとに何かをさせたい、スキルの持続時間は・・・など、
改造の際には良く使うことになるでしょう
7) GetMsg (id)
id : ホムンクルスの id
戻り値 : ROクライアントから伝達したメッセージ(LUA の table 形式に返還される
機能 : 使用者の直接的な命令等をスクリプトで伝達する
プレイヤーが出した命令を取得します
対象のID、スキルのIDなどが配列になって格納されます
8) GetResMsg (id)
id : ホムンクルスの id
戻り値 : RO クライアントから伝達した予約メッセージ(LUA の table 形式に返還される)
機能 : 使用者の直接的な予約命令等をスクリプトで伝達する
予約メッセージというのがどういうものかわかりません・・・
デフォルトの骨組みを流用する限り、
考えなくても良いでしょう
10) SkillObject (id, level, skill, target)
id : ホムンクルスの id
level : レベル(skill に対応)
skill : スキルの id
target : 対象の id
戻り値 : なし
機能 : ホムンクルスが、対象(target)に対して level 値に対応したスキル(skill)を使用
ホムにスキルを使わせます
射程内に対象がいないと意味が無いので、追跡等が必須です
スキルのIDはTraceAI関数(後述)で調べましょう
11) SkillGround (id、level、skill、x、y)
id : ホムンクルスの id
level : レベル(skill に対応)
skill : スキルの id
x : x 座標
y : y 座標
戻り値 : なし
機能 : ホムンクルスが、x、y 座標に対して level 値に対応したスキル(skill)を使用
現在は未実装ですが、範囲攻撃スキルを使用する関数です
12) IsMonster (id)
id : 対象のid
戻り値 : id にあたるのがモンスターなら 1 を、そうでなければ 0 を返還する。
機能 : モンスターを判別する
GetActors関数で取得したIDが、
モンスターであるのかを判別するのに使います
13) TraceAI (string)
string : TraceAI.txt ファイルに記録される内容。文字列
戻り値 : なし
機能 : 実行中のスクリプトの現在状態を記録する
この説明ではわかりづらいですよね
要するに、デバック文を出力する関数です
ゲーム中に「/traceai」と打ち込むと、
実行中のAIがTraceAI関数を通過する際に、
デバックログに引数の文字列を出力します
プログラムは目に見えないものですが、
必要なところにデバック文を入れておくことで、
プログラムがどこを通ったのか、IDが何だったのか、
そういった情報を後から確認できます
A-2:Util定義関数
Util.luaに定義された関数です
こちらも重要なものが多いです
1) リスト系関数
List.new ():新規リスト生成
List.pushleft (list, value):左から値を挿入
List.pushright (list, value):右から値を挿入
List.popleft (list):左から値を取り出す
List.popright (list):右から値を取り出す
List.clear (list):リストをクリアする
List.size (list):リストのサイズを取得する
情報処理関係の試験勉強をした方ならご存知だと思いますが、
ここではわからない方向けの説明を
例えば、値を格納する管があったとすると・・・
pushleft
----------------------
○→ ○○○
----------------------
pushright
----------------------
○○○○ ←○
----------------------
popleft
----------------------
←○ ○○○○
----------------------
popright
----------------------
○○○ ○→
----------------------
・・・なんとなくわかりますかね?
2) GetDistance (x1,y1,x2,y2)
二点間の距離を計算します(整数)
ベクトルのサイズを計算してますので、
ホムの距離感覚は円形に広がっていることになります
3) GetDistance2 (id1, id2)
2つの対象の間の距離を計算します
どちらかが画面外にいる場合は-1が返ります
4) GetOwnerPosition (id)
主人の座標を返します
5) GetDistanceFromOwner (id)
主人との距離を計算します
どちらかが画面外にいる場合、-1が返ります
6) IsOutOfSight (id1,id2)
2つの対象が「見えない位置」にいるかを判断します
画面外にいるか、20より離れているとtrue
20以内にいる場合はfalseを返します
7) IsInAttackSight (id1,id2)
id1の対象がid2の対象を攻撃可能であるか、
射程内にいるかを返します
以上、関数を見てきました
これでAI改造の準備はばっちりです
最後に、第1回でも書きましたが、
「USER_AI」フォルダの準備をしておきましょう
次回からはここにあるAIを改造していきます