む式ver.lua

む式ライブラリver.2 - 永字八法の続き。
技術の進歩はたいしたもので、一部にご好評いただいた「む式」もついにバージョンアップすることができました。
2009-05-27バージョンにバージョンアップ

導入方法

  • nscr.exeを、Luaが使える最新の物にさしかえる。
  • 最新のnscr.exeには、nslua.dllがついているはずなので、それを同梱する。
  • nscr.exeと同じ場所にsystem.luaファイルを作り、そこに下記内容をコピペして保存する。

次にstart節のできるだけ早い段階で、

  • 「chnsa umineko4」とか宣言する。
  • その次の行で「music_set umineko4」とか宣言する。

「移動が必要」なオリスクが、たったこれだけの手間で「移動が不要」になります。

機能説明

以下の五つの命令を追加します。

  • chnsa
  • get_addnsadir
  • fullpath
  • music_set
  • music_get

また、音楽系の6種類の命令を上書きします。
さらに、nsaLuaの中から呼ぶようにしました。これで、define節中に呼び出すのを忘れても安心。

chnsa

このライブラリの肝。たとえば、「chnsa umineko4」と宣言するだけで、「うみねこのなく頃に Alliance of the golden witch」のarc.nsaと音楽ファイルを余所から使えるようになります。
※機能的には前バージョンと変わっていません。

get_addnsadir

追加命令。
「get_addnsadir $0」とすると、$0に、今現在参照している余所のディレクトリが入ります。

music_set

音楽ファイルに限って、別のディレクトリを参照するためのものです。

music_get

music_setで設定されたディレクトリを返します。

fullpath

追加命令。
「fullpath $0,$1」とすると、$0に、music_getの結果と$1をつなげた内容が入ります。
oggを扱う時、最初にカッコで繰り返し時間を指定する場合、この命令でファイル名をフルパスにしてから、カッコを頭につけてください。
※もしかして不要かも。

前バージョンとの相違点

うみねこのなく頃に」の基本システムとの相性を主眼に置きました。

エラーチェック機能を強くしました。
chnsaを実行した時、指定されたバージョンの「うみねこのなく頃に」がなかったり、あったとしても本来あるべき場所にarc.nsaがなかったりすると、それだけでエラーを出して止めるようにしました。music_setでも同様です。
音量記録機能を省略しました。
うみねこのなく頃に」の基本システムについているようなので、省略しました。
変数領域を汚しません。
うみねこのなく頃に」の基本システムが使う変数と、絶対にバッティングしなくなりました。つーか、NScripter本来の変数を使いません。汚しません。なので、オリスクユーザーが気にしないといけないのは、基本システムとのバッティングだけです。

system.lua

-- む式 ver.lua 2009-05-27
NSExec("nsa")

