From b8b5b1c3f7d651145f9ec7f1676aa1dddbedd0e7 Mon Sep 17 00:00:00 2001 From: Bye <bye@byecorps.com> Date: Sat, 3 Sep 2022 18:56:09 +0100 Subject: [PATCH] something is happening!!! --- bkg.aseprite | Bin 0 -> 1467 bytes bkg.png | Bin 0 -> 661 bytes favicon.aseprite | Bin 1181 -> 1707 bytes favicon.ico | Bin 3262 -> 3262 bytes game.js | 192 ++++++++++++++++++++++++++++++++++++----------- index.html | 1 + letters.js | 13 +++- t.aseprite | Bin 3191 -> 3880 bytes t.png | Bin 1390 -> 2095 bytes 9 files changed, 163 insertions(+), 43 deletions(-) create mode 100644 bkg.aseprite create mode 100644 bkg.png diff --git a/bkg.aseprite b/bkg.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..563b90219f2f574817bd30001852452e4e3cb5c9 GIT binary patch literal 1467 zcmdnZ%E0hoDI<dd7&0<2Fr+Xb0}BR5kRXEqg8;HH)!5do3=F?Ma)NE;WME(rV_;xl zR{&dyWJeYw1B0Z31ysZwN<*lB|NsAIV1SSd7A*MBzz`G^^q+xY-?hL085lC>{rS(p zAm=srKLZ1!RN#LGhBIeC>O0#(q=osO{|pTL{HgyL815bciL5IFkr5g@{xdKrvnBs$ zV0d-l=YIx<bGaY?Gcc4YPWjKkV8-nIpMl}i!TbLi7#<XC`p>}7q8#&|fx&@A?LPy< z$K!|oGceq%DfrL8(4?pGpMk-iljT1H!;1^6{xdL~m}vK(fg#_X;Xea|kuZq7c?;yW zWy@9nGcW`OfkfmLK;+3s^Zqk1H15*)&%j`q3=-ki0+D;3t^3cwkbK1LKLdkQHtT-| z1_phQ_?D-~|1&Uz9IXA%z`&QO2NKug`p>|y_5PFp3=CnL5Bz6f5QxbDiL2@UXJA;l za^-&p1{)h2kO%|F1O^6%|C<;X7+4q>85k`7{r~^(|NjLG76b(a?Ys6jbKW00uepp; zfoIPA?`;2XVZMi-KlSdB|Le;BM`-L&W=no`;ODvAkEM!J%$U7D9lZabU{i~7j020> z$K!|Y)f6=8sn~O}ytuIH#6-J%dyv;}-kQ5?xoTh#gS-O6$w%`VcWD?VGjMA$?0L2> z`G}iTHY<ZZ!<MJVLk`yRW$H2Lac#Z-By95mftU;iHQkjfSK8RvK;mB><YEOT2nS4p zJjBl6lUSKrq+ke<W(G?@2xMs^{L;ptq{gZM)d#l&lvyg~ygkgw$-uzFvha0$)$5NM z5wWXQt$Ou^{p069dUlKq46M*p{2xu*+$jfnoeX)Lw<imJOKz%95xd5~$;s)u@$VgH z)?aI9J-PYrYt^3h8{eJ3UH<o9{{H{Zp9NKKKDK7}+m*#ntaqk=dzE$O=C=2@?ILgg z>@B@jZoJx3nE$xqSNGqGc<%i56n~z6{qeJxPYS1U9zScSGN<F7Z`#V|mt{|CpPT&T zZlUC&nL)NocmjA&>X>Z5(!TEbkxQAbU)29}=zFR~$*q0Y621Cmr@LtRa@Sw`J}OiR z?3D>W^>B;X$NEd_ZZ6JuoxIxZ^0D$&(~{TidHLtH(Gm%(`Q|^Bi?`Z&#@*XA!)9*H z`gdXX7W|sr6ZCAA`Ke21cb<KA!*bq|`BOB5!hgPhGH3PtAIp6%RK}d|<gV1e6XR9= z$;>or?ibfDN<C5Wrk|I7Wn3n*<d8Zz^dP~89(r3R-{d`Pz~gM~cl}IM?7Fl54Nd|p z-Itms-1xZg!>5l``{dKD&uuK*I&a?YZ?8S7%lECb<O|>ZdH<Jp-&Z_)XY=&A#r5h~ z-=$~W)<?Y$oOSpo_qt#`8Me^&wDeD#Z!1ff+pVa4YL!@W&sU=JyR=?be64o;WFNsh zcV$m)JiOXw=8vVnN_T0VwW{m%%koVu{kn2`^#4h>zN~p{R_OcpZrRh)Lvz>V7VOxw zTuSX`LHVoblKhOtscYYF`Qe@?{HO1;8MBG>O0_34Uke^R+vI7o+H!%-t{lJrr4m7P zE1#EdepI6NPhfv0-?lsIF}L>!_MLKmq<fP0>BL_i_uS^H&%1xr-FBXl`)2p=cAq-g F3jl9AEad<I literal 0 HcmV?d00001 diff --git a/bkg.png b/bkg.png new file mode 100644 index 0000000000000000000000000000000000000000..c340d9c47979438c06b19873b83a77ff70f4b1be GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>VDk5L zaSVxQog2QpkjYRWHcuv2kgJ1Z9rM$7jW;+=EtCU!OB~!7c^1BGnBl;vI$<93?~|*a zdRkSc+lWmn`<`j<zw7G1Jv0A`JgNFEqP?_IyRhWZyp22gs&Bo^s=s$emz}4hG|IZA z<HX0h1q$txoORD^Fm1EF(7U+$=KJLnu6?X8t(^1h^;=_Z;o>`7#?}qI=H0hmeX=<F zX3Ac^!j899)8}l~h}bK_m{!nvfV1a%R`X5SzVFRHG(BWujh0<ZUaRs>@~Ca{t!9n~ z-#^x!I9BERWIMM>R&~?7kQaM(zSnVax^ywHZTs~2MV!{QXAvsr4gKCNpKz5`sqHT_ zn?v`}w^h?cvivrNH@5^Y%RU&SbSd}9wHr284(qpe-SmH`&a{i6be_)2BNvx4ZFOC> zIAiW+k)+xNqtz+ha-VPTZ&<68>ToGGq4Pu;i;U6BhuxF>Rx!^0{(sy3pywaHhuykk zbc0!7k$>OE1?ncu*KYVTr#Q^W>-3IWmwcA_%#3#o+${AvMoXhkGHlS=8onjX=*17s zlmiDFrp=j=;u2EzGecq5+lc93#NIDbkK~lOtsL}DrAk)ca7FK{%4qpp8&AZicwKq7 z{DPn3YsbLLsqG5|H{@HW6_$K)Y`p*N?}=l##E(e|Zz~GdHYk%eiVo{?y>a^Uuf@(w z?tBm1BtEh3|J6$epGltGb|WO^;B>)c+lCc$Cl#_(xGc|FA<D^<bA7kVSphM{(=#qy z%-mS&w4dAL*1djV>6t;&%l$X^um2voI4Y`U@6oVHj-RXE{>+{KV#mIl^JeXvntw~m W_;=(-wId7+3=E#GelF{r5}E*^&o<%! literal 0 HcmV?d00001 diff --git a/favicon.aseprite b/favicon.aseprite index 48ff697b9d0632f855b71e7547f5056f29bf8188..2d148083edd8d75b94c32f6b338c0d85d4b51266 100644 GIT binary patch delta 860 zcmbQsxtdpTH5&uNgQbiN3Sh{{z`&5gfD9}rD#kNuvrTML;V)ohV31U>gvwfM+#1a& zz`$^Ib>{!A3=9k`42%p6mXoEJRxn>(ojLg-licJ7O!ka>CMz(@)L-}JYcddVd$?Ci ziRn_%uY|n;36lG_H<mQCP3+_-FF1DpM@e|2-IM@x%jrSirR=5z_D^U!ztSmDLyAZB zYs@MWHb>9iK&c+nrPHLk1EYNu9~<0Mb>FJHOZjKh-@89de_zbM(Z4V9=XBxUc~8~< zKm2X{L-Y5=^EdkI>cryneq<@g*Zn+sU3#DGy7-OqwLfL|+c&Mh(a--OJAVIf{X#~8 z3zN4q*VlV6F)*+yFflMPa5DU7f_jrdj)9+{VovRp=RqQlBCWNiy538DSPlkgZAvT? z3<wM{=x$n|;n;d;j=_V^K2h?^Y|X!vozF22F8$~8^-OsD-F?sR|1-R7*&*ZDr=*^( zChz1nq1bfu`RYv{+fJ%Y%s%0Bc**wJYI|?%%&GUBraXC%%eCm%?_ZAGzpeJK_02Zl z=L`|;6YQQ?7%|+_e8N+-FYZYk+k37e*`1v4WOjV_z9XKnPDz^a9p8-o6Zb!URCS|R zwq)JU)?Fu$zf#NQ+W)%h@XlrY6Dm^-9~r;db<ODHY=-a4cNkqS)}4Ra{ovYWY0c>| z%a2~2=PBR#Q>1=P`l-<CDaHpv!=FW67v37Dx6^FGwxab`*Y&2yh#!awTenLsn(^Jb z<6Dd0@)u-3@+wYUw`<vEx$mASK|3zR%v`<hV_Cy$pJ%JG(>F}dj@``pbkb|xA9p|Q zcr|N{MtJPw?<drM)H-LZtDmD?+~28v_o1BL&P(rnG|Sy$E?1v$K2pES&OJ`^``R7H z<R|JU{Jn7Z<BT(**J~^e<aTPGoqG4m)H3zjHN~-AUDY9FcVCvK=I#G><RwFRY-afk z>(#ptuiIpO?dmrdr*-m2wifMUel%-7Z-IJ@zd`xAon?Q+wy4K(o7X*$S-s=h);pbN zzFJM(d9C!`<1F<{F+cCW@|qiQQr4$z?u__L^D<7p`!V-KOwm@`jVimH*R|G9ejPqD zTlIR`BiHMlk+;9@|3CMBXZ6?mKanvn`NE6VzRoyMy6ebStHSmFwy(R=8G7gcg3C6a E00n)RWdHyG delta 328 zcmZ3@JC{>&E(-(0gQbiN3Sh{{z`&5gfD9}qD#kO(vP^7J;m=}ZV31U>fXbS0+#1cu zwTXd&frWvQfx%+30@I4gr<r0IXH3>)mZ?AdmhDgiL&L?bTW_setGE2xs;&K5;*&j8 z)Y8s$xFjhhAG_h3H~r(E7q)XY%-p*0$9Dd&B74{Sd|B5b&Sv$)_rgE%dHomfrMHyb zfAiKm-QIM|=Y;%Ciq^6Vu5(t4uFm*<FWvpkQ(wpE@R_xV`sZxF{88E1zv#qU2D6<` ztLhmT7$(19u1-&9U|?WXU}9io;AHsE1a&uq90NZ?#T@M#o0s*9a%UP?JVFmQuzk2` z9P!50tU1K=$gOUFSv_O-x3U%0Cp~vRnc<mV-O1@)^{afrqw)>6z4K-rd>&TxR@HP4 M+wQ##W-SGB0F`8Vpa1{> diff --git a/favicon.ico b/favicon.ico index fa7a2f455053d6613cc6331b624505947c30b2e4..290e4e9e6a2ec962646b66f20dc5fa0978d70a79 100644 GIT binary patch literal 3262 zcmZQzU}RuqP*4ET5)3PN7#PGD7#K7d7#I{77#JKFAmR)R3}87Bjg0e?9_1%L&QEz< zkn*@7^>INO2o<J3F3fmRnDL}2^GQ(_7-c^x&Up$#xlc>-z$pJ|Nx`$yf@h_L&q|A) zl@&cJD}Gj1@~o`nd3ovc^0MdU<<Be1pHtubQkt6oyljY?UknL<BHa&)T+-r~M&=j7 z(hm;vU*iQunNM)Zm*hW1lLDvD=V*ejU%yU@xS1StGdccda`MgO^cyKzH&XI$q!iwG z{rWY;{M3f)X)V{&+OMT`UrX!1mOkm)>({R#=4ULtnz8h1#)_-2U%!T%pSk)f1VQXd z3cHyUbu&5cW^&@q<kTA}88=dLZln}|%!epQt-GGubUm%@dRphTwBBp!6OqiHe>G$A z)r{qM%@4f^^+E!w7m9AAl!9zYt-TKQLI>0f5PM(0ew{JzD#Q!;+#h^1DIDYlxUSc) zUqif*QUW%=`g&?T$O{k!5HF-p1^FU<&ee<sATQuEKk!yk=*^_ao3CHLE=YS^nD!WC zel|E3iooVqUI%%h@jBG}9&jv72Ae<YD##0q@P<#ott7A)P|VM~k&+9Ih181csSqzT zgJYrVT3R187Sd;4gLnaAHH3sjZsux`rJ(fVcPl9f<OO8&K?y1QMoK=|{bkovtDs&; zYrUS<0dhISsPyUA(q}`x07^(Jp(zJq1w>7v&#k0@TS*}(;gg(pBL(aQP*|1R0C}MX z6bot1*VEdsr-8lj`t|Gdsn^nHUQM41j)f(lgak1eLPE{=zLf;_0*d=nZX{>iNXZ7d zKc)CaD%cAU^&l^FUQ6o%`67MFH54x_yPARI1&I1Y&s&MUATL18PY1<sa?(wZ7qY<S z7lIOMY6UEQAztVPn?LDV`ZSOiAVxt*h~wempXh!o5$pvN^Am3-gS`L>pZpsjFO);g z2j#U^P+kLt&xC6bFCeGSj8)KBfLNF4b_?PK2p2*^i;Fa{`@zKpB(J@G{TiCr+ClDz z6c_2!Kx}yVkg)>Qe3x5LFZka|3c3j`E@Gj@1<3v2;sW9YP(p<j7q4Hx2IV!d7f{^4 z>?*_y5T_<O-GX}|DG-#9AjJhl7Gyr8!~+)>so=Z@mqIS_5bg(;c!=<Kyq)NBE71cS z3;y7|1}^d7<tHeiLcCCNBefiq*Wl$Ra*2m9A6(*Ptb*n*xMMIGkn$N*9Bw|c6x@7d z!Te-c`zICJ{sA?9(!up(CanFF{iHY>+W0Akw14uSmgGN$Hhv)OA6WebZTvvmKNZiZ mX+Cn}Y6zKM1a2RqH4drh{vm390WAH{$o<5bkK7j+2sQw95y@5n literal 3262 zcmZQzU}RuqP*4ET5)3PN7#PGD7#K7d7#I{77#JKFAmR)R3}87Bje>J67)H@B4uO0N z23jJ<B1@X0*LVR_i4`t+Oev-kD@?)HuU}7kT!<CDe*K!M9ArMGET$Ah1Wi4}ZJ632 zA`n@u4tV|gHFKpkvJ^xFQxI7V#8@;Es{%}`U%!6MQe(qXV}q<7q6}^zgbN{&1(Dfk z+L5JL>TFo*2$;{>Xv^AYi^mW=Qdsq(sb_1pV{5iU6NEbwje({N;&DttxUSc)U$eE@ zv$ffysevniGcb*UOCd8L%HSfeU%zJWuxIZeY(7K_vNIqeXe6fj9Ni8a-44ha(b#BQ zGy~DNSj_Kp<mhw6WeBEvxPcHU2#F?$%;lWm$T@*b^Renhb1K9EXoAQNz$3*q*@<hi z6Pf~KF5Dbs1|9{-Qm<dX=9=ovHPsnS5Sfc??4-wqn0|pPz?6FZ`Zf0q7w#D@$Ob}` z!F8cAUcY|LGYdsMTmhyOL<CJe#C$v?&s<krvY1jlb6qh7dFQ*)6!9%`qb*wE&PPkc WzubeSNMM!cC>p>JK<Nt%00#iDtPC>% diff --git a/game.js b/game.js index 18eb1db..7eed968 100644 --- a/game.js +++ b/game.js @@ -3,16 +3,11 @@ Theme: death */ -// Functions for my little game engine thing -const log = (logType, msg) => { - console.log(`[${logType}] ${msg}`); -} - - // CONFIG const fontStack = '"Comic Sans MS"'; -var id = 0; -var pi = Math.PI; +let id = 0; +const pi = Math.PI; +let o = {showFPS:true} gPar = (key) => { // Address of the current window @@ -26,7 +21,7 @@ gPar = (key) => { return parameterList.get(key) } -var customLv = gPar("lv"); +const customLv = gPar("lv"); class Canvas { constructor(id) { @@ -37,11 +32,9 @@ class Canvas { // get the width and height of the canvas from CSS this.tW = this.c.offsetWidth; this.tH = this.c.offsetHeight; - this.scale = this.tW / this.w; this.camera = {x: 0, y: 0}; this.mousePos = {x: 0, y: 0}; - this.realMousePos = {x: 0, y: 0}; } @@ -52,9 +45,9 @@ class Canvas { // Mouse position crap getMousePos(evt) { - var rect = this.c.getBoundingClientRect(), // abs. size of element - scaleX = this.c.width / rect.width, // relationship bitmap vs. element for x - scaleY = this.c.height / rect.height; // relationship bitmap vs. element for y + const rect = this.c.getBoundingClientRect(), // abs. size of element + scaleX = this.c.width / rect.width, // relationship bitmap vs. element for x + scaleY = this.c.height / rect.height; // relationship bitmap vs. element for y this.mousePos.x = ((evt.clientX - rect.left) * scaleX) + this.camera.x; this.mousePos.y = ((evt.clientY - rect.top) * scaleY) + this.camera.y; @@ -105,12 +98,6 @@ class Canvas { this.ctx.strokeRect(x-this.camera.x, y-this.camera.y, w, h); } - drawFont(string, x, y, color, align="start") { - this.ctx.fillStyle = color; - this.ctx.textAlign = align; - this.ctx.fillText(string, x-this.camera.x, y-this.camera.y); - } - dT(string, x, y, scaley, scalex, color, align="start", vAliign="top", ops={}) { // console.log(ops); @@ -269,8 +256,7 @@ class Room { id += 1; this.name = name; this.objects = []; - this.hitboxes = []; - this.background = []; + this.background = "#151f1f"; this.w = c.w; this.h = c.h; } @@ -324,7 +310,7 @@ if(!c.ctx) { alert("Your browser does not support the canvas element"); } gameCtx = c.ctx; -c.fill("#1c1c1c"); +c.fill("#151f1f"); c.setFont(fontStack); gameCtx.imageSmoothingEnabled = false; var gameStart = false; @@ -410,11 +396,11 @@ for (var key in images) { var levels = [ { "name": "Tutorial", - "data": "[[1,1,2],[1,1,3],[5,1,4],[1,1,1],[2,0,3],[2,0,2],[2,0,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[5,4,0],[5,6,0],[5,5,0],[5,7,0],[6,8,0],[0,9,0],[0,10,0],[2,8,1],[2,8,2],[2,8,3],[8,8,4],[5,7,4],[5,5,4],[5,6,4],[5,4,4],[5,2,4],[5,3,4],[7,0,4],[1,2,3],[9,2,2],[1,2,1],[1,3,1],[1,3,2],[1,3,3],[1,4,3],[1,4,2],[1,4,1],[1,5,1],[1,5,2],[1,5,3],[1,6,3],[10,6,2],[1,6,1],[1,7,1],[1,7,2],[1,7,3]]" + "data": "[[1,1,2],[1,1,3],[5,1,4],[1,1,1],[2,0,3],[2,0,2],[2,0,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[5,4,0],[5,6,0],[5,5,0],[5,7,0],[6,8,0],[1,2,3],[1,3,3],[1,4,3],[1,6,3],[1,7,3],[1,7,2],[1,7,1],[1,6,1],[1,5,2],[1,6,2],[1,5,3],[1,5,1],[1,4,1],[1,4,2],[9,2,2],[1,3,2],[1,3,1],[1,2,1],[7,0,4],[5,2,4],[1,8,3],[1,8,4],[1,7,4],[1,9,4],[1,8,5],[1,9,5],[1,7,5],[1,9,3],[1,8,2],[1,6,4],[1,10,4],[1,10,5],[10,10,6],[1,9,6],[1,8,6],[6,6,5],[6,7,6],[6,5,4],[7,5,5],[7,6,6],[7,8,1],[6,9,1],[7,9,2],[6,10,2],[7,10,3],[5,3,4],[5,4,4],[2,7,7],[5,11,3],[5,12,3],[6,13,3],[2,13,4],[2,13,5],[2,13,6],[2,13,7],[2,13,8],[2,13,9],[2,7,8],[2,7,9],[7,7,10],[8,13,10],[5,12,10],[5,11,10],[5,10,10],[5,9,10],[5,8,10],[1,8,8],[1,8,9],[1,8,7],[1,9,7],[1,10,7],[1,11,7],[1,11,6],[1,11,4],[1,11,5],[1,12,4],[1,12,6],[1,12,5],[1,12,7],[1,12,8],[1,12,9],[1,11,9],[1,11,8],[1,10,8],[1,9,8],[1,9,9],[1,10,9]]" }, { "name": "First Floor", - "data": "[[1,1,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[6,4,0],[7,4,1],[5,5,1],[5,6,1],[5,7,1],[5,8,1],[5,9,1],[5,10,1],[5,11,1],[5,12,1],[5,13,1],[5,14,1],[5,15,1],[5,16,1],[6,17,1],[2,17,2],[2,17,3],[2,17,4],[2,17,5],[9,2,2],[2,0,1],[2,0,2],[2,0,3],[2,0,4],[2,0,5],[2,0,6],[7,0,7],[5,1,7],[5,2,7],[5,3,7],[5,4,7],[5,5,7],[5,6,7],[5,7,7],[5,8,7],[5,10,7],[5,9,7],[5,12,7],[5,11,7],[5,13,7],[5,15,7],[5,14,7],[5,16,7],[8,17,7],[2,17,6],[1,2,1],[1,3,1],[1,3,2],[1,1,2],[1,1,3],[1,2,3],[1,3,3],[1,6,2],[1,8,4],[1,10,6],[1,11,4],[1,13,2],[1,15,4],[10,13,5],[10,9,5],[10,11,5],[1,12,3],[1,10,3],[1,14,5],[1,12,5],[1,8,6],[1,7,6],[1,4,6],[1,1,4],[1,2,4],[1,4,4],[1,4,3],[1,4,2],[1,5,2],[1,5,3],[1,5,4],[1,10,5],[1,10,4],[1,9,4],[10,9,3],[1,7,3],[1,8,3],[1,7,2],[1,8,2],[1,9,2],[1,10,2],[1,11,2],[10,11,3],[1,12,2],[1,7,5],[1,8,5],[1,6,3],[1,6,4],[1,7,4],[1,6,5],[1,6,6],[1,5,6],[1,4,5],[1,5,5],[1,3,4],[1,3,5],[1,3,6],[1,2,6],[1,2,5],[1,1,5],[1,1,6],[1,9,6],[1,11,6],[1,12,6],[1,13,6],[1,14,6],[1,12,4],[1,13,4],[10,13,3],[1,14,3],[1,14,4],[1,14,2],[1,15,2],[1,15,3],[1,15,5],[1,15,6],[1,16,6],[1,16,5],[1,16,4],[1,16,3],[1,16,2]]" + "data": "[[1,1,1],[4,0,0],[5,1,0],[5,2,0],[5,3,0],[6,4,0],[7,4,1],[5,5,1],[12,6,1],[5,7,1],[5,8,1],[5,9,1],[5,10,1],[5,11,1],[5,12,1],[5,13,1],[5,14,1],[5,15,1],[5,16,1],[6,17,1],[2,17,2],[2,17,3],[2,17,4],[2,17,5],[9,2,2],[2,0,1],[2,0,2],[2,0,3],[2,0,4],[2,0,5],[2,0,6],[7,0,7],[5,1,7],[5,2,7],[5,3,7],[5,4,7],[5,5,7],[11,6,7],[5,7,7],[5,8,7],[5,10,7],[5,9,7],[5,12,7],[5,11,7],[5,13,7],[5,15,7],[5,14,7],[5,16,7],[8,17,7],[2,17,6],[1,2,1],[1,3,1],[1,3,2],[1,1,2],[1,1,3],[1,2,3],[1,3,3],[13,6,2],[1,8,4],[1,10,6],[1,11,4],[1,13,2],[1,15,4],[10,13,5],[10,9,5],[10,11,5],[1,12,3],[1,10,3],[1,14,5],[1,12,5],[1,8,6],[1,7,6],[1,4,6],[1,1,4],[1,2,4],[1,4,4],[1,4,3],[1,4,2],[1,5,2],[1,5,3],[1,5,4],[1,10,5],[1,10,4],[1,9,4],[10,9,3],[1,7,3],[1,8,3],[1,7,2],[1,8,2],[1,9,2],[1,10,2],[1,11,2],[10,11,3],[1,12,2],[1,7,5],[1,8,5],[1,6,3],[1,6,4],[1,7,4],[1,6,5],[3,6,6],[1,5,6],[1,4,5],[1,5,5],[1,3,4],[1,3,5],[1,3,6],[1,2,6],[1,2,5],[1,1,5],[1,1,6],[1,9,6],[1,11,6],[1,12,6],[1,13,6],[1,14,6],[1,12,4],[1,13,4],[10,13,3],[1,14,3],[1,14,4],[1,14,2],[1,15,2],[1,15,3],[1,15,5],[1,15,6],[1,16,6],[1,16,5],[1,16,4],[1,16,3],[1,16,2]]" }, ] @@ -498,7 +484,19 @@ var levelRef = { { // human "x": 32, "type": "floor" - } + }, + { + "x": 352, + "type": "wall" + }, + { + "x": 384, + "type": "wall" + }, + { + "x": 416, + "type": "wall" + }, ] } @@ -535,6 +533,10 @@ menu.o = [ { "t": "Editor", "a": _=>{ setRoom(3) } // go to level editor + }, + { + "t": "Settings", + "a": _=>{ setRoom(5) } } ] @@ -598,14 +600,13 @@ menu.keyDown = (key) => { } var gameRoom = new Room("Game"); -gameRoom.level = levels[0]; +gameRoom.humans = 0 var player = new Entity("Player", 0,0); player.speed = 0; player.maxSpeed = 20; player.direction = 0; -player.accel = 2; +player.accel = 1.5; player.sprite = images.player.car; -console.debug(player.sprite); player.crop = hamsterRef.nl; player.x = 0; player.y = 0; @@ -735,6 +736,7 @@ player.shoot = () => { if (ent != player) { cRoom.objects.splice(i, 1); cRoom.objects.splice(cRoom.objects.indexOf(bullet), 1); + gameRoom.humans -= 1; return; } } @@ -833,6 +835,11 @@ gameRoom.start = () =>{ } gameRoom.level = JSON.parse(gameRoom.level); + if (gameRoom.tutorial) { + player.accel = .7 + } + + for (let tile of gameRoom.level) { if (tile[0] === 9) { player.x = (tile[1]*64)+32 @@ -885,16 +892,41 @@ gameRoom.start = () =>{ } pooman.timer = 90; gameRoom.spawn(pooman); + gameRoom.humans += 1; } } } +gameRoom.step = _=> { + if (gameRoom.humans == 0){ + setRoom(0) + } + // step all objects in the room + for (let obj of gameRoom.objects) { + obj.step(); + } +} + gameRoom.draw = () => { + for (let tile of gameRoom.level) { // [index, x, y] c.sliceImage(levelRef.file, (tile[1]*32)*2, (tile[2]*32)*2, 32*2,32*2, levelRef.tiles[tile[0]].x, 0, 32, 32); } - + + if (gameRoom.tutorial) { + c.dT("Welcome to", 3*64, 64+15, 1, 1, "black"); + c.dT("Death by Hamster", (3*64)+32, 64+25, 2,2, "black", "middle"); + + c.dT("Use WASD/arrows to move", 128, 2*64, 1,1, "black"); + c.dT("Aim with the mouse and click to shoot!", 128, 2*64+10, 1,1, "black"); + + c.dT("As a member of the hamster uprising,", 6*64, 3*64+25, 1,1, "black"); + c.dT("you might want to kill any humans", 6*64, 3*64+35, 1,1, "black"); + c.dT("you find!", 10*64-16, 3*64+45, 1,1, "black", "right"); + + + } for (let i = 0; i < cRoom.objects.length; i++) { cRoom.objects[i].draw(); } @@ -927,10 +959,15 @@ editor.step = _=>{ } editor.generate = _=>{ editor.saving=1 - let encodedLevel = encodeURIComponent(JSON.stringify(editor.l)) + for (let tile of editor.l) { + if (tile[0] == 0){ + editor.l.splice(editor.l.indexOf(tile)) + } + } + let encodedLevel = JSON.stringify(editor.l) if (encodedLevel != editor.data){ - encodedLevel = "?lvl=" + encodedLevel; - document.getElementById("leveltext").innerText = encodedLevel + document.getElementById("leveltext").innerText = encodedLevel; + document.getElementById("levelLink").innerHTML = `<a href="/?lv=${encodedLevel}&goto=2">Play</a>` } editor.data = encodedLevel; editor.saving=0; @@ -1028,15 +1065,73 @@ lvlS.keyDown = (key) => { } if (key == "Space" || key == "Enter") { gameRoom.level = lvlS.o[lvlS.s].data; + if (lvlS.s === 0){ + gameRoom.tutorial = 1; + } setRoom(2) } + if (key == "KeyE") { + editor.l = JSON.parse(lvlS.o[lvlS.s].data); + setRoom(3) + } +} + +var options = new Room("Settings") +options.s = 0 +options.ops = o; +options.o = [{ + "t": "Show FPS", + "a": _=>{ o.showFPS = !o.showFPS }, + "v": "showFPS" +}, { + "t": "Menu", + "a": _=>{ setRoom(0) } +}] + +options.drawGUI = () => { + c.dT("Settings", c.w/2, 25, 2, 2, "#fff", "middle", "top"); + for (let o in options.o) { + let s = options.o[o] + let txt = c.dT(`${options.o[o].t}`, 150, 50+(o*20), 2,2,"#fff","left","top"); + if (options.s == o) { + let a = images.ui.a; + c.drawImg(a, 136, 50 + (o * 20), a.width * 2, a.height * 2) + } + let v = options.ops[s.v] + if (!(v==undefined)){ + c.dT(`${v}`, 450, 50+(o*20), 2,2,"#fff", "right"); + + } + } +} + +options.keyDown = (key) => { + if (key == "ArrowUp"||key=="ArrowRight"||key == "KeyW") { + options.s -= 1 + if (options.s < 0) { + options.s = options.o.length-1 + } + } + if (key == "ArrowDown" ||key=="ArrowLeft"||key == "KeyW") { + options.s += 1 + if (options.s > options.o.length-1) { + options.s = 0 + } + } + if (key == "Space" || key == "Enter") { + if (options.o[options.s].a){ + options.o[options.s].a() + } + } } + rooms.push(loader); rooms.push(menu); rooms.push(gameRoom); rooms.push(editor); rooms.push(lvlS); +rooms.push(options) var roomI = !gPar("goto") ? 0 : gPar("goto"); var cRoom = rooms[roomI]; @@ -1057,8 +1152,8 @@ var lastTime = 0; var mse = {x: 0, y: 0}; var lastClick = {x: 0, y: 0}; -var startclicked = false; -var endclicked = false +var leftclicked = false; +var rightclicked = false c.c.addEventListener('mousemove', (e) => { mse = c.getMousePos(e); @@ -1066,16 +1161,24 @@ c.c.addEventListener('mousemove', (e) => { c.c.addEventListener("mousedown", (e) => { // console.log(e); + e.preventDefault() lastClick = c.getMousePos(e); mse = c.getMousePos(e); - startclicked = true; + switch (e.button) { + case 0: // left + leftclicked=1; + break; + case 1: + rightclicked=1; + break; + } }); c.c.addEventListener("mouseup", (e)=>{ // console.log(e); lastClick = c.getMousePos(e); mse = c.getMousePos(e); - endclicked = true; }) +c.c.oncontextmenu = _=>{return 0;} window.onwheel = (e)=>{ if (e.deltaY > 0) { @@ -1094,7 +1197,7 @@ cRoom.start(); c.tH = c.c.offsetHeight; c.scale = c.tW / c.w; frame++; - c.fill("#151f1f"); + c.fill(cRoom.background); for (let key in keysPressed) { if (keysPressed[key]) { @@ -1106,9 +1209,9 @@ cRoom.start(); } } } - if (startclicked) { + if (leftclicked) { cRoom.click(lastClick.x, lastClick.y); - startclicked = false; + leftclicked = 0; } cRoom.step(); @@ -1116,14 +1219,19 @@ cRoom.start(); cRoom.drawGUI(); /* BEDUG INFO */ - c.dT(`FPS:${Math.round(1000 / (Date.now() - lastTime))}`, 0+c.camera.x, 0+c.camera.y, 1, 1, "#fafafa", "left", "top"); - + if (o.showFPS){ + c.dT(`FPS:${Math.round(1000 / (Date.now() - lastTime))}`, 0+c.camera.x, 0+c.camera.y, 1, 1, "#fafafa", "left", "top"); + } + + + switch (cRoom.name) { case "menu": case "Editor": c.ctx.drawImage(images.mouse.cursor, Math.round(mse.x), Math.round(mse.y), images.mouse.cursor.width*2, images.mouse.cursor.height*2); break; case "Game": + c.dT(`Humans:${gameRoom.humans}`, (c.w)+c.camera.x, 0+c.camera.y, 1,1,"#fff", "end") c.ctx.drawImage(images.mouse.ingame, Math.round(mse.x)-16, Math.round(mse.y)-16, 32, 32); break; } diff --git a/index.html b/index.html index 15b0ec2..bf4e4d4 100644 --- a/index.html +++ b/index.html @@ -33,6 +33,7 @@ cursor: none; </style> <aside > <pre id="leveltext"></pre> + <p id="levelLink"></p> </aside> <canvas width="600" height="400" id="gameCanvas"> </canvas> diff --git a/letters.js b/letters.js index 760a285..a0b8d2f 100644 --- a/letters.js +++ b/letters.js @@ -448,6 +448,17 @@ const fntNeg = [ [], ]; +const fntExclaim = [ + [, , 1, 1], + [, , 1, 1], + [, , 1, 1], + [, 1, 1, 1], + [, 1, 1], + [], + [, 1, 1], +]; + + const fntINDEX = { 'A': fntA, 'B': fntB, 'C': fntC, 'D': fntD, 'E': fntE, 'F': fntF, @@ -456,6 +467,6 @@ const fntINDEX = { 'S': fntS, 'T': fntT, 'U': fntU, 'V': fntV, 'W': fntW, 'X': fntX, 'Y': fntY, 'Z': fntZ, '1': fnt1, '2': fnt2, '3': fnt3, '4': fnt4, '5': fnt5, '6': fnt6, '7': fnt7, '8': fnt8, '9': fnt9, '0': fnt0, - '/': fntSlash, ':': fntColon, '.': fntDot, '-': fntNeg, + '/': fntSlash, ':': fntColon, '.': fntDot, '-': fntNeg, '!': fntExclaim } diff --git a/t.aseprite b/t.aseprite index 52c9e7b9b68564b35e02721e04dabb65ee07f358..88533f274d87786feac38b38e560a1341ee21ea1 100644 GIT binary patch delta 1643 zcmew^u|iH!gP(!n!BRd31u$e}U|>jLKn7M572_E<PHa@=FJok2kW{dON?LB*8qFxi zz#t<d^Php?>gvq@I~W)kSQr=?7_25sF|A;ek&(H&I&<<vCb`KEm^v8eOtxcnXAGGv z$SGrSb|Wu?0uQqz+sA**DF-h!v;+muTbf_%Y32WV&8lDN-^~xt{`j-TZvOe_pTX4s z_xVwA92_&iMg)M2FgbgWlR<%p#gTjGKW>lakI9^Df@z8OCof5!f4yM;kI<{;P_55D z|NL|PAKQl;qK*r}+9N^QZLe?SWH8`icI035m;FMM-(<4~UM){p<KuNbbr;39maop= zE&T8?6zqR_J#qif%l{kae-xkigM(ut*c?xgIl9*!c|qoEWaO-8P`z>R#A3UXGLuxK z&s80tJ(HE;LEpE3IoJQmm(+rsj~oK$Hu5qsa4<QtC;n%Q2vFZ(s%CTYdixTwqhZH? zKf7(mDGvqz+v86M{dvn@*Jf|&$-%K4Y;`=yYG<?%SS-Nw&!y>R^WS?OMXkqX&HQ=x z+xkh<5C6Y?{`I5zhmJ$R`iJ|YOy^gbGFBIJaI65EmH;v>6l9tK2P8Z<IDYn2;P~0e z0XB^*_U63Z?y1kiPo94G{nxh}`gL2I`=P-8_V#DKpI^QgQ#!)Iv6qQ~;nzoIaQb0p zU|{HHoNUM}RX_Li)vzN5A`Tb*kKMg{H+COGdO>;ljDxal<@_d@mzMcDJ-2&PI*;#@ zi4x0~$9W$dZ8y5syk0OrV(#5#4^J->`@@;rab<x&>x=favqOvRQm&bV@_d<GnXc6t zYWgC5g+u<8Q}w6bF1SDcdg@H0ovM#q+5g5(^O_rZWs1Rhu?zkg^$R0jc&^}RuDh}4 zmU38zd3r<L9;Rmpv#x2)Xa2k9-AYNV^O7&VKhLwe?rwQRq;R$9kCUmN)hf;B=zLH& zRh-nhPIZC2S>Ck7VpZd1p2ru=@0#xEd@s=SMY_jPy_FOHFZr-w{=1|ImB`!<i|br} zI#klxOgnGPWc?!S?U2r#wA`uw<AeT})2$Cadh?6t!g;-EmfK!!?MhrQ|El0sXIE?H zza{N=1MNCgc6BhXJ>aj~^!(A=*$(?_!*@h1_mH?XxuMRdJ#xj_bw1S`Y=1+_EDmNY z_vQQbv1vo@s!-Jl%zrifyL}p>HuL@1X;_~=OT#|r^b_$rS6+NN#=yY9s=&y=#ITu_ zON3Eq%V^vTnz-2qkDJM?TtbuUxPLOP2Is_NP)>Bej#{!UR%lwWKq-;`+3UK+D&fjg zXU?1-azFI?>x=cb{hRN;TK_Kee+fGS14I4oz21v+zsWo1NFKiW>%aoAi4h<ZZLV+R zWia4iKFIUvFZ+k46s9F66Aty4eBJIA#JSP$$4xy328Jg$Znf?&&%FNfU*pPuukD@c zm)A4iiu!c`sm!zi6%h(N&VlSFL8W$8poVR@;Gf3&vy(-<dQER%y!kKmW7ZEOu>Egv O_1)$BXWa@Gbp!x=oa__; delta 1137 zcmZ1>_gzA<oQHwo!BTDp1u$e}U|>jLKn4~Q72_G_Pi$1>&tha?kW{dMN}6xn8qLVH ziGhKEg@KWQ!D6x+(~8Mgn3geqnf#E|opH@%13u~cyH^~!8Vq<`F5dZXu`?l7J8bsJ znj>6yIp1$@aXHfQS+jnoW!m#+-&d>u_Sbvcz3r&@-EH@G6yG-AF)4r7<|oYC&WgvZ zzMt{q?C<qv6F$ekRH#j6-&g<gZ~RMzzf;>{{~qIc@Y(;&{DV_#7Ds<;yqo>C`(4?- z8x3dVpN3m`+`n;A=-&SLH}+ebzl2NO`@<YLt?ceYu;XS<HsF(~pX$hUK!Jzl^Z(~h zn!iQ7SXyR$TfyZ-U|MflPlsr5aQV*bAIyKw+}R=ZZ|0x7Jm+ooy{rBwuvPwB5I5!d z{uzuP{TGVQ_<w|FN4@pWxzFFf+W*3~h2P@9qy7ARNB+M5wEp3H$Dd5nPs``uul>JF z=F=Z%%ev3^IsffvxSHQT>jeYD<j1V8j0?annQq9(pvb}U^MCP=1>rG?seCtLcQOgR ziVQrSk#>67^78xZ9?JiCx9^JWpZ}j0OP*4HzxKjU@idP6_7`<7eV;#P;S>2sI;Z|A zr#Ae(ee!)w{q;Y>dEFsh`UMO}>l>I8|F8a2{qSw$4;Hf{@8kAY{dcuI^`Aee&uIP> z=4a_eH6P_!ZwI%zJphNy42XLixegd`u>AdB{3pRHe`&&|w5{7h68%q}Vapess5sYt z`SOC0(m9DYV%ZPhk6hoJxcOJ$y`(^Q)%{7z6{j0FN&a~w_uAoy{<nBp>*pHM8|Bl? z1NpYyf83F#TyexO`J#EsxAihS{TuRMY?tAApI9w7_tk&*<p%7n`G;TKXJBBM{Djqo zaXQ!~R~-2o6nI=N-urK{cR^n4j2nFQ0?I0}`!%Py9TD99FJ|-kZ~9Ybe!KN=*S`}A zoMz9s^&WNGD*s!c{oCRECjQ$i?w1tCpZT!z_xiMgbM@-&m)nbcZtj2g_x{O;U$iCX z{EPk@et-Xi$G=}Z<oB?9;AQvX)}KYyujjjNY;$|Uz`*cp@>5o4#yMb@T#MyvFyLTL zcvml@XEEPYP5T0$aO5TT&sXOgp3S*w`=RLj*3+j`{q^4{uREl_D|7ynw%SeI-#CA= zZhs^EX43k7^;?=>{dKR_s7>U*`6u}2L^&_{mkYj?%TB3#{`vi%f4jcT&tMCD7JsPq z4|BS})Bnn|Kkk1mANAP3ZZ@~ZgElwDSK#<r1a`|6L%stFJj@6F{I{%`pck8PurK+R z;zXOUbS)2;GZCB5NF>kOR9`&f?&R7{>`$eumi##+HzoZ=;3H$(Id+#0zN{~;d&qZc z-w(FSbr<;-)qegrIrqZWA4_6islN&Of9$_`$%ei5+xtrxs$y>L&y#=I@TR_GyJqJ9 z{dVP#y_Ws;doFyId9r?+TRI~H!>^Cb;PQfbvK_O{<}6M*M&3AdVa9!vvpJ<FJM;Vm E0OrLk{r~^~ diff --git a/t.png b/t.png index bd2c211e511e380f3b330f03afbe694c702de509..63a041b1c6a136ddcd52123eea4325d9387ec85d 100644 GIT binary patch literal 2095 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 literal 1390 zcmeAS@N?(olHy`uVBq!ia0y~yU`$|OU{K&-V_;y=@mn;7fq{XsILO_JVcj{ImkbQ7 z8lEnWAr*7p&OMv^*g&B5<x#N(YBlFo+eIdpBrq0oYO1KJG+c5FYT@7c<el1;#_t;@ zC>s8mshDn|TxplEahlJ^K(4<wQj<QN<1Du17x(;ocVB!C|KWypi(l`0QT^CLZ`<#E z{ZmYMV*Y!7-OZWv|MORGlb|2JrW^nJyiN6=mwCcj2dm|Y0gKn(_kDX%;^Un4zpo$t z_V~MZ>1+e5<ChaR{(t+h+0}kYGFuEsX-a~GrNJ@ptKXMZDcsuXR?|I$QGCMdo@<P} zUMfB2VfxDj?R)M2$G@px?y2|uVfe0sTlR+a_ET=nc=i9yyQW|7|GxYGzwx`qm*v0a zr$>exC$Q))x;IJ2ge`~f!U9%fwgZWKw${gYcVrqevn2(tUnsb;uHEpFO#glTgD->* zmB^$SywCg-Ii<e(N5-oE_uj92dbYthV%_x%U2S#deab%<C>%MHq}jOj<!nav31;!D z`eJV#o3{9^YVMcY?Q0ib{aN^R;=0#Id}lnC`gKgq$fe`w)1pmMU;Z~lr|L)?58U%P zpYsj7Wr$pG`?i%aiVA;MzqXoK-1y4LUU})~M*ZiFDS8{H?2{}|%>Kb3{hIxk>-|mk zPQBB$93Fa^W?a}V;=(GG$GDy4OVu(ShM?n8`)w4P<L+$c+Yww;r!v#Xu1~Z?=vUeS zP6cM3IdkQ#4ji=nJ~{gS`uV@T*P7+eS*6YLb*IM{&llohy>g{fUS6NRI^OGkkbvZp zd`87za|GvZsp|||!;@;Qcv;ADzeM!clh<Ch30%l94mo!}eA4EpSIn8&m`s)Yl&4+F zTYEln!Ia#~M(Q!nzr3BLuk|cdnBcKYbwQ=W$)_tK{@(by#+JYD^@5`nwZ1Fom_7aJ z^!(nmDG%4|4!f`PfXQTuYSFIf&NkBpny=<6*Unw}wfuM8$NXF3+UEEB_RhQhSYAB4 z`M=e6{iU<B<`<_O2=%yE=jrd8wb0()E-c))Z`LcBC1=dpU3W))-yG9dw*CG3)Sxsg zee?CRC(Uqdzm?uxAnj6R$T8J!dgC%BlT~HeCh@Pzw#sz0x~vqin6C9(%G7(hE_+PJ zwCJ3dWdVBA*G1k{o5-DO%O7JUbv`z^Ya@Th%+_gK?LkZnEBC5?U4B3(m~ZQ4r3953 zd&IxD7i&MWZj{}Vy>Rm4tM?s>Zb^r=|DM%yNo2yy)C((ilvNr&tLScM%&5@#*78N1 zVR~Ke-U%8Kx7A)AwYU_R@3r~rsy%m<<(>KW&YYc_`)>LsJ$d5?JhOVPTmIx%S-$Vd zlvN@Z((eZ?S6Oh~>9OhT12MucoY?-Co)Ixj4L<(lmf&jpt@(#|EE-FeSf-yo_WJt7 zOQ$lI^sUdG-}c;4;`Sk)9Zb5%Uf=n3i8tHLN_V4c5Oem<#&vhzZ<=azfBV#ZyoWU1 zs$};~sna?hU1j4gz4Up~eXWhI0vFgHT=DZ?d}TYw4yKpK1HIhC?*z|N=|BF$V{OG9 zr5TRvuIP&<fAfA7%`%5U>Y<0L<)w>Lx9nqkBXz-PtAKLY_TtRRxoh*;<~aUd`|R30 z_6=frU-wx4*i~OT|88vX-u1t)zy9{Iq~QGFr8ED1EGamC`JiRGCWnEL@`DR6{bg>& z{HoRe{n^N}O|h2yl&x;y@2?M+l^oCxySIL~3hTj@`GN*Qom*Ja7IZ5cO}=)Wp^Wv3 z?z8;tpKsoYP0ZvuA#>+Knck&3Ilb#Ara0S+WJa^ZG+a6IN7wDht&7_Po=@|5nx)vS z|EE@<`1uw4d3Dpxnb$dFJrz5~v3<pQUgLXKa{J?5O7F?p&3e&Z@{h4y-7jnH-ctt| Q7#J8lUHx3vIVCg!0A%)~yZ`_I -- GitLab