diff --git a/levelhandler.lua b/levelhandler.lua index ed7b874..8c5931c 100644 --- a/levelhandler.lua +++ b/levelhandler.lua @@ -6,7 +6,7 @@ require 'makegrid' ---@field current integer LevelHandler = { levels = { - 'test3', 'test2', 'test' + 'test2', 'test', 'test3' }, current = 1, } @@ -18,13 +18,22 @@ function LevelHandler:next() if self.current > #self.levels then self.current = 1 end - local levelPath = string.format('levels/%s', self.levels[self.current]) + local levelPath = 'levels/' .. self.levels[self.current] return MakeGrid( require( levelPath ) ) end -- Returns first level ---@return Grid function LevelHandler:first() - local levelPath = string.format('levels/%s', self.levels[1]) + local levelPath = 'levels/' .. self.levels[1] + return MakeGrid( require( levelPath ) ) +end + +-- Returns level by its index in table +---@param i number +---@return Grid +function LevelHandler:indexed(i) + self.current = i + local levelPath = 'levels/' .. self.levels[self.current] return MakeGrid( require( levelPath ) ) end diff --git a/menu.lua b/menu.lua index fda11e6..8906354 100644 --- a/menu.lua +++ b/menu.lua @@ -2,9 +2,6 @@ require 'config' require 'button' require 'menu.state' - - - -- Menu handler ---@class Menu ---@field states MenuState[] @@ -16,7 +13,7 @@ Menu = { -- Pause menu [MenuStateIndex.pause] = require 'menu.pause', -- Level selector - [MenuStateIndex.levels] = MenuState:new(), + [MenuStateIndex.levels] = require 'menu.levels', -- Level completed menu [MenuStateIndex.completed] = require 'menu.completed', -- Empty state diff --git a/menu/levels.lua b/menu/levels.lua new file mode 100644 index 0000000..463566e --- /dev/null +++ b/menu/levels.lua @@ -0,0 +1,47 @@ +require 'menu.state' +require 'button' +require 'text' + +local common = require 'menu.common' + +local size, margin = 60, 30 +local levelSize = Point:new( size, size ) +local yOffset = 160 + +local levelsPerLine = 8 +local levelCount = #LevelHandler.levels + +local buttons = {} + +for i=1,levelCount do + local x = (size + margin) * (i % levelsPerLine) + local y = (size + margin) * math.floor(i / levelsPerLine) + yOffset + local button = Button:new( + Point:new(x, y), + levelSize, + tostring(i), + nil, + nil, + function() + GameGrid = LevelHandler:indexed(i) + Menu.updateCellSize() + Menu.current_state = MenuStateIndex.hidden + end + ) + table.insert(buttons, button) +end + +local exitToMenuButton = Button:new( + Point:new( 240, 40 ), + common.buttonSize, + 'Return to menu', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.start + end + ) + +table.insert(buttons, exitToMenuButton) + +return MenuState:new(buttons) diff --git a/menu/start.lua b/menu/start.lua index 8693b68..8630976 100644 --- a/menu/start.lua +++ b/menu/start.lua @@ -16,9 +16,7 @@ local startButton = Button:new( nil, nil, function() - Menu.current_state = MenuStateIndex.hidden - GameGrid = LevelHandler:first() - Menu.updateCellSize() + Menu.current_state = MenuStateIndex.levels end )