From fc50821ff0c5882c5dc6313d8442e101885b7069 Mon Sep 17 00:00:00 2001 From: Nathan DECHER Date: Thu, 26 Mar 2020 18:05:12 +0100 Subject: [PATCH] added holes to the game --- Makefile | 30 ++++++--------- assets/hole.png | Bin 0 -> 32938 bytes assets/hole.xcf | Bin 0 -> 130602 bytes src/js/assets.js | 52 +++++++++++++++++++------- src/js/snek.js | 95 +++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 129 insertions(+), 48 deletions(-) create mode 100755 assets/hole.png create mode 100755 assets/hole.xcf diff --git a/Makefile b/Makefile index 341a0a3..392dad0 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,21 @@ .PHONY: all clean +IMAGES = $(foreach name, apple wall, public/assets/$(name)32.png) +TILESETS = $(foreach name, hole, public/assets/$(name)-ts.png) +JSON = $(foreach name, snake levelList config, public/assets/$(name).json) ICON = public/assets/icon32.png public/assets/icon256.png public/favicon.ico -APPLE = public/assets/apple32.png -WALL = public/assets/wall32.png - -SNAKE = public/assets/snake.json -LEVEL_LIST = public/assets/levelList.json -CONFIG = public/assets/config.json - CSS = public/css/snek.css - JS = public/js/snek.js -OUTPUT = $(ICON) $(APPLE) $(WALL) $(SNAKE) $(LEVEL_LIST) $(CONFIG) $(CSS) $(JS) +OUTPUT = $(IMAGES) $(TILESETS) $(JSON) $(ICON) $(CSS) $(JS) -all: icon apple wall snake levelList config css js -icon: $(ICON) -apple: $(APPLE) -wall: $(WALL) - -snake: $(SNAKE) -levelList: $(LEVEL_LIST) -config: $(CONFIG) +all: images tilesets json icon css js +images: $(IMAGES) +tilesets: $(TILESETS) +json: $(JSON) +icon: $(ICON) css: $(CSS) - js: $(JS) public/favicon.ico: assets/icon.jpg @@ -40,6 +31,9 @@ public/assets/%32.png: assets/%.jpg public/assets/%256.png: assets/%.jpg convert $^ -resize 256x $@ +public/assets/%-ts.png: assets/%.png + convert $^ -scale 32x $@ + public/assets/%.json: assets/%.json cp $^ $@ diff --git a/assets/hole.png b/assets/hole.png new file mode 100755 index 0000000000000000000000000000000000000000..a8278e0d2fa6002143ea732523cd03a7a4bdf5f8 GIT binary patch literal 32938 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%0A0qks0tC zsh36jnefbISb7j5go|j zcJF1tB3tdhJntA;IQ;IIGDgB4HflxDd9uF{nJc!&k3pN2Pc;E9@z6N265G?}8R2uG zJf7THa1Yl209kzZO5UN_?Kka=wBkB6sN`f-Sd+B=#41R#I|_1Z?sr`JjtW+u{7H$- zTgT9`JzK<^nwq*zO+`h_XOMT6(bd)E3MOFWaGqQpNO@c1;fQg>7slAJF(cHgSA`(q z)Jb#q4U-5pg0Xzo70V^%M2q1_IoTXh=E%Z^PwDCDf;u$(m_513>r2;DaLJwv?ct{c zow3wPZr~j#d$E)V&CamNdfSm>jx=BbRZ~xz?{wCV6hDxcHxkUauI)$L)H?QyTjWoM zEPqWL_FEs;Uz0q`*H)LkPFqan*J*QW;KkD5l2C}Pq z0{4F@4%jw(FX3A^Jjq~UWZW==QMzGoJufUl*EU@jG-T3|5fQ3*&s18s_AUvWV-phu0+`#Xmm%QZ)|!LR-^eAeEW9lG_*G6T zr=$;7Z#@nDdYd?pH?Deb&r{tf4g}CsuZ8xj)4%JMiFadTV^7_%rzP$$L)tuL*ZuQ{ zBz8A84whvj+`<3Gk~=iyoNBEmEgx}tR+T3ow0GB{zplLPzz(a?WTlCLt7vIy3B}3& z0zt|)mg8)^udh#;(Xm~o{O7_)K6k7&P3M!(9fmLqEiDo>oB`Y|vGbpvURY7RxF5De ze$*SW(|aT_qHw5~cj)EfIwwg#TGo#!2Z4t{wY8(8ab#bznHHlAQPKE+1Xw1) z{_MA;KA5Bn$uF1Vpl9tVxnAwTQ*#YSt^8-pr2kGncl;EJ-C<5n0kQeAZ9lw;n!+)iER|MNc|p*oX2a_SH?Ld zW;`x|QdbHeiU^3QL~-VBj&`r2r$rt;@8CIL^=2|Bah7nPMwbhdW1L?yh?l21cet!wYKh1=z&CMs>dEmb0~|QcAwYiX{}#sA z$(RLqu8<(bm<$Wm(<21g`dllZG@qm=}Fd>2NL{7zzsDDMdY66sE>Z?#TUq(h#QNKG7I-ofR$3OR#EnO^3%x z9A^lHsgUAfC{S?GOy@twWW!91>x+3^jua*k2<#yffh#`B7)oXcO%+m5Np#fsZZ_gM zjW8CX-+X!dUc1){?$tuY)RQ7Bk%4XJr#3Qrnh+z~>%UoTpId(m3q*lgerRUSs(xCU zzKH0dhltht>gv?FZf(-iJlR5YjNWY;ogqWF z-N`)h@t+Pq5sJv3?kj>sbd7C2F4mi@3nI&~m>2Db*CiL%yC{Z-lT#ReSl3JF$PuUF zO-4zkdFP8%K}gegxzE#O@Y1gs^a{A&E_ng4Vk{VIOvVK~F8Vj*6;X#5^_Ue~QY)y)5+`9bE8zsd^bV+Qbm9=8P(7h@T$sKaMh{#U6fn z5ztMNjo75j9m5BT?Qq@V(*O%bN|is(?%mh7j}H~79zmYvM?qQh`4-8k^X(S% zNih6`j-%PZ{Q~hk0G|7*gH7C`iU5W`Yk(au3go@NCMJqARX)9#r2zh2Tqu7I+P87U zVsz51r0|?dQth$vQc=@nI0Qe>>-S`cC*0yHIWX>0bwQpq?sznfdm5J%v0%n9wFH@_ zg&WciOI&Z+m+2H?HJl23#M3)8YXC5S5#cxds5l-vRM~TgsvCu-0RL}0Iy=26a;-U}bM z97Y!w*g<5Dcn$sg#q8ct8Iv7uEhg@;>b&#y8up>@b0^qFRu7{qG#>< zz#1uGJN3fpA`w0tEwr0peYkf86+OP`?sNzY;d5BfbVY9L@87I!>sz<(JVR!6)C?t$JVv+M8jHHz# zYMs;@*2Ux(VaJ<18f-3X784p8insXr^V9j0g`DXR*2J^R1Qx{7j!a~Bn58Wlu zqZ*~k`Ec=q|BNkeT@CWVTpUL41WI~ChzoC9+Xa#=l~07v|9Md&hMm8lk|F9qQpT{C4kU z?XE*3eiu9PFv94=dHj*sMG6ydZ>Tx!?Z!B7=vPKZQqK3EKQq8e6M}ZM`sZp2;FO89)#6u0p3Zs#trlS69UeaZARe|4WLAyuXKLbma zxJ*1hsMA5Shz4b4?}E{A8b(M&jp@{a>WNtvGQL|3UhF0qiCG-F{$qtQ70l>lyig9> z`*HqA*8L@1nB3wln_}j@C#7fd z-?1Hmcq zo4IW2!ILRyLr9z~tnfW~t>t#y+rWhaIIMn}_nyRc3doTLv2oBAkOh9Co8juPQ8~#T z3F9S-n)m9sx?d3SZ&Uex)lPp|NEoBG9>q}|3j#`xj7c^NwkTYB|)jMQ+``ft-mOSwHie|A_4qS z5x|2y{d-eV$BaSq>J-VXqoB16om)R!g0?YzZZi!{vSMPl{DXpeNvK$#*}$60;iXov zxs(&;e5mUmNb5yps#8Z4dT zw?hm?i1{<|(PSEQNqA&ETwzP%u*UUh7t+C9JuPg*=H_N0$hEFO=|0#|IzgArZRVKi z>OWCUP=YB^k>X1d@yukQ4g+guDLKc?3f-}&dP8RRiw5X%$O}=_EgY%I7EMrtbRCtZ zjVnH_uR$P*GbP$5IMavg7N3}412laKnt`C4Lc9pUCUfhj@{_(T5e?jvb3lzfX?Oxk z7#*NspghpoIOvq*qX3FRrPBzZdNtP-2Nr_266S(NBZFT;6x9_ejL6m0YaA=Nb>8Kq zWS0^cqYm)a&udy#5P=ly|l^Yta zT!);g?3nL}RBpT2Ysvb0>ukGyPVbkbA@VAyeg8iHVR3fXdogX}c<$F9d&Rcw;}F>7 zCvC|HMRk)$P_5*p_u`aM)+uXCs@V$&^77h4uToW39>_LnSp#G$5r0m1=X>!!azG-yoSarcMJG={ zX(&L7f&x9B>i$wz$B^1_Qo?%*Db_8knbtf=Su9*3CBxc?7-HuX=@{>9zWZRVv6`f& zT3sIMY>z7OfI&EGeM8(Zvg6!3{!l`Xu&~QRV9(O+OOi8hOZUpJ(EV3OO0Q?J=LZSOtsiIp1RzCR zN*|K}AV)bB$8lghHq)gpXy(lMe?LLKPt;8*OQ^A=u*gB91)Ora5qbo>;+=>QWS}RY ziF5;K2yeZL7ByRd@Q;*<7|&3BV2aAtft2hTZTK)-T;y=WiUR<^M zgv!%P==0#CK6&0!C*2CJZnDwJ)6}kIW<@;t3|Z5rM6gMO)&JNW@>Oy+4dG1Y=?;kt zVdO;p$ZnC;?HC`IBx@OFMTr@gPZ^d^<%1iL`)=HK>hKLUeZOr)3vge1O~AC5%{Xc~_{bWh|?HcELr&d4Y5 zUa!zZdZB4S{_fp4sOr58viInl|K$5Tr~^as?6aTILJact)3*44fU|CY1j3+5EVVQS zPGgiNn=SVe+9L*@kBRxDA0X+ODwKS0BVWpzfKObf^fm6=l#&k3`_h=fumw#uN^xC6 zPME;Th0=R8J8{&11+-HQ-YY9xhLPK{ih(=dADIYdj7&diXu@-`ZtGTueHGU*Pcg(c z6*EsE?%22e`uL@=R<&q=;-pMi6R==9*r~5SP$0DGq*n0vM~@ka6ct-(3dpCg1v`}C zUF~eU^J63-_)t~TUjZ}L#X|{!S=l?{ky%xdSKGvZrj{0aG5QmUT3~B8&ox3DlZvD9 zNpo=~pfNks)G;&dtPkp}I_`Vq`q}>2;==9v-`e8&<9hK_h8>^BFY1cq;~G7n@5V}T zkM*Wsz3exTbl=UzxPv)16&~?^me1Cuc0l3z^XD;O1^>*>Zt)mYI~Jah)Vk0cBh)a= z_RNK*E{aaP~1nJzY>&CSG3qww|-KJO~QpVKb@b>G5$-_S@@HP*(wkuNXfi5`xBM znNrwm-pWQdI-VCRlC*Mk^+=5GY_b^~JW3kJw-`+H-o3R`WA7^y>?hY@7&}Zr50wm{ zxeQb%ky3H?cf@rHvD?Na4S0@p`Rmc-?DMZ8e%N}6Y_d#`&kq{Aq1j^`BR}#rEJ&T_+qX|V zK3fj5(>?BUMC$hwqk$+xRykiNs94}~q_*ERsO0ea@d`=sE?%%kY0zmrJO4ew$S$9> z<#f9gW=COl+YZM(n2{Bb4!^5UYi=1pDOitJ7`0Dw5Q87`prz(-Nx;V5UcaC>lXkXC z_<)ts#J5#$g#}yDmDfxOq5?dxTy6)aljE#)yoVX%7NI{L3)08Lk}6FF%}Wp65qc5O z>n2*v{cM{5mpG0;Dh22)HU7Z(mtJyUZMmG~gTY&}=_*@x<>N`?k=tbP^1V3RT&=kc zpjE=`vlH_U#QOdxQ&aCDcfT5~J}_qvx3Fx-kAmW-r_+AF8Du*;IdM2#yR)&i=X?A4 zeePOA#T18fxH^CwyYcvwK7W?Hm9ls_XB-KJJDFV>m1WDOX->@<2NVxV zCA_O-mBvi!%=7BPhc6|%Yab*`OP$0vfSLr7QZ;Y0KL+5UWdWPgfjgoGZ<)a@g7iKV zX7SnE8IbjNgR)3_;?v@bC$5`NSe{#>$14HRV? z1kujFw!HS+gtC>_Gt$+UtP!uSZ8&0a3=0j{|5e|Nm34&^tTM_{v6ggsJhXM<87Hj8|>2L zCha@)A|@-@!T(4h4$8>F61(n0sL~a!3+Y6d@ZD?l-lHf>PdBU$FHp$FH_BX7lJ+gM z7tH+T>|bRSf4lA8Qn1ZhZ2$Ao&Nl=q`P-!p&&35DxiV|yvw5FD*SVWS^5bHnqsgKq z@ba(PSgqtz^Mb!qh?DTXK6gJ4wd!R$4bma54}PH&5E%GZQa_TUb3Q+0s}yO#os`r6 zJRu==-m^tG;&+BwyZD0#|4LdP3ap3C>BACX81aN`H`Jc#MpH52Mp3MV8?JG+ySe3%FVY25E}i#>E5S=`y27=?X0iuUz; zHiz#q_s23kD|fo`OW73CP%wxiLjVP@^AJP+%zOI1nkZL#0q?C8cb+&oo@(~J9({iP z4~ytniS@`tR;#>6uGPG}1G7nfGj6HiUc5sN*Hn@4Lyzh;7ue%TlXKu0X$kR$nuF-U zA~D+vDQ!8amswIepM#$B!iJ}>2frwS;27V#KM1f9NRMBy8MEr8Lvm!KZx{=_E-`2~ z&8BuibxoDUuQq3U|ELM)J5f5O!mzL=Mjf;km zrL-W~r@_=C z&t@d{Kq6s!4n5$!b#ZM6_B@7>ZGl;Oh$&ECU!YzD%^)Q$EumdvEbEqX#C5ob7DQNa z`g9tE{Gq5<=&DWR?~W9x2;}mI#3M(K9ehRxQC#PJI`8Y9d$NC)m+p~OyU?aV@k_a> zlx~D@_wy3i=^nbUUuYE?s$#^GT?>8^s75=~fP$97QrD@*^yk5;ZtB_++E=;kjh4m| zWD9-{Jih~>#l63D*7GHrvQeo*jwM$?cve`PZ1QVvotyr2z8Qkf^hZiMSt`;a zjowQ!pTT-h(TMJL{dD@3f+1m87=r(^KaTOV{4b4 ziq0UlE5mPwu-DxEEx;luv>r;87k9kp4ntzI3ZAhsGBR?-?J%;l7f4ugF({yYd-=DH zAz%rep8nWuN*a}ltJ!8E_M43zkA{S@3msyuJ@b)NY*}3xZN(`zJ^=Ir> zo}66k8(t>RP%w%&xgFp=f^;X$fboQF&o6xKizhdqZQ(lX^<@{*P5K+21%2Dw$zSk* zW!fJ(OqczQv5+#}uh~}91*rV}L#7Pjj@>7U0-L|7!m%FFD+M>_1^0kdZk>g&@$ll3 zIH^&DnqaTpUTa#+)Yi+l*fcm7#Wo}cALJWiVqz~>da2YP?9&ME;nz4)16Dc7^_V8& zz~GfS3U>LNL`n%6c8131MD72)ZeBXnM5#jc&TaA+4w_o^+?`@#edlDumNiX=D?R@5`DRBUbqkMj5O{l9@pP;R`%Rk%<`ZV(e0a`U@0QQ-F8SGE>GfnC4guS|bkz&##PN0*Ncn z46J+cMZc=DO!b*+XFMMl@fx8?x~IW`GWrp+tyy6mDv`{}ri!(Rg({)MAThwYjnb=- zhGsYUj@5$A$(of^SOdiwEzo^Yvj;)jh>DuK66lu?U|qvVj{ z2me__I}ZuLgn%|pifBL7kPlhifF1r$as!IqwtKLKFR_$y~!`qN48Xy2{`uG6W@)amhJbj?tW9CaV1%PbxN8ki>|MtfervEPm&Sc ztts52zL`oM;~w1%ALqt^OjV-t4_}k-ISGd3r;NS!`)I<;*|@L7fJuef?{xS1=8k0qO3twFEn#giWk_?UlbWO31BPH;oXqcBUx@ zHmo@7k~x8HRhv)pR~LFYZ~ctS--=mee*RcztuILMG$(n(7Eii=+c_`zH=V3&cBC6e zT<0^YYD`^|T)NL{p5u+Q>q!hp=i(^TM(%aCfUu=r^&7nX`t>OBMa(0TCcTY>SRyuix2HwAZK5K^}Qu+0M z?^}&_d#nK}C0a~rD2P!m@>527`-T=PpLX#yiQ_A=4WTTbuxE_D26>&hS1hAHXXD|e zgbSy2bF6M%R>n2en?lkTYYxtR_WIx8CFfv^jZGzBs_?P`&Mmf(P)0sPA6dc{khrL*(AtSY%`vZ(EvW^;6>P^5H8 zci!Z&5-fhDDyDlugd0w&x1`Y32+8qd15>H!vjdJ3YiN6Vi6HVQ;k*C5 z=6msM;>@PV{9rHFkI54mJ!^zC9=@3f9cWnNsxPe&3H;`mg4xC9ubY!#;fPsx@sMSdy}BFv>O*jolfJ_DoM^#oTFvG{X!N1b=^{VFy<1=Q^d3m zemyu5r8l-XnO3!Qib)Kp9l`gF1#Ng&?{4Xt!W}%0SV4n_Ec?BRyE@|)Y+MOY8>C+< z6f$Bvr}rtUmfDAPMJ950=D<(+B620eY?wO`)*@8fQa(b9~FVTl}!2se;H|ricNJJ>g{LW3%!Hw>EQ2!;7flp3Jqjy(N z3oowMuv}mI&Cs1(2C#K3ob6ST*fdGkW1)wm=g_uH0)y$@0}HjBl2^>hSO+_7IQfBc1DN~Pu!b6`z1`ZyUs;B( zN-6xwiEDhsh~38Px442>BxRQF&yRY`r< z*(xDqAWU{JL#e^r&!>#A%j2Pl|FirVJiDE$>#eFvg!2*)o;XriG2-$Wz@azc|E0C4 zmjaKlTI8bGUO6?XO|@k6%bJJ)R^^JAc))mcu4OF-nH=Tfrg7In}A7%0pBGYhqC@ z>%DNmF?-_=?%cttZkmMu1(93Ct+&OW7Q+V_WBJKgt}W`SG$9(LlhM9SEae~P5#;gs z$?V~`Vq-@N(HT9waS!hijhuEV;$?i}xx2D1G(I*(lq39C4hvCTBvJXI;7P1<&%2?F zQ~bhb+{K>tz{^6ReE#cg}licbl?mY+L=v=2;Zano-1@-E=QkZfSj3@J3 zAA?VgiOp!qL-D$~jn=^kd3My`QqWN5-iHUj-jvMD5=k&QQpBqklK&@Fdry(&|J4W- z+su}5RZ!Jlp%@q)9bKQ0yjtScG0(3NQ|_!y(f|zCLJ+_27*rVdy?|#mENES4^Aj=N zg*u!}GH+A84D=5KwE_{!4xwT(9Ak_FsUMHCj5Hf^Y}Vqrc!;UX)sHoowB z!GZ7;i_V%)-Kd3dpu z3VYFhk<-IfXw^a!gm1}mv*olJOp33QA5$sUgWWa~q8BqNt(T;n&rb5I`Hpti7Mqff zaZ>HmsJ(4C-j zbaZ@`sgy-y`DE`}Q+zX<1|KJ0ZM0VV=l*FNoXk;DLHQvke|=?~2E??=dd9cc8dY3e zN1{?AS>^u-qQcnwz1CfVKbPuFpoT8P6W%q>s7)yaJ!6BrYeL&v0#X)5fo6LJ)+u_L zBqSt$7*XOV;|~UHEnp9A6C5b`ynpdxg)#WJRF}wX1>XrqVqZ~eO6b#O^WhGb!;FL6 z_AWo+0Rg+cNdoj&{bIcl8B)fhb0hw+Z}@?*!HtlgZ-^HnTPpa?JUee32btQ@{szGc z8+tt3E5xU4S8a+aD8WuqVQFPQTV%-w)miscfjjbBgDuyxc zJ}yIUl*G?pefE0VawtM$SyL#;j9s@9LPNo+iO1!pg&mPv(=my|__sNC0S!cy)5+$> zCZ!6!k{38FbnfB!pLITXiubLpigyE?tUx<$)wO)8tk1aEY1;I7IjoXM&>>qH#~=T0 z67SWc`=sG=JUC)`abhg|=;&y9Fx$A!xB?Qb=je|$PyCfpF8aXNeyr9af@YR+-YsSssqTaExlMOdo$<{$8Utiim+LZDZh=M&~cQsFajWw-(uG&Fbn` zeTvDf=NFQP?gEO!4!(FtvO6DD%`(~t$QiI%lu6k z-R2vKhl?S74lhOZ_a_cI6$zVF8G%OYrIXz&Sq0f@S@JyQB+0~Ebj`PVeFl(P0vc#; z{;Zd0Jq4lf1e7%A{@Lx8k$fgDew!(omwR4mQJn4GS>I-2G0`msd`eI5-$=o_31swseIo^G3&~!${ z7~#LhdzHGj6`th+le*_JO+(nj1?%BTW)Ho!a6LWq4((CybW4?Eg6?-Eo5xd6NRu{Q z?`7yz*_6=U%%>&-93SsNrc4_tI76h$_*~-Kry*BngVVOTwvtk`%St0q1zDq140Coj#jMqmBZa^b!pMLwk>s4o(=J59^LNh;c0ZuA&N#xm(Tu>B& z&n!pQXjN!Qy&j~KQLA(^k-Ktf^Fsk{bAr#BUWt<3pd^VR#riB zR5Ykcs_ysAO-9xu`{U+-SHGS}tamdKEF2!BgL4QR=*B4j%&&?CO|rQ?Ik)=+Qr8m1 ztX2C>(gLsZ-hPM-yq3c@&;kb=#VH~Y0bWozNiT3pw{5_Ghi_o#T}D z&2CLhL)@FwE?n70#;+ys;M9$mSmn!)LFMr8&LP$R#s~eU0;_eKV;T_Hu(iSL5zvMs zL&~Y0#tr#W-NiP;Y(7N(5J`Zg>y}i(G8ZARjumi~r?oMNJPsXWw^FO8n(`@6-dv?! z1aoiG2@q;EAiDbE>o)dmqAT}2(JwXV$a#*A{9~h*R|?Mf)41LJr#<+-Ll(45sC`b3 zL~)v04DtPLSRzMOdD~EGynIFW>S9$6+<2_|1SS z(#+Qymhm_)uw$gh352O&HqN-kmiFzI%72vsVrvd}krv3SII%TK9HThcS?7RM`~HS$ zgPO3rBUcVV#0+tig-3iNih2f~(Y-=p^$ZGEp(T?@I8!MRjsdNwci&A4WT1?_zx{Wb zN8?k1FlAt%n|Qc&3?%6!r{Om&e>!fi>ni=u`@$^ymM18wb#QFvxq@hG<%| zqwSvhoB)4Xu)nj>NpgKOQtdb|UD56?1@gt(S^}_?ZV;zkpTGDpM|r>X=WWifWSo%o zunolE&z_1i+{ygZ)G;mS;6B`IT4$>b+@0I~`ST|=Jz4w+gwp`3iiVdN8GUMLVYz2o z@vzCt)BmmH(C^wRp)4tySb;*j7%2lGW2Gt0hKv!}IzI?z@_2rkE=FvI#R77s+GtwY zPR&S(p~;F+2fE}gI}^|X?Kc;{qUJw)bbUWNYZXw0m1w6kV&F{kL2bk=ULD0_g!>3e zUcxx&Qx;xk$5A5@M~^Vp$fIa#jsu0WcI8LA7lBfHIs^aCa_?80{71J>ET`iJV4@Y8LVd02a@|#tx?=B z*QUzuSM~4i>ArO~cVvk$l7EM7-sBBiu?#&pqkXg(POTW1{=uNodTMc&XK8Ng^dYUE zzLa}`&7RjDL2mxK3PcP7q$r+ze|%5TyI;woE>2lea`ow4eIlE3#1GK8jd7xC+WVSF z>jjQO%Q)@`gPH-8#@IL6WKsa^Z>6WkiYmXtMpL!o&zW zWrUr64NFvSZg(~&vh`gUAmz4NU9(4e|9qW=;zE=Xc~4nbH|UWHboV z!m>J2w%qQ5Vn;u&gJ}b*zJ8zXAXjOkD4tYMs@B9HdYTT`|Md4NC4X+;)MsR3@e-VP zC8r|O@|31lUlyq)#Dj)gkXLN7_*>ErzF95F_52&Ya8vq-*v5Vy@3`LXNM;Y&DEzbt&T@UfPjChb?|ZPc_cFJp`kJDn{ndg423giTk*8%B+ zDj5qoj2>Hxl?~-k*76Xu<@ACGn#haIM~=s3k2%mH2l5u)OPu<&6zp;_Pksx=h1O=Y z`yMlUeD{?fmvwJ(;KzKN+HMTqMYOK0N3t!P4S&A%ob&oH@-k&nL3g0Ln=oZk0805c5#Utx?ddrgILvlG_*XbMWk=Do5xjE*{EK}2Z^D4;My1nEe1Mv6!iQF>9TKm=(CJ)<*7=mRP!bp!zs1Cr1~$f#6l zgBU`95b4qqsi7w4&g_4$Z-0C3@B8;z|M}KA>o7)~;n>bW)g?3aIihnk}iG3Al1 z89o2LH2$Yg{fDxCf1Vv=((U_XPh(0RCysl-pS!W|?&hQwHvhTtubD%R*-wRs5q=Xi zu>-37UdUa8%i8Aq?Y`M1B=1-&FSkDn-7qfJ^?O!J_|skQpv~Wi`pQmVBzkMXZ5KzE zsM-QOyJ`YIMVDPG*_J%*-tp6%S#8Abt6v+QEC{{-Zh6nwE*HN)bo+qqA=iVlZst1f zm4$X1NpFf2Gj>1ubTBdS%fXwKC3Dg@6?GNwxkOKEef86qc8jR*)SZ5vd6H#3=V!-v z?o4;KW*BWZwF|>qyEF8o?7h@*=XXX92TG0`8Y-O9eR%&`{}Gd^y~5sakjjJ$nWCEA zM|1?2=pt?q`n33Jm~iXegHj)Vm*t+zJl{{D`@cRss`X$cQo?cnI&JwLi|FthjCR$~2>W_&-e?pG#L{ObG6$k{bgyQi8vIz+TxWwfwY zw#n2ZT!nqX_K(O#pQ?CiW9JBHL~JbT+NpQN+qn6tmAR=sdvqlK{;5Cv?fd1uL#E!I zwnHC(v*#G~i#A_l`Bhn;+rqXcrymDT_Xztc@za6{cSRpo?2Wjv{F_JTJ;sXa2)-jQT6Z*M@E#YhoH-=7X+YF<&l_e_VI- zTzsLD+DOImACFw@eq5p?)#!HaNA8-K?4B5rk{f?Ct7JSWLk^x*4tUu*dFHB17!wz0P*t9`73x4 ztzYDVAKNp8#)%PC}?(Egkp*vM! zOxeGCo!@;h`Ky3P-JW0eozkd%xi#cZak$|>*(=}ChF4iaBx#qg=vzM(vQvMBu+VCC zCJ<7L+4{lKI()Xa6W^X`o4@VzeVO&G4_St1mgOyGnK-8~3UPd?bmX}4qa1$ZQw4KNeQA&33SS$z zjA5pyjMMj_6-LrxT7p?5msfOoO)1*8Q?u2DvvbJhU{_bk%&sZ4&dy5T3IE#B2kM%> z;nn)pe>64eWAr})*#_BPEld5Jm%6unxBFWA4`JyB*X0Nqj#Wea9wOeI%$DOh>fYkU z6BO;GS4vuTX%d)uRV~##gLKc-!koe>!Fj16@+EX`1SVjfP!l+qG?TwI1Dhr|NDbg7SZQC*y-GLu`&w&v#MQdCc< zHMN-87&x~V5Puq2l6m|As7A2R0NZ>=3*GYZ`njdZQ7c7@wb$hFjNmz@cz5#6h4G@f z6x`W{S5A|a07=`m`dpx>asKWH<5ZMa z&TmOJ&d2A}9L3#Y`I>txDug9YIILvbr=3--_0f0`Yvk(QHEXM?Eec~#xFFEi*H;`F znNj4OD5fK-w_t|A;LPhA=bqEnLm~SWd+@XuA7Y3xCMnJ&Ju2z&Qjc@!X}^Jn3;ktI z0#*;L6zxizXH$D^38;|mZoM633C_@LNybWM`G4xr#%Yc#0^x>(=w zSBzdS-!tQ^ljcPmR)k`Z)S4w)scyYZxVyJ|jzF*7bgMUNzHC-yPCVkwa*AA9o$s2( zc_*ESK-AD7b$tRQS$#zNJewUp_vahi8b7nd6p5s8oM5Suk<^^y=g9nldZGpC;g8;# zsC><}Yc=7?RqwmseQSY61$ug(olTlqAJW@UcMA@dhVYeY*L^{vFQulR*p9FKMktLUyNWg&7>ru?vhg*kf#FHYnY4^`wlnB zM9;e|>P1eYd6rwV)m7#&lB1b86ENLS-+Gf^gE|&eKrJyxtuS>S<+wZnYg0~5;BYv- zTP!lSJSX9>d|O*J^neTSFXplvrrr1nJzr~8$!(_41=1%8GVyX7^EXaKMG-7-lsYrO}Ti%vHz4eVlE(UqiB_w88EIph>Ep0r%J1IlQYBlQd`+0=x znLJWeq4N8a5;h2pitz0pOiWzNRWO^I13f~D8XCfnwNo%_lZ*sw%O(Zxc2Be3h7p-x zFNkHKf2Jp0wU^-P|D=0xt(>%WC9)NRMn`T+aL1pN_2|3RSA0sXlChtTUZgQbN;Q+| z4+k`H-dp*ygODYJE3ab?9y$~?^ySN4_D>(*bhFu1z?LBRu z=2wCk8C#p1=3%&P=HuNYIlHcI(W2BTLQPYr`Q3@uB>Ps2J_S`*G0cs3uI%fp(VJd& z;>M2_3FI#a6g5wfK?R-1C?97Fw74@d!&D-;zKMXO4>PIu?v9@qEG-%mn90Lftbo6Ra)VIG<`-r!muw!Xoy^ zf&56sgO>a*mXVyYvnmmn63ybmLvX^qs_#y^ynRLJd^;4&*E%ubzKzSPRp+$pZLU5k zGc&@eQS7V&FFZWio^_IMtW5+ROJ&%m9wfy<#Wm7XVl(kLwR8h^o%`NDzJr&Kd ziB{!w*)$%_DjN`n(5)Q4dTV~aL_lz)Qu4_QN7eo5qU6m4j0}p=D0jFq>hsn=m35+J;X+wUr}3o+n?Cc15ZPjTtr08pVvAe zD08x1&?WWz3vaOf%j4a7iWe^Qh81|}Skb*d&L%za>uh4|Xpx2WmLKYg^d%WKZ1g+u z8z`cOLyK;OP$!>cX2$zR%{>+t7mv@|C;_WEoxu$ou3t_MT}Yx9P<(oDP8YbsNKSY{ z!Z&JqSQ@te-s*@PO0&RLG2&~S64*Ke%k4QVHYIwcfCfeJ)Xh#W-G_$yJkFMV3Hi0? zu1wWlyFIhSJRr3Q;peB9E2edEf0G3>82RN5e#Y`5+bS~e{6 zLz2|pbKiFcSRTXm_Vz}4dQQbS5mBU?Wzild%3_Q{!=g-uj7+; z8Bu;Ll)T@-vIUA;^V7U4rn6F7$Q(3R4G19KgzhA%1C?0IpD%CpQmN|dN~_G5A>^*k z&Zgi3eyb|`%AtjU$c3tksG;ihw!E#YkzaNspt67JN`16%&r z+#`aHlz>S0Vy)3$znTPiER_ztOXJ2=7RI~ewsXWn)yjLhas+(sJu`|=h)eFY?_T&( z^B>VB!4pKz_2bT^iXC{aXPhCmWS{7l_{<-b)!NZ4J2t7JNJsjF{1v`$k_(yK+xPt;&JEFn*QLlXbX)ZI+rntRk9{--i z5R_NwJv4tkxk~-6N`Tr%V(5p;~E-z8&%iX+iP1B?KCknf8p)rG#b6R zqy#G)Vg0r9$o>dC-0iz-6Sqh*gZU&Dwl@s zr4CF1a5{LR1Mam-U>Y#3$zpv9q?HdcBazEpTlFb#bh>T}g*`lpN%k6Lj*poPGyKtI^*#7trt7G7o>PZ(`BZCvnnL_-p@rMsDh09$w~sGi^U-7D6U6%+ zVS7HjrS~x>4B1;FZm&n$ldTTDl8sj~PLl>+1XxB%K!t+|uVW{yiWjSjCOt1NFF!{6 z_Uy&Ad0JmQc0SmTrV-$-=#Q>o|LVh1G-CTsm0N_4r6TKEZ?@*SYAp7!b7SMNviXV6 z=SNC%P=0I+i?I8i7x=F0QT`AlM$R6qf_neu_V)HzVDl@ZA3*QR*cdEtyQ45;aMaE+ z-2>xwDJlTES}JX1oaY5XIX`6{kl5ucAF81*LgF*C4JA3V6o(fJZXp5;j1d7z?%7|$ z+uf-9yGO>ZwJ)_TUva13sQfT5O%=)g+?t^G0L8IV%s7m!aC@!19}%D5CL<$L09BAS zniAC;C3^|i*pHnMQg$m$(Rmu7I0rDhs%nV+bW(ceo%zN9F9oDdw91@$_R5G$_1$K= z0PBa`^-$ymIo%vu$uCxQ?SV7&7N**~Q@Q&sThiR^T<@D6cIhCHPoF-G^XIPlvvyju zg)D9~*c#$5r#-)s?g6$Io~y}sonYjZQo_@B>e@_TQC`S6P5%&(tM7NZ82e`b|EB@Y|bmKKXGS6Gy&EIhsW1aoQHwWci? z)8%UM!I4=(eVSrxlH%T>gM0m@{w+v6i*)mVQF$LpeDRneVGW#LJfeg18DgfJFW_6e zL?t4>kdqD`F4GbP9Ic~%(BW7A((2AJ6&8^^vRW&x@=VK20q#GNnG6l7a<3y z67|=Gu8y0@b65eFyOG;H3ennvG7Uz46@0PH$rcglL&O4WmRp4&@e>=7a+4$xN?TtK z1#}U`bxYAvJINowh+-E?YMF>*wih`}`Ee#)LKyzpYUCWb_>{$K1DFy&J>*m6di%C? zS>xucEfGccwn#*vPAYM$H<+3CNOL|Xxl@{IljH$0N=2I(HG!ohj&T{>&U4v*GTTJR zPS}ZvcsHAq&U!%ET0lC+hH7SZd4g#Xf;cD3NFORKajf-`!REVmH&l(&>Z+deveBzx z%VVLV*kM^ag@@xH2-ghcCIxiAZhBFghn=YzW$e#qyA^flPaLjonxale7$wri(-9w3 zrurA3>;(0NWq5?7^d&Q*w3bUZEmi|@0%onn-kSa@vpG8RJN?9nfe4{L-s{~6@yn$0qRBU1w~Ku)B5iW@3b#*Dn)j+ntafPxq

