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
依存関係
解説その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を混在させられる。