diff --git a/Makefile b/Makefile index da587f7..4ba0657 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=$(shell grep VERSION config.lua | sed -n -e "s/VERSION = 'v//" -e "s/'//p") +VERSION=0.1 IGNORE_FLAGS=--ignore Makefile --ignore build LOVE_PATH := $(shell command -v love) diff --git a/config.lua b/config.lua index c2c79e7..7ea90d2 100644 --- a/config.lua +++ b/config.lua @@ -1,7 +1,5 @@ require 'tablefuncs' -VERSION = 'v0.2' - -- Global config table ---@class Config ---@field pointRadius number Radius of each grid point, relative to cellSize diff --git a/menu.lua b/menu.lua index fda11e6..9a855d0 100644 --- a/menu.lua +++ b/menu.lua @@ -1,9 +1,114 @@ require 'config' require 'button' -require 'menu.state' +-- Menu state class +---@class MenuState +---@field buttons Button[] +MenuState = { + buttons = {} +} +-- Factory function +---@param buttons Button[] | nil +---@return MenuState +function MenuState:new( buttons ) + local state = { + buttons = buttons or MenuState.buttons + } + setmetatable( state, { __index = self } ) + + return state +end + +-- Draw buttons +function MenuState:draw() + for _, button in ipairs(self.buttons) do + button:draw() + end +end + +-- Update buttons +---@param dt number +---@param point Point +---@param pressed boolean +function MenuState:update( dt, point, pressed ) + for _, button in pairs(self.buttons) do + button:update( dt, point, pressed ) + end +end + +---@enum MenuStateIndex +MenuStateIndex = { + start = 'start', + pause = 'pause', + levels = 'levels', + hidden = 'hidden', + completed = 'completed' +} + +local buttonTopPos = Point:new( 240, 120 ) +local buttonBotPos = Point:new( 240, 240 ) +local buttonSize = Point:new( 320, 80 ) + +local startButton = Button:new( + buttonTopPos, + buttonSize, + 'Start', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.hidden + GameGrid = LevelHandler:first() + Menu.updateCellSize() + end +) + +local exitToMenuButton = Button:new( + buttonBotPos, + buttonSize, + 'Return to menu', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.start + end +) + +local exitGameButton = Button:new( + buttonBotPos, + buttonSize, + 'Exit', + nil, + nil, + function() + love.event.quit() + end +) + +local nextLevelButton = Button:new( + buttonTopPos, + buttonSize, + 'Next level', + nil, + nil, + function() + GameGrid = LevelHandler:next() + Menu.updateCellSize() + Menu.current_state = MenuStateIndex.hidden + end +) + +local backToGameButton = Button:new( + buttonTopPos, + buttonSize, + 'Continue', + nil, + nil, + function() + Menu.current_state = MenuStateIndex.hidden + end +) -- Menu handler ---@class Menu @@ -12,13 +117,20 @@ require 'menu.state' Menu = { states = { -- Main menu - [MenuStateIndex.start] = require 'menu.start', + [MenuStateIndex.start] = MenuState:new({ + startButton, exitGameButton + }), -- Pause menu - [MenuStateIndex.pause] = require 'menu.pause', + [MenuStateIndex.pause] = MenuState:new({ + backToGameButton, exitToMenuButton + }), -- Level selector - [MenuStateIndex.levels] = MenuState:new(), + [MenuStateIndex.levels] = MenuState:new({ + }), -- Level completed menu - [MenuStateIndex.completed] = require 'menu.completed', + [MenuStateIndex.completed] = MenuState:new({ + nextLevelButton, exitToMenuButton + }), -- Empty state [MenuStateIndex.hidden] = MenuState:new() }, diff --git a/menu/common.lua b/menu/common.lua deleted file mode 100644 index 0c51db6..0000000 --- a/menu/common.lua +++ /dev/null @@ -1,24 +0,0 @@ -require 'point' -require 'button' - -local buttonTopPos = Point:new( 240, 160 ) -local buttonBotPos = Point:new( 240, 280 ) -local buttonSize = Point:new( 320, 80 ) -local titlePos = Point:new( 240, 80 ) - -return { - buttonTopPos = buttonTopPos, - buttonBotPos = buttonBotPos, - buttonSize = buttonSize, - titlePos = titlePos, - exitToMenuButton = Button:new( - buttonBotPos, - buttonSize, - 'Return to menu', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.start - end - ) -} diff --git a/menu/completed.lua b/menu/completed.lua deleted file mode 100644 index dab5c85..0000000 --- a/menu/completed.lua +++ /dev/null @@ -1,29 +0,0 @@ -require 'menu.state' -require 'button' -require 'text' - -local common = require 'menu.common' - -local nextLevelButton = Button:new( - common.buttonTopPos, - common.buttonSize, - 'Next level', - nil, - nil, - function() - GameGrid = LevelHandler:next() - Menu.updateCellSize() - Menu.current_state = MenuStateIndex.hidden - end -) - -local title = Text:new( - common.titlePos, - common.buttonSize, - 'Level completed!' -) - -return MenuState:new( - { nextLevelButton, common.exitToMenuButton }, - { title } -) diff --git a/menu/pause.lua b/menu/pause.lua deleted file mode 100644 index 2e45cd7..0000000 --- a/menu/pause.lua +++ /dev/null @@ -1,27 +0,0 @@ -require 'menu.state' -require 'button' -require 'text' - -local common = require 'menu.common' - -local backToGameButton = Button:new( - common.buttonTopPos, - common.buttonSize, - 'Continue', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.hidden - end -) - -local title = Text:new( - common.titlePos, - common.buttonSize, - 'Paused' -) - -return MenuState:new( - { backToGameButton, common.exitToMenuButton }, - { title } -) diff --git a/menu/start.lua b/menu/start.lua deleted file mode 100644 index 8693b68..0000000 --- a/menu/start.lua +++ /dev/null @@ -1,52 +0,0 @@ -require 'menu.state' -require 'button' -require 'text' -require 'point' -require 'config' - -local common = require 'menu.common' - -local versionPos = Point:new( 0, 468 ) -local versionSize = Point:new( 800 ) - -local startButton = Button:new( - common.buttonTopPos, - common.buttonSize, - 'Start', - nil, - nil, - function() - Menu.current_state = MenuStateIndex.hidden - GameGrid = LevelHandler:first() - Menu.updateCellSize() - end -) - -local exitGameButton = Button:new( - common.buttonBotPos, - common.buttonSize, - 'Exit', - nil, - nil, - function() - love.event.quit() - end -) - -local title = Text:new( - common.titlePos, - common.buttonSize, - 'Lines' -) - -local versionText = Text:new( - versionPos, - versionSize, - string.format("Version %s", VERSION), - 'left' -) - -return MenuState:new( - { startButton, exitGameButton }, - { title, versionText } -) diff --git a/menu/state.lua b/menu/state.lua deleted file mode 100644 index 7bed4b5..0000000 --- a/menu/state.lua +++ /dev/null @@ -1,53 +0,0 @@ --- Menu state class ----@class MenuState ----@field buttons Button[] ----@field text Text[] -MenuState = { - buttons = {}, - text = {} -} - --- Factory function ----@param buttons Button[] | nil ----@param text Text[] | nil ----@return MenuState -function MenuState:new( buttons, text ) - local state = { - buttons = buttons or MenuState.buttons, - text = text or MenuState.text - } - - setmetatable( state, { __index = self } ) - - return state -end - --- Draw buttons -function MenuState:draw() - for _, button in ipairs(self.buttons) do - button:draw() - end - for _, txt in ipairs(self.text) do - txt:draw() - end -end - --- Update buttons ----@param dt number ----@param point Point ----@param pressed boolean -function MenuState:update( dt, point, pressed ) - for _, button in pairs(self.buttons) do - button:update( dt, point, pressed ) - end -end - ----@enum MenuStateIndex -MenuStateIndex = { - start = 'start', - pause = 'pause', - levels = 'levels', - hidden = 'hidden', - completed = 'completed' -} - diff --git a/point.lua b/point.lua index 4795ee0..3efb509 100644 --- a/point.lua +++ b/point.lua @@ -3,8 +3,8 @@ Point = { x = 1, y = 1 } -- Point factory ----@param x number | nil ----@param y number | nil +---@param x number +---@param y number ---@return any function Point:new( x, y ) local point = {