diff --git a/src/main-menu.lua b/src/main-menu.lua index 1bfa887..a306901 100644 --- a/src/main-menu.lua +++ b/src/main-menu.lua @@ -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) diff --git a/src/main.lua b/src/main.lua index 02ceb42..beb81a6 100644 --- a/src/main.lua +++ b/src/main.lua @@ -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()