G_$YXB*7xp7t1x@*sV+k~=*cjltK}b4dd) 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 I)6M(;7tsmqK>z>% literal 0 HcmV?d00001 diff --git a/assets/hole.xcf b/assets/hole.xcf new file mode 100755 index 0000000000000000000000000000000000000000..17e3b02cef906401cc73db0fe0acfa58a7b838e4 GIT binary patch literal 130602 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%0DS5+0&YDTBeFS|u6F`%lKxai7iXmy_lT7 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 a+t.steps, 0)); bar.addUpdateListener(() => bar.draw(cvs)); bar.draw(cvs); @@ -27,11 +32,11 @@ bar.addReadyListener(() => { }); //XXX purposefully slow down asset loading -const sleep=(ms) => new Promise(ok => setTimeout(ok, ms)); +const sleep=(ms=1000) => new Promise(ok => setTimeout(ok, ms*Math.random())); const loadAsset=async (asset) => { const response=await fetch('assets/'+asset.filename); - await sleep(1000*Math.random()); + await sleep(); bar.update(); let result; switch(asset.type) { @@ -43,7 +48,7 @@ const loadAsset=async (asset) => { result=await createImageBitmap(await response.blob()); break; } - await sleep(1000*Math.random()); + await sleep(); bar.update(); return [asset.name, result]; }; @@ -52,18 +57,37 @@ let assets=Object.create(null); let ready=false; let readyListeners=[]; -Promise - .all( - assetSpecs.map(a => loadAsset(a)) - ).then(arr => { - arr.forEach(([name, value]) => { - assets[name]=value; - }); - ready=true; - readyListeners.forEach(fn => fn.bind(fn)()); - readyListeners=null; +(async () => { + let arr=await Promise + .all( + assetSpecs.map(a => loadAsset(a)) + ); + + arr.forEach(([name, value]) => { + assets[name]=value; }); + for(let task of tasks) { + const source=assets[task.from]; + switch(task.type) { + case 'tileset': { + let asset=assets[task.from]=Object.create(null); + for(let tId in task.tiles) { + const tName=task.tiles[tId]; + asset[tName]=await createImageBitmap(source, 0, source.width*tId, source.width, source.width); + await sleep(100); + bar.update(); + } + break; + } + } + } + + ready=true; + readyListeners.forEach(fn => fn.bind(fn)()); + readyListeners=null; +})(); + const onReady=(fn) => { if(ready) fn.bind(fn)(); else readyListeners.push(fn); diff --git a/src/js/snek.js b/src/js/snek.js index 271a33e..fde0d3c 100644 --- a/src/js/snek.js +++ b/src/js/snek.js @@ -1,6 +1,4 @@ -const [EMPTY, FOOD, WALL, SNAKE]=Array(4).keys(); - -const ifNaN=(v, r) => isNaN(v)?r:v; +const [EMPTY, FOOD, WALL, HOLE, HOLE_S, SNAKE]=Array(6).keys(); class SnekGame { constructor(settings, canvas, rules) { @@ -20,11 +18,12 @@ class SnekGame { case ' ': return EMPTY; case 'f': return FOOD; case 'w': return WALL; + case 'o': return HOLE; } })(); } } - // + // extract the dimensions this.dimensions=[this.world.length, this.world[0].length]; @@ -51,6 +50,9 @@ class SnekGame { // add the walls if(settings.walls) settings.walls.forEach(([x, y]) => this.world[x][y]=WALL); + // add the holes + if(settings.holes) settings.holes.forEach(([x, y]) => this.world[x][y]=HOLE); + // add the food settings.food.forEach(([x, y]) => this.world[x][y]=FOOD); this.fruits=[...settings.food]; @@ -62,9 +64,13 @@ class SnekGame { // get the head and initial direction this.head=[...settings.snake[0]]; - this.direction=[ - ifNaN(settings.snake[0][0]-settings.snake[1][0], 1), - ifNaN(settings.snake[0][1]-settings.snake[1][1], 0) + if(settings.snake.length>=2) this.direction=[ + settings.snake[0][0]-settings.snake[1][0], + settings.snake[0][1]-settings.snake[1][1] + ]; + else this.direction=[ + 1, + 0 ]; this.lastDirection=this.direction @@ -115,18 +121,46 @@ class SnekGame { // draw our walls const wall=assets.get('wall'); + const hole=assets.get('hole'); + + const putTile=(x, y, tile) => this.ctx.drawImage( + tile, + offsetX+cellSize*x, + offsetY+cellSize*y, + cellSize, + cellSize + ); + const checkAdj=(x, y) => { + let adj={}; + adj.u=this.world[x][y-1]; + adj.d=this.world[x][y+1]; + adj.l=(this.world[x-1] || [])[y]; + adj.r=(this.world[x+1] || [])[y]; + adj.ul=(this.world[x-1] || [])[y-1]; + adj.ur=(this.world[x+1] || [])[y-1]; + adj.dl=(this.world[x-1] || [])[y+1]; + adj.dr=(this.world[x+1] || [])[y+1]; + return adj; + }; for(let x=0; x adj[k]==HOLE || adj[k]==HOLE_S) + .forEach(k => putTile(x, y, hole[k])); + break; + // technically, this works for all shapes + // however, the tileset only handles convex shapes + } } } } @@ -198,7 +232,13 @@ class SnekGame { // get our tail out of the way const tail=this.snake.pop(); - this.world[tail[0]][tail[1]]=EMPTY; + switch(this.world[tail[0]][tail[1]]) { + case HOLE_S: + this.world[tail[0]][tail[1]]=HOLE; + break; + default: + this.world[tail[0]][tail[1]]=EMPTY; + } // check for out of world conditions if(head[0]<0 || head[0]>=this.dimensions[0] || head[1]<0 || head[1]>=this.dimensions[1]) { @@ -214,8 +254,21 @@ class SnekGame { // you hit, you die case WALL: case SNAKE: + case HOLE_S: return this.die(); + // if either 3 consecutive segments or the whole snake is on a hole, you die + case HOLE: + if( + this.snake.length==0 || + this.snake.length==1 && + this.world[this.snake[0][0]][this.snake[0][1]]==HOLE_S || + this.snake.length>=2 && + this.world[this.snake[0][0]][this.snake[0][1]]==HOLE_S && + this.world[this.snake[1][0]][this.snake[1][1]]==HOLE_S + ) return this.die(); + break; + // you eat, you don't die case FOOD: // re-grow the snake @@ -251,7 +304,13 @@ class SnekGame { } // move our head forward - this.world[head[0]][head[1]]=SNAKE; + switch(this.world[head[0]][head[1]]) { + case HOLE: + this.world[head[0]][head[1]]=HOLE_S; + break; + default: + this.world[head[0]][head[1]]=SNAKE; + } this.snake.unshift(head); // automatic speed increase @@ -301,6 +360,7 @@ class SnekGame { } handleInputs(inputs) { + // change direction if the input is valid const trySet=(dir) => { if(!dir.every((e, i) => e==this.lastDirection[i] || e==-this.lastDirection[i])) { this.direction=dir; @@ -308,6 +368,7 @@ class SnekGame { } } + // reduce buffer duration Object .keys(inputs) .forEach(k => { @@ -318,11 +379,13 @@ class SnekGame { else inputs[k]=v; }); + // try all inputs in order and unbuffer them if valid if(inputs.left && trySet([-1, 0])) return delete inputs.left; else if(inputs.right && trySet([ 1, 0])) return delete inputs.right; else if(inputs.up && trySet([ 0,-1])) return delete inputs.up; else if(inputs.down && trySet([ 0, 1])) return delete inputs.down; + // buffering might be disabled if(inputs.clearBuffer) { Object .keys(inputs)