From a801b64f557b5ebbeab155d86e970b34a8144daa Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Wed, 12 Feb 2025 17:18:18 -0500 Subject: [PATCH] Fielders can catch passing balls. Implemented with a new catchEligible field. Should be easy enough to add some erroring to those catches, too. Allow npc to control individual baserunners. Add a bit more dirt to the infield. This commit *does* introduce some entanglement between files. E.g. the markIneligible() calls, and overriding ball.heldBy from within Fielding --- src/ball.lua | 35 ++++++++++++---- src/baserunning.lua | 15 +++++-- src/constants.lua | 1 + src/fielding.lua | 63 +++++++++++++++++++--------- src/images/game/GrassBackground.png | Bin 31305 -> 34391 bytes src/main.lua | 21 ++++------ src/npc.lua | 24 ++++++----- 7 files changed, 104 insertions(+), 55 deletions(-) diff --git a/src/ball.lua b/src/ball.lua index 3fef096..9b7016c 100644 --- a/src/ball.lua +++ b/src/ball.lua @@ -1,6 +1,5 @@ -- selene: allow(unscoped_variables) ---@class Ball ----@field private animator pd_animator_lib ---@field x number ---@field y number ---@field z number @@ -10,13 +9,15 @@ ---@field yAnimator SimpleAnimator ---@field sizeAnimator SimpleAnimator ---@field floatAnimator SimpleAnimator +---@field private animatorLib pd_animator_lib +---@field private flyTimeMs number Ball = {} ----@param animator pd_animator_lib +---@param animatorLib pd_animator_lib ---@return Ball -function Ball.new(animator) +function Ball.new(animatorLib) return setmetatable({ - animator = animator, + animatorLib = animatorLib, x = C.Center.x --[[@as number]], y = C.Center.y --[[@as number]], z = 0, @@ -29,10 +30,26 @@ function Ball.new(animator) -- TODO? Replace these with a ballAnimatorZ? -- ...that might lose some of the magic of both. Compromise available? idk sizeAnimator = utils.staticAnimator(C.SmallestBallRadius), - floatAnimator = animator.new(2000, -60, 0, utils.easingHill), + floatAnimator = animatorLib.new(2000, -60, 0, utils.easingHill), }, { __index = Ball }) end +function Ball:updatePosition() + if self.heldBy then + self.x = self.heldBy.x + self.y = self.heldBy.y + self.z = C.GloveZ + self.size = C.SmallestBallRadius + else + self.x = self.xAnimator:currentValue() + local z = self.floatAnimator:currentValue() + -- TODO: This `+ z` is more graphics logic than physics logic + self.y = self.yAnimator:currentValue() + z + self.z = z + self.size = self.sizeAnimator:currentValue() + end +end + --- Launches the ball from its current position to the given destination. ---@param destX number ---@param destY number @@ -47,14 +64,16 @@ function Ball:launch(destX, destY, easingFunc, flyTimeMs, floaty, customBallScal flyTimeMs = utils.distanceBetween(self.x, self.y, destX, destY) * C.DefaultLaunchPower end + self.flyTimeMs = flyTimeMs + if customBallScaler then self.sizeAnimator = customBallScaler else -- TODO? Scale based on distance? - self.sizeAnimator = self.animator.new(flyTimeMs, 9, C.SmallestBallRadius, utils.easingHill) + self.sizeAnimator = self.animatorLib.new(flyTimeMs, 9, C.SmallestBallRadius, utils.easingHill) end - self.yAnimator = self.animator.new(flyTimeMs, self.y, destY, easingFunc) - self.xAnimator = self.animator.new(flyTimeMs, self.x, destX, easingFunc) + self.yAnimator = self.animatorLib.new(flyTimeMs, self.y, destY, easingFunc) + self.xAnimator = self.animatorLib.new(flyTimeMs, self.x, destX, easingFunc) if floaty then self.floatAnimator:reset(flyTimeMs) end diff --git a/src/baserunning.lua b/src/baserunning.lua index 18f95a5..d36e019 100644 --- a/src/baserunning.lua +++ b/src/baserunning.lua @@ -181,8 +181,10 @@ function Baserunning:updateRunner(runner, runnerIndex, appliedSpeed, deltaSecond -- TODO: Do a better job drifting runners toward their bases when appliedSpeed is low/zero if distance < 2 then - runner.prevBase = runner.nextBase - runner.nextBase = C.NextBaseMap[runner.nextBase] + if runner.prevBase ~= nearestBase then + runner.prevBase = runner.nextBase + runner.nextBase = C.NextBaseMap[runner.nextBase] + end runner.forcedTo = nil return false, false end @@ -214,16 +216,21 @@ end --- Update non-batter runners. --- Returns true only if at least one of the given runners moved during this update ----@param appliedSpeed number +---@param appliedSpeed number | fun(runner: Runner): number ---@return boolean someRunnerMoved, number runnersScored function Baserunning:updateNonBatterRunners(appliedSpeed, forcedOnly, deltaSeconds) local someRunnerMoved = false local runnersScored = 0 + local speedIsFunction = type(appliedSpeed) == "function" -- TODO: Filter for the runner closest to the currently-held direction button for runnerIndex, runner in ipairs(self.runners) do if runner ~= self.batter and (not forcedOnly or runner.forcedTo) then - local thisRunnerMoved, thisRunnerScored = self:updateRunner(runner, runnerIndex, appliedSpeed, deltaSeconds) + local speed = appliedSpeed + if speedIsFunction then + speed = appliedSpeed(runner) + end + local thisRunnerMoved, thisRunnerScored = self:updateRunner(runner, runnerIndex, speed, deltaSeconds) someRunnerMoved = someRunnerMoved or thisRunnerMoved if thisRunnerScored then runnersScored = runnersScored + 1 diff --git a/src/constants.lua b/src/constants.lua index 1981be9..d658e7c 100644 --- a/src/constants.lua +++ b/src/constants.lua @@ -86,6 +86,7 @@ C.BaseHitbox = 10 C.BattingPower = 25 C.BatterHandPos = utils.xy(25, 15) +C.GloveZ = 0 -- 10 C.SmallestBallRadius = 6 diff --git a/src/fielding.lua b/src/fielding.lua index 353e5ac..9746b97 100644 --- a/src/fielding.lua +++ b/src/fielding.lua @@ -1,16 +1,16 @@ ---- @alias Fielder { ---- x: number, ---- y: number, ---- target: XyPair | nil, ---- speed: number, ---- } +--- @class Fielder { +--- @field catchEligible boolean +--- @field x number +--- @field y number +--- @field target XyPair | nil +--- @field speed number -- TODO: Run down baserunners in a pickle. -- selene: allow(unscoped_variables) ---@class Fielding ---@field fielders table ----@field fielderTouchingBall Fielder | nil +---@field fielderHoldingBall Fielder | nil Fielding = {} local FielderDanceAnimator = playdate.graphics.animator.new(1, 10, 0, utils.easingHill) @@ -23,6 +23,7 @@ local function newFielder(name, speed) return { name = name, speed = speed * C.FielderRunMult, + catchEligible = true, } end @@ -40,7 +41,7 @@ function Fielding.new() right = newFielder("Right", 50), }, ---@type Fielder | nil - fielderTouchingBall = nil, + fielderHoldingBall = nil, }, { __index = Fielding }) end @@ -79,7 +80,7 @@ end ---@param deltaSeconds number ---@param fielder Fielder ---@param ballPos XyPair ----@return boolean isTouchingBall +---@return boolean inCatchingRange local function updateFielderPosition(deltaSeconds, fielder, ballPos) if fielder.target ~= nil then if not utils.moveAtSpeed(fielder, fielder.speed * deltaSeconds, fielder.target) then @@ -108,40 +109,62 @@ function Fielding:haveSomeoneChase(ballDestX, ballDestY) end end ----@param ball XyPair +---@param ball Ball ---@param deltaSeconds number ----@return Fielder | nil fielderTouchingBall nil if no fielder is currently touching the ball +---@return Fielder | nil fielderHoldingBall nil if no fielder is currently touching the ball function Fielding:updateFielderPositions(ball, deltaSeconds) - local fielderTouchingBall = nil + local fielderHoldingBall = nil for _, fielder in pairs(self.fielders) do - local isTouchingBall = updateFielderPosition(deltaSeconds, fielder, ball) - if isTouchingBall then - fielderTouchingBall = fielder + local inCatchingRange = updateFielderPosition(deltaSeconds, fielder, ball) + if inCatchingRange and fielder.catchEligible then + -- TODO: Base this catch on fielder skill? + fielderHoldingBall = fielder + ball.heldBy = fielder -- How much havoc will this wreak? end end -- TODO: The need is growing for a distinction between touching the ball and holding the ball. -- Or, at least, fielders need to start *stopping* the ball when they make contact with it. -- Right now, a line-drive *through* first will be counted as an out. - self.fielderTouchingBall = fielderTouchingBall - return fielderTouchingBall + self.fielderHoldingBall = fielderHoldingBall + return fielderHoldingBall +end + +---@param fielder Fielder +function Fielding.markIneligible(fielder) + fielder.catchEligible = false + playdate.timer.new(500, function() + fielder.catchEligible = true + end) +end + +function Fielding:markAllIneligible() + for _, fielder in pairs(self.fielders) do + fielder.catchEligible = false + end + playdate.timer.new(750, function() + for _, fielder in pairs(self.fielders) do + fielder.catchEligible = true + end + end) end -- TODO? Start moving target fielders close sooner? ----@param field table +---@param field Fielding ---@param targetBase Base ---@param launchBall LaunchBall ---@param throwFlyMs number ---@return ActionResult local function userThrowToImpl(field, targetBase, launchBall, throwFlyMs) - if field.fielderTouchingBall == nil then + if field.fielderHoldingBall == nil then return ActionResult.NeedsMoreTime end local closestFielder = utils.getNearestOf(field.fielders, targetBase.x, targetBase.y, function(fielder) - return fielder ~= field.fielderTouchingBall -- presumably, this is who will be doing the throwing + return fielder ~= field.fielderHoldingBall -- presumably, this is who will be doing the throwing end) closestFielder.target = targetBase launchBall(targetBase.x, targetBase.y, playdate.easingFunctions.linear, throwFlyMs) + Fielding.markIneligible(field.fielderHoldingBall) return ActionResult.Succeeded end diff --git a/src/images/game/GrassBackground.png b/src/images/game/GrassBackground.png index 7b45da22e413d274ba23aeec0dc7a4c03f4f6c10..a33353f0139c4edcfa0f94997f1f7354c2830be4 100644 GIT binary patch delta 30336 zcmYhi3p|tm`v;6vlMY4{5jofRmZThFk|8Ro%wbB7)6kOhVeSqpXQ>ck4hhYiN5V)# z!jQ9AA#+}gF`MnV_4_~1>+yP}d$;>@-PiTL&e!L&Z>#)+u>vnx!WyULG|uXtIjyUy z{YsEu2lzehO6TL_kGOmB;Z}!Dd`m5uQH40`$@!xO zR^2aPG}8~RRAaLk`guFjA_VA+h$S4 z$ZOXwN&@0Tkv$(?IUl>i7COKyolj}YdqLQ162J3i_Jx40U%=m56ycOkkNF;zhrePb z!(s)pZ)Mp9zNNdg-p%CWqJNpwHwgRgOut$UF^xIOzhkuVtH0?D=ELtYcV@o5xH6o? zIrG$rKM06CJ&S%_T zJ>FTcS5xP#mX?mDwvNVWjaO%P-3L{D^Z!$I*)E0u|K|$ou2ue5e|I}5x@o#OY3OKc zt81Te(^Nm>ta(b^>9mf!x`y*97p*g{r%pLLYrMJ-G5`Oq)~Wakxd##a46_?}bq;zO zvRC|sip1Jjg>PJtUwHc#HzoD)jpR_JSpG=JzdMcd$DvO!5gC__hT20_ z;`u$8S9n1p+mB+eMD7x{v07rqnR!2Y&h`|L0B=6DQMw?6AgC^`n7r#S6ai!rjRN59 zztL0A?~8w0q(*Xg-Q0lw@6lG}^G}qi}=!f(d>c#Vl5*M3%E`n4q2nk-}`@0&P;`n@7uIl0n`AVa}9cMv7 zeZIeaL9W$2Zk?$wAT-7246kIs)A&wV@nH|_F>iSzD9E?6;T67#!+qAI$TT220=e8R zg5%C74|gga=>FSv=_n&pOhcG&r3DdoTFyQBhJMh|(x)PAl3Ddm<^1Jwrjz`9%#B}d z+;z6z8(1Z5RlU+_r^E|Yv&r+1*7}ONME~+NroD+wcv|MP7x;w(q2`x*Xym0O_^@8X z$^_V?Q{kvL5?z$W84ZF2QW|1w_)9J>SMY)0_hvOd5wT-PJpbSG5Zi}x`wUg6E>-S? z?B)H2msgA5v|;wknR=nck>FnqU&zH>6wDM~eI1YUui%S(-fZkazql!kWa@8upA=Lx ze6j0}e3cX+@bHb9j9TMI1pMEj z_jL-$9SyNLvi!$)Q{o}bs8K-T@_T`Ud|Kb$ezN1sln`FF`Q!aQ?qQHdnzgNl+#P(2kaZh z7H6AM7M~2sB+NcxAG^c9L*>dh`G>=wZ^Sv4_lrEVRdv_HDK|HGSHX0uCWKpN@gFqU zcfV-c3iAuk_}zPpEJklk)AD38pZDAG(O z|GnANutPvjB6=7}mA_$0%*gdjKt8~67uZxSN{|gzAmHmYr3O#&0Rs@%zjv;@6v{d$ zLKw!hQTUv*J<6^PROx!=>s^>z!Y1DiU0H!dIy&ub5$L)@}C+)G*!l&%HRcjMgNPlYQlVoihDtG5X zqx*`$-|{Sia%r`$a1d77^=I|hIAYE>H4TDkfz&c9u-6eqgUt<{x}ACG&>B;c0vHIY zK@3E%7)UFGsLWKWrv^;<)RZW=^H0b{1vxGRRXZ1IP0!abXJ~|{MZkEHhw0TiV+&zpc3SGp^yG$)d1$leJ zeuqG8f4zIW+p7=9R~u$oC~JLASY&s7S*Q8aw*-8NNJW5YQSOEFw1V3?eVe0efA&m?XPz(S+ohpyZDgp7KhLU+uDf}BLg)r z*(erkj(%jBO;PIwnAEF&2OZ&$WUoA2_-y(O`B`PB_gjUBZTt>}l&v+YQn<9C<6h&s z6WD5cl7>x`-z<&F8U_O#&#{n)PF0IEhZ z(KooNtMemsQLD*4LpM0^!{j;--4%S$4}SpQ7k+$}&urmP1*<{TVxeMpo5+sY132$$ zMjv_XG2&phd-WUf>^JN#GSs?FPp@W~T^q)$4qlZJDV6isar>D#E^XuO!5h-iatk*)R&p`L0T5|FsQ>*z?Ng5clt$PFz( z-fsV+={Vf$`=pcMmHu4=HL6Bk?PTaOyJUm>p!%ms=?mpIS~L87i8~`9zDk*_z0HP; z6xY^h7>eeV;khWQ_q7Ou+Kt9h`w2M<0dGK8`@Q4Bg(IestjTWe9S=HoSmGJSxRU+& z_z`+h)zw9cC#|bOegIvy6i)xJu?F-9YO{~vdH>ygjt$LQ^bNqxZlzRBW^7R?o|)LY zo$oc-fs~KytN|vzf;P?wv)JsnW5ZeDy{|zM zTCn0J!TfPrqTBp9$|hoQlS~~nxeZ-^ChpYsH9@&?E^G3{-wprMZ-wM8v;&zD0zt_X zhqVJ;ldUfguXL?fEB?+KJWBky!C4>M>g0y4uFLo@b}@&SaSbJ7WAL2SxEU&7T&KQ& z@%h82e=qD-oZ#a#tn*EgOIG|)D;RUx=<7n&i2Br`gsuWJ;nu{h&JCGmoeRgo@P2up zw)x}zP2vwz|7!64y-Xd4O)UVoaTWFjk)=u<7v^qujyt zbV|A@$yi#aRh^Gd(z#7CYT@!{`HAS<4CjIB`_A(YMclGbrI9&WgTgL}!0L;QP32h^ zal64h-PiI0@8fDIUyCX&^0E#FvSJc$b&o6vYVE-CXq=s&U(%(mxXnZx%MzMYHzPn68DB;A-A>C>& z+r8kC1QBZ-#GRnqauSpcDR*8PFJ5xc(LLXpQbd*|3rn`dghy95zien&pU0Po_GD5} z(@~i>nB<+gdg&DnykX9{Nj9^RUCbQrKbI56%jE)Px!clFgZrZoTm3f(ns4XlT@TOa zbpD{%u7|GN|A|K(|P`9Y*q9K9Jv;^*U0^(UPMK{ zVPjM29hYXR)_tL~OJdN?osMT3GDsS+&uMYbJz&N022|3>494H0&lnegLZEyO7GjO* zfGlhT^JiT}`Ol+=NN&|adWgwSiM6Wj?yg}J+r1yeOB2g(G~a{<|%!gx4* zGozQcRKr~2h8XaqC+okSMIldC0=qmKT)KvKJmfKB^2%JNoX4=b{>7`|?$!OpblE?z z>piHvnPD)HK=L0%uT2;=%7^{jb%Y=qb~P7%E%wCFYlsYNXPUUtm2apnderL7m5z8m z`3G`Zo9v@&uSS;J9M@FT`7*^V##zq!T{`~%Jzy^^9O)tRx@^yU0N$kT24a$yj@=PD zyZ_bSu_uFk#li9v(MmFU%bwYRMFJ0T{+Q--8wfr5xa$u^;X2OLcD0=s?XFPT@y%Wi=!NHleLy zB_mjrvPU*C0=8pAd%4~-mxA7~Tll2tq3hd+K1+VJL7Dg5lN&w?ujSFHI-huiOVez2 z28nVDAl$|0hMw@o)A32;ynaUgW;(h7=rho#tao(v41AM1MgZR9;y11DvZZBk;gwB^ zSv!9boBA^VviZT1Jra~OAYs4ounw;)y2PADwOh7cV@-X-|GQ|fz`&EQ2^~58z^i$uwW8N3QjTlCV&bI&+a4s; z({N$th@_>G?k3sv`O&`3b(LKwG5UOEEzQy5AcKV(et{@2k^0RMa5sCxf-hdyRh`JVtAZVWHt;hNm?WK`7U04Tvd?`OQYPOZvU4BLN&5p9W_=!O{iuR%l4v@+?hl)%7_$Fcbh zk0`3n{R36)pK@ILNKk4}eenESDWy;{_B)XLW$)wUM$ex=cXz}e4`dJaGwA8nU5K~_ z`8^U?A~d-WaJ5fW`fu*ZLviiKAPkOR^(d_Jv*V4|Ti;;jA#baQzRQ?9g;wPy*h*yu zqzAwDim;N#zz-TV5=K@KlF%DfG4hho;RaQ74=aec=_hudDDs8aMhV2~ElnTThJbFj;EfY{~4aGa^<;c}l2RDYgw2v_; zS7p;L6}%Zn+7L3wb$RX!vU+6DSBJ#0mykp>M98|-KepN(3 zq6s2rOgIaL8Qpnj3C16Dr2+oMHc=JCZO!2dt@FbTJL zhiBYGmT{Ar4t5vB_M4!{+XFK_@$cM8*2LVh9L0Nbl6SBB&BaM6Kdg(l4fafuvt ze|$AFs5a`bk%JRV1=t|RrXN?n5`$&pAIXqY+&Z??1x0(P#U#uYqHab)(IMUBS6u!mT>z9S<03(<*%%l4}xWOsIdB zEN% z-28VV0g2ypJ%Ic`49itzIk(bn<9gPeqGPGP3UY!}7L zx?cWzIUgUbGN|lfGy2CI)4jl{>+f0L^+T_L*G>-&SOmtlQn>Y!ixst4n_cH{Vu*-8^v-jqYe0iC-N^KhMp(HfNOQ4xs$n2X7wHQ1FPaQt#--4&s zzQZj60%aAUH6dj5qVMY2qDq|kCe6C^fr?jBCFNGu03(dPR9}fR(Wh$a1}$QK~C(#qo49;{bJV^uZfgaWDg3JNdF#+=j%h>DyiJ&DCE?P+#sZU(}GO zhm-3W^qGwh{@g_zS%F4{F88nN;21jp&q553TO_y{85L9at|CBkX zW-9LH95dZkB06m5Enc{*r9gLQL>JdHx8E$$V+}{WzC3>wqQ}liHM-SF3tW%gkS1zN zLh)|^T4%%UGig9)!~DnzOkDTKMM4NIsyf4&hYGg)|8LJ?jSy3-C(~zqLb7`fT6{iTmbm@M(T@y97lAibTveDZHmWCJAw-b zIisWSnSFvq2b-*4@6TY_;r5%wler_8qautga>TXXDEpa%a)Qs&HEC2xKEg3W?vo2* zW2t->cn@2}TK`abzW&j}ezj*s1z2nOrn+0rABL5OCeA2W`so2F(&$lz|NeosDKIPP zjrhm-$~FgV_VBDrCkR)vXJ^B*W&K#qp83Le5~Try)xCvtchE<%YIn@RjbE* zM(D6(mO0`StO%$%rNJ}+{{s%mpr->u89qS$}KHlr%KH?^>%;HS=htOYuA^%WTF09uLV_-hnVu$=3V? znvgy@xjR)8>Ntk{KVoal8$tm7zpOlw(wxESxy74U(PB(9L4qdkofGpS0-ZWD{?-Gk zE0mEdfH0zMf;x@Gn=Nq2lAF7;eX*jq%VlD^Sxc;QpRQe;DH3a1zQzwj;Rv^(Fwgv@ zs4v@-t@#{?Q?aA5c(vLsm$<7U|7rftsz&wgO0I>KjL?c^rW3cuX+Y>1uK8%b z`*;lopX+mT#6SzEonpnWP;xV|CBV_OFjE$7fTq_D$B$8>S?iebmK7&#_O{Isz83!t8 z)R!OK{%}H7BswzzfbOjHbW~REPJIp8`pT(87e1b-p%KvHHMZl?NotAX5QP1=@=dm> z9si+4wk+;wAu;DwSz$J`fha9PV#Jp5;4z~eFEj49a@aE|FUAgY*kVqiw-{n?Cr zc|%22@_y4|x`DB|dr_XJyBcyAO(jixZdVR(n$Hxm-gZmoV~vl(d!BYdTqVlF-OqKT z&!Z4@TP>7Mg`z!HU1DfL)uzh2a=Z4DTy=E-jqK;E^R6?pSa2c~mm9hKt;^?ip2_rF z)%D4fRY14om8>YmDa4xuNJcB=4}+W2-_+i5klzAF7?L6UQT(hHHE@rXq?H&120J%r z1;1$zStA<$#bji6>h}ii4#jEh_A{WIN#Ys2VDIGRiceq`Dm$PVHRqCB6cEymY{~`; ztrPcJKd86=*E3hkBR9eLgzyj3IRr14eFi01!uv2Pka+d_%1 zdVpd0JCbrL)E%35fzWBCj6eRP5M6Fj`9Rse2Yglq3{NaI-ly%f7aX5L)d9mzL|5|R z^lr%to`~-E&BeK@ZPu!+y~AoAs}wbD&Mv-WGKfN1U=eHOgCfGemjsZhj}$~#q4I@#d(RALTo~fi+X9N=Z4KH z=St$pegT1?kAfaIFT0&HE32+6ELd*PEoWj=BJ|d*<4VDB3FdK2yPg^gbX(P)`TXfe zBE{T@1qVPKF>G4@IcA|vM)t@_!`Q=+db^oQ|M>1<#+DE$&PxgyzBf&hH@wj(owfeL zlHmvtr8SyWl{Is-Vc1o)EZm%Y`8)DV$D%_$Vz@$97S{8Ldw%4EkP(_=sN?+5Y(~+~ z;7XhQFtVx(s+$l_3wu-uGgu2iF{1H)<1STs*KX(jh4zp4OgdP(S7jx1|?oJ_AJOS$8YI2}05`~ISZl;TRlxxq8d6Pmt|19xo zgk*67vVTNhh3T5^&OyFzP6e&FMzqt~TiiQ5{)9Us1Uh>vB1i*h-cY|0S1RM`@O16s z$7q)bPW63SiFn*m^_eKOK4V)_iqqHej;iQ1GpO$O9gb-ncKVBA7lzuwejnUI zMSa|K5RkoetLjW;*jx(e+oECp*6_Ws+J{6%N^Gw8P=gnkm zTexeUf0Om4e2v7>9q%ly`@4v>VxWrtiffKHP zg_&U#oi4Q4)nX?X>|dg^qkfeO=iTZxpstUO7zD=8gEOmE55CIQTj#55Xe4p<5g?}uYD>8iZ2 zq{x)>)E;gPlhwtfkSKx4Kyf{(+*&!}}iaDpqpAaZLtLj3XnRpry%sY}9j-&K+GFvuTRoH$(p3%|CsVV(RG?m6nTi0?uta($jqBnKH&Ink$Qlq5V4vY zR_=-uSRHPSyYO7ccJ>p+$SWO4G*IzN2DnvUE{C{`r-B~MsYA?2L#gDN7RO2-MY!%! z)8Um|i19c$<(LyGwino1h)Rz7xlG9uONu%_Z49!F-i|3JoY}@0LL@h(+s**4zjf*r zfuazrU_{fLsI9ICBBLb+5n+k)aH&9^+#Rhbq(Ze&vY&@o@RBiu2s4*g`E4~~8dv%e zMT2DMU?LEA2{V&uf0Uc}V;honGc)SUc9A=o0+}=m_tRHtPnc*uDH-``Ps~GWRfnYW zzY=!_UYS}}`7rXxOP+dY^-UZ8m4~SABt!xev32QOI1;F`zRAlm8S>{$oQklWRP~K3 zP4&*JZ1assvo13?=3UohZck12L5r7=sMNOBTSss?rxOX#WH)&r`h`|57&7o^Gs}m!`7#XzE;z@D$}NfNY!`H(*4GSmpKc{EBgD}3Qd$B zh_UJbPoa$c7lYDXkjjbD&tA|F?Oi@orv#1Aog~TI&BxV6(b5R!Nob2zl~lWxjng9e zfWQF0>K_e(E6)svjql0ZEc|eSRER!>c;}hC`66;!*sgZ8-3hY)VnNN>k(i&VlWp4{ zJS0se4_u6tJBmQbFzxvXm8zjvPC3g1c-q6a7+3joi3x{14zgo2B2BM0wT!?eyFnta`{vy%`@jcwMz|97AT>j}3@wJ4N{W~{l{ot=StfQBVuVB&so)2#6 zciuf5I`SPY*hCm@FEjzQ++<7+l@4|(G_n0o0zZy(7Eb{Y+CK48PQg#5@(|4Gq+a>u zEqWwvlz{J>J62mQ`u$q@0unMRk3f8+u0O?gFr-P_5T{3B|oawhD771mKbiRx15SOOX}# zD(fo44Wd|Zvv-meJKy=Spd{0&bT*`ogcC_O#sQRR%d8c~fQ#n`}tOWPuwrGztYkp2#3sRv9yv zg2rl@HKOOuM^w_f?Lv6yEnX3hyhx3s?tOGSj#tBGS+mhXt6;`4<4G5SnTvjzCr!ke zbT(*lSs0GV5}d&CeJ_p&^G^g2|H&CUz(LL9b6c_X46u>vI!G=4OTkhSid(Q#9G?~r zY7(!|WvNdAsu338-W}#?r1&1volCbcWy z)pNj({npz`?JoY7k?CFbYXfR8QwNg|S^QD%Uoy=ak87=6PEtzr#F436w3)2fUT*3I zkGc?Y#g=a+tMCu2Yn75nqeHkl4|sNe@VUak-CP>gp2vw`rq1FOHd7L}xsBHbC>;sq zB+48|^+!ys46A2&!@Gu8yJHsVeduS|+NswM{Z$;c&TfdM>^C7gEi-R?3)p>HNenwx zRla6jHlFzno6;?rN9-$Yv-%=G@l%F`3#hcN5?|bQgv7x?lOm|(H=4HBoaG*XC+aPY zKrO!}?edICKK-O0C3F#DON!fScCNRf@;bkU&L68CFZcHs`(}#K1+p$Kft_mp3|o~?i)a7O4+%IU z;S8vwv74kL_O=fNo&tb|ULQF(7V?Qed@H4Md*=LixO~yaG(gFDtB4~&A`rbghu{TX zosqI_#`j<-O|Q<6p9ThE(Yr#h1gM0T-HQAiFZ|q!lR|AP=mo6X#&$lIGpq9Eai!4U z1rOvH#Se_>w~1;h9klo1)v@$`#1!QJP`cAUP+hL|Wm}@mYOTp?!+St8vrKDp(-)=LE}EC& zos@?Ix4{ls-8SyuNLOR5k49WQnbQtWnDVWQ4Cw-a>+{`W>~}A2+Po_nsnleB6LCI9 zD|d>a`pBXWB$mqoiB0S|lQ_~ku=iw6IXUt{SZMr>n)=8O7RL3FCoJQs9QhL= zZzmCbbu2azwN@66k^1PKE{FIz5GxZOWL*wwka})J zqw)?}ZI^xrF1G#Gr=6sC`yQzRmw8h`t+%Slj!+tIE>)3tDzr0hBn=w)ASaTRTA+zf zbDAw7N?L&o#cptQCbz{P`y9k^M0COW>w~zw{MU%v#yUy0f9y}@OmEU|*B{e`*EjXI z8Q(>iMxDQ=I#K2BI+~WK)H6PYta2Yp>k09e$e!*znUf=1{u^;KlLfZ?Sm}T8Q%JXs z|D@tGXYdNAT*L<~3HSTU&!ov;1tFTWLuuv=Hp=@Q<;8E?LC4+*uTEfS6bY_aqih3R z7r7#jNx9}?dh_R-(m(7@wH$If-m(XSj3anlRs3R@9XXn&q0sFc#vTEyRPOQ28>fY| zs@xa6L8~h+S(A?jmTCrK3WgXzQcsB?7I%GMm$zOK*_Q;_M|4*|QGOrV9*Gu7|=AuF$e6~EhnP4`$tdz#b{C3`&Y zAS{ymvRJP^01FtHmd68UeUBNTLw|3G0vc=+0MiQj#PeebAv z{1&$-#elt)%O+R&Fio=GhH&PS1HLhXA6-wR~ItlnszdtY!AkQ5jY%vO0K;S!o9MV%d0(V?X$lwMe!*9;x zP5+qYau@|1kJrG_Bw77M<0icIT<$shn)uxrYtzR*$x}CRqQTj}j3xH}_uGXd8Ys4jz?w4H?>$QsIwGQ$={f@`SkbzznJ3qiqfK zXD&z_b4H^wh|*Er2G9dWzwwg^C8|DM=~v@A>h{c|O{}WD#FqD~h_3Y!RlV~LzjJ<} z|0u@!1&48iQ*lGVB|f(;-^659Csj1BnoR>#x7uS=K|H})4}aXX^B$oM#tfj0-SHr);c|yye zrK63|8I3CvythyBlKWLhpTz&VPrdy_`2oAYN2Fm_oRkwKBhseQdWvbK5DOr|f45m6 zcOWhdoo&K`JZbNzlcQi4Yx~q%=}z2|DhB8-xbVZ5D7Cvr`tJ7FQjNMiiRmr?*(O}5 zSn-YW3zq)|N&v3zfD@oqkENjALC`=gkKz*RC)1nuS{|9_pe0@~t)>lHX4Ffd>o<_2 z#K-adk5{x^Xlrr~fa@3(OoZDC1!}3NCQ;g#HLQ86FDtmqxGtC2rwv?FC_#5#@6-N; zXVH@IgbUm7b9@E=sX<>Wc7wJeWyxW@r62JYN6u1ZZ#UoCC#B_KUu-@33*>u$`}T#- zBJgk7Kk5EQVf(UVostN4zyG(ObHc1&`GWR6CDwY+ft4l9idfH(gn1(v9Z-4{|_K8C3h!jTP@OSuQ6Pf zrS3nNI29WJNP~4%74>zD%9GssW3!lzd}6XM%^FYe={_6Y4~coj=XwYOx&o_9WrYG- z28dG0(za^U!X@DFez@s0dLTu1O>Wz@l&@zIS}p|3XPMa63I1AqG=ffa=IVg;{E2R3 ztSnat93B5I*tPH9QU-<4fVI#7))M=|@JsSbn(NmRY<0gw3w%z&x~)OEe}NNa4p;0m z9DPYJK!p$ec^^-@V%L?sw}iE%eZiU7;*nb&6ZlD*td-4?DEwDS{UBLC{Pt(-Sg!B7 z$>usOFSHQ=*4vR5G!BQ24xK-K=$5-eekTYeVnnS6RZA z?>yrV9{Aq;5Xo~m!Yhge$AbrW4o7(l(RlhqYd^Q<4AtQeC|C`L;ek`I;7DiSZzE1! z?;)#VrR#diAv*Xc)x)UFA89rf|#rI-=qr= zbVo4Ae>1@?-7KG{uxMv_mGh-BYTW0*G#(An!ZIjYN{8I5#d&oUIK4Q^dIeYqv>$8X zP45fZT^$>lg@D=Lu(R-7>J~$61PyL^By|*$)dj9JgFZ8#DZ^X1d78@_&QsZ-&9kkf zX6&czwzdN9ul|pSuV9(Xg~DGOOsUF(wW}z^Jz1?L&@{g!0`UU|i7i=DXM8|# zx~xOwpS&QUvc3V`2H3xpp2Nr;F$$_YhqzOq+hkcOEO4xd%9FNxPgG}Oq&|+(aBJch`qZT`eQh@sMuRUp= zcVxutB)}!fH70KiuVgX%q|R9Flmh*SU8i*I#*=B8ZJ7$wzxP2xlX+Glj{)*`I*Z1p zzV^f< zYk>DJ?NvxQaTqh6{aN2^LX6@{SGc*W#++?r#yM&jRDIqXb^<6s3$y_G-el;l=S~c` zNBE3*91|hb=e{8ehI@ealF|>UR2gIMg zw}n*b7;ulO>=iS&{7X>>`$=Tg-1XV0wZ)3iBfs(ReINycQ;*U>B$cnl=zfOuasN^T zNUtA_L~eKlg4=N|aP-x8NtxF|oS7W=*2^4Xr@7^VH-0RPN~N^zRssbO0;R|9>+|xK z058X9@wucVDJO5xl7TWd#ahD&mEI4ja50&UO2V6dU+-@eEzm!4?UfmAf8TaoHv!)} zx~0Q&;IfWH*SN1!daBPh=!YY>ResCJF(TZp^)gvT6MI6x=XCsgh^?g9-A8H0o9a=1 zucgj_^Uv`SHIRq3ur6>8!CiGOuHgKLuL=pBjp}6quYhnQ`@B*jGNdU!RdrFUjF|aR zex7mr6XuRk--O=dSTUlpeO9viwV3e+K@fayaQ!vVep9cl1n_=-GGeT+qa1IBaTf|v zfu=&>X0nR?`P6LQkOrs)X0I45pu-^vYu8ySWee(Uq=1=dM!4{bWMbPFb=LfE_8S6V z7zc!7_odBvC#f6EU1_R_E9t#>A@e94rtj3+ah2zdVAfWjrBAPO!wo$7!^m!`EP0!& zzuFQr>yK}8SYt;LH1(+Kz&fL%!6)fOJa~wKebO8MQYhyg&K&dBfkX=oy)_IkzcFG! zWnxBX9)+CLtzI^-DtHiVM!@3^0NSY8jx8OR+sg#Ah0S{4T0r@G9HxbC%~QRL*K2jq z3s2ZIiQ}=Bo|Cxw?|DV5ltAu-r+@*5*1N1V3J2$dU`F{+UqYs<@xsJC7XMPv%s>`x zELbrUJ8I+M#;!!nDXCBk0!v z`CrQF*9YkYvKBBrhm{WGCaq$*_C$E`8n%Mt`&#`e-0Gk{ir_^YVFmY9wR2j29NpO3 z0tajBkC1*mnL=J$SBlL7D6CKb=?yB)e#9S9gqvcnxmkA&Jnk<%qPUuoN01c%BP zn!xj0+6&H4d1dlm^}y1%+!SHkRFyp_!o=kQW}~AcEU`l*LEuEnkjq1iqD;4Fc%o#y?({Sh3=9XjuG<8$-G%4d%3Q$m&M$ ziqj#{*^o!do1FL090L1P-n|IzVDh+ujs6#Iq}?47I=VKerx(%Z`IlA?Ron!N#BUG_tD(d zSe<##Kp56SO!_R3(NH2-Y~?^~s~`=>OsOrer+Y>q#60>Su-daBJg|y<4~#3{aSM#V zI_e(wH(G1SJ+BivU@#t306?dMu&8v;r_XvO`snan!Lo`URYMEa!O9PA3B?l`4=4l8 zs=lej&fAKVk7u`c(!g53xP;{LUM(|h)CfQJc))TX%1EAQGUSnM8Fwl_CrDu{p4f?r zSi^cR+1dFkWBPuM_Ry(oC(pW!yghzjMm(jOq(dK=hQgML+5*7uKlG3=5x1xb#Lk)t zy7jVag24~uNK@lIQ@AB-2Xle$+jAqyI~8A4ou(rDdCgw z(OLQBj9lWqbU8q=my)Vlw;VZIG9GdwTFPnh0_PV0;`Oo*rVFaa%R80R@ss)1Lz@RH z6?^~S>0Sh{s2uU(tKLUtWQkscg*?XqT7zYHV%XYCm%@kshx*Ll;eS|VM2r4dE`$c) zh}%Kdy||}3hd6Gluz)I9+$N6Dz|f~01$m6$K8iV-m?3^3?M$7JI#v( zr$7~7-pem5Bxd@879cvSqS)J`EQEdcy_iJO$p=3Z!~&;^>EGFuSItHETGz|+8H}JFRqT1iUNB2l-3mAfqQ344 zpwjV4s>z#i64`T?OFvxd3z<_W`!>Bl9gj1JexsDwRU@xwe;(X18YT5ifQIs&#*a#0 z$9mr;#r>^{ter%Zlq8v1yhC3Rg^s9fzPt&NQ|c>#BG+-KdFy_O<|QGsAy>_qP7hec z_(xLBv^}i6q{LcbAsBRD@iSFt0UE{9omTo|XVKoM%1MOG$;~NaU5wn3D_LbEyR5U5 z;P*e$J&`uJk@@3A;eQU<#{^V-bN5Rpd@VZX?R_*=?b18ECJ&V;qnTOv;k%nB!#AR6 zfL`lj@jDlDN9T5Bo#v%?O1+xOd%$BDl}W_T!9n*Rg|X|ka~@jO-;!U_#Q_Pe$NcGD z24mAFG-80RdU?GSb6&M#ul}GeNrx8W`VT>jRZz^syrF<$Qcuc%7Vk2mPoL-p%c^aB zM>kW5owRS*I9n}erHk`n-<8v`Wi>_}FU@F|-{lIQ!CrocDvpx?z|C214Y530t z?_q*^vt+Y%2UsGR4BB_OXKqW172|dFp9W0?F*k^n?~B&aRBMciPPH&d(5rcj<} zS`ws>+v8SVY4s$6Dpu;%*h~RO9W8g>J2&c$V7{&sphY3oJCZ9;f}GZLxp&(BcPm3F zkttu3PpmWR5_dGwmp0_4Yx2g9jjus$0y*d1@eX(nzzvq09ZY91V zUzY&Z;{2}cBT&?h^idgIOTf*Sji7v8)hwAv>drN*=?2j5Kwi?#&?4Nah83#Hp9Z}H zyFD@{i>KT1z0Xf3CY!-^62Y-@a=`kn`M6d8-q%VZFGeX$5@BM>QkWUrFw$UD_Kb-bh8Q8TC(B?k zzdOBOpYP-Mk9j;ipU-p8e$GAj-gC#i`#$;H3oTn5A})_4D4f#$FgX8SkEgQDP1bq@>t_V5>c~& zd$Z(b`%8(H{$9?_-}t&!(~bH(HRLxI987t+8=n+hwKN-`8S=^c=R+L>`00aL2u|O#2H8yn{VV@(Qh9j~Owj%6pns?395j6Csq>#9$`sPNYN z)-kqaU2u#{3E7yy+gUs#{>s6HiL?m;`057Bhc4(@rTDvxm1Zrd`Q!|55zqCBY)fnq zKSxm9iAn-|{pLwVJwceQ@l9aXJO>e+v*6{+``Q zF1_?z+%syydg-G3K3I=y({OfU+$U$20*izx-_dwm|57$BjHBM;1|Tc2_9>yva(wIY zj*2hfLQurn-5juPw-FpV-4*vF!(QmA5V1Xp6=}jKXyUsAt<`R@6;(lftYhY+57ryW z{ALZm8I|U{0gMR+DZ#_{KQq$x2NX?ZsdP~1UtGi{=Qs4W1)&oHFtD)~!4B(Q;o+z1 zY%EUR)t7S7-7<%KDoFd|YEgN4<#caXeUI0ka)&2;Rnp3)%dn-Z_i*9@uf`T{80or% z?an0~k2$LSabmu`3mhrg!@VP*#*cd`7oWWY{Ha2k| z>cQ}z?FV4l*BvaIZsafA|3(PRH)=J|JDa22?8+BQ$a{J(=^vlN6b+ydI@~y%4K}&D zXFZw{y$^57dZZiFeO^X@VADGEv(b^z;}6fs+=_$!*X9e)%75NFo}P?Q5M<2G)&t%F zMMuhA{msEUV)WjB*{NR>-D3cDFT!$sii?s@JJ3D9r7cU}{#hts&R#H*%~KNXiW>oZ z`DQ`QrX&yJedTyB1HIfmNCOs2ILFEd*Yvf@(`=$bhnXjU+5?I2QYbgswu5*VAx9?e( zzgjZAC+hyvvMQPuox0x?L#RlO3w-RM?NFFsls9hyJzYO>aH_=*sA$BSB@@9vzxI;#>`m0AB}+hT(KKxOHw#&jDv zV-p?2TwY`T_^$9s2q-Mj2u=^iAr0gnGcJA7L%zALE%UD6k71FR8vA;;Dx4hN_4|Oo z2vRKLg^?~k`&k&MR`GY{=9=`d-zd?Qj2{F$%Kx#Y(zHetL+aDTsQW3)W+m8M*XMCj zFd2IZ`Z%FLdADy{_~$odE;_Ryp1%~ zhM#t3%-QI`2fb|V0~6N1b!d`~J`}z2!4nCPrMUDZc;y)zZk!G}Amz{+bT78JH+0$5 zWx7dW;15x(kV3ke=A^elucVfdL5%rdh+J1d1ffs$Q?!8^N$!Yqm%$fC^Vj^X(OBOF zKc5|dIa(WbGt{wZr`f*O*+wJYD}mU=Ps%V~YNNhbl-}*5rSVjftb zuIr*0aX9MSg|eW$@UFxYvVN&fDr>>h?xuRHD`^Vc^%W~ks+K9d#I@bA&}8+ppT`Q< zUERUvTyxO}f_6V5vMezzk4Z!w|-DhvE z)3e8Xy9~XQKT-|Cmbjpa1d}#1Lj$w;#@S^2=^)peV2A%O2P1!U(NJk)y2UVKg`HA2 zGUNV7;XsmioU_)jt~W&JSl03iv5~-a*4gHAXvb>`u=w8P0%gPZ_V288GtK9z%ry`H z4ST&X_c2<)aD_>k{7typ2uN>PAw}DM6-Nt|2ix#(1vWY{vE=gMw{H({`*9pcC%&QZ zbz9q*&34Sz@?De8&mdFSeLE!j`imkFLPQcUS3EfVv+Y3Jz@AguznxmkORU8IEQ2*wA`M$MMellQ63b9% zn3hJ|Je?doeal6O`i>7I-vwc5`s3&Psntk9%ao{NF0_^}VPd^#W;CJKC`*oI+|al>JSbM9RoDr``2Qe~ zSvL;?2opmA+BZHMKI<$x4yv?IaYZ4Uz(HUMvcU^EgX%qQOgQ(oUau-HUh>wp>k7os z?U|M}`t|oM9;y7tjaCoegT6Hek73_b;P)HiT&;F>ToE3ZM1w1vptJ4&H{f;Es1-i17>=u}U^?{&J}6C@3mxTc%}v`Ij?>Mn>|bmH67 z@M@&QYnfYMonxm*meAJrRh#@f+8-PL7i5}8_hOitR||WV=KZg`9ma~4I2n8F&+76$ z=xq7w$B9o%m;A}@?wRF{%R3dFZzZL6$-5cfag0946u#Wvd(@8B(nCWO-l>u(G`~DN#bW-S zrTCN~b;ndG)18a5b6nhI2io3YAW12mNF+W9j&T9Yxzir_LoSFnE}ZPX31S;)-%!a7 zoc6!)pA6i{M>G)_>dbuJQ3Tjd`B~OP()FlxV+4TlC=#h*wxB+ioVyw9X8eIS^&&Jq z{5Vqqn||h5C@=OxvHz(9tLhos5UWaAZxsRR$m|T;6qy_7 zi1O;W=r0JLA~8hp`@!TqKb6RS;nn}VTr;Zjn7^{yVG7o?{_7P7-nwjk&$-&5%2dCx zi-@O4X%$_cvX+Vl;{xsY{B=}$*W3LbqHVKb|L40fODy%%e!3l>&(GPg%dITz-3@2?Lc*T_nNZ#Vru~JeS!l9pZZEs-F{~I1h&sKCS!Ro0Z8s16= zTt5Wxm(rXxO#Ck0*oX>I5W9V?wd&t6&~fI7zv1~R?!I9qzmMhvkCOjPZ~yo{mN!|6 z6=qj5ErvG*G1=rse>rT*DcYmQS7;3v#AZ{u)8S3xhlt*U?TvcRHfjP0g)@&Hb=>_k zCoK8&6*GHPlASeW$7jXIJDQV6YB$yc$L~_w_pPMuyth~# zH?Z|Ng%MEft7z^fvdg@0?8ujQXgs;%sI8xJmL#>v6UKL}ua^@F(U0|kw0#Td%vbjO zF|@F9q_$p3r`vtHH}3J==WNWl&l^4=f8#s2P8s|AV^3yDirmP%x7oBUmzgjiyFcW| z_GkNMXJ^@1r`C7!Q^fT`<)>hovwtAX&ue&$X3_iB%@}FMTic)#qBEA_IEl_NKr^N) zV5H1*C%SbnU(;RZ+rr9rr|At76!h8y)ImILSvzF6kJe0^Zn|7O%-NXuc^;AT zF}j`o&RC=8^bj|c7n?nYOjN8;W&l~CsC4oD_bRF{@~NO=P=_>1^lG994A4`me1ScR zMwXvv&O~Xv-ziZpl4}hsOcrL$t(zNCgZmKg3myZcUi!@Y#&u-^SflNWwrZaK^-k?* z)!ThmC1es}X3y0aSt0cZDKaV(b!wvb(s>)OvWJT=CzDLh@WfPvlhseU17aF`s)DT~ z>femDDdSFK_IJfa_zAC&@dDuTF>0Tz=Iv zP6UU66M9uAnV&Px)kboQ`mgm^UrhnzR8f$t^XcjTWMhI%K=OSPCw9eQK-MX_7fc9D zq+s$c*T$p+&fo8SjIE&``^x-qQ37|;F0`8>MH0{^*YhO{hmJHyR z@L1ov{6X>)VnzvaVcEcCpB`b4Ui((D1J17_^ITFSFNA(3SA&y!l!_a{J_j24q_ETv z7q6|8v$3%0ykoN}K^&)TmdNJ~9EdehjTO_5ih?OHVrx8V_sRd2C@34WA`2Rixj;+4d>SV8Ws=yZhwR4Asg{|2EJEakSNy zyb%8{YtFXw#gq1@m8S4R5?_bTK6bS~j50RpQtGHnS?O%Za6x>AnT;}5WXjGHAat^P z<}pOMsCJS;K_jPg;4L4&KK)1>6(yX#%mnqPY5EMkM+H{k44#y%^#-!OE zi_tEm51Rpmz#8!(wDxtn>eEDdiiWna$^U?y#+vA2RI*Yf^=qDWBBDz`AIMAM}+t_djF!5 z4lBmpmy;jSUQhHmY8OC}Y~L!Re&BVgq(kJKiPuKQR2tSs{Acp6dq)qC*agFU3$3P; zC2lbu@yL~VOF|!+wD~}K%xobb3KfFWF8MsQJBm7dLr=A3OrGzs&WdZQeKs14MZ}%7 zvlW=|(fk2xakaIJ3x%}!-mi+DzKYO4&ty?*(`obAMql?NdH`#U!exGn9H_~D$1G6g=zBu~CiBkn}8) zB+t|Y`vgzmL7B6AbYdCf7h*$QKW)CI8w}q@j7yyh2aQ3c$Z?6udG$>J+fGWh z2LN@wo$?+532ZwmMa~jICOi(m`0(sDHLr-+DQY%v2M&WO4fJ=pW;yp;4W|V6anKbl zovVvvnsw>#p}v#J#Flhc=IR+7W~MxFNgfND%jCy=`WkS3Cn+3sYP@KPr4uvMqU9rz zNXiZq@r^j~mR_S0?T5e|-?A{QusIFpKJbffm%kP|0F&6NbFe!nP{pn5UiTlU4JFdw zk7YWPAm7N`P}o`mOOPNzsYs+vQo~oahw%=fwuuTOF|u6}gMoihh;imK)i^I((pLLp zS3BF&!EZr-Hl{f61=P)KF7Ujv4xZ1m_Gw%v#TB6o8P{6ZxmSV9=(AhTvm#a zbGrQ$v|$k0SsZ@Yg{gi}?P*hD?q+5IrGSNa@WNwB2&4roMz~xx4O&uJZx=%UNeZLz z8Jg^7!|eBbtdN;tz);4`W8|V*_2k9nVDW$}X0)1NFWK)>g0VeJa zQ2iwAQm5Z(8Cc2wsGWEYGhN3DyHt2)CeTDXwDpur65Su?p0$Atu~Ac}#}v&B^<~q7 zrJS7Vn@s11Y`7sCYkF}So<*=sd-NTk*5RHmOpfBsq(iq^*-lAD^ctOO+;X9p3Kf49 zH=|Ghl1V-k`ut_`>Z~44o0G;ujelcuW6Wp1@<%Gsac@Ai+n$+@bM-O`&XPQ~MNsP3 z+p5fq<3chvO)b|hpiQ}Dg;g@`oIguBOzSPr!u-oDr(3#HV8uAfJuf7=(A~B{Fl@>`sl>B}rj2?!$MiS$&ekY=sz9)f^lNqS-Q`jiFe0Qpy zY@;gNumb?y^_(fOQh07BvZ+^A=v)8ixTVU~Bl>EGfZG(+v2R$l0<~5lQrWTKBIoC! z+NRS1MfxA^H2i_*8$<6+9?>pA<}8=%giXe}T0}g^k}L)sICfx=w|&)J&gTqaGqdfz ztyS;ag^MFpJm)2`Ng3CUaTH#37l6YozxQ?IyvkuV5of>kGRZsyBY?N?MCm*;Z_Kgp z1wTsy4XDb+OLcTU+imhP+Gnp|Csr5^x+;d7qw9!~=joTu6)g2;JiPkZ%ucD#!$cAW zUQ1SImSPGQ7M`~EoUc~;bulk*k)Tvx?^QD&8Te{+OksoB1P-Sjom7P@y#iGF}4k3sNUNvsir||;1NUCuXUzQq2DKUIKKy=c&x)1y&4Jpy5z0b(qIIC@k`lkL`5D7} zc{%mFv8&JczX~+tKgh`_e^9XU`~h+n<8QVhyu^xClBmP%Rwq1ku+XR-oc$#t?5<@-{(1A zDLEYG{aZ=&pE|Ht!(0(`lUhw275Xy3zJTP?gG>Sz>2ae)3F}`U09ATF7rYC1JMST2 z`M_Twrl(?_MZPnQkR~#{#kc#@+H4VvIcC zSo1bc7ck~6Fa~s#=Q&PCkLTO?uHgXa3}F1uRCwSk-n?SRj1<{KNZ0g3x6O0}Q$8P4 zD&0QX-#1Ut>?wUhTs-k1Fb?HzM0EqGvzAG^>Kl0+w$-0%Vg7l;bFPB%-$B?ci)Kb#ZN^m2Rk zwKT)CjsqB%mlujx1;wF-x zL;PbTquQhiJwBh^DCX3NGQpL3 z=r9t0B?cYFXW2BfYgEO*1>>6xX$xmKRMItDf+y|DVD;p@R)ZL=4&{&2?z>~V+jUF0 zz2Wk+3TQxUP;VdtR{1M{=iocdq0x%=rd@=r8b|X;SCod|`l-|3T{%<4j+?U37Uj0y z6*{A@tRD3>4jz3$X4tz}Lhn9pRUb44e#XXH;XC(zx_oEuM_G`Blp@J?IU`tqEH+^P z>nNVUX**1E%_%$D-}T^(U7Gg2eaQ>hnmGE~9`*9vJ$m5|Hy#Qf0R8_!w`cp)A057% zxq3I;1-vV?i|`oU(Z0GCLqe{e8Ia>S)MISb3Qgd`-@@T~#9F~GRmUgwZW-9!b4+}& zueyCwy(G8cFmW=5rmn8f=`tT) zjlf*{&_{W`?G8L5DOuYU^Bd1M^844Y%>vu?=XXG5&cagRpU;lW{MFmOcbqCC>h6!O z*zVY+J-*V0DLvhSvJkwp$ffB7U-o^kC%ogwwExn4x`CTgU+M<3RMl&#XT*@zik|=Z zV|c8`s(b6%)Ked}szcf0m9yca1#utSVfe*Or(k^U+v_0U-p47a6_ye=NB;bZ$SCwk z?!(`nW<^*_et{r~*Ze*Nc4|+ZT;@qS?k^p;K^MkC1*O6VMqVrD8|YZw8_AM=&utj?ZKj*7X?KvjuzTfC_>{ zE&G+n2;~D6s|Z%7>qocG2@Pi|Wg40~$e#GvU9uvC3-}caWw`(r9xmIJxN&)(T_G3- z)N9d{(2X{ZyOJn;k-jyaDwK0yn9*lzNB3rk>9AX4md@B`+&dX(`Yga8jozgLB>F3L zxfTpb6;JGSo^C0W*^NP!<&TQQyT(oAC)anERDODsjDRvDC2v3}R=@p=Ml^1DLQHbY zLrWb)tOIFtzT|6jbX=#hRIblpNs+!6Hpnq}HN=br6Z;J!@b2^8m>ZtLgZZGDJmywJ zYFGNj=gNj)Mk=qIp|msC4D4g|LdyOQ^$;ATj9tWK+S=bU9Fk7ncllnKz8B^1?@6pP zSD<0y}Q=$zI;W; zwg)Z~maSDA^9GV^YOaqqx*7{&9z3i1`kfjvm>FQ&sW+~#|Cis!+bsl?oM>^*sWEwI}T!3J;2knqzhpw2Lz%zrt74xc_ zTMC5y5Z9ipj-9cn{rwF;c>#sd#8h4xdFF7&7FssM92EMs$F4#;Q#ir)-0krcK^;!- znaORY_I`yFfr0gEa*ge3wfT&MuXsZ`=}a}R^GtyKh2d7UTtgq0%c+*5<-4Gh0aN6_ zAG>R~JE6f(FducxX4M3EaD@?cy97m08kp9zo10>fU6?Uy7OC$mVdEdXf$qctg_65s zQPQ72NcPv>0_GH%tksa3TpxPTYMl>^)({CTzxKHWccXda?d+-5Su(qFwbA#PzEfu$ zy<^T%>+kZ_uToC#GpSzIAR_JALqk3kJ}YRS(zLK9Ym8|$geww+V`$j82??#O8pDj| z2D;gMC}V|37uzn7L;DZmM&Ier2}4!hg-Xr>@%M>_&BuaD*Y4xkG{f^{@`x(?vPf@< z5cgJ4As&Zp58cZH{=o6Zuhr0es_wlk`k zZ^GtZuG~U7y-$bRMl+;%tf3_Q@kWPGTE`v;I(8UE7TgAns(i>j=lhxMMqWFe`ukV` z%!oVl*N#+ePTtoWD86Q1JU%8?3^`-Z&&h75X(pV~`?$uX^YV19^>t>qDoH3q3(H>< z!t&kPkUx^L8Ky?yi&L;T_#!OpnuOvD#qIi{S5P<_7I_U{=lKXa&e&V6Qna+%Acfx- zYM}Zd1cDxpnS$Fvluh5OuLt8VWz)t0Vw#gNBqe$%4PS z-U?7^DvPj>ui+HXB&aqz@Kqz6;%LA6$T40J9l@>-;3udTHPmMql>KvAPcfYOnR&ho;OS_m!DHxsi#!Cz&k zvnmiaqSY?XU8W#7yl^EB=<14ia-w3kPM~!4`*AKk*h?d&U33>z6}scF{;ur%afgwf zU0VB-TLYl*-L1EP>uAb|{H9sZ&{XjCwYl*TH3C${;xKMZ2aVd=kELd6#F59ep|c-X zo&nGdGmjZCz3@wk2%&v2B;4+@JN9mro2-0=A|dzyF6GgF`(+EgmYO5np8>UH=#Jjs zKmi8RnlEAHj}ex+KizVSn*_tB462!pbc1&P2nWFDSLh9pT-MG@;CqE$FOKBR+CW+o ziE;-&7pQ?_Wh-h<*Kc-xvI~3$h5rk3Ep;fq=ehDeB?1Mt%{G_ays&w2e50zYXJso4 z_t^KvGd4rt+O)xI4}5<6nwmKjP$g{%Z_)@fxMHX!S{+IV^|Oerbub{gd9y+R%p6~N zV6v9$?X{5){ad`QAdT)fg!QD4SzUc=b=jN9e!NohB%7<+IisY-NeNKB1 z+!q;a4ht@OM(N!O6^A$i{eor^pLd*GBP70%`94AYQswz~t##<{grdENUAmUnd$~f; zpue0vc+W)fdafBghW6FfNf0z94|`w7VabU=B3ds1iy?P2i_h>b%?qvX#S2BQLIZY7cudT94$>4Y;~11gZwJYEaCL@X18oVCHNK+qT50a+zowjpnQtfg(%&{VW@mie5i zNE|T`H~{)azWhGf7BZd2$mEZ?i;hD8ywQmyrVK&>fl40u{F5sb9vKz@(wu=L0rzD$ zaD$So0T4c9qNJ*C)?Nra1_IEbbW<>S50`E3?bi+<7D{e{ z2%%efqEKyP2>)UuqsudB#LlThkG8|$K~n|Y>TS($KPbHE(9jO(=j9x9SXj!X(A|4B z)~dlgC|Ae*n+g>3`=CCc6=V)7p&+&Jx#q$I2eAZrqHHrXcB^+rNg2y!1Ar)L#@llpBD@C ze4pIqx&<2a%H#{LR3%8GnH~4_160*_w4XI4Ng{%a7|sM4D1(QY>DyD3pHSFP&yPv8 zv09iY^s6^88Ccr`>*L6zLxPZ#5Oj8X*a-pXfa}MAWGFLqDKKZPtK8J|>kGNvhC>Dd zM9yKg1}>c7v$AA`=MCHi+>gkhk^pxux{>~YiW_OazRoyKhszXiBomDsDPA*;Gl)J*FAQ1E0RdAqxg zMG_-}6SXh2*%!zCW@4D#n;zJp2SJZV0|8ghCiZ#1RZd9GF&M6NFB`AqZPRD!2SCtF z$&;PXuXM$wL+$E^BST)4QFg&jq4-ShyQNl_`M((V{ex3>x$rjjX6nHZl;i?|*$T8w z8@Xe2YpJ74hNO1Hq+eyUd<>1tY=5^j#gd<@+youdlml~5Nb!?v;sDd_9TV^&T|FtUu>fEK?Ovj`==A&rdV*BGPGI7(wXRX=Of)oks%; z*KtB|FeV6|v2Vz97lLYKcHP|qy^>E`zZ7o2O@k*Dc2r}-5$(GWTC*;#--QxFgmDrt z>}qQmnF5LjNzOe6p&4qm=*?Si?17uf+^_YYl11Sh=^I0xx*HJX;HcU;nHcS8X$jQO2po0r%_2buxQ0A*kv| z7+=qJsz}qwtZP31I)5Dfn%Q2Ej9~RjK;fp1Y~U`TA(bgY(gS(P1av1`&JRz%vQzOI z_~y(E-%0%n7Y&_@-gV$SjaeZ8J@}jN3&Qn9AB^WeX43-h_k&|)M%k`PAaF`Z_AgP8fz6SmJVm2@#c_xoGK>!Huu#Z88 z7?A(}v@<@Ok;5g%*~F3v$w(#bNCW`EC_!3xqZdQL_xr%S8mg60UU;0WR8FuoM>H%H zI!oWhV@8WlQ#bd;%n^t`-_2L}>Fj_J+JPjO~5+oQQemfVB;G_^hnfO1?g-zW#q zNdyn0lL(VxhI=cIdyR&cRyLqM-+~fqfH_>08UuL&^k7g3PVD3;a`D}91wJRZ2CSRh zZ^0D?;@J>X>$%2Phru5oYQuG}+Qw|vKHlBif`Q4SD+RZNA?Qs#k&pbHJ&HnS0=+v! zO9Op;bB>usfU94s`ChU1lc&Z%p*DjdMgq&%a9T4-bc%uRQb<5Q@No~UF7fRaI{No! z1H`wOfti!{jG67Bnd=-@Ie`|ej0?!>D&(u}^8CNRML|K2qqdd|T~tKcw8A(#Y{Pgn z!g-PaLC(llGk_!X_Tk4zG8VaN^_>}lX^KG4`USAW~+!<+l$PBnpC*Txt43PS* z+{ku?^VLX9+8o>;WeWxt;;UEq!H}Xd&(o5>xMVGydwEV6?5~vGStueCIKhrv!mQ6| z0TYH!G+smVU!E3dHWio?fqB-L^n=c!yo^Kay+FLGeDQ`Wy(FETV9nUNkZ=F6&RL53 z)gRC;vI#uqf2mX^wS^{r$s8lMei?pBmz|dQL1nW5ds0Dt5rQs#w>>oOP%`hZ1zkpO zBCgILY`{l9`F^E#SKQWu{h~_RL(SW9KHdzUJ|FZI2#VhZoFR0hp?v~BAbCy;6ZfvL zt6^r=5e?MGS&1*!V;Od0KfR5w=F`bvg=R5f+jM}{VZ}@1;6kdzV}F>Fzz_rP?)vlY z6D@%sT(VwU-3xJC`IF(`t*>6J@ehGs3*p$|02j&p=o^0cW|S-q-&MFd{nq@9UT0y0 zuD#!)!za~G0sFCF+*ipoUX?i@IeSwK4JIHaUt;?wOOU>JCD1C`z_3z0$b33^Z2*pm zCoRl^*QOdkc>y~1QtMofd)H+loO|C^i#mb_dwn}dE}^qVAe=+a(i&N9{j)b&nEnm_ z0DM5-iuvW=pO^ci?7_3$e{g^4^g0`%Ub&hfg$oe=Y$2ScfMcKUn&r8#%;Y}r`F}j# zK1Ov8)UdVx4WoK6KPq&((rP7Fs2mqoLDq`=!B;fbxZW!w(MBzuKXebcZ;dZr zwDy(p=$!N}BuU2(YZ+7OQg~HpzzXW7M4qID{}UzZ#)duZB%og7k9sOS zXV%JK$;=INoc?tD4=Q+ddz2F2IY51z5}ziY1u~VbIsdb7G&1?31}Bgc;0_1yo#a_5 zP~Zcp$g-qqknPkyQA-7EoXb*Z+u95Q{{QJ#*poyBvC$-%Ik$i43W)x(nWZ&~K0zO# z7W7BrxA&1Y#vR0-vqr^`e6Le${)b52aOVaR!_?T~4m^{+xoTUTMB>YwM${O32K z_#XR!>6hc@e%-R(BLYG9Krs;f--LnABxnR;8j3+^IQF0JTgB#Q^9;DMpfJH_^%ISV sKi~eQ*$mgzHC%@-uco02c?r`n*aa+ delta 27214 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 pmkj<&3PedR@Wm|}kOx>EAXM1-Fdv~5PR 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

