メディア上にあるかどうか判定する。

なんか前にも作ったような気もするんだが。
nscr.exeを起動した時に、そのnscr.exeが記録ができないメディア上にあるか、記録できるハードディスク上にあるか、判別する関数を提供するスクリプト

cd.lua

-- cd.lua
do
	-- nscr.exeが起動した時、それがハードディスク上にあるか、書き込めないCD上にあるかを判定するライブラリ
	-- 方法論としては大変簡単で、適当に書き込んでみて、成功すればHD上、そうでなければメディア上と判断する。

	-- 書き込みできるかどうか試すファイル名。
	local filename = "write_test.txt"
	-- 絶対にかぶらないファイル名に変更すること。

	local can_write = nil -- 書き込み可能かどうかのフラグ。
	
	local fh = io.open(filename, "w") -- 書き込みモードでファイルを開いてみる。
	if type(io.type(fh))=="nil" then -- 開けなかったら。
		can_write = false -- フラグをfalseに設定
	else
		can_write = true -- フラグをtrueに設定
		fh:close() -- ファイルハンドルを閉じる。
		os.remove(filename) -- 削除する。
	end
	
	-- 外部に提供するメソッド群
	
	-- ハードディスク上にあるかどうか。
	function is_on_disk() return can_write end
	-- CD上にあるかどうか。
	function is_on_media() return not(is_on_disk()) end end
	
	-- また、同種の命令をNScripter側にも提供する。
	local b2n = function(bool) if bool then return 1 else return 0 end
	NSExec("_luasub is_on_disk")
	_G.NSCOM_is_on_disk = function() NSSetIntValue(NSPopIntRef(), b2n(is_on_disk())) end
	NSExec("_luasub is_on_media")
	_G.NSCOM_is_on_media = function() NSSetIntValue(NSPopIntRef(), b2n(is_on_media())) end
end

使い方

上記スクリプトをcd.luaとか名付けて保存して、これをsystem.luaの早い内にNL_dofile()で読み込む。
すると、下記の関数ができる。

is_on_disk
ハードディスク上にあればtrueを返し、そうでなければfalseを返す。
is_on_media
id_on_diskの逆

また、NScripter側にも、同名の命令を追加する。

is_on_disk
引数に数値変数を一つ指定する。ハードディスク上にあれば変数に1を代入。そうでなければ0を代入。
is_on_media
is_on_diskの逆。

注意

これは飽くまでも判別するだけなので、判別した後どのような動作をするかはプログラマーにまかされているが、一般的にはメディア上だった場合はちゃんとインストールするなりハードディスクにコピーするなり、警告を出してから終了する動作をするだろう。

*media_alert
is_on_media %0 ; 判定
if %0=1 return
mesbox "CDからハードディスクにコピーしてからプレイしてください。","セーブができません。"
end