Compare commits

..

No commits in common. "a47e14ffcaf0dde3f66f6e93157208e529c765ff" and "d091f3a6bc36645b0366084f0fcec59244e0f28f" have entirely different histories.

9 changed files with 120 additions and 195 deletions

View file

@ -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)

View file

@ -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

122
menu.lua
View file

@ -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()
},

View file

@ -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
)
}

View file

@ -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 }
)

View file

@ -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 }
)

View file

@ -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 }
)

View file

@ -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'
}

View file

@ -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 = {