------------------------------------------------------------- -- 移動系拡張ライブラリ : for RO-homunculus AI -- Written by H.Tomose -- ver 2.0 2006.04.22 -- http://tomose.dynalias.net/RO/ ------------------------------------------------------------- ○目的 現状のROのホムンクルスAIのシステムでは、移動に関するいくつかの関数が提供されています。 が、これらを個人的に使っていたところ、いくつか「かゆい」ところがあり、多少の 使いづらさを感じました。 そこで、友瀬が自分用に作った移動系のコードを、ライブラリとして切り出して公開します。 ○使い方:Aiプログラムへの導入方法 1. 任意のソース(普通は ai.lua)のrequireに、このライブラリファイル Movelib.lua を加える。 2. 別途下記関数を準備してください。    ・function IsCellMovein(x,y) という関数。     座標x,yのセルにホムが進入可能なら true を返してください。    ⇒汎用の地図情報が手に入らないと難しいと思います。     逆に汎用地図情報を手に入れられるなら、Glenelgで使っている関数をそのまま使えます。    ⇒ Glenelg では maplib.lua 内に定義していますので、それをコピーすればいいでしょう。    ・function mod( a, b ) という関数。     a/b の剰余(あまり)を戻してください。例: mod( 10, 3 ) は1を戻します。    ⇒ Glenelg では Util.lua 内に定義していますので、それをコピーすればいいでしょう 3. 従来 Move()や MovetoOwner()を用いていた部分から、必要に応じてこのライブラリでの  追加関数を呼び出してください。 ○関数仕様 function MoveEx( charaID, targetX, targetY ) -- 引数 -- -- charaID : ホムンクルス自身のID -- -- targetX, targetY : 移動先の座標 -- 戻り値:実行結果 -- -- MOVE_ONMOVING == 0 == 移動受け付け/移動挑戦中。 -- -- MOVE_SUCSESS == 1 == 移動完了(現在位置と移動目標が同じ)。 -- -- MOVE_FAILURE == 2 == 移動失敗(数カウント移動していない) いくつかの追加機能を盛り込んだ、Move()関数のバリエーションです。 外部の地図情報を利用することで、少々複雑な地形でも確実に通過する ことができます。 ただし、これの機能を完全に利用するには、きちんとした実装が必要です。 具体的には、MOVE_SUCSESSかMOVE_FAILUREが戻ってくるまで、何度か 繰り返し呼び出しをしなければなりません。 このReadmeの後ろのほうにあるサンプルを参照してください。 function FollowtoOwner( charaID ) -- 引数 -- -- charaID : ホムンクルス自身のID -- 戻り値:移動目標の座標 MovetoOwner()のバリエーションといえる関数です。MovetoOwner()が 「ケミを中心とした5x5セルのいずれかに向かってホムが移動」するものだった MovetoOwner() に対して、FollowtoOwner() はその言葉通り「ケミに付き従う」ように 移動します。 具体的には「ケミに隣接するセルのうち、ホムから見て一番近いセル」を目標にします。 OnFOLLOW_ST などで MovetoOwner() の代わりに使用することで 「ホムはケミについて歩き、決して重なったり追い越したりしない」 移動が実現できるでしょう。 function IsMoveto( startx, starty , endx, endy) -- 引数 -- -- 2点の座標(startx, starty)と(endx,endy) -- 戻り値:上記2点間の直線的な移動可否。通れるならtrue、ダメなら false。 startx,starty を出発点、endx,eny を終着点として、 その間を「直線的に移動できるか否か」を確認する関数。 この関数でtrueが帰ってくれば、標準のMove()で確実に移動ができます。 (ひっかかったり止まったりしません) function CreateMap( startx, starty , endx, endy ) -- 引数 -- -- 2点の座標(startx, starty)と(endx,endy) -- 戻り値:移動可否。通れるならtrue、ダメなら false。 startx,starty を出発点、endx,eny を終着点として、その間を「移動できるか否か」を確認する関数。 IsMoveto()との違いは、経路が曲線になる可能性があること。 この関数でtrueが帰ってくれば、MoveEx() を使うことで確実に移動ができます。 ○サンプル ・サンプル 標準AIの OnMOVE_CMD_ST() を、以下のように書き換えることができます。 function OnMOVE_CMD_ST () local result TraceAI ("OnMOVE_CMD_ST") result = MoveEx( MyID, MyDestX, MyDestY ) if( result == MOVE_SUCSESS ) then -- 移動正常終了。 MyState = IDLE_ST elseif( result == MOVE_FAILURE ) then -- しばらく動けなかった。キャンセル。 -- 標準AIでは、「座標」や「前回からの時間」など、細かい条件比較を -- 自分で行わないと判定はできませんでした。 MyState = IDLE_ST TraceAI ("OnMOVE_CMD_ST: Hom was stacked. Cancel moving.") end end ○変更履歴 v2.01 テスト中だったMoveSt()を削除 v2.0 汎用壁情報に対応 v1.0 新規リリース