From 84c13286dbb6e7fdd894d08693b7f3cda97d3f29 Mon Sep 17 00:00:00 2001 From: Om Raheja Date: Mon, 26 Aug 2024 11:29:27 -0400 Subject: [PATCH] added tanks from sprig in personal repo --- README.md | 18 + demo.png | Bin 0 -> 24517 bytes tanks.js | 1029 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1047 insertions(+) create mode 100644 demo.png create mode 100644 tanks.js diff --git a/README.md b/README.md index dd1f058..5095186 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ # tanks +The best way to show off your sprig to your friends!! +This is a simple multiplayer game where you try to shoot down the enemy tank. + +Also available at: +https://github.com/hackclub/sprig/blob/main/games/tanks.js + +In the color picker: +AD to move player one cursor. +JL to move player two cursor. +W and I to set READY state for players. + +In the actual game: +WASD for player one to move, +IJKL for player two to move. + +The game moves the players automatically every 500 ms. +Each keypress shoots a projectile and changes direction. +Shoot the other tank to win! diff --git a/demo.png b/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..54a84a1c905d65d9a1a368a4773a261e03eece51 GIT binary patch literal 24517 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�+v_8;YI+sp?9F~>OC z@UOY4i+;Z{dw ze3w!WgctB4FFa*ASC2i+7>mt~Z7!*2?J3X7>B#1p`b?81g{nleGzg*(e-%M?dGd1wACLDJs=UQ`Sy zyF-{Vd^`-$=NVMl$-2x)8&{&rE`{lgt{Lxii9J8}1>V)k5@4Z5rr0W$8ax z!*H2PbuPP+K=v}8+$ANTew5Hrask?gId9y(k};%Si`%q|3Mw{ZVb0T}8RaUd5S)OV z)9D+cqKg9WB1cu!bc%w$-zoDjmU5th8-T0P0gmEBC0)`Tj@d2sGvUHry|v83-u`vQ zHa=W(My^29mXE-PzLTI}obu)fWW!ifcDTzYX;ffYbb!9dc(0YPu-QqCP>-VQl1vlw zGW&+jyM49g$wNSYp>MH4dx2W&l404erD-U+4--hBwmXQ!M;sgmIHq zl_mB*R@yQ<&16af5^UubGEPay42pfsc~+L^?15+@!SlJi=HGXQVD1vk%>ZHPzt0-ICoajY zh{~dE>{$hr7HJ9K?r$~;z+;ekE~3vBfo%f%JtfGlPVE2ZX@QGUl{%kWYxpBzkIm zfNy&b49Lt-;~MfNC^6md9Zi|fjb#fok1mylQ@=9Tck>UsN!;BaZCu6(m1nSN<)mBuNQYwL+HRQMR}Or-ba z?%Li90(m>vVLt5$ zX{MF1R-Q^0Mr~bmHCJl+0QH-XFNG_UE3_6S||ny)iUZ&6dsJ^5maxjJLsYnLl823?}l^1yNg9(n>!NB)ID~PXDUI&Dn&! zm)BI(>qQNG)@j<}B|nFQLDw?udve51+{v)eBP*qy{ES+d$e!AQ573a7az3^tj`Z{yxq5++rN%1CmqN*e+euQbO2i$=de9s2QC=!=i!7ulu{4a zx*kGwd)V8>n*jAALXa zut?T#Xc^uj8SWXm70YK$IVkk%e}C%Q*uZOP@)XvPxY$~2Ra;XFDVtl7G_Lf5!-};(#tgzI_N2Ug9_@2 z<5&QewpXwJE;oD=aQ0>~8++rC20@#t8po-C`6JFbDWCBU@l)0oB)G!$g$H=^8obm! z@s`Gt!#-JV3i)!&b&MOedDfzJ>r#oM?x@q8_pWt?$B0YTfD^fi(i{C{?5;2c zE`MHbMY+!D0gfkOL%INx0(GXQetoML&_$Ujss-FmCvf|g6rM0EtN%wh0V3(y{v)9# z6r)k-rF$hyFb|4SZS@D1hPTk#Eiru@hdD$yt|^Wzr~df3P-1hL|ioty8oobdXJi&;cT^()c~Q+zMZ0gTV&9P3}tWi>X~&@^T;o>6mB z;)8dA-$_yCB&FzE{REiA6Mgl|egK{U3=wDoOWNLHzggyT$0P}3J5#Zck*C3YbtxV$DEcv=?rL<+o#sZ^fX=Wd2(hiXV(L5-uxIJ?t>1$3oWS$1mDVj~t3 z+{t!X280cuG}12ed=P#RHXy;#eCnP${Im^%uC6*QWBtY<)`Oj0mR$@kVcsCCYA-de z**lxIt-Uuoxg(nE$iD*{##k!hHV?l zaV-=U(hdopQj!MAZ7eXSSOh9P0G}7tq2Qn%r={FhY|!!=Sg8`Q(!2FpZWs0v^N0C9 z>GYyavnq&q-o>V%UQ%a~t7G-HYkr=tZ>lf(h7J9A@?OSkXJGT5HbBJ}0WSsbsq_8B zj}7F5SFpamTc$3%o3>f`Ri*87oZeZvy+O@~Hp$0;@ieAH{K~AGWQC?Bp_NH5!Cdj( zl9hY}z=LmMLB+KRq<&4kx>FK=;PY#zzc0W3dz1G4N(@IEzUixf>-fR1Au;j-oZn=> zOMFlv+3V*gavW5rFu<%ZD{X|C9{iKeppfL;b(HL&;KU3@FPWBGcqz;tL>So@8m)d@9H39l66WM2}_sek{7b}4TylJ!c z`n~uk<=g-iapP0l|J_?ee&Ba>1"; +var direction2 = "<"; + +const colorTanks = [{ + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...0033003300... +..C0330000330C.. +..C3303333033C.. +..C3030303303C.. +..C3033030303C.. +..C3033333303C.. +..C3303333033C.. +..C3330000333C.. +..C0333333330C.. +..C0033333300C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...0033333300... +..C0333333330C.. +..C3330000333C.. +..C3303333033C.. +..C3030303303C.. +..C3033030303C.. +..C3033333303C.. +..C3303333033C.. +..C0330000330C.. +..C0033003300C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...033333330.. +000000330330030. +00..03333333330. +.....0000000000. +.....00494949330 +....000000000000 +...0F03CF03CF300 +..0F3F0F3F0F3F0. +...0FC30FC30F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..033333330...00 +.030033033000000 +.03333333330..00 +.0000000000..... +03394949400..... +000000000000.... +003FC30FC30F0... +.0F3F0F3F0F3F0.. +..0F03CF03CF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...0099009900... +..C0990000990C.. +..C9909999099C.. +..C9090909909C.. +..C9099090909C.. +..C9099999909C.. +..C9909999099C.. +..C9990000999C.. +..C0999999990C.. +..C0099999900C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...0099999900... +..C0999999990C.. +..C9990000999C.. +..C9909999099C.. +..C9090909909C.. +..C9099090909C.. +..C9099999909C.. +..C9909999099C.. +..C0990000990C.. +..C0099009900C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...099999990.. +000000990990090. +00..09999999990. +.....0000000000. +.....00434343990 +....000000000000 +...0F09CF09CF900 +..0F9F0F9F0F9F0. +...0FC90FC90F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..099999990...00 +.090099099000000 +.09999999990..00 +.0000000000..... +09934343400..... +000000000000.... +009FC90FC90F0... +.0F9F0F9F0F9F0.. +..0F09CF09CF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...0066006600... +..C0660000660C.. +..C6606666066C.. +..C6060606606C.. +..C6066060606C.. +..C6066666606C.. +..C6606666066C.. +..C6660000666C.. +..C0666666660C.. +..C0066666600C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...0066666600... +..C0666666660C.. +..C6660000666C.. +..C6606666066C.. +..C6060606606C.. +..C6066060606C.. +..C6066666606C.. +..C6606666066C.. +..C0660000660C.. +..C0066006600C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...066666660.. +000000660660060. +00..06666666660. +.....0000000000. +.....00434343660 +....000000000000 +...0F06CF06CF600 +..0F6F0F6F0F6F0. +...0FC60FC60F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..066666660...00 +.060066066000000 +.06666666660..00 +.0000000000..... +06634343400..... +000000000000.... +006FC60FC60F0... +.0F6F0F6F0F6F0.. +..0F06CF06CF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...00DD00DD00... +..C0DD0000DD0C.. +..CDD0DDDD0DDC.. +..CD0D0D0DD0DC.. +..CD0DD0D0D0DC.. +..CD0DDDDDD0DC.. +..CDD0DDDD0DDC.. +..CDDD0000DDDC.. +..C0DDDDDDDD0C.. +..C00DDDDDD00C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...00DDDDDD00... +..C0DDDDDDDD0C.. +..CDDD0000DDDC.. +..CDD0DDDD0DDC.. +..CD0D0D0DD0DC.. +..CD0DD0D0D0DC.. +..CD0DDDDDD0DC.. +..CDD0DDDD0DDC.. +..C0DD0000DD0C.. +..C00DD00DD00C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...0DDDDDDD0.. +000000DD0DD00D0. +00..0DDDDDDDDD0. +.....0000000000. +.....00434343DD0 +....000000000000 +...0F0DCF0DCFD00 +..0FDF0FDF0FDF0. +...0FCD0FCD0F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..0DDDDDDD0...00 +.0D00DD0DD000000 +.0DDDDDDDDD0..00 +.0000000000..... +0DD34343400..... +000000000000.... +00DFCD0FCD0F0... +.0FDF0FDF0FDF0.. +..0F0DCF0DCF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...0077007700... +..C0770000770C.. +..C7707777077C.. +..C7070707707C.. +..C7077070707C.. +..C7077777707C.. +..C7707777077C.. +..C7770000777C.. +..C0777777770C.. +..C0077777700C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...0077777700... +..C0777777770C.. +..C7770000777C.. +..C7707777077C.. +..C7070707707C.. +..C7077070707C.. +..C7077777707C.. +..C7707777077C.. +..C0770000770C.. +..C0077007700C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...077777770.. +000000770770070. +00..07777777770. +.....0000000000. +.....00434343770 +....000000000000 +...0F07CF07CF700 +..0F7F0F7F0F7F0. +...0FC70FC70F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..077777770...00 +.070077077000000 +.07777777770..00 +.0000000000..... +07734343400..... +000000000000.... +007FC70FC70F0... +.0F7F0F7F0F7F0.. +..0F07CF07CF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...00HH00HH00... +..C0HH0000HH0C.. +..CHH0HHHH0HHC.. +..CH0H0H0HH0HC.. +..CH0HH0H0H0HC.. +..CH0HHHHHH0HC.. +..CHH0HHHH0HHC.. +..CHHH0000HHHC.. +..C0HHHHHHHH0C.. +..C00HHHHHH00C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...00HHHHHH00... +..C0HHHHHHHH0C.. +..CHHH0000HHHC.. +..CHH0HHHH0HHC.. +..CH0H0H0HH0HC.. +..CH0HH0H0H0HC.. +..CH0HHHHHH0HC.. +..CHH0HHHH0HHC.. +..C0HH0000HH0C.. +..C00HH00HH00C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...0HHHHHHH0.. +000000HH0HH00H0. +00..0HHHHHHHHH0. +.....0000000000. +.....00434343HH0 +....000000000000 +...0F0HCF0HCFH00 +..0FHF0FHF0FHF0. +...0FCH0FCH0F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..0HHHHHHH0...00 +.0H00HH0HH000000 +.0HHHHHHHHH0..00 +.0000000000..... +0HH34343400..... +000000000000.... +00HFCH0FCH0F0... +.0FHF0FHF0FHF0.. +..0F0HCF0HCF0... +...000000000.... +................ +................` + }, + { + "^": bitmap` +......0000...... +......0000...... +.......00....... +.......00....... +...0088008800... +..C0880000880C.. +..C8808888088C.. +..C8080808808C.. +..C8088080808C.. +..C8088888808C.. +..C8808888088C.. +..C8880000888C.. +..C0888888880C.. +..C0088888800C.. +..C0000000000C.. +..C..........C..`, + ".": bitmap` +................ +................ +...0088888800... +..C0888888880C.. +..C8880000888C.. +..C8808888088C.. +..C8080808808C.. +..C8088080808C.. +..C8088888808C.. +..C8808888088C.. +..C0880000880C.. +..C0088008800C.. +..C0000000000C.. +..C....00....C.. +......0000...... +......0000......`, + "<": bitmap` +................ +................ +................ +......0000000... +00...088888880.. +000000880880080. +00..08888888880. +.....0000000000. +.....00434343880 +....000000000000 +...0F08CF08CF800 +..0F8F0F8F0F8F0. +...0FC80FC80F0.. +....000000000... +................ +................`, + ">": bitmap` +................ +................ +................ +...0000000...... +..088888880...00 +.080088088000000 +.08888888880..00 +.0000000000..... +08834343400..... +000000000000.... +008FC80FC80F0... +.0F8F0F8F0F8F0.. +..0F08CF08CF0... +...000000000.... +................ +................` + }, +]; + +/* since the sprites for colored tanks are 0,1,2... respectively */ +const colorCode = [ + color`3`, color`9`, color`6`, + color`D`, color`7`, color`H`, + color`8` +]; + +const colorString = [ + "RED", "ORANGE", "YELLOW", "GREEN", "BLUE", "PURPLE", "PINK" +]; + +const wallBitmap = bitmap` +10LLLLLLLLLLLL01 +010LLLLLLLLLL010 +L010LLLLLLLL010L +LL010LLLLLL010LL +LLL010LLLL010LLL +LLLL01022010LLLL +LLLLL010010LLLLL +LLLLL201102LLLLL +LLLLL201102LLLLL +LLLLL010010LLLLL +LLLL01022010LLLL +LLL010LLLL010LLL +LL010LLLLLL010LL +L010LLLLLLLL010L +010LLLLLLLLLL010 +10LLLLLLLLLLLL01`; +const projectileBitmap = bitmap` +................ +................ +................ +................ +................ +................ +......LLLL...... +......LL0L...... +......L0LL...... +......LLLL...... +................ +................ +................ +................ +................ +................`; + +var musicPlaying = null; + +// scores +var score1 = 0; +var score2 = 0; + +// sprite type +var player1Type = 3; +var player2Type = 3; + +// color ready +var player1Ready = false; +var player2Ready = false; + +// time of last win +var lastWin = 0; + +registerSprites(); +setSolids([player, player2, wall, projectile]); + +const Maps = { + End: 0, + ColorPicker: 1, + FirstLevel: 2 +}; + +const Music = { + End: tune` +283.0188679245283: B4~283.0188679245283, +283.0188679245283: C5~283.0188679245283, +283.0188679245283: D5~283.0188679245283, +283.0188679245283: D5~283.0188679245283, +283.0188679245283: C5~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: A4~283.0188679245283, +283.0188679245283: G4~283.0188679245283 + E4-283.0188679245283, +283.0188679245283: G4~283.0188679245283 + E4-283.0188679245283, +283.0188679245283: A4~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: A4~283.0188679245283 + E4-283.0188679245283, +283.0188679245283: A4~283.0188679245283 + E4-283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: C5~283.0188679245283, +283.0188679245283: D5~283.0188679245283, +283.0188679245283: D5~283.0188679245283, +283.0188679245283: C5~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: A4~283.0188679245283, +283.0188679245283: G4~283.0188679245283 + E4-283.0188679245283 + C4/283.0188679245283, +283.0188679245283: G4~283.0188679245283 + E4-283.0188679245283 + C4/283.0188679245283, +283.0188679245283: A4~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: B4~283.0188679245283, +283.0188679245283: A4~283.0188679245283 + E4^283.0188679245283, +283.0188679245283: G4~283.0188679245283 + D4^283.0188679245283, +1132.0754716981132`, + ColorPickCheck: tune` +230.76923076923077, +230.76923076923077: B5-230.76923076923077, +230.76923076923077: B5-230.76923076923077, +6692.307692307692`, + ColorPickFail: tune` +153.0612244897959: E4/153.0612244897959, +153.0612244897959: D4/153.0612244897959, +153.0612244897959: C4/153.0612244897959, +4438.775510204081`, +}; + +let level = Maps.ColorPicker; +const levels = [ + map` +wwwww +wwwww +wwwww +wwwww +wwwww`, + map` +........... +........... +........... +..0123456.. +.....x..... +..0123456.. +.....y..... +........... +...........`, + map`a......... +.......... +..w..ww... +..w....... +..w....... +.....b.... +...www.... +..........` +]; + +loadColorPicker(); + +function registerSprites() { + setLegend( + [player, player1Bitmap()], + [player2, player2Bitmap()], + [wall, wallBitmap], + [projectile, projectileBitmap] + ); +} + +function registerColorSprites() { + const chooser1 = "x"; + const chooser2 = "y"; + + setLegend( + ["0", colorTanks[0][">"]], + ["1", colorTanks[1][">"]], + ["2", colorTanks[2][">"]], + ["3", colorTanks[3][">"]], + ["4", colorTanks[4][">"]], + ["5", colorTanks[5][">"]], + ["6", colorTanks[6][">"]], + [chooser1, bitmap` +4444444444444444 +4444444444444444 +4444444444444444 +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................`], + [chooser2, bitmap` +4444444444444444 +4444444444444444 +4444444444444444 +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................`] + ); +} + +function loadLevel() { + clearText(); + direction1 = ">"; + direction2 = "<"; + registerSprites(); + level = Maps.FirstLevel; + setMap(levels[level]); +} + +function loadColorPicker() { + level = 1; + registerColorSprites(); + setMap(levels[level]); + addText("L/R MOVE,UP SELECT", { y: 1 }); +} + +// holds all the flying bullets +var projEntities = []; + +function addProjectile(x, y, direction) { + if (level >= Maps.FirstLevel) { + setLegend([projectile, projectileBitmap]); + + if (x >= 0 && x < width() && y >= 0 && y < height() && getTile(x, y).length <= 0) { + projEntities.push([x, y, direction]); + addSprite(x, y, projectile); + } + + checkWinLose(x, y); + } +} + +function player1Bitmap() { + return colorTanks[player1Type][direction1]; +} + +function player2Bitmap() { + return colorTanks[player2Type][direction2]; +} + +function oneMusic(tune) { + if (musicPlaying) { + musicPlaying.end(); + } + musicPlaying = playTune(tune); +} + +function checkWinLose(x, y) { + if (level >= Maps.FirstLevel) { + registerSprites(); + + if (getFirst(player).x == x && getFirst(player).y == y) { + level = 0; + oneMusic(Music.End); + + setMap(levels[level]); + clearText(); + addText(colorString[player2Type] + " WIN", { x: 0, y: 0, color: colorCode[player2Type] }); + addText("ANY KEY TO CONT", { x: 0, y: 2, color: color`2` }); + + score2++; + lastWin = new Date().getTime(); + } else if (getFirst(player2).x == x && getFirst(player2).y == y) { + level = 0; + oneMusic(Music.End); + + setMap(levels[level]); + clearText(); + addText(colorString[player1Type] + " WIN", { x: 0, y: 0, color: colorCode[player1Type] }); + addText("ANY KEY TO CONT", { x: 0, y: 2, color: color`2` }); + + score1++; + lastWin = new Date().getTime(); + } + } +} + +/* change direction */ + +onInput("w", () => { + if (level >= Maps.FirstLevel) { + direction1 = "^"; + registerSprites(); + + addProjectile(getFirst(player).x, getFirst(player).y - 1, "^"); + + } else if (level == Maps.ColorPicker) { + const chooser1 = "x"; + const chooser2 = "y"; + player1Ready = true; + + player1Type = getFirst(chooser1).x - 2; + player2Type = getFirst(chooser2).x - 2; + + if (player1Type == player2Type) { + oneMusic(Music.ColorPickFail); + } else if (player2Ready) { + oneMusic(Music.ColorPickCheck); + loadLevel(); + } else { + oneMusic(Music.ColorPickCheck); + } + } +}) + +onInput("s", () => { + if (level >= Maps.FirstLevel) { + direction1 = "."; + registerSprites(); + + addProjectile(getFirst(player).x, getFirst(player).y + 1, "."); + } +}) + +onInput('a', () => { + if (level >= Maps.FirstLevel) { + direction1 = "<"; + registerSprites(); + + + addProjectile(getFirst(player).x - 1, getFirst(player).y, "<"); + + } else if (level == Maps.ColorPicker) { + const chooser1 = "x"; + registerColorSprites(); + + if (getFirst(chooser1).x > 2) { + getFirst(chooser1).x -= 1; + } + } +}) + +onInput('d', () => { + if (level >= Maps.FirstLevel) { + direction1 = ">"; + registerSprites(); + + + addProjectile(getFirst(player).x + 1, getFirst(player).y, ">"); + + } else if (level == Maps.ColorPicker) { + const chooser1 = "x"; + registerColorSprites(); + + if (getFirst(chooser1).x < 8) { + getFirst(chooser1).x += 1; + } + } +}) + +onInput("i", () => { + if (level >= Maps.FirstLevel) { + direction2 = "^"; + registerSprites(); + + addProjectile(getFirst(player2).x, getFirst(player2).y - 1, "^"); + } else if (level == Maps.ColorPicker) { + const chooser1 = "x"; + const chooser2 = "y"; + player2Ready = true; + + player1Type = getFirst(chooser1).x - 2; + player2Type = getFirst(chooser2).x - 2; + + if (player1Type == player2Type) { + oneMusic(Music.ColorPickFail); + } else if (player1Ready) { + oneMusic(Music.ColorPickCheck); + loadLevel(); + } else { + oneMusic(Music.ColorPickCheck); + } + } +}) + +onInput('k', () => { + if (level >= Maps.FirstLevel) { + direction2 = "."; + registerSprites(); + + addProjectile(getFirst(player2).x, getFirst(player2).y + 1, "."); + } +}) + +onInput('j', () => { + if (level >= Maps.FirstLevel) { + direction2 = "<"; + registerSprites(); + + addProjectile(getFirst(player2).x - 1, getFirst(player2).y, "<"); + } else if (level == Maps.ColorPicker) { + const chooser2 = "y"; + registerColorSprites(); + + if (getFirst(chooser2).x > 2) { + getFirst(chooser2).x -= 1; + } + } +}); + +onInput("l", () => { + if (level >= Maps.FirstLevel) { + direction2 = ">"; + registerSprites(); + + addProjectile(getFirst(player2).x + 1, getFirst(player2).y, ">"); + } else if (level == Maps.ColorPicker) { + const chooser2 = "y"; + registerColorSprites(); + + if (getFirst(chooser2).x < 8) { + getFirst(chooser2).x += 1; + } + } +}) + +// restart the game if the level is different +afterInput(() => { + if (new Date().getTime() - lastWin >= 250 && level == Maps.End) { + loadLevel(); + addText(score1 + ":" + score2, { color: color`4` }); + } +}); + +// actually move the sprite in a forever loop +function run() { + if (level >= Maps.FirstLevel) { + // projectiles go first + registerSprites(); + for (var i = 0; i < projEntities.length;) { + clearTile(projEntities[i][0], projEntities[i][1]); + switch (projEntities[i][2]) { + case "^": + projEntities[i][1] -= 1; + break; + case "<": + projEntities[i][0] -= 1; + break; + case ">": + projEntities[i][0] += 1; + break; + case ".": + projEntities[i][1] += 1; + break; + default: + break; + } + + const x = projEntities[i][0]; + const y = projEntities[i][1]; + + var items = getTile(x, y); + + checkWinLose(x, y); + + if (x < 0 || x >= width() || y < 0 || y >= height() || items.length > 0) { + projEntities.splice(i, 1); + + } else { + i++; + addSprite(x, y, projectile); + } + } + + // process tank movement + if (level >= Maps.FirstLevel) { + switch (direction1) { + case "^": + getFirst(player).y -= 1; + break; + case "<": + getFirst(player).x -= 1; + break; + case ">": + getFirst(player).x += 1; + break; + case ".": + getFirst(player).y += 1; + break; + default: + break; + } + switch (direction2) { + case "^": + getFirst(player2).y -= 1; + break; + case "<": + getFirst(player2).x -= 1; + break; + case ">": + getFirst(player2).x += 1; + break; + case ".": + getFirst(player2).y += 1; + break; + default: + break; + } + } + } +} + +setInterval(run, 500); \ No newline at end of file