From 786f80b0df5a0c50a350fbdb6a093555efed6905 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Thu, 20 Feb 2025 20:33:46 -0500 Subject: [PATCH] Add dark-skin player sprites. SpriteCollection -> PlayerImageBundle SpriteCollection is now PlayerImageBundle[] --- src/assets.lua | 38 +++++-- src/baserunning.lua | 15 +-- src/draw/fielder.lua | 2 +- src/draw/player.lua | 38 ++++--- src/fielding.lua | 2 + src/fonts/Nano Sans-table-6-10.png | Bin 0 -> 1441 bytes src/fonts/Nano Sans.fnt | 104 ++++++++++++++++++ src/graphics.lua | 7 +- src/images/game/DarkPlayerAwayBack.png | Bin 0 -> 4737 bytes src/images/game/DarkPlayerAwayBase.png | Bin 0 -> 4945 bytes src/images/game/DarkPlayerFrown.png | Bin 0 -> 4367 bytes src/images/game/DarkPlayerHomeBack.png | Bin 0 -> 4733 bytes src/images/game/DarkPlayerHomeBase.png | Bin 0 -> 4947 bytes src/images/game/DarkPlayerSmile.png | Bin 0 -> 626 bytes src/images/game/DarkSkinFan.png | Bin 4416 -> 4683 bytes ...PlayerBack.png => LightPlayerAwayBack.png} | Bin ...PlayerBase.png => LightPlayerAwayBase.png} | Bin .../{PlayerFrown.png => LightPlayerFrown.png} | Bin ...PlayerBack.png => LightPlayerHomeBack.png} | Bin ...PlayerBase.png => LightPlayerHomeBase.png} | Bin 4948 -> 5180 bytes src/images/game/LightPlayerSmile.png | Bin 0 -> 4349 bytes src/images/game/LightSkinFan.png | Bin 4404 -> 4671 bytes src/images/game/PlayerSmile.png | Bin 603 -> 0 bytes src/main-menu.lua | 24 ++-- src/main.lua | 36 +++--- 25 files changed, 201 insertions(+), 65 deletions(-) create mode 100644 src/fonts/Nano Sans-table-6-10.png create mode 100644 src/fonts/Nano Sans.fnt create mode 100644 src/images/game/DarkPlayerAwayBack.png create mode 100644 src/images/game/DarkPlayerAwayBase.png create mode 100644 src/images/game/DarkPlayerFrown.png create mode 100644 src/images/game/DarkPlayerHomeBack.png create mode 100644 src/images/game/DarkPlayerHomeBase.png create mode 100644 src/images/game/DarkPlayerSmile.png rename src/images/game/{DarkPlayerBack.png => LightPlayerAwayBack.png} (100%) rename src/images/game/{DarkPlayerBase.png => LightPlayerAwayBase.png} (100%) rename src/images/game/{PlayerFrown.png => LightPlayerFrown.png} (100%) rename src/images/game/{LightPlayerBack.png => LightPlayerHomeBack.png} (100%) rename src/images/game/{LightPlayerBase.png => LightPlayerHomeBase.png} (73%) create mode 100644 src/images/game/LightPlayerSmile.png delete mode 100644 src/images/game/PlayerSmile.png diff --git a/src/assets.lua b/src/assets.lua index 71f0ddb..d4438c3 100644 --- a/src/assets.lua +++ b/src/assets.lua @@ -3,7 +3,13 @@ -- luacheck: ignore ---@type pd_image -DarkPlayerBack = playdate.graphics.image.new("images/game/DarkPlayerBack.png") +DarkPlayerFrown = playdate.graphics.image.new("images/game/DarkPlayerFrown.png") +-- luacheck: ignore +---@type pd_image +LightPlayerAwayBase = playdate.graphics.image.new("images/game/LightPlayerAwayBase.png") +-- luacheck: ignore +---@type pd_image +LightPlayerSmile = playdate.graphics.image.new("images/game/LightPlayerSmile.png") -- luacheck: ignore ---@type pd_image Glove = playdate.graphics.image.new("images/game/Glove.png") @@ -15,37 +21,52 @@ PerfectPowerFlickerRight = playdate.graphics.image.new("images/game/PerfectPower DarkSkinFan = playdate.graphics.image.new("images/game/DarkSkinFan.png") -- luacheck: ignore ---@type pd_image -PlayerFrown = playdate.graphics.image.new("images/game/PlayerFrown.png") +DarkPlayerAwayBase = playdate.graphics.image.new("images/game/DarkPlayerAwayBase.png") -- luacheck: ignore ---@type pd_image PerfectPowerFlickerLeft = playdate.graphics.image.new("images/game/PerfectPowerFlickerLeft.png") -- luacheck: ignore ---@type pd_image +LightPlayerFrown = playdate.graphics.image.new("images/game/LightPlayerFrown.png") +-- luacheck: ignore +---@type pd_image +LightPlayerAwayBack = playdate.graphics.image.new("images/game/LightPlayerAwayBack.png") +-- luacheck: ignore +---@type pd_image +DarkPlayerAwayBack = playdate.graphics.image.new("images/game/DarkPlayerAwayBack.png") +-- luacheck: ignore +---@type pd_image +LightPlayerHomeBack = playdate.graphics.image.new("images/game/LightPlayerHomeBack.png") +-- luacheck: ignore +---@type pd_image BigBat = playdate.graphics.image.new("images/game/BigBat.png") -- luacheck: ignore ---@type pd_image LightSkinFan = playdate.graphics.image.new("images/game/LightSkinFan.png") -- luacheck: ignore ---@type pd_image +DarkPlayerHomeBack = playdate.graphics.image.new("images/game/DarkPlayerHomeBack.png") +-- luacheck: ignore +---@type pd_image GloveHoldingBall = playdate.graphics.image.new("images/game/GloveHoldingBall.png") -- luacheck: ignore ---@type pd_image GameLogo = playdate.graphics.image.new("images/game/GameLogo.png") -- luacheck: ignore ---@type pd_image -Hat = playdate.graphics.image.new("images/game/Hat.png") +LightPlayerHomeBase = playdate.graphics.image.new("images/game/LightPlayerHomeBase.png") -- luacheck: ignore ---@type pd_image -DarkPlayerBase = playdate.graphics.image.new("images/game/DarkPlayerBase.png") +Hat = playdate.graphics.image.new("images/game/Hat.png") -- luacheck: ignore ---@type pd_image MenuImage = playdate.graphics.image.new("images/game/MenuImage.png") -- luacheck: ignore ---@type pd_image -PlayerSmile = playdate.graphics.image.new("images/game/PlayerSmile.png") +Minimap = playdate.graphics.image.new("images/game/Minimap.png") -- luacheck: ignore ---@type pd_image -Minimap = playdate.graphics.image.new("images/game/Minimap.png") +DarkPlayerHomeBase = playdate.graphics.image.new("images/game/DarkPlayerHomeBase.png") -- luacheck: ignore ---@type pd_image GrassBackground = playdate.graphics.image.new("images/game/GrassBackground.png") @@ -54,13 +75,10 @@ GrassBackground = playdate.graphics.image.new("images/game/GrassBackground.png") GrassBackgroundSmall = playdate.graphics.image.new("images/game/GrassBackgroundSmall.png") -- luacheck: ignore ---@type pd_image -LightPlayerBase = playdate.graphics.image.new("images/game/LightPlayerBase.png") +DarkPlayerSmile = playdate.graphics.image.new("images/game/DarkPlayerSmile.png") -- luacheck: ignore ---@type pd_image PerfectPowerBg = playdate.graphics.image.new("images/game/PerfectPowerBg.png") --- luacheck: ignore ----@type pd_image -LightPlayerBack = playdate.graphics.image.new("images/game/LightPlayerBack.png") -- luacheck: ignore ---@type pd_sampleplayer diff --git a/src/baserunning.lua b/src/baserunning.lua index ebb9168..7a91df5 100644 --- a/src/baserunning.lua +++ b/src/baserunning.lua @@ -1,10 +1,10 @@ ---- @alias Runner { ---- x: number, ---- y: number, ---- nextBase: Base, ---- prevBase: Base | nil, ---- forcedTo: Base | nil, ---- } +--- @class Runner +--- @field x number +--- @field y number +--- @field nextBase Base +--- @field prevBase Base | nil +--- @field forcedTo Base | nil +--- @field spriteIndex number ---@class Baserunning ---@field runners Runner[] @@ -158,6 +158,7 @@ function Baserunning:pushNewBatter() nextBase = C.RightHandedBattersBox, prevBase = nil, forcedTo = C.Bases[C.First], + spriteIndex = math.random(#HomeTeamSpriteGroup), } self.runners[#self.runners + 1] = new self.batter = new diff --git a/src/draw/fielder.lua b/src/draw/fielder.lua index b9949ec..0c60fca 100644 --- a/src/draw/fielder.lua +++ b/src/draw/fielder.lua @@ -17,7 +17,7 @@ local function drawFielderGlove(ball, fielderX, fielderY, flip) end end ----@param playerSprites SpriteCollection +---@param playerSprites PlayerImageBundle ---@param ball Point3d ---@param x number ---@param y number diff --git a/src/draw/player.lua b/src/draw/player.lua index 6426081..393d219 100644 --- a/src/draw/player.lua +++ b/src/draw/player.lua @@ -1,7 +1,9 @@ -- selene: allow(shadowing) local gfx = playdate.graphics ----@alias SpriteCollection { smiling: pd_image, lowHat: pd_image, frowning: pd_image, back: pd_image } +---@alias PlayerImageBundle { smiling: pd_image, lowHat: pd_image, frowning: pd_image, back: pd_image } + +---@alias SpriteCollection PlayerImageBundle[] ---@param image pd_image ---@param drawInverted boolean @@ -16,31 +18,31 @@ function maybeDrawInverted(image, x, y, drawInverted) end --- TODO: Custom names on jerseys? ----@return SpriteCollection +---@return PlayerImageBundle ---@param base pd_image ----@param isDark boolean -function buildCollection(base, back, logo, isDark) +---@param isInverted boolean +function buildPlayerBundle(base, back, smile, frown, logo, isInverted) local smiling = gfx.image.new(base:getSize()) gfx.lockFocus(smiling) base:draw(0, 0) Hat:draw(6, 0) - PlayerSmile:draw(5, 9) - maybeDrawInverted(logo, 3, 25, isDark) + smile:draw(5, 9) + maybeDrawInverted(logo, 3, 25, isInverted) local lowHat = gfx.image.new(base:getSize()) gfx.lockFocus(lowHat) base:draw(0, 0) Hat:draw(6, 2) - PlayerSmile:draw(5, 9) - maybeDrawInverted(logo, 3, 25, isDark) + smile:draw(5, 9) + maybeDrawInverted(logo, 3, 25, isInverted) local frowning = gfx.image.new(base:getSize()) gfx.lockFocus(frowning) base:draw(0, 0) - maybeDrawInverted(logo, 3, 25, isDark) + maybeDrawInverted(logo, 3, 25, isInverted) Hat:draw(6, 0) - PlayerFrown:draw(5, 9) + frown:draw(5, 9) gfx.unlockFocus() @@ -52,20 +54,24 @@ function buildCollection(base, back, logo, isDark) } end ---selene: allow(unscoped_variables) ---@type SpriteCollection -AwayTeamSprites = nil +AwayTeamSpriteGroup = nil ---selene: allow(unscoped_variables) ---@type SpriteCollection -HomeTeamSprites = nil +HomeTeamSpriteGroup = nil function replaceAwayLogo(logo) - AwayTeamSprites = buildCollection(DarkPlayerBase, DarkPlayerBack, logo, true) + AwayTeamSpriteGroup = { + buildPlayerBundle(DarkPlayerAwayBase, DarkPlayerAwayBack, DarkPlayerSmile, DarkPlayerFrown, logo, true), + buildPlayerBundle(LightPlayerAwayBase, LightPlayerAwayBack, LightPlayerSmile, LightPlayerFrown, logo, true), + } end function replaceHomeLogo(logo) - HomeTeamSprites = buildCollection(LightPlayerBase, LightPlayerBack, logo, false) + HomeTeamSpriteGroup = { + buildPlayerBundle(DarkPlayerHomeBase, DarkPlayerHomeBack, DarkPlayerSmile, DarkPlayerFrown, logo, true), + buildPlayerBundle(LightPlayerHomeBase, LightPlayerHomeBack, LightPlayerSmile, LightPlayerFrown, logo, true), + } end replaceAwayLogo(Logos[1].image) diff --git a/src/fielding.lua b/src/fielding.lua index f3d1d1d..a99a67f 100644 --- a/src/fielding.lua +++ b/src/fielding.lua @@ -3,6 +3,7 @@ --- @field y number --- @field target XyPair | nil --- @field speed number +--- @field spriteIndex number ---@class Fielders ---@field first Fielder @@ -30,6 +31,7 @@ local function newFielder(name, speed) return { name = name, speed = speed * C.FielderRunMult, + spriteIndex = math.random(#HomeTeamSpriteGroup) } end diff --git a/src/fonts/Nano Sans-table-6-10.png b/src/fonts/Nano Sans-table-6-10.png new file mode 100644 index 0000000000000000000000000000000000000000..399c9dd43ae5bb913ee6f9d17741d63f5a8e0dc0 GIT binary patch literal 1441 zcmX|Bdo1p;LNzRIopYKDt+=a}XC|kjY_TAV;0O9i&&B3ew*y(P57cAkenD zZQmk^b>MIIsjcKdcGGJR$iNC2=od}YTdmH^cpqXKfM46(oHXGw3-h1yU*32h7x3yq zO#Z%*(}eS0E-qqma7bya+`;N{eK6OfQyeixXN}>OM4yjwtp|RwF0``SF^w;wRG=|c zv2tIh^38a;lv!RzJuNsI^l#|oFq?W)&T}){jA-pTgu!MJp-Kr<3V&eqk3~Tx;Y!97 zutJ<>z=dJ{#@ClWlEokGw_pW}~ z^`%}pYbS+K)1;6wkyC;gQK0mr64iANE+aS;mn?gT{4TeB%Cu&{Xy)U=G((z#I;m)c@!JHvnQ7WBTR2-2JOk;)pym4hbVFf z_B_z^)&~ueEcA;4`GmSnGUC}i$$U)9%=NE$;1#?rek2N@`i_+=U zfmbC`4OH{a1aWIP8lG^lc!9xd8)?5oQumYtnFP(8-%LSc$|$VQJl)xhDFEn2JVY^7 zfuy!y#VC2a+M3>!5b}7NVnr!yHi|E3%X`;O*)$iircHeKnUj2PI9a)kyj>rYwXzojt+XU?zz?(6fdLND zXPKR{-030t2N|5N&#!Ym}Sq6{=5UAosMYtPX?Vy$a=wxhNJ|G81cjp zygv*GY4wH$h4ZuL<%US_klUmR2H6vXQ*rOtC 3 +? 3 +@ 4 +\ 3 +_ 3 +` 2 +~ 5 +¥ 3 +… 5 +™ 5 +‼ 3 +© 5 +® 5 +� 5 +# 5 +/ 3 +- 3 ++ 3 +, 1 +* 3 +) 2 +( 2 +' 1 +$ 3 +% 3 +& 4 \ No newline at end of file diff --git a/src/graphics.lua b/src/graphics.lua index 7bd8479..7c82300 100644 --- a/src/graphics.lua +++ b/src/graphics.lua @@ -27,15 +27,16 @@ blipper = {} --- Build an object that simply "blips" between the given images at the given interval. --- Expects `playdate.graphics.animation.blinker.updateAll()` to be called on every update. -function blipper.new(msInterval, smiling, lowHat) +function blipper.new(msInterval, spriteCollection) local blinker = playdate.graphics.animation.blinker.new(msInterval, msInterval, true) blinker:start() return { blinker = blinker, smiling = smiling, lowHat = lowHat, - draw = function(self, disableBlipping, x, y) - local currentImage = (disableBlipping or self.blinker.on) and self.lowHat or self.smiling + draw = function(self, disableBlipping, x, y, hasSpriteIndex) + local spriteBundle = spriteCollection[hasSpriteIndex.spriteIndex] + local currentImage = (disableBlipping or self.blinker.on) and spriteBundle.lowHat or spriteBundle.smiling local offsetY = currentImage == lowHat and -1 or 0 currentImage:draw(x, y + offsetY) end, diff --git a/src/images/game/DarkPlayerAwayBack.png b/src/images/game/DarkPlayerAwayBack.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf509c61e6a5d5ae41042859e0ce50dc074da5d GIT binary patch literal 4737 zcmeHLeQ*=U6+ao*c5Li|<3fx>=SEKWFgfXT(#g83WiXPA1<2LdN-Tog`h2&NuC{bS zI$5%*ZHNPH?O+m5L!mU3CUFx2Bqf7WzFOJ|Z9_^@8m442aVbOE#(WriATvptK>O|_ ze+`+*cv}ARY1X^@_PyV}_uIG6I{naHy(%|*K{keAxy~wk4fOM%8L~3q?}dfy1~5!h zfV@th(^-OLfh-3E>6j*^r%8*wf-+(55Ke_K9jFl%#{n#RilaYYOMLB@4a=P5u=Swkc zJ*0K? zRL#Dgzv_Hw&Eh?adc|WEpRRn{zwPEc|F0kQ4{y9NzcS|!Z&L4y+q7F84^?bU|60uB z-qK|m&RA-ulNWJx<$18hXYgt|j>Nr7aM7l&UtR7?8@9n~;n*BEJ~2YDbQr)Z(IG)z;B2 z(iOI$fLPTQLA7nw9=@%KX9Vr?^6at%3jjeRb9f@y9E!3Dt5(HjVXTPtT3l6;o2*(d zB%4i&Al#%g=}5wn5L+m1c{W}a5qxZoy)p#>GpjZr%VAcpkH_P>xKSrX{CWe!FnW^G zQxpLjM6@*|a|t38Emk0s7i%U z;KF)?j?@Q(`pFhi+0gZ-F%||9M#0obm@Je)FoMNG2nY$h(QKgwftdv53`J!w z#3Ka?z;z`>GJbi7!5#)>sTLitX* zufVw^LG-nLnYMCy@G{VcBd-#pvJ`1mMadggi#8-@$!W8wUL_n?F9pl-$q=Gk3lda6 z0V}!02e^zG{pf>bavG*{|_RA5XbN0`i|K7uowX@W<{>@zVuZ}J(ZqDLj4 z9Ooja!Vf$GSCF3SzcGA?dQeNJYR3aeIRzk$ASuFN@Q|gf$-q*U6k+6o;ENfr0!Iw|CbOcax5o|Q$sA%D`j!)P|Ngp9D7n>QXK_q zk}{~zQ112P^*+U!Qd#fflS;R{xC21XY%(o=XXu)tYg!CUOL-={X6Tw01JhET$*%t! zUD*?Fj3@+O^y2V7cvU-y!`oy=%Zx+sR}ij}5G^e=A#VW#YK zIWjM&6%zsIw#-FLn7 zpRK!p^3gi?=(*>&T`M8;8-9B!kkcbszV}k){iD`*4pp6dJB~b;s(zb!9ah zt68uAOYHCq?`O2+weA1$dLr=Nnw|~kH@Yia+9Zw999Y7vI*LFKqfo U#qPn^AUw?JsJ6envf;7+0?B|#qW}N^ literal 0 HcmV?d00001 diff --git a/src/images/game/DarkPlayerAwayBase.png b/src/images/game/DarkPlayerAwayBase.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaa91cc115192017e8de853b3d8263010e552e3 GIT binary patch literal 4945 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 Q3E*K~&ph|;s)pr%0~?&fLjV8( literal 0 HcmV?d00001 diff --git a/src/images/game/DarkPlayerHomeBack.png b/src/images/game/DarkPlayerHomeBack.png new file mode 100644 index 0000000000000000000000000000000000000000..8cddfe31f00f368c7109ae0cfcc9d44ea6618ee9 GIT binary patch literal 4733 zcmeHLeNa@_6@Lp<5P?QRrG7PUmR6MU?fcxXR~E(HRW`bY!X{v(mdAVdEibSi?mpN> z2Q*T(fr^Q#8Jwilq{XDB+RD^ajg8aMT2qraX{Tvy4RsPH#VF#COi60gp7(b7s+q|! z6aV8emwWHI=lt$DzkBY1_ns(Qvobq#ZYG9d*`88YIrOuk(HYa=ci)1wM=;Egi>f@b z$5V)9fNTZ`(lA3(&yXC`Fi$b0VyV#YhL&SU!Dd0<1#K3{HGQqkHGEC)55Ra{a@-5! zMM)jao(9`&=#N8VV4Ms6S!l|R#J(3{tUVd}k28V<6-jtZQS0!P9&Z`;`C<%P2kRrf zCd3&NO_^95AX1E(rx>20aN5k9X`be=6m0wMbZidT{1=*G-x*m)$={nCApZF^+F zYSXQ@h1s6=j-Ow8G)&uLIp_`{s4-@qDMJy7l4q6U(=hRxB$OUa=RPQ_?zrz3GRaw&wkN?H?L9cNz}X zu=uxU7IZ20)ALTV&vw4v{Ie)XjMV?!cOIQ$!E*o^6&h3w*U8!`Uf@*<*k@;=FiOEm7T_I?jO@H+IEa_f{7kE3CO(wJe*@J^%IF=_fbU=e@Y_)-UR2^|x$zZx@aC&iL)z zLpNKl9Y1(K{&`mQoCTW?PJg3ycVBlr2da z^nc=QuIZoM|AUWjzEk|CE2&TRtnUeJX>-<`a9y}+7`%S<`ae&a2X5cOW~N6rzx0>L z2atN}6knBEg4}|q&ELs{53t~M|@ml0pf)3;0t0#@PA~}qeW-sLp zJ5ildx-o((Hm>oB8|y{8WL#RDSrq31Ab?Z>j|UopQ9kZ4>bN|NH8E+#brrSVVXT5= zbA}=a=S-Z5BHVGMi7^&u;zbcj=F43xk`OR+80%Cu%#&m+7Bj_IQz+smX}jG{QVhv3 z1ZWV^=AbIXiC{EegGgYwP*jX4VO0qQaSc8e5&r^VuXhwa7)`POe2{S= zOwuNb3o3hR|YMwmv@E4 zM$J8s%VE^^=cSOSNW4Cj5zE+Zc0{leS4(gv+7a(0SlDD#-oBPbGuOw=&-0;{iR z$HGG}K&+tUDFEnlh=tdyXeiVgHYoa4!g2jl@Pe2KAu2Q>N%s@5 z5=&y85cDIc9?5hakt<)23as5MSY;ba*f|PP!D5vO!D2BJB0?6Kvx_1pvlG#yAz6(H z5me#_9)T-JPyNprzDPf)#S^t-bx1n}AdH|Gf~I|xmFH-lu_Xy3?|q0C+Cqu7Hpq5X z;0R8x6^UAr5eR{^(hL$9MwY(95E<(Kb0QgH5vi5MkwYya?>hE`!nisL)Ffn3pP}57 zqxC+?nO0fv;gd|ad$s*%#^P+L%e5c6A05)kJp`kB_%hP z%_)1Ax&Wd%s=G>ch637)2X@z2h04cs@<8dl$5rC1IyF%FcFrk05@~Kr}yk{8BXu;FKdl%wcY9cw0OZ%tonKBq0A%sTOl;e<6h%B Jw7h2P{{Ra_NU;C_ literal 0 HcmV?d00001 diff --git a/src/images/game/DarkPlayerHomeBase.png b/src/images/game/DarkPlayerHomeBase.png new file mode 100644 index 0000000000000000000000000000000000000000..7aca994f7a16ac5df04719468500b6987105beb2 GIT binary patch literal 4947 zcmeHLe^3;xOEcGA(bA=ZX!VojPfcGPMxky@%T&5yR3j)`@W%oGzrW74XPO24~z98fdU zVN&}Sd-LwS_kG{@dEf8n`+e`--s813D>Bpb(=iOobX3{upw5A!OG|<8GmBU4$1v3b ze;k3bQ=A6xf*Xv0fRu_SEMwp1(+=KKqaYUh-_&`mryuXN>f z)>Y8&5h^Qd9hH@MNDO*~R)k^EpLTAwRvjz9d(+>3@u0mp%X`PVk=m!v?^5^gPq**6 z{Qw&?Je z=f9Hw!k3-r5AC}Pzn0OMw|L{e+urEfc4oBsrGlo=q5}uUn?Lzx=-|AJvK@Vc(YozF zu6-csg6|7wN7HD|=-SV}{7dQY&&~Vc;F`f;cTZ*0VcTCnRb3eWbo}&?aqPx*?9Nni z;lz+2S~ zMknbERib90YQ2c+*VnkX^(`FDtIJB$OQH+__>sioQGaV7%tWnf1($)gEY_-VMMY|{ zs@;%ml|d2V28}^O685OjPN_@N@e+~uGIh4)aR}&H)y+;4&ub3ARaAwHn6pN&EaEr!xT`2*+6f zKD1Fbq}6Fit>3SmJ|isI+W{nQ&{xg~yE;NhTZh8IHjzX2b`+2brbF;tVt%MiY*pOh zIW1~Meozg=s=66V%G)wAL#Dtd_(RGpAbWsm(zO)miF+3!C*2Gtj^037K@qG(Uga#IeHqD zBM_F@0Ec8K0M`hBW8hc|$9Y-8j0_xMFq14n^YCRdAfpH1O{|fc2Jx^cKvuG?)2))B zc!1()y@g{vG+0Ah2m|Fc6D(zB2@B6#D3gcP8;oWJiszW+LDA1bI0ZlJL)uWlrwqu1 zGZnQCtD4e~Qt26@5T@!z!N&4ZVKK7_nV2une+LlMPxR6SZ3>&3dQg0huxT-g*1%f(y> zv+ami>;$aX5ZBBGdfjJdjPa&O{n0i`n9t zi5?Dmr3fpc3Lo$YTtRv&*BE}k5~!k?+L2}?M*#>UNQ$6Hm(IlKXhyG(6Q;fOF7jrR z1yM$dAPoi*Qq%(*1|f>DAdWS2;G)M6%bWy(U*APa#~3aDKNl&QG?7LRM^L;0qUb>u z0`@UYcnx~9(a2g%X38`(E??8d|493I6ic-7$v>I5CEA-ZJEk!0s(|RnWN-z+jiyap zY4Nmxkle~AzN2pC5;#7$$gKFCqic??Surpx<+<#dqia?S%u0DKyZ&c%rBA&SqX7Jt zjle7K#35HXyfCMD9$I0;Cgjh~BfEbDlG{R6tHKzjDUgdQI#|{Y!c@uOw5Og+TBu4X zSm@jHF^KXcyIZOZ`sH^k?500X8XnEc1*O*=whEW~*jU5cS;KhRuQyLjoIFyPYaBS5 zG%h~6`ygB7zW3Yr5q?v3OW@TV=SB6%<9|BZH}FWeel)Wmt9>tjD5JV`Z_Ut!KFt68 z$g!o#*S>hGpImbyv;5w3#}EJWZ7gH!>D4D+x%}eN)S{y&hO7-^DW}%2O856=?@V`} zIO+`K{BC>q{^F~PkLO%OW#j*7?#w;&LE!ir>n_x^vUg=3{Z#gqd&t-CZg`G((0u81 vZ{AaH1)^`(H|8Js%sFyp?a0KtpQXODwry#{*4M1y4d$@d*j`xH^w_@vw7-RK literal 0 HcmV?d00001 diff --git a/src/images/game/DarkPlayerSmile.png b/src/images/game/DarkPlayerSmile.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4872cd2fea1f16a9b43ddd72a3390b8302abfb GIT binary patch literal 626 zcmV-&0*(ENP)EX>4Tx04R}tkv&MmKp2MKrb$WWc^q9Ts93Pq?8YK2xEOfLO{CJjl7 zi=*ILaPVib>fqw6tAnc`2>yV$3r>nIQsQ?>p+$^$9QW|v_rBbH2MEn7)9s!Fpc{^r zNhPIRepQORLV!q9KuBS>IVa0$1dgwJg!q0J=UKsZe~tmIU^5^j5hs{wIm8>pGnz6+X^kRK<^p0}MZzilul`n3hm10`F(^O?hDG7U*B|`_?|k=>w3ZUZrnB@9yjF+rKsK{`~+E2XcQ@C@+x!000JJOGiWi000000Qp0^e*gdg32;bRa{vG? zBLDy{BLR4&KXw2B00(qQO+^Rk0u=!RJ9~V@_W%F@8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b082?kK~yNuwUJ27PJ2Ll5GHvF29PIy0WsqOgo7Cv6o4X7fN7QCnN1Cor5I)FCED&U z^K#YVOA{zO5is}7BBj2qT&^nwvRcDref0h|tMPhvbuWGpRq!Ew@drKivDi?@lc{$62k*Z|AWrknWr6sk$_#F0^ZpQ-epagGb^v zOZC&4EPd;%TYl7uKaV_ETHnXGHo;gyrCv~dMyBNv=_AIo`%YHQk4Q;%Rkl-~x8X(8 zk^Y$Q+PcRvpCTU2Tr~CU8R70DK`Xnj>ZPT6tIt#G%iQJo)9GA#?`N^}y;13Jt3Qdm zaUVNnbUm|Isnu1-v5iHvG$f$4+2SpmrkPR6Jf08z6?HRXw03GGJc)4NwGuhc|Brot zb#}e@a<#upGK5~#7T)bQRM^D5MQYve+Bdt_3M>5KiIJ48U(0!>ZqmIM85@-o3Z!@J zc$e`?u3#rKkNwQ9r4>OlrUmFQy-)w*Tbb}e>_zPBGCn zF*Y&LO-ePk&`mZm0tzG<8W!DDD(U~FJwVr*$)Y%-ajO_I@KvL;(3D>yk! zZfDbkur_aH6JebEj4ejRFxfK2JTb{g*B~{~K-VPA*jU#x*(^oZ(m2%;Xt;?{qG{^n zGrW5GCUYJC*;+_eUTd$$3AYE9`>xth>>;0lBFEJU+*-u z?NM%?75lmIB@c&e_#8hSxhB6o)7G`z)ZFww{Hltyz_-+br79cx*Y!Ng?k|61aW+lA zUr8v9|3;a)(_OBZl3dzl*uLeSxvHtn#<+nbr0AFBH4}cb5MYf1U1qmwET^ f=J{XbYgXTTx6V&t@xqB4KsmtE)z4*}Q$iB}bn0jH delta 983 zcmV;|11S8aB^>EX>4U6ba`-PAZ2)IW&i+q+Ko}!jl>`f z{ilj8!B-5FLoR7MnDXZ(m}E23NNWk>_iTKTw%6~Teh!f$$);Sqx)a2zRcSB^b(v4i zWT)=H!^clPaSexnQry~MmEbqLYA@5^=MRFo+(RS;m|srQkch?h)YYU7Tn6pZjz4t9gq70e_KrmKml^yg@v@X&apP ziKDC}tHkHT<0f5@_>t?1$8VgAE(<&}YG%^G0g*uhE%vy!P1PZ7sdO{aVz>#@pt zi?dd#vDQ8L3&VMRWtrdfQ)Z05hMY*V|g` z2#9P07uRh~*#j;QfrgDF+PP0)1;@ctJ^&f&Ds=-K90FrS z%3k+*cW-BJ|DI{}_X9%Ta+9ln69)hQ4R~o(SaeuTOtaepgaRWpIW{*lGC3_`Wo0of zG&49fEjThaG%Yq|H)CRAHexYjV`7tn1*j%4H#amiG&wOiHZn6J3LqdLM@dakI#y+J zb7^mGJt8tLF)%JOHj_{WSp_jOIyEqpt_CRuF*7R21Pk>&E~9002ovPDHLk FV1n^1rgs1U diff --git a/src/images/game/DarkPlayerBack.png b/src/images/game/LightPlayerAwayBack.png similarity index 100% rename from src/images/game/DarkPlayerBack.png rename to src/images/game/LightPlayerAwayBack.png diff --git a/src/images/game/DarkPlayerBase.png b/src/images/game/LightPlayerAwayBase.png similarity index 100% rename from src/images/game/DarkPlayerBase.png rename to src/images/game/LightPlayerAwayBase.png diff --git a/src/images/game/PlayerFrown.png b/src/images/game/LightPlayerFrown.png similarity index 100% rename from src/images/game/PlayerFrown.png rename to src/images/game/LightPlayerFrown.png diff --git a/src/images/game/LightPlayerBack.png b/src/images/game/LightPlayerHomeBack.png similarity index 100% rename from src/images/game/LightPlayerBack.png rename to src/images/game/LightPlayerHomeBack.png diff --git a/src/images/game/LightPlayerBase.png b/src/images/game/LightPlayerHomeBase.png similarity index 73% rename from src/images/game/LightPlayerBase.png rename to src/images/game/LightPlayerHomeBase.png index a36931ffbefdb3a1d99b46c278de66a919d0177b..42ee6b04637c6310189a896b56b0e51be7eb7f2b 100644 GIT binary patch delta 837 zcmV-L1G@awCcG$+`3o{IATlsIGcYt-RqLt0e6N|)Bsf*PvW@Sq!o+gfIxK<^p0}MZzilul`n3hm10`F(^O?hDG7U*B|`_?|k=>w3ZUZrnk%a z0q^eX?%TgL?f(4$5eIUAsM2!d000mnv(*BM0wiH$V=!c4Gc+wXHe+HfG%#T{Ejc)5 zV=XpiGht;iHZ(b9H)fNA1*Q%(FflMOG%_U~-_lN%B;2o(Vy7q-a62$NM3D1XRF zL_t(o!|hkw4uvoXlV$(^%k{y`3j!NDOwI|s7;!0`mg1HrBZCLAdl=7LQ6>=tBek&t z0HT8+0N=KW?x}MnFQ8SRM18z6i!H~9XPm$Z{2{Q=@2_nWRtG)xiX9lhjrC{&X}1?( zZJ|~`TGw*bGLyEbU3uOrTu0oB7hV{7Rn=pMocS~zd(={%%IP;4yR@x!o~2PM7j8mg z=gs)HaI0ce896}`_&Z<{GX0jRk~+MTSKXz P00000NkvXXu0mjfdYfG= delta 776 zcmV+j1NZ#ADAXp9`3o^IATTyMH90ymG?N4YIe$jd;UNG30fcEoLr_UWLm+T+Z)Rz1 zWdHzpoPCi!NW(xJ#b48widG!#AmWgrI@v`<#Hm)H2o*xD(5i#UrC-pbAxUv@6kH1q zek@iUT%2`va1{i>4-j|3Nzp}0{9jsV5#zyeKi=JY+`R*YMullsAP#7{ZKjh6F`HWz zLw~Oj(1!qmn3b7j%t=xTp5yBtKEB??c$W9MKS#fsw;13PiQ~*LZQ>2$=}p_f1bTKQL8u1iyRMm9K7qTr@Id5^+ zDmB)=Cx2l$udgg~o#qIVSi}+}h)_^N8GjYnh|#K(Vj)fY2@n6U>zBx-kgE(vjs;Yq zL3aJ%fAG6ot1vmyN(v`{;EUsYi~^xupjmgE?_~ zuY0_^r@Oa*&$Rpd0cWmqqVEws>Hq)_KC{#UiUK5JGdE>4He)g^GB!76Ei^GXFfCy> zGd3+|Fg7w~FgamiWnp8Jf(51yGdVIhH8D0dGcqzaH8PVn25<{8F;p-%IyE^uGBlI1 z1|thGF;p-%IyE^uGBmT_2G;_!nF?SC1QD&i1C#v{G6)L`I~fGhoRX6_6DWVeNkld$TryfT{1dT-Ap^TX#FCqv+s$G%YmMPx|@zd!u|0000s*KbZ2MY?2hg3EVI+@ z7Se)LAQmY~#6VPpY6Voh;=!Tffj3B^K|{QVnpl)8VB*1{-^^~eZ7?xSYr z-}igp`@Qdd-FJUY_53mUQ}Zzl8{@0;)apI7g1nLNz4vv;F$^x{(@%O)*mknGoLG0dU*P-EU@p8-R>Hn+l|Lm zMUtBkh9w_sd&pJw-rUJ+zJK}_Z|PWR+|rL~9zWSlbiJDI-8t@_)wf^2(0r+5#u#7c zx+jk>iJc9-^vm%do_n_ASv>FZ$~~j2JI%E}Bz)Vw4{zBWyeY+>% z7YiDuT)$%Xs6*`=zv~UZR2+y++q36%_?H`Ed$SAXZ0YPt)^2{J=H{$3q2K(if!;~I zcb~uT~snbW_X{`!FJ)a6T9VXnGj=jZB=kiJQ|u3oG6 zFXRLzV&+99h|I}I%s9sKIms9=G$IWTqL3VQ5oh)vAaGf95sPhp+8=YHuw1oFMT?eI z*9prS1*b^NnVnyr(;GPWZM6ly{dFpa~i%%COpYnk!T zDG14tnBfIv53F0ql2kvM1iYR)Cdp9DM$DaqGHjIv4&1KS5f105v-Z+*VHuengk9m zVxb&uPWDgK$q}?j<8?M6R+^z{J8QF8?6f@PXEUxAfI6l0{koX;@YnZMfF)$?K;p`fwYe)- zsc^)*Cw6TB)fCNJuep_o{;M3j;>o@E-myhs#QHoHbu*6$fwy!1-adK9nY1nZ?v95FOLEs%Rz8!HgUvdZH>$h{gU30B`MlMh=jR1h{R2le Bv>5;Z literal 0 HcmV?d00001 diff --git a/src/images/game/LightSkinFan.png b/src/images/game/LightSkinFan.png index 21484ba925bac7c9342c9f4497e89b647da3f197..4996dd5448325763f1daea5d3a5bf55b8a934f08 100644 GIT binary patch delta 1024 zcmdm@v|nX{ay_F+YJ_K+r>7PJ2Ll5GHvm8qGPp%DWUL)#>F29PIy0WsqOgo7Cv6o4X7fN7Psh1ZA4QjD_o5^eXF zdAVxwr3nBRK6-zf)p$L-x)(o)D)^AT@zsMzYgRX}R^a&8 zu!GyLOE2hAx#vRHo^qM*AMSnMcc+$}D%+{g+wh|4 zNPkRtZQbLTPZ1AhE}DAwjBxjnpq1TM_0m$k)#s`8W$tqP>2xl=_p?~~-l+7q)t|)O zxR0GOx}Mpq)at6^*v2AS8WPajZ1I*&)6A%39?ysVin^IGT06B8obH|gGsjE%|(1=2fq zyvukcSFn?r$9`tl(u$xN(*ksu-lu=@txR|!_9FiC?`w9)UouZv8n-mRq1icMkIT*1 zjPKvQes_Dn>DzyQ83fsj>Q`JUdJIfv(U~C;B@wpG}g{VzMS%6gxCE zOzvV+hp{*BU=w7V{ERI|CB@jt!rUmyTsJi_IYrmR%*;eL(K01j*U~U0DK#ZA$;iUg zaB>>EA6(~d_B;+2aclNzlXV4*I7AsNc>ZmC@_ll;fJXg9PZ!4!kK=ErIPx_ZaInZe z`oF)&TsZr*(^ht2%dMW0X3-70;`iwc}r)*gt(iipczc?=$#$BEKx) zk`S@rFPnVZp|N|@H#?!E+lzk4RZLI5{$u*z8+$MKZOXXSr4guUzH}4&i>*s$*{rX! zoMkurYxv%W2i3T<)uULWZYZ8(+WPh6>YTmtAAh|qWBA2yEqh&80F-SQJYD@<);T3K F0RT`+SeyU= delta 957 zcmV;u148`2B(x%sBYyzxdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+Ko}$jl?hr z{C5>s0tSLjInGPE4z~QA#5lREw9+9NGXv)3w7q`!^m7PTPCAupZblGwb#5>!b(v3{ zNl)E@g)cw(lsy~_N^nbu&cScsVduaeMe>LriLOcw)^s~s3x9ro@^d8Q`k5#kl6z%Z z<3S`6j*hhBB|0*%Wk6315j8kT*VKZ*(p5?{4lLeUbl+mEL=6b<@u3 z$EpAT0fT8nLz74W7JnSYUsJUrl@1mWamY}e?4lx$T7@E12(?114knj=L6e3g#l=x@ zEjakGSaoo5*44pP5ClI!+yy5^7b)?7NufoI2gm(*ckglc4iFj@rdeIHfTr7KI++l& zxm7Xr3IS0>Fo+(RS;m|srQkch?h)YYU7Tn6pZjz4t9gq70e_KrmKml^yg@v@X&apP ziKDC}tHkHT<0f5@_>t?1$8VgAE(<&}YG%^G0g*uhE%vy!P1PZ7sdO{aVz>#@pt zi?dd#vDQ8L3&VMRWtrdfQ)Z05hMY*V|g` z2#9P07uRh~*#j;QfrgDF+PP0)1;@ctJ^&f&Ds=-K90FrS z%3k+*cW-BJ|DI{}_X9%Ta+9ln69)hQ4R~o(SaeuTOtaepg90QoGczzVFf=tSW@R{H zEi`0fWi2^lIXEpdV`DL6Wo2PDWHw@xf(5B1H#amjFfcbYH8e9K3LqdLM@dakI#y+J zb7^mGJt8tLF)%JOHj_{WS_d;aH846fIg_ylCkHb+H846fIkVpe5dpK)2w(^V0)D70 zlQ$7E2ow@BGGZYCt&?#PD1VSiL_t(Y$L*9$4!|G?1v|w1UzzSqYn6}IMU%Rc2*VQv zj@Z)1#tUEq8j58S>c+DGHF>-QC8D@ORc$^nWYL3qKqEoj$U|-e1#Ze(dn81TP3wE$ z;b%!SeRsHPA17f6Ej5Fpf=xm fnW^_H-ap+=?k77PSGY9=00000NkvXXu0mjf^xBo^ diff --git a/src/images/game/PlayerSmile.png b/src/images/game/PlayerSmile.png deleted file mode 100644 index b6e9f8243d37fd18f03a8ab28405171386a12cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)EX>4Tx04R}tkv&MmKpe$i)0T=>9PA+CkfA!+MMcD^R-p(LLaorMgUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwcfm=~MN0f%T4)jD!Ery{-Fw`<1B6C}X;vT(Xu55t zlL;}KTNOjE5YUGJf|!+=Wz0!Z3ZCQZ9zMR_#dwzYxj#q0nztC>6N%%@Fm2)u;^|G> z;Ji;9VI^55J|`YG>4LzBx-kgE(v zjs;YqL3aJ%fAG6ot1vmyN(v`{;EUsYi~^xupjmgE?_iK48zLmoEv5hf02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{001*dL_t(2&tqV~1plEJrx+6h8DNlWq90(y61)WUFe1eR pv6e6}qD3G<4d|NiX=J20AOJbi2non`Y002ovPDHLkV1gsk@#z2n diff --git a/src/main-menu.lua b/src/main-menu.lua index 4f244c4..ef07832 100644 --- a/src/main-menu.lua +++ b/src/main-menu.lua @@ -5,7 +5,8 @@ MainMenu = { } local gfx = playdate.graphics -local StartFont = gfx.font.new("fonts/Roobert-20-Medium.pft") +local StartFont = gfx.font.new("fonts/Roobert-11-Medium.pft") +local TinyFont = gfx.font.new("fonts/Nano Sans.pft") --- Take control of playdate.update --- Will replace playdate.update when the menu is done. @@ -21,8 +22,8 @@ local inningCountSelection = 3 local function startGame() local next = MainMenu.next.new({ finalInning = inningCountSelection, - homeTeamSprites = HomeTeamSprites, - awayTeamSprites = AwayTeamSprites, + homeTeamSpriteGroup = HomeTeamSpriteGroup, + awayTeamSpriteGroup = AwayTeamSpriteGroup, }) playdate.resetElapsedTime() transitionBetween(MainMenu, next) @@ -87,16 +88,18 @@ function MainMenu:update() startGame() end if playdate.buttonJustPressed(playdate.kButtonUp) then - inningCountSelection = inningCountSelection + 1 + inningCountSelection = math.min(99, inningCountSelection + 1) end if playdate.buttonJustPressed(playdate.kButtonDown) then - inningCountSelection = inningCountSelection - 1 + inningCountSelection = math.max(1, inningCountSelection - 1) end - GameLogo:drawCentered(C.Center.x, 50) + local logoCenter = 90 + GameLogo:drawCentered(C.Center.x, logoCenter) + TinyFont:drawTextAligned("a game by Sage", C.Center.x, logoCenter + 35, kTextAlignment.center) - StartFont:drawTextAligned("Press A to start!", C.Center.x, 140, kTextAlignment.center) - gfx.drawTextAligned("with " .. inningCountSelection .. " innings", C.Center.x, 190, kTextAlignment.center) + StartFont:drawTextAligned("Press A to start!", C.Center.x, 180, kTextAlignment.center) + gfx.drawTextAligned("with " .. inningCountSelection .. " innings", C.Center.x, 210, kTextAlignment.center) local ball = { x = animatorX:currentValue(), @@ -105,10 +108,9 @@ function MainMenu:update() size = 6, } - local ballIsHeld = drawFielder(AwayTeamSprites, ball, 30, 200) - ballIsHeld = drawFielder(HomeTeamSprites, ball, 350, 200, playdate.graphics.kImageFlippedX) or ballIsHeld + local ballIsHeld = drawFielder(AwayTeamSpriteGroup[1], ball, 30, 200) + ballIsHeld = drawFielder(HomeTeamSpriteGroup[2], ball, 350, 200, playdate.graphics.kImageFlippedX) or ballIsHeld - -- drawFielder(AwayTeamSprites, { x = 0, y = 0, z = 0 }, ball.x, ball.y) if not ballIsHeld then gfx.setLineWidth(2) diff --git a/src/main.lua b/src/main.lua index d81675a..687e074 100644 --- a/src/main.lua +++ b/src/main.lua @@ -69,8 +69,8 @@ local teams = { ---@class Settings ---@field finalInning number ---@field userTeam TeamId | nil ----@field awayTeamSprites SpriteCollection ----@field homeTeamSprites SpriteCollection +---@field awayTeamSpriteGroup SpriteCollection +---@field homeTeamSpriteGroup SpriteCollection ---@class MutableState ---@field deltaSeconds number @@ -114,8 +114,8 @@ function Game.new(settings, announcer, fielding, baserunning, npc, state) fielding = fielding or Fielding.new() settings.userTeam = "away" - local homeTeamBlipper = blipper.new(100, settings.homeTeamSprites.smiling, settings.homeTeamSprites.lowHat) - local awayTeamBlipper = blipper.new(100, settings.awayTeamSprites.smiling, settings.awayTeamSprites.lowHat) + local homeTeamBlipper = blipper.new(100, settings.homeTeamSpriteGroup) + local awayTeamBlipper = blipper.new(100, settings.awayTeamSpriteGroup) local battingTeam = "away" local runnerBlipper = battingTeam == "away" and awayTeamBlipper or homeTeamBlipper local ball = Ball.new(gfx.animator) @@ -138,8 +138,8 @@ function Game.new(settings, announcer, fielding, baserunning, npc, state) inning = 1, pitchIsOver = true, didSwing = false, - battingTeamSprites = settings.awayTeamSprites, - fieldingTeamSprites = settings.homeTeamSprites, + battingTeamSprites = settings.awayTeamSpriteGroup, + fieldingTeamSprites = settings.homeTeamSpriteGroup, runnerBlipper = runnerBlipper, stats = Statistics.new(), }, @@ -266,12 +266,12 @@ function Game:nextHalfInning() 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.battingTeamSprites = self.settings.homeTeamSpriteGroup self.state.runnerBlipper = self.homeTeamBlipper - self.state.fieldingTeamSprites = self.settings.awayTeamSprites + self.state.fieldingTeamSprites = self.settings.awayTeamSpriteGroup else - self.state.battingTeamSprites = self.settings.awayTeamSprites - self.state.fieldingTeamSprites = self.settings.homeTeamSprites + self.state.battingTeamSprites = self.settings.awayTeamSpriteGroup + self.state.fieldingTeamSprites = self.settings.homeTeamSpriteGroup self.state.runnerBlipper = self.awayTeamBlipper end end) @@ -608,7 +608,7 @@ function Game:update() for _, fielder in pairs(self.fielding.fielders) do addDraw(fielder.y + danceOffset, function() local ballHeldByThisFielder = - drawFielder(self.state.fieldingTeamSprites, self.state.ball, fielder.x, fielder.y + danceOffset) + drawFielder(self.state.fieldingTeamSprites[fielder.spriteIndex], self.state.ball, fielder.x, fielder.y + danceOffset) if ballHeldByThisFielder then ballHeldBy = fielder end @@ -620,13 +620,13 @@ function Game:update() addDraw(runner.y, function() if runner == self.baserunning.batter then if self.state.batAngleDeg > 50 and self.state.batAngleDeg < 200 then - self.state.battingTeamSprites.back:draw(runner.x, runner.y - playerHeightOffset) + self.state.battingTeamSprites[runner.spriteIndex].back:draw(runner.x, runner.y - playerHeightOffset) else - self.state.battingTeamSprites.smiling:draw(runner.x, runner.y - playerHeightOffset) + self.state.battingTeamSprites[runner.spriteIndex].smiling:draw(runner.x, runner.y - playerHeightOffset) end else -- TODO? Change blip speed depending on runner speed? - self.state.runnerBlipper:draw(false, runner.x, runner.y - playerHeightOffset) + self.state.runnerBlipper:draw(false, runner.x, runner.y - playerHeightOffset, runner) end end) end @@ -644,13 +644,15 @@ function Game:update() end for _, runner in pairs(self.baserunning.outRunners) do - self.state.battingTeamSprites.frowning:draw(runner.x, runner.y - playerHeightOffset) + self.state.battingTeamSprites[runner.spriteIndex].frowning:draw(runner.x, runner.y - playerHeightOffset) end for _, runner in pairs(self.baserunning.scoredRunners) do - self.state.battingTeamSprites.smiling:draw(runner.x, runner.y - playerHeightOffset) + self.state.battingTeamSprites[runner.spriteIndex].smiling:draw(runner.x, runner.y - playerHeightOffset) end - throwMeter:drawNearFielder(ballHeldBy) + if self:userIsOn('defense') then + throwMeter:drawNearFielder(ballHeldBy) + end if not ballHeldBy then gfx.setLineWidth(2)