<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="http://merchant-murmur.info/styles-rdf.css" type="text/css"?>

<rss version="2.0">
<channel>
<title>まーちゃんのつぶやき: カテゴリ 'Lua'</title>
<link>http://merchant-murmur.info/</link>
<description></description>
<language>ja</language>
<copyright>Copyright 2007</copyright>
<lastBuildDate>Sat, 08 Apr 2006 18:43:05 +0900</lastBuildDate>
<generator>http://www.movabletype.org/?v=3.34</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs> 

<item>
<title>しまった</title>
<description><![CDATA[<p>グローバル変数がイヤだからステータス類を配列にしたのに！<br />
これじゃあデフォルトとか他の人のAI（使ったことないけど）とまったく互換がっ…！！！<br />
配列やめて値を設定・参照する関数にif文の羅列書きますか…<br />
互換性に問題があるならしょうがない。</p>

<p>しょぼーん</p>

<p><br />
っていうかですね、座標を求める系で三角関数を使いたいんですがさっぱり忘れてました（笑）<br />
人間使わないと忘れるもんですね！</p>]]></description>
<link>http://merchant-murmur.info/archives/2006/04/08/184305.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/08/184305.php</guid>
<category>Lua</category>
<pubDate>Sat, 08 Apr 2006 18:43:05 +0900</pubDate>
</item>
<item>
<title>TraceAIで吐き出したログを見るのに…</title>
<description><![CDATA[<p>いちいちテキストエディタやコマンドプロンプトでtypeコマンドを使うのがわずらわしい人(1/20)</p>

<p>Unixならtailコマンドに-fオプションつけてファイル読めば追加された行をほぼリアルタイムで表示してくれるんですけどね。<br />
Windowsでもフリーソフトで公開されているtailコマンドもあるんですが、GUIなので軽くなかったりして不満点も。</p>

<p>で、実は<b><a href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en" target="_blank">Windows Server 2003 Resource Kit Tools</a></b>にtailコマンドが入っていたりします。<br />
このtailコマンドはUnixと同じくコマンドラインで実行するタイプなので割と軽いです。</p>

<p>動作環境はWindows Server 2003とWindows XPなのでダウンロードして試してみても良いかも。<br />
ただし、注意点として、/traceaiを切り替える毎にtraceai.txtを作り直すのでtailコマンドが途中で落ちちゃいます。<br />
なので/traceaiでファイルを作成後に実行するのが吉<br />
以下のように実行するとファイルに情報が書き込まれるたびにそれを表示してくれます。</p>

<p><font size="+2">tail -f &lt;ROのインストールされているフォルダ&gt;\traceai.txt</font><br />
</p>]]></description>
<link>http://merchant-murmur.info/archives/2006/04/08/010330.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/08/010330.php</guid>
<category>Lua</category>
<pubDate>Sat, 08 Apr 2006 01:03:30 +0900</pubDate>
</item>
<item>
<title>ごにょごにょやってて気づいたこと　#003</title>
<description><![CDATA[<pre>
Luaのリファレンスを時間が出来たときに読んでいたんですが、
Luaは配列に関数を入れることが出来るようなので、イベント用の定数を使って関数を配列に放り込みましたよ。
これならif文の羅列にならないし良いですね、ただし、定義していない値を入れると一瞬のうちにエラーになりますがが。

普通は以下のように関数を宣言するところを…
function 関数名(パラメータ...)
end

下記のように記述すると配列に格納可能ですね。
配列名 = {}
配列名[添え字] = function (パラメータ...)
end

呼び出しは以下のように
配列名[添え字](パラメータ...)

とりあえず実装そたのが下記
ST_FIRSTBOOTはホムがMAP上に出現したタイミングで呼ばれたときに設定しています。
つまり、一番初めに行いたい処理を書くところですね。
私は左に1セルずれるように設定しました。

<blockquote>
----------------------------------------------------------------------
-- イベント用関数
----------------------------------------------------------------------

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

</blockquote>


そんなわけで、それを実装したai.lua、すっきり！
<blockquote>
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
</blockquote>

</pre>
]]></description>
<link>http://merchant-murmur.info/archives/2006/04/07/010615.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/07/010615.php</guid>
<category>Lua</category>
<pubDate>Fri, 07 Apr 2006 01:06:15 +0900</pubDate>
</item>
<item>
<title>ごにょごにょやってて気づいたこと　#002</title>
<description><![CDATA[<pre>

<a href="http://blog.livedoor.jp/rk496/" target="_blank">寝落ち姫</a>の所をみて発覚したこと。
GetVに渡すパラメータでV_HOMUNTYPEとホムのIDを渡すとホムの種類が返るんですが、
IDにMobのIDを渡すとMobの種類を示すIDが返るそうな。

今の時点で欲しいのは草とプラントボトル・マインボトルのIDが欲しいので早速やってみることに！
デフォルトAIのOnATTACK_OBJECT_CMD 関数の中にTraceAIで関数に渡されたidに対して
GetV関数で情報を取得してTraceAIでファイルに保存。

結果、とれました(・ω・)なんてザルな実装だ！

とりあえず取れたものを定数にしても良かったんですが、配列にして添え字でIDを参照するようにしました。

<blockquote>

--草の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  -- マリンスフィアー
}

</blockquote>

配列をlocal宣言しているのは関数作って判定だけさせるので直接この値を他のファイルから呼び出す必要はないかなと思って。


で、作った関数がこれ

<blockquote>

--配列内(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

</blockquote>

汎用の配列内の値をチェックする関数と草かプラントかを返す関数。
これで草を殴ったりプラントのMobを殴らない設定ができますね(・ω・)

※2006/04/06 白い草関連の定数と値を追加、ぬけてました
</pre>
]]></description>
<link>http://merchant-murmur.info/archives/2006/04/04/230832.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/04/230832.php</guid>
<category>Lua</category>
<pubDate>Tue, 04 Apr 2006 23:08:32 +0900</pubDate>
</item>
<item>
<title>ごにょごにょやってて気づいたこと　#001</title>
<description><![CDATA[<pre>
どうやら関数外の場所で宣言したlocal変数や配列のスコープはそのファイルの中全体のもよう。
しかも値を保持してるっぽいので変数の実態をいじらせることはさせずにできそう。
ただ、宣言を再度通すと値が吹っ飛んでいるっぽい。

ためしに書いてみたもの
<blockquote>
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
</blockquote>

これを単一のファイルにしてai.luaとかでインポートするとちゃんとGet,Setの関数が値を出し入れできてるので良い感じ。
個人的にはグローバル変数とかで直接入れるのもいいと思うけど、
スペルミスすると結構デバックに時間食ったりするのであんまり好きじゃないので。
</pre>]]></description>
<link>http://merchant-murmur.info/archives/2006/04/04/014631.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/04/014631.php</guid>
<category>Lua</category>
<pubDate>Tue, 04 Apr 2006 01:46:31 +0900</pubDate>
</item>
<item>
<title>MurMurライブラリメモ #001</title>
<description><![CDATA[<pre>
地点1からみて地点2の方角を求める関数。
画面上側を北(標準の視点)として求めるのでキャラがどっち向きかは考慮しません。
あくまで座標上の話。
<br />

<blockquote>
--方角用の定数を定義
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
</blockquote>

って、なんかLuaってand,or演算にめっちゃ癖あるしっ！orzこのままじゃ論理演算使えない…っ

試しに使ってみました、召喚者の左側にとまる様になります。
なんで左かって、そりゃ心臓に近いからですよ！(謎)

<blockquote>
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
</blockquote>

コメントがまったくないのはご愛嬌(｀・ω・´)
あと、この関数を乗せるとALT+右クリックで移動させても戻ってくるさみしんぼホムになりますのでご注意を（笑）
ALT+右で移動後に復帰するときはとりあえずもどってくるレベルですね、召喚者がどこ向いてるかはわからないので。
</pre>]]></description>
<link>http://merchant-murmur.info/archives/2006/04/02/205604.php</link>
<guid>http://merchant-murmur.info/archives/2006/04/02/205604.php</guid>
<category>Lua</category>
<pubDate>Sun, 02 Apr 2006 20:56:04 +0900</pubDate>
</item>
<item>
<title>Lua関連リンク</title>
<description><![CDATA[<p>中|ω・)＜おぼえがき</p>

<p>Lua関連<br />
<ul><br />
<li /><a href="http://www.lua.org/" target="_blank">Lua本家</a><br />
<li /><a href="http://uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html" target="_blank">Lua 5.0 リファレンスマニュアル </a>(日本語訳)<br />
</ul></p>

<p>ホム関連<br />
<ul><br />
<li /><a href="http://www.ragnarokonline.jp/news/play/update060314/AI_manual_ver1.pdf" target="_blank">ガンホー謹製マニュアル</a><br />
<li /><a href="http://www.sgv417.jp/~winter/alchemy/emulator.html" target="_blank">ホムAIエミュレータ</a><br />
</ul></p>

<p><br />
中|ω・)＜ちなみに、Lua関連の話題はインデックスエントリに表示されませんのあしからず</p>]]></description>
<link>http://merchant-murmur.info/archives/2006/03/15/195310.php</link>
<guid>http://merchant-murmur.info/archives/2006/03/15/195310.php</guid>
<category>Lua</category>
<pubDate>Wed, 15 Mar 2006 19:53:10 +0900</pubDate>
</item>


</channel>
</rss>
