Luaの側から、NScripter側の変数を操作・取得する

variable.lua

-- variable.lua

do
	-- 依存関係処理
	-- numalias.luaが必要。
	NL_dofile_verify("m_lib\\numalias.lua")

	-- メタテーブル
	local mt = {}
	
	-- 呼び出された時の動作定義
	mt.__index = function(t, k)
		if type(k)=="number" then return NSGetIntValue(k) end
		if type(k)=="string" then return t[Na[k]] end
		NSOkBox("変数の指定は数値かnumalias定義文字列に限ります。", "数値変数")
		NSEnd()
	end

	-- 代入された時の動作定義
	mt.__newindex = function(t, k, v)
		if type(k)=="number" then return NSSetIntValue(k, v) end
		if type(k)=="string" then t[Na[k]] = v; return end
		NSOkBox("変数の指定は数値かnumalias定義文字列に限ります。", "数値変数")
		NSEnd()
	end
	
	-- 定義
	Int = setmetatable({}, mt)
end

do
	-- 依存関係処理
	-- numalias.luaが必要。
	NL_dofile_verify("m_lib\\numalias.lua")

	-- メタテーブル
	local mt = {}
	
	-- 呼び出された時の動作定義
	mt.__index = function(t, k)
		if type(k)=="number" then return NSGetStrValue(k) end
		if type(k)=="string" then return t[Na[k]] end
		NSOkBox("変数の指定は数値かnumalias定義文字列に限ります。", "文字列変数")
		NSEnd()
	end

	-- 代入された時の動作定義
	mt.__newindex = function(t, k, v)
		if type(k)=="number" then return NSSetStrValue(k, v) end
		if type(k)=="string" then t[Na[k]] = v; return end
		NSOkBox("変数の指定は数値かnumalias定義文字列に限ります。", "文字列変数")
		NSEnd()
	end
	
	-- 定義
	Str = setmetatable({}, mt)
end

do
	-- 子メタテーブルを定義
	local mtc = {}

	mtc.__index = function(t, k)
		return setmetatable({str=rawget(t, "str").."["..k.."]"}, mtc)
	end

	-- 退避領域
	mtc.__call = function(t, v)
		if type(v)~="nil" then
			NSExec("_mov "..rawget(t, "str")..","..tostring(v))
		else
			local stack = NSGetIntValue(0)
			NSExec("_mov %0,"..rawget(t, "str"))
			local res = NSGetIntValue(0)
			NSSetIntValue(0, stack)
			return res
		end
	end
	
	mtc.__newindex = function(t, k, v)
		NSExec("_mov "..rawget(t, "str").."["..k.."],"..tostring(v))
	end

	-- 親メタテーブルを定義
	local mt = {}
	
	-- 呼び出しされた時の動作定義
	mt.__index = function(t, k)
		return setmetatable({str="?"..k}, mtc)
	end
	
	-- 代入された時の動作定義
	mt.__newindex = function(t, k, v)
		NSOkBox("添字なしに配列へのアクセスはできません。", "Dim")
		NSEnd()
	end

	-- 定義
	Dim = setmetatable({}, mt)
end

依存関係

http://d.hatena.ne.jp/eiji8pou/20120104/1325606993を必要とします。

解説その1

数値変数について。
Intと言うグローバル変数を使って、ちょっとした黒魔術的なアレで、NScripter側の変数をLuaの変数のように扱えるようにします。

数値を代入する時
Int[10] = 20 -- %10に20を代入する。
Int.sample = 30 -- %sampleに30を代入する。前提として、numaliasでsampleを定義しておくこと。
値を取得する時
local num1 = Int[10]
local num2 = Int.sample

解説その2

文字列変数については、IntのかわりにStrを使い、値が全て文字列になる以外は変わりません。

解説その3

Dimは、配列変数を操作します。
基本的にIntと同じですが、[]を必要なだけつなげていきます。

; 00.txtで
dim ?100[10][10]
; と宣言したとする。

するとLuaの側で、

-- 数値を代入する時
Dim[100][4][3] = 100
-- 数値を取得する時
Dim[100][4][3]() -- 最後に明示的に()をつけることで、取得モードになる。
-- Syntax Suger
Dim[100][4][3](100) -- 括弧の中に数値を入れると、代入モードになる。

numaliasも普通に使える。

Dim.sample[4].sample2 -- numaliasを混在させられる。