2006/04/08
しまった
グローバル変数がイヤだからステータス類を配列にしたのに!
これじゃあデフォルトとか他の人のAI(使ったことないけど)とまったく互換がっ…!!!
配列やめて値を設定・参照する関数にif文の羅列書きますか…
互換性に問題があるならしょうがない。
しょぼーん
っていうかですね、座標を求める系で三角関数を使いたいんですがさっぱり忘れてました(笑)
人間使わないと忘れるもんですね!
投稿者 Merchant : 18:43 | コメント (2) | トラックバック(0) | カテゴリ [Lua ]
TraceAIで吐き出したログを見るのに…
いちいちテキストエディタやコマンドプロンプトでtypeコマンドを使うのがわずらわしい人(1/20)
Unixならtailコマンドに-fオプションつけてファイル読めば追加された行をほぼリアルタイムで表示してくれるんですけどね。
Windowsでもフリーソフトで公開されているtailコマンドもあるんですが、GUIなので軽くなかったりして不満点も。
で、実はWindows Server 2003 Resource Kit Toolsにtailコマンドが入っていたりします。
このtailコマンドはUnixと同じくコマンドラインで実行するタイプなので割と軽いです。
動作環境はWindows Server 2003とWindows XPなのでダウンロードして試してみても良いかも。
ただし、注意点として、/traceaiを切り替える毎にtraceai.txtを作り直すのでtailコマンドが途中で落ちちゃいます。
なので/traceaiでファイルを作成後に実行するのが吉
以下のように実行するとファイルに情報が書き込まれるたびにそれを表示してくれます。
tail -f <ROのインストールされているフォルダ>\traceai.txt
投稿者 Merchant : 01:03 | コメント (2) | トラックバック(0) | カテゴリ [Lua ]
2006/04/07
ごにょごにょやってて気づいたこと #003
Luaのリファレンスを時間が出来たときに読んでいたんですが、
Luaは配列に関数を入れることが出来るようなので、イベント用の定数を使って関数を配列に放り込みましたよ。
これならif文の羅列にならないし良いですね、ただし、定義していない値を入れると一瞬のうちにエラーになりますがが。
普通は以下のように関数を宣言するところを…
function 関数名(パラメータ...)
end
下記のように記述すると配列に格納可能ですね。
配列名 = {}
配列名[添え字] = function (パラメータ...)
end
呼び出しは以下のように
配列名[添え字](パラメータ...)
とりあえず実装そたのが下記
ST_FIRSTBOOTはホムがMAP上に出現したタイミングで呼ばれたときに設定しています。
つまり、一番初めに行いたい処理を書くところですね。
私は左に1セルずれるように設定しました。
----------------------------------------------------------------------
-- イベント用関数
----------------------------------------------------------------------
onStateFunc = {}
onStateFunc[ST_FIRSTBOOT] = function (myid)
local ox, oy = GetV(V_POSITION, GetV(V_OWNER, myid))
Move(myid, ox - 1, oy)
setMyState(MY_OWNERID, GetV(V_OWNER, myid))
setMyState(MY_STATE, ST_IDLE) -- ここでアイドル状態にする
end
onStateFunc[ST_IDLE] = function (myid)
sideByOwner(getMyState(MY_OWNERID), myid)
end
onStateFunc[ST_CHASE] = function (myid)
end
onStateFunc[ST_ATTACK] = function (myid)
end
そんなわけで、それを実装したai.lua、すっきり!
require "./AI/Const.lua"
require "./AI/Util.lua"
require "./AI/USER_AI/murmur-config.lua"
require "./AI/USER_AI/murmur-const.lua"
require "./AI/USER_AI/murmur-function.lua"
function AI(myid)
onStateFunc[getMyState(MY_STATE)](MyID)
end
-- 注意 -- ここでごそごそとやってるコードはあくまで評価用とか実験用です。 ご自身のコードに貼り付けたりするのは自由ですが、貼り付けたプログラムを第三者に配布する場合は、 大変お手数とは思いますが、事前にご一報頂きますようお願いします。 また、プログラムを利用したことで損害や障害が発生したとしても、 当方では一切の責任を負いかねますのでよろしくお願いします。
投稿者 Merchant : 01:06 | コメント (0) | トラックバック(0) | カテゴリ [Lua ]
2006/04/04
ごにょごにょやってて気づいたこと #002
寝落ち姫の所をみて発覚したこと。 GetVに渡すパラメータでV_HOMUNTYPEとホムのIDを渡すとホムの種類が返るんですが、 IDにMobのIDを渡すとMobの種類を示すIDが返るそうな。 今の時点で欲しいのは草とプラントボトル・マインボトルのIDが欲しいので早速やってみることに! デフォルトAIのOnATTACK_OBJECT_CMD 関数の中にTraceAIで関数に渡されたidに対して GetV関数で情報を取得してTraceAIでファイルに保存。 結果、とれました(・ω・)なんてザルな実装だ! とりあえず取れたものを定数にしても良かったんですが、配列にして添え字でIDを参照するようにしました。--草のIDを求めるための定数 GRASS_NOT = 0 -- 草じゃない GRASS_GREEN = 1 -- 緑草 GRASS_RED = 2 -- 赤草 GRASS_YELLOW = 3 -- 黄草 GRASS_WHITE = 4 -- 白草 GRASS_BLUE = 5 -- 青草 GRASS_SHINE = 6 -- 輝く草 --ボトル系MobのIDを求めるための定数 BOTTLE_NOT = 0 -- ボトル系Mobじゃない BOTTLE_P01 = 1 -- マンドラゴラ BOTTLE_P02 = 2 -- ヒドラ BOTTLE_P03 = 3 -- フローラ BOTTLE_P04 = 4 -- フェアリーフ BOTTLE_P05 = 5 -- ジオグラファー BOTTLE_M01 = 6 -- マリンスフィアー -- 草のID -- 草のID local ID_GRASS = { -- 草(枝Mobは異なるらしい?) [GRASS_GREEN] = 1080, -- 緑草 [GRASS_RED] = 1078, -- 赤草 [GRASS_YELLOW] = 1081, -- 黄草 [GRASS_WHITE] = 1082, -- 白草 [GRASS_BLUE] = 1079, -- 青草 [GRASS_SHINE] = 1083 -- 輝く草 } -- プラント・マインボトルMobのID local ID_BOTTLE = { -- ボトル系Mob(プラント、マイン) [BOTTLE_P01] = 1589, -- マンドラゴラ [BOTTLE_P02] = 1579, -- ヒドラ [BOTTLE_P03] = 1575, -- フローラ [BOTTLE_P04] = 1555, -- フェアリーフ [BOTTLE_P05] = 1590, -- ジオグラファー [BOTTLE_M01] = 1142 -- マリンスフィアー }配列をlocal宣言しているのは関数作って判定だけさせるので直接この値を他のファイルから呼び出す必要はないかなと思って。 で、作った関数がこれ--配列内(table)の値と渡された値(value)がマッチするか --マッチしたときはそのときの添え字を返す、見つからなかった場合defvalueに設定された値を返す --配列が空の場合-1を返す --配列の途中にnilがあると処理が終了してしまうので注意 local function isCheck(value, table, defvalue) local i, v local result = defvalue if (table == nil) then result = -1 else for i, v in ipairs(table) do if (value == v) then result = i break end end end return result end --対象のidが草がどうかチェック、渡すidはGetV関数のV_HOMUNTYPEで取得した値 --草の場合どの草かを返す、0は草じゃない function isGrass(id) return isCheck(id, ID_GRASS, GRASS_NOT) end --対象のidがプラントボトル・マインボトルのMobかチェック、渡すidはGetV関数のV_HOMUNTYPEで取得した値 --草の場合どのMobかを返す、0はプラントのMobではない function isBottle(id) return isCheck(id, ID_BOTTLE, BOTTLE_NOT) end汎用の配列内の値をチェックする関数と草かプラントかを返す関数。 これで草を殴ったりプラントのMobを殴らない設定ができますね(・ω・) ※2006/04/06 白い草関連の定数と値を追加、ぬけてました
-- 注意 -- ここでごそごそとやってるコードはあくまで評価用とか実験用です。 ご自身のコードに貼り付けたりするのは自由ですが、貼り付けたプログラムを第三者に配布する場合は、 大変お手数とは思いますが、事前にご一報頂きますようお願いします。 また、プログラムを利用したことで損害や障害が発生したとしても、 当方では一切の責任を負いかねますのでよろしくお願いします。
投稿者 Merchant : 23:08 | コメント (4) | トラックバック(0) | カテゴリ [Lua ]
ごにょごにょやってて気づいたこと #001
どうやら関数外の場所で宣言したlocal変数や配列のスコープはそのファイルの中全体のもよう。 しかも値を保持してるっぽいので変数の実態をいじらせることはさせずにできそう。 ただ、宣言を再度通すと値が吹っ飛んでいるっぽい。 ためしに書いてみたものlocal MyStatus = {} -- ステータスを保持する配列 MY_STATE = 0 -- 現在のステータス MY_ID = 1 -- ホムンクルスのID MY_OWNERID = 2 -- ホムンクルス召喚者のID MY_ENEMY = 3 -- 攻撃対象MobのID MY_POSX = 4 -- 現在の位置X MY_POSY = 5 -- 現在の位置Y MY_PATX = 6 -- パトロール先X MY_PATY = 7 -- パトロール先Y MY_SKILL = 8 -- 使用するスキル MY_SKILLLV = 9 -- 使用するスキルのレベル --ステータス用配列から値を取得 --引数indexには取り出したい値の添字を与える --値がnilの場合はnilを返す function GetMyStatus(index) return MyStatus[index] end --ステータス用配列へ値を設定 --引数indexには設定したい配列の添字、valueには値を与える --返り値は設定した値、添え字がnilの場合nilを返す function SetMyStatus(index, value) if (index ~= nil) then MyStatus[index] = value return MyStatus[index] end return nil end --添字MY_IDにセットされた値を返す --値がnilの場合はnilを返す function GetMyID() return GetMyStatus(MY_ID) endこれを単一のファイルにしてai.luaとかでインポートするとちゃんとGet,Setの関数が値を出し入れできてるので良い感じ。 個人的にはグローバル変数とかで直接入れるのもいいと思うけど、 スペルミスすると結構デバックに時間食ったりするのであんまり好きじゃないので。
-- 注意 -- ここでごそごそとやってるコードはあくまで評価用とか実験用です。 ご自身のコードに貼り付けたりするのは自由ですが、貼り付けたプログラムを第三者に配布する場合は、 大変お手数とは思いますが、事前にご一報頂きますようお願いします。 また、プログラムを利用したことで損害や障害が発生したとしても、 当方では一切の責任を負いかねますのでよろしくお願いします。
投稿者 Merchant : 01:46 | コメント (0) | トラックバック(0) | カテゴリ [Lua ]
2006/04/02
MurMurライブラリメモ #001
地点1からみて地点2の方角を求める関数。 画面上側を北(標準の視点)として求めるのでキャラがどっち向きかは考慮しません。 あくまで座標上の話。
--方角用の定数を定義 D_HERE = 0 -- 同一座標 D_EAST = 1 -- 東 D_WEST = 2 -- 西 D_NORTH = 4 -- 南 D_SOUTH = 8 -- 北 --[[ x1,y1に対してx2,y2の場所はどの方角になるかを返す。 8方向の値を返す、返り値は数値の和になる、ただし反対方向の値とは一緒に返らない。 (例 東南 = 5, 北西 = 10 など 東西や南北はありえない --]] function GetDirection(x1, y1 , x2, y2) local diffX, diffY = 0, 0 local pos = D_HERE diffX = x1 - x2 diffY = y1 - y2 if (diffX < 0) then pos = pos + D_EAST --東 elseif (diffX > 0) then pos = pos + D_WEST --西 end if (diffY < 0) then pos = pos + D_NORTH --南 elseif (diffY > 0) then pos = pos + D_SOUTH --北 end return pos endって、なんかLuaってand,or演算にめっちゃ癖あるしっ!orzこのままじゃ論理演算使えない…っ 試しに使ってみました、召喚者の左側にとまる様になります。 なんで左かって、そりゃ心臓に近いからですよ!(謎)function MoveSideToOwner(myid) local OwnPosX, OwnPosY = GetOwnerPosition(myid) local MyPosX, MyPosY = GetV(V_POSITION, myid) local MoveDirection = GetDirection(MyPosX, MyPosY, OwnPosX, OwnPosY) local MovePatternX = {0,0,0,-1,-1,-1,0,1,1,1} local MovePatternY = {1,-1,0,0,1,-1,-1,0,1,-1} --召喚者と同じ座標もしくは1セル以上離れていない場合は移動しない(1セルも処理すると結構うざい if (MoveDirection ~= D_HERE and GetDistanceFromOwner(myid) > 1) then Move(myid, OwnPosX + MovePatternX[MoveDirection], OwnPosY + MovePatternY[MoveDirection]) end endコメントがまったくないのはご愛嬌(`・ω・´) あと、この関数を乗せるとALT+右クリックで移動させても戻ってくるさみしんぼホムになりますのでご注意を(笑) ALT+右で移動後に復帰するときはとりあえずもどってくるレベルですね、召喚者がどこ向いてるかはわからないので。
-- 注意 -- ここでごそごそとやってるコードはあくまで評価用とか実験用です。 ご自身のコードに貼り付けたりするのは自由ですが、貼り付けたプログラムを第三者に配布する場合は、 大変お手数とは思いますが、事前にご一報頂きますようお願いします。 また、プログラムを利用したことで損害や障害が発生したとしても、 当方では一切の責任を負いかねますのでよろしくお願いします。
投稿者 Merchant : 20:56 | コメント (0) | トラックバック(0) | カテゴリ [Lua ]
2006/03/15
Lua関連リンク
中|ω・)<おぼえがき
Lua関連
Lua本家
Lua 5.0 リファレンスマニュアル (日本語訳)
ホム関連
中|ω・)<ちなみに、Lua関連の話題はインデックスエントリに表示されませんのあしからず
投稿者 Merchant : 19:53 | カテゴリ [Lua ]

