Add inning count selection to main menu.

This commit is contained in:
Sage Vaillancourt 2025-02-15 09:40:07 -05:00
parent 8943eef73f
commit bb95ef5a63
2 changed files with 49 additions and 41 deletions

View File

@ -2,6 +2,7 @@
---@class MainMenu
MainMenu = {
mainGameUpdateFunction = nil,
---@type fun(settings: Settings)
mainGameInitFunction = nil,
}
-- selene: allow(shadowing)
@ -19,8 +20,15 @@ function MainMenu.start(config)
playdate.update = MainMenu.update
end
local inningCountSelection = 3
local function startGame()
MainMenu.mainGameInitFunction()
MainMenu.mainGameInitFunction({
finalInning = inningCountSelection,
homeTeamSprites = HomeTeamSprites,
awayTeamSprites = AwayTeamSprites,
})
playdate.resetElapsedTime()
playdate.update = MainMenu.mainGameUpdateFunction
end
@ -61,40 +69,32 @@ end
local currentLogo = nil
local inningCountSelection = 3
function playdate.upButtonDown()
inningCountSelection = inningCountSelection + 1
end
function playdate.downButtonDown()
inningCountSelection = math.max(1, inningCountSelection - 1)
end
local itr = 0
local t = playdate.timer.new(1000)
t:reset()
function t.updateCallback()
itr = itr + 1
end
function MainMenu.update()
playdate.timer.updateTimers()
crankStartPos = crankStartPos or playdate.getCrankPosition()
gfx.clear()
if playdate.getCrankChange() ~= 0 then
local crankOffset = (crankStartPos - playdate.getCrankPosition()) % 360
currentLogo = arrayElementFromCrank(Logos, crankOffset).image
replaceAwayLogo(currentLogo)
end
gfx.clear()
if playdate.buttonIsPressed(playdate.kButtonA) then
startGame()
if currentLogo then
currentLogo:drawScaled(20, C.Center.y + 40, 3)
end
if playdate.buttonJustPressed(playdate.kButtonA) then
startGame()
end
if playdate.buttonJustPressed(playdate.kButtonUp) then
inningCountSelection = inningCountSelection + 1
end
if playdate.buttonJustPressed(playdate.kButtonDown) then
inningCountSelection = inningCountSelection - 1
end
gfx.drawText(tostring(itr), 200, 120)
GameLogo:drawCentered(C.Center.x, 50)
StartFont:drawTextAligned("Press A to start!", C.Center.x, 140, kTextAlignment.center)

View File

@ -53,6 +53,16 @@ local fielding = Fielding.new()
-- GLOBAL STATE --
------------------
--- Well, maybe not "Settings", but passive state that probably won't change much, if at all, during a game.
---@class Settings
local settings = {
finalInning = 3,
---@type SpriteCollection
awayTeamSprites = nil,
---@type SpriteCollection
homeTeamSprites = nil,
}
local deltaSeconds = 0
local ball = Ball.new(gfx.animator)
@ -181,7 +191,7 @@ end
local function nextHalfInning()
pitchTracker:reset()
local currentlyFieldingTeam = battingTeam == teams.home and teams.away or teams.home
local gameOver = inning == 9 and teams.away.score ~= teams.home.score
local gameOver = inning == settings.finalInning and teams.away.score ~= teams.home.score
if not gameOver then
fielding:celebrate()
secondsSinceLastRunnerMove = -7
@ -199,12 +209,12 @@ local function nextHalfInning()
battingTeam = currentlyFieldingTeam
playdate.timer.new(2000, function()
if battingTeam == teams.home then
battingTeamSprites = HomeTeamSprites
battingTeamSprites = settings.homeTeamSprites
runnerBlipper = HomeTeamBlipper
fieldingTeamSprites = AwayTeamSprites
fieldingTeamSprites = settings.awayTeamSprites
else
battingTeamSprites = AwayTeamSprites
fieldingTeamSprites = HomeTeamSprites
battingTeamSprites = settings.awayTeamSprites
fieldingTeamSprites = settings.homeTeamSprites
runnerBlipper = AwayTeamBlipper
end
end)
@ -521,7 +531,9 @@ function mainGameUpdate()
end
end
local function mainGameInit()
---@param s Settings
local function mainGameInit(s)
settings = s
fielding:resetFielderPositions(teams.home.benchPosition)
playdate.timer.new(2000, function()
launchBall(C.PitchStartX, C.PitchStartY, playdate.easingFunctions.linear, nil, false)
@ -530,10 +542,10 @@ local function mainGameInit()
BootTune:setFinishCallback(function()
TinnyBackground:play()
end)
battingTeamSprites = AwayTeamSprites
fieldingTeamSprites = HomeTeamSprites
HomeTeamBlipper = blipper.new(100, HomeTeamSprites.smiling, HomeTeamSprites.lowHat)
AwayTeamBlipper = blipper.new(100, AwayTeamSprites.smiling, AwayTeamSprites.lowHat)
battingTeamSprites = settings.awayTeamSprites
fieldingTeamSprites = settings.homeTeamSprites
HomeTeamBlipper = blipper.new(100, settings.homeTeamSprites.smiling, settings.homeTeamSprites.lowHat)
AwayTeamBlipper = blipper.new(100, settings.awayTeamSprites.smiling, settings.awayTeamSprites.lowHat)
runnerBlipper = battingTeam == teams.away and AwayTeamBlipper or HomeTeamBlipper
end
@ -543,14 +555,10 @@ local function init()
playdate.setMenuImage(gfx.image.new("images/game/menu-image.png"))
playdate.getSystemMenu():addMenuItem("Restart game", function() end) -- TODO?
-- TODO: A lot of stuff ends up hinky here, because animators are ticking from the moment they initialize.
-- TODO: Much needs to be redesigned to only init when a game is *actually* starting.
-- MainMenu.start({
-- mainGameUpdateFunction = mainGameUpdate,
-- mainGameInitFunction = mainGameInit,
-- })
playdate.update = mainGameUpdate
mainGameInit()
MainMenu.start({
mainGameUpdateFunction = mainGameUpdate,
mainGameInitFunction = mainGameInit,
})
end
init()