AI.lua

Pocket

AI.lua の中身を解説してみるページ

まず、大まかなブロックに分けると次のようになります。

AI.lua
-----------------------------
-- state
-----------------------------
------------------------------------------
-- global variable
------------------------------------------
------------- command process ---------------------
OnMOVE_CMD (x,y)
OnSTOP_CMD ()
OnATTACK_OBJECT_CMD (id)
OnATTACK_AREA_CMD (x,y)
OnPATROL_CMD (x,y)
OnHOLD_CMD ()
OnSKILL_OBJECT_CMD (level,skill,id)
OnSKILL_AREA_CMD (level,skill,x,y)
OnFOLLOW_CMD ()
ProcessCommand (msg)
-------------- state process --------------------
OnIDLE_ST ()
OnFOLLOW_ST ()
OnCHASE_ST ()
OnATTACK_ST ()
OnMOVE_CMD_ST ()
OnSTOP_CMD_ST ()
OnATTACK_OBJECT_CMD_ST ()
OnATTACK_AREA_CMD_ST ()
OnPATROL_CMD_ST ()
OnHOLD_CMD_ST ()
OnSKILL_OBJECT_CMD_ST ()
OnSKILL_AREA_CMD_ST ()
OnFOLLOW_CMD_ST ()
GetOwnerEnemy (myid)
GetMyEnemy (myid)
GetMyEnemyA (myid)
GetMyEnemyB (myid)
AI(myid)


ブロック1

-----------------------------
-- state
-----------------------------
IDLE_ST= 0
FOLLOW_ST = 1
CHASE_ST = 2
ATTACK_ST = 3
MOVE_CMD_ST = 4
STOP_CMD_ST = 5
ATTACK_OBJECT_CMD_ST = 6
ATTACK_AREA_CMD_ST = 7
PATROL_CMD_ST = 8
HOLD_CMD_ST = 9
SKILL_OBJECT_CMD_ST = 10
SKILL_AREA_CMD_ST = 11
FOLLOW_CMD_ST = 12
----------------------------

ホムが何の行動中かを表すための定数。
次のブロックに「ホムが何の行動中かを管理するための変数 MyState」があるのですが、
MyState = 3 と書かれているのを人が見ても、
3 が何をしているときの数字だったか思い出すのは大変です。
MyState = ATTACK_ST と書いてあれば、戦闘中を表す数字が入っているのがすぐにわかりますよね。
見やすくするためのひと工夫です。

ちなみに MyState は、if文で条件分岐させてホムの行動を切り替えるために使います。
一番下の関数 AI(myid) の中にあります。

if(MyState == ATTACK_ST) then -- 戦闘中を表す数字3が入っているとき
OnATTACK_ST () --戦闘のための動作が書いてある関数を呼んで、ホムに戦闘させる
elseif(MyState == FOLLOW_ST) then-- 数字1が入っているとき
OnFOLLOW_ST ()--主人を追いかける動作が書いてある関数を呼ぶ
end

OnATTACK_ST () の戦闘の処理の中に、
敵を倒して姿が見当たらなくなったら、次はif文で敵を探す行動をする関数を呼ばせるために MyState = IDLE_ST と変更する処理があります。


ブロック2

------------------------------------------
-- global variable
------------------------------------------
MyState = IDLE_ST -- 最初の状態は休息
MyEnemy = 0 -- 敵 id
MyDestX = 0 -- 目的地 x座標
MyDestY = 0 -- 目的地 y座標
MyPatrolX = 0 -- 偵察目的地 x座標
MyPatrolY = 0 -- 偵察目的地 y座標
ResCmdList = List.new() -- 予約コマンドリスト
MyID = 0 -- ホムンクルス id
MySkill = 0 -- ホムンクルスのスキル
MySkillLevel = 0 -- ホムンクルスのスキルレベル
------------------------------------------


必要な情報を入れておくための変数。
グローバルなのでどこからでも値を変更できます。

グローバルとかプライベートってなんだ、という方は、
プログラム言語自体の話になるので勉強してきてね。


ブロック3

------------- command process ---------------------
OnMOVE_CMD (x,y)
OnSTOP_CMD ()
OnATTACK_OBJECT_CMD (id)
OnATTACK_AREA_CMD (x,y)
OnPATROL_CMD (x,y)
OnHOLD_CMD ()
OnSKILL_OBJECT_CMD (level,skill,id)
OnSKILL_AREA_CMD (level,skill,x,y)
OnFOLLOW_CMD ()
ProcessCommand (msg)


Altを押しながら右クリックしたときなど、プレイヤーの操作で指示されたときの処理が書かれている部分です。

移動命令。Alt+地面を右クリック
停止命令。Alt+T?
攻撃命令。Alt+敵を右クリック2回
範囲攻撃命令。未実装なので中身なし。
パトロール命令。未実装なn
固定命令。未実装n
スキル使用命令。ホムのスキル一覧から選んで対象をクリックしたとき?
範囲スキル使用命令。未実装。
追従命令。未実装
Alt+右クリックなどの処理に必要になる情報を取得したりする処理。


ブロック4

-------------- state process --------------------
OnIDLE_ST ()
OnFOLLOW_ST ()
OnCHASE_ST ()
OnATTACK_ST ()
OnMOVE_CMD_ST ()
OnSTOP_CMD_ST ()
OnATTACK_OBJECT_CMD_ST ()
OnATTACK_AREA_CMD_ST ()
OnPATROL_CMD_ST ()
OnHOLD_CMD_ST ()
OnSKILL_OBJECT_CMD_ST ()
OnSKILL_AREA_CMD_ST ()
OnFOLLOW_CMD_ST ()


状況によって、どんな行動をすればいいか書いてある部分。
ブロック1の説明にあるMyStateの部分を見てください。


ブロック5

GetOwnerEnemy (myid)
GetMyEnemy (myid)
GetMyEnemyA (myid)
GetMyEnemyB (myid)


敵を探す処理が書いてある部分。

リーフとアミストルなら非先行型、フィーリルとバニルミルトなら先行型の関数を呼ぶ
A 非先行型(ホムを狙っていれば敵とする)
B 先行型(敵を探す)

ホムの種類に関係なく勝手に戦闘しないようにするなら、
GetMyEnemy (myid) を変更すればよいのです。


ブロック6

AI(myid)


ホムンクルスAIのメイン部分。

ROの本体(クライアント)は、ホムを召喚するとこのメイン関数だけをひたすら繰り返し実行します。

最低でもこの関数だけ書いてあれば、エラーが出ることなくホムを召喚できるということです。

他の関数はどうするのかというと、このメイン関数の中から呼び出して使います。
パソコンにマイクやヘッドホンをつけるような感じですね。

ちなみに、C言語で作ったソフトウェアのexeを起動すると、Main() という関数を繰り返し実行してるんです。

ブロック1の説明にもありますが、
MyState を使って条件分岐することでホムの行動を切り替えています。

最後まで読んでくれてありがとう!

フォローする