nslua上で使う外部ファイルへの記録システム

通常のセーブデータとは別に、外部のファイルを作成してそこに記録したり読みだしたりする仕組みです。
アーカイブは堂々と置かれますので、ユーザーからがっつり見られます。
ですので、これに保存するデータは見られても問題がないものを想定しています。

external.lua

-- external.lua
-- [[
NScripterの外にセーブデータと共に保存する何か。
見られてもいいデータを入れておくことを目的にしている。

	使い方
	
1.事前に、Json.luaを読み込んで置くこと。
2.その後、このスクリプトを読み込む。
external.localテーブルとexternal.globalテーブルが作られるので、
スクリプトの他の部分から、これらのテーブルに保存したいデータを入れる。
external.localテーブルの中身は、NScripter側のローカル変数と同じで、ロードの度に書き換わります。
external.globalテーブルの中身は、逆にグローバル変数と同じです。
3.nsluaとluacallを使い、
function NSCALL_saveの中で、external.save(savenum)を実行すること。
function NSCALL_loadの中で、external.load(savenum)を実行すること。

保存されるファイル名はスクリプトにベタ書きしていますので、saveディレクトリを別に作っているなら、
それに合うように変更してください。
]]
do
	-- クラス本体
	external = {}
	external.local = {}
	external.global = {}

	-- syntax sugar
	ext = external

	-- デフォルト設定
	local external_local_filename = "save"
	local external_local_extension = ".txt"
	
	local external_global_filename = "global"
	local external_global_extension = ".txt"

	-- メソッド類
	external.save = function(savenum)
		external.save_global()
		local fh = io.open("w", external_local_filename..savenum..external_local_extension)
		fh:write(Json.Encode(external.local))
		fh:close()
	end

	external.save_global = function()
		local fh = io.open("w", external_global_filename..savenum..external_global_extension)
		fh:write(Json.Encode(external.global))
		fh:close()
	end

	external.load = function(savenum)
		external.load_global()
		local fh = io.open("r", external_local_filename..savenum..external_local_extension)
		for k, v in pairs(external.local) do external.local[k] = nil end
		if io.type(fh) ~= "file" then return end
		for k, v in pairs(Json.Decode(fh:read("*a"))) do external.local[k] = v end
	end

	external.load_global = function()
		local fh = io.open("r", external_global_filename..savenum..external_global_extension)
		for k, v in pairs(external.global) do external.local[k] = nil end
		if io.type(fh) ~= "file" then return end
		for k, v in pairs(Json.Decode(fh:read("*a"))) do external.global[k] = v end
	end
	
	external.load_global() -- 一回は実行しておく。
end

重大な特記事項

テストしてません。