From 5c45b7bba02159a7d1e5086891758c5399a64c06 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Mon, 17 Feb 2025 13:21:28 -0500 Subject: [PATCH] Add box score and transitions Add constants defining the top of the outfield wall (not used yet) Take scores out of mutable global state (that might be just about all of it sewn up) Finish switching batttingTeam to a TeamId value --- src/announcer.lua | 1 + src/assets.lua | 2 + src/constants.lua | 12 + src/dbg.lua | 15 + src/draw/box-score.lua | 79 +++++ src/draw/overlay.lua | 21 +- src/draw/transitions.lua | 106 +++++++ src/fielding.lua | 2 +- .../Asheville-Sans-14-Bold-table-20-20.png | Bin 0 -> 10607 bytes src/fonts/Asheville-Sans-14-Bold.fnt | 295 ++++++++++++++++++ src/fonts/Roobert-20-Medium-table-32-32.png | Bin 11333 -> 9579 bytes src/images/game/BigBat.png | Bin 0 -> 1966 bytes src/images/game/GrassBackground.png | Bin 34391 -> 35043 bytes src/main-menu.lua | 9 +- src/main.lua | 98 +++--- src/npc.lua | 1 + src/utils.lua | 16 + 17 files changed, 602 insertions(+), 55 deletions(-) create mode 100644 src/draw/box-score.lua create mode 100644 src/draw/transitions.lua create mode 100755 src/fonts/Asheville-Sans-14-Bold-table-20-20.png create mode 100755 src/fonts/Asheville-Sans-14-Bold.fnt create mode 100644 src/images/game/BigBat.png diff --git a/src/announcer.lua b/src/announcer.lua index df7018d..fda410d 100644 --- a/src/announcer.lua +++ b/src/announcer.lua @@ -44,6 +44,7 @@ function Announcer:popIn() end) end +---@param text string function Announcer:say(text) self.textQueue[#self.textQueue + 1] = text if #self.textQueue == 1 then diff --git a/src/assets.lua b/src/assets.lua index 2452ba1..1a9b8a6 100644 --- a/src/assets.lua +++ b/src/assets.lua @@ -8,6 +8,8 @@ Glove = playdate.graphics.image.new("images/game/Glove.png") -- luacheck: ignore PlayerFrown = playdate.graphics.image.new("images/game/PlayerFrown.png") -- luacheck: ignore +BigBat = playdate.graphics.image.new("images/game/BigBat.png") +-- luacheck: ignore GloveHoldingBall = playdate.graphics.image.new("images/game/GloveHoldingBall.png") -- luacheck: ignore GameLogo = playdate.graphics.image.new("images/game/GameLogo.png") diff --git a/src/constants.lua b/src/constants.lua index 177fbcd..d5100f1 100644 --- a/src/constants.lua +++ b/src/constants.lua @@ -125,6 +125,18 @@ C.WalkedRunnerSpeed = 10 C.ResetFieldersAfterSeconds = 2.5 +C.OutfieldWall = { + { x = 0, y = 137 }, + { x = 233, y = 32 }, + { x = 450, y = 29 }, + { x = 550, y = 59 }, + { x = 739, y = 64 }, + { x = 850, y = 19 }, + { x = 1100, y = 31 }, + { x = 1185, y = 181 }, + { x = 1201, y = 224 }, +} + if not playdate then return C end diff --git a/src/dbg.lua b/src/dbg.lua index 758c0b8..f92ffa6 100644 --- a/src/dbg.lua +++ b/src/dbg.lua @@ -35,8 +35,23 @@ function dbg.loadTheBases(br) br.runners[4].nextBase = C.Bases[C.Home] end +---@return BoxScoreData +function dbg.mockBoxScoreData(inningCount) + inningCount = inningCount or 9 + local data = { + home = {}, + away = {}, + } + for i = 1, inningCount do + data.home[i] = math.floor(math.random() * 5) + data.away[i] = math.floor(math.random() * 5) + end + return data +end + ---@param points XyPair[] function dbg.drawLine(points) + playdate.graphics.setColor(playdate.graphics.kColorWhite) for i = 2, #points do local prev = points[i - 1] local next = points[i] diff --git a/src/draw/box-score.lua b/src/draw/box-score.lua new file mode 100644 index 0000000..6fcd8e1 --- /dev/null +++ b/src/draw/box-score.lua @@ -0,0 +1,79 @@ +---@class BoxScore +---@field data BoxScoreData +BoxScore = {} + +---@param data BoxScoreData +function BoxScore.new(data) + return setmetatable({ + data = data, + }, { __index = BoxScore }) +end + +-- TODO: Convert the box-score into a whole "scene" +-- * Scroll left and right through games that go into extra innings +-- * Scroll up and down through other stats. +-- + Balls and strikes +-- + Batting average +-- + Graph of team scores over time +-- + Farthest hit ball + +local MarginY = 70 + +local ScoreFont = playdate.graphics.font.new("fonts/Asheville-Sans-14-Bold.pft") +local NumWidth = ScoreFont:getTextWidth("0") +local NumHeight = ScoreFont:getHeight() +local AwayWidth = ScoreFont:getTextWidth("AWAY") +local InningMargin = 4 + +local InningDrawWidth = (InningMargin * 2) + (NumWidth * 2) +local ScoreDrawHeight = NumHeight * 2 + +-- luacheck: ignore 143 +---@type pd_graphics_lib +local gfx = playdate.graphics + +local function formatScore(n) + if n <= 9 then + return " " .. n + elseif n <= 19 then + return " " .. n + else + return tostring(n) + end +end + +local HomeY = -4 + (NumHeight * 2) + MarginY +local AwayY = -4 + (NumHeight * 3) + MarginY + +local function drawInning(x, inningNumber, homeScore, awayScore) + gfx.setColor(gfx.kColorBlack) + gfx.setColor(gfx.kColorWhite) + gfx.setLineWidth(1) + gfx.drawRect(x, 34 + MarginY, InningDrawWidth, ScoreDrawHeight) + + inningNumber = " " .. inningNumber + homeScore = formatScore(homeScore) + awayScore = formatScore(awayScore) + + x = x - 8 + (InningDrawWidth / 2) + ScoreFont:drawTextAligned(inningNumber, x, -4 + NumHeight + MarginY, gfx.kAlignRight) + ScoreFont:drawTextAligned(awayScore, x, HomeY, gfx.kAlignRight) + ScoreFont:drawTextAligned(homeScore, x, AwayY, gfx.kAlignRight) +end + +function BoxScore:update() + local originalDrawMode = gfx.getImageDrawMode() + gfx.clear(gfx.kColorBlack) + gfx.setImageDrawMode(gfx.kDrawModeInverted) + gfx.setColor(gfx.kColorBlack) + local inningStart = 4 + (AwayWidth * 1.5) + local widthAndMarg = InningDrawWidth + 4 + ScoreFont:drawTextAligned(" HOME", 10, HomeY, gfx.kAlignRight) + ScoreFont:drawTextAligned("AWAY", 10, AwayY, gfx.kAlignRight) + for i = 1, #self.data.away do + drawInning(inningStart + ((i - 1) * widthAndMarg), i, self.data.home[i], self.data.away[i]) + end + local homeScore, awayScore = utils.totalScores(self.data) + drawInning(4 + inningStart + (widthAndMarg * #self.data.away), "F", homeScore, awayScore) + gfx.setImageDrawMode(originalDrawMode) +end diff --git a/src/draw/overlay.lua b/src/draw/overlay.lua index a1288db..cfa5c4a 100644 --- a/src/draw/overlay.lua +++ b/src/draw/overlay.lua @@ -83,11 +83,10 @@ local ScoreboardHeight = 55 local Indicator = "> " local IndicatorWidth = ScoreFont:getTextWidth(Indicator) ----@param teams any ---@param battingTeam any ---@return string, number, string, number -function getIndicators(teams, battingTeam) - if teams.home == battingTeam then +function getIndicators(battingTeam) + if battingTeam == "home" then return Indicator, 0, "", IndicatorWidth end return "", IndicatorWidth, Indicator, 0 @@ -101,11 +100,11 @@ local stats = { battingTeam = nil, } -function drawScoreboardImpl(x, y, teams) +function drawScoreboardImpl(x, y) local homeScore = stats.homeScore local awayScore = stats.awayScore - local homeIndicator, homeOffset, awayIndicator, awayOffset = getIndicators(teams, stats.battingTeam) + local homeIndicator, homeOffset, awayIndicator, awayOffset = getIndicators(stats.battingTeam) local homeScoreText = homeIndicator .. "HOME " .. (homeScore > 9 and homeScore or " " .. homeScore) local awayScoreText = awayIndicator .. "AWAY " .. (awayScore > 9 and awayScore or " " .. awayScore) @@ -146,17 +145,17 @@ end local newStats = stats -function drawScoreboard(x, y, teams, outs, battingTeam, inning) +function drawScoreboard(x, y, homeScore, awayScore, outs, battingTeam, inning) if - newStats.homeScore ~= teams.home.score - or newStats.awayScore ~= teams.away.score + newStats.homeScore ~= homeScore + or newStats.awayScore ~= awayScore or newStats.outs ~= outs or newStats.inning ~= inning or newStats.battingTeam ~= battingTeam then newStats = { - homeScore = teams.home.score, - awayScore = teams.away.score, + homeScore = homeScore, + awayScore = awayScore, outs = outs, inning = inning, battingTeam = battingTeam, @@ -165,5 +164,5 @@ function drawScoreboard(x, y, teams, outs, battingTeam, inning) stats = newStats end) end - drawScoreboardImpl(x, y, teams) + drawScoreboardImpl(x, y) end diff --git a/src/draw/transitions.lua b/src/draw/transitions.lua new file mode 100644 index 0000000..35d700c --- /dev/null +++ b/src/draw/transitions.lua @@ -0,0 +1,106 @@ +Transitions = { + ---@type Scene | nil + nextScene = nil, + ---@type Scene | nil + previousScene = nil, +} + +local gfx = playdate.graphics + +-- local function animateOut() end +-- local function animateIn() end + +local previousSceneImage +local previousSceneMask + +local nextSceneImage + +-- local nextSceneOffScreen = false +-- local stillAnimating = false + +-- TODO: Okay but like imagine. +-- Push a blank image context, +-- draw the previous scene on one side, +-- draw the next scene on the other, +-- SWING a bat to cover the seam. + +local batImageTable = {} + +local batOffset = 80 + +local degStep = 3 + +function loadBatImageTable() + for deg = 90 - (degStep * 3), 270 + (degStep * 3), degStep do + local img = gfx.image.new(C.Screen.W, C.Screen.H) + gfx.pushContext(img) + BigBat:drawRotated(C.Center.x, C.Screen.H + batOffset, 90 + deg) + gfx.popContext() + batImageTable[deg] = img + end +end +loadBatImageTable() + +local function update() + local lastAngle + local seamAngle = math.rad(270) + while seamAngle > math.rad(90) do + local deltaSeconds = playdate.getElapsedTime() + playdate.resetElapsedTime() + seamAngle = seamAngle - (deltaSeconds * 3) + local seamAngleDeg = math.floor(math.deg(seamAngle)) + seamAngleDeg = seamAngleDeg - (seamAngleDeg % degStep) + + -- Skip re-drawing if no change + if lastAngle ~= seamAngleDeg then + lastAngle = seamAngleDeg + nextSceneImage:draw(0, 0) + + gfx.pushContext(previousSceneMask) + gfx.setImageDrawMode(gfx.kDrawModeFillBlack) + batImageTable[seamAngleDeg]:draw(0, 0) + gfx.popContext() + + previousSceneImage:setMaskImage(previousSceneMask) + previousSceneImage:draw(0, 0) + batImageTable[seamAngleDeg]:draw(0, 0) + end + + coroutine.yield() + end + playdate.update = function() + Transitions.nextScene:update() + end +end + +---@param nextScene fun() The next playdate.update function +function transitionTo(nextScene) + if not Transitions.nextScene then + error("Expected Transitions to already have nextScene defined! E.g. by calling transitionBetween") + end + local previousScene = Transitions.nextScene + transitionBetween(previousScene, nextScene) +end + +---@param previousScene Scene Has the current playdate.update function +---@param nextScene Scene Has the next playdate.update function +function transitionBetween(previousScene, nextScene) + playdate.wait(2) -- TODO: There's some sort of timing wack here. + playdate.update = update + + previousSceneImage = gfx.image.new(C.Screen.W, C.Screen.H) + gfx.pushContext(previousSceneImage) + previousScene:update() + gfx.popContext() + + nextSceneImage = gfx.image.new(C.Screen.W, C.Screen.H) + gfx.pushContext(nextSceneImage) + nextScene:update() + gfx.popContext() + + previousSceneMask = gfx.image.new(C.Screen.W, C.Screen.H, gfx.kColorWhite) + previousSceneImage:setMaskImage(previousSceneMask) + + Transitions.nextScene = nextScene + Transitions.previousScene = previousScene +end diff --git a/src/fielding.lua b/src/fielding.lua index e755987..6587e10 100644 --- a/src/fielding.lua +++ b/src/fielding.lua @@ -182,7 +182,7 @@ function Fielding:userThrowTo(targetBase, ball, throwFlyMs) end) end -function Fielding:celebrate() +function Fielding.celebrate() FielderDanceAnimator:reset(C.DanceBounceMs) end diff --git a/src/fonts/Asheville-Sans-14-Bold-table-20-20.png b/src/fonts/Asheville-Sans-14-Bold-table-20-20.png new file mode 100755 index 0000000000000000000000000000000000000000..2b3c6a83e6c01c9f1e521a11f3a7a21e4e4afb4a GIT binary patch literal 10607 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 7 +? 9 +@ 11 +A 10 +B 9 +C 9 +D 9 +E 8 +F 8 +G 9 +H 9 +I 2 +J 8 +K 10 +L 9 +M 12 +N 9 +O 9 +P 9 +Q 9 +R 9 +S 9 +T 10 +U 9 +V 10 +W 14 +X 8 +Y 8 +Z 8 +[ 3 +\ 6 +] 3 +^ 6 +_ 8 +` 3 +a 8 +b 8 +c 8 +d 8 +e 8 +f 6 +g 8 +h 8 +i 2 +j 4 +k 8 +l 2 +m 12 +n 8 +o 8 +p 8 +q 8 +r 6 +s 8 +t 6 +u 8 +v 8 +w 12 +x 9 +y 8 +z 8 +{ 6 +| 2 +} 6 +~ 10 +… 8 +¥ 8 +‼ 5 +™ 8 +© 11 +® 11 +。 16 +、 16 +ぁ 16 +あ 16 +ぃ 16 +い 16 +ぅ 16 +う 16 +ぇ 16 +え 16 +ぉ 16 +お 16 +か 16 +が 16 +き 16 +ぎ 16 +く 16 +ぐ 16 +け 16 +げ 16 +こ 16 +ご 16 +さ 16 +ざ 16 +し 16 +じ 16 +す 16 +ず 16 +せ 16 +ぜ 16 +そ 16 +ぞ 16 +た 16 +だ 16 +ち 16 +ぢ 16 +っ 16 +つ 16 +づ 16 +て 16 +で 16 +と 16 +ど 16 +な 16 +に 16 +ぬ 16 +ね 16 +の 16 +は 16 +ば 16 +ぱ 16 +ひ 16 +び 16 +ぴ 16 +ふ 16 +ぶ 16 +ぷ 16 +へ 16 +べ 16 +ぺ 16 +ほ 16 +ぼ 16 +ぽ 16 +ま 16 +み 16 +む 16 +め 16 +も 16 +ゃ 16 +や 16 +ゅ 16 +ゆ 16 +ょ 16 +よ 16 +ら 16 +り 16 +る 16 +れ 16 +ろ 16 +ゎ 16 +わ 16 +ゐ 16 +ゑ 16 +を 16 +ん 16 +ゔ 16 +ゕ 16 +ゖ 16 +゛ 1 +゜ 0 +ゝ 16 +ゞ 16 +ゟ 16 +゠ 16 +ァ 16 +ア 16 +ィ 16 +イ 16 +ゥ 16 +ウ 16 +ェ 16 +エ 16 +ォ 16 +オ 16 +カ 16 +ガ 16 +キ 16 +ギ 16 +ク 16 +グ 16 +ケ 16 +ゲ 16 +コ 16 +ゴ 16 +サ 16 +ザ 16 +シ 16 +ジ 16 +ス 16 +ズ 16 +セ 16 +ゼ 16 +ソ 16 +ゾ 16 +タ 16 +ダ 16 +チ 16 +ヂ 16 +ッ 16 +ツ 16 +ヅ 16 +テ 16 +デ 16 +ト 16 +ド 16 +ナ 16 +ニ 16 +ヌ 16 +ネ 16 +ノ 16 +ハ 16 +バ 16 +パ 16 +ヒ 16 +ビ 16 +ピ 16 +フ 16 +ブ 16 +プ 16 +ヘ 16 +ベ 16 +ペ 16 +ホ 16 +ボ 16 +ポ 16 +マ 16 +ミ 16 +ム 16 +メ 16 +モ 16 +ャ 16 +ヤ 16 +ュ 16 +ユ 16 +ョ 16 +ヨ 16 +ラ 16 +リ 16 +ル 16 +レ 16 +ロ 16 +ヮ 16 +ワ 16 +ヰ 16 +ヱ 16 +ヲ 16 +ン 16 +ヴ 16 +ヵ 16 +ヶ 16 +ヷ 16 +ヸ 16 +ヹ 16 +ヺ 16 +・ 16 +ー 16 +ヽ 16 +ヾ 16 +ヿ 16 +「 16 +」 16 +円 16 +� 13 \ No newline at end of file diff --git a/src/fonts/Roobert-20-Medium-table-32-32.png b/src/fonts/Roobert-20-Medium-table-32-32.png index 0e7b41be124d32b58cfe20dcc64bc345e56b2ad6..fad1a25a83a83f75d23e26e31f6c63250245c5a0 100644 GIT binary patch literal 9579 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 Ag#Z8m literal 0 HcmV?d00001 diff --git a/src/images/game/GrassBackground.png b/src/images/game/GrassBackground.png index a33353f0139c4edcfa0f94997f1f7354c2830be4..b01de023c1cc3f31434246f3a46943201f63a21d 100644 GIT binary patch delta 19208 zcmYg%c|25K-2YfA(qf4g6k|!2%Dz*wD8+gP%WWJ?%i z9WjNBY(rxkgZW+G=Xw2JkH6*~_kQmC^Zu;oo^!^Mm}k?NU+x}P5|UL_lT}ocQ_Wyy zQUwy0`sX1Krl;PwZrwGybxY{sqX4+Kp9cgI`WBg{Y54VqK!?-48a+v92xnmT-Mr-j zXo}r)s3lvC4*Hb%tEih9FGM>!%pc0A>{QwWKMWil`C`S%s(s_jeUaUr(zxBtkk{St;!=`pS{jx^PHFmxpTQhizIUT6J6RjYg$hv^Q1*B9jzBH_Cj(ap zFzWr=m9q+F(ZA#$eyrOcIeMLH6yA*ONQpl1|25Nqy%N#-=hXEL_wG;2#y4|x-b0#D zgUWxRzu3P+^etg)Qhyv1y5;!sLG-g*&KSe<6H8i@Q;4lC${QG<{jcp&P+Z2lj}QnK zD{h22fmu{mSw+d!UEW;=E~nroqo69QBBSc6q$uO!rsVFbs^Folpy-nE>`3tmWkp$e z`Rj6ua@Um=Gn9`89#^vb|8}lAD*Asealej^F=q_3If}^2Uw2cu4wtzu>!Bc{;C|gh z##L2OPR2!5PF_hxK~+IjQ6VFc&6q>>KUvph)#Ma1I@x?g;Yvzy4>@IJ85h~>*JTt` z6jWqf+~GPZvai{t3`v1MiHk6W4wA z94)cEr~je0_3OSO69+ijicWtQQ(%=D5+-5+7m7=T0?tg}aH!tDTc3|lZ3XB8ERuU{ z|8uJwPrlA?UAv7v&po9LZ;b~So(k|*h{n~yO5$;j-2r>qkP466+~DBTn_tdBn!Hnf zQ-m*aCkp@mEbPn_{f?Dc0us90^u7FRDCeYb7)jij>AEcQ(~FQ$AC0O>0GKYUXMF@f zDlZXfsp62^XIdwpJx!MtXJU%h(8@(cIXSKM26Y8+QS@WMBJM{mZ$TN`3bW=I_eeh+ArE~b}$qYt*NC_#n?YMHGh2NIFiHP=E)J! z<3lQD&YFs79IFPTLR@^t&BgB=OXwwlRr*Hs(RZBoCz+fBZf6dnKob!7K0T+(Uk~ps zea?G~nU7P&a8}}pz!y1L4oJIh+=wSc<1{m$kRi*!x9!*12_LT}7EYdKDep`BXE~pE9?|^h<}@V@nGu%dBGO+TJk3Iy0h1g|9GoARUdLfyK!gBsi(?$u z9}J%UZ>;=WB3Gw?EJt*x;q4ezs^oQa>V)w*5JQE^-PtvW0F5~q2Z@WF9?_4ay=^)2 ztDdtW`bb6zBky+wrXC&77PC)jLS+ixVhu?$?07}>diK7963 zojHMmugU8}oKscur2{-%zNbMB-W?S(iZ<v>K9I|FP`^ry|RfsQP!W6~69+10YoPynX8n|2J(;G#+eri;wm02y1zbI?zd(opfdmwx9Ud z^koA*_v6^~{=WK`CHgj^e5Z7!Xjd|vetPC+D>JKas5c6*M@3Qjt8$cAYrP>e@1`p6 zJ~nR#6dp*wLBQf{KkC5x$RBmaR(YKkBV1q(9=xL$*=#r~-ZVj)q!&urm$CiK)BMNI zZ~F(jp}pixdKbA$^&=1RHpWJ232I77ugD#G&B#tF3bf?YRNaizU2)UwyZ$Dh1j8Iw zm*Q-rRScoiXVs^%Ha^L;@G{L^nvXCVAqEiBeg$8S(X`s({t+ijIt4y_`pX4Kaqf}0 zXGwp0l+^9T9*fRlN+Yb?0=5${=Sg+Cx{bu$b77It`}UK@pD!}=sg(R;;t#&mdX;o< z(O{&Hx&3BUt&3*i}Z(8&6Ijv%@ip{S~ zs^qK?a%QsJ8iK0MdI-Df-JzdiTPWtZEnv_ zGx0-~3rA1$;GzR(bx#amRPX1M3)hWJ8(ZZrg~lNe==UMDgw#gU6x9x4y_P1Ccu&MeVmQjs>v*PMP+HX`DlR8Jw2JeC~tu|e`>$cW?$+alBH zyv3b;#+#svN2bWPTAu>%PC~fp9exMbdbsJ!Omgivc5gXNu4vQ*)H!qM6;H^(^(5w7 zZ~?l!|N2cI>>XSsG5jwgkFiR#5u;zZ=v^wAd}bW|jWH4nG+Vx#7+PZF7kC)MAmnOP8Ohoaq@=wI|!ryG&)J z+D5S*jeI+a*Y#l&sC z!8Vc_C8Lm=f$+~V>WmAGLXJVAg)+n*44TU3>-8m|)xVT%hq+HQY>)D~ zG`3K-YtpRSn_cwIJz6hhuTWd~d|V?c?}R6_;mfMa?*T~uA9?HjXVjfa(HBkBeHo+B zzcmI@SG5>O1c1}Nw2w4!Y{Vf$B1sfq#CEC#Qe=1g5?4UtExNF?aO40}yb1)uN%<)j zCl?GsinTad;FwMZ+KxB$$~LF4S*0^3Wh(kEgcig6kA2Xa7eyg2tr zAF6(@BJT5ySJCTDnYZI=XVJj&{rK8l8YS*Y$J7dEMTPXjUD9DquaTYe6qv~9UgeYa z%cJwG((#}tF74P%DCgU-pb>t*7&@(OFM;S=NGYL9onjCn9RXW4>tsVq|2%st5;x42 zScR3-VT?~H!=f01le>Om0xXAGoMM-Q^lo=S)~Z#i+9@7HwO2;PHY2b>*xP20rJr#J zvN$X>uO~i~v*NnOFChmb2M~csKOC~(eGTJ_$-cv_4BucTj|Jp(B}d?RsG8L9!SBcu-s*$3ob zi<(DpTc?~dql%#^u@s#b>jkJ8naVi|Wq+59)~zN}v%?C=nau%T7W(IxDS#5AZ>L3b zr3H-)*-VxoF^YlZ1%O`)&p_O-f$C>|-vr$^sDeo-)r-18U)|4-yZ~vB7xNTflsb|_ z@dX&#Rd;a~72`6)N#knDh1i0vR4b&&vzHU!PyJrL0;(%Ler_Fc(&1?`T{kA`%h|pF zPyZ9Mzr$vQi3#XJ0s^blU^m6BXpWi!$r8|8=T{wEcLaFd=95`~>FYtnIHZ zdsm{wn~QcJjk~MlP{zUb1X=9n^b}CHs~^P8<-qsD@5QiH;xKv+W*hi-B8m)xRmG5ToK?n(A zl*r0^P>yaT_$zCMDQ~JV)c5m;q4r5@Ovx1dB)@Wz-i!WsCNJ7m_|B3gX+`S)s z9~{D69+uYW>sS8TIO%E7IxOPF)S5e+W++vbqLo^`D_(FHCpR6(2k6dNGNQ(O_{Jm8)-xXu?LV4x3g%fu10o=* zvuWIe+7{4;Ak%MrK$HK{&()SRZ#|-YOh0en+tXry90pF-5-JnXVZm%kN2t zIC3lGsV>U%lZ^Jrn~KlP@hhk)#x_M@iZLQe-QVvglFRTT)r3LKtXjf0!I;8Wq}|`| z!;!RoQ2FEtIN58-J^7{84=uo8zqA^elA@(;_uFuQc@6e^v0vLsEW!FnqGuo8Aolt4 zTfno!`XiNs*(nV<$P;v`DO=0ub#m;eGuU^vj0_&pGT8F$vNi~0Oi@daEuJg#|2SWq zSFH$5ixwMTyXw%4gpB#|NE>aK#FS=7_%$Ca6T1W6V%R1pm7$xdjX(rU8@;N^5~nHd z6CI_)STVoDjBlsdYu4XUye zJ48>oc-w=03r;Gs5%ct;?Q?sP_g)4c^vU5dZ-K(iRJKan>KzR`zictB#37h`&{Unv z5t!aF7-=z#>31Cv8eIFhZZp~Co5gOx@8t!ufvZ8HJUt41S8~g-hCn7zmS3sO5-5&C zT8Jm(6U`2qB;1y2I6sW2CALqMw5jK*H71g;-dzf7L2TbAg2j&VCU0n~WQEbpZrPX6 z0G36fmUS0`M2n>?`K$Kwjy2IxQ-MZ*6VP@Hhs9^Wv=ZYYtt)%SXLwItvSl$3FwiDV z(-4m%N7NWwTBI~8C2nVtp5HQAUyao7u$G|>#vO_jlijgGEpd7HvXblA?N~8w5K0*j z`%n-&3_-wd43|lmEAOqEsX)8Eo;)+`Bd5i^&#=L9MMA0m=Y*Zk`8z3E#+<*B zVS6`(EDCrl$IEq13WB$2Q<|w~DE+KeY&!S9A@zB%@Lg1#QK&n^`$xUbIgC0qAtVJa7^?g`Nd(?dtOFYd5W;;CRov4&z+F4f2 z`!=gPNOXS04F+yE^1c8v|Av~+b-|LO*&r>vii6O{^In(YvuR^{lcU-p*^1Xe^nG~R z^M1!B|H0nbBN*OItev=MwI+Ju38w+0Zs)vF_3GsdAOnEZkP7s%G5C6dQFSlAG7@tr zB*Qufz#r~xrQ3d&6Z&Z$ah zB*K;j98{j%i?FiEpT5!R!*>fdTqnupGJVx`#E-`>FemMDL!Lf zmLx(+twcls=Svwb)ZYaWwSR0TDeQUcEP9~r692z<#Aa+ z&Ash29;mSNL|v&Z-8ywPp~n~Lf;yhd>$es}AHxj~ePUng{f~tH(JkS}o$+pccm~qH zlh?cY#W8jpvnla$?qzq*GJVaWG^5a?2H@n=;6x0RH4fA!UN;7kHgH~@EA@4Zf!8IS z%kP6M!Dw^PPN~{BtwWx+c|P#wD}dMMNy~@2KIf{KmT>UEjEq=hBCWae#s1@1oZCEo z?Zlx<6i}u4?Q$t%!a&$EVH*1QzCR=3t=HC8@_k{ykv))or?0UC^(|m9u6LQW^RT1Z zLYS7kH?iUBFkO%8IthBhoUl*9`9F`-i+LPlL^Vv_87}Jb@XwOuqx&W3QQa8U(8e;aup-9O*`a^_FDnt?T z0sHiLK`OGxC963fDYqq!+;nl*4=i0 zzYr6hxV4|El{yR?eAQX*gFaETxO~oFu+vQ8lCR!4s$`ZlYHja?*d5FB=Y0<#F>G}H z+5q?S+ET>Q`HCb#yIUbH{_)XzpA$%x;bz=Pk0N~)zCd$CNQ#wu-l$QY5AYh^_wum= zVRaUMFncaFDtn%Kr}+!4;(0P@aH}w>(CZq}4=MI|G}3e->4!2j6}6z_$tsso4{lz zSIMOoRDJqA)vP;EccJ%>lK`AMNWkL)sAf+>KchwI`;P4tEC%QwkA0)NS!oVa*YuG3 zeU~ZmA#a`A2%pC*uT4k#=sk0`JOXbOtTu}mbkf@^w-%ZX9Fi+uyYjuKs;!3jP*IO( zJ@xEWYiJGSc7qey*Ib{0%;lH_eEG+vHz8)H%7a}1@67_I}1S41i+T(u^$p_e~4|eRH?<`3lGd?eHSeAUSFJ>3h zUyKyFcSzT9PSVxK2lq`Dk~E_VK+-#k+4D@1*uy*;s-@)0h?jmmq_4zo6NA=-!u|%G z-}Do;+Z@w(Qfq7kV-yUy&C`c96R@){;o7>qw|)6>r%7AhZmItGz5OMykQZSVetwj9 zw|~BQk9vd68qf(T%Pv?hoc^U3GMAE?d{#*RM9j4GW1^bD!ZPjPP@Qk&n0^(ch{;|p z4*Pa@ad^y62V`lNDlsV;u}|`oi?`7hbNb{VbzwfFY`S21A~iM3%Mk!B`e(7emydcU zAbUgfF}E5@+#TyDWlv_yGr&`ub)JCC^+Jbr|5e7A7PVyWMa5s678CLqeGtWFUFlsC zYi0iu8S@&PssD`EYHQE_2s9}U5(Qap25AC}hC=Kx8!mX&TW7QfELPlV@-?78*s+<5 zNW(GQR@c5YWUT>3u+Ki4*i&wL7_=vjYWckGLEiUtuhskdxg`Ln+L&1O1UEaFEWu3r zMt+b8dW@+K`9};U%U^F{kG}y~kR+nm*4gn&g0o_{E}<)~!L9I^dplOfz+?u&u3#&$ zxmrtXu6cxrKBsv%s&T+uuZTCVki}fec;?WH9pZuc(%J+iZ3A8$v^nnaIi050+OB)q zCHmv1(uD7dKVIEbjp?sa z9UQIyOqBvc zbJuRK$j{L8o7e1Xf|YhhH%AW!?N8u0b{B%SS7{S2Z2tn2YRF@olGRFe+RV3rWwbEqckB9A&8OgO-nz9M)-mM zI>B?_ZFp}I>IF{9CsZ01FDth7CD7`I8JT5wA8Zn=gO;rvG<*-5moACK^l}~0dhsba zfbTwa8N5fkJO==)r*xEk)}=g0yu7wgJ;RnZxJcXX*B;YyLRYZam^?@G4fgP-?gGA8 zHagE1-Ja;bgywarZRy|B=uzoWh=Ns*Bv455QJ%cCtN!Q(`yvF5e0$bYH(fbmY3ZKt zo=3bBhAokIOjAsoSQ5ZlabMD*<_x$_7_=NOXdEFZX3(Me(3u z^O6pElWg8;o{9a@i1f2$*sH|?{aVY=@V!P~fs%E^)ak-r!oNabYFogC7pA~w!=j5u zrv!`IsUFlH5Epb};(wM%$aAmP2{0URM}pyC^$TKGOiPb7MDeJ7*9InC#G7R)yo_8L(o{gPm6p&!kh6&fHW>Kx2wE%PL5OZU6(>JE7bi0{$87z9P^QE`V! zg|`w3t+CQ&m@G)6Q29}>zm1T&I=S9c&#zBS-q+PjT!OY3rd>*I1UM^lbkS*(tR`yJ z@fwH%+9Qs$uA9UJifT9H z^ZYSbpM7-#&~<#S*D86Y%=qG3_tQr4e>*%@D>szVC>-Ip=Lkj$?0JE#9ExoRANaxI zBv}fWi!7@}1)kHv1ZLLjkN4JE*v+Zx^p)C(6#ymY=`a_riWh9w2sHNg+-zC0mie3R z5w`DgY1(?-IfG#BBX69J6>c|b8)1{;NfLN*V_^?yQTn%IA%f9piJ*?wOHc=SsD)O# zXNK5pjuluLnTPPuE*_h+6yd3lkDRWFF^v`0xYKPn0Xuc8n+o+Ht2{c#{2n(?JaKI% zlP_LA1xkO#HY;I&@=r0kB7}5|Y01p~KM_yFZ@u$_DyK!uIAl z2AJ~ybDcF-c-Vn|Mejjo;N0Owby8tctgtR;Y613C1U4G%GMmNE$)*v4ZkQ^{rR8>a zaVR7pJ5Ad~F8?+s8YEwj6)xtQzaEpde=E7-94Iel$@h-|t;U7j0#qIi-8i z4T>mDi*NE2c+(vun$y??T6Nb>2OtN{gRwQ!u6pX$4w$!>y`(ph8=na#3`Z6JK1|d}35jxP&n7f+n_goPrrAO2`b! zrQ|owwA5XzO;H7yVXasJ(^@l%$!`RB0)K`C|uO1{{Q( z(|N06kX+HElRN~aPa1ot?HnN5sVgI9KASJ6?Ad>C*nBJ)q2NuXC0=(oS1P2bk9c`7 zuBUZ*Nd-ukms^QQckNY22zc0XHKM@|h!9W7Y~qNdyGNxWXM*U^<6pX}_&=@%;~7 zKCw@NS6`JMQ$for2Dexsm_qR{5Pw4x0^2*zp%3Y z%ZlLw`)GV+FW9K~pf9t9$xlk!3+;`@Ys}R46z_NOe-E8CJakKqutVBz%bFxtI8ZY{ zciPpj#xl&2rlY*unz2$zXUc#OY};`e=aIMK%IZM%M*;z?KW%`vfn%kz?*Vp`FgRN` zO#^3Ao(TcgJLEdDf%UBNqXQMU1ME71i(HgXo-Fv-YZq9f(|-Jla}B0;cjc{TLXc(0 z=7S@n+uIFG%ZN#y)I*@=yz~I_y(+~e46?sgBDB z0$AZ{5;nC&2JB@9Bu43%`$m7o1^=ABk5O)5On?h1`vIBvL`IyGHMLb0Eo3+I0ZRGN zC3&-COeLzsFv5lj{potdhm-;v3f)xf9;R;3t|J_EcHzn>f0s7C*(P9~7U5y^qn@Y>~n%&p!*iaqZD?e*4OI}T)BKY3RKYdv9hzDjlfKk z1+G2L|8t28=FrDo83l`aLL7nB!j~^u*23FQyF=@;u;**x4vxOQo$@Trbt7zvInrTV zn|M4wts-p-jDm{DYXz9kmmi07ebgV1(+E*OuX;9sDV^j~$5N#@3#d6)D2l)tU|rh{ zvX}4adWAhNi!`m?s#Fvi`zaW9umzRW2d79ONbFg2!W(>ZTml)zo)_d3(|5Jteufm` z^Q$Y&Fn^>}La0WpukQ=&d6_X{&iV<4o3DPa=+Dt4?JJ$&DtMKmh&A0N&?!GIjEnaN z*`22_ptgl zZ&kVyi}OzlFYmA3@Q=UT z6+TP$6FDx2DiJ1g*6oFqUFqXFf&2B?^B(a-{k1(qTI!QMi4xZeeD>~S)9C&>MQ6?b zpbY-0-q+Ri1bJJmKL|S}Z|$;QeWIQFw`3_aUoY-m++>dVzp%_!F&|Kv`9VE^Js)@^ z$8g2X_r+OrTPI!B7R|1bpZ9e~#0u`~W?k+Ih~nba>|claOz-Wt@7ic9o^-(7c?o^s z+j+{MNzxXyU_inFE<)fCsXn0w{4n6_-xoT)x1wkHwtXnE_^|bh6?Q-C^R`FuS{-ph z%dC`(&)fbt#tNK`CQn!Zubb!f{rlq7Rn6O}w};=D^;Lj7RFWh>K>Cr4w}GG@J|q=z z?!cA@f;!HX=Bjh8;BC*;BhVd!_Jhi&IrC8WfBU!>R2LNLUX(Z!XfI#o-`Ab)MR_1) zFYnjq)vT0wmpXseeDL(d8dQ?7cV{65mdgO` z@9lH(FYWbEhptV6h3M|HukRVi??y!#$2`s9wSM!~kk7!?SO4ds52te8JcJLeHTwWw z&Z^n|J5;G%yK9r+6QfxKgn~h4^NoB89Y#qkmOxj8Q)Y`E5A^vJX9;!;k+fg2=VH(Q z@#mF!IdT58JI4lFUM0|uF zi2_nW*v) zy0}9;LFHjA>scx>1RUe;f~_n5o(RTa;oB}$vPTk=HpvFuT5W$i{V~n_vRfAm+3*8Y zEloNl#M3^^jdrbLyH4@hfU25#_${d5x}IhG1s5*z>h0M?U>;@CX`RWdU_J@S5MQ*Kl0c zJ;#~wxSuX7tUxm5{Cf6okA5Hfi+uH5zZSxL%8pdQYu=j9mDSo(E-afhxR;Nq9kZa5 zq-+qQJU z;IMHpPy&0$|45*|f)o7E={L$hyo@js9wP#Dw~RYV6#x7@Hv8}bXUbLqpS?lRR?6<` zE_be9XPxb=860o;Q?QF@ZhqB)3wxuLIX%wSR$MKh`cczh!|}U7;uX|HdC8MtvDcN~ z#B*o;M~@z87NsJc5U|$f52mA8um9BJzRk<~M@=G^Tyz6S<~OUE*=#~zzYflJ*F|M? zc?to5sPrbAt>R_ztvFi*sku&b(@bgNr*BYjWUX3D>C}OMSX5rK9Qtvh5cqoTL|cPz z#>1|2jYo2dbzs%dRj~k=eaGh^{CDx(fVzpG8+w1^pIR3T4GILg(^six5s3H)-}%xl z@WVM93n;&;`caT#KM!f*Bmc~u;LaXtAQ%f_=DRNq*W;>!9%D*le!>SEW#gYf7%&8t zCVJherh8Xt5!Ols(@pfrgL0U=W4x6$Q0M+f?>pbuH!CFsP`~@R2=q?l-$OX9-bqVjZ5DsakOJfjb{G_R6~z3 zdv4kn#MxrMk;w!TYo!X1f3oYqU;_HW@5KemFh)(Xl76LhvusX!Q_u67uMhDa!#$%f zQpteB3O$R?S;CzOVjQ%9%TUqLM^13z`o&i!p0xH03E2yA(l$DWmhdYZTFM{;e$>_I zn0yqldvM`*@gJ>Jn2n%V5tg*Ss%27lb~RLgS0mRirKWz-vTb4As&;3D{V53ZH5A^* zT~!q)ZR_KV^+D(OKS#vF&DMIvbIq!48;1U=8=)QjNA7vimf3cv!(%@x`BE~*y-fjC zwWx#sgEVj*_lhkH7|AEC1iRx!IhXFJOt@3ODMc(c2qfdvv1eu2Eqw3f7Ar+qU)ZYkx>hId*c)>j5enu+D*u5*Q<>!nC7;6Sh|yV^S0OYbx2f~^X& zOA*{$&&6KCBij@NIUEM$qNyFRc|`r zOC`??wAG29LjL%gq(2eK#ctQP!To3KBTyf&`S|3UQ-YLJ#@%rwIPiV3E8XVuZsPb< zAjWmM^>9P!x49t2_gNPM1!Oqm>^L=t_?w5`Rls^dTV5W=*dp&edOAuDNl)K}X-*EW za@Ptf`5uhM(fz`VZoCv9IVKb*?Y?q~ zd3DvpfbM{NmCt(y@T;P+=E}J37iSxqJcZf4ZnnPO(~?uT)i{>#tTOwbJk?J4it)dk zacPS^JAV9TXQh~q#^CXBkb!fYYrxTc`Bde6D;8hRDYV4Oy>QWgQ-lap7>L$Osr>0K z4ub!*=I?EB*TUC*6!E}+X#zl#8-d+6ZeicypmJcvq*FZCZ+f!Hj@_0&*8}@R5t@QM z%!933AZ#&3SD5a5_$MK&h?V{u#eYPx>HZ3Z33xCBPvs&e3$?As-eRk1)7+t=mczRv z=`%Bmq_B34yHqL{;5&!Fm%a+l`dOo~o!{c_SM?3v+$R;NN_Ww%xyJ8n<|Jyz#0p49 zzYb1&j5)c^#X`l@Dts%Zl`G!#q& z&-!qIQ$b04#TTvyI9ool4+rjiD`^s;rynL$4<%pI%e`v_m313m(@0PdoiyZR#;>&E z>PJh?AE2vJEx;MN*}MPENPdkT$zW6LFuzaw)wU~} zX(biUc^n@+-VGYc=B3SWS+AWVi|?z~HMkc#{wFa*ZNs4Lfup&K!EdyX&V&SvIuO6L zg$Y|l=)hJIGH~GzhnCrzSY8J=aytu->|2Z-4;5#Xb`I1r$I1B`$Zlu3j;6S-AcEbE zQ$LikbAtg}qEsFgHMgWM#(_($#v}6=^S+mz>bVa3dQeNB1^+}0rqOCo_b>rD7rw5! z*KG$}f%ol18Q34S=U!_RO}(RpBWi@ZAr(8d{Id_Y<|z3f*%#~8()`-xOQ#yBQ?K9~ zX0v&Blu}m=A_vFms)NVDYG-r%Zx4n9=nr$oNx=Jx)7EHoMU$Zj--e2B@W;7|vpd$1 zvZ?#9AZ9NL+ zMR+e)-|JpnSBK<-%(LC5{5AV%e+-dmE5e*t_-m;&M8`MHQfVT|i@Lf(14hpIP3Vk< z=Qw{eW@7I?2rK$?K5t~Uo=UrQQnep4($gUK)?m$X^xvuK~S*Ed9Oj|xW(js#uH!>{fZt@n%P`YT23w;2ng zAAjWik26CZ@AYl85a9VqXe4~4*mXsOyDq;^{7n8IH|PhTs_4R}xVE6mUoHDCoR2hqNYYKye>@h3YWKLM>WFAu~TVz z;(`_N)vAxiMQrZ{)fD4=4yUg9dw$tOizLC;tC&`1PFIgnG6RJb_+7RJe2`V1{S0zp zEu*vXqibs7_){;XOVCJ|%?ZHrDXkOpKjAjBi z^vml^ZyUXzCgQ({=N9_qPc)RC9m35lO2-%9(a?_~8y=LmGpgTyRvwza2QGtOo5Bi7 z=M{w$o80~W1^dBk!sdX&6jL_KB*7bJKwx(TC6LFid{pGt0=D)^o&fa$y&GdC?N_Dh zvzO!$A5_;|`*`^+l5x3QD=f$<#!&8xjsIx7B-6620)GauwdKOM}q&EIa_ zu|SH1Xat$La>?HG%;-ytH!_3X+*t^S9eO4aG8s7;bfreMV1b@7_2?{sPff;8j;;$@ zYI^f?=KAG}u^}dvTDqndGLE4Z(RTPHTYh~UEt5PnX@>XD=0jc+%#9SxHLEHCH*%l2tPqyGHe!PChAxg=p|H^F_-fapLl;PR8|pRmax`Fk_-YCwD++xFDaqj!Q#Qi$0D&xU)v1 zQHdj5;6xz|zC@*Ew`Hj5vN?WyQ z-}(12fH#tvbjjf~u*Xe&89P*~2iEtj; zuEz?X@tFK-hgPFBQo|hGLA?S#(0S}rtz~6h=r~~ z9&$xb^TPI}o9M`xUB?Q0ZdROX=R7(7kpUjDg)tcUYVlfg_1vZXrmFGw3pWe9Vlyw^ zcr*_(;PxK_O!E#>6%c2KDvR`o@N%Foqi?>uV7XgXOFLtSYjUG%To-dt7k=Qa>E8A; zP*cf%J{;2eA?zi11TrW+e$c4np6^bk_&<_=*sJJFjf_I<^X7Q&L1EPRTIbUr;F%>K zAVBvd-i|RblYx@!;=)3N)*OsmnWF>0eG^=K*;{w07VqnbGGu;zVPxZHfW`u0?h6Bh z%qI74-w?+G5nVC&AiqVX|;7w8xs$2d={5_jNy#DUTbXCtRvlOlDI2h#R!vj%g zrq(^(kK%?=K_^k_xui+hTk$wQBiunO@4o9C(-}oA)!j(Tr|WExCu9R=J_zQHvHnp) z0QR@MZ|*z0TS6AXc1}w!>n2jx=k@Z{he7^hd-FgbYn-1lKw8?e5_s4Rt?x$g#Owy05v=Jt$X1{M6Ak4gU-9le{vSsy(*?-hKD5y0+0bk5?2L8$f@9w!Ak9i^NNwi zjQ+vqF@e4ZihQs*Cizn=0|u2i0HBkG!YvGf^y0lHt*ObC2k6VwY3q2K@ULKam(BuVN_SwuDf z%Iu4G95BOew}0PY=wwFOT40bdJ65g~ztx@Ts?gftN{<%sxNB&O2xwFJj5kDGXG_^% z`R+wq5st`XZA{QO_SP~jtMIm8-Ky|*&He^YNGr?yEzqbM+Uq5EIKva~rt+2PUxu?D zg#@hAa7f2Qe4QRAWI%z;SpoUg48-5LGxPBBZZ99UK-3q)*@3z=a`xvR7T@{kH|Vbr z$mx7Kcn)}NdXAhjQG}BzaPs96v;7g}e*BSjEf%xi0m7_Y;D*b%LJ}(5MJ}U6cap z8iANyLN?@A>xyqBztwm~Z5|hJ9;mTm9`v=VgynV)Pqb7*^T8Ab&E5*lc zWUmjG12YJ&!;~^ZdJm6Kf4&{s&z+7&_5Fm~090ksdyxE@MEl5pb$RJfiekY?5(wj$ zLRsB&&`gSHXZ&t?%RoqWANE)C{rFj54!%mM4x6(!F+Dw}%>A|Mj4Ii9{$;903|$j4br}LF3OWX+&w*UO8gaQA*HOo`t?3v;og=^4qky^& zQmw#K*;y?nh)SL>XzS>-cw^tHAxU`OXMp`|^vFR_J3F=}s-`2A@YxIkNtow4e4#;A z2%=9=%C`g3dJ5GBFhka4NuWc44MAfLFDp7xh^6(^rGNfGFGOppR%j%IOD^7X zll$lG-QhnkLs}kG_vJUha1*Zs6@*$5RL2XRr;o>sa6-0r&bAzZM9YC)Gz9o? zd)F9XP|1Zbc-HvaKvdk1%LbZ=_H9)eLi6LA5%Adg4ks8F!%>C@51syCw)0rJ6U4nE>=Pa zT|Ms~zRJ)^4JHUeq9ed#?vN(&cuivkljBg57*?i(WKAj}Yn5r@#v{MV=S}5{Js-z2 zUXVdiAI`Oc@dr6jRuwRR4XUHRl#pn?9Urz*PyFPmP^KAC3$R73LLj%3z)xoo$hWos z*Tl7kHFagtBLgZeV|i*}WNej3CF-;=Kq=26gdi5=9Y{flN;*KQeALncA%THU6mZ%o z56KLvMJvdAAjBF%1Vjo>j37Y>#;XDWQzSry0O2wF=FiNZ{K!4`oU_+nd+mMCckiya z!FRT7KixS;hDH!VbgkN-MU?g**bZ!4*9oX0DPjmjFKMr^^WKw6ezs6#lD5MgD?)IMhB^sIe?9F0pTi zXlyFtLPkUP10SeTneD^lA67K4w$a*>Z$`E+L*x%GxB{zLD~4L7O%=)ihSd^3Kt4Td zrhhR4A^m^gdW<|0d{1`lHz<7Ev_wbfc@Iv;gb=;>OyvuW$~sO1jT|2OZNl%CiW|mp znrr26L}Ak$`dlUvV=NV7o0}9ZJvs~c$0|tU;mq{-hRx43cu(21=75mu0q!v8AS8@g1DXH+V(I`p~CTPC%$ zC7jBPZZ5tP;*vi4&$z$SA7t!6D0dkyayg%5a~EQ@$Jyz2MTmB=tRyyIAQP5G2z+ zArqJJ`JXNd(|G;T^CE7^m)D%tUSnULYMuI+MZ&BRvMEZ(z2$K(&pS|=#omyl1V~*g z8Sos$m=jX=T?|Da);VxEhUOO&5`3&{2*d)bYbo?I?J??XX)|=zctVZB_x`Dosa}^_+MlmV-(uO0;$k+93JfShK-u6Iy~6{6d; z@I`Gm38Cgg3aE+@>xoa|=Os6XN@H8yWQulQ67$lcT*SSAYvTtIcsYttWLJ+(+5tW8 zxCwVYBUwdTN(cNun)0rM?|FwGJ5aCg{6L`39@1MHlzlU)>C7TJaowS*hjlOr0}3J^ zq`oaYadtN)DLdnp1;j`$&aQ-=7=a!eY_PsL`yWNj;aZFvchQbV$RjeV*7(()6p_{l zLKul#u3F)vvwRjqeLT9cEptxNPBO-{AJA-vXu1R$A0-&l2tQ=DYfDE{V^+;;8T+#} za_4Ti8IOwu!-n3jCjBd>oB+`iYI=ayZ*?xi1wQ^w(t#7cVsR`pdN%uMt`*(Mv941P z$&3WUKf`t9Hy{3mryPs-BT)^26^KQ`hVXiVX?Xa(gm zFqRA_&>%dwqV(@lOd^uivw!V^YCBI11q~;^zWVpM`#;Gs#$-ASecwPg^yP7%)y>(< zP762hC(&Q7ROvBiY(-j#Q*%r>0x^6qRcFOJ(bPT_jaQeOG}@uv#j9(16cxvK+B`5X z4;Y8ZzM4{bHx0q)88o57Zc9I-Q8byUBhP64*j9%mq%prLEX!8pdf+r+LkqwN;8+78 zqv_+uuVZ*-U5c^xZqo$^S%!DdfCCev22bdSOf0HN*SJT!Q1~Lbd|Li(C;Q5}V@}2^ zxHhWWywP;@OpQfQW6rH!MO@cn*yoDh6#NrQ+O3$*tb?}y1G#7Q2s!?tw5-F@g|gc4 z#d*7P{+n|`atZW~iGtP~z>$L{UdaVkE)!r26V2p8wn1f%M^`>2G*)#fD4oD2A7}>x zq|G1t`IWP8zf|>T^y~67@1DG&+69i%)9u&yZ=nlT*H23?+2Kns>t+tW6DtnCyT3N+ zd{mv-L?n3SRhAUe6N^ zC55=3UWJ^5j#2}0^}4srnxxu32A^JNGG1$UquPc&WIW%Hk706LB!4i_4KmN^{qebl zdw}l~5~sR?!F3V|BL9zCC$CSE@>g#VJ+39H3nMkZ3Oq%0Nis+llNGP?xMe^cGc#KM zO#AnKWw?>ernr$6!EfHF8l$Xd&Z*TI$D+udO9Cir50%(kfNG%dyy7CgNt*v~hMFO2 z@E;BmWeuz3YB^4KT?(t{E?qHMFz={qNaxkn9m6ljE#jA>sJLMNX3};%(Kvh5e7hcE z?S&&KaKm70<#ck;pE;kTf}?cRDk@8hIHjBsNpdcTg*epTLca;!&Fhjf{*M%Fbe%?k cKS*6$JFXHu2UmPzF9CWe&_CF((KjLQzv`6u^8f$< delta 18928 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 ISL(&T0gUf{J^%m! diff --git a/src/main-menu.lua b/src/main-menu.lua index f0afb97..4a21e2c 100644 --- a/src/main-menu.lua +++ b/src/main-menu.lua @@ -24,9 +24,7 @@ local function startGame() awayTeamSprites = AwayTeamSprites, }) playdate.resetElapsedTime() - playdate.update = function() - next:update() - end + transitionBetween(MainMenu, next) end local function pausingEaser(baseEaser) @@ -64,9 +62,10 @@ local function arrayElementFromCrank(array, crankPosition) return array[i] end -local currentLogo = nil +local currentLogo -function MainMenu.update() +--luacheck: ignore +function MainMenu:update() playdate.timer.updateTimers() crankStartPos = crankStartPos or playdate.getCrankPosition() diff --git a/src/main.lua b/src/main.lua index 268012c..64c37eb 100644 --- a/src/main.lua +++ b/src/main.lua @@ -8,6 +8,8 @@ import 'CoreLibs/timer.lua' import 'CoreLibs/ui.lua' -- stylua: ignore end +--- @alias Scene { update: fun(self: self) } + --- @alias EasingFunc fun(number, number, number, number): number --- @alias LaunchBall fun( @@ -24,9 +26,11 @@ import 'CoreLibs/ui.lua' import 'utils.lua' import 'constants.lua' import 'assets.lua' -import 'draw/player.lua' -import 'draw/overlay.lua' +import 'draw/box-score.lua' import 'draw/fielder.lua' +import 'draw/overlay.lua' +import 'draw/player.lua' +import 'draw/transitions.lua' import 'main-menu.lua' @@ -44,19 +48,18 @@ import 'npc.lua' local gfx , C = playdate.graphics, C ----@alias Team { score: number, benchPosition: XyPair } +---@alias Team { benchPosition: XyPair } ---@type table local teams = { home = { - score = 0, -- TODO: Extract this last bit of global mutable state. benchPosition = utils.xy(C.Screen.W + 10, C.Center.y), }, away = { - score = 0, benchPosition = utils.xy(-10, C.Center.y), }, } +---@alias BoxScoreData table ---@alias TeamId 'home' | 'away' --- Well, maybe not "Settings", but passive state that probably won't change much, if at all, during a game. @@ -73,6 +76,7 @@ local teams = { ---@field catcherThrownBall boolean ---@field offenseState OffenseState ---@field inning number +---@field boxScore BoxScoreData ---@field batBase XyPair ---@field batTip XyPair ---@field batAngleDeg number @@ -104,8 +108,6 @@ Game = {} ---@param state MutableState | nil ---@return Game function Game.new(settings, announcer, fielding, baserunning, npc, state) - teams.away.score = 0 - teams.home.score = 0 announcer = announcer or Announcer.new() fielding = fielding or Fielding.new() settings.userTeam = nil -- "away" @@ -137,6 +139,10 @@ function Game.new(settings, announcer, fielding, baserunning, npc, state) battingTeamSprites = settings.awayTeamSprites, fieldingTeamSprites = settings.homeTeamSprites, runnerBlipper = runnerBlipper, + boxScore = { + home = { 0 }, + away = { 0 }, + }, }, }, { __index = Game }) @@ -210,10 +216,6 @@ local function getOppositeTeamId(teamId) end end -function Game:getBattingTeam() - return teams[self.state.battingTeam] or error("Unknown battingTeam: " .. (self.state.battingTeam or "nil")) -end - function Game:getFieldingTeam() return teams[getOppositeTeamId(self.state.battingTeam)] end @@ -265,40 +267,49 @@ end function Game:nextHalfInning() pitchTracker:reset() - local gameOver = self.state.inning == self.settings.finalInning and teams.away.score ~= teams.home.score - if not gameOver then - self.fielding:celebrate() - self.state.secondsSinceLastRunnerMove = -7 - self.fielding:benchTo(self:getFieldingTeam().benchPosition) - self.announcer:say("SWITCHING SIDES...") - end + local homeScore, awayScore = utils.totalScores(self.state.boxScore) + local gameOver = self.state.battingTeam == "home" + and self.state.inning == self.settings.finalInning + and awayScore ~= homeScore if gameOver then self.announcer:say("AND THAT'S THE BALL GAME!") - else - self.fielding:resetFielderPositions() - if self.state.battingTeam == teams.home then - self.state.inning = self.state.inning + 1 - end - self.state.battingTeam = getOppositeTeamId(self.state.battingTeam) - playdate.timer.new(2000, function() - if self.state.battingTeam == teams.home then - self.state.battingTeamSprites = self.settings.homeTeamSprites - self.state.runnerBlipper = self.homeTeamBlipper - self.state.fieldingTeamSprites = self.settings.awayTeamSprites - else - self.state.battingTeamSprites = self.settings.awayTeamSprites - self.state.fieldingTeamSprites = self.settings.homeTeamSprites - self.state.runnerBlipper = self.awayTeamBlipper - end + playdate.timer.new(3000, function() + transitionTo(BoxScore.new(self.state.boxScore)) end) + return end + + Fielding.celebrate() + self.state.secondsSinceLastRunnerMove = -7 + self.fielding:benchTo(self:getFieldingTeam().benchPosition) + self.announcer:say("SWITCHING SIDES...") + + self.fielding:resetFielderPositions() + if self.state.battingTeam == "home" then + self.state.inning = self.state.inning + 1 + self.state.boxScore.home[self.state.inning] = 0 + self.state.boxScore.away[self.state.inning] = 0 + end + self.state.battingTeam = getOppositeTeamId(self.state.battingTeam) + playdate.timer.new(2000, function() + if self.state.battingTeam == "home" then + self.state.battingTeamSprites = self.settings.homeTeamSprites + self.state.runnerBlipper = self.homeTeamBlipper + self.state.fieldingTeamSprites = self.settings.awayTeamSprites + else + self.state.battingTeamSprites = self.settings.awayTeamSprites + self.state.fieldingTeamSprites = self.settings.homeTeamSprites + self.state.runnerBlipper = self.awayTeamBlipper + end + end) end ---@param scoredRunCount number function Game:score(scoredRunCount) - local batting = self:getBattingTeam() - batting.score = batting.score + scoredRunCount + local battingTeamBoxScore = self.state.boxScore[self.state.battingTeam] + battingTeamBoxScore[self.state.inning] = battingTeamBoxScore[self.state.inning] + scoredRunCount + self.announcer:say("SCORE!") end @@ -513,7 +524,8 @@ function Game:updateGameState() if self.state.secondsSinceLastRunnerMove > C.ResetFieldersAfterSeconds then -- End of play. Throw the ball back to the pitcher self.state.ball:launch(C.PitchStartX, C.PitchStartY, playdate.easingFunctions.linear, nil, true) - self.fielding:markAllIneligible() -- This is ugly, and ideally would not be necessary if Fielding handled the return throw directly. + -- This is ugly, and ideally would not be necessary if Fielding handled the return throw directly. + self.fielding:markAllIneligible() self.fielding:resetFielderPositions() self.state.offenseState = C.Offense.batting -- TODO: Remove, or replace with nextBatter() @@ -629,11 +641,21 @@ function Game:update() if math.abs(offsetX) > 10 or math.abs(offsetY) > 10 then drawMinimap(self.baserunning.runners, self.fielding.fielders) end - drawScoreboard(0, C.Screen.H * 0.77, teams, self.baserunning.outs, self:getBattingTeam(), self.state.inning) + local homeScore, awayScore = utils.totalScores(self.state.boxScore) + drawScoreboard( + 0, + C.Screen.H * 0.77, + homeScore, + awayScore, + self.baserunning.outs, + self.state.battingTeam, + self.state.inning + ) drawBallsAndStrikes(290, C.Screen.H - 20, pitchTracker.balls, pitchTracker.strikes) self.announcer:draw(C.Center.x, 10) if playdate.isCrankDocked() then + -- luacheck: ignore playdate.ui.crankIndicator:draw() end end diff --git a/src/npc.lua b/src/npc.lua index 812be91..e5148e6 100644 --- a/src/npc.lua +++ b/src/npc.lua @@ -22,6 +22,7 @@ end ---@param catcherThrownBall boolean ---@param deltaSec number ---@return number +-- luacheck: no unused function Npc:updateBatAngle(ball, catcherThrownBall, deltaSec) if not catcherThrownBall and ball.y > 200 and ball.y < 230 and (ball.x < C.Center.x + 15) then npcBatDeg = npcBatDeg + (deltaSec * npcBatSpeed) diff --git a/src/utils.lua b/src/utils.lua index 589fbaf..7f55c63 100644 --- a/src/utils.lua +++ b/src/utils.lua @@ -232,6 +232,22 @@ function utils.getNearestOf(array, x, y, extraCondition) return nearest, nearestDistance end +---@param box BoxScore +---@return number homeScore, number awayScore +function utils.totalScores(box) + local homeScore = 0 + for _, score in pairs(box.home) do + homeScore = homeScore + score + end + + local awayScore = 0 + for _, score in pairs(box.away) do + awayScore = awayScore + score + end + + return homeScore, awayScore +end + PitchOutcomes = { StrikeOut = {}, Walk = {},