(dclMYud 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 diff --git a/src/main.lua b/src/main.lua index 7f90495..4c3a2e2 100644 --- a/src/main.lua +++ b/src/main.lua @@ -148,6 +148,8 @@ end ---@param pitchFlyTimeMs number | nil ---@param pitchTypeIndex number | nil local function pitch(pitchFlyTimeMs, pitchTypeIndex) + Fielding.markIneligible(fielding.fielders.pitcher) + ball.heldBy = nil catcherThrownBall = false offenseState = C.Offense.batting @@ -318,7 +320,7 @@ local function updateBatting(batDeg, batSpeed) end end ----@param appliedSpeed number +---@param appliedSpeed number | fun(runner: Runner): number ---@return boolean someRunnerMoved local function updateNonBatterRunners(appliedSpeed, forcedOnly) local runnerMoved, runnersScored = baserunning:updateNonBatterRunners(appliedSpeed, forcedOnly, deltaSeconds) @@ -351,16 +353,7 @@ local function updateGameState() crankLimited = crankLimited * -1 end - if ball.heldBy then - ball.x = ball.heldBy.x - ball.y = ball.heldBy.y - ball.size = C.SmallestBallRadius - else - ball.x = ball.xAnimator:currentValue() - ball.z = ball.floatAnimator:currentValue() - ball.y = ball.yAnimator:currentValue() + ball.z - ball.size = ball.sizeAnimator:currentValue() - end + ball:updatePosition() local userOnOffense, userOnDefense = userIsOn(C.Sides.offense) @@ -418,7 +411,10 @@ local function updateGameState() end end elseif offenseState == C.Offense.running then - local appliedSpeed = userOnOffense and crankLimited or npc:runningSpeed(ball) + local appliedSpeed = userOnOffense and crankLimited + or function(runner) + return npc:runningSpeed(runner, ball) + end if updateNonBatterRunners(appliedSpeed) then secondsSinceLastRunnerMove = 0 else @@ -426,6 +422,7 @@ local function updateGameState() if secondsSinceLastRunnerMove > C.ResetFieldersAfterSeconds then -- End of play. Throw the ball back to the pitcher launchBall(C.PitchStartX, C.PitchStartY, playdate.easingFunctions.linear, nil, true) + fielding:markAllIneligible() -- This is ugly, and ideally would not be necessary if Fielding handled the return throw directly. fielding:resetFielderPositions() offenseState = C.Offense.batting -- TODO: Remove, or replace with nextBatter() diff --git a/src/npc.lua b/src/npc.lua index 6694379..f888566 100644 --- a/src/npc.lua +++ b/src/npc.lua @@ -39,26 +39,25 @@ end local baseRunningSpeed = 25 --- TODO: Individual runner control. +---@param runner Runner ---@param ball Point3d ---@return number -function Npc:runningSpeed(ball) +function Npc:runningSpeed(runner, ball) if #self.runners == 0 then return 0 end - local runner1 = self.runners[1] + local distanceFromBall = utils.distanceBetweenZ(ball.x, ball.y, ball.z, runner.x, runner.y, 0) - local ballIsFar = utils.distanceBetweenZ(ball.x, ball.y, ball.z, runner1.x, runner1.y, 0) > 300 - - if ballIsFar or runner1.forcedTo then + if distanceFromBall > 400 or runner.forcedTo then return baseRunningSpeed end - local touchedBase = utils.isTouchingBase(runner1.x, runner1.y) - if not touchedBase and runner1.nextBase then - local distToNext = utils.distanceBetween(runner1.x, runner1.y, runner1.nextBase.x, runner1.nextBase.y) - local distToPrev = utils.distanceBetween(runner1.x, runner1.y, runner1.prevBase.x, runner1.prevBase.y) - if distToNext < distToPrev then + local touchedBase = utils.isTouchingBase(runner.x, runner.y) + if not touchedBase and runner.nextBase then + local distToNext = utils.distanceBetween(runner.x, runner.y, runner.nextBase.x, runner.nextBase.y) + local distToPrev = utils.distanceBetween(runner.x, runner.y, runner.prevBase.x, runner.prevBase.y) + if distToNext < distToPrev or distanceFromBall > 350 then return baseRunningSpeed else return -1 * baseRunningSpeed @@ -124,12 +123,15 @@ end local function tryToMakeAPlay(fielders, fielder, runners, ball, launchBall) local targetX, targetY = getNextOutTarget(runners) if targetX ~= nil and targetY ~= nil then - local nearestFielder = utils.getNearestOf(fielders, targetX, targetY) + local nearestFielder = utils.getNearestOf(fielders, targetX, targetY, function(grabCandidate) + return grabCandidate.catchEligible + end) nearestFielder.target = utils.xy(targetX, targetY) if nearestFielder == fielder then ball.heldBy = fielder else launchBall(targetX, targetY, playdate.easingFunctions.linear, nil, true) + Fielding.markIneligible(nearestFielder) end end end