From 90f792ff4ee132c91a13ce47d2471c1d7527a8d4 Mon Sep 17 00:00:00 2001 From: Sage Vaillancourt Date: Mon, 10 Feb 2025 23:25:19 -0500 Subject: [PATCH] More aggressive NPC running Less aggressive NPC batting :D Updated Player sprites - now with belt! --- src/baserunning.lua | 1 + src/constants.lua | 4 ++-- src/images/game/Player.png | Bin 4558 -> 4784 bytes src/images/game/PlayerBack.png | Bin 4709 -> 4969 bytes src/images/game/PlayerFrown.png | Bin 4556 -> 4780 bytes src/images/game/PlayerLowHat.png | Bin 4550 -> 4775 bytes src/main.lua | 2 +- src/npc.lua | 30 +++++++++++++++++++++++++----- 8 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/baserunning.lua b/src/baserunning.lua index 98b0286..1626207 100644 --- a/src/baserunning.lua +++ b/src/baserunning.lua @@ -178,6 +178,7 @@ 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] runner.forcedTo = nil return false, false diff --git a/src/constants.lua b/src/constants.lua index 7eb59f9..9c30da5 100644 --- a/src/constants.lua +++ b/src/constants.lua @@ -71,7 +71,7 @@ C.BallOffscreen = 999 C.PitchAfterSeconds = 6 C.ReturnToPitcherAfterSeconds = 2.4 C.PitchFlyMs = 1050 -C.PitchStartX = 190 +C.PitchStartX = 195 C.PitchStartY, C.PitchEndY = 105, 240 C.DefaultLaunchPower = 4 @@ -84,7 +84,7 @@ C.BallCatchHitbox = 3 --- The max distance at which a runner can be considered on base. C.BaseHitbox = 10 -C.BattingPower = 20 +C.BattingPower = 25 C.BatterHandPos = utils.xy(25, 15) C.SmallestBallRadius = 6 diff --git a/src/images/game/Player.png b/src/images/game/Player.png index f15876f827eef3b9ffbe6e97e43a9da16b77d1b0..22db89b1a0f35c06de5e0fa08b96e7893055db7c 100644 GIT binary patch delta 917 zcmV;G18V%vBd{fqj{yUbkV6gpDF6Ul0002|DF6Ulk>D8%F)$!9GdeOdIxsSm1OYjJ z5EX>4Tx0C=2zkv&MmKpe$i)0T=>9PA+CkfA!+MMcD^ zR-p(LLaorMgUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwcfm=~MN0f%T4)jD!Ery{ z-Fw`<1B6C}X;vT(Xu55tlL;}KTNOipuMp6O0D_p6nPtpLQVO2q>mEM7-o<#9_qjhu zznZrg;1h}C%rI@@4dUrd+u*!U9APC{B|aw}H|c`Jk6c$;{KmQHvcNMVW+pvP93d8q zU95C5E14Sc6meA5bjla9Emk>ian>p|*1jiyVK}d^EOVXa2$ERD5+sOFP(vAi71)T; zs*_?NP5TKC|FG+q$fc003`ULxRG~q3{osG_yIZR;InhcACxGCK<9v()pM0R!8>#dSwh_JGSBVCcz^P1%+FG=)L|ct4|W$^nD7 zK<`?sxAs0xAAk&XmAU~A4uP>7B4w|8yt}8nw|~#H`}+ZBu5zO95k2Yv01jKT)B=hE zBxGeXGh;AgIW06eV>T@`W@Kb7IWsq6EoEY4W-~G|Fk)smFq47>s0=bRH#agfH90jm zGdPnr25<{8FjO)#Ix;dkFfx;|1|thGFjO)#Ix;dkFfy~>1`z?14F_B#F*!CcW;JDH zEj4B`Vl6Z_Vm2)~G%z6lZ^*T3o$TMGBY|dGCD9bv*HJC2n6Yx z17nj^5Hbi01Qr9*#&|lDju0q+0ZBwbR9M69SIZK^AP5Xj{{NTh$qXS2f(drgskd5O z*5zeri!WBc$up)2zz{~;iWc2q>S8?!{2eJc8Q5~htfeEwmN_Rc5nZ<;fc>ES-`gt< zUYor>6k1@^Gk$vQ*(*k+Tgw>aW%@=fYM23arHFugHf{Fc$T8jN5ng(PPwCthiba~(S{{z1lnASY8Q1TDo4@SYj rcZKCZPLRD8%FgYMGH99diIxsMk1OYjJ zcKK@10004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmP!xqvQ>7{`4t5Z6$WWc^q9Ts9 z3Pq?8YK2xEOkVm2O&XFE7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>w5Jl@B7 z?;P&E4-lGFrdd4+K+|nAlS+!Y{Hhp#dWC>~L;*x(W*Kvml!ov6x<`PYcX6KO|L)Hf zQ41CW0wQsO8KzCVK|Hf*8=UuvqpU2e#OK5lCKX8h$aTfzH_j!O1)do-vzd8fUcXrC zVx@~&+0=-qiDRm!Q@)V%SmnIMS*zAryH4I=xS+2rbDj1mQdqeiy&%l-5@z?i4sjutxt2DgEW>yD=E0hc?#@RK2%vMU8?3&kSven#Jv2ZnBe zfi-V#?R%U)09l$<`UW^S1jb7ml)diLcVGA1{(aM)-wzH%a(=QBR#yN34S2KF0*V48 zV>e+nI5aahEjKVTH7ztWWjHNiWjHr2I5RkAVPZ8nHDzUDlY<4Q3^6k@F*Y$VIXN^j zIg>XAa0@UwR53L=F*Z6dFq5(dBMUG&R53L=F*Z6dFtgwW5dpK*2w(^V1Du=NlQ{wAAdm&eU`um{Qy?gE*n?^ zltq8Qp5dtLS-ZNoM}ax~)wD>4*ewuMbqN?(xr!?|Qi_zfBw>ND3aOH|*KQ9WA|#*# zu3!jsq__ny=pdV35viOVrJif_O!=Z&!n1kbSNa3~fctd5XT(BHW;j1MjS0>b9)T_C n(RXm^f1W1osT#l5_vP^q4?wUix{7Yq00000NkvXXu0mjfe7bdv diff --git a/src/images/game/PlayerBack.png b/src/images/game/PlayerBack.png index cb5fac25a9e9ebf471e31eafb21cdd38c78019a2..c981a098ed320bde5b89513e2907332f8d35cac0 100644 GIT binary patch delta 870 zcmaE=@=|TWPi{j41tViCLsKhblgTWMmi6ft?+!CCFt%hmI|q0=J1Z0v<)>xlq%ts6 z%&DDd>v7mY=4kxoXP6Caf!`1oL<{k^-@clI*3xV2`6Dez_N%3U^@({OgQ zsB`^#feY;nO*5v>Og-Zn#5M2nYdO1p_l{Of`@YlOegCZO5)XtsAD=PEeZ>3drSI(r zd;Db*RU=jH)aA@yHXZ4Y36J`7Z0Czj2aJ`|)NK7_6vet@*OVA)&y@NoQW$czH`Ct9puuTwnt8ONlEBSI=20RhgE^`bXAF0PuKr0DyblmGvQ*V9id zov@n6t&cTip<~(K2lXFzN3S-pyy(TH-teINaZL}?!q^3o<#XOAAJ3e}@Gt#=*ZUu< zc@v&Z{!-=MEyu`w`@qps_uy|0r)3jfoSfi$bLt^`^EXE7@M~{ypLMF{hOVi zd;?GE)Lo2xe2p8Wl~UJN@7cY4_xAepTYmp$OkY>D=)IurD+UIByUkaax|meb%uP+r z(#(u?O^i(qbWO|*jCB*!EYox?OpFbajm#{}EiEl4H?gkZF)}eXHa4*|HaD@bm~6&Y z0F3GocvNp>Q%2@*zR&iBaq+i+^k<<5~%$z_oQk2aj^xVg-){lxvz>|t7rS( zt)6%OM~nRzp|kS$UTw>)3tZf()0kyBrOa&i@?Eo4H-DTnF*f=u+xvHqMX$5ENj-k1 u+o7)Q`+MQ_{o57({}xjEmwNJV$seY~-Ki0U#qHBTUiWnMb6Mw<&;$TwWo(}S delta 780 zcmV+n1M~dpCgmiM`3o>PATc#MGBG+eF_Q!VIe*I(jQs!r0fT8nLr_UWLm+T+Z)Rz1 zWdHzpoPCi!NW)MRg-=tZDlHCn5OK&*o$R6_j|$9eA@?!6BXnpLJ*JqbY5Z8MWfin;u% z7=L<&fPO>)L}X?ebCQ&X@A|q&fS-49p5_1U&lOP%76Sqzae^79O}s%ovuPWg_lcvd zEUU!l#1keJNc_lk#p5^5C6@)B88x$+d179_Sn6V>i&@#!h^L8Ts-{!Ekn>pOyv13o z)>*qw-eI_)uPk$&_9#+V#1bTkP*6t&Re#us)2WkUAw%~`AODE!m&m1%s{%%j1=OHH zcKzUg@O!paaca^_3MYZy7svS+146q%tKm4`$BxrF0fNuKmEQ5!n!xNQ>5YySI|2r` zfs5;ortATiJHYUhA)B%*1!)V#BJh4j-;@W2Zh?U{Z*J{-oIU_qnpOG+I5-5xOB$5D z?$dW)_uT${)1KcC4n%T(vJzHT000hKv(*BM0wgmqHZwM3W@RlnG-hQjG-WX`En+if zGA%JNHezC7HZd||IAoK91*i-$Gcq+XGB!CjG&44nHwJJEFga8)H99geIyEtqvIZjy zFga8)H99geIyEt~;0E*ov$qLg2o|pD(&7LB00v@9M??Vs0RI60puMM)lPwY;2niGw zH1~Ps4U<(8D1Wy}L_t(o!|hjF4!|G?v&Q>hnf=Vgn2E*5GL8J1K_SpW23I%9-XLOB zC+UcF-c2$zR7zDI8h|MKv=vs9H@wi+_W(E(iHL#RC#!afjV-wJ<7{QLSHV^O)i#}My z5S6I;MxVoq1H1t+<}0ss<7$d5-9^*+PbFPDw7*%KVE?ezD8$F)$!9GdeOcIyI960XlzN zQrA`h00D$)LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~PLmWoy!>>%Qhp*q<`MZ~FA zp$HX1t&x^1SD2{D^n6+?fo5YUGJf|!+=Wz0!Z3ZCQZ9zMR_#dwzYxj#q0 znztC>6N%%@Fm2)u;^|G>;Ji;9VI^55J|`YG>4L2;D7MDTdOcR(Mk#@fZ&Vce2fC2U7%TaobO}D zX`TT7XW&Zj_^Sg+c*%KcjET0fV(3_C8J@fDCn&x&aOjfw3DRWv_d@yQjOif6ui0`vGUJa-#1MJ?a1e4qLO-0*V48 zG&nUjW;HcqEi*SWG%YkXVKFT^Vlz1{F*G+cVliShH)b_4bNaX!vZkGz@uouhEkJtCHR?CP;z6-71NkHkkk_8(hC5yDFW;h`FqP&x_P*| zd@<3CQLp&w(Xva7rtUe#LXGY#)}Y=y6YNd&d~g-&`NB?*umXY9f6!M0aP=pch^A#l z14!xk0&9+5*W-TO)~p&m^EI@{NZ_U^AtE(EBvq>74wsZl%EusRHJ+$K$&P9rGR4+r zNdhKthe=RR@dy{ot@O*YYSgmba>Xi11!gBjTk89c|3CP>V7TXsB^AH-MW*f*S^$26 lc;{e!6H5LU((l#r6$e-EpjMSYt(X7+002ovPDHLkV1jx>ged?3 delta 857 zcmV-f1E&0}CCnp`j{yRakV6eD0RR920000i0RR92k>D8$FgYMGH99ggIy9350XlyY zt1XoP00Dz(LqkwWLqi~Na&Km7Y-Iodc$|HaJxIe)6opSyr7A5Bb`WvMP@U|eB965R zMW_&Jg;pI*Uit@38j=(jN5Qq=;Ll>!!Nplu2UkH5`~h(noD^N8#QTy$ix?j~-p6_G z9PYgj5Smq{Sv?6r(`_@8N{YGssu+KIg@ArU0YqeG8FP}9hVS~iM}VJqah~P>?#~rb z3l;+cB5{HlrcJy-JhN#VocD>NtSqa<=fo2x6-fNZb;aX1&Lx)xo*6Z>nR#MfzgX&G zrHfhF)QG2vW2&Z8zL4`+<-EmNtJYb&PTpa-psy@*o%SeFSi}+}h)_^R1yz68h|{T) zVj)BKNgw}+>zBx-kgEbljs?`9L3aJ%fAD*@R&i?5OA04}-WSLD7z0APK&#<6-^Y&A zIst;uz?I(d*P6iWC+Urj7CQn4w}Ff6j;8DZmpj1llOdb3D+Or_#Uk*2M&FbNhHim@ zHE(Y1dz?N1S(;V)1~@nb#!DKMz3$U@U-#Vpebb)b4-Q0fezFo)R{#JFc(c_4iUK4z zVliZ6IXO8kW@I^HEi_{_Gc92^W??NdF)?FfFgG)0HfA@Ig9WGzF*7nYGBP(aIX5yl zlQ#x%3NSfTF*Q0eGdeVru?8dxFga8)H99ggIyAH21`+|Y)Cgb*1Ugf)?vpqXG6)G2 z7b-tMy6ls35hs5E0ZBwbR9M69m)j1+AP7VY@&A9BeX^lCT-3TvlloSRhY=B#j(n5m zn>=Hh0HzpxY-+Ti)MecXekK$$xUkz5OB*^uYDLDvOGJHF23QB`|6bqL#pBuO!$2#> ze#LjUGCIX<=$=yya&%p>1&#i>;AmiE!?V!HmR4$n=ZJq$L7#P?)t_Jy>86!+fWmPB zTZU29({{D5csY8;t0|Eg$Hh`2BBp~(s7%Ebj+7$htrPYNPgWu7XEP6#VsEjKfDT+? z2pTDF;fw}m)5~*8t5>P#3Vmk#qPv7;^S)F11ApK?o&R&iLPaLpkwfD8%F)$!9GdeOcIy5ws1OYjJ zkF@1E0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$i)0T=>9PA+CkfA!+MMcD^ zR-p(LLaorMgUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwcfm=~MN0f%T4)jD!Ery{ z-Fw`<1B6C}X;vT(Xu55tlL;}KTNOipuMp6O0D_p6nPtpLQVO2q>mEM7-o<#9_qjhu zznZrg;1h}C%rI@@4dUrd+u*!U9APC{B|aw}H|c`Jk6c$;{KmQHvcNMVW+pvP93d8q zU95C5E14Sc6meA5bjla9Emk>ian>p|*1jiyVK}d^EOVXa2$ERD5+sOFP(vAi71)T; zs*_?NP5TKC|FG+q$fc003`ULxRG~q3{osG_yIZR;InhcACxGCK<9v()pM0R!8>#dSwh_JGSBVCcz^P1%+FG=)L|ct4|W$^nD7 zK<`?sxAs0xAAk&XmAU~A4uP>7B4w|8yt}8nw|~#H`}+ZBu5zO95k2Yv01jKT)B=hE zBr!QRH)S$mWG!T4G&n6ZGcq$RIc6|pEjTebGh;J1WjSSGGn0Y^s0=bRH#aaeH!wLf zG&7Sn25<{8FjO)#Ix;ajG&Ga31|thGFjO)#Ix;ajG&Hl{1`z?14F_B#Ffe9fI5s(C zEiyDPW-T;kV__{hIb$*{G&W;5WHd53Fk?4jlZ^*T3o$TMGBY|dF*-Cfv*HJC2n0l- z02Px|5Hbi01Qje&Iu@Xlju0q+_(?=TR9M69S3wfPAP5Xj{{Llq(xJK_XfD8%FgYMGH99ghIx;eo1OYjJ z%P7LT0004lX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmP!xqvQ>7{`4t5Z6$WWc^q9Ts9 z3Pq?8YK2xEOkVm2O&XFE7e~Rh;NZ_<)xpJCR|i)?5c~mg7n~Gbq{RD@LW>w5Jl@B7 z?;P&E4-lGFrdd4+K+|nAlS+!Y{Hhp#dWC>~L;*x(W*Kvml!ov6x<`PYcX6KO|L)Hf zQ41CW0wQsO8KzCVK|Hf*8=UuvqpU2e#OK5lCKX8h$aTfzH_j!O1)do-vzd8fUcXrC zVx@~&+0=-qiDRm!Q@)V%SmnIMS*zAryH4I=xS+2rbDj1mQdqeiy&%l-5@z?i4sjutxt2DgEW>yD=E0hc?#@RK2%vMU8?3&kSven#Jv2ZnBe zfi-V#?R%U)09l$<`UW^S1jb7ml)diLcVGA1{(aM)-wzH%a(=QBR#yN34S2KF0*V48 zGBsr|GG<|6Ei`6kWi2!`Wj8HhIb=C4IW=N2Gi7BkGB`D1lY<4Q3^6k@Ha0UeHZ?Ud zIg>XAa0@UwR53L=GBi3eGLy0fBMUG&R53L=GBi3eGPB?Y5dpK*2w(^Vv@ZqmlQ;D= z0=63Ql>tBsBmE;3`UFcJf|+YcC@!_CG2tT8ZZUw_vHb4sO$|jFJw8mM0%N}7x7Qgx zA{)B3ia}n6Pn1~02&fwh2HdkrqmDgddD0`i`w`SCM+wSHzkh&LwaEsS0AFJJyX7DmauI0`%8boA8?z_Yep>8WV-W%(U{;|VG)!i-TMzteKl#& fo_Y`Nm&ZT38WOE5Fs-@^00000NkvXXu0mjfaY$$s diff --git a/src/main.lua b/src/main.lua index 0aa61a9..6abced1 100644 --- a/src/main.lua +++ b/src/main.lua @@ -397,7 +397,7 @@ local function updateGameState() end end elseif offenseState == C.Offense.running then - local appliedSpeed = userOnOffense and crankLimited or npc:runningSpeed() + local appliedSpeed = userOnOffense and crankLimited or npc:runningSpeed(ball) if updateNonBatterRunners(appliedSpeed) then secondsSinceLastRunnerMove = 0 else diff --git a/src/npc.lua b/src/npc.lua index f649de0..57b9677 100644 --- a/src/npc.lua +++ b/src/npc.lua @@ -33,18 +33,38 @@ function Npc:updateBatAngle(ball, catcherThrownBall, deltaSec) end function Npc:batSpeed() - return npcBatSpeed + return npcBatSpeed / 1.5 end +local baseRunningSpeed = 25 + +--- TODO: Individual runner control. +---@param ball Point3d ---@return number -function Npc:runningSpeed() +function Npc:runningSpeed(ball) if #self.runners == 0 then return 0 end - local touchedBase = utils.isTouchingBase(self.runners[1].x, self.runners[1].y) - if not touchedBase or touchedBase == C.Bases[C.Home] then - return 10 + + local runner1 = self.runners[1] + + local ballIsFar = utils.distanceBetweenZ(ball.x, ball.y, ball.z, runner1.x, runner1.y, 0) > 250 + + if ballIsFar or runner1.forcedTo then + return baseRunningSpeed end + + local touchedBase = utils.isTouchingBase(runner1.x, runner1.y) + if not touchedBase 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 + return baseRunningSpeed + else + return -1 * baseRunningSpeed + end + end + return 0 end