local reload_type = ...
local files = {}
local reload_funcs = {}
local reload_funcs_set = {}
local is_reload = true

-- 以下のスクリプトファイルがこのゲームでのすべてとする
local all_files = {
--	"scripts/common.lua",
	"scripts/class.lua",
--	"scripts/game.lua",
--	"scripts/characters.lua",
}

-- リロード引数による各種設定
if reload_type == "load" then
	-- 通常ロードをここで処理する
	-- 全ファイルロード
	files = all_files
	is_reload = false
elseif reload_type == "chars" then
	-- キャラクターリロード時
	files = {
		"script/characters.lua",
	}
elseif reload_type == "all" then
	-- 全リロード時
	local res, err = pcall(function()
		endfunc()
	end)
	print("error on endfunc() : ", err)
	-- 全ファイルロード
	files = all_files
	-- タイトル画面に戻る
	table.insert(reload_funcs, function()
		startfunc() -- タイトル画面に戻るための自前の関数
		return true
	end)
else
	return false, "unknown reload type:"..reload_type
end

-- 現状のon_reloadグローバル関数を削除しておく
if rawget(_G, "on_reload") then
	_G.on_reload = nil
end

-- 各スクリプトファイルをロードする
for i, path in ipairs(files) do
	local res = cfunc.DoLuaFile(path)  -- tolua++でバインドした関数を呼ぶ
	local err = cfunc.GetLuaError()
	if not res then
		return false, "script<"..path.."> reload failed : "..(err or "unknown")
	end
	-- リロード後処理関数on_reloadが新しく定義されていたらリストに加える
	if rawget(_G, "on_reload") and (not reload_funcs_set[_G.on_reload]) then
		table.insert(reload_funcs, on_reload)
		reload_funcs_set[_G.on_reload] = path
	end
	print("script<"..path.."> reload success.")
end

if is_reload then
	--　リロード後処理関数をすべて実行
	-- １つでもfalseを返したらリロードは不成功とする
	for i, func in ipairs(reload_funcs) do
		local res, err = func()
		if res == false then
			return false, "on_reload() of script<"..
				reload_funcs_set[fun].."> failed. :"..err
		end
	end
	-- すべてのクラスのすべてのインスタンスのon_reloadを（あれば）実行する
	exec_class_reload_funcs()
end

collectgarbage("collect")
return true, "success"