getkey.dllとの連携をした場合の挙動確認

http://kimikage.ddo.jp/gallery4/
偉大なるDLL"getkey.dll"がある訳ですが。
これを使えば"HIT ANY KEY"が実現できます。と言ってわかるのはオッサンだけですかね。
NScripterに用意されているNSGetKey()やcheckkeyでは、「あるキーが押されたか」はわかっても「何かキーが押されたか」は取得できません。
で、nsluaからこのDLLを使ってみるとこうなります。

system.lua

-- system.lua

NSExec("luacall animation")
function NSCALL_animation()
	NSExec("exec_dll $999")
	NSExec("getret %998")
	NSExec("getret $998")
	local key_code = NSGetIntValue(998)
	if key_code>0 then
		NSExec("caption \""..tostring(key_code).."\"")
	end
end

NSLuaAnimationInterval(20)
NSLuaAnimationMode(true)

キー入力があったら、そのキー入力の数値をステータスバーに出すだけですね。
で、これを無限に待ってみます。

00.txt

*define
	deletemenu
	game
*start
	exec_dll "getkey.dll/Init" ; 初期化
	mov $999,"getkey.dll/PeekD"

*loop
	wait 1
goto *loop

マウスボタンが取得できませんので、取得できるように書き換えます。

system.lua

-- system.lua

NSExec("luacall animation")
function NSCALL_animation()
	NSExec("exec_dll $999")
	NSExec("getret %998")
	NSExec("getret $998")
	local key_code = NSGetIntValue(998)
	if key_code>0 then
		NSExec("caption \""..tostring(key_code).."\"")
	else
		local l, r, w, ld, rd = NSGetClick()
		if ld then NSExec("caption \"left down\"") end
		if rd then NSExec("caption \"right down\"") end
	end
end

NSLuaAnimationInterval(20)
NSLuaAnimationMode(true)

まあ、だいたい取得できますね。
次はNScripter側の入力待ちを別の命令に変えてみます。
00.txt

*define
	deletemenu
	game
*start
	exec_dll "getkey.dll/Init" ; 初期化
	mov $999,"getkey.dll/PeekD"

	click
end

普通に取得できましたが、同時に通常のclickと同じ動きで終了してしまいました。
今度は、bexecで試してみます。

00.txt

*define
	deletemenu
	game
*start
	exec_dll "getkey.dll/Init" ; 初期化
	mov $999,"getkey.dll/PeekD"

*loop
	bclear
	bexec $0
	mesbox $0,"bexec"
goto *loop

おお、なんと言うことでしょう。mesboxが反応して、それから入力がステータスバーに表示されました。bexec恐るべしです。
ただし、bexecで拾えない入力はそのままcaptionが動きましたので、bexecは一応全ての入力を見張て動き、反応できるものにのみ反応していることがわかります。

まとめ

頭が動かないので明日加筆します。

|