Refactor: Add lzr_level_select mod
parent
29560c0b30
commit
d215dbfaf3
|
@ -0,0 +1,82 @@
|
||||||
|
local S = minetest.get_translator("lzr_level_select")
|
||||||
|
local F = minetest.formspec_escape
|
||||||
|
|
||||||
|
lzr_level_select = {}
|
||||||
|
|
||||||
|
local current_level_selection = nil
|
||||||
|
lzr_level_select.open_dialog = function(player, preselect)
|
||||||
|
local form = "formspec_version[4]size[6,10]"..
|
||||||
|
"label[0.5,0.4;"..F(S("Select level:")).."]"..
|
||||||
|
"button_exit[1.5,8.5;3,1;okay;"..F(S("Start")).."]"..
|
||||||
|
"textlist[0.5,0.8;5,7.5;levellist;"
|
||||||
|
local list = {}
|
||||||
|
local entry_header = ""
|
||||||
|
local completed_levels = lzr_levels.get_completed_levels()
|
||||||
|
local first_uncompleted_level = nil
|
||||||
|
for l=1, lzr_levels.LAST_LEVEL do
|
||||||
|
if completed_levels[l] then
|
||||||
|
entry_header = "#00FF00"
|
||||||
|
else
|
||||||
|
if not first_uncompleted_level then
|
||||||
|
first_uncompleted_level = l
|
||||||
|
end
|
||||||
|
entry_header = ""
|
||||||
|
end
|
||||||
|
table.insert(list, F(entry_header.. S("Level @1", l)))
|
||||||
|
end
|
||||||
|
if not first_uncompleted_level then
|
||||||
|
first_uncompleted_level = 1
|
||||||
|
end
|
||||||
|
local list_str = table.concat(list, ",")
|
||||||
|
if preselect == false then
|
||||||
|
first_uncompleted_level = ""
|
||||||
|
end
|
||||||
|
form = form .. list_str .. ";"..first_uncompleted_level.."]"
|
||||||
|
current_level_selection = first_uncompleted_level
|
||||||
|
minetest.show_formspec(player:get_player_name(), "lzr_level_select:levellist", form)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
if formname == "lzr_level_select:levellist" then
|
||||||
|
if fields.okay then
|
||||||
|
if current_level_selection then
|
||||||
|
lzr_levels.start_level(current_level_selection)
|
||||||
|
end
|
||||||
|
elseif fields.levellist then
|
||||||
|
local expl = minetest.explode_textlist_event(fields.levellist)
|
||||||
|
if expl.type == "CHG" then
|
||||||
|
current_level_selection = expl.index
|
||||||
|
elseif expl.type == "DCL" then
|
||||||
|
current_level_selection = expl.index
|
||||||
|
lzr_levels.start_level(current_level_selection)
|
||||||
|
minetest.close_formspec(player:get_player_name(), "lzr_level_select:levellist")
|
||||||
|
elseif expl.type == "INV" then
|
||||||
|
current_level_selection = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_chatcommand("level", {
|
||||||
|
privs = { server = true },
|
||||||
|
description = S("Go to level"),
|
||||||
|
params = S("[<level>]"),
|
||||||
|
func = function(name, param)
|
||||||
|
local level = tonumber(param)
|
||||||
|
if not level then
|
||||||
|
local player = minetest.get_player_by_name(name)
|
||||||
|
if not player then
|
||||||
|
return false, S("No player.")
|
||||||
|
end
|
||||||
|
lzr_level_select.open_dialog(player, false)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if level < 1 or level > lzr_levels.LAST_LEVEL then
|
||||||
|
return false, S("Invalid level!")
|
||||||
|
end
|
||||||
|
lzr_levels.start_level(level)
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
|
||||||
|
})
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
name = lzr_level_select
|
||||||
|
depends = lzr_levels
|
|
@ -271,24 +271,6 @@ function lzr_levels.leave_level()
|
||||||
lzr_gamestate.set_state(lzr_gamestate.MENU)
|
lzr_gamestate.set_state(lzr_gamestate.MENU)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_chatcommand("level", {
|
|
||||||
privs = { server = true },
|
|
||||||
description = S("Go to level"),
|
|
||||||
params = S("<level>"),
|
|
||||||
func = function(name, param)
|
|
||||||
local level = tonumber(param)
|
|
||||||
if not level then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
if level < 1 or level > lzr_levels.LAST_LEVEL then
|
|
||||||
return false, S("Invalid level!")
|
|
||||||
end
|
|
||||||
lzr_levels.start_level(level)
|
|
||||||
return true
|
|
||||||
end,
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_chatcommand("restart", {
|
minetest.register_chatcommand("restart", {
|
||||||
privs = {},
|
privs = {},
|
||||||
params = "",
|
params = "",
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
local S = minetest.get_translator("lzr_menu")
|
local S = minetest.get_translator("lzr_menu")
|
||||||
local F = minetest.formspec_escape
|
|
||||||
|
|
||||||
local build_ship = function(pos)
|
local build_ship = function(pos)
|
||||||
minetest.place_schematic(pos, minetest.get_modpath("lzr_menu").."/schematics/lzr_menu_ship.mts", "0", {}, true, "")
|
minetest.place_schematic(pos, minetest.get_modpath("lzr_menu").."/schematics/lzr_menu_ship.mts", "0", {}, true, "")
|
||||||
|
@ -34,62 +33,11 @@ minetest.register_on_joinplayer(function(player)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local current_level_selection = nil
|
|
||||||
local show_level_list = function(player)
|
|
||||||
local form = "formspec_version[4]size[6,10]"..
|
|
||||||
"label[0.5,0.4;"..F(S("Select level:")).."]"..
|
|
||||||
"button_exit[1.5,8.5;3,1;okay;"..F(S("Start")).."]"..
|
|
||||||
"textlist[0.5,0.8;5,7.5;levellist;"
|
|
||||||
local list = {}
|
|
||||||
local entry_header = ""
|
|
||||||
local completed_levels = lzr_levels.get_completed_levels()
|
|
||||||
local first_uncompleted_level = nil
|
|
||||||
for l=1, lzr_levels.LAST_LEVEL do
|
|
||||||
if completed_levels[l] then
|
|
||||||
entry_header = "#00FF00"
|
|
||||||
else
|
|
||||||
if not first_uncompleted_level then
|
|
||||||
first_uncompleted_level = l
|
|
||||||
end
|
|
||||||
entry_header = ""
|
|
||||||
end
|
|
||||||
table.insert(list, F(entry_header.. S("Level @1", l)))
|
|
||||||
end
|
|
||||||
if not first_uncompleted_level then
|
|
||||||
first_uncompleted_level = 1
|
|
||||||
end
|
|
||||||
local list_str = table.concat(list, ",")
|
|
||||||
form = form .. list_str .. ";"..first_uncompleted_level.."]"
|
|
||||||
current_level_selection = first_uncompleted_level
|
|
||||||
minetest.show_formspec(player:get_player_name(), "lzr_menu:levellist", form)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
||||||
if formname == "lzr_menu:levellist" then
|
|
||||||
if fields.okay then
|
|
||||||
if current_level_selection then
|
|
||||||
lzr_levels.start_level(current_level_selection)
|
|
||||||
end
|
|
||||||
elseif fields.levellist then
|
|
||||||
local expl = minetest.explode_textlist_event(fields.levellist)
|
|
||||||
if expl.type == "CHG" then
|
|
||||||
current_level_selection = expl.index
|
|
||||||
elseif expl.type == "DCL" then
|
|
||||||
current_level_selection = expl.index
|
|
||||||
lzr_levels.start_level(current_level_selection)
|
|
||||||
minetest.close_formspec(player:get_player_name(), "lzr_menu:levellist")
|
|
||||||
elseif expl.type == "INV" then
|
|
||||||
current_level_selection = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local on_punch = function(self, node, puncher)
|
local on_punch = function(self, node, puncher)
|
||||||
show_level_list(puncher)
|
lzr_level_select.open_dialog(puncher, true)
|
||||||
end
|
end
|
||||||
local on_rightclick = function(self, node, clicker)
|
local on_rightclick = function(self, node, clicker)
|
||||||
show_level_list(clicker)
|
lzr_level_select.open_dialog(clicker, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_node("lzr_menu:startbook", {
|
minetest.register_node("lzr_menu:startbook", {
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
name = lzr_menu
|
name = lzr_menu
|
||||||
depends = lzr_globals, lzr_core, lzr_decor, lzr_mapgen, lzr_levels
|
depends = lzr_globals, lzr_core, lzr_decor, lzr_mapgen, lzr_levels, lzr_level_select
|
||||||
|
|
Loading…
Reference in New Issue