-- 共通部分
function id2reg(id)
	local lid = id:lower()
	
	local reg_key = ""
	local reg_var = ""
	
	if id == "singingmoon" then
		reg_key = 'Software\\TYPE-MOON\\歌月十夜'
		reg_var = 'directory'
	else
		    if id == "higurasi1" then reg_key = 'Software\\07th_Expansion\\higurasi'
		elseif id == "higurasi2" then reg_key = 'Software\\07th_Expansion\\higurasi2'
		elseif id == "higurasi3" then reg_key = 'Software\\07th_Expansion\\higurasi3'
		elseif id == "higurasi4" then reg_key = 'Software\\07th_Expansion\\higurasi4'
		elseif id == "higurasi5" then reg_key = 'Software\\07th_Expansion\\higurasi5'
		elseif id == "higurasi6" then reg_key = 'Software\\07th_Expansion\\higurasi6'
		elseif id == "higurasi7" then reg_key = 'Software\\07th_Expansion\\higurasi7'
		elseif id == "higurasi8" then reg_key = 'Software\\07th_Expansion\\higurasi8'
		elseif id == "higurasi9" then reg_key = 'Software\\07th_Expansion\\higurasi9'
		elseif id == "umineko1" then reg_key = 'Software\\07th_Expansion\\Umineko1'
		elseif id == "umineko2" then reg_key = 'Software\\07th_Expansion\\Umineko2'
		elseif id == "umineko3" then reg_key = 'Software\\07th_Expansion\\Umineko3'
		elseif id == "umineko4" then reg_key = 'Software\\07th_Expansion\\Umineko4'
		elseif id == "umineko5" then reg_key = 'Software\\07th_Expansion\\Umineko5'
		elseif id == "umineko6" then reg_key = 'Software\\07th_Expansion\\Umineko6'
		elseif id == "umineko7" then reg_key = 'Software\\07th_Expansion\\Umineko7'
		elseif id == "umineko8" then reg_key = 'Software\\07th_Expansion\\Umineko8'
		end
		if reg_key ~= "" then reg_var = 'gamedir' end
	end
	
	if reg_key == "" then
		NSOkBox("正しいキーワードを指定してください。", "む式。")
		NSSystemCall("end")
	end
	
	-- 取得してみる。
	local temp0 = NSGetStrValue(0) -- 退避
	NSExec('_getreg $0,"'..reg_key..'","'..reg_var..'"')
	local dir = NSGetStrValue(0)
	NSSetStrValue(0, temp0) -- 復帰
	
	if dir == "" then
		NSOkBox(id.."はインストールされていません。", "む式。")
		NSSystemCall("end")
	end
	
	-- 末尾に\がなければ\をつける。
	if string.char(dir:byte(dir:len())) ~= "\\" then dir = dir .. "\\" end

	-- そこにnsaがあるかどうかチェックする。
	temp0 = NSGetIntValue(0) -- 退避
	NSExec('_fileexist %0,"'..dir..'arc.nsa"')
	local exist = NSGetIntValue(0)
	NSSetIntValue(0, temp0) -- 復帰
	
	if exist == 0 then
		NSOkBox(id.."のarc.nsaがみつかりません。", "む式。")
		NSSystemCall("end")
	end
	
	return dir
end

-- nsa関係
local chnsa_dir = "" -- 現在のchnsaディレクトリ
NSExec("luasub chnsa")
function NSCOM_chnsa()
	-- IDの取得
	local dir = id2reg(NSPopID())
	
	-- ディレクトリを追加する。
	NSExec('_addnsadir "'..dir..'"')
	-- ディレクトリを保存する。
	chnsa_dir = dir
end

NSExec("luasub get_addnsadir")
function NSCOM_get_addnsadir()
	NSSetStrValue(NSPopStrRef(), chnsa_dir)
end


-- 音楽系
local music_dir = ""
NSExec("luasub music_set")
function NSCOM_music_set()
	-- IDの取得
	local dir = id2reg(NSPopID())
	-- ディレクトリを保存する。
	music_dir = dir
end

NSExec("luasub music_get")
function NSCOM_music_get()
	NSSetStrValue(NSPopStrRef(), music_dir)
end

NSExec("luasub fullpath")
function NSCOM_fullpath()
	local ref = NSPopStrRef()
	NSPopComma()
	NSSetStrValue(ref, music_dir..NSPopStr())
end

-- 既存命令の上書き
NSExec("luasub bgm")
function NSCOM_bgm()
	NSExec('_bgm "'..music_dir..NSPopStr()..'"')
end
NSExec("luasub bgmonce")
function NSCOM_bgmonce()
	NSExec('_bgmonce "'..music_dir..NSPopStr()..'"')
end
NSExec("luasub loopbgm")
function NSCOM_loopbgm()
	local file1 = NSPopStr()
	NSPopComma()
	local file2 = NSPopStr()
	NSExec('_loopbgm "'..music_dir..file1..'","'..music_dir..file2..'"')
end
NSExec("luasub dwave")
function NSCOM_dwave()
	local ch = NSPopInt()
	NSPopComma()
	NSExec('_dwave '..ch..',"'..music_dir..NSPopStr()..'"')
end
NSExec("luasub dwaveload")
function NSCOM_dwaveload()
	local ch = NSPopInt()
	NSPopComma()
	NSExec('_dwaveload '..ch..',"'..music_dir..NSPopStr()..'"')
end
NSExec("luasub dwaveloop")
function NSCOM_dwaveloop()
	local ch = NSPopInt()
	NSPopComma()
	NSExec('_dwaveloop '..ch..',"'..music_dir..NSPopStr()..'"')
end