From 4fe42403bef6e9691bc2dd9630aac67fa81d9c86 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Thu, 28 Feb 2019 21:46:04 -0500 Subject: [PATCH] dynamic entity list, entity-based touch events, Jorth coroutine jump --- defs.jor | 19 ++++++++- game.exe | Bin 113186 -> 113325 bytes game.jor | 113 +++++++++++++++++++++++++++++++++++------------------ game.prj | Bin 5281 -> 5281 bytes jorth.c | 7 +++- sprite.tif | Bin 4078 -> 4078 bytes 6 files changed, 100 insertions(+), 39 deletions(-) diff --git a/defs.jor b/defs.jor index 368f252..a3578c6 100755 --- a/defs.jor +++ b/defs.jor @@ -8,15 +8,25 @@ s" jorth.log" open seekend deactivate const LOGFILE : 3dup r> 2dup r@ >rot r< ; : 4dup r> r> 2dup r@ >rot rswap r@ >rot r< r< swap ; +: 2= ( a b c d -- a=c&b=d ) + r> dup @ ( b v val r: flag ) + if swap then drop ; : max ( x y -- x|y ) 2dup < if swap then drop ; diff --git a/game.exe b/game.exe index a4f94c59822d277f74283f125638a0e08faf8ac0..9b275877327f499547a61bb38993d533a4b1965b 100755 GIT binary patch delta 23151 zcmb`P34Be*|M$N$Cz~WBcTGa}^=7}>V~Y@CsU^0M5LE3|Z4p{67pWz=D6WdCEohat zsH7ZPN~@?+TZ<~HRC@^#TkP)hnRB!F_y2!>uh+Ajyw1sc-ZN)r&YU^>Bx~(a8>lNr*}71(9x#F`XyA{ zWGN-xlz+4Q!J}LP(sHadX$Yt!O(R3TO&^6hraV^CGj`6>-k}!{>R?&sU|?3uJ_n84 zmG(vZo#d%J$NFpe9}Zm|osxU@%CXL{B)BFxUFi+%Qa;MHD{s=aRi61_kN$9}UcYm&rzSdKJl$u&kxBad{bb{?;%WftUE zTc)5ev;VHlgB_n|7Ff5~3cl}az9EEd@^krqW{#YLRJs>ZN=VrDp(}Z`tkn zYhp#Fxg%d!k!iIwtZnZ297bl8V>RB*v%Xyyvn|t>X6Ybt(kZ7tZ&-HTBxJ=)w1K$Lanmq9;{iL zTZpaFOL3bl;hHXJus1a+9>X44zkMoC^~kZ#zMW^yw|u1uF+HfxvsOQ?bW;*vMby?Yt+q10l?Tx(TS(SDa=Bv97BcdNEB zt)JRt&$cjKz1ORUbvtx#m8WMi`Q)aiA7M7Sa8 zhN!$8>!+4?bp@t^+APYpXF9s019htnoBbb{| zk&XSPngOwKHJC{C3#bFI@XJH1A+NK3GHi0R@Ddr5L2s&k?);DW&ZxK&*|sM#jC#}DLhPT_J`^V)g5XG)GrU@Q7Ez`^g%9Kna91kx zH+$N{M0kYx&d}B>^9i&2Xb$y zB~T?$tD!UxjZh{!eL78jhwrHeB*Yjl49ykZM zw`$}Q*w(+{_Cwvio@X6iBR_*W1$6-GB2=#$Inp7=x)ZB07|N+eE_E^GSSP}rfHT3}y)SRUnlD5B3N;q$(tY_a zsP0f_pz@%O-j{tGaVdg22bB%A>%QC_$^dl%DhXNX4Q4glc>} z&t#o(UzXu+UCWcNz&*Z(qwT(Y6Y4zF-%$TR4Y)4{JLOn^gt`v(3sk53azCi;P&c9W zL8aW6=RvK5s)pJO6?|Xb2elCD9@Ixr9{1(PP*b5En&9TbJ-sIKW8fsMGgkGgNyh8&nUd@9)W1p%S22yBupPsIB+p9Z>#I4p5O$EAPn~G`|~^ zGn5{x zGpNH*8TaH$r1~7nA8H3w^gWp&)rU|)Q0t+*@5#NOW&No`9 zHc$ajmbUdYKhWZL>0MuTnsI^eTp}v3$x+~joI(r}L4XEW%P43FR?&$RI!WF{J zfqQaCK8o|%XsCCfCPG>7$UC8Op=Lt84E5_B`4A51ET}n9-J!m_BTs=cLd}P23AN>p zTn6O_wFt@pwc?I^8p;)FDU=SX*mOspkJHG5zw_j^a2#&Z9eHiz9P3|DpFrLEJJ0$G ziiA1=^(oYOsGK`;A=DnI&!B#UYJEqpg8B?v%XB$)-ZxzAfK{8Vt1?Y7ErH+j1FHSEz$f{h)rjEk~lQn?oIi zY7Zsfmi18KP-mbLpgz7WXF+M8u0Z)iExs*}gd!8170wOLbX%Sdck?QaUZ{sx^Q>cU zD|_i2)P1O{P9I7|e?@&Fe<i;KEqN2rwI;8!$^6-5L-ql<%Y1x4uPEaZZhb4o^F~hZp1qv>bNlt( zea>;g1@n!{W@i1iEIa~j&zd`DNI}{5tjw>8fB4`@v3`3NqAZhxLek|dnwYvPh;CHS zE=DCyZ{+p~O^5lS=I&Bbz{;QG?PKJy?Js&Iee5~ZvZY!&jzYoZ<-uKF@djQ*Gvz1k3 zwRGB^HPHvR-B~4QiDl+$xcbJZ$TATfvCE4rei1yeRNE2@(XgMDoszQ^VJ#nqL z$&kUt`k{l1{fAjpAz?u=K}ma$CZQHZ(;icyr@RL{X@eiGcxb5^UU_nROTUn4cCNfA z#Lu~PyKFScy7t-1en!Ks%T~m7G@{G88(DH!o+Hno9JvOWEDgjKD+!BkIOO(QGuLt< z%EwfbWxiA5fSOIGLh0HXDyz!Ell(*Mt+Hx`%n!{6rEI4MamY0Hxs>Z59XI=DXG`Zw zoabggTT`4nH~VQx_R|W={5nwVwYmD@T!iO3$kQpOB>Pzfed%=S(uqrEefwAZUrI5S@WDbmRZpOtdr&A=>Duz`SWNmrm4ybtG1bQouZGU zVvmb+Q89}lb`863`7zed=enrmrPxeXobBLdo919XSjm(2n)Np(I$oSxQ>A1GdRB3E zjXC=v$nsm9U!SV1;*9F7!F5mdMK`p${r+3q7iT{;XFnGkXx3L{MWgV?=Ip2TaJ3SC z*wA+0-m!Fv_jeO*Sy#CU@mbztx7}&jXV@K%BD;2$pX2*`lpwLWx^js5;)yHfIh`yi z#!xhVzA=RrTNWA(UT8CC^t)j^59K7YwR3aV6z8rju^cnTCe6!rb6Su)(chN3AlH^U zFIR4al#{%bV|iXK(Lux#&Ok4mLoD$LtxXGaLroVE6AmY0(Pnc6ZlX(StAxtAO$qy^GZ@PCe4j-)2Ca*HiB(o}r3_HlZ|U|c!-D{_Fahm*Hc-f&$=sWAg)~P>en1H*g8q9IdrgfT)iAN*!ps9K;|Af%GLX#4ozd( zkQQnB^N76;)>kjdmy>d==|^$D+8@~;&9m+}E4wG>Si_+5po~!K&&oMaYN+8*eo%|f z%44ByNASoDV zLxn>vKO?IQIaU`aE0hLm&Kda@u=0YvQM-1{mGu^5^UxOhe%S}!)AtjXZ{_I>C$`3g z;RoK+^>f{d2ZtOyYw7#tShxO!$2?@P^+KMt;9^n@*0C&T?%h@2|Aku->%xoj3B2_! zKw^$Nj!{45SJQyIIm?p6wjGdWpfI(tZxw-J8po@mTUdP zUA(OmuX8J1?a6GVld8%>^K4B*^W63pR*Dx**AJH8Z_${sIE&P3yZ6!oVYJr`SHq1o zeWJsRA2V@=i^|t@u$*YM(IYN@`nwMFuB-V#(E-oa@;j}I%Xi!RZWFVA zdcMsmJ-@`cf+}6)ILofgh-SuoPnzhEw6~I*57u7@iuGwBS*ZDzv?m`p&re|!ga-HamUzUDt`}Asv@o9*uYFy}+YyI>QwrC=+ z{GhUv5>*(0EHbIkTijE~D+c70w0BsB?jlaz;uK={+bz%9`gv}zs;Iq<$u&=MkTc4o z+GVi8iTOzXzLRJury1eKeA_dbc+LYSV?ObTO55Watel18@^MTOUS_UoC)OEIw@zmL zI+^x$IEm}FvQCEOU{-9%ngLYUWXAK1{6d$5PHP5;{aKW;3etVX^SJy%+%T@Pc(v~& z8S;}YL)(vGM=VF%`(k;$edmxaSvkscK}@5f{jSO_k8P5RZIaXcY=<1#9%;$#5bM0F z>VN~u>n$Z60%AWMkdtezX@YmW2L=^<=RoKhVv}==GUO^7Iut4>p~0Awj9W{~=?>{^ zoW&#CAIrGxUFag$vV*X6>sSG^w_{T*fA2U1rd6kF?2skAb5heo*d1c;;pY0wqG9}x zHHYkti|#O?^D91^2b8?GbpUQ8D^=zL56+sai=Ky=t{!ySY`N7rij6C8+6A95lul?q z?RMOJ=fMGD6Q`6dv&40Mj?!YgWn($9TLzZp-6FBP&}|r&?Yh6!#C0GmjJCM`{+9Rj zZ(Rpk4t4LQaUGawD|(`vBwcfnPF#tzZJ?gzh8{Z^cO6)MC1;ZOZ5hz3F#5F|@zcNC z;BLdarS{m^ZDY6cZj-vd-ECGkQ@8cq&UK&IqqN)RZZ6%;-4opO^a_>vO(O)4oA{!~2%>>Crc~Z$jUc zzCZPyoZBq7W$u^#ZYn?T_L(RYdh>gt3-nbec#+av|wV0 zc`~nYU=y8+Q^N}?16!uTH8x+g_95}b1`2_sz3V~?!0QYJy{*Q|0pHs^TKb1to(^cO zHx!sBI}{f>6u;~A{Xr)~0nzv7RD-3*Krd#nj2sx|5?VkL1I+#g%aVa39YYI>{lga* z1i6G46nErcOJu<)7H(Nwu*#5LU<+@7xfSLNCIqjtD z0$R{M;;w*}^dsp7w4$#lTtI93g^U6+sE|xU1+}4tv{FDO4W&~8+R}dVcLTJe)3i}Q z7VROMfcEqS`MLu-kW8HgWYY?oB%mXGPM-+qM3?BQfX;M^0viLm&>_kZ@DhDXg#xA=@fP8wNR(s&s^d3OFX{S&FX$Kt@P(VMCpC@1t zEuh{429uda3m8Igkx9VIw462y7)q1rseo5#8g*3xhS7A&7ciXOp-}=x&{UctU?dHq z`2t2!IaR1oJ@3&pj*bd7hQ^Xjz^gQpeAR%l^d`j%c#Yns2?EB^Rw@(lI{iUk3wVR3 z&|Lv<(sf0&iL{JH3Mi!GG+n?Xnna5MChy6#gf0p77JWd~0^X*@ zL|VWU+CrWJ-l3BeDd1fiLFodfQW5nRFpa*WDFRINC6x)7PTS~^fEhHAP79bx^QcNd z5q(B_oFcs6qeYY{z%+|y&~QPs=@`usFo(XO4+PAmy|hk1F_qGB0VQOi8Ubc1A-x_j zk0wwL0rTk%8Yo}^y+)%2yiaFnl7NMDg5m=Ji|7YxAz(4xrbdAPi;1e~2SH2d4&4{< z0o@`E2Ag;DTfu;jNXvSM0aj25QyBm&DU5{( zSVd86gn-o)!G095hVafzKpC0BnG^|HOQGztfOTYGt)c6^jutx&EpllYF0N6|&SziHLXrPI` zDrhV9WJ?8nNiVaX1#F{H?6!b%8pNU#0TncjT}}dgMZ=kUGGIHs#&QJgps{SM0GZ5e zrGT9@f$bKsix#ny0=}j<*dGGEp?SVK`-eq42_!0AO0uIwd za>UI54)MjzU=nl$^BMt1F$cH6;%Dm14z~mx!)z6B9J6aHEKZP$`L+g}BoB5>z$xlU z2^oN2s5gxl@GFgBUkf;m!a~{r&R}jK;4J1o0)E5XGt-3SIn2W|vG^Uca-(w|KqUK!y;(l+$O8|)tVcP_l9H90Has(U}-~=#r z1vmpf6yO5r*AvhPaJm=36bb#-K(F1-E;8h3SfWyN00FDZ1S_jQg*vok^zA(cC_|<_wo62Si z696+yKp?~ZS11T^WkLlbZi9f3ItT?E7bXm_Iv)@Ys2Ko=Kw%xlJ-Gp9kbp?QPytbZ z5dxwCV+6zi(Aga+7BF5w9K-&fBq$zgiU1>Ent%krOaY02_XH#XW(!CL%oUIVC=rkf zm?t0&us}dMV4;BKbjH9EbG9%S(35fU><8$@dNZ|v-bk$P59ous zhUNkK0>TC40u1?pet;+e{Q)ugCQu$IPN;mqxB&pX;Gm@f1_G7|C;%)MFbJ?#z+k{; z0Yd;=1-uLhEdUG!gbR2DU=T125G7zZAV$ClKzhMBlOs;+I5i42ianwsg8`%26gEP@ z81@#MG#l_L8^1GNmYQ?0J4B_=((a}Iliv^0=xlm7v@c2JOPui%N)S2{|!tH zY6=of*`St zruSJ)-DY_w5C|mzQovBZ}lo{>$l%nySMb1lEg54}*iFWvqCE25vGY6AheT39X zjw@I)?G*>!N|sW$TB<$uDjaV%QIFL~tW;WnvX+^p+07c3PMM-FuVKw8M?e{CVUJo{ zx7ND4?O6{nDckyS-3EP92lZvFsVk%2Oh+eDir>Im)L8%IeV@iRoEYc1Olqg*PoXhJru>#ftTmJPe+8$WbV_^-`ylew^eH-j@$ z)i%RvQ8UpDX9fJhOb(pnYJk#=w*g8k z-eHZH(u#MPE4v|9zsKB|(u(()J5yS*hBanN<2_)mwdbF|Sre8hQj11Yno%^G(t4uN zl-|_PXfR5f{oggiL-Y?E^yKsi-OHrVWAr!$><2F5?8hr$D|?Q%13befD&6WiKxxnV z{VJlwrPf_Ui8Sv2b7D#4B%+iqtRzPH3ORTJl$=Ffm8}tj7QFeKKKHk`R<>)ZEgOtO=2cWdf57@!Vak3wv94C#qzx~|O z6ls)Fn*o#!@&zcx`vH^|7JE}EzJ70paq;MZtC78T1M06v;U?vkKU5?@xw=PTJ49!8 zhz8*1j~rqEO4k+laY_|MM)PnFu4JS@98YC^@Fs?0c^f7SiOo>jOx%em%}{Utsf+rD znQ9aLgG5T|dPu6XpRx6-q%Gr9J*j8s(TYv(EN|tA4FI;|^o8 zXOxQdm5mm4R5npGzLMi_tc(4$HIKby-}h{xcQfQwVc}#k`HZ#v1*N_w5n_V%~=YcW^Fr0E_uYgqw3G5?P4( zDZ=xV%}4nN8#rt90m9B;F&hyU<%=#P=0t=s4jNxSn3#9;7{yc$ZN*c@i_=7AUf-$v zyX=e426q3F)qK*S`(75mKE3-Pc41AA?oZgcRe9Ybc-PO(aX?>{v7wpH)o9 z*nE%UY@x>qw%p?+Tj}vDTkUb0t@Sv=KKD4wDm;E;J3M}8J3Y>`Z#*ur10EOIPac=p zQI9{_DUZwStj860%i}M0&*Lh4?(sMC@cf6VJg+ft&r0U!d4mOc-ejqsRV>5v7R&Lx z&3b#@VY!}n*+|cOY_#WnHrC`>!=`#ZU?$IptjO~boA3FUed76)ZS;J`zVNiMa!=yh zJsJPnlk+{E65r?Pz<=^|QW&ey7%^YyBhe4DB@uTW+19jZ2bmnxI*R<-3nsM?wMAypRtN!5WL zRb}(zs*e1ssuRDd>ddQEUHBc5_8-J$i!ELG>&ec7+ySf+Gs(W)Ubzk08-H-dK z`||*G9uHRM^CX&&(^-$hL{R;1+9>xc%hx5Ve5&UKK zNIqI^8qLS5$MA9LvHVT-I6guB2A`yUlfSJV&u6J8@cHVAe4)CKFH=wE%hhl5)#`V6 znfhJ6UOkn6rk=*j)zkS-^-TV?`aS-wdKUjqJ)8fcp2PoA&*fHiF|Sse`CauqUZbAR zAE_5`cg_1;t69YLn#J5lW8pz2%@Q7=S;`|dr94KnjK^y}U`Ggl~Ht>a-jeN0Y6JM_RjIY&v&Npek;9E4Cd4*;R z->uoo4`{yR$2HsdIZXw>r1^?p(QM~c8ktvXcJjNLUEK6s^9?8MZZ2u}@Fv>5+*7-c zYqZ~Sz4m+VqutMgv_J4r?ExO4J;WomKk^vuVVIJRM_h>8m0qsqGNL$5!(%#~~Xm9h=+B^I=?OlFF zdyn7H*6=Fr1Abfkkh|+1ajot#*Xy2eAKg(>0R%>RhG%IyY&E&Ru#%*F+kw^N>dAJf+ulDrvG#EltsBq?tOc zG)t$K=IFen5}mhX(KVGm&^42m>3pR!U4XPs7btDe1xcUjf~7BYA=0&y#p~NhiTbuuioTVUq0f>!=-W%3^&Ov*nQ4hMs@Vt9JI$6#3!0Tm zWzCjJ70o`B4mMjZoon`ybhFtCiF{W|8sAk?xbJGIx$hdOt8bY!*mtco-glie%XhuB z%=csIGv807J-!>H6TY8HfB9~d9{6sOT>USXuqw}yMA9v z@B3|&*7}u8Uzz+Wq(gpRNx%DTm#X}BNX%cBwEjD#2>)GD3;(aBZvNj$L;QD36a4o` zv;Du7KJ?!!?eO0x{p$a{bk~2s^u+%M>AC*_i3J>#8U-AZ+yj1;v;l`DuYjMVrU6GJ zzkr{muz+JyY`{q=KH!v;81Rdf9&lP}5%8PTHsG9O>JxBY8WixmG&bO(G$9}W&+I`| z91u)P0|IG%Kq!?5gwf7`2t2|Y=uki;9Sew}D*@4TJs^f`0deFQXrxAg3FHx&L_UGZ z6d9OGEdtZ1ePBBE3~WvV0$b3Cz*h7|U~8Hgm_bVd+t8-KO!_jg9qkOvGSR-k4)}VQ zO+N;9q$7cy=-0r`bSdy9stW8%cLKZPgJKVQ9GF9mf_joFs5ibV_9fq-J`@tvk0OJd z@p-Wk#Rs`kVvrjp2f0&fP-AKl)PypEJgHrf8ebiC)GlThN;iv^&g9--XSi!(sF3de{OJ*}@i*Dtr<7gfFI` za0{h|FQKgP59p=vrIZ(5N`>LeXi@lwv?Y8w9SdJUm%~@m&G1$9Fnl#h5oOdkVlDYb z;FE8}dP*djg0t$W=3qLSrJ=ke#DowIAR;Ej3}p1BPyso z!t@pGiP%m*M(iRd!`I|y(38sGMOuS51sR%Bh{2cQ41Sbo@TU%j0Ln82(NIGOjWC4K zn}%>IG(^yBgMpSAB59K$ioP+#&<}<*`q7Y1M-0vBq@e|!HMF90hSqe!kU>`rZRnaI zlWrN>5{t|t$rRb1+#)+rRAe@#Ms}pk$WGKbvNH{j>_V?bzC`atcBSc&-DqQEcg#6- zI>vSaQO*$Ke&q+}e=+CH$bTz7w9!5>3@aVTF zD*7Etjh;%aqNh>&XcOf|Pp47QGw6-zB6=(OJt~f#MP<>mX=n5tIvZU~7o$t)TC|yh zW9CtxnE99&(pxc$$P}}fmc>|TYs?b*Hs%955VMqy#*~_{SVlKumeZ}674#@(B}uVm z6db#j46*AdCiY`WjQxaK#BQMWv7b`+*o`zOb`y<@{fyp;{hUf;x6p>ztyB@ajrPTs z)Az9z^i%9tbSic`U5b@4?;_{8Z^$cd4@Jg(OQ~^tDI;zl^^NCLzw zXhGZo+7x$~PR0F1m*S4lKXE_Pow#H4I1b;e<4=%7{3!~KcP2x;3q{8_qU3m2%8qxZ zUhyjG6R)EY@p>8=??tc0d()(NADSB9lxD~K(!6*-S`_b3UtsLSmiQq0AwHN6$A{AC z_%Qk{KAbL@;v>i!Z=jp;QFJRln(oBM(3ALBayQ0NGh;kO851bcm_*6OWJ))tPzz%! zwKS$t8)G_kG`64~#+KC2*op=kThkz81`RW2(gF0!aI+GAb*Afz_Dxo#qPH00l32o_NLOXhz zkVTZ(j+!O5rJ%%Yib(84(TQCtF|j+PB=(>diKd>^F0mJNNbF7B68ln4VlMSg>`%Fg zc{DsRpJpTupjC+lv@UTFZA%cp3+NzyB%Ng77MNy8~4X#@>P8b!mCM$^Qk zF|;u0Roa~N8kHxFqrFM5)5)Ya=t9zXx|}qDt|m>S+ewA=Bxy47`jKAlWnNWUg8q6^83>5pU!T~1y?_me-MXUWURmi!^{l;z}+ z@)1R*tRPcD%1Y{;vWfIen8-LHkp-(}9#7^ka%lr&D&)m6TodB;{+8 zQg@SM>K<}Q{g&KP_mY3=K1xXa&P44~zo&kw`)N$-4>UFP04+>CNb6D$(e~6I>BrQ= zbUyVbx|Mo_c-m3YrTt8Xv}4pV?KpK$J3+Z=r>KA0X&RJvmPV!hMsK8@qj%GOr>SY@ z$&_}1W~co@bJ8x+ytK=-B<%_LIV z(;Zk+x+6RrylWQhNv^wU?h(HWz0YxL=#HinaM&-6KmC%JP`wa#2XWgGvV>{POZPf z<1k!DyeYvz6^=WXT95z6gAcBZ+~Bp6Cz)z}DExFVMhsE}{ES+k20s(*0p9|?$nH}y zyi`N)A)rD;H$=>;U7-MeHdq5c1b$Afe*=DQY40NTzNr{02+^md2rTW>Gbx5j;Khb> zhXx<%5QA}0jKbjKUhsV#VlnoKkw}^EV6bO`A1%I9RX7;y zSNIDN?;`@E!syxy-p4V87Q%}ck^YVi>AS-(f=__&{emxoUkslFKlcSM!&~4n+=_N9 z9`EVIbQ2Lv5FuW+-Fab!U?<%2!8eDGaB3*HAN*2yF@kE~3w|DaDZCgywde)E^^ z3^Qs2f4~WY#A>I67b23JV`w=%&Xttz+^`DEH;m=E`4=2i)U*}Kbp-Z`;_79;&3E;t5Hl{ za*V>wrgf#!bJ*mUKSA`Hh)8v9h#u%*$s7qL(20r^fcZaVr^=4Wl!;?4`ZrC@67cSN3VSvT^k`I zIQ9i^@{AI%crmn^sK_(CHZ@@!Z*Tez{u`JtJbTo8{BIfh9)6E7s;>3Es|urxG3~|N zL*<5}vv$g_jrb1X0z}kJqf~0zkBs(1jIB*0;-;wVl|BHTs`3;{ndYnPUHK3~3ss@D z7H3P9kHUws+@Z2>JrH-IDtogWLFl+j9RK#ort(wZXDqqezB`2QRoe?b4h~Q^6dbQ^ zFQPHH5jP)dakSZ|3FO+)@!8hfi;g3mUI0lT%+NR7RTE+aff zQ{O}w_N-P?{DozarlFHA)^w)>`1JA82eOR>#rktx7OSD zzt&#s8;Fp!4J&wR?G>tm*Jv9m6sfgWq8dI%>yD*;O4kM|a0knlTKn!3qQ5p+@%OMC zpbb!1ET(89?B&-WFjd>oS<1BbPV^9d{R{q(*4}#`!~djh=%lB$VjzJSTZz%BTAjjT zQKhwCs-A;yYsE#)KIwH)b`W22d~^|X82ejHnYu9g3Ct19(go9zT0b0o6fDMEj?y)3 z!5p2vLSp1)iLRkSAJlp={&Lw1ew_}t&dA3VeuEBYHT(9X=j+1h7$V#e@e2y8n`(4{ zbR1p`$$YHyti>sY|>Y=yqJ~ezV@z)cz)4*CU#%K{}^@Z6*fPYm82BO(#(yF?h3WK&nWpOp^obCm(>j=`im{)c2W7FxsI-`F1rOs+ z+*26=`Y?C^cSOe$gFsCo%a{%6Q!t7MZ-=s(9-r#O)H`es58--cIOxEzuXr$45F#28pZ7PZA6fr;^pOrz0BP(f)pdOBYUy2wRyIRUQ4fYXN)67|8F0?oF>&~dNH~W zn+6siPOn9GX76ByZs50KHql$)?qE|)seRM2OpL8z(>eZsAAF10DlF}j0nhVd>ID-W z-*EHLCw?X^ME+uw>4^9@kfQeZJB_yoViJQ*f5Tgay6IMY2L;8D(>w9)>NH*qli^=awqL)6Uzr>ze$m_TYmyr-FuRlOhweM@dy^ZE?~}>)v!NJg`)hK;+3=6r zd`#l}fBA)sY{`R^0%l+Zo+1W{+oysQdqzd@LsA+t8k1r#cozI?DGddiQtTI-Iq)-6 z8cyfyYtt9QZxHEg`yU?U?FE<-@y!bb97t)S)L=gRk0}kOPsh~WF!=KcEL~DX|F=*5 z)83|S*ky}g2Bl4?(|EkLpSCUVzoa#sw!_b-b*HbeZ$3c8m9&nuy|!~jrRUNPa4CFj zdg;Iqn73((ZzKHGkQjd8fQ%;xe8v1(V-lke#PJ>zREQz-PRi&5aWX3ldc!FJV==_& z180QshS#|z^CB_&KvcjGKa}-iZiur#H8v%ZqpAzD-$&*$^c{@y>{@zZ4O`7#EuC7%jwQ@u0SnN?c+9iM&Z>f6oQ5{~S1Y{OWV0EX z3`hGsHkYBvN*J~KpR2xHRQ;p+s;?APUnQ!(T2#GEsd`<_cQpQ(J>{;$ULQ7m#PIRs NhY#D~_$l*K|1Wt3h~)qP delta 22845 zcmb`P2Ur!y-|v4jdnkeer_rSM&Y@#RQLHF75EM1WBu1mLp@~tCic#U%PZTv)?8exz ztj5@4)KoPl(Wo)@oQOeeh?V=DJ%D-hzwi6pd!M^LyXP~XDLXqm+Xp{?Y+L%s);Tk8 z2W=ud@*|>}ny(f(w{qz23-%|9i7jhAa1-MP&YL;Ui&@-vY7Ox*c87@r0M+fXwox9h**}c&og@~ZBc7-kHnu~ce&&2%whbkgZzj(N1H~rvQJGWiBkgeHGl8ajNgbgH*ijcYUBKVN@9MN#W4vh zGx;1yJK6qKV!ma2P5xKCO?QQ;8UIRtoR%fGMXFnguT!-(Tby^Zk>(XHzAWGTrOPjV z2hvRKU#;DpCNs*iw0W3oG1Zl_E3GEQ(%*bs9mKkr|567U!XD<9+a(;yviLsC?QgoJ ztSsBQwimT4wH$7fn`^363X{#vH6Pe)tIoERn)hqG2W_nuiHgR*vdpY0*DFaJ9^{%5 z9jgkCic-5j$n9TSX7Y}-^5kqwj|aJyQ8gkL>L`AiwSQ5dQ*xfUpIcX2U`@H3;trZq zwVhbGxlo(rJnpIG>w((=}G*#x3Mg&DL=1Nr?BOrG}NUg`B0jr zk9nug+y8QyXjHUO!jXiZvU+4&&O{U*w=Y5hCBJQ@`JT?zb3Ib6tyS0WV4TBb1S_^a*oKU-C?Yq@a=<)SpKpA>Hp7~|X*LbfSq9XG zO+LHP-?+uKHf-^HVkvkgS7@^=&F|$}T%K7PJyQx?vpX#yq23u%0Isxi!hV(zr!$e$Umwa?C4SLwpPs)(tfI>`F7)t=*Mo z&9X~b!vym+*AU|w(eGsmC0zfzE^+OSZY1ll3)*2_>}9!=<>h0`nCD8P$h9eJ#;GhJ zh#v7$_CU(U!0y%*i~r8G%(GTdBw`i0asX01g^snR7z-T!G~YbKEm3_S0d-g-rxmG+ zlI65)%Y5^9ZbMizbE12ovGT69Rb~wYkA{|tkP#$PD9Orx(Lw1)p$>3Wvn)%YeuP>F<&N#NH)dI8z@3F#0B2JrZ%58CP`^M;hI;T=z6muD>O9mis6QUd z9yVE)OsI=ceW1R7EO&)!3iUfwJE;ASm9j#i{(y>y+VEH|L@FKBH7MUZxkiimu`I(e zxEpW{k!;Fi`ERI-zjEcTjrXQ0*Vfv!V7t zRYDzsN_;FIg(`)51ob(T|6}ca z%JN7yL1jbLK)nI=%Om*~R5}!ElV#}&b?lM656S?gf@%h}{gJFi^Lse<-^` zX`$M*LI3lCTli28fg`wfNahG-d?*{B{{Ayp?hIA^CobR*47%CL%Q{w~qBb-JWz?H)3;ATCLOB-cbs&41X8=x3e!2|ge)D5UjP!+dx zErTA&1yE<8K7+ah)$M^?0re%+4yaR5%^%1CIMZx_Dudbs75+f(3snNOrw#gFDV*yA zd9xK z`=QC^z-i!?z%{%tU&daV0Obz#G1Svaxd0cPccA>BMnm1MlnbGHL4`mKfI3$xFMw(d z6$#Y^>PV%02r3530M!KQ^GaFeimM@1DwHt&hE?U3JI$FvHCb&fy?t?S z>0Xsv*zziFc+15TMOM%5J#2llb9#Sy-e&Iarn}{hO|Bc#@kp~Jeb&rg`D?bMr+q67P0u3OR(W!~r?n7TEc#wH)|r@Oo90Hb23t?B2kJ02^_cm-FS@v5RGc}IFp^0xFf zThndC?bVl|xG6hnyVcACf{h!}O&O{$IH62gMUltWZWZOG7ao&#OsOzs*zUAHS1m-F zisB60pc;V{wF!zd>}yfA!?B{SbVF$F+HL7Yt~=75H@>Ag3sOK}K zp3juB+U#Hzve_5=-z~T95$jM*&6-W=&1|=%kM%J5Y)UUiODr)}!qqp%rgYPZazeM(7&C6n<+?e)ydT?cpDcd&k3@Y}lC>s?s_laK3u9%-jdwX0FmAo3A#)>jj zjy022rjzA7;fTrgsyQ~sv%^(u>?tx;W5bkkR8y~4)-*d-pvCqHalSSz{k4ToWIU(8 zmesXER&5Jl)6ENF+;msc^Q1FH*;U0E&(X6(*poXpcgzQ4d}5ns6x*5lS4sU}Nobj- zc4MUzs;L<@8LtW_ztT_q*_2Tw*=kU3SiY zw0%*=3sc4`v4JMn>*=oKF*Vo*i>0Q&~)YO4b#l#=C=$%X#8SB5}RZ`VhD3Xo7th?4d%I6Pa-Rw zn2jA?I@w%fh)$T2?PxnKd#q1Q^0e%lnXF}UFr5oPtoM@v;XIOqoS_qEH*?c3)xUZ$L| zRpn4QtybkMaXd1%8o%Y%liV6>bqZ2Mx5JaGJUtr^5gw?GQm+!X+_h7(i(IE=$2!SD zu~~{-=q948V{pB-x1Ke#6RMsiRF$_bo{m~hDZYSTbEo(OHoa_eyfahT=B%|hFG%pi zJE2_(@31_xXQID*mlBZ1@gpv++&NF|T z)I#fUy0)6iJDBmWMD;wA8;4EDZVYy&7K{p1J9xQDRDTv`>j_9nJm3|Y*PNdm?L2e_ z?z^hQmWyZc56w%HeFJlUv=&^Gd_CPV=SMu?-%PiBTrW3~#bmye?91JLG`~oWXE)5T zDdEQbKUg!#c>{2%tWSI;-E#E@lyEiOa-lYbr~zJqS$|$A>C+#I8i*^`=-Naz$-M?x zHi(?r11u}+WuF0-1$8Up&RNR!`HCJ*V?K{MsB5DvMOWor3AjD{0r#zaaC`UzZVxZW zm!Wz?WkL;v`uT$Fmx$X#s9dN_sG}F;=1{RvgP@v1ZMz^ZPQvXW)Cj0hs827*!;z{1 z)I=y9)T|5g93x!S_qlQ*9D^&kAoFP49zxB5s`wtahZp4SNOcBkDbyvXZWrWIs4t;5 zK%IhWenCDBwFPP`)E=nt3vx7SQ3ACSsuargg4`5pI@BJhdEXDh?coKv8{8<_oEL4A}6HxC${eE69g6a%)8Y&y=+w=0ZP~09uU4}}B+IL>Q0c>!^x?{U^$(9|= z1Dgajb;!v$G2J0YT)wj`gZ|3JiLFsV$cgCh5Y_^Sqs$tp1b;E^XR4>Jl%8s3T$w>EZ3TR z+;eeW%TN`~99mIh>u&zJX;Ac_zBM)3mOmPbmz(1CY`KFqSxw2%iZ$-JHBRoijzv8qRP&c{kdcS&Pli0eMpJTlSA^C2rl;7VvAldyc?Tt`z!ycNQGvU-r;z9O%_?rIT7r9H zaq1SQ5Ubx}j&9@avZZ2o?QKl9X`D)qFUxDwk_`ySL;88PqM>Z3h6Lr+yp)M&J+TeS zBR*DXdt8H+vv5EjdKlpq=IUgTr*B=J#QHpm);yfVbz8|3Z+?;<9r#IKDsYT9mFuxqh7Vm%ViMMoi7d zGg)PQy6tEDRo^mg_i^IaZ0b=E*&<8)3(JhnOv<$F_F?9SnT44dT{~v>&g_;sHgikY zw%y*zoSbyM1=EX3cwr z^cvMGuGgwwTYKH90C_ zfnUA|Us$UCNuYA*ZRZ)SeXrk>`CvCm*iM}!=dzp>> z+?bcSq+hVTdp?czHTig%kN11W#y!8t$J1=c_qX@VFKW+4AUA&q^E4mJUl|saUlS68 z*?>771P+vpgL4>r~=>l8l^25X;ap9^%-6kv38}a z@#j?WkEj8Eoh2ZT$bqwZ5sxtEuM@OEIGs!N@jVc3!&UX+K?vh3V|{q^zrxdAhmA_2 zg|CGYF8x<{*T2HY{uTb|U*YTj3P1Q)nD-T{5fyB&tdBJH!Ws_vS2+G(;WqyY_b6-h z#dpkpaG!UTe@Z)-Wet4Q3JazwsqD&B-Wom8M81~g(Gfn9b-{`jvynCpNc`JTqVC29 z88?y|t?KSb8z@LXLt0NM0vge3>LkF4)=|CyXF5+K1-Q^LDiolmWi(%ahE~u<0b2T; zb_>wa5;`tGPjAs#0j~4|y%gX^-%~htox3~rX+XUNdC( zoPgH!75O*<+R!hwSwK2{Ni_o6(pK_n2xv$9sH1=k`jo~AXiuNf1_2%D54t6wBmG2v zjR2kKBxMQcOoymIKo`11rA9%Sbb?L^=t?uFLO?efMj9tT79F4f0o|#LS_|lbPyBra z^rYo9Q9v)cLB9y-P1EVBfNXl749ip zQ2ppza&!UY(;R9opg$E;j(`F50Sy;0kd{)3fH!D7-4QT|CR0;2;7yuB9Rv)fk0@Kf zTQrG=2zZ`@8fW{Vmi`dWRe|fMGO>yal{RAJQ8FhSPSM zCtw6!q0Iu`rwMdTz(^WRDlK3X6_T5P(eyjT2^d2q)LXz5U`k@k`6;h+)L;=MF?0z8a7J6Qqr-*0f1$sWr4wf zPbq+13k58vAofte3JPb*VStqs!j=kHMGkPDu#bw_Z~-!nW^)AWr}?Z@zyW%nZ5Qwbnb>Io2Pua|Cjq{svCP<1&>|+6^FmD#{4LzY>1bj;iShaxfFpo4g!SZ{|4+Q)`z1Xs5fFCi-0#0MTDBujau)ECx zXUU1JY619(x)W;&I7dCHjewu&U1k#S3s&|}z^|AcT48Y>bC7@wnElhR_ziPXni0#3 zn3a2)OMo-2vA9fGbgT{Fcg%kXxI(=tC|!gww-Im^^8f+YFpn2-9rJzxH!xQUxG4f{ zvABg<)eei>n1coUiMf3{oPWpy`ar0^Fi#h72lFQa$}w*ja2N9r0{+HamVreDWz$Ik z_b@9^2^iHLi~H1+O%U*any?}P4>2zj@Cfr!0go}i0vM?Zuj?7nqw1c!{@5g9W_8JW)Umb)l02h~bv6llTQBcLs1afK3x1!ORt4 zRDqTWvH^7K0Ikp1sE+L8Zb^k48#7PASf1UvH$~Mnt(XKbOG^z83Gaj zvjijpiUlMAW(!CL%oUIVm@go;4w?WK2-6g>P(U-lCjy!Sj7tRJ?E-Er0WAT`1+)UJ z7J!dcxE%$wW)8UX0JLGVae)M+vr^iY258G>(GCIaSRm~ZkO9~&pgsGT_6q30R*@{A zBil>|1ax9I>7Y?iXZAH663~UI=&FEBz=m`{R~E^x2w zNbJxD&=Yla&js`XcnatZ@X7;Z1AGMJ0Q>~>0R-e3LAjtoeF1rZVgY!oL9+$)1I!hW z4_GXqKcG~=0Khr{0|D;&fHwf10tNxR1iT6G5il6wC*UnWlz_JZG5P0>Hn`waQ?CI~ zL)eEbPr$ouJR3R#Fq92vL$?8jA@$G-zRlHFdd4>$YcYUG3Kaj7mZ4K?>BbV^!Tc>WvYdNU8M()~pViTfxX$SYbBqN0c-h z>(;TUuH?U+A)b+ty_>84nvu$N<>!6(#K4TeH_?+QF zE?P(&O5&<(yA5kqKpayFY-izCm{S{Nw@cYVte=;G>=Em*ySA+y_5hTFN+eP`!Cv;K zwSW8%iR+t6>@p>LJ?vu^s}Ufo)KJuQOFGU!%5e{}u|2>ZQF~t;_cD7xW`O&bSp6n( z_B{j;Y3K{URsjduW7;NQKYK{M#4cZn5|z3h1t@*_7(m&rCvb{Wn!&_gSU2?-L{*{9 zjC>|Y*=N7vCGJHiex5N_E#LyfP4Z4GDUSiA20sl4E zU1rDr-3+!!Roe`|ikgXLxFA3@gVNG}Fr$ht3niN2iU83J*93@WP+ISAR8iTE3V_m# z_W(*WRsxh}ywB{J(uxmQ19n$rf5;q|(u$9mBU4)OF>A<_#;Zaur9E!3Mn)DdQj11Y zno%^G(t4uNl-~58jrRZ63{TKMa9$+aYIH9Jo}$AU6|x?rhtaz}>AibA(ZLA_0`0DB4V+t(C`X6U9i+6(aqM8_IQa^o z94GeN+j?&CKpJJOo&aTo8UvKodjXUd7Q0hfef{1H;^NT*S0iih2Gn1Tf|VEjFkwcJ za&-^Kc8JcbiU8o|k5rKWrR$3OIHiiBpeeWqR|--fnkTU!yosSG-jWGJVl$LB6L%uD zO%%y!FoBU z&sAp{)|({mV6<+usI{_*qVbgyFR+f*)0T;KvhMq2>`o<3O5F~wuSY8H${fU_$fv9u zQ*H&CAdOPjdU%2YmE94ut4=WSc!I=pm^HCoQ@)t3 z!D}D9bHd^u(^$qD6fhekw*H%l@J|SHgvGoQ;ahmiE{XFW7IXySKF*3Nu$WIFoXTxU z6d~s42%D76$NCWt<*dOc2-|_h9E-46zvx0@jzf4K_Dut@n45_X^^d7}eR!XF2(wki zjbWyB9lCzR4sOcpx`S11XxH^Hi(Qx6^(6a!b+@k1*u|B(T|;=6t*KpO__VdDT@Cv# zzQ+n|jAz*#=bzYo=W}eC^Uti*`4_g{`8?a`e1UCo{*CQ+zR31FUuIu8|IUs&UtuSl z|6sp6UuD;wud%z%*V#+w8?46p7PEEvlR3Irn6t}YEXd^!i*hMvEnWU*tz9ZuTbFyR zw@W3;*@gpvrf8`?a6D}(LgNqG6<6_5ua0Ul zT=*jwHGk@&;V)dYyrEjhb!t6ttajx-YIp9Z_TXV^XC9$$%#AT>FP@_I;Z4=PyoK72 zXQ=&o2Xz4NtPbS8)WJMk9m4a}q5KVX7=KG0$%m+;_%L-eAES=ph|2C?#Rp4o%!GDF1%8m$)Bmaa<1vdZ8Y7vy{0F3(DdSsG`+ct zCY!r!a(H7+F89{taX(F89;oTZqc!sF}<+Yo_qeHBYQ^ zw{|7(qg}<{)2`tow55EMb}gT*UC*azH}F~7jeNd#6JMg;%vWf)@KWt({4?!VzFYe_ zKcwBpPic4XAGJIAS?w-y05vX?gS6go#G+7Z+N)wTOOtRj>qc0=P9}$cvIbvytVE$ zZ>u}YGju=kj=FQam+oiYPxlLdTX&uh(OuxfbieTe-9mKqybdUHm-DA%6Ra~Wi!tM0cT&;h~J@n7Gm;O2T(ZAsS`juseBy`9umZ?u=X>m8(?dPgZ+-%!feHxq^nyPn|3iWQ%486NFPv2Ntp!bp%>Aj_;dLL<(-dFlu?5@J|x~7kkZt9~Yi#|rGH0ooe$9jYGTpuSf*F;I>nk3n~ zCQA)nQzU2CCX$fo9o zb#iSlWx95ddb@U%a$Gw}d9IzML9Ut7VArnFJFeZNNv>JaeAn*MTGt-ZUe}(|H?F-T z<7L<0(mmH~iM!=Udbd7Om|L#Y%q>sq>eg3!!>yk*)-7KucIz*#a2p`)a2qIn<@Sd3 ztJ@&yFSj?P7jA0Fms{1=qXZImefA@E#QSL*f>F&d%68HC{E$+jmFWpB- zXWZYHZn%$>s@z9O4Ln9mULIqlSdXzrsf|a0)Z1g6G{j@P^pVF0(p--Zr8OQCq}?7L zNhdufN*6sQNq>7xmdMj6X+5V%A)ZsECZ5xzE}n(b0MF^tXwQ$Ok3DBdOFU;vpLx!b z4tW+yXFZFho1P}=iRWy|q46BayYXDf(0HDd-gv&0-FSiYZsUd0#KvZ6USs1YQfcEw z(w@ePrBjVdq)UyLNEMBjO3Z7Sr1Sbz3iVnpHT7B{WqPfY270ZM#(1rkW_YcUmU@*+ zTfNpwhrQNGKY6W}Zh38xs=YQ!j^3LjAMedloc9)~t@meAj`vn+sQ2g6B=2p~eDCej zTJIgwUhkdKH{QFX%id+uJ)`$-iTmu4^ger~FrR%=Gap&%>a$;Z!{>lB*5?aprq4lX zz0V=(E1$#CcRoj?AAOEWXMK)IzxjM6UG_OH-Sqid`qSrxbjRnU^taD9(qo@*rI$WG zNHsn`O5FFfWbb=ca`63GQv3cQ1^J$rVtjvmm+Tl^hK z<=>EO{Tq>kzY{t6yO73TgO81Ra`Sg3Pk%S^_ID>=e-8@qZ%je{UKHZ*Lt*}Y_zvk$ z2LAv`@DHX`e`5$W^$(@y{^8WhKZ4r%M^dJLH1+m3P`-a04fKzvLH-H!mVY7*@lT>* z{wXxv-;+k6pxG#Bxql#S_Yb0j{vmW2<(&2pqw6T^Pn7ixWwC%LvI~eNmw*^@4TvS* z00Tt_#8GlUJhcr-piE;xBIO1o(OUt@G$No06$Uh;r2)-pZ9og!AJB>p2c*-ffDHOJ zpd(!f=tQ>zx=?vQSE>%^MiiJueu3R7DX=HC59~$V0((bSSVNT@K8r7l8xFDQF=11ie8qL4(NHGH5V$4SJjU1-(O~gND$opm%9y&`{bP zG>rBIji4Wc-lx++BkAX$(R3lGfINc7k$3P16c{{_qJoVS7d(Yp1W%>(;Azw?xRCk= zPp5Z+XVRG9Su`iuL<@sw)3V?>bRc*xoerK)*Mb+&U%?CMez2KrLq0K*He?Ys4p~g$ zAtlr z5T1v*FWm|6Pk)CGAQmx@>>}PE*N8#n8}TOjM+~N@h_@*z;vH%kF@)Miyh~johEmUn zVU!c`9u18cK}#aur{xi&Xj8;!+7dB_c1DaPJYVn zxnqi&{jBqZZSOs1nRe=wQ?`Ivll}zKL2v=c3ja=|NN}RY$F*7g6hp zM{gj9=#8X{-b6mpn<*xG3$={?j527bM$WdG-_ed3 zZF!syf zPQMvE=(YhziNTv58+@qR;7g6-{3tLkfP&)!DJ(9CqT+%nJ}!is#A&EmoSs_8xl)@r zH%gClr*?53)IQFWI>t4o&T(Fp8Rt!1<9v+NJaWS+%E{+bxwV{EtYdRIzhQ5zWr!)91NBDkR20e-E zK+og45RdOlHu2raA-+3l;(L%jz9)Id_a?viYzmAw_MwpYTuO@1qwW~KHv)q+$He!i zY4HPSW&A)o68{EWiGP!B#1Ezi@o$k+!rNp>7(z)2?^4@@p)@dI7)?$XPK600Xnw-` zRGKi7K2I1;yAsCGo`kVD+lgZndXe7VH zDHNDEm6|3_qvnZ))GBd0y_xti4NIIs!xLxH$i!Jxm{>%nL=(+PoK5o+=g^YGxwJZQ z9+f7}r}c>o=<~#dv^~*GyAnU4uM-#14~a|YbmCI_DRCM7k@zV+OLjY&R5Gm^idrODsY*5vQ#aPs%`Q}PdVEBQyN zPCiYJDQCzhMrkP*sY}Ww%1pUT-BNz1?36z!C*>;jOSw*i zQ*O}El$-Q^$}Jj~a+@Zn{7ExXEL4>87nzWMe#%{1o^p@Yq!=q{UCMphlJbDIraY#y zlq%YrQcd5aJf*WKFX-2lmvl4b72QpFPWMuXRi$u@labiV6cv+FZJ2GU9dk&vXI`ld zm~U!B7L?kEg{C^Oh*W15o$A7pQq?Rq)sdy8>R6{#J?olU_YR{87aw@=;X%B4>BzMh zfMb0J(~tYp=#mT5SfFuCt=h@sG0;c6C?VR-V`)OIzrkZLN=LjP!LSq_Nq9>GA`B1J z;yWuNN3c$Ep~0Q0%}BLB4T=NhJ5&s z!CLr%@H1-tNcfp0I||u6Hmf9UI&SAe{ zDw<}OtQOI85FLq#-C~GV?Q~O>L~~2di0FBU7OxI{Y+grqwMnA+i$6x}0>maDcGf>) zWyCHlF^Fh0qQ$GP2mgo;uuY;*N(PGPMTi!omipPgE_*hj7njTz(Itp(h3FHu7?4#v zJ+o~>OG=K2=%t8GhfcM7z1aioqG(x3rHK9%(d`jE{~yu&>|$tniQf$7##WT1&Oj5c zEIBoU#j;f;)idxpe|5>onTRVbnKcuk^^0eroQ)`F49a=iL2QY2TH%mPn@S8KdJDed zjfcJ9kWm+lA*m+XS~74J3uN0%rq5#I8|^|NGZ4SEVH4U}Vqb)qvXZDG*1qFz#LP#` zhmFGP^OrUXp*`>mVb(WN`mhpr3VtvACkTD_4`0zJi1w8nEJB^-lEh*b>#?6n7!QIT z>m)`NSto;Y3>_?)Sj^fP#aAg*2J?JpH-*Jwqq9!oZCGw`7X8sW;r|k#FR__B5IpMq zx+`P2nB1DdMorjmX&Jj?hwL3V_mTr+1E((dd1$Fwjvti`-uEB ztrZrFH#9K{|AggWjW~?0(>#r}%%2flsCm7MH)~Sy?%&9iA%CB166?}qkgm0xU4Xf% z@vHYLt+hfIVeGW8E99oNuHZ7fr}p&<;2tvEYcrzu)Is^W9QO$29YUmsgP)>h&+{8_Cy%UY)^wcdi@wSV}ET7L)reyvyb z|Et;>-9-e`y{?d(&RU5Icu!qJEUiry-6uqbEZvKOedd z76Tkl`8B2+wf=^m2i*jVVUBnFtVfeb|H9AOZ^U578o$^5M(1y|_IB~%(aqm_e2WYb z{_Uv(7Y;G<(cs^j9@MU2lz&(D5MS5C@W+Y%>Fg;gEvCZ(gSicNQ3gSt3h2vK=s@vE z(=Bibdxi7~U}Ing)8iYJm;!?j@c`~hNjU%Dy~ZByj|^f^V>apZNawTtEn%y zZvC$CJT{O!Vh|XQ*N0h9>@=E(74(2l zjvZN-9M8tqQ?D3qxf##Z^~c}g*mg=HG3xSIY@7NFDnmAzv1`QGOM62PT7W{u=u2lq zT78;4JmZQ%#6LGIkGSB1ov2DmO9G=JTz|uPHO0b?* z#Q@Gd39oNCFDJC69jNFi_^SzNb;Xxv8ETO_?+aknJv#pYx99!WT#*G^+=)6aw-|Bv)V zwdEJV&lcrdw;w}wlUgZRO^8^U^!oJqOHxl53^~X0LXzm`)+sFIL)wX5HV-ByWlWvM zBc}DVy#Rh)%Inki)|9SzmSgx!4E#AjN_*N<+qayarDW4y1QsFUWlG7}Ma&b=$L1?hGRvH62f&5@pyG(_ZG%{itp~qzckY0t3SuXDwiaz)?E@~ zZ*kg@09w)``IZ*y$LU__E~AN)}$? zxQZn+Ueab2JI`WDJXbSc7GKhIHESQ%OpIhhsm+;k=V)hr1{KQcTh;oKHu#S#Irb>dx|J! z;lwBr5+k3fhy`JQIYS>eu@IUvn}y+zlSPCWelq22LH|R^xa*qEYDCG#x}v`kS-usE z?=XOF%J*2{J_*4ev6ymN1kZ@zS+V#@1kZ_dKMN8A%CJAM@W#oFe8j?+O(hb_VNXgbSe|7fFswZcD}4CjJk zHiMzbW->Gx4)x!}pCbHc)t8E@FRQQma#8gaqUtL})mK}qUR(2h#p~G%zVDMw%tQ0P E0Of}sprite cell + @ execute ; +: entity>do ( entity event ) swap @ execute ; 0 const W 1 const E @@ -55,8 +56,8 @@ defer draw : frame ( s n e w ) b, b, b, b, ; array frames ( 0: car ) 3 1 0 2 frame -( 1: pete stand ) 5 7 7 5 frame -( 2: pete walk ) 6 8 8 6 frame +( 1: pete stand ) 11 9 7 5 frame +( 2: pete walk ) 12 10 8 6 frame : sprindex ( dir frame ) 2 << frames + + b@ ; : defstatic ( frame -- ) create b, does> b@ sprindex ; @@ -71,24 +72,6 @@ array frames 1 defstatic {pete-stand} 1 2 2 5 defanim {pete-walk} -: ~ -1 ^ ; -var player.state -: f! ( b v flag -- ) - r> dup @ ( b v val r: flag ) - if drop 0 then tileselect ! - MOUSEL mousedown if tileselect @ mousetile tile b! then ; + MOUSEL mousedown if tileselect @ mousetile tile b! then + MOUSER clicked if mouseworldpos world>tile swap . . then ; : copy-mapseg ( neww oldw y -- ) r> ( oldw neww r: y ) @@ -268,19 +253,54 @@ task const JOB JOB listen-for-jobs ( T I C K ) +defer entities + +0 const EVTICK +1 const EVTOUCH + +: entity-at ( x y -- entity|0 ) + 0 >rot + entities each r> 2dup ( 0 x y x y r:e ) + r@ entity.x @ r@ entity.y @ world>tile 2= ( 0 x y eq r:e ) + if rot break ( e x y ) + else rdrop then ( 0 x y ) + more drop drop ; + +( P L A Y E R ) +var player.state +defer player + +1 const MOVING +2 const DRIVING + +: {player} + player.state DRIVING f@ if {car} + else player.state MOVING f@ if {pete-walk} + else {pete-stand} then then ; + : player.canmove? ( x y -- ) player.state DRIVING f@ if DRIVABLE else WALKABLE then mapflag? ; +: move-entity ( e -- ) + dup entity.dir @ dir>pos ( e dx dy ) + dup if swap drop swap entity.y + else drop swap entity.x then + swap 16 * over @ + 4 pos - 2dup player entity.x @ player entity.y @ world>tile +pos - player.canmove? if - 1 player.state MOVING f! - dup if swap drop player entity.y ( d v -- ) - else drop player entity.x then - swap 16 * over @ + 4 tile +pos ( x y ) + 2dup entity-at r> player.canmove? if r< ( entity ) + ( touch entity if exists ) + dup if + EVTOUCH entity>do + else drop + ( move the player ) + 1 player.state MOVING f! + player move-entity + 0 player.state MOVING f! + then + else rdrop then ; : tick-player 0 ^LEFT key-down if drop 1 W player entity.dir ! then @@ -289,13 +309,20 @@ JOB listen-for-jobs ^DOWN key-down if drop 1 S player entity.dir ! then if ' move-player JOB send then ; +: think-player + EVTICK = if tick-player then ; + +12 9 N ' {player} ' think-player defentity _player +' _player ' player redefine + +( S T U F F ) : hello-world s" Hello, world!" say1 s" How are you" s" today?" say2 player.state DRIVING f@ not player.state DRIVING f! ; : mode-move - tick-player + entities each EVTICK entity>do more tick-mapedit ^SPACE key-pressed if ' hello-world JOB send @@ -307,7 +334,7 @@ JOB listen-for-jobs : draw-entity r> r@ entity.x @ r@ entity.y @ - r@ entity.dir @ r< entity.anim @ execute + r@ entity.dir @ r< entity>sprite draw-sprite ; : full-draw @@ -315,7 +342,7 @@ JOB listen-for-jobs player entity.y @ 92 - scroll - player draw-entity + entities each draw-entity more mouseworldpos 4 draw-sprite draw-screen draw-footer ; @@ -323,4 +350,16 @@ JOB listen-for-jobs MODE-MOVE @ ' tick redefine ' full-draw ' draw redefine +( P E T E ) + +8 8 E ' {car} +:noname EVTOUCH = if pete s" What an old rustbucket." say1 then ; +defentity car + +:noname + player yield + car yield + 0 ; +' entities redefine + s" pete.map" load-map diff --git a/game.prj b/game.prj index 826465637b3a81e88e06174eb7a6a125fc098041..7ff771fabeb3d00798a798740e6b454040a04041 100755 GIT binary patch delta 68 zcmZ3exlnV1IvexV)iIm3*iNwVURoXFH${elLD`vs;lbwrJc2CJYk@-S3stXWP90HdWvPXGT8wuZAS5q1OZ;T8P= diff --git a/jorth.c b/jorth.c index 6ccee50..f92a222 100755 --- a/jorth.c +++ b/jorth.c @@ -460,8 +460,12 @@ void f_docolon() { f_colonloop(); } +void f_dodeferred() { + W = *(W.p + 1); + f_colondispatch(); +} + // this version of f_execute can be run from a colon word -// (though not currently from the interpreter?) void f_execute() { W = TOP(); DROP(1); @@ -954,6 +958,7 @@ void f_init() { CDEF("task-user-size", f_taskusersize); PCONST("$DOCREATE", f_docreate); PCONST("$DOVAR", f_dovar); + PCONST("$DODEFERRED", f_dodeferred); PUSHS("boot.jor"); f_open(); diff --git a/sprite.tif b/sprite.tif index cb231875aab216206c1cbea406b9fb57b92c42a5..06864afe73338affc67a190f2e2085357f13724d 100755 GIT binary patch delta 496 zcmaDS|4x2GC2M9{+J7*B(%;h3@WD{wOFY z0^$Q{83_GR9!$%B1Dp3Pf8s~+dI~KA+T{Z>)KO3nZ1_Pa{ZSsm|CSH2^#6Z|r69Fn z0JXOs=q)fG?#rGN5P_Z(5QS9pEyOrD39&a96s{CGfRqr}T*%tQ!Eu0rp`n4Jg8={^ CO>p1< delta 26 gcmaDS|4x2GCF|w}_B0M4!Op~SfPtZ*fun-~0Ek`)i~s-t