From 073140f7003e5f12675a11b6c33b76db377ae1d1 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Sun, 2 Feb 2025 16:15:29 -0500 Subject: [PATCH] Add basic announcement messages. Switch to checking based on __types.lua instead of __stub.lua New font for announcement. Move Full Circle font out of subdirectory. --- Makefile | 2 +- __stub.ext.lua | 38 +- src/fonts/Roobert-20-Medium-table-32-32.png | Bin 0 -> 11333 bytes src/fonts/Roobert-20-Medium.fnt | 591 ++++++++++++++++++ .../font-full-circle-table-12-15.png | Bin .../{Full Circle => }/font-full-circle.fnt | 0 src/main.lua | 24 +- src/utils.lua | 20 + 8 files changed, 639 insertions(+), 36 deletions(-) create mode 100644 src/fonts/Roobert-20-Medium-table-32-32.png create mode 100644 src/fonts/Roobert-20-Medium.fnt rename src/fonts/{Full Circle => }/font-full-circle-table-12-15.png (100%) rename src/fonts/{Full Circle => }/font-full-circle.fnt (100%) diff --git a/Makefile b/Makefile index 6433974..a8cba8b 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ all: check: stylua -c src/ - cat __stub.ext.lua <(sed 's/^function/-- selene: allow(unused_variable)\nfunction/' ${PLAYDATE_SDK_PATH}/CoreLibs/__stub.lua) ${SOURCE_FILES} | grep -v '^import' | sed 's///g' | selene - + cat __stub.ext.lua <(sed 's/^function/-- selene: allow(unused_variable)\nfunction/' ${PLAYDATE_SDK_PATH}/CoreLibs/__types.lua) ${SOURCE_FILES} | grep -v '^import' | sed 's///g' | selene - lint: stylua src/ diff --git a/__stub.ext.lua b/__stub.ext.lua index 2a90888..da90630 100644 --- a/__stub.ext.lua +++ b/__stub.ext.lua @@ -1,31 +1,15 @@ -- A small additional stub to keep Selene from complaining about playdate being missing. --- Strictly, just putting `playdate = {}` would alleviate these warnings, but I've also --- found that this quick structure, *actually* prepended to __stub.lua can help --- SumnekoLua (an IntelliJ plugin) better provide autocompletion. +-- These warning-allieviators could also be injected directly into __types.lua +-- Base __types.lua can be found at https://github.com/balpha/playdate-types -- selene: allow(unused_variable) -- selene: allow(unscoped_variables) -playdate = { - datastore = {}, - display = {}, - file = {}, - frameTimer = {}, - geometry = {}, - graphics = {}, - inputHandlers = {}, - json = {}, - keyboard = {}, - math = {}, - menu = { - item = {} - }, - pathfinder = {}, - simulator = {}, - sound = { - sampleplayer = {} - }, - string = {}, - table = {}, - timer = {}, - ui = {} -} \ No newline at end of file +playdate = playdate + +-- selene: allow(unscoped_variables) +-- selene: allow(unused_variable) +json = json + +-- selene: allow(unused_variable) +-- selene: allow(unscoped_variables) +kTextAlignment = kTextAlignment diff --git a/src/fonts/Roobert-20-Medium-table-32-32.png b/src/fonts/Roobert-20-Medium-table-32-32.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7b41be124d32b58cfe20dcc64bc345e56b2ad6 GIT binary patch literal 11333 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 10 +? 12 +@ 25 +A 18 +B 15 +C 18 +D 17 +E 13 +F 13 +G 18 +H 16 +I 3 +J 7 +K 17 +L 13 +M 18 +N 14 +O 21 +P 14 +Q 21 +R 15 +S 16 +T 15 +U 16 +V 16 +W 29 +X 14 +Y 15 +Z 15 +[ 6 +\ 12 +] 5 +^ 12 +_ 14 +` 5 +a 13 +b 15 +c 14 +d 14 +e 15 +f 10 +g 15 +h 13 +i 3 +j 7 +k 13 +l 3 +m 23 +n 13 +o 15 +p 15 +q 15 +r 9 +s 12 +t 10 +u 13 +v 12 +w 21 +x 12 +y 14 +z 12 +{ 8 +| 3 +} 8 +~ 15 +¥ 15 +… 17 +™ 21 +‼ 8 +© 20 +® 20 +� 15 +Ⓐ 27 +Ⓑ 27 +🌐 25 +› 14 +▸ 12 +✨ 29 + +10 -1 +11 -1 +12 -1 +13 -1 +14 -1 +15 -1 +16 -1 +17 -1 +18 -1 +19 -1 +20 -1 +21 -1 +22 -1 +23 -1 +24 -1 +25 -1 +26 -1 +27 -1 +28 -1 +29 -1 +30 -1 +31 -1 +32 -1 +33 -1 +34 -1 +35 -1 +36 -1 +37 -1 +38 -1 +39 -1 +40 -1 +41 -1 +42 -1 +43 -1 +44 -1 +45 -1 +46 -1 +47 -1 +48 -1 +49 -1 +50 -1 +51 -1 +52 -1 +53 -1 +54 -1 +55 -1 +56 -1 +57 -1 +58 -1 +59 -1 +60 -1 +61 -1 +62 -1 +63 -1 +64 -1 +65 -1 +66 -1 +67 -1 +68 -1 +69 -1 +70 -1 +71 -1 +72 -1 +73 -1 +74 -1 +75 -1 +76 -1 +77 -1 +78 -1 +79 -1 +80 -1 +81 -1 +82 -1 +83 -1 +84 -1 +85 -1 +86 -1 +87 -1 +88 -1 +89 -1 +90 -1 +91 -1 +92 -1 +93 -1 +94 -1 +95 -1 +96 -1 +97 -1 +98 -1 +99 -1 +00 -1 +01 -1 +02 -1 +03 -1 +04 -1 +05 -1 +06 -1 +07 -1 +08 -1 +09 -1 +A' -3 +AC -1 +Ac -1 +Ad -1 +Ae -1 +af -1 +AG -1 +Ag -1 +AO -1 +Ao -1 +Ap -1 +AQ -1 +Aq -1 +At -1 +at -1 +AT -4 +Au -1 +AU -1 +Av -2 +av -1 +AV -4 +Aw -2 +aw -1 +AW -4 +Ay -3 +ay -1 +AY -5 +b, -2 +B, -3 +b. -1 +B. -1 +BA -1 +Bi 1 +Bk 1 +Bl 1 +bl 1 +BL 1 +BP 1 +br 1 +BR 1 +BV -1 +BW -1 +by -2 +BY -2 +By -1 +C, -2 +C. -1 +CA -1 +CO -1 +d, -1 +D, -3 +D. -2 +DA -2 +Da -1 +DI 1 +DL 1 +DM 1 +DN 1 +do 1 +du 1 +DU 1 +DV -1 +DW -1 +DY -3 +e, -2 +e. -1 +EC -1 +ei 1 +el 1 +en 1 +EO -1 +ep 1 +er 1 +et -1 +Eu -1 +ev -1 +Ev -1 +ew -1 +ey -1 +f, -3 +F, -4 +F; -3 +F: -1 +f. -3 +F. -4 +fa -1 +FA -3 +Fa -1 +FC -1 +fe -1 +Fe -2 +ff -2 +FG -1 +fo -2 +FO -1 +Fo -2 +Fr -1 +Ft -1 +Fu -1 +Fy -2 +gh 1 +gl 1 +GO -1 +GR 1 +GU 1 +ht -1 +hv -1 +hw -1 +hy -1 +Hy -1 +id -1 +ie -1 +IO -1 +ip 1 +it -1 +iu 1 +J, -1 +j. 1 +ja 1 +JA -1 +ju 1 +ka -2 +kc -2 +kd -2 +ke -2 +Ke -3 +kg -2 +ko -3 +KO -4 +Ko -3 +Ku -2 +L' -3 +LC -2 +LG -3 +li 1 +LO -3 +lp 1 +LT -5 +Lu -1 +LU -1 +LV -5 +LW -5 +Ly -3 +LY -6 +Mc -1 +MG -1 +MO -1 +Mo -1 +mt -1 +mv -1 +my -1 +N, -1 +N. -1 +NC -1 +NG -1 +Ni 1 +NO -1 +np 1 +nt -1 +nv -1 +nw -1 +ny -1 +o, -4 +O, -4 +o. -2 +O. -2 +OA -2 +Oa -1 +of -2 +oj -4 +ok -1 +ol -1 +om -1 +oo -2 +op -1 +or -1 +OT -3 +ou -1 +ov -2 +OV -2 +ow -2 +OW -2 +ox -2 +OX -2 +oy -2 +OY -2 +p, -3 +P, -5 +P; -1 +P: -1 +p. -1 +P. -1 +PA -1 +Pa -1 +PE -1 +Pe -1 +PL -1 +PO -1 +Po -1 +PP -1 +PU -1 +PY -1 +QU -1 +r, -3 +r. -2 +ra -1 +RC -1 +Rd -1 +rd -1 +Re -1 +re -2 +rg -1 +RG -1 +ro -2 +rq -1 +Rt -1 +rt -1 +RT -1 +Ru -1 +RU -1 +RV -1 +RW -1 +RY -1 +s, -1 +S, -1 +s. -1 +S. -1 +SI -1 +Si -1 +SM -1 +Sp -1 +st -1 +ST -1 +SU -1 +Su -1 +T, -3 +t, -1 +T; -3 +T: -2 +T. -3 +t. 1 +TA -3 +Ta -2 +TC -2 +Tc -3 +te -1 +Te -2 +to -1 +TO -2 +To -4 +Tr -3 +Ts -3 +Tu -3 +tw -1 +Tw -3 +Ty -3 +U, -1 +U. -1 +UA -1 +Ua -1 +UC -1 +UG -1 +Ug -1 +Um -1 +Un -1 +UO -1 +Up -1 +US -1 +Us -1 +ut -1 +v, -2 +V, -1 +V; -1 +V: -1 +v. -2 +V. -1 +VA -1 +Va -1 +vc -1 +VC -1 +vd -1 +ve -1 +Ve -1 +vg -1 +VG -1 +Vi -1 +vo -2 +VO -1 +Vo -3 +Vr -1 +VS -1 +Vu -1 +vy -1 +w, -2 +W, -1 +W; -1 +W: -1 +w. -2 +W. -1 +wa -1 +WA -1 +WC -1 +wd -1 +Wd -1 +we -1 +wg -1 +WG -1 +Wi -1 +Wm -1 +wo -2 +WO -1 +Wr -1 +Wt -1 +Wu -1 +wx -1 +Wy -1 +Xa -1 +xa -1 +Xe -1 +xe -1 +Xo -1 +xo -1 +Xu -1 +Xy -1 +Y, -1 +y, -4 +Y; -1 +Y: -1 +Y. -1 +y. -3 +ya -1 +YA -4 +yc -1 +YC -1 +yd -1 +Yd -1 +ye -1 +Ye -1 +Yi -1 +yo -1 +YO -2 +Yp -1 +YS -1 +Yu -1 +Yv -1 +ZO -1 +am 1 +ot -2 +ih 1 +ij -3 +ik 1 +il 1 +im 1 +in 1 +iz 1 +ji 1 +ef -1 +tt -1 +pt -1 +// -6 +/w -2 +Zo -1 +di 2 +Mi 1 +ll 1 +zo -1 +oz -1 +OZ -1 +YY -1 +HE 1 +ND 1 +XO -2 +MI 1 +MM 1 +IM 1 +NI 1 +UM 1 +RI 1 +OS -1 diff --git a/src/fonts/Full Circle/font-full-circle-table-12-15.png b/src/fonts/font-full-circle-table-12-15.png similarity index 100% rename from src/fonts/Full Circle/font-full-circle-table-12-15.png rename to src/fonts/font-full-circle-table-12-15.png diff --git a/src/fonts/Full Circle/font-full-circle.fnt b/src/fonts/font-full-circle.fnt similarity index 100% rename from src/fonts/Full Circle/font-full-circle.fnt rename to src/fonts/font-full-circle.fnt diff --git a/src/main.lua b/src/main.lua index 7aa9bae..1040a06 100644 --- a/src/main.lua +++ b/src/main.lua @@ -4,6 +4,7 @@ import 'CoreLibs/animator.lua' import 'CoreLibs/easing.lua' import 'CoreLibs/graphics.lua' import 'CoreLibs/object.lua' +import 'CoreLibs/timer.lua' import 'CoreLibs/ui.lua' import 'graphics.lua' @@ -28,10 +29,10 @@ local Screen = { local Center = xy(Screen.W / 2, Screen.H / 2) local BatCrackSound = playdate.sound.sampleplayer.new("sounds/bat-crack-reverb.wav") -local GrassBackground = gfx.image.new("images/game/grass.png") --[[@as PlaydateGraphicsImage]] -local PlayerFrown = gfx.image.new("images/game/player-frown.png") --[[@as PlaydateGraphicsImage]] +local GrassBackground = gfx.image.new("images/game/grass.png") --[[@as pd_image]] +local PlayerFrown = gfx.image.new("images/game/player-frown.png") --[[@as pd_image]] -local ScoreFont = gfx.font.new("fonts/Full Circle/font-full-circle.pft") +local ScoreFont = gfx.font.new("fonts/font-full-circle.pft") local PlayerImageBlipper = blipper.new(100, "images/game/player.png", "images/game/player-lowhat.png") @@ -57,8 +58,8 @@ local batTip = xy(0, 0) local TagDistance = 20 local ball = { - x = Center.x, - y = Center.y, + x = Center.x --[[@as number]], + y = Center.y --[[@as number]], size = 6, heldBy = nil --[[@type Runner | nil]], } @@ -237,11 +238,15 @@ local outs = 0 local homeScore = 0 local awayScore = 0 +function updateForcedRunners() end + function outRunner(runnerIndex) outs = math.min(3, outs + 1) outRunners[#outRunners + 1] = runners[runnerIndex] table.remove(runners, runnerIndex) FielderDanceAnimator:reset() + updateForcedRunners() + announcer:say("YOU'RE OUT!") end -- TODO: Away score @@ -249,6 +254,7 @@ function score(runnerIndex) outRunners[#outRunners + 1] = runners[runnerIndex] table.remove(runners, runnerIndex) homeScore = homeScore + 1 + announcer:say("SCORE!") end function updateFielders() @@ -335,7 +341,7 @@ function updateRunners() end -- TODO: Also move if forced to 😅 - local autoRun = nearestBaseDistance > 40 and mult * autoRunSpeed + local autoRun = (nearestBaseDistance > 40 or runner.forcedTo) and mult * autoRunSpeed or nearestBaseDistance < 5 and 0 or (nearestBase == runner.nextBase and autoRunSpeed or -1 * autoRunSpeed) mult = autoRun + (appliedSpeed / 20) @@ -562,11 +568,11 @@ function drawScoreboard() gfx.drawText("HOME ", x - 7, y - 38) local homeScoreText = homeScore > 9 and homeScore or " " .. homeScore - gfx.drawText(homeScoreText, x - 7 + numOffsetX, y - 38) + gfx.drawText("" .. homeScoreText, x - 7 + numOffsetX, y - 38) gfx.drawText("AWAY ", x - 7, y - 22) local awayScoreText = awayScore > 9 and awayScore or " " .. awayScore - gfx.drawText(awayScoreText, x - 7 + numOffsetX, y - 22) + gfx.drawText("" .. awayScoreText, x - 7 + numOffsetX, y - 22) gfx.setImageDrawMode(originalDrawMode) end @@ -574,6 +580,7 @@ end function playdate.update() updateGameState() playdate.graphics.animation.blinker.updateAll() + playdate.timer.updateTimers() gfx.clear() @@ -614,6 +621,7 @@ function playdate.update() end drawScoreboard() + announcer:draw(Center.x, 10) end init() diff --git a/src/utils.lua b/src/utils.lua index 749132e..6476029 100644 --- a/src/utils.lua +++ b/src/utils.lua @@ -132,3 +132,23 @@ function buildCache(fetcher) end, } end + +local AnnouncementFont = playdate.graphics.font.new("fonts/Roobert-20-Medium.pft") + +-- selene: allow(unscoped_variables) +announcer = {} + +function announcer.say(self, text, durationMs) + self.text = text + durationMs = durationMs and durationMs or 3000 + playdate.timer.new(durationMs, function() + self.text = nil + end) +end + +function announcer.draw(self, x, y) + if not self.text then + return + end + AnnouncementFont:drawTextAligned(self.text, x, y, kTextAlignment.center) +end