luasubによって定義された命令の引数を簡単に取得する
argument.lua
-- argument.lua -- luasubによってNScripter側から呼び出された後、lua側でその引数を簡単に取得できる専用の関数を作る関数。 do local method_list = {} method_list.int = NSPopInt method_list.str = NSPopStr method_list.intref = NSPopIntRef method_list.strref = NSPopStrRef method_list.label = function() return "*"..NSPopLabel() end method_list.id = NSPopID local error_check = function(k) if method_list[k] then return end NSOkBox(k.."は有効な引数型ではありません。", "ArgsCheck") NSEnd() end local mtc = {} mtc.__index = function(t, k) error_check(k) rawset(t, 1+#t, method_list[k]) return t end mtc.__call = function(t) local res = {} for i=1, #t do res[1+#res] = rawget(t, i)() if NSCheckComma() then NSPopComma() else break end end return unpack(res) end mtc.__newindex = function(t, k, v) NSOkBox("代入はできません。", "Args1") NSEnd() end local mt = {} mt.__index = function(t, k) error_check(k) return setmetatable({ method_list[k] }, mtc) end mt.__newindex = function(t, k, v) NSOkBox("代入はできません。", "Args0") NSEnd() end Args = setmetatable({}, mt) end
使い方
Argsと言うグローバル変数を使い、それにメソッドを追加することで引数を返す関数を作成する。
00.txtで、
luasub sample ;(中略) sample 100,"文字列",%150,$200,*label,id
lua側で
function NSCOM_sample() local arg = {Args.int.str.intref.strref.label.id()} NSOkBox( tostring(arg[1])..","..arg[2]..","..tostring(arg[3])..",".. tostring(arg[4])..","..arg[5]..","..arg[6], "arg" ) end
Argsの後に、.でつなげて、int/str/intref/strref/label/idの六種類のトークンを任意の数だけ並べると、その順番で引数を取ってくる専用の関数を返す。
local get_arg = Args.int.str.intref.strref.label.id -- 関数が戻ってくる。 local args = {get_arg()} -- 関数を実行して引数を取得する。
注意点
- 途中でそれまでに取得した値を見て次に取得する値を変えるような芸当はできませんでした。
- 要求した引数に比べて呼び出された引数が少なければ、その分はnilになります。