From d215dbfaf33ad98352ca26a4f20be46ee557c166 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 11 Feb 2022 02:50:56 +0100 Subject: [PATCH] Refactor: Add lzr_level_select mod --- mods/lzr_level_select/init.lua | 82 ++++++++++++++++++++++++++++++++++ mods/lzr_level_select/mod.conf | 2 + mods/lzr_levels/init.lua | 18 -------- mods/lzr_menu/init.lua | 56 +---------------------- mods/lzr_menu/mod.conf | 2 +- 5 files changed, 87 insertions(+), 73 deletions(-) create mode 100644 mods/lzr_level_select/init.lua create mode 100644 mods/lzr_level_select/mod.conf diff --git a/mods/lzr_level_select/init.lua b/mods/lzr_level_select/init.lua new file mode 100644 index 0000000..054bf76 --- /dev/null +++ b/mods/lzr_level_select/init.lua @@ -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("[]"), + 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, + +}) + diff --git a/mods/lzr_level_select/mod.conf b/mods/lzr_level_select/mod.conf new file mode 100644 index 0000000..a323b04 --- /dev/null +++ b/mods/lzr_level_select/mod.conf @@ -0,0 +1,2 @@ +name = lzr_level_select +depends = lzr_levels diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua index d5824b4..ab86200 100644 --- a/mods/lzr_levels/init.lua +++ b/mods/lzr_levels/init.lua @@ -271,24 +271,6 @@ function lzr_levels.leave_level() lzr_gamestate.set_state(lzr_gamestate.MENU) end -minetest.register_chatcommand("level", { - privs = { server = true }, - description = S("Go to level"), - params = S(""), - 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", { privs = {}, params = "", diff --git a/mods/lzr_menu/init.lua b/mods/lzr_menu/init.lua index 8496491..acb20e2 100644 --- a/mods/lzr_menu/init.lua +++ b/mods/lzr_menu/init.lua @@ -1,5 +1,4 @@ local S = minetest.get_translator("lzr_menu") -local F = minetest.formspec_escape local build_ship = function(pos) 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) -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) - show_level_list(puncher) + lzr_level_select.open_dialog(puncher, true) end local on_rightclick = function(self, node, clicker) - show_level_list(clicker) + lzr_level_select.open_dialog(clicker, true) end minetest.register_node("lzr_menu:startbook", { diff --git a/mods/lzr_menu/mod.conf b/mods/lzr_menu/mod.conf index c4c02f4..6f3de1b 100644 --- a/mods/lzr_menu/mod.conf +++ b/mods/lzr_menu/mod.conf @@ -1,2 +1,2 @@ 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