From af17b3a1d66434a64c150c923b7c5dbccc7638c5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 24 Dec 2024 14:15:58 +0100 Subject: [PATCH] Allow relative level argument in /level command --- mods/lzr_level_select/init.lua | 43 ++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/mods/lzr_level_select/init.lua b/mods/lzr_level_select/init.lua index ffc89c37..843ea499 100644 --- a/mods/lzr_level_select/init.lua +++ b/mods/lzr_level_select/init.lua @@ -404,15 +404,48 @@ minetest.register_chatcommand("level", { if lzr_gamestate.is_loading() then return false, S("Can’t start a level while loading!") end - local pack, level = string.match(param, "([a-zA-Z0-9_]+) ([0-9]+)") - if not pack then - pack = "__core" - level = tonumber(param) + -- Parse arguments. level argument may be relative (tilde notation) + local pack, level = string.match(param, "([a-zA-Z0-9_]+) (~?-?[0-9]*)") + + local current_data = lzr_levels.get_current_level_data() + local current_pack + if current_data then + current_pack = current_data.name + end + -- Select level pack. Defaults to the current level pack + -- if playing one or __core if playing no level pack + -- (singleton levels don't count) + if not pack then + if current_pack then + pack = current_pack + else + pack = "__core" + end + level = string.match(param, "(~?-?[0-9]*)") end - level = tonumber(level) if not level then return false end + -- Handle relative level argument (e.g. "~1" to move to the next level) + local is_relative_level = string.sub(level, 1, 1) == "~" + if is_relative_level then + local current_level = lzr_levels.get_current_level() + -- Relative level argument is only allowed if playing in a level + -- and the chosen level pack is the same as the current one. + if not current_level then + return false, S("Level argument can’t be relative when not playing in a level.") + end + if current_pack ~= pack then + return false, S("Level argument can’t be relative when choosing a different level pack.") + end + level = minetest.parse_relative_number(level, current_level) + else + level = tonumber(level) + end + if not level then + return false + end + local level_data = lzr_levels.get_level_pack(pack) if not level_data then return false, S("Level pack “@1” doesn’t exist.", pack)