From 964a1608fd269bda5fc632a618a861a527c6f868 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 10 Feb 2023 10:56:22 +0000 Subject: [PATCH] going crazy --- common.h | 12 +- maps_src/mp_gridmap.mdl | Bin 1423568 -> 1422720 bytes player.c | 2 +- player_skate.c | 334 ++++++++++++++++++++++++++++++++++------ player_skate.h | 4 +- player_walk.c | 4 +- rigidbody.h | 4 +- 7 files changed, 302 insertions(+), 58 deletions(-) diff --git a/common.h b/common.h index 6bb6951..49d2c99 100644 --- a/common.h +++ b/common.h @@ -111,7 +111,8 @@ VG_STATIC float k_steer_air = 3.6f, k_steer_air_lerp = 0.3f, k_pump_force = 0.0f, - k_downforce = 5.0f, + k_downforce = 0.0f, + k_escape_velocity = 1.0f, k_walk_downforce = 8.0f, k_jump_charge_speed = (1.0f/1.0f), k_jump_force = 5.0f, @@ -134,7 +135,10 @@ VG_STATIC float k_spring_dampener = 5.0f, k_grind_spring = 100.0f, - k_grind_dampener = 1.0f; + k_grind_dampener = 1.0f, + k_board_spring = 2.0f, + k_board_dampener = 0.2f, + k_board_interia = 8.0f; VG_STATIC float @@ -174,6 +178,9 @@ VG_STATIC void common_var_temp(void) VG_VAR_F32( k_grind_dampener ); VG_VAR_F32( k_grind_spring ); + VG_VAR_F32( k_board_spring ); + VG_VAR_F32( k_board_dampener ); + VG_VAR_F32( k_board_interia ); VG_VAR_F32( k_walkspeed ); VG_VAR_F32( k_stopspeed ); @@ -199,6 +206,7 @@ VG_STATIC void common_var_temp(void) VG_VAR_F32( k_cog_damp ); VG_VAR_F32( k_cog_mass_ratio ); + VG_VAR_F32( k_escape_velocity ); VG_VAR_F32( k_downforce ); VG_VAR_F32( k_spring_force ); diff --git a/maps_src/mp_gridmap.mdl b/maps_src/mp_gridmap.mdl index 676155a61d3ae5d944bd35154a1a14d29d199fa2..e20369b630d48456e26a3d2c25e5e9290f083a88 100644 GIT binary patch delta 71132 zcmb5W2Ygl4*1eqrIcbE17ElPqf;1ttPy}+wL8PhJ5T*AfO*&Ezy-G8{qJs*E6agUw zAq@mORZ&EdqCo`#k!C}_@$9Uf8}xer?{|OiV2nA(+P#@ReuBU3j)56{sm{c-37k+e$Jhr-JM;<6LdN>DCpj#C!;Fm+1n^-Y*a81!(` z=TQ~&eDbhuBobLAx}xWY1F`aKfC7a#z31ly3O!PhsgR zd!A?*riJSzH7rnITi*h8yfIJo?cBe6mH2p0?CNUU-i#?xtjOEH?DaP}_}Jc2-#uDO zd*vIq)FdYze=xSlRvDF6J$k1RRynrF78#xDce~T5Q#rN-M>NXU{SKqXp(BZpUY?Y+ zvT}@b#Ftl(($<1ShizAX8hjVMz=SPCI0&D)J93CE5sJgZLFAg zA#vg}Q<7Fz%^vQ-;F^2iEIVKuOZ`>!?wU!@RmegwfsN_6i#1JNo0Qd| zT#=mU_kq3@TIK7;PbVggYgZ)aD&;P4uTsm7F(ux9e5e1lGM)D1_KVkAvgfmhIwxJ$ zGUGJfGaB#iq%|GO70QY1uyfBOz16W)_~)9T=*pej`z3ihl`EVR*@;%AJ(CpOsbt~6 z<<-uGdZA7Bq~uREDH)!VPgq@7zAebG0%&8_c@HE|!|9w@^~lq@uAr<^RprQ=XW#Wnz&Mk$O!G|1YPn&uud? z`z^-_KB=}deZ&WSlFNPF-=JHA`o&zIc(+dbdC(<*86l#)eq=UGn= zd-jI9*X!>EdM}$pt34&dbBv@lQ_6)8v2#Tv9h*|Fa86{WeEH1NNvE`0)9O3ZKmMRk zd_lYW$|ok3SrmJR!C0qxFUlyqZOz-xytRKE;LIx{Nw3vA^3HP*@pSfmYTuK&k8|IX zxvz6>-@VSc@AIIwZ>Pun@mz9wt?L}G`#kr3klW{Y?gKrhciYGGjM^To!>hW7FG-p` zxoFN+%x$|@G51sWtqvdd$MJagaOWkWyOgJtyD+!U@qhPo-vzGEQ^4`tbQk9Kxl1@+ zzVibdJ`d@Z+Ak&ZkXqllD~fXh_c3z|xNUl6B}L6BRXAdCx^uNYws+Zly_9u#$GUfS zZr|SB&Uu}MIq%;K)L5b!x7iaLp5r9#pHZ&JZ@QhoTQVX3pk3&>y#w!j59BUjCA|kG z#?4HLo9S7Q*ZBeW`ICkB@*wfUQpFGRCY$54J=s4bu6z0%zd8Dk6E;T(F4 za-5%v_iZn9$Jz3{)-iE=kr`&?98b~WIh)VBss~j)LH<9*HkZoNeaJ^~5+op++zId{5hj_c%YvudUKA+3cLFwdv}Jr{Lb) z&fMo~CVm??!?fhw{K!72%*>p&PkeK}=IJc^XD5&0aLSp;dQ_V^hIJ^1Kxr;eV%gPSPjoEe6!6t?x0^jbAOBk7*o-;)4MUgg0=|m53;GXuIk8v$ zxs6`wknQu;t#R>HXNAVYKCQXDN1w!E>2n(;4QyY;8IR9;m!uB0_<_4{`zAH2{#iHi zs(+ptu*efroX!7hTdkb&##DSdzTM#JiJ707DvLcuofC||9>4eW^a?vT!IT%Cj9+}Z zZQ{DqQ_bzAp1V^%SmJ3H?OdYjZ^iEQ7k$V1IeqMoGuus_^}2Cb!24dFJDpxQZ2ic0 zZtc0_m_>4&tF}J4_#MaW`(STk^2+Jv_Ii6!X0ABAr{uUlow=9(6c*qAxi1qVcfV`` z8|_%#zS)0A!SURhy*d#~qgZ1|-=x0|~*+O@-47R%WXoSNO$*zSD)obH`>hGG*3!O7UkTdJ-G7TM=(YZ1&t=c>cL4=j_jnU6eej z{e{H#zs*Y8Y+q5lDRTRNG(VB}Q;*sD9pl98TY`7kX#WJ~VVP5R>$Y>dKS(U}`Rqoo zOv}C_c!zq2{}|7b`MTT{zpKWM#2!uOOpV^*Nr~Q(=Xzb|+N9U-ld}tSXYTqrPptE_ zo;~~g9nLce!xN9bI@v^D$&>wC(+fkMxud|0a1ZS`we1~F$d#uOXH1=JHec1DJgtAN zX|nfxi6zc&1FzN!s%4IIDEG>=)^|G1I(1B(_R$nGK&v{p%*2|__s;chaQ1EWvJ3GO z-t{N$TsCE@?`ED9-_5*@cX_&}Ox_wi%Hyr``*7c>6z{g+H}ZS)y!Ke?*p#iA!2yqF zXG*ob!5ci`+nQBu(D$q1zTZ=_-VOdD)_bUP?Tqp%drk*W% zOq91{_^?V>=r@pW7L`qDwTu(;I(7U|l@`g`(YC&o-S}|)%sBF@Z zrKz8)tgtyo82j|AsShdaX}qxt?+aU(8vjec*Vn`=^v1rlC3R&==U8vs@bJs4Th$M~ z5%9g9vcIf%v&S{Csd`&92e@dLOn;z4h~O&F_80+d4e7>ABRdkB{(uV7fn|C5M;= zk7&tjO-)|mH&K^kQ}Q?Uw#@J8W7@a!*7oc*3tD+QdK#o$Z{@8N={;1vz3+%A+eHmLc(`Z! zJMkTSubRnSwA4+rsf)LE|%!;H?z?V9L(4wcW98lGRw9+Kx$E)MjTj`j31`Df`~=#q3GHE3Kn-)Cm%EY10@Su;zA%ru_as$FX; z&sNQ@eIwI;y??lGfmtxyJ2m{lFkXmweCeb8Dq`s!~e)DsSz4o-a+m4GMi`%?54f9&?K* z-NbKHD@RTDjk?eJe%~U&XXb6xc(<=rNN97ht1oZLemRlhZ@>MlZ`z&+UvqPPr@DR1 z-1CmNM&(y~-<$S&lNIm&xv*y9-|vx_M~>}@FWNEl%v;g^m|t4?E|~G}=*S9Y(>vPL zX`7$)h3|~;wKG}oXo3x`>idRemGf;kjd!W_&Zgfkwbj`y-=!w^m}5$Y*Xe$@Z{fGi zd|w#vZqz>M=8G~5c6(=fI~4Bbn_VZITj`}^v1hne@juFg4g@qKSb zc=>hv6Rza#=DT8&KhW+SOv(SDHxS_&VP<{mP4W&qS;F_dDf^ig{?R=4nO5jvHht#p z=~-=Jj(K-`7MUZ*yjSx*_4QpD^B+(2*Q{5~to+|2yZCIOm zrf6E`$u~;)n-5)*-cj{)wyaNoFkfT;S3CY$e>`hj=E116%+u9M`lp!X$F&PfH?2q? zy{nt=ZFB6nw~}|!zHYv*#`~q(TGnoPdXt0Qd@W5pVZ_=c>G_X$^UXKizx1~D_W0$s z^rB|Zm%4Q}nYrl+SGxJ`GuIV*-O*7_%H_lt4%h~i} zW~)r?+{qK(8rgf967!X}bc9|L@mb!f-d)97r{^(yvUKjU`NyYc{`rD$tht`$P4V1i zHl5R1mTq|_{fIep&fC@VOG@MKy?^BM)G&!xbxVA)dVE?nbL6U?$(M}xnl9Z<)Bc*G zNoL+Py-rid{G2+VUl(7JxqeMOhmU-dxXc{L6A~A`=cUEz%c>3WjW^!B zA(gyqM-BGvH1T;u%7tIAvLt;_(IGyc>8{Z8r znl(`>etGMVw5O-)2Sjr$DkRP`#dxDd#>7Xtd;pj^WrKbkQ-@kiNeS4otTjHX1s5yiT7!tL8h}$Gi)~td?Bqp z>&!);YR+D4(qL-VaNk)|wxLdVKB0GmVwZ>O+uEw3W=S+#8|sj6Ocv(;t?xBx8ZyEc zX<`x;_WbK)gN}Je_b_l5tsQJN09 zl{kH6(af;)QVlB?sNm~av4-z!ll7=t+R?L;ukoSkzMUyCkA+;0^b9oKHk$mlsn$jp z=t*-~VQw@Fs0FUHB9A+HFzEIP6oDL51*KJUCcR-)|p$e-dc6z8mON9eNUa$Ak{XP7q<3B&kM?1W==U}Nr znTzv>`F-ZVIPGfl*)SX6Va0MGLd$Wo_OibBpLcQ+bw_Dc`qRgKnz1 zYP!z~DHk7HGQPnwh1E+wQ9teV?*2vj{@Lul-d`nFT{3K6HJ}E>$+Exm?n)=Fn z0bd(4dA=suWRgYIT3>iMZODS_i7&sr{2#Yq*Fi!4sZ9cz_g}l3I65djtnEiN9_5=b>-L~#Xu0quCkpsx^{(c7KIM9s z&Dt=9`YFfyh3aAW-XxFEnSL=@BSKT+ zhaZZ~_|;#_SLV>>^r254O`K5apC5rL+sgX4l!(dfcXM~*=#eEe>ZcqT8LHp))XM6W zzIxC5CIg9YQU7gZz>=^EQ$TS`uTFw)k(r)E_a9S3Oyg-f%lF|S=`%`p_w7v?IxVzbK5uH5(Z2Qi zyW`L~o@u7>d{wkv{$Bm18w0-Q%uvFtCl=KI>~O%hF=fsC(5d0!KXk~Sexu?r-*pqe zB6MoqOIan;w>&w@x7mExV9@6K{Vg~BbDtV-h)ZnSd1~h8ZH^~y^OQ-y6g=8D$Xs8c z-M(bXuGG?pP4Y@bPn)cjp{+f&OoLUrn7dMjuF`&a8l@a~GgQ9=Drv@S&}~(JU-Q%z zJ;(a0n&b_kZ9U6V3T_Nt8uf6_+qCWYg#J%2eD||84gT??>VJJ1KQl9-c!}(KGxyPu z`#qOaVs?iPFQ5IJRWt9~(3$!HrQ~;^H$CAgFDx_bIo_S!9!>9L<{_KLKazemWl!0#ws+~b6(tjN?gnNIl$dfd zAxtmBD`t7qu(fnpMLG1=4{Qi44f9Ep)e2h=M{l=bZLq5n%EPgI=>X!)# z1&pUzSljT?uYcR1U&d%(d(*v{+FNKAGz%-|>7SC;EbRSoefB0l9oE+KtU2>^*t?$7 zX3aBUDdC&P#``|*vLvBlO7~V_Jzv#_`M`~^o{`%hs_e`9u)yBa+H}*<7gC1r_sy_M zMRLCCKbG?iI2x5*a5^C*))SeMb~9{1RQ4YmOsy6Yo>DC&qTa|Nb&J(?{wDsV*gD$} z-mK$a*=&{mIA}sxY|64g#K1h^Js!*J{AKwR6Eh*Ab$In*5l;CgGju{kIZtV`d_qKR z&#&ef=CeubtMP|z+fDq$h;nrcUcI%IPgho_?%QK0R`=Jb_s>VC_oJN}UZ_>c=eu^F z-?R9M>eL6D1rsBthWFh6$=ihGOxZ~htvwUWm`M>G!@umd#>rkZS;~eV`K{{PEV;%s zo~-cek+W-X%>8D~xc z!#kYyZ>=&trbkq%F!5;U_ED4L{aFH|@9M&2;cMeWC*kicwbK^Y{(b3a4rTdYH&fYt7+1;!m z+@Ot7Q$i++MrpXQG-H9yT?B(%^|gPj9gek%Lv=LS1=fFM|BseNRz*-XIs7aVpD ztl%6&5dE2);?E8A7ay|N_z2?fdC}j$|6((Mpk=v%{&i|&B>`tU{K8^$h~Tql2RmiA z34Sg;#5qCSF$KGx7~&k$kzjJqAx=AUTxY1-$spjEyyrC(0cYEMd9f+|xdPUC?3cx+ zB?0Z=1PEw{6Kp1+Yff;AU{ZmB&N|UwC@6AhsDI$xMaD=h_l>|v4 z!~BiLEHZ}(ZmjF?9CMps*o*xgC+@gC!Ou@EG93vL>JRg8>a)nqA^5mne<#Qw_@K=Q zfAFbA<}$(Y`9uBVS1&T9zf{n8{|JBELyJsH0@?|hx5xwts(;(xDceloFWJ{Q!6|}$ zZ@=Ii6MaHK^T%HBcg@s11P@&3<3F=i^AK#F(Z|2^bOH6=(jpvxn1Z*$PDfgJl`IegKlX5=Mz74#(#P|r?W*&MAU&x)hus`m};Ax)hwiN5BZ$LdKU`07yh`J=zJ&QpmRilE}xz5VnwfZ$PIZ|9UN3HEL4l|2-}18sUc-QISO zVfMK1tiyyI2|jx;`v}rvoKg^i^Kq=1eLjD2Q~sPr|N6iX|6kwh0XnA_=riZ^0_9oh_ob7`esIoY zEHWAAWpBqmTV$xe>R~-s=XCA|*AH-xzD-cR>j1}z`(6QO+4qLt69hr6hx$|A(R+d* z{GI_$kU?;>%P@b3a(eF(JUM=dzoti*><0yxFAei=DXjM%0cRV1P45YUoi_$JWt#~K z#q@VhaEhS#^nT7U(LX9^5ZccltF!qCo}Jy-|H@?zMX>G1;ZCrU;FE#Fow7p&%u{BV zo+|%0Q)`}!+%wFsE>;w(K<1neNkXp1U1yMuGtJ?8lxdZaGMiO|?RR_hid zU_%H31dNbTOIM44;eKqV_XGj+^lPq1>L&%X^IC7+eFSV3WdjJ1l{Mp;HQH*1RUec<2rPGnV@FB zKH2kJQ84CuA3yE1bc6TRXn>&9`M!QS*i0~DN?+%gQ?5hT(Z9%P+GK!#-(<~0aJAR~ zr)&U0`D*>0U?suyq5b`RMrj`RnCFi#Hn&}8+u6k??yAa`x9aB{(~;nt_5J+!4%9qu z@W(~H9S9ydHNgMAdb{if&#Il$*W^riWPrbJeqA4ek{kN_WA4>FZV*;q^SEVMPv~t& zu&3%!KkY2>+!0g8oVS^o14EYxf=PJCwIu zc~ky}$k-yg>_2v&d}WIBXK?p?b~=}H{kO189DaM^I6qv9jJ=z)-Ht6+Dq^f?!yM@xbwH@Ody1V+@ z*=yYWb#TTmIhChRb?&2gL$=!0aX#8KA@dH$xsNy-&T^ftyFFX>eU$%vWU(UrcNQPZ zKJJ^BK55iYU;S^lyv?JRzKIIo6)dqb7g0cY(2|8@)XZu6Y;U%#x?FKy$}?q*Aj1HK!iS?>PUq|GD2I{l0prX3*5g z>@zvvBllf3KAa|Fk`IqpPqOUUfn%DxmVQsTF%?o>B)V&_?AZ| z-y1&8asI8R+z7Hy9gVVs&gT$9)yx6qm!>)#*0C9Neoo4PR)z zmcMViR|aMRWUdapT|aToN3=ZBQL z-E`3zf7IBLI`%(jGdZ6F-iDQCjHIC3!MA=*5Lo}eQTKO z`<9UNeRF;!aPKC4s}k<~R_RBA>~EF*A|>Q}k@OkQ{#MzqSVGQMEXU!C^wD%rLe94e z$GL8tEw}S;kE?E7=f6U<->L-nTlH`Cx^7Or{q8vRIp3Y^Z=tz*C9+`7=U3mDgq&|o zPUH5wl#ugX%DEEu>(e0T>w}Z~Gt=Pz@R@PmSoX7#@LxU~cYHPUGIi?hXDQ*oe3t(4 znQ55oGn0_>naOF@eoP$ae|=2!)HqAqk3+(L`8eFss@~%{qv_+5@LxVY=Jl)pKR+h9 zPs%g(fB5+1H1RL>P7}@^@x!J*1Ic_${@42;_eF5)&3F7D%X7_ren-~%d5n8pACqMF zWAeZ5S@+S@Cu4igC&PI(xsv=4tB=q2J3c;!N7Grzej(!BFT}qsl>1@Qcc5m@cYuWg z?mIwVl=%PG7e()AXOHbWI(|!@|NTzaHz4Ph)Hfjh&eQuk{{Qg4 z&UxQtKr!K&EjS2uGwOa5=@8bYIv?NPr!3E{ECnyuuFJom|CW0LOk?X^J8kE z(t!n%i-g4j8eS+E%S)_=m)aaP%dCd+mJ2I{`BuX#ZElsAbK}E!tAtmBf})(o320)0 z{tmBDu>cahF08g1W?g_@V>L_<0KL{~_zi*H@LUbA6PN|h)$p6b`k2G+0(C}tqi)H;yrlaBQHb+ge)i9nO+#tOx zgEm0b_=Oi!*~FlW;IMB0G)0%Oj7`zVKtm7&@5iI z4rGfxN-!O!tKq%Ey8@o8;eEn>fnCBw!_+c06XKy^{P%?Sg%7NTKh*j`9|<1|B+xL0 zp9lwRj3!UrLE(^%(d4N+EPQBVG2w>NQIT?lUQGqS|RG>*T zoGFm|OrSY5?0PWg&9uyV$Ar%X4Ha+#ru)JskBgax0@(FnPD~xlf?oY=>ZDunkz9GOY_^a@nz%HQS z-vx4i2uzQLT@U8G)WNLxr*KQ_J6lM=_WeatU~+Z<4Z9x9iK&BG@U{@-(fjDio5GM#ep`q1qqTm;Juz0A@a3e85^AMs>2AQLt!f%i zR-VF@0&OIF3-I&83qoI^gVk_*p`XxS7+^I#&;tFU)$kw-^kA#uAr|PN*}94&hAHSK z(ARLQ;SmCTcNRvX&Aj`fi+M)r-`GVJE<0M8fB=sYdI>#+aaO|t(;#o*5`hVllZ7b) z8lEUjvOLvlc$&>oGu>(!Z-y{a7;iQFvdzsBb8dVXkKAmJo@*8-fH9Q}nj_4$8pZ?Y zc~-+T0?@Bm4bv1rCs_^87ibnQTbIig3zT3wOjpAT1tUx|%g09-3$Q7aEw+rskPL)} zhVhpOONC`t!^>@Mg?OdauVy0$7JoIvt7+iRBS=OP4`~n*OQ20prSoj2OJl?{EP16cdtMZ>$ zd_nk0IB)ilU-dwAu>N`O@(1*6{bH^t75=N-8^W*V$^+4bJ-?fKLJAiy8I(uwdSzjc zkVnWX1f$K9l!Qr!2ynO%A>I_n=T+K*KeJYC=_^Cfd9h zTDX}0E%JCB7O14mLjqh;s4p}S;;e?N2nm8uXlON@Xo2=y4L7ntKWsJJ*aH1Xwyxrc zCJN#O+G}bx+)SW-#%PW<@$VO^bkAdwPYCd%LS3Pb@TApGn$GVRDjax9;WI)j;aQ=z zjnU+v7M>HHw=tSLb!~*UHb#@DuARX7h|w^0?S&2kYof)0ppG`#Nz7stz!c%ZoD2n-BR?kd4lyh>o+ZRENMOoN7959Y+w!7SKa z+(Td&&~Q(ITrYv?(Xi{m&$BfYvH%PA7WxQm8ybE=AjjnF02+2Zm=jY6_e#0-exa$J zz$WRpgpHOri^**fwptBSg9pEDHN4H{sM&5cjF&9z5I8p)P7%oM6tqsj30M%5}r^wuG5vn zb2ZG5;~C1aOL%CQTBc?|JT#1-X+}O6oiC6nxmS2s*dy!{_FE0R9{ip_9sIsPj+zgw zhVecWJ`y-L8va-y_ldwdXmP+XNgfbb91T-Mjt7xv3k~A|bZ4t!8UbkTKr~EK0L>kX zh7Stw<7j8DSR!Qv@x1Ib>9f5Y>XyP-D%+q8>7incSblX(2I1y5#QS6 zcVe2L0Hz2J=45C%OE@QdFVH+1{y`x3qd?PW*!5t}OC9_jSK_?H1%YYN@J|A{ivm-k zVb_B>F?BEtUJ@<~><$|KS-2wnB3!i^z9!&(T|mEZVgmT0DOoe>zQ7-nzX|Z4!YzT_ zWoOawU&3u6C~x*|quFVXVsdN}n}vq)@<`_uf(10}6+(niAuLLKPSfQj)%4)c@P)4{%xEF1z#pwsG z`%NNL-n>{Vs&L6FG9DD*IH9UgO{k7G<5d}`DOpRXEz}X}3J+Ng*Awas4TJ=%VV}@Y zNEGnUFtvW6k?^q9aATW$MBKz`adW2#lcJ^q8g3?#qqw=%Fdj|O91Ef07N$bg=yHK4 zB%czV7M>AW3C~&$w-)H(IpKM$VU_{tHdezd3D9k=hT93Wg6C>+AgH|(^p5FjxP#D9 zz;iX+N$4yvHy#?MwuQiKcxV{Ei_lf*W;NX1$>~w;A<@$bve`A^UIK-1Z-E@OeXNG@ zUJ&{UEQE&p3FP_!XS8z^{5$ZHH^njjuTi24UZSdO%OOY8pb0xF|V#aixa?@69qmfd>7C# z9zgR7M8h-!&_PziGzHMSvC!}&G0hS?nobdu1*XGvH9SR_D&V;qo+eBe*cm)DOf6G0 zAs!mWpCQZ?UbY$z%(BVZ;yG5sn0WA9tKoSzN6jl%!+11Bb1a00lLT@M!{TTdPq~0I zJ&RKSW3nS`S23$$Jb<2WHB2J_UB_yerU1I0)$js=X7Ltq{Rv1e6qt_K)vys333#rC z7Yj=Sb_ov+Q_Iv$h=+#pmkP^-fMZZ(WYQ#8jy zXn3_ij$v3F4dVq!GChlsCQscCAw}3=HN4a2-r@FUF$!SUggF_7@Gjv6p`SpLXn40kZm2+W zXxQ~&&PyGv1)X%p9uI+z7N5Iz(>vKs!_<~|W0uo`x~0OFuP zA$&+6N6}%cVZ0;4QGtcf@TUT~&jc1n!+7M52`r9=@yIdwc&)O5Eu^6)n9P^k1O$|HC+v#5WW)F84g6l)G{>_;-O*uuZ5Gs zH&(-^Z0@x9jMcE?u?>i`0)_Cm0y&Dlvl_;uDVk#;G@K=nV=5L$!+7MFp2g8H9yxX^ zkYocG6QGw^4buofFR~h@DS%#VHGEE>Sv*(6-wOfea6)1XYJT`SA=N0bvtGC4bdhFuTl#MHqoSYD_gRJ0nd zWOEOSD_ae_9$ZDB4i3cW7m^fJwHn5xQx;?)G+a#}M*}R5hVjU;11ye)@yM}bpV}RS z@q~br{K_U^8Ug4pZ4A>CK%cNNTwOVu#d9@WLtr>OSHm@hcmb~_*Pno7Eupr+)?lJx ze5PhXJT#17N2n`2WHnsR=IVSF(J)N`G+#b6>=)B4v8&-m0>k0C8h%)4 zEXYg92}nL7G!fVu4n)HgGc^<9q2VTG`OfGXffka@g~tUn+)^O-nDB(vFdoaWTvMyz zCvA@Ynpq9wkz<}mt%mW)Y5suo@gv|PhzZcY+Zd)1fac?ghG`0*`Pic2c!6e#T@BY1 z7!EI6>mEi_7oJiQ)75Y_;c4aA89X#hEmJcg9va4fMrb8GYc00KHbtKpdz=$EaAXYr1mWs|d=g#MgLJjVh(*J^m4K(loJ ziq&wEz;sMG-)eY)uuw3$3w&TUkfLNZ>)w-38#fK!da`~Zv{MR zzOx$667bG){mP;F0qPERKfp$mJ383TPM)po6`-{sh4a=oX;8Hil^mphIj7hYB={=V~}iU^+Zk z!{I`N^;{huP$HiYDX=vhh=wUxus9mVBUfBtaWoudmcOsRbw`3&p`_I?%K~&Mt6^FI=+aih zWdvHob2WUAz$|#KhVK>b^XeAEw1LC-D=sUr5qM}=#m@yI+e*`8#x3n6j5rBTeYM7<~`bn$drv#eCb2a?5z;Jl3hMx)OmsSGi zGgiaT3atfp1`iEW%hXJWhlcT=6P_2^SPi$expw0AR>Q6rKy(l&ggXl4DC%T2jMrJ{ zBCrq|?kbS$Ca^df#v|8VU~x2zN3Ms^lj~0);g}Sld)XMK5rFP(HB3_g-N$P91%YPq zTn+aX7!J?XeR=--Dbe4Wu7(E)0|j=51JN+GOwELNXc+%RVURG`YIumv4HXZw8g{&Z z6~o08!Xs>sqLEg^crOW~1QtTWqXlwf1Qtibc;v!!!cW z_gM|o6hPl^HOx>ni|1;1oWO8+RtFq0UWp0TbTvFtm?W?>9EgUgWojnGL&Nx!g(<>R ztKn%jH(fl#YIrKwACsb)0vdiXc&*&T!F>WFdn&i zY|AS)fH46&$!eHJ0D8XFFiipU0;}PL0?p#N8a4vM;h_Trh($tef!Nh>9if)M&fuY8 zYMGh|@z5~-VquA})M|K{%`F$Nuv%Q*DZ->^rGSQ43FIh#)oOU9InrK#G{PFIh1Z2O z0_&k+JaTIV)u#4Jt$OcA+V0*j+zJaR7yqpgPV0Gg*54buof^VFl^09^qB zUK40|w?MbVu7*&sgiL{*!9&B;YH0n@hy*4(08_9>*ekqiHN4N} z_KV-M8g@PSeStdo1A!bhA6gCL%@aNn_Hg|PSnw5_{8-H56u@}oJ`q?P4danJARM$B z#sla>R>L#`(1)!)%=M=$K=O#y@KJ$o@mvjmDli?MtKrXt`2wD+;RQmHz|P>IVQK?R z&4id}n1W-%=fW3O!^dszOYsS-Vb_Dd5~zc}7RXU^(rOs*8{w2U$h7Se6&_%*)7goj zGh!B&=`bF-vjPjFVQR>|Caks^#sg>`XEaO`0L}A{hSgBO>5hOG1|7oR3Uo^BYWO>W z$?#kaX9?#7JXgct3qJ_#3LYA!mZ6Vv6Jip;6#OWh7cN*0|73F)#h0vxT@Su2PzV1k zkfY{`)iB;K!c~EFeyL-{HJiLHW^oE&ipbp%SR4(XHzm786$>E2uflIu!>kL?zgrE{ z13>>_HT4XZea8JPzU4ddq#@(RIL z!(N*U5rEf{iV5-qPJ#e~LY}z0#GC{T-z|_UE^sg! zc0HKIsDn!gu|i3KMbU66fm~^UwMvHc%oeT*b7Bf%7Azy&BhVxozE>c}LM(`eT@Pjf z>fq9*WY4Isfd?fk3-<|VxQak7PPpG{7>`_4p`6t)9ywkDJOgML51@G_&~SMR>45VP zk>FvfBnD_6Iy78Os9U=^&8>7i5a6qEK2}z(~3jIPOfdN0D0}YoH$Tj2YF(?7-nlLA( z5N5&VLJNVx(eR@JxyJNKb6)CTEg1B;&{ANZ9_Q*Ip0G(KX9p;NT@U8O)WIzH zr0|sRwAJu4LM!1}ffx-_*IK|QM#Ikr^b7aYa{?zs!_N!k+6WwshFuTlWYocJg?2)F zfkn}92Z3Bifu_)~>je;;m_nEZI|-cyxQ10P8g3SK>$-YL7;#b4O2K#m?UsQG(1@#H$~uBH0*jX=b{dt zDohim3#=)vKP8fwVUsh(EJgwBdN3!Z4ralZg;@ekqT$&BITm6;H0*jX=cNvw$@QNj zF;|!;py5}9Bw@ad(d4OHAm9_DVd}U%3kA-BhK)dOk-)KN*!AYn9Vep@UMwsTmI^G2 zhL;KCmJ2L~hFuTl#MHqoxI$Pd&?FjOC6Hqs)(a3ITodNR6v8a{s_>fdy4CP%VU4g> zAV$N~y&>QeqhadS32zFV4=oM^t+&YyVh*MNrU(z_WN3J!!1dlFuqYaSOCYydU@q^Sbh*Xy+hTGo#DZv;8a$X2qhS`@CTtgyt%i5lT#9(7)v)Wq?{NJo zd`H+Nkfdn0)i7SFkS4GY8cr9;We6;ehVjT{3M`I>@yKy6tgvt42S1x_+765K5Hs)G`wGUPhe*_5Diny)J%wnhVkDQJ`g^% z8ve-UJ{EssHSBsHa{Uh|K_Pt5niL(f8pb;;91&Ou4IdTAeJZdx8pb2{nZV*`7?0dB z;d8X9JUA*efCWf>VKqz}0DatQn3e#V+ZGLfDbOmhtKky@qv5$4{z~|oi-2hZhfga0 zMqpp?(6EY~nVAod`CD9}viu6F3+RyB^HRsDsN36@-cci=yF50=WkT)%lBQ9n6ANg=#`|tKk|#fMiV}UO>aH3D*)Rglh}r zsHtN$j8|89NMIo}Tu&fZU*Ozm7>`^7u0M+tz?e!pcX~mqVLX85dZS?)0ch?IG)z+f z&HaRi69k$i&eppA2%o@on68E!3W)-qt6{&;NML91&@i=3&4hSp82@3RvG9o1aFc*d zHWfFs8g@*}&BaXwxP{G8^QhG@-ebb!0t=zxmIApa1Qtibc;o_4>K7I#fHBE&vvC8V zVLX85hC;(M0?^#iXqct|x`Ng4Qv%K6Ne7&Ore8@VwB*>NcVJ|H0eVCfkYITMbi$2Y0XJHM~R!kX$M(6VR}0 z!pj8;;S~ZoYF1he1>fbL^8{JKE1c-gvFwpgtM(_y+AUL%y!6nL(NODk7WU}x~qFttq0gm`GU zq}Oy9A5}c?hV*)2gMfzD32$27Xf?da=BRngY8Y>`utivFHN4g4-WGFid>D`1HvP$%2N`|4)(s1Ws~? z;*@MN$kp&p;T?h9VK>k)wM@%ocxV`Zm#|w%wHi*dxpZ*`k30n#f@{K=0)_A%fgCk^ zt%mWY>o-X6idhH^?-R)F7dST>#v}Khz~boifPTRw`TsR_7tmT&-5SS_4F)2hh>ZmX zc6WC-c6Y~TyKO8~tYdd~cXxMpcXxZA-^<)%+&jkq{GT=FJbSIRUyj%K#K*$pmDv#F zCn~dpKz_0^I~3%rau}Jf2o7uAX1+W$Zl`G>^JU?wWa~EbrQzw+ycs>2&APQ4>dCDC zOn5dtSDBx$+6zAa7i+<7lV1u3`Q@Ny=9S8>!Zesmu-q`Q6I=UT|2wHuL*UzPO#{`<3~F@L{dn%pZl1gE!;* zWH#&8Zm1`-{wLwn@L6U4JbV$FFZ1QATJYE5oA7P;t}=fgeh5E?pDOdu;g|4h_^mSk z9{vb_hQBKF-{GI|Z}@MluFX4(g#4v`{^mj$HH=o7M=#_tD)X3yJXU4yQOG^z?o*HK zbyzcH;#6T^ka_B$HcgneGPgaRE|}x#gPNH^m09ob++c9**)ktdwHbQk*SU=hux5%~ zGX|T>tfw|pn7K0RK^{_>9R%_$mD!;n`=iRB9{F`H_`{6TYPOmEvB>T8+RXmgbyRMl z*Jk#|x?#ba(UbY8*sWbqPv&9SziZZn*~08W<~hQgVXj)s>gMJS^VC{aH#cvXuhz1< zx%tBawU*V*Ef|`Gs$ijEaN*zp)-s#BFo(UM4lFzDB0=r^;BYdxJ@zbfyl6NlGmFK! zRMT0w-MLj5? zd$2jS;TmDh;A50|t)S+kXnZCX+&0;R4YCc_4(o(a+xvBE^ z0XK|2FS+T2jj~YOIQV9n4e7Cm$-GI}G;9`ZD)Z(+ZHr(tncE(Ft~uVg$GZ9dM`PqK zva@hXnYRjRHnO42ZI3=AaYwXD8-@Xv!@4?9)n8>;qN?0faO?XhQ>N5&HnO42ZI3_tH+Nvrx0czQn;jH;hRiOa)&$=xbKBcn!@~@+H*jz`B-m8uLxb93!DceI zJ@#O8?77~Gn>wV-hX*zL*l(bP&^FnF4f0{#!;k4TX>(-a(czdN^RRGK`Pj;QT-D4B zugslZ{@?KN$w!3al6iR5PDu7_eb!Su(f=c|xdm&c*fk=YRGIZ4pIn(81oA1B*`Xkx zTA5D^4y!jZ=a-4l9o$Z{&3t+|Ik(VjGml8^gy1dd$!ylG-B3?v{WIb-!&yP*vwfV3 z=Y(@BbEjE8FFrf)`BgJ>L1otS)-DVlF0(hLc2Tg8%zA3g#ra}$3)WOyIVWB<$gBr> z-CDDQKwi7n>`;)`sWo4cn#1ZPH=TvzrNQkq+su~*pQB!z+2`qV_h$5DHtW`Is3)`j z<>88OW#udVVdAPPUL9XknGNajwUzn0s+qaIGVA%r&^N?3lG#6kR=Y9STxPu+n|!$` z*xUeXs@)uJsmywiZ>`J@0{OPe>`;(zugrG@ht+G^1>YImPP5H?SMbld_1et-VYz?q z?JeoaY}T#aP)}z4yW@Mpy&<{jg!`&^fBZmYHl)W7R_2GQX6E6_tmmyg5^N;1H>UPz zu(`~4`}`Fj3pSToQ|<1Y_}(D19^^-B%?<+j;aampbx3}s*8F(t4*Rgrzg_SX!R<8L z%ufcNqh6cY=jn6zmh@yc>(*|sC$s)j;py;9Si?eiHar)e4=+^a7lWRemn!qiLC?%9 zmHE{k-HS}zdy?j@#neF>tct3nlnLjM#k1F%Wh5Sin{Rp!5go|%6t^S|N0(A6`4w<5?qYLhRch0%k}WpIo`ypWt?G*|#$H3loNkLjTG4mOwBVTOcRg3V=im|4SYVfM;AMj^s?1x5ZNj!;yU(qV(WgZgT z&Mp1O$~;rpJM0q%SLQ)s->_fMliBR{K7Y5@^aj|#{^5XdU}Zii__z)Zhg9Z6gPxhg zD)Zq%&&&~(`N%LV92JiCK#QZpG2z&7T(G&!4l_I)A8anO?>!-$7)Dg)lM4Cd%6v*8 zpIW&QPAlZqDzhK4?r?fIqcWcv+|Dgms>~~fv%=Y7xyrn3I47JN^kmL#)48?VYkC80 z;Jk2txS%p$7%mDIhf6B+r9sckWtI8zpl9Za%6w(GDqQXJzor&^ZMZI6A8anO!`u*V z3^te9VQvaHhg&N1t%ZDBWxl&lrk&BL>O@1ysA8anO!@Lk)3@=sYm%}UJ)$m$ne!Y<2sLXE`@>@QCg}1`ng?wUV zJ|Q@*Qy*WMhX=QF%i}8ZvEiNYZaAtk4-4;w_k*7N?#%gO*sZ+dR5Izha$=$!4 zoBxE_$F=+-mif!@dH5`RRhhpI--K_&ca{13@I&}9c)ZNE`zib!KCR53gkQq1KC$0w z!M_*sAC>vfLjJ2V|6Ry_Xsp=}k;6K)A2ON!pt+n&Uf;=^j11Rh@lW_STwR&33jc+! zu}Ah~GiKe|?e%2VA0-|&j21@e-s}9lB{_67?|4B)sxMbb!)fRlUaY7Fm0HwGEW}{g~4Hl$~j8+w%{)k{l%iqWp)^UQRy!(Z7#FJ_>0hi{%Umg zTJRi&Jg3~f_JzF`9AaPl&mUx7AULPYn_f{K{G+aq++l2S;?&B`UN2l3}T^ zbY)&9EE|>!%U9+Vf}WWbEAvW0&&@8t2r>XmtoLSC~nuQm4gzKkrct&6cB{<07xEsJdCx-LOYUC#lDuT+ajt!X z%=-oBcaQxm^8w+&a8U5WDD%PLkZ@?wlUd)r+)qzt{lmiHUh)yO;3G#CyN1O_Rpz$G zM+b9!Oi(j(Y-QFvE({MglKJ?cc0$PJ$@ycNps9Fbu(`~7Y9qo)m01t+$(7kbAfHm1 z9SZWPmH9NU&uKMJtIXZO?eyBrr-w6wUYq&Ma8~eU^kg>c)-I?gv;NtkIVWGvtp%SK z&JP!a3oG+QLC?&^mHCpOXXet%d|B|rw@J9XGG7t=ux=2tchgxogww1ah6bC<>@e$v zb;FgF`Km&`x-wr=$k$fp>k9e$%Gdk+Z^*)Fo%+Vgd{b~cx4gMB-x6*Ow}sm)^Bv*N za97Zi*{oZ;y`Ieacl-SB3HMr*?~Csb4}=FR^Fu+;?8BA$k)UVh(aQW-*e<`P?Y80Z z%KSvwCbg|YV{;33fUT0Z3^te9VKz(NG(1_EpDN_1EAumj{A^`@u8^M}nVU{{Aq%H< z>K7~XOTq2j^5x3>N_aKA7GAH+Z-h6)TR~4|vu^G7dNRN1^M5|zanB$LvnwgI)v)(7+)8N@Me-_j}Z}P=P7OeSs_#)U`W<9kp!&jAA5AxTQ*+C$G zQ<)tK^0%R}5WWjeYu#r4KDeD;oB4-i)5iX5HEa_2jte4E&PCui>{K z^Y7u0@Mrj|GXEX)%=}ZC{|$O({;SMg#0o>rmf6+kf*E64gz`l%Ir{>ew=*%gKEKpgVSoZnP&)Y zr`KklG0YV7+RQVDA;Fu`li6%;-MOINR6c*fz${_bFk5Awy=rsBb5`cI$8!a9JaWlC>?3nCf4(R#5Ns~9rrLtR<}&N4`3&7eWD#sw8YJ0?cR_3u%6m}!R9jS zsqG&QsLXnh53I}%0{NiI2l@P+3W`1snGX(5Yu#o(B)FYkoB7bNX3%RhuND00c{6%4 zn_b;TZm8)Euz|zE;o*qNd}P&z#Ya`Yb9_utGjnWZ)|)0A7aAK`@U%g3c(A$5 zdTPf9o6D@Hc0xF@GV4JeQJEbC@<}6e(+N%m#gi-ZDZy#=+RUd0x6^AgpBAPMdTr)G zVY=YW=*isq|Nn07hMF=P=nkicGb;0$RXZy_yE3;uJ|~#tbAy_h^D496`QZYezl|*T z!f-*jDA-(PJ++I2&1Ke8yChs%ne`xFR+$|H^5vni5S$9~6_xqQ;Iw*e=Bt9+>9v`! z4%Y;|HuJUNy5P;|$#H%o<^;EPLrs|tTpw--H&*7Gs&;dHOJ#0*d}}brw*@sbw^wGp z5&rt`jszQx$e&*GNwM0U!R9jSsofQ9F0-E6-Qk|ftOxnt%IqMJ@ALUv+!ve*^8J6Y~bPek??4c`LUq(czB{R zw>^F`nB%8{nwh67b9znJGYQWI510A5p!R&Qk<5B(F9e&*tf%&3c&Re$L4LV1I|yF( z$NyJq!A=GF)yn)@a1*^Y^XtLw^xDjCgg1j;oB6HqcJOBO-uC$mhTYl?HDxyZPIx!G zSDD|h+6VE6mAUQlN5LF_9MsHwQkfe~zj8kfHj>$|TD8xD&1Ke8`#jiOW<9kp!k3j< z5As))*+D|nDSllAb}Go@M?glWTcVfxBEC=3qG4EdsI!G_)1?e%2VpE1l7X0FUb zsy0hJYh`YGJX~VgAaj z2YG?Y3yhopuAh@YaY4EJm3w(3D>XECb7($cCY+EuSqAG zDBm_=*disFw;Z>7ksb5DsPE&EVZ+p9-XQc!9xrTHnYSsm!~E z&BJDXHSJal-aTv@oPCeVyl2=e{4eZXnfD3%hW&z`%x1R?E~+Q9{{G>Ba9}6rSCep1 z6@9n|SLU|IhXiwcXizhASY_7ptM2e%Bboh*Q#&HqT;~04sCZ;(Gi$013rAIEJ;+B_ zW(R?MOl5W`$j4UZ52NLEludOl0RgAK9`&kq-b3oG+Q;o@*f zu$I}}r9t0XW^)d)bMQQw9YAgW(D-HxZkz032HDB?%S?B$sm%LU?TpxF`rP)|bIq|0 zeN0}xLnb$!a9$N{WJ3dNNRK^OW*c4>UmmUqGG7_43Rl-!RyTJ|(6^TPYM;N~%(8#} z9YPP0+3%;SHc{}+GPgbUFmvqpVeOZhYm;p%^MqBqF4>{tbY(xKw-{-+8 zWxhVB*~o@6w>|b?b8N#K!j0jk%6xOUCEOaU8wV+Xo3+!gF8$4%GWRlFy*nE^JW#~v)R4ZRgNbx4`-4Qe*Bq0DWMJ=YxD?>?XZ z{Rt0r79;&&@}N39trx^GMgKcxAJIwUuAwQs68Hhugq|b?b8N%c;@86)LFPBZTjA|m%j)Ld3HsLW`1}Qf zez&_Zf``a_YBo?CJ@{ss+a7zEIX*ESH8bxf+f?S!s`g&8z4WJjYGlzFF!)(8U{GdrZu5EUfik;^+84q1 z%G~zYv&^vreHp$ApZNSOZ2ol>zlm*TfZHB>usOD&x8kM_Df72M%|+!Zf&<9>cToE$ z*i7cO#~x;m{|)~I|B-ozlz9~YvH37+a5$OUUY!3}Sq-uc?;JIMj1O)l^Jw`-wcCT+ z$lUhWgUzuGZ^_K)v9}=etyLQ%b+;dVynOyb+hh+m$Tl1^!(#=nP39g|b8~M%pW7aL zt~s`0&oFivr!tS*RB^nxS7q)r%j3u62JT%oGZR#1y*{CDu#wFDg4%?^<}&N4H528F z%`I3{t$&!fGV4JeP?;SB@+6hnp&(CMnI{VltC!q#7K)Pxx6^DhPZ6dJdTr*Z!oc9o z=*eu>t=&*hX8ozdG-2Ax)B60UtK#(Wpvr7Wj|W%g8LDPx#>%WWQ=!R9jSsVyH?sJudxpb5nlE3<<@Ua2xW6y%jF^D4n%_1es< z2A9)oGp`n!)$>KuLgqEXn!%gVlUd)b-B3?v{k6i{VV%mnZq?R{hgRmc7dKt&r(lpb zsHUL}E3@7^`6K&#!A3G~6x7}hHkVmX?ag3wnf27(2pe~DK7Tu9 zW|evK;IMja<}HHD>9v`+Z1QERpt)sb-a2d(ycs>2&APQ4>dCCXZP+esUzvBP+K%x~ zmAUOT!p^}U?-JAu?OK`jb_=@)8_B#!P}?)uTxLDBy@JhU)>Hdm*xToCkhleA=k-=JKbHi+MR27Dm4IUkiskQ7I%pDs%&{}45`{hpykBc2Z=KZTSJlSUY z-1fNfFoS$Re0+RDa7vj^3~D2S!^zzC*n`cn4NnRu2bYrhl%RHMaGB($6WS(wutB!r zX`wrK3o@S`)XoTQFLT>t8<=Ao9+b-+7`!!^&+L5uS-813V1P$9N7{qW3~a-*!r9@R z%6x9s&Wq2l%x#Y^22`D@+P zg3Nl5R}PJZ;IxoetTj6nw4!t(VP3JT9`FJ&&G8=Yl zH`J3^|H^PxxVkc5Q?+a3>nd~G#406Y%a5&+6v+3%B%`;)Ougot5ht+E{zZi16POr`U zQh2#~ojiXPUx{B0UX5>**|1x?p`OgIj@P}&F}>$#-b{WYyc1-8H>kZG-mA=d?}rb< zYnA!Ks(lo{UYYgOJ`QhHW<9k}e0-nQf;Az3R+$|H^5>P=p&)-znZFDUtJh}!D!829 z$efQ)_&R(OG~3MIhVOzmqbIXjw{}B4nf1R9KZGAE^G{X#IsT1rY$WqvLGABgbD8zj{s}ghSx>F`H(&m%1#3d?>NPU6gFqgo*6dJ_N3AuF z793Wu%{+Q=Ilbik#s?!q*BEJxS;3>kCL9@*~RTvn&89kZJy0shX$*ezhm?lhH znWwAT^zopPx#@(q$%BJIo*}3ip0P6P9hN_bm?^fA%!gNP=46}ev!2?JU~`$L@%bxm zns3}Z$gBx@lUlQbK;Ed<>`;(5tToS)n#1a~nP&|yH+akcw@{od9FuRrd(9G*ig96O}Uujc#IY-B^3+a7za zxp{ojHe4iyMZ;o2=EZ~B5@E^8-1c~>V2+m#YG#(H%zDd)<$`C+ynI-$$(I#^jSR4+ z+KR#EGV7_W6jrXxdXQJC%nky1)ynKpkek(N!K(+S)oe4b5!_C%&AetE7+5!~7lu~m^{ci)ykTW-d%RIF#~TMVGn-Uqy-mYr!9Fr??(n9&1Ke8+bV2bne`xVQ<)tE^0t-Pp|EX}FWc3Ew+~LM*=F7$xSd{`dB?C* z&}%dA9CiubjGoM9HxDkT*H{P!b`86Q-7E7RRogS(t1`De{$DW1dj~Z$`&4GVeZzji zK62c2?O(+MVw)RaLuv;Go6D@Hc2My4WY&XxaAkH7$cI#BhuX*IZ*gc9_^{x#2HMPr z2e;E}GanI-40>(mVd1FY&FIN&)}>u=52v*-WZ>v~0X{}}T#^7bafP%~hkITcZtp~~;HoR(A#lBac+a7zCIUW{Yj%1t4 ze8tFG({)7_HZ#C&lRelV+t8oU9T6N-<|~7mjch1$+hfl)$M(A_Tph0Q^KWrYxHeoD zuCKMMZt#YnZ!NPqx4AL)47uZEwVQ(PmAUP)XSwjTO};qM&Eb|{Q<-lKYPSWO$=vqX zgUzuGy%jfgNSSXBYWA_Q%zBNc;K4H6@Q!e2xT`YX9qtMD25Xtk-52z&Wj5ze%Z>}4 zC-cHV?bz(!`DP0bX`Ad}26@47bY>pTpQ_nZ=3}b%bm}(K=eEb5YmT#F=TBVcPj<*l zvwtV}@1rT&$c8c-(qj*n*@pMW4}=GU%nyZ!!y~np)y+K`^sQxnq{){{bE?N;50QDk zp!Rt1%`&$=_Aqn2KzJfN8Eh)^Q$g+N;7~HRz4ZkTHpn*g=jRK>PAT&z!_Ap17vog|HHe>*cx!-qojX_s2i<>D~SO z;J!V&H@vG)k7kW@R}Wr|%wE}=VXd%sA$vvE?3K+NW)169=5@n*W$U3~{V-=`_Bz!! W@TS%u)^n!5q2FyiXPWS_;r|C*>%J@i delta 72048 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 diff --git a/player.c b/player.c index 5c9f8cf..d86c8c8 100644 --- a/player.c +++ b/player.c @@ -222,7 +222,7 @@ VG_STATIC void player__pre_render( player_instance *player ) { skeleton_lerp_pose( sk, res.pose, player->holdout_pose, player->holdout_time, res.pose ); - player->holdout_time -= vg.frame_delta * 4.0f; + player->holdout_time -= vg.frame_delta * 2.0f; } skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik ); diff --git a/player_skate.c b/player_skate.c index 8777763..eb4e27e 100644 --- a/player_skate.c +++ b/player_skate.c @@ -44,6 +44,8 @@ VG_STATIC int skate_collide_smooth( player_instance *player, man[i].rbb = NULL; } + return len; + rb_manifold_filter_coplanar( man, len, 0.05f ); if( len > 1 ) @@ -170,7 +172,9 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) m3x3_copy( player->rb.to_world, mtx ); v3_copy( pos, mtx[3] ); +#if 0 debug_sphere( mtx, r, VG__CYAN ); +#endif bh_iter it; bh_iter_init( 0, &it ); @@ -180,7 +184,8 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) { v2f co; v2f normal; - v3f normal3; + v3f normal3, + centroid; } samples[48]; @@ -229,6 +234,10 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) v3_copy( normal, sample->normal3 ); /* normalize later if we want to us it */ + v3_muls( tri[0], 1.0f/3.0f, sample->centroid ); + v3_muladds( sample->centroid, tri[1], 1.0f/3.0f, sample->centroid ); + v3_muladds( sample->centroid, tri[2], 1.0f/3.0f, sample->centroid ); + v2_normalize( sample->normal ); sample_count ++; @@ -264,29 +273,38 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) sj = &samples[j]; - if( v2_dist2( si->co, sj->co ) <= (0.01f*0.01f) && - v2_dot( si->normal, sj->normal ) < 0.7f ) - { - /* TODO: Filter concave */ + /* non overlapping */ + if( v2_dist2( si->co, sj->co ) >= (0.01f*0.01f) ) + continue; - v3f p0; - v3_muls( support_axis, sj->co[0], p0 ); - p0[1] += sj->co[1]; + /* not sharp angle */ + if( v2_dot( si->normal, sj->normal ) >= 0.7f ) + continue; - v3_add( average_position, p0, average_position ); - - v3f n0, n1, dir; - v3_copy( si->normal3, n0 ); - v3_copy( sj->normal3, n1 ); - v3_cross( n0, n1, dir ); - v3_normalize( dir ); + /* not convex */ + v3f v0; + v3_sub( sj->centroid, si->centroid, v0 ); + if( v3_dot( v0, si->normal3 ) >= 0.0f || + v3_dot( v0, sj->normal3 ) <= 0.0f ) + continue; - /* make sure the directions all face a common hemisphere */ - v3_muls( dir, vg_signf(v3_dot(dir,plane)), dir ); + v3f p0; + v3_muls( support_axis, sj->co[0], p0 ); + p0[1] += sj->co[1]; - v3_add( average_direction, dir, average_direction ); - passed_samples ++; - } + v3_add( average_position, p0, average_position ); + + v3f n0, n1, dir; + v3_copy( si->normal3, n0 ); + v3_copy( sj->normal3, n1 ); + v3_cross( n0, n1, dir ); + v3_normalize( dir ); + + /* make sure the directions all face a common hemisphere */ + v3_muls( dir, vg_signf(v3_dot(dir,plane)), dir ); + + v3_add( average_direction, dir, average_direction ); + passed_samples ++; } } @@ -305,6 +323,7 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) v3_muladds( average_position, average_direction, -0.35f, p1 ); vg_line( p0, p1, VG__PINK ); +#if 0 if( passed_samples ) { v3f displacement, dir; @@ -335,6 +354,9 @@ VG_STATIC int skate_grind_scansq( player_instance *player, v3f ra ) /* Constraint based */ } +#endif + + return passed_samples; } /* @@ -589,8 +611,10 @@ VG_STATIC void skate_apply_grind_model( player_instance *player, player->input_js1v->axis.value }; v2_normalize_clamp( steer ); +#if 0 s->state.steery -= steer[0] * k_steer_air * k_rb_delta; s->state.steerx += steer[1] * s->state.reverse * k_steer_air * k_rb_delta; +#endif #if 0 v4f rotate; @@ -720,7 +744,7 @@ VG_STATIC void skate_apply_air_model( player_instance *player ) limiter *= limiter; limiter = 1.0f-limiter; - if( fabsf(angle) < 0.99f ) + if( fabsf(angle) < 0.9999f ) { v4f correction; q_axis_angle( correction, axis, @@ -733,9 +757,11 @@ VG_STATIC void skate_apply_air_model( player_instance *player ) player->input_js1v->axis.value }; v2_normalize_clamp( steer ); +#if 0 s->state.steery -= steer[0] * k_steer_air * VG_TIMESTEP_FIXED; s->state.steerx += steer[1] * s->state.reverse * k_steer_air * limiter * k_rb_delta; +#endif s->land_dist = time_to_impact; v3_copy( target_normal, s->land_normal ); } @@ -1062,7 +1088,23 @@ VG_STATIC void skate_apply_friction_model( player_instance *player ) steer = input * (1.0f-(s->state.jump_charge+grab)*0.4f), steer_scaled = vg_signf(steer) * powf(steer,2.0f) * k_steer_ground; - s->state.steery -= steer_scaled * k_rb_delta; + v3f steer_axis; + v3_muls( player->rb.to_world[1], -vg_signf( steer_scaled ), steer_axis ); + + float current = v3_dot( player->rb.to_world[1], player->rb.w ), + addspeed = (steer_scaled * -1.0f) - current, + maxaccel = 26.0f * k_rb_delta, + accel = vg_clampf( addspeed, -maxaccel, maxaccel ); + + v3_muladds( player->rb.w, player->rb.to_world[1], accel, player->rb.w ); + + +#if 0 + player_accelerate( player->rb.w, steer_axis, + fabsf(steer_scaled) * 1.0f, 30.0f ); + + //s->state.steery -= steer_scaled * k_rb_delta; +#endif } VG_STATIC void skate_apply_jump_model( player_instance *player ) @@ -1117,9 +1159,11 @@ VG_STATIC void skate_apply_jump_model( player_instance *player ) player->input_js1v->axis.value }; v2_normalize_clamp( steer ); +#if 0 float maxspin = k_steer_air * k_rb_delta * k_spin_boost; s->state.steery_s = -steer[0] * maxspin; s->state.steerx = s->state.steerx_s; +#endif s->state.lift_frames ++; /* FIXME audio events */ @@ -1219,20 +1263,24 @@ VG_STATIC void skate_collision_response( player_instance *player, { struct contact *ct = &manifold[i]; - v3f dv, delta; + v3f rv, delta; v3_sub( ct->co, player->rb.co, delta ); - v3_cross( player->rb.w, delta, dv ); - v3_add( player->rb.v, dv, dv ); + v3_cross( player->rb.w, delta, rv ); + v3_add( player->rb.v, rv, rv ); + + v3f raCn; + v3_cross( delta, ct->n, raCn ); - float vn = -v3_dot( dv, ct->n ); - vn += ct->bias; + float normal_mass = 1.0f / (1.0f + v3_dot(raCn,raCn)); + float vn = v3_dot( rv, ct->n ); + float lambda = normal_mass * ( -vn + ct->bias ); float temp = ct->norm_impulse; - ct->norm_impulse = vg_maxf( temp + vn, 0.0f ); - vn = ct->norm_impulse - temp; + ct->norm_impulse = vg_maxf( temp + lambda, 0.0f ); + lambda = ct->norm_impulse - temp; v3f impulse; - v3_muls( ct->n, vn, impulse ); + v3_muls( ct->n, lambda, impulse ); if( fabsf(v3_dot( impulse, player->rb.to_world[2] )) > 10.0f || fabsf(v3_dot( impulse, player->rb.to_world[1] )) > 50.0f ) @@ -1252,13 +1300,18 @@ VG_STATIC void skate_collision_response( player_instance *player, * components. */ - float wy = v3_dot( player->rb.to_world[1], impulse ) * 0.8f, + float wy = v3_dot( player->rb.to_world[1], impulse ) * 1.0f, wx = v3_dot( player->rb.to_world[0], impulse ) * 1.0f, - wz = v3_dot( player->rb.to_world[2], impulse ) * 2.0f; + wz = v3_dot( player->rb.to_world[2], impulse ) * 1.0f; v3_muladds( player->rb.w, player->rb.to_world[1], wy, player->rb.w ); v3_muladds( player->rb.w, player->rb.to_world[0], wx, player->rb.w ); v3_muladds( player->rb.w, player->rb.to_world[2], wz, player->rb.w ); + + + v3_cross( player->rb.w, delta, rv ); + v3_add( player->rb.v, rv, rv ); + vn = v3_dot( rv, ct->n ); } } } @@ -1274,15 +1327,23 @@ VG_STATIC void skate_integrate( player_instance *player ) v3_muladds( player->rb.co, player->rb.v, k_rb_delta, player->rb.co ); #endif - float decay_rate = 0.5f*0.125f; + float decay_rate = 1.0f - (k_rb_delta * 3.0f); +#if 0 if( s->state.activity == k_skate_activity_air ) { float dist = 1.0f-(s->land_dist/4.0f); decay_rate = 0.5f * vg_maxf( dist*dist, 0.0f ); } +#endif + + float wx = v3_dot( player->rb.w, player->rb.to_world[0] ) * decay_rate, + wy = v3_dot( player->rb.w, player->rb.to_world[1] ), + wz = v3_dot( player->rb.w, player->rb.to_world[2] ) * decay_rate; - v3_lerp( player->rb.w, (v3f){0.0f,0.0f,0.0f}, decay_rate, player->rb.w ); + v3_muls( player->rb.to_world[0], wx, player->rb.w ); + v3_muladds( player->rb.w, player->rb.to_world[1], wy, player->rb.w ); + v3_muladds( player->rb.w, player->rb.to_world[2], wz, player->rb.w ); #ifndef SKATE_CCD if( v3_length2( player->rb.w ) > 0.0f ) @@ -1299,6 +1360,7 @@ VG_STATIC void skate_integrate( player_instance *player ) #endif /* integrate steering velocities */ +#if 0 v4f rotate; float l = (s->state.activity == k_skate_activity_air)? 0.04f: 0.24f; @@ -1313,6 +1375,7 @@ VG_STATIC void skate_integrate( player_instance *player ) s->state.steerx = 0.0f; s->state.steery = 0.0f; +#endif s->state.flip_time += s->state.flip_rate * k_rb_delta; rb_update_transform( &player->rb ); @@ -1346,6 +1409,17 @@ VG_STATIC void player__skate_pre_update( player_instance *player ) return; } + if( vg_input_button_down( player->input_reset ) ) + { + player->rb.co[1] += 2.0f; + s->state.cog[1] += 2.0f; + q_axis_angle( player->rb.q, (v3f){1.0f,0.0f,0.0f}, VG_PIf * 0.25f ); + v3_zero( player->rb.w ); + v3_zero( player->rb.v ); + + rb_update_transform( &player->rb ); + } + int trick_id; if( (s->state.lift_frames > 0) && (trick_id = player_skate_trick_input( player )) ) @@ -1404,6 +1478,7 @@ VG_STATIC void player__skate_update( player_instance *player ) float l = k_board_length, w = 0.13f; +#if 0 v3f wheel_positions[] = { { -w, 0.0f, -l }, @@ -1411,22 +1486,40 @@ VG_STATIC void player__skate_update( player_instance *player ) { -w, 0.0f, l }, { w, 0.0f, l }, }; +#else + v3f wheel_positions[] = + { + { 0.0f, 0.0f, -l }, + { 0.0f, 0.0f, l }, + }; +#endif + + u32 wheel_colours[] = + { + VG__RED, VG__GREEN, VG__BLUE, VG__YELOW + }; int wheel_states[] = { 1, 1, 1, 1 }; + const int wheel_count = 2; + if( skate_grind_scansq( player, (v3f){ 0.0f, 0.0f, -l } ) ) { +#if 0 wheel_states[0] = 0; wheel_states[1] = 0; +#endif } if( skate_grind_scansq( player, (v3f){ 0.0f, 0.0f, l } ) ) { +#if 0 wheel_states[2] = 0; wheel_states[3] = 0; +#endif } rb_sphere collider; @@ -1434,18 +1527,23 @@ VG_STATIC void player__skate_update( player_instance *player ) s->substep = k_rb_delta; - for( int i=0; i<4; i++ ) + + int substep_count = 0; + +begin_collision:; + + + for( int i=0; irb.to_world, mtx ); m4x3_mulv( player->rb.to_world, wheel_positions[i], mtx[3] ); - debug_sphere( mtx, collider.radius, wheel_states[i]? VG__WHITE: - VG__BLACK ); + debug_sphere( mtx, collider.radius, + (u32[]){ VG__BLACK, VG__WHITE, + wheel_colours[i] }[ wheel_states[i] ]); } -begin_collision:; - #ifdef SKATE_CCD /* calculate transform one step into future */ @@ -1468,9 +1566,9 @@ begin_collision:; /* calculate the minimum time we can move */ float max_time = s->substep, - cast_radius = collider.radius - 0.05f; + cast_radius = collider.radius - k_penetration_slop*1.2f; - for( int i=0; i<4; i++ ) + for( int i=0; isubstep ); + float rate_lock = substep_count; + rate_lock *= k_rb_delta * 0.1f; + rate_lock *= rate_lock; + + max_time = vg_maxf( max_time, rate_lock ); s->substep_delta = max_time; /* integrate */ @@ -1532,7 +1634,7 @@ begin_collision:; rb_ct *cmanifold = manifold; - for( int i=0; i<4; i++ ) + for( int i=0; istate.activity == k_skate_activity_air) && @@ -1586,10 +1692,14 @@ begin_collision:; int grind_len = skate_grind_collide( player, cmanifold ); manifold_len += grind_len; +#endif + + int grind_len = 0; + + v3f surface_normal = {0.0f,0.0f,0.0f}; for( int i=0; ibias = -0.2f * (s->substep_delta * 3600.0f) @@ -1598,16 +1708,136 @@ begin_collision:; ct->norm_impulse = 0.0f; ct->tangent_impulse[0] = 0.0f; ct->tangent_impulse[1] = 0.0f; -#else - rb_prepare_contact( &manifold[i] ); + + v3_add( ct->n, surface_normal, surface_normal ); + } + + if( manifold_len ) + { + v3_muls( surface_normal, 1.0f/(float)manifold_len, surface_normal ); + + float a = v3_dot( player->rb.to_world[1], surface_normal ); + + if( a <= 0.9999f ) + { + v3f axis; + v3_cross( surface_normal, player->rb.to_world[1], axis ); + + float Fs = -a * k_board_spring, + Fd = -v3_dot( player->rb.w, axis ) * k_board_dampener; + + v3_muladds( player->rb.w, axis, (Fs+Fd) * s->substep_delta, + player->rb.w ); + } + } + + v3f extent = { w, 0.1f, k_board_length }; + float ex2 = k_board_interia*extent[0]*extent[0], + ey2 = k_board_interia*extent[1]*extent[1], + ez2 = k_board_interia*extent[2]*extent[2]; + + float mass = 2.0f * (extent[0]*extent[1]*extent[2]); + float inv_mass = 1.0f/mass; + + v3f I; + I[0] = ((1.0f/12.0f) * mass * (ey2+ez2)); + I[1] = ((1.0f/12.0f) * mass * (ex2+ez2)); + I[2] = ((1.0f/12.0f) * mass * (ex2+ey2)); + + m3x3f iI; + m3x3_identity( iI ); + iI[0][0] = I[0]; + iI[1][1] = I[1]; + iI[2][2] = I[2]; + m3x3_inv( iI, iI ); + + m3x3f iIw; + m3x3_mul( iI, player->rb.to_local, iIw ); + m3x3_mul( player->rb.to_world, iIw, iIw ); + + for( int j=0; j<10; j++ ) + { + for( int i=0; ico, player->rb.co, delta ); + v3_cross( player->rb.w, delta, rv ); + v3_add( player->rb.v, rv, rv ); + + v3f raCn; + v3_cross( delta, ct->n, raCn ); + + v3f raCnI, rbCnI; + m3x3_mulv( iIw, raCn, raCnI ); + + float normal_mass = 1.0f / (inv_mass + v3_dot(raCn,raCnI)); + float vn = v3_dot( rv, ct->n ); + + + + + float lambda = normal_mass * ( -vn + ct->bias ); + + float temp = ct->norm_impulse; + ct->norm_impulse = vg_maxf( temp + lambda, 0.0f ); + lambda = ct->norm_impulse - temp; + + v3f impulse; + v3_muls( ct->n, lambda, impulse ); + +#if 0 + if( fabsf(v3_dot( impulse, player->rb.to_world[2] )) > 10.0f || + fabsf(v3_dot( impulse, player->rb.to_world[1] )) > 50.0f ) + { + player__dead_transition( player ); + return; + } #endif + + v3_muladds( player->rb.v, impulse, inv_mass, player->rb.v ); + v3_cross( delta, impulse, impulse ); + m3x3_mulv( iIw, impulse, impulse ); + v3_add( impulse, player->rb.w, player->rb.w ); + + v3_cross( player->rb.w, delta, rv ); + v3_add( player->rb.v, rv, rv ); + vn = v3_dot( rv, ct->n ); + + } } - skate_collision_response( player, manifold, manifold_len ); + + + + + + + substep_count ++; + if( s->substep >= 0.0001f ) goto begin_collision; + + + for( int i=0; irb.to_world, mtx ); + m4x3_mulv( player->rb.to_world, wheel_positions[i], mtx[3] ); + debug_sphere( mtx, collider.radius, + (u32[]){ VG__BLACK, VG__WHITE, + wheel_colours[i] }[ wheel_states[i] ]); + } + + + + + + + skate_apply_grind_model( player, &manifold[manifold_interface], grind_len ); skate_apply_interface_model( player, manifold, manifold_interface ); @@ -1669,9 +1899,11 @@ VG_STATIC void player__skate_im_gui( player_instance *player ) "k_skate_activity_ground", "k_skate_activity_grind }" } [s->state.activity] ); +#if 0 player__debugtext( 1, "steer_s: %5.2f %5.2f [%.2f %.2f]", s->state.steerx_s, s->state.steery_s, k_steer_ground, k_steer_air ); +#endif player__debugtext( 1, "flip: %.4f %.4f", s->state.flip_rate, s->state.flip_time ); player__debugtext( 1, "trickv: %.2f %.2f %.2f", @@ -1915,11 +2147,12 @@ VG_STATIC void player__skate_animate( player_instance *player, /* transform */ rb_extrapolate( &player->rb, dest->root_co, dest->root_q ); - v3_muladds( dest->root_co, player->rb.to_world[1], -0.28f, dest->root_co ); + v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co ); + float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f ); +#if 0 v4f qresy, qresx, qresidual; m3x3f mtx_residual; - float substep = vg_clampf( vg.accumulator / VG_TIMESTEP_FIXED, 0.0f, 1.0f ); q_axis_angle( qresy, player->rb.to_world[1], s->state.steery_s*substep ); q_axis_angle( qresx, player->rb.to_world[0], s->state.steerx_s*substep ); @@ -1927,6 +2160,7 @@ VG_STATIC void player__skate_animate( player_instance *player, q_normalize( qresidual ); q_mul( dest->root_q, qresidual, dest->root_q ); q_normalize( dest->root_q ); +#endif v4f qflip; if( (s->state.activity == k_skate_activity_air) && @@ -1984,10 +2218,12 @@ VG_STATIC void player__skate_clear_mechanics( player_instance *player ) s->state.jump_charge = 0.0f; s->state.lift_frames = 0; s->state.flip_rate = 0.0f; +#if 0 s->state.steery = 0.0f; s->state.steerx = 0.0f; s->state.steery_s = 0.0f; s->state.steerx_s = 0.0f; +#endif s->state.reverse = 0.0f; s->state.slip = 0.0f; v3_copy( player->rb.co, s->state.prev_pos ); diff --git a/player_skate.h b/player_skate.h index 6ace410..24e9ab9 100644 --- a/player_skate.h +++ b/player_skate.h @@ -18,10 +18,10 @@ struct player_skate activity, activity_prev; - float steery, + float /* steery, steerx, steery_s, - steerx_s, + steerx_s, */ reverse, slip; diff --git a/player_walk.c b/player_walk.c index 0a6a485..0b84ef1 100644 --- a/player_walk.c +++ b/player_walk.c @@ -729,7 +729,7 @@ VG_STATIC void player__walk_animate( player_instance *player, v4_copy( dest->root_q, player->rb.q ); v3_muladds( dest->root_co, player->rb.to_world[1], - -0.28f * dop_t, dest->root_co ); + -0.1f * dop_t, dest->root_co ); skeleton_copy_pose( sk, dest->pose, player->holdout_pose ); player->holdout_time = 1.0f; @@ -739,7 +739,7 @@ VG_STATIC void player__walk_animate( player_instance *player, else { v3_muladds( dest->root_co, player->rb.to_world[1], - -0.28f * outro_t, dest->root_co ); + -0.1f * outro_t, dest->root_co ); skeleton_copy_pose( sk, dest->pose, player->holdout_pose ); player->holdout_time = 1.0f; diff --git a/rigidbody.h b/rigidbody.h index 3cb601d..58b416e 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -1365,7 +1365,7 @@ VG_STATIC int rb_sphere__triangle( m4x3f mtxA, rb_sphere *b, float d2 = v3_length2( delta ), r = b->radius; - if( d2 < r*r ) + if( d2 <= r*r ) { rb_ct *ct = buf; @@ -1499,7 +1499,7 @@ VG_STATIC int rb_sphere__scene( m4x3f mtxA, rb_sphere *b, int count = 0; - float r = b->radius; + float r = b->radius + 0.1f; boxf box; v3_sub( mtxA[3], (v3f){ r,r,r }, box[0] ); v3_add( mtxA[3], (v3f){ r,r,r }, box[1] ); -- 2.25.1