From b9d25e18d810b9b9eae83e7c5041a93acd98ea46 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Tue, 11 Feb 2025 08:32:51 -0500 Subject: [PATCH] New black away uniforms! Generate sprites from component images during load. Should make it easy to swap out logos at runtime. --- src/assets.lua | 25 ++++++-- src/baserunning.lua | 1 + src/draw/fielder.lua | 10 ++- src/draw/player.lua | 58 ++++++++++++++++++ src/fielding.lua | 6 +- src/graphics.lua | 15 +++-- src/images/game/BaseLogo.png | Bin 0 -> 589 bytes .../{PlayerLowHat.png => DarkPlayerBack.png} | Bin 4775 -> 4516 bytes src/images/game/DarkPlayerBase.png | Bin 0 -> 738 bytes src/images/game/FrownLogo.png | Bin 0 -> 593 bytes src/images/game/Hat.png | Bin 0 -> 592 bytes .../{PlayerBack.png => LightPlayerBack.png} | Bin .../game/{Player.png => LightPlayerBase.png} | Bin 4784 -> 4948 bytes src/images/game/PlayerFrown.png | Bin 4780 -> 601 bytes src/images/game/PlayerSmile.png | Bin 0 -> 603 bytes src/main.lua | 24 ++++++-- 16 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 src/draw/player.lua create mode 100644 src/images/game/BaseLogo.png rename src/images/game/{PlayerLowHat.png => DarkPlayerBack.png} (73%) create mode 100644 src/images/game/DarkPlayerBase.png create mode 100644 src/images/game/FrownLogo.png create mode 100644 src/images/game/Hat.png rename src/images/game/{PlayerBack.png => LightPlayerBack.png} (100%) rename src/images/game/{Player.png => LightPlayerBase.png} (80%) create mode 100644 src/images/game/PlayerSmile.png diff --git a/src/assets.lua b/src/assets.lua index 5789cd2..b921f7e 100644 --- a/src/assets.lua +++ b/src/assets.lua @@ -1,6 +1,9 @@ -- GENERATED FILE - DO NOT EDIT -- Instead, edit the source file directly: assets.lua2p. +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) +DarkPlayerBack = playdate.graphics.image.new("images/game/DarkPlayerBack.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) Glove = playdate.graphics.image.new("images/game/Glove.png") @@ -9,25 +12,37 @@ Glove = playdate.graphics.image.new("images/game/Glove.png") PlayerFrown = playdate.graphics.image.new("images/game/PlayerFrown.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) -PlayerBack = playdate.graphics.image.new("images/game/PlayerBack.png") ---selene: allow(unused_variable) ---selene: allow(unscoped_variables) -PlayerLowHat = playdate.graphics.image.new("images/game/PlayerLowHat.png") +BaseLogo = playdate.graphics.image.new("images/game/BaseLogo.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) GloveHoldingBall = playdate.graphics.image.new("images/game/GloveHoldingBall.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) +Hat = playdate.graphics.image.new("images/game/Hat.png") +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) +DarkPlayerBase = playdate.graphics.image.new("images/game/DarkPlayerBase.png") +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) MenuImage = playdate.graphics.image.new("images/game/MenuImage.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) -Player = playdate.graphics.image.new("images/game/Player.png") +PlayerSmile = playdate.graphics.image.new("images/game/PlayerSmile.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) Minimap = playdate.graphics.image.new("images/game/Minimap.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) +FrownLogo = playdate.graphics.image.new("images/game/FrownLogo.png") +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) GrassBackground = playdate.graphics.image.new("images/game/GrassBackground.png") +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) +LightPlayerBase = playdate.graphics.image.new("images/game/LightPlayerBase.png") +--selene: allow(unused_variable) +--selene: allow(unscoped_variables) +LightPlayerBack = playdate.graphics.image.new("images/game/LightPlayerBack.png") --selene: allow(unused_variable) --selene: allow(unscoped_variables) diff --git a/src/baserunning.lua b/src/baserunning.lua index 1626207..0897c73 100644 --- a/src/baserunning.lua +++ b/src/baserunning.lua @@ -129,6 +129,7 @@ end ---@return Runner function Baserunning:newRunner() local new = { + -- imageSet = math.random() < C.WokeMeter and FemmeSet or MascSet, -- TODO? lol. x = C.RightHandedBattersBox.x - 60, y = C.RightHandedBattersBox.y + 60, nextBase = C.RightHandedBattersBox, diff --git a/src/draw/fielder.lua b/src/draw/fielder.lua index e908d9f..39ff001 100644 --- a/src/draw/fielder.lua +++ b/src/draw/fielder.lua @@ -1,6 +1,3 @@ --- selene: allow(shadowing) -local gfx = playdate.graphics - local GloveSizeX, GloveSizeY = Glove:getSize() local GloveOffX, GloveOffY = GloveSizeX / 2, GloveSizeY / 2 @@ -10,7 +7,7 @@ local GloveOffX, GloveOffY = GloveSizeX / 2, GloveSizeY / 2 ---@return boolean isHoldingBall local function drawFielderGlove(ball, fielderX, fielderY) local distanceFromBall = utils.distanceBetweenZ(fielderX, fielderY, 0, ball.x, ball.y, ball.z) - local shoulderX, shoulderY = fielderX + 10, fielderY + 5 + local shoulderX, shoulderY = fielderX + 10, fielderY - 5 if distanceFromBall > 20 then Glove:draw(shoulderX, shoulderY) return false @@ -20,11 +17,12 @@ local function drawFielderGlove(ball, fielderX, fielderY) end end +---@param playerSprites SpriteCollection ---@param ball Point3d ---@param x number ---@param y number ---@return boolean isHoldingBall -function drawFielder(ball, x, y) - gfx.fillRect(x, y, 14, 25) +function drawFielder(playerSprites, ball, x, y) + playerSprites.smiling:draw(x, y - 20) return drawFielderGlove(ball, x, y) end diff --git a/src/draw/player.lua b/src/draw/player.lua new file mode 100644 index 0000000..4ded261 --- /dev/null +++ b/src/draw/player.lua @@ -0,0 +1,58 @@ +-- selene: allow(shadowing) +local gfx = playdate.graphics + +---@alias SpriteCollection { smiling: pd_image, lowHat: pd_image, frowning: pd_image, back: pd_image } + +---@param image pd_image +---@param drawInverted boolean +function maybeDrawInverted(image, x, y, drawInverted) + -- TODO: Bring logo up a pixel on the dark player base? + local drawMode = gfx.getImageDrawMode() + if drawInverted then + gfx.setImageDrawMode(gfx.kDrawModeInverted) + end + image:draw(x, y) + gfx.setImageDrawMode(drawMode) +end + +---@return SpriteCollection +---@param base pd_image +---@param isDark boolean +function buildCollection(base, back, logo, isDark) + 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) + + 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) + + local frowning = gfx.image.new(base:getSize()) + + gfx.lockFocus(frowning) + base:draw(0, 0) + maybeDrawInverted(logo, 3, 25, isDark) + Hat:draw(6, 0) + PlayerFrown:draw(5, 9) + + gfx.unlockFocus() + + return { + smiling = smiling, + lowHat = lowHat, + frowning = frowning, + back = back, + } +end + +--selene: allow(unscoped_variables) +AwayTeamSprites = buildCollection(DarkPlayerBase, DarkPlayerBack, BaseLogo, true) + +--selene: allow(unscoped_variables) +HomeTeamSprites = buildCollection(LightPlayerBase, LightPlayerBack, FrownLogo, false) diff --git a/src/fielding.lua b/src/fielding.lua index f199501..e11b6f7 100644 --- a/src/fielding.lua +++ b/src/fielding.lua @@ -156,12 +156,14 @@ function Fielding:celebrate() FielderDanceAnimator:reset(C.DanceBounceMs) end +---@param fielderSprites SpriteCollection ---@param ball Point3d ---@return boolean ballIsHeldByAFielder -function Fielding:drawFielders(ball) +function Fielding:drawFielders(fielderSprites, ball) local ballIsHeld = false + local danceOffset = FielderDanceAnimator:currentValue() for _, fielder in pairs(self.fielders) do - ballIsHeld = drawFielder(ball, fielder.x, fielder.y + FielderDanceAnimator:currentValue()) or ballIsHeld + ballIsHeld = drawFielder(fielderSprites, ball, fielder.x, fielder.y + danceOffset) or ballIsHeld end return ballIsHeld end diff --git a/src/graphics.lua b/src/graphics.lua index aa6e56f..9776473 100644 --- a/src/graphics.lua +++ b/src/graphics.lua @@ -25,20 +25,23 @@ 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, image1, image2) +function blipper.new(msInterval, smiling, lowHat) local blinker = playdate.graphics.animation.blinker.new(msInterval, msInterval, true) blinker:start() return { blinker = blinker, - image1 = image1, - image2 = image2, + smiling = smiling, + lowHat = lowHat, draw = function(self, disableBlipping, x, y) - local currentImage = (disableBlipping or self.blinker.on) and self.image2 or self.image1 - local offsetY = currentImage == PlayerLowHat and -1 or 0 + local currentImage = (disableBlipping or self.blinker.on) and self.lowHat or self.smiling + local offsetY = currentImage == lowHat and -1 or 0 currentImage:draw(x, y + offsetY) end, } end --selene: allow(unscoped_variables) -PlayerImageBlipper = blipper.new(100, Player, PlayerLowHat) +HomeTeamBlipper = blipper.new(100, HomeTeamSprites.smiling, HomeTeamSprites.lowHat) + +--selene: allow(unscoped_variables) +AwayTeamBlipper = blipper.new(100, AwayTeamSprites.smiling, AwayTeamSprites.lowHat) diff --git a/src/images/game/BaseLogo.png b/src/images/game/BaseLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..28d1cdcd9fe45bbc346882eb2eeb40104f1a9b42 GIT binary patch literal 589 zcmV-T0EX>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?_iK31u15Mp~e6J02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{001RPL_t&-(_>&jfd33s0RM?p^BGDb bF!&Du_^%D~d9i7T00000NkvXXu0mjfOLg$K literal 0 HcmV?d00001 diff --git a/src/images/game/PlayerLowHat.png b/src/images/game/DarkPlayerBack.png similarity index 73% rename from src/images/game/PlayerLowHat.png rename to src/images/game/DarkPlayerBack.png index 824caac3ac48584f39496c6bfa159b6e97358fab..a9c3ebee248a3336ce2b09e99b21bcbb83790e71 100644 GIT binary patch delta 541 zcmZ3kxp9PGV%@t=N2($(>0#E!Eh_(!w%T z*Eq!_N!P@}C`H#Y#lk{2B{elA+1Sj&G$m!SJ*%Q}ieaLOnOU-~g@qYVS(1^Vu4QUs zny#gVg?Vb4QKGq}naSj4R&^C4LsK)LNoGK!l1+6@j0}u*6I0Ssb(4(^EK>~(OjA<~ zk|&>IjpH^qH?y!XF|sf-F`sPCR>)--0(a>qHWg&<1GX*|V@uOS^E3-%T}u;#L|qdz z^EBN=Gc!}&B|o-e}OpIL8iUVLm&-Oa`GBCF5- z-Eo`IOlt44rxRJW)=2rz`DVL(uIB3}G8_^AH+*{4lKC@kvAOX+hQ$0Li+#+KE`z-8 M>FVdQ&MBb@02F)0`v3p{ delta 639 zcmZ3Yyj*p{FD?TGBV#KgLn{-L$t;YPEd5)aT5fh^oW#h)7rpr^lRJ}gvXN1WnUSfX zZlbY4lCDXzp|P%|g;}z$aZ;+e2~fz?$au0ntD>@{xp}HlVv24`vWbPRiLnt-S(-tz zu7#ncak8;_s%2`T@#JP!brnMcQv-9uR0CZjv$Ry8d8SFa7G^;6Ow%lr%}o-`&CHVw zC!b@D<2ErjH!v|burxL?o@~xm$Yl@$cj+cJ6=d!Mwl0;lRC9~OB;zDqQ-j20p#5ek zx|WG4Kv$=xq!}j~q*$b+m`v_t_YyX+3^6pdGBU9Oy3oMX%D_NLe=-Mql8S*rT9SpC zWs0tmi9wpKNm_EEuBBzNk*i` zGE9?~$#Lp%GfjGJ^)|p^y7D#?h8KrC{FgMPZ^#hxv5gK2ykT^_LpV_T6GNKw&%2X! zeO;w^<)=+N5OMy;_2+$UFMRLD9b2GxSWtC+63Z2zR`xrWJQugw9yc*oUh`YgM9W?F zgtz{I`ZISzny)jiTBM)gyV3mXlDKJiuN|FI6RLdaaYU{_T9|A_&{Csw4>~lH;;ap& zkDR`6^^(z>TMU*?EK(16+8nBTvI`>eysgi#3iRHVnix5$OT_fkKE3C*|LY$VH)fvi zYVF#;+g^j0`8(Iy#u~?}_YZz4iu^hK==;@=?1Aa)4R`PtO`iY^B?eDdKbLh*2~7Yj C3*f{6 diff --git a/src/images/game/DarkPlayerBase.png b/src/images/game/DarkPlayerBase.png new file mode 100644 index 0000000000000000000000000000000000000000..c661f956d84a821ec04153f3ce324bc28411571d GIT binary patch literal 738 zcmV<80v-K{P)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?_iK39yUV1XQ==H02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006p4L_t(o!|hkm4uBvC>|Fo<%hyAjD>4L=wi>*pb)3LK zE=yXPG>B&^doC-J2vU$bv8o#+ea8l_OHTkb2PGA;c?7jRg)ku=A>jAs2C%JbBBSSV^$%$Rvc=eLrU?5u0y z$$K{xGbEj(DS`h0y!KjSPYgHj?{^T3oB^Da*ZXF5_5n2RgX1yw{(b>)kAE}c4MB%g UK!?L{1^@s607*qoM6N<$f(B4HHvj+t literal 0 HcmV?d00001 diff --git a/src/images/game/FrownLogo.png b/src/images/game/FrownLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e86fd9ccaeae5ac7cd89ce1794b0e32fd92d0d85 GIT binary patch literal 593 zcmV-X0EX>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?_iK3DlupA0sQ~~02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{001dTL_t&-(_>&jfd6PTK0u0E{D2XUNsI(+$1C`s2EX>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?_iK32rE4yzNY{H02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{001aSL_t&-(_>`71pm?aj0|`HBOZ+m#2CcHKp|ix!e+cK eA;$pfdI13MZv+T_ku|>n0000h3uJ literal 0 HcmV?d00001 diff --git a/src/images/game/PlayerBack.png b/src/images/game/LightPlayerBack.png similarity index 100% rename from src/images/game/PlayerBack.png rename to src/images/game/LightPlayerBack.png diff --git a/src/images/game/Player.png b/src/images/game/LightPlayerBase.png similarity index 80% rename from src/images/game/Player.png rename to src/images/game/LightPlayerBase.png index 22db89b1a0f35c06de5e0fa08b96e7893055db7c..a36931ffbefdb3a1d99b46c278de66a919d0177b 100644 GIT binary patch delta 445 zcmdm>dPQx*FD^p`12ZdAODiLj$t;YPEN+(`DsFaUoW#h)Z@2j>Qx}s;lCgQJiCMCd zu92B}ny!hVrGajuxv`mUnt_>7nt^3vVrpXYLE>(H!1jf4@<;X<6-$#uqclq+L){b;OA}oaQzJ9oB%qPHW`@QVrm058iHVk` zlM6Y#5t>amALGd55EERxkC}mifi20~-33Sk!B6Mi^^?5>71_D1C0Q=bnKZdbP`#ev zkf)1dNW|f{;TQQD6gYgI|NsB#>k@CKDMH(&_H4Nzn=ZRt&fSHj*X7>Ao|#JeN*qqB zlCQEc+?Y1^lI>Tv0PP8T>*C^$PD}b>%=dud9>i%3gXWzjaOLA9!HtEf> zEEi6)&Odtd(3-Bu)FXUC2Yxq9mVRus>1d$47w_RX(IrgRWmC5B|C&AFV_e7omp@qM Wxu$rs?zjI7@};M%pUXO@geCwn3Z(7; delta 453 zcmcbjwn25mFD?TGBV#KgBP#==$t;YPEJBVf*ETycPGV%@i{5;dsf$S^CDqtC*&x|c z*Tf>(OxGkWB}LcL*gQ!$H7O;{*vQZzDb3tqax?2nZWD8JBV$ubQ*&dB$>wZ@Tm~U< zlQ*%cAaOT8VEe+jc{^tUhuF(m%*hN43~Wi>?k)`fL2$v|<&!7t3MsO)h%sL}R$(CE0TRk=3-2yis&)%~Itf(=65X1!K1>HT+%h=l*SN-niL&?L?vyt{B%< zy}haJwlw;*#FNxtZn{}B7)zISG*p}AetU4j@a{{&xcV9n(=U;czG6td z$a%v^rqnj``u8$@gZ8*pu5L23Sr46A*4z=I_L#44hSIZJozV(`Z3`z&yMB#*g0jm4 zraK1(UUY0^YkwIQRTOTp-5#sUk+W_6SXs}yEv;Jj&Ljk=J!cQ+ z)c=^Am-pU%_x|2}zkA<>$xDR=xk-r=5-|)*vgKtLLH{r`GT}b>zA$OtUocED7M0pu zHros=0c4{=FalFV^%T)D33H_)4vT|+E3{;V5=()8JG2y#OZrlqpcpCl`(XS?bleQ% zC!#u%Jqfl+(6>ONU_2K36VQb9k$pdhvGgR!A4>qSB68v(L3HD}HhUpXxZss$qwe?TMyAx8g4xHJy z=H%W*XZ|q7R#i22!RX}WPZdvEu(P__pE}~$0}qCd**dKGw-(KJKh%A!D)YkmrJo;; zTbuKuP>d(LTRe?*qsZTurCOREJhL8Ky}f=1I&CXT+|_+$^33-yw1r>&=H1NPBfmNL zv#v2Ob)VLHE+$>PWIxyS-kgc-w0YBJrcE|pTHX4}f|B{S{`T%y%|~@pU5}gROq}xY z#)YqoxpTi>**>ZKtCL&opVi;eznG;6 zXYTQxQmi>Rt7rcHgI~`qcy#6c)%7ikaGF&m2D{eo zw;;EWwqO< zo5dGExL&PSYYA&usG(Fd6Y-3I)5R2J=R_f3W>&dH(a&f!p-@O2(y4uc3Jpoqv_?y5 zD2f0LB3SDc*)ZV^PL&`c7}+Su2L!(;_`JA;$#TAG(X3LzI^O4>$8WdC;Jv{p3&4ja z%=$H?TC4GRGy^SyqO}GCVWUWD7aq2(_Cm*x-R|hKP<2ZQ@ zsze@84Z^PEpe?0)8MBZms1Q7U*$T)Wq$vunezFGnCauWF8R!U@$8ZN}_nlo<1}(dt z$@cNpl6$snvr5{Zar$_{$;d;Fr_+&BZz4<_eCatoN6?%J5hSJ6(Ry7vN>678K-s)O zk@fOOf&y^0062P+A>Cy#@Py8&(-Zo1mIMeLO^|w{o+CMf(WP?^fS3~yAS>C*fnG^a zPJlv2BcexGdaG1hlOwo9<~B${N4(AK_Z-) zU1&3_D7CgS#)DG?Ju=HW_KMU#S=cf{=+4 zrd(m=6)7wX90rJGr91@ySq^7mad zh58+FUxKsyoPw+N|7lB?2hRX~2zj0m6n%kOSroZZb5T`f7MWHG@>Rld`BE?}A2~vh ztwE7s0aj#*ceCCK1l1#&u6=UhM^eGaQXH)}I0>ZV(jkbXp5Q3fMX;pPfOJNVgjADR zh@l64E-}Og(CiA}5x9c%l>d(5Pso9qK3F^CMp6`jFhWZaTG~Mx7~o6~W0^3`y+2|) z%jrlbq&Lesc|uQfknOzQNTiz(W#DKYar#Ie{3J&twLi>>=n*qCQd#T^YKG>nutyXI z)KQ=&B7^!2nEctvHy(`dEp6^p^GGiq*j+y>l&ne~2THeX*|Qy`$N#nMT*_KJ zVcnYRw-@a=+|1VR$+16uW#QUKkL0=it?@}8mea?T+Sa3c+(*|H)m2aH-Qg$<@a?G| zZ)digP5I|Xqp`Q9E3c0Ec4>QYOYJ)?%gByRKX2;2+|m5Zrp9Y@Th=eHJ=xiC;ps6~ z?KhVBQ!jt}*Me8xRIWOErXzB>G6`3qz6zaRHe&nMU8OL`iL U>t`L1em}x&)`ILevdUNg58nxCD*ylh diff --git a/src/images/game/PlayerSmile.png b/src/images/game/PlayerSmile.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e9f8243d37fd18f03a8ab28405171386a12cfc GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/src/main.lua b/src/main.lua index 6abced1..89e5eb2 100644 --- a/src/main.lua +++ b/src/main.lua @@ -23,6 +23,7 @@ import 'CoreLibs/ui.lua' import 'utils.lua' import 'constants.lua' import 'assets.lua' +import 'draw/player.lua' import 'draw/overlay.lua' import 'draw/fielder.lua' @@ -64,6 +65,9 @@ local teams = { local UserTeam = teams.away local battingTeam = teams.away +local battingTeamSprites = AwayTeamSprites +local fieldingTeamSprites = HomeTeamSprites +local runnerBlipper = battingTeam == teams.away and AwayTeamBlipper or HomeTeamBlipper local inning = 1 local offenseState = C.Offense.batting @@ -174,6 +178,15 @@ local function nextHalfInning() -- Delay to keep end-of-inning on the scoreboard for a few seconds playdate.timer.new(3000, function() battingTeam = currentlyFieldingTeam + if battingTeam == teams.home then + battingTeamSprites = HomeTeamSprites + runnerBlipper = HomeTeamBlipper + fieldingTeamSprites = AwayTeamSprites + else + battingTeamSprites = AwayTeamSprites + fieldingTeamSprites = HomeTeamSprites + runnerBlipper = AwayTeamBlipper + end if gameOver then announcer:say("AND THAT'S THE BALL GAME!") else @@ -279,6 +292,7 @@ local function updateBatting(batDeg, batSpeed) pitchTracker:reset() local hitBallScaler = gfx.animator.new(2000, 9 + (mult * mult * 0.5), C.SmallestBallRadius, utils.easingHill) launchBall(ballDestX, ballDestY, playdate.easingFunctions.outQuint, 2000, nil, hitBallScaler) + -- TODO? A dramatic eye-level view on a home-run could be sick. if utils.isFoulBall(ballDestX, ballDestY) then announcer:say("Foul ball!") @@ -451,7 +465,7 @@ function playdate.update() GrassBackground:draw(-400, -240) - local ballIsHeld = fielding:drawFielders(ball) + local ballIsHeld = fielding:drawFielders(fieldingTeamSprites, ball) if offenseState == C.Offense.batting then gfx.setLineWidth(5) @@ -463,18 +477,18 @@ function playdate.update() for _, runner in pairs(baserunning.runners) do if runner == baserunning.batter then if batAngleDeg > 50 and batAngleDeg < 200 then - PlayerBack:draw(runner.x, runner.y - playerHeightOffset) + battingTeamSprites.back:draw(runner.x, runner.y - playerHeightOffset) else - Player:draw(runner.x, runner.y - playerHeightOffset) + battingTeamSprites.smiling:draw(runner.x, runner.y - playerHeightOffset) end else -- TODO? Change blip speed depending on runner speed? - PlayerImageBlipper:draw(false, runner.x, runner.y - playerHeightOffset) + runnerBlipper:draw(false, runner.x, runner.y - playerHeightOffset) end end for _, runner in pairs(baserunning.outRunners) do - PlayerFrown:draw(runner.x, runner.y - playerHeightOffset) + battingTeamSprites.frowning:draw(runner.x, runner.y - playerHeightOffset) end if not ballIsHeld then