From 7a5908b091ba3c17517e4f53853281bbb842ddc3 Mon Sep 17 00:00:00 2001 From: DuCouscous Date: Fri, 10 Mar 2023 09:52:49 +0100 Subject: [PATCH] Bah encore + de trucs --- __pycache__/block.cpython-310.pyc | Bin 1730 -> 4029 bytes __pycache__/chunk.cpython-310.pyc | Bin 1259 -> 3481 bytes __pycache__/perlin.cpython-310.pyc | Bin 1861 -> 1861 bytes __pycache__/perlin3d.cpython-310.pyc | Bin 0 -> 11042 bytes __pycache__/renderer.cpython-310.pyc | Bin 2662 -> 3667 bytes __pycache__/world.cpython-310.pyc | Bin 1271 -> 1271 bytes block.py | 42 ++- chunk.py | 74 ++++- perlin3d.py | 470 +++++++++++++++++++++++++++ renderer.py | 39 ++- sprites/coal.png | Bin 0 -> 469 bytes sprites/diamond.png | Bin 0 -> 480 bytes sprites/gold.png | Bin 0 -> 532 bytes sprites/iron.png | Bin 0 -> 606 bytes sprites/leaf.png | Bin 0 -> 1157 bytes sprites/log.png | Bin 0 -> 585 bytes 16 files changed, 614 insertions(+), 11 deletions(-) create mode 100644 __pycache__/perlin3d.cpython-310.pyc create mode 100644 perlin3d.py create mode 100644 sprites/coal.png create mode 100644 sprites/diamond.png create mode 100644 sprites/gold.png create mode 100644 sprites/iron.png create mode 100644 sprites/leaf.png create mode 100644 sprites/log.png diff --git a/__pycache__/block.cpython-310.pyc b/__pycache__/block.cpython-310.pyc index 257d8297a7b846b91882c486266e6a3dc15486c3..7528ad7e1332d31614f470ba5f18dcd817da7214 100644 GIT binary patch literal 4029 zcmb7HNpIUm6rSNCQL^QIiL*M+(yA$}B0o zW&`;f&C!2}*Pe9g#Xt`|^?i@lQVX;w3VfQ6GxPYq@4exWelC|4bUgbztE`j|e*p|0 z69it;88}ji9ifDh=X9PKWgtVDgiJz`kfm%wwkOZbvOzed(uC8DO~Q`K5Y8~R2xrv< z;R(hz;YpPvoMW6KJf)@yPcu#vo>8-eXBj($=hQsmdBz#S3u=+@BI7LKCACa=nel|W zrB(>tW_yS2UAFhw-e>!O?JC=cY}a7lX3LZ6k$QYC$~pCO?x-rG_WU zQi-ymWZ6_k*-~cNR#rKsY?_-2GvC+!>aTB(kGu}1b}+YNz?fu;`E=;GZnM(xTsO?R zZo^mYI@*)2`&+wGzv{7yd&M6@yYvQs)-QW|+o8Sl^Q%(nLg*a%Ve{{c!lB>r3aVZ8 z+X2qPwqI>Gyk?79-tUEKcPt8J(e4Xx5r7y@+eQBt$LTLQj*y ztN?5ru_pP-kfx{u9G8RD^j;iDC6#gRl+E|T5@m~2G((4jdsWj_q^x_O4KFwYsL>K< z;!m3YK}uT1G}9=u@_8e)gZ7c9Ip_3^T4B1R{&+SjCbY-^GXJ@s4=9&v@N|t?I?XvP-6k;+b|p`hs=ott9d#vp~R9rneT_u z(?Z|F#C{p{xvo+N3R6FT0UF6OdT4CdbSsvoen^h;LiWMLHHk&Q})Tp02 zl#DIEQXd(8hm*l&_2{PP`Q`)K!+C<>^W^hB{PKLDgu%boesgs2kiNtIZw#J02ZD$5 z1i^nw-q(7;10@W8$FHl=!Q&a-;m~djo{MTAcsNfGe1W`kQL^$tBZHs3T2+;X-%Joc zHi{1FQQsKo!^j2<_p_ItS`Q4a$meg;^G3mG2+4_G&U}TG=?uc(PDjVjOUA2MI6U( z$MeON73XVnJYQI8u^hh}&ljpP*4N9PFI0Z_K)d%L7zI_<-+tIwbr3qQ&>&>W}B57iWc)z(Tn{w0e&0hS2fM0%QeTv!dd3@u&yi! tGvN$#YWg?i7T?v`h(7E#K_U2z%#@f)&7^0n>%WwZ?~wohtbZnR{{go{HVXg% delta 787 zcma)3$w~u35bZWSS#%~wv$$b`F@mE(1P_9Ws02JY!Q>!_WRxUAaAKfFF9Gozq(49p zUh)rm5&Ve(Po6xBcdI%v2`*qm*Hl-%s`sYqG4*6*8-_8+@EkpBm8${9Ug^<)1U|O# zy2tD$Tk==*A~Ownr^n?UZzc}KK|Y`JwB5pXvDjjuBNBA^!ar6`Zkaw9ra*+u2pUs( z!mT=|-@=_TLK!mTv$9cg+r7G;L0%Y50Iy53f-KD;Ecf-8EQNyd)>qF^VT;44`gkGR zE;}c#YuoK+szp>Ti`kLO-nxK3fv^jSbc-iV_0gLsJQ zekI0)5;=oTb9BdPl+SWCxLC67+Ij5)|NT!`F!fBB&e$AP{UB&Wa*M zk>cz!i3kcvA@`D7j_pZGfB?Sq-v6OJ7u`dUpeLT%a}gx{-V7<~hdso+ogZ&TZ@%}< zo2PE66fl%O{3lTF7a03DbuJbcoek7v4?;1;+pKE8yvj{qRD}{%2URMk>TWS5mHU(_ z_e4}Z^gNYAFNa<(&M9Bz8%zaX@YrklC$hn-dFT{W5jsWa1d8vlur$J7W0ldXkRt(6 zN4-=ydK;+897N2>7TCeb4y<>w(oU-T^|Y_!Cr5{|CiO}vGe3$twSzc{vLK2Mx~ku% zb}@>2{aSlGliPXk_rHC6^U*V=^H^rY|L(2qbr0ed)vtH^3DuQ{-Fp8Z?xbkNAFaH5 zl;cA2qQJpPP|uXQ2abklG!H=~Nqm7R&gEtK z^K;e7HIqVZ+GZ2gY%}CT7O|m#8&;pr!QB-qa+Dns^5i!4tGGUL=cd@yG$B!`YC?c$fAQYSu53YknkGG@=i5ipvaaxxkQJ7n;q+j z!GlzsI%nXU=?lGtzMS-j@+O1MPci0R8guoZu%m|^a=RPa&J7e*{!w5&Bwai88^4OZIu9w0cvBcbj&(KH_XIuP) zKV%=QnL7Z6r()mLGdnO=CgEn;CCiK`fiC9UiuiBBR_-b-aqbOfoUU?Qe;%3h|x%e(70q5`>X)Mrhw&{RR#ElEh^`W~DJ& zeZ5<&$G?Gw!8YKMmvM7$h*d5=mER2(E@5l6FWnS+oT(aQze3|;Vxthjp90;~AzX;5 zCzSSpm8tUi8FIq!SYk$+nKBs8z+5u}UIXKyJcBk^3+AWh zl>l3R(R(HJ;la|eH}qQhG-wsT`**RnIP}gq@ZU7}JC!;CJ}LBa5=nMY4H6Ad@%>=t@|h|)06pRtayDZz?WD1rHf6ET))c(A wpknfRlMz~&)@Y2@UI5_y4`%*-`=7@HVn{;af00QcxfC;E#+fh3ALix%0hKtrp8x;= literal 1259 zcmZuw%}yIZ44$9e%_f94r73^qP*q&QAwl$tC@rY~wTdc*s#4TymF`TEEy*s-PO5^! z2_(4oSWa-{5&8gqiMjTaSLmtsq~S-xl0Ej=Yy0zflgY^(0m}b&#W^G74;r_LgRu^r zE`bn4&@O3=PTHV?H5f48B!Ua)gb3%DH5@_fq~s1Ep45iVK!&K^CLfG-;Pf2`Ngxq{ zL{xIYByTx3nS+T&H^P)*Z^=`GQo>vh8)u)K41gBOH@(w3+Iy5iM5$p0NcH`9kqn_ z!kHluy97QDeQ;**EV;FzfEw-dpGd!64spyw?4jfv9>v;tds20y*ks})O67_$?w4*7 z?i&9!95v`S&@ob&cOl)j@sJ#t7 zZdZ4CU<$tgW$EiT~6Pkc=@ z)zHo{tpcBsfD3Gk*Fp-hW5N=+usF_i8AKbfd@dfr2NxF6G&uuYhzjw|lQV`%XUHY{ z!S-2w^bjSkp1`+i7KF){$lPi-N_Cj@_SVq0SeMD+ z^AXk{h~h{GL3tI{rP)o_KpBU_TDYnix1}woo?^-w6gL&DX3O~FOco%bU8IK(?iQ() zat7k!W={rz$pt|#5&bUe`5@TuH@hQ`%3=|VGY^_^?a~?+2{n(NXDBSd8-YD2d?5Tc rQyjDpFS?MO=JvMaDomwt2XCRl5AMrk{MAuwYxsmVU4b~vp;PQ1^Mnjd diff --git a/__pycache__/perlin.cpython-310.pyc b/__pycache__/perlin.cpython-310.pyc index b2b2046f048575641e6635a470e5f006b1ae9816..6184a91f3f5a864dc2ed7442c797fadd1c10fa5e 100644 GIT binary patch delta 20 acmX@gca)DipO=@50SF`>a&6?cVg~>*(gZ~S delta 20 acmX@gca)DipO=@50SGGhvu@-lmveO diff --git a/__pycache__/perlin3d.cpython-310.pyc b/__pycache__/perlin3d.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d4d295586e7096ebdf6224d51d02270cd84519a GIT binary patch literal 11042 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 literal 0 HcmV?d00001 diff --git a/__pycache__/renderer.cpython-310.pyc b/__pycache__/renderer.cpython-310.pyc index 8d17575b6cbf264c1b5084b9de54d8375be3730b..999141ba14f867d4ac5dacbda2a0b5f280adff4d 100644 GIT binary patch literal 3667 zcmai1TW=f372cV>aJeESN>(IUc3h=RfUpoMJ`3| z(z7ecA}FAM4Ky!)=s%G9=0DLNvQGv2Q0OlNN!0Jml9VW+=n`{g=FFKh=QigI<8s+E z@IC#HCzncw@o$=3{Y*?Ap(Q;4X-L*F1Vhg|ylV=xYYB_xcw5+d-4TxN3!;GD?6}>c zC=O{n;YsT+Tuh0Qv_<);AstzGYskVIE~YVaWf8L?W;2q#Fsj};PBm&(p4rd4ely4l zy4&5avdsQERvlU8=O2LNyh30epn*2=S(rUSOYQ*#T6)1H3rxuabI+2dwBAAsY2!R6 za~}KMK=~Paow4HvX+QdC%+VgBC3M_?4UD=m;DE3Qb~6a7ida!()2f+SNzmE5#Jo2Y zOl*Aj*;*^^25a)55g#Pf);8nDK{tp}jDo|p?c=l+M{C{21G%PxNCqlUtG(mQt=GdS zOzZVBxFn>P!#viX$wgirt=6hGkw#FYUeCOGy&KDe4vkCo`l|!KGh8vlC{@$oqNTb5 zh`n+FNLqc4Yb-F0xnW(h$|EA%1-NS6wzbD4mnLj$leP66R>s`Py^i?M{uZwEm6=YzN2xp?J_eD@;GYL{*!>Aj;fkyt)APRv&yX-C?%^A%{J zEl1faqv1gLL=>ArT7TJz8~Yg#W!2X15^lV=mtf)b zcytWOka1oMi;lYPN=NCN_z|Q|mI0QT#qJ>oeahzakN?O`_Xp3izU$A7y_@fua4ua~ z%3s>KlsN{*DV%VI$V1Q1;F6PkYz}dj#^FM@nWe9@wC9b_k&x>noH^iQoT*Lj)P%hg zHe0E%z6$mLHxY$`|EYJb^RuNs#K~%fz?H0>TSl7}cFFr2G414j`4#pilqu&K{g#l7 z$7<&k6KYd@kJWyF3B{CJgwpKHpqM-5)TfAK$x{1{amI8c8i`hDm=N-yanu4BsGk$~ z6d;4cxdzv`QBGnIBdS`)d2AG-C3Yqb5#vYSp>~hoD zbS}L$kA1_v^XUie1yC-^>376y3FD>H+q8=~o-Rw`bB9vLa9%-wcRc@)DCI16<|SpW zw%fP=@Ob6HrYL;&@c!$EU)&ELAt5Syb5yg4B zlBlWtB$*^?#C~TI6RJ3x#5CiM)RY^VftK6_ zXd+&}@lIHZ=uP>lIl%QjV}IwbP$qQVs9K7mLwMV*IF0qgO%a#OihDtXHyvNSFPvPo z>xsr&?}SO(h`YUwKhl8|YK~E1&PD%|adeIzJge)-Yknu$z+kj1{40(M|AiYT?4uS^ zAS%6m6w0(EoK~Qdg7?yI>^D_>5Xl>w(w(_Q2X6ytO+P+Cpy&#Kiji`v9Fi)Bo>Aq{ zGlX^9Of3rb)S>YkCM{GHj;dh4vvTWH9UT{nloC8T(lsH!)m%7!)M&*@{RE5Eg8CWJ zlp46Ir~-M-_!ubl2|(s3Kaz1*6sX5*E;Bo1SoLdKWC%5))Yo4>=_up;8BJ#_2gUPu z7tRH0k(2rg<)Lq{|2{b0=$EM5$)6J&PpbEHqRDu=FZk}haE?$P;v*_WX(teFGr(Im zRmb{ym?u+8ahDlYQMJe)FC?_U3!92pu9?+?4>B9_qZpE6S$SB?o^3sU`fOMIlyJp7 z0pW2boL!x^)EcoWq)`JR2@Gl{ox{W18)k(NrKa4tY+`D24Z4+${diwqrE%_w? zy`)R@<9C_EJ?@k(=3XpV9`i7Bf2`OZtMCfVSbz3L2-d14H3K$^{uroP0$%_Kdy5{d zmm=jQhw^ovxk-)x{RXE9BwqUOhKum8*skR|Zpn2@j-u6S1xDD1>jRY^Xl_6MO5ZYl z_tZn;zfRy61hgy2J(-ytC)(iZOIn~pmV1!6Ub&6q=*ism{C~s-Rk4JM4@pEt!-d@d Kxy7dWoc&*|Z5oIG delta 957 zcmYjQOK;Oa5Z+na>y2Z(DNUQUghvq+0tc#69^xTY&{8Tv1*I1(L}a=qO`vYIF%Kc6 z3Q<8XJ)pgD3Wz_z0U>cm`~VP#`~aki8+Rx(h67&t+nMoxGvCgxzf`}M!<8WL7(PEf zIqJ528CGHG<&nvQ_DvpnQBgUOKf{zz?mAQMGad!#NmW3vfL{3SRTaQDAD{t6vxo0H z$1&9;zU}=835!6nh$~Qhokfzn4L)j-z-ccCy!ye`Re;F|1(C zZAoP70fd^{b@lx;ZKe&qhk_M?g8A&8?%$1O+eZ)}p#&j_U$$+^avZ*y8F_uJfsJ?r z8?5dtSIKp@!CL+ldzMEsXa(q7s-QeoRQ{%o>q3l#ogNbVg53cXAWLSYtT)?HM&3Ve zUsi7QB)e!w1Q22>A}@4_m0h A height and y < height + 4: return block.BlockDirt() + if y < height + stone: return block.BlockDirt() + if y >= height + stone: + cave = perlin3d.noise3(x / 20, y / 20, 0.05) > 0 + if cave: return block.BlockAir() + if perlin3d.noise3(x / 5, y / 5, 0.05) > 0.4: return block.BlockCoal() + if perlin3d.noise3(x / 5, y / 5, 1.05) > 0.41: return block.BlockIron() + if perlin3d.noise3(x / 5, y / 5, 2.05) > 0.42: return block.BlockGold() + if perlin3d.noise3(x / 15, y / 15, 3.05) > 0.47: return block.BlockDiamond() + + return block.BlockStone() + return block.BlockAir() - return block.BlockStone() def get(self, x: int, y: int) -> block.Block(id): return self.blocks[x + CHUNK_WIDTH * y] + + def apply_strucutre(self, struct, x, y): + for i in range(struct.width): + if x + i >= CHUNK_WIDTH: continue + for j in range(struct.height): + if y + j >= CHUNK_HEIGHT: continue + if struct.blocks[i + j * struct.width] == 0: continue + + self.blocks[x + i + CHUNK_WIDTH * (y + j)] = block.with_id(struct.blocks[i + j * struct.width]) + + def apply_surface(self, struct): + if self.y > SURFACE_CHUNK: + return + + for i in range(struct.width // 2, CHUNK_WIDTH): + if i % struct.width != 0: continue + + if perlin3d.noise2(i, self.x / 10) > 0: + self.apply_strucutre(struct, i, self.get_height(self.x * CHUNK_WIDTH + i + 1) - self.y * CHUNK_HEIGHT - struct.height) def __init__(self, x: int, y: int): - self.blocks = [self.gen_block(i % CHUNK_WIDTH + x * CHUNK_WIDTH, i // CHUNK_WIDTH + y * CHUNK_HEIGHT) for i in range(CHUNK_WIDTH * CHUNK_HEIGHT)] + self.x = x + self.y = y + self.blocks = [0 for i in range(CHUNK_WIDTH * CHUNK_HEIGHT)] + x *= CHUNK_WIDTH + y *= CHUNK_HEIGHT + for i in range(CHUNK_WIDTH): + height = self.get_height(i + x) + for j in range(CHUNK_HEIGHT): + self.blocks[i + j * CHUNK_WIDTH] = self.gen_block(i + x, j + y, height) + + for structure in structures: + if structure.struct_type == StructureType.SURFACE: + self.apply_surface(structure) \ No newline at end of file diff --git a/perlin3d.py b/perlin3d.py new file mode 100644 index 0000000..04dc2d5 --- /dev/null +++ b/perlin3d.py @@ -0,0 +1,470 @@ +""" +// + + +// + + + + + + + + +/* + * This implementation is "Improved Noise" as presented by + * Ken Perlin at Siggraph 2002. The 3D function is a direct port + * of his Java reference code which was once publicly available + * on www.noisemachine.com (although I cleaned it up, made it + * faster and made the code more readable), but the 1D, 2D and + * 4D functions were implemented from scratch by me. + * + * This is a backport to C of my improved noise class in C++ + * which was included in the Aqsis renderer project. + * It is highly reusable without source code modifications. + * + */""" + +def FADE(t): + return ( t * t * t * ( t * ( t * 6 - 15 ) + 10 ) ) + +def LERP(t, a, b): + return ((a) + (t)*((b)-(a))) + +def FASTFLOOR(x): + return (int(x)) if (int(x) < (x)) else (int(x) - 1) + +#define FADE(t) ( t * t * t * ( t * ( t * 6 - 15 ) + 10 ) ) + +#define FASTFLOOR(x) ( ((int)(x)<(x)) ? ((int)x) : ((int)x-1 ) ) +#define LERP(t, a, b) ((a) + (t)*((b)-(a))) + + + + + +"""/* + * Permutation table. This is just a random jumble of all numbers 0-255, + * repeated twice to avoid wrapping the index at 255 for each lookup. + * This needs to be exactly the same for all instances on all platforms, + * so it's easiest to just keep it as static explicit data. + * This also removes the need for any initialisation of this class. + * + * Note that making this an int[] instead of a char[] might make the + * code run faster on platforms with a high penalty for unaligned single + * byte addressing. Intel x86 is generally single-byte-friendly, but + * some other CPUs are faster with 4-aligned reads. + * However, a char[] is smaller, which avoids cache trashing, and that + * is probably the most important aspect on most architectures. + * This array is accessed a *lot* by the noise functions. + * A vector-valued noise over 3D accesses it 96 times, and a + * float-valued 4D noise 64 times. We want this to fit in the cache! + */""" +perm = [151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180, + 151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 +] + + + +"""* + * Helper functions to compute gradients-dot-residualvectors (1D to 4D) + * Note that these generate gradients of more than unit length. To make + * a close match with the value range of classic Perlin noise, the final + * noise values need to be rescaled. To match the RenderMan noise in a + * statistical sense, the approximate scaling values (empirically + * determined from test renderings) are: + * 1D noise needs rescaling with 0.188 + * 2D noise needs rescaling with 0.507 + * 3D noise needs rescaling with 0.936 + * 4D noise needs rescaling with 0.87 + * Note that these noise functions are the most practical and useful + * signed version of Perlin noise. To return values according to the + * RenderMan specification from the SL noise() and pnoise() functions, + * the noise values need to be scaled and offset to [0,1], like this: + * float SLnoise = (noise3(x,y,z) + 1.0) * 0.5 + *""" + +def grad1(hash: int, x: float): + h = hash & 15 + grad = 1.0 + (h & 7) + if h & 8 > 0: grad = -grad + return grad * x + +def grad2( hash: int, x: float, y: float ): + h = hash & 7 + u = x if h<4 else y + v = y if h<4 else x + return (-u if h & 1 > 0 else u) + (-2.0*v if (h&2) else 2.0*v) + +def grad3( hash: int, x: float, y: float , z: float ): + h = hash & 15 + u = x if h<8 else y + v = y if h<4 else (x if (h==12 or h==14) else z) + return (-u if (h&1 > 0) else u) + (-v if (h&2 > 0) else v) + +def grad4( hash, x, y, z, t ): + h = hash & 31 + u = x if h<24 else y + v = y if h<16 else z + w = z if h<8 else t + return (-u if (h&1 > 0) else u) + (-v if (h&2>0) else v) + (-w if (h&4>0) else w) + + + + +def noise1( x ): + ix0 = FASTFLOOR( x ) + fx0 = x - ix0 + fx1 = fx0 - 1.0 + ix1 = ( ix0+1 ) & 0xff + ix0 = ix0 & 0xff + + s = FADE( fx0 ) + + n0 = grad1( perm[ ix0 ], fx0 ) + n1 = grad1( perm[ ix1 ], fx1 ) + return 0.188 * ( LERP( s, n0, n1 ) ) + + + + +def pnoise1( x, px ): + ix0 = FASTFLOOR( x ) + fx0 = x - ix0 + fx1 = fx0 - 1.0 + ix1 = (( ix0 + 1 ) % px) & 0xff + ix0 = ( ix0 % px ) & 0xff + + s = FADE( fx0 ) + + n0 = grad1( perm[ ix0 ], fx0 ) + n1 = grad1( perm[ ix1 ], fx1 ) + return 0.188 * ( LERP( s, n0, n1 ) ) + + + + + +def noise2( x, y ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + fx0 = x - ix0 + fy0 = y - iy0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + ix1 = (ix0 + 1) & 0xff + iy1 = (iy0 + 1) & 0xff + ix0 = ix0 & 0xff + iy0 = iy0 & 0xff + + t = FADE( fy0 ) + s = FADE( fx0 ) + + nx0 = grad2(perm[ix0 + perm[iy0]], fx0, fy0) + nx1 = grad2(perm[ix0 + perm[iy1]], fx0, fy1) + n0 = LERP( t, nx0, nx1 ) + + nx0 = grad2(perm[ix1 + perm[iy0]], fx1, fy0) + nx1 = grad2(perm[ix1 + perm[iy1]], fx1, fy1) + n1 = LERP(t, nx0, nx1) + + return 0.507 * ( LERP( s, n0, n1 ) ) + + + + +def pnoise2( x, y, px, py ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + fx0 = x - ix0 + fy0 = y - iy0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + ix1 = (( ix0 + 1 ) % px) & 0xff + iy1 = (( iy0 + 1 ) % py) & 0xff + ix0 = ( ix0 % px ) & 0xff + iy0 = ( iy0 % py ) & 0xff + + t = FADE( fy0 ) + s = FADE( fx0 ) + + nx0 = grad2(perm[ix0 + perm[iy0]], fx0, fy0) + nx1 = grad2(perm[ix0 + perm[iy1]], fx0, fy1) + n0 = LERP( t, nx0, nx1 ) + + nx0 = grad2(perm[ix1 + perm[iy0]], fx1, fy0) + nx1 = grad2(perm[ix1 + perm[iy1]], fx1, fy1) + n1 = LERP(t, nx0, nx1) + + return 0.507 * ( LERP( s, n0, n1 ) ) + + + + +def noise3( x, y, z ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + iz0 = FASTFLOOR( z ) + fx0 = x - ix0 + fy0 = y - iy0 + fz0 = z - iz0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + fz1 = fz0 - 1.0 + ix1 = ( ix0 + 1 ) & 0xff + iy1 = ( iy0 + 1 ) & 0xff + iz1 = ( iz0 + 1 ) & 0xff + ix0 = ix0 & 0xff + iy0 = iy0 & 0xff + iz0 = iz0 & 0xff + + r = FADE( fz0 ) + t = FADE( fy0 ) + s = FADE( fx0 ) + + nxy0 = grad3(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0) + nxy1 = grad3(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1) + nx0 = LERP( r, nxy0, nxy1 ) + + nxy0 = grad3(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0) + nxy1 = grad3(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1) + nx1 = LERP( r, nxy0, nxy1 ) + + n0 = LERP( t, nx0, nx1 ) + + nxy0 = grad3(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0) + nxy1 = grad3(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1) + nx0 = LERP( r, nxy0, nxy1 ) + + nxy0 = grad3(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0) + nxy1 = grad3(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1) + nx1 = LERP( r, nxy0, nxy1 ) + + n1 = LERP( t, nx0, nx1 ) + + return 0.936 * ( LERP( s, n0, n1 ) ) + + + + +def pnoise3( x, y, z, px, py, pz ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + iz0 = FASTFLOOR( z ) + fx0 = x - ix0 + fy0 = y - iy0 + fz0 = z - iz0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + fz1 = fz0 - 1.0 + ix1 = (( ix0 + 1 ) % px ) & 0xff + iy1 = (( iy0 + 1 ) % py ) & 0xff + iz1 = (( iz0 + 1 ) % pz ) & 0xff + ix0 = ( ix0 % px ) & 0xff + iy0 = ( iy0 % py ) & 0xff + iz0 = ( iz0 % pz ) & 0xff + + r = FADE( fz0 ) + t = FADE( fy0 ) + s = FADE( fx0 ) + + nxy0 = grad3(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0) + nxy1 = grad3(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1) + nx0 = LERP( r, nxy0, nxy1 ) + + nxy0 = grad3(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0) + nxy1 = grad3(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1) + nx1 = LERP( r, nxy0, nxy1 ) + + n0 = LERP( t, nx0, nx1 ) + + nxy0 = grad3(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0) + nxy1 = grad3(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1) + nx0 = LERP( r, nxy0, nxy1 ) + + nxy0 = grad3(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0) + nxy1 = grad3(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1) + nx1 = LERP( r, nxy0, nxy1 ) + + n1 = LERP( t, nx0, nx1 ) + + return 0.936 * ( LERP( s, n0, n1 ) ) + + + + + + +def noise4( x, y, z, w ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + iz0 = FASTFLOOR( z ) + iw0 = FASTFLOOR( w ) + fx0 = x - ix0 + fy0 = y - iy0 + fz0 = z - iz0 + fw0 = w - iw0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + fz1 = fz0 - 1.0 + fw1 = fw0 - 1.0 + ix1 = ( ix0 + 1 ) & 0xff + iy1 = ( iy0 + 1 ) & 0xff + iz1 = ( iz0 + 1 ) & 0xff + iw1 = ( iw0 + 1 ) & 0xff + ix0 = ix0 & 0xff + iy0 = iy0 & 0xff + iz0 = iz0 & 0xff + iw0 = iw0 & 0xff + + q = FADE( fw0 ) + r = FADE( fz0 ) + t = FADE( fy0 ) + s = FADE( fx0 ) + + nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx0 = LERP ( r, nxy0, nxy1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx1 = LERP ( r, nxy0, nxy1 ) + + n0 = LERP( t, nx0, nx1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx0 = LERP ( r, nxy0, nxy1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx1 = LERP ( r, nxy0, nxy1 ) + + n1 = LERP( t, nx0, nx1 ) + + return 0.87 * ( LERP( s, n0, n1 ) ) + + + + + +def pnoise4( x, y, z, w, px, py, pz, pw ): + ix0 = FASTFLOOR( x ) + iy0 = FASTFLOOR( y ) + iz0 = FASTFLOOR( z ) + iw0 = FASTFLOOR( w ) + fx0 = x - ix0 + fy0 = y - iy0 + fz0 = z - iz0 + fw0 = w - iw0 + fx1 = fx0 - 1.0 + fy1 = fy0 - 1.0 + fz1 = fz0 - 1.0 + fw1 = fw0 - 1.0 + ix1 = (( ix0 + 1 ) % px ) & 0xff + iy1 = (( iy0 + 1 ) % py ) & 0xff + iz1 = (( iz0 + 1 ) % pz ) & 0xff + iw1 = (( iw0 + 1 ) % pw ) & 0xff + ix0 = ( ix0 % px ) & 0xff + iy0 = ( iy0 % py ) & 0xff + iz0 = ( iz0 % pz ) & 0xff + iw0 = ( iw0 % pw ) & 0xff + + q = FADE( fw0 ) + r = FADE( fz0 ) + t = FADE( fy0 ) + s = FADE( fx0 ) + + nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx0 = LERP ( r, nxy0, nxy1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0) + nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx1 = LERP ( r, nxy0, nxy1 ) + + n0 = LERP( t, nx0, nx1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx0 = LERP ( r, nxy0, nxy1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1) + nxy0 = LERP( q, nxyz0, nxyz1 ) + + nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0) + nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1) + nxy1 = LERP( q, nxyz0, nxyz1 ) + + nx1 = LERP ( r, nxy0, nxy1 ) + + n1 = LERP( t, nx0, nx1 ) + + return 0.87 * ( LERP( s, n0, n1 ) ) \ No newline at end of file diff --git a/renderer.py b/renderer.py index 5480395..00fa797 100644 --- a/renderer.py +++ b/renderer.py @@ -4,6 +4,7 @@ import random import threading import time from world import World +import sys RENDER_WIDTH, RENDER_HEIGHT = 640 // 32 + 1, 480 // 32 + 1 FPS = 20 @@ -14,6 +15,21 @@ class Camera: self.y: int = y class Renderer: + def key_press(self, event: tk.Event): + if event.keysym == "Escape": + self.running = False + self.keys[event.keysym] = True + + def key_release(self, event: tk.Event): + if event.keysym in self.keys: + self.keys[event.keysym] = False + + def is_down(self, key): + if not (key in self.keys): + return 0 + + return 1 if self.keys[key] else 0 + def render(self): offset_x, offset_y = self.camera.x % 32, self.camera.y % 32 index = 0 @@ -25,14 +41,18 @@ class Renderer: self.camera.y // 32 + index // RENDER_WIDTH ).id]) index += 1 - pass + + def update(self): + move_x = self.is_down("Right") - self.is_down("Left") + move_y = self.is_down("Down") - self.is_down("Up") + self.camera.x += move_x * 10 + self.camera.y += move_y * 10 def update_thread(self): while self.running: + self.update() self.render() - self.camera.x += 8 time.sleep(1 / FPS) - pass def __init__(self): self.running = True @@ -43,11 +63,19 @@ class Renderer: self.camera = Camera(90 * 32, 90 * 32) self.world = World(self.camera.x // 32, self.camera.y // 32) + self.keys = {} + self.sprites = [ "sprites/air.png", "sprites/stone.png", "sprites/dirt.png", - "sprites/grass.png" + "sprites/grass.png", + "sprites/coal.png", + "sprites/iron.png", + "sprites/gold.png", + "sprites/diamond.png", + "sprites/log.png", + "sprites/leaf.png", ] self.sprites = [ @@ -65,5 +93,8 @@ class Renderer: self.tupdate = threading.Thread(target=self.update_thread) self.tupdate.start() + self.window.bind("", self.key_press) + self.window.bind("", self.key_release) + self.window.mainloop() self.running = False \ No newline at end of file diff --git a/sprites/coal.png b/sprites/coal.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0380d0a11f10f431621659202fdd649f3dafb5 GIT binary patch literal 469 zcmV;`0V@89P)g&ue3Ct&u^YQbUYpz3rZ~6d^P~)*G-)TfQXg_7^B4jf~hVliUP(MD5U@Z zWm&>|53M!QG@T#dd_JQr%U|c#+FpRkMzGuM5JeH3s{@zI1w~Py zX&N}^;Jt_U{-scjRjUKr?H10tRtNqBAc`U!4u{E`wQ2DXE)MVoyf2yONjQx700000 LNkvXXu0mjf_J6=g literal 0 HcmV?d00001 diff --git a/sprites/diamond.png b/sprites/diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..65a4317c6fafeff32513c86a0f3c94d76c39d01c GIT binary patch literal 480 zcmV<60U!Q}P)!`NTL3>gmcgNadOZ9gw*SGjsztnSv)oX z&Vx5K763v>vH)R}iX-V#Q7~6k2%N(eMU+hwSL3l~Y%Cp^t16fz;Xo<4AmE|h_Kl4N zplTQp90#f04umn3P184)oPFTm19*<%bESg2UJq_A2S^eQl7y0F;d(SWnviq;dn3B< zbnsFvVxP@oPboMdcx<%-B@9#C7vN?%1YIm3Zntlv#5qcq6)JI1oiv7F+x(MGx`a^` z4-61yy?*Ga*~Dx*#cVRcQc-;4B6GsEEW_^i;il7Iq6iQI{@y9Uad6vcc%F-F8`_!% zC!ha(CX9gq0Ar{chVQwf0Dc$l`}>-%!yXLaQVMot1%Fkn%P7dS#A?Msrp5CUtYsN? zw+q4;4w(#C2rCXN&kop{2B%QK?(!0DNGpy6pr-4PHXG2@3KxITilbEG{{v@$Gr%hp WkB&Y6gdbi(3Yvi>p%yJ476v zN{1>=9mGXJaH-HGQwIm@P86#x+#FF+h+08Wy{?%ipz`fwjTHMqq9fW03j*52Hvdy*fR zlc)o$EBmVn;O$zw{*A3bJG{@Wb*AoHk*FXo>>rEyne5?%+Q64NEoH>tc zb8LW(%_^N^7thb3Ds1o0ojH$d^DvF{3{^GJrvGcCAxx|J$N*{T!p|tm{{Hx4<%nmG znuLKcQS6a(6l0WEjS3$=Ux}=Lp#xF&_s7@kO{U5|m!~{zA;57$j8UE}e;-;uu`Afv ztn$0-(*9%d{2aZ&5Qf6*MrCMT_8FZU!W;8lp4PvTHz5E;3+0ke%{fV<39HpA48s7W^qVAD}Z2(Cv1?7z6O# z51exlLa^WOF`Lb9zKs>2C<+Y2z~yp5u~-CS45n$qw(VE}j&*zcf-jzU6 z6by$$6bc1ov)Q|b;+&(=Xv7M526s)U>pDuM5+q3iAq1Rr9FIqMo(Il3Ow)WDIS`S7 z(P)HxK9AGsgnqw|?RNWC(pUli8gKW3XIwB90nfPL+Xbkq3deD+?Of$)ug z;%Z!sF-Vex>2!+aa+%~F$pxf||9>Njn(Jrh{bd1BwNEndNkpbvf+QjnjiIJ#Xt&!z zK-;$O7K>LAIR)3XN|t31LY_95pK$>Ex}Zds;JQ|2G8qs;AcP2>M;p;^aTsGDgrM1M z-ke94;JQ}HvW(qshhDFT!{LyKR8>`UIvofhKqoEST_~Qb;0PLRFg8fKnbN~PV07*qoM6N<$f)7azb^rhX literal 0 HcmV?d00001 diff --git a/sprites/leaf.png b/sprites/leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..779dc5d542a603e552d11dd4315ecc2a1eca6167 GIT binary patch literal 1157 zcmV;01bX|4P)(Pg5(*P3bKd#s!V@tB7abPs6Ylrk6rByOqxlu{xN$&}_4kDwY zGyAzWr)GHP^qkF-4c#3_>HV`s^)wq!D2JG<{dB&AU9-HwEsBH7^SQ!3d? zW)G3QwWsry-e{a=MV)_J0>E2MHYlpIWCL{L_|NRCMQMDUURR$@K4rzO=IaP!K zR%IRK-XTqwB2+42nsyG&LM9`_|7<|18T6i^%Iag4Jp62s+u)uT!lR#~f>f#!vZ3i_ zGTK>0S|TwGvl5yGs#0Sl=h7T_^eAh=8t{VuyklRFGX-T71OcsQBN-;#XXkY7R?WRc z)iejR!d?zwHL9|NN55{&AqtG1MKNig_eeIjlqnH2HlaRMpw*1I*_azjN(W2YlPM8n z70eo|WR8vL>;$F3$QCrUvk2{2hCLaIzwL5SXlDsb+fABoXsn4;j3fS+(dhwIqcNB^ ztwhYr5nY*4#;)q96&afH=usL}H6OA1TqnKvj*Ox*L+0SXB)H{emopuGAozgNiYSq3 zMlO|9mhj_-em%{Mo7Eg>3HNCyWJB)#f^?|~&81%LnkW%-s-}A&@A#2Ak9|9*Xa}b@ z7nV|(%UUK}+jJ{ztm#al>99(x*>D;4)|MDkW;T^bM4AqDtS}q9KHm!E9kE3=O2oaL zXX(#fAFl1wff50|x2OjAK08K$p$GDSDX4_hrjo(H?y4Oe-dp9P*gj`kwR;1_48v>l z`EU#DuJVDB`wIl*Mw-sE!OtugBj$7dL7D51Hu%{aH`!Ow}B?8K| ztB(m%{<9(cdW@?yiXe{!KYgq=kz~#l%4+(LEB@m;@f66RqOMHJz%s%4N&;|SUXZRQ zdRd_%8}>hLt1_8Wg+5gDA6Mk|K%Z-(M3h!2XFw^sufK+SpfETi1-f$d->z$3cA|F3 zt;Gz}aW*f!;J;mo5$tbOIz|>`b0p)g&-F6~34!kGC((zeS94Tq6G^^l(<}j^_p6aU zIxu=(oMZmlq|zuLvO32m50ZsVr1+^xV~A|wVFkmyJjRu3O;W(l_55T#GrZm9uN)Z0 z>rBU~o{KDwlxMfUJ=G|c1KA!}GY86>4pJv$b^0DCPsT}u!hLz!9!OSW-!GWs{yz90 XtZB=3~aGfkwfM%Z^$F^{|C(_7gu4U96TO_5Q``2n=y!{ zQA;*`f87}X?%v`NH{{62?%pCY@Uw2}d$|rk@vb#yj)#@G3Y24CSk8&eufX-(dMqk? zya+fV+*}>3ho3d6L0j-d#dBmn3G570wJ0Yg1GL6kkYqj4NdN#oO!0_E+~6kS8)eSu zN{{%aH^ETJT9bQ8j9}_8Zc?pcWn_lW<^*G~WqWD?mXu&okIyJj5m>f_V9z_ZAS~(3 z3r&Hk1^Kj8{CbUBP7n@)Rv~G-8?pLl;Oe zbdS#j)-X)MPf?0DM&WTa0L@*ErwIi-m5rq3@f@;N9FRE>tSvgJNV3bU2;;K8gEU3vnBrrPN3jX(U zd?^Q*uT{ewE#j95Xo3Dxgx(?`1Ig!`vuJ6gRn;y5Pjx{VDd1@TSe1}fRV5%#6HINV zcXMD#2|ef>A2Mgm{Xff4dH?6Te>8=Xo(-skLB%^XfuChbw(JAH X|0)luId|HM00000NkvXXu0mjfr0n^) literal 0 HcmV?d00001