From ed7d5474086b75c66f4492339191e0b9808e4af5 Mon Sep 17 00:00:00 2001 From: Dragon Fire Date: Sat, 23 Jan 2021 15:22:23 -0500 Subject: [PATCH] Chess Command --- README.md | 6 +- assets/images/chess/board.png | Bin 0 -> 28235 bytes assets/images/chess/pieces/black-bishop.png | Bin 0 -> 1145 bytes assets/images/chess/pieces/black-king.png | Bin 0 -> 1561 bytes assets/images/chess/pieces/black-knight.png | Bin 0 -> 1518 bytes assets/images/chess/pieces/black-pawn.png | Bin 0 -> 1013 bytes assets/images/chess/pieces/black-queen.png | Bin 0 -> 1353 bytes assets/images/chess/pieces/black-rook.png | Bin 0 -> 1017 bytes assets/images/chess/pieces/white-bishop.png | Bin 0 -> 1165 bytes assets/images/chess/pieces/white-king.png | Bin 0 -> 1561 bytes assets/images/chess/pieces/white-knight.png | Bin 0 -> 1557 bytes assets/images/chess/pieces/white-pawn.png | Bin 0 -> 1023 bytes assets/images/chess/pieces/white-queen.png | Bin 0 -> 1327 bytes assets/images/chess/pieces/white-rook.png | Bin 0 -> 1050 bytes commands/games-mp/chess.js | 214 ++++++++++++++++++++ package.json | 3 +- 16 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 assets/images/chess/board.png create mode 100644 assets/images/chess/pieces/black-bishop.png create mode 100644 assets/images/chess/pieces/black-king.png create mode 100644 assets/images/chess/pieces/black-knight.png create mode 100644 assets/images/chess/pieces/black-pawn.png create mode 100644 assets/images/chess/pieces/black-queen.png create mode 100644 assets/images/chess/pieces/black-rook.png create mode 100644 assets/images/chess/pieces/white-bishop.png create mode 100644 assets/images/chess/pieces/white-king.png create mode 100644 assets/images/chess/pieces/white-knight.png create mode 100644 assets/images/chess/pieces/white-pawn.png create mode 100644 assets/images/chess/pieces/white-queen.png create mode 100644 assets/images/chess/pieces/white-rook.png create mode 100644 commands/games-mp/chess.js diff --git a/README.md b/README.md index 6c4d8851..bf896e3f 100644 --- a/README.md +++ b/README.md @@ -261,7 +261,7 @@ in the appropriate channel's topic to use it. ## Commands -Total: 584 +Total: 585 ### Utility: @@ -613,6 +613,7 @@ Total: 584 * **balloon-pop:** Don't let yourself be the last one to pump the balloon before it pops! * **battle:** Engage in a turn-based battle against another user or the AI. * **bingo:** Play bingo with up to 99 other users. +* **chess:** Play a game of Chess with another user or the AI. * **connect-four:** Play a game of Connect Four with another user or the AI. * **dots-and-boxes:** Play a game of Dots and Boxes with another user. * **emoji-emoji-revolution:** Can you type arrow emoji faster than anyone else has ever typed them before? @@ -1057,6 +1058,8 @@ here. * axis-cult-sign-up ([Image](https://imgur.com/gallery/quQTD)) - [Cheng Xiao](https://www.instagram.com/chengxiao_0715/) * certificate (Signature) +- [Chessboard Image](https://chessboardimage.com/) + * chess (Piece Images) - [Christoph Mueller](https://www.fontsquirrel.com/fonts/list/foundry/christoph-mueller) * captcha ([Moms Typewriter Font](https://www.fontsquirrel.com/fonts/MomsTypewriter)) - [Chuck Norris](https://chucknorris.com/) @@ -1869,6 +1872,7 @@ here. * wikihow ([API](https://www.wikihow.com/api.php)) - [Wikimedia Commons](https://commons.wikimedia.org/wiki/Main_Page) * caution ([Image](https://commons.wikimedia.org/wiki/File:Caution_blank.svg)) + * chess ([Board Image](https://commons.wikimedia.org/wiki/File:Chess_board_blank.svg)) * danger ([Image](https://commons.wikimedia.org/wiki/File:Danger_blank.svg)) - [Wikipedia](https://www.wikipedia.org/) * fact ([API](https://en.wikipedia.org/w/api.php)) diff --git a/assets/images/chess/board.png b/assets/images/chess/board.png new file mode 100644 index 0000000000000000000000000000000000000000..837f20c40dfdaaa6bbbfdbddc30fb2a502bc1164 GIT binary patch literal 28235 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 literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/black-king.png b/assets/images/chess/pieces/black-king.png new file mode 100644 index 0000000000000000000000000000000000000000..ec569dfb285844c8bcb3f685f5050cc0c91374ae GIT binary patch literal 1561 zcmX|A3sll~6lR&7mNQ+aRmajA`5-Y4DL&Eg4fsIB_ZxL8zA+TcH;D?SiF0LcQ_D;N z#c8V+nl<$lEtlFl78+)mJ8Eg#OQx3YI?mZWhacbX`+xV|?_T~0s1&014!s=+1VWok za;3pHcJs4c15Uc~%WDY4mJzC#zZ+aPHZ~*@iA*M|udi=zZU)@g*m(K!<+{4MrlzK@ zt}b9&TU+6jN~HigJ3B!PSI_{{-rnBQ(jpRxfB~!qY6hMH`TrxaSgfu9WLsMsoKOu& z$O7Ea(E%6$L_FMd90Z>p-keZqbXLxvca&j`%fnK2Z_xGnzC{a;S(b3VNp`n2N{QQD~ zf+8X!=yW=e3G#bsv$A?O# z0svzGe0_bPFQjB-WN5v;483{7Tg?Zr-G-5KDP!N~4doZA_t*xV@V?aOv5{Wc4G&C|Y zGB!3gF)=}*P^PA)Xf)c)%nXCUV6j+pb8`y|3#edeX=!C;Wo>P3V`Bs9c6N4nJl@{k z-oe4)`0?We0s)#jJ3E6nH#aw!T5SwGfHyBMFE9XGQf~kThb4d$*fV&5#RdllhlGTv zhk~8Jo?(3T{$agxgyI;y)3Qt&#Sig?hL-kD9o?^Y@7cRgZ~p;(eSL$22aQliOwndX zF<{ox${LS%AUHa^5Q!v`ho`T9aA+9(ZgELzh45bS_U3Rl}hErL|y&3Zm3kwU2i;GK3OK&0GZ^nlYA2&m#`e$Wzb#3kQsT)`rVhe%n>f}$7 z$I|y{W@;#xt*jpZX~@v+z-J)OW@~%x*k+06#EVRI+nnA%Sn$JhBD*IJxioL9^u+gF z5C&`i7^HeLA!98*L&jL5;*5Qs$$mAp3om7)pRS!()}dUlo-i1=V1(x^Z#}<#7wwPX z!7YZP`MEkppKd0EoH7s&_Q{9&0oQmedQKw0hkI*MP)}u|29^DIqn3*^nOa#ot7L*q*r|_Du~)@ zasoRyqx+XIox4jX1(W=?E$U@|x!!1bblH-au-i<~aDMt7{rfeasDkz96HgO3Lx-CP z6ax!cC`Qxc=lt%h_4f5SttShLD+LdK5ZAP%c4z6L!c%!t+&kO%3>N3f_0J^CSXOrK z3gEFJ&F%8UO$Q literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/black-knight.png b/assets/images/chess/pieces/black-knight.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a5748484ef149024d756423b11ec426a01d215 GIT binary patch literal 1518 zcmX|A3pCSv9AApct$S7SNLOg(In2CvM>1^lXl7)VU7Kt2xNFWZkHaim9wQ=hGM64V zvCA+^Ug^?x^zg_X%I$DfbPJVoqEzm^-#Dl5Is5Ii&;R@Qe7^tRBos1nyXGEE1Ol<$ zo8(D_Z`&`QEgRuvO>AvJAk^+r{DQpTr%)*TZ7q~at_~W?WHLC{tD2jefh;R40}|2z z!wH?GQYoB30t29+paA&7!a_Qo4j?{0K0iNSBobY^bSWt*Ng|OzeqLT)W@ct~c6McD zWpQzFPEJl%R+g`?FEEe{k1{ecz%TG(vH0Z4lfXbgIV3|SH0SgADQl6Qo*oqym7JUm z2^MF$baXW2dwO~Ti9{k{E{KPQz<`+Y z@^TXs6W|XVIB@XbK~qyxGcz-Db8`y|3rkB&D=RA$3T16=ZDV6&Yio-}qwVbMFc^%z zy}g5jgOih!v$Hc6i^bt^Fv!)__0XY1Zfp>c)%1;LLd-86^TRw{b0?{ z&+o{QBV;leGzSC(fEdsg6ciL391NyFHn@g`fM2i%O9Ss9H9R~V_5+q-1F$9V1$%?t z!b^eWgDH45@G6Czo5gUOWrsvLe`Q4(9|fA(5YyoF>Q=?xVW^m{9$F~lki>Y68se{ygl86^z>i#EYSjadYd2XHYqyM z=jG#*d6R3AH9mO(&8jdkVDv~XbBD0n`r;iJ3gy4e{MYf;6AN9R=iYvBc{k-I!(S9> z(#&h;A1eZD3igh6-0od9%?~i1JN-zodbG57#EZ`5ZYcXuR8Rf&3~z2?;M%A*Dr3ao zh<>y+Qda-Em9goDy`>t7@a);2`dFRan-WX<&t7?oX?yW9WG0#K?7b%?wBp|_D_#*a zBX6^=(a(dY)iTESS-&y9p7h*-S!&kJzSSPw>qsbJsf)P^8%60vI6r~auF46CJt2@9 ze5X>Sz^R8ByMwmUzLuy&(p*cL(hg(;Pfwarz!1r zs+AcdA3PD=QxAK2i~qJbceHytVd&!`QZ;MEAf(6~X$ua5vCAuI({KBUuX?hPs+moy zDsj}j_l)n1+q<0z;_@#RNGf-*f1$BwB+d+PIJwZb0fXE5M=7#%SL(pV7iYo?_fPNc zRk`gTyDoBK{R~@hPACt*rJ?Rvyy4RF$C&^TQoGV%hsK80Aq`~X)O3@s*6^!Y-)5<+ zbJKzjLOv92+oxy0rFHNdBkUN##kZ+*VwN1W*!kXEMvsx)E%{863O|j#NAb`;DOo&T z+0V+(m0cCgg%;g0tpH}&gRJu+k8><)w#F`x!Gfa1HVuhGEB>rpU1B~^#11YxZ!%MK gMN1tWRO&8NUZ9t&DM`c9({R-h-d<$S20TmjKlgCM8UO$Q literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/black-pawn.png b/assets/images/chess/pieces/black-pawn.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b82f45e5bd359f8aa4e008f6cabca549e4436d GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U|b&H6XFWw&YU@O)v8sC7A*pj zOO`AFlIz#6U%GTDkg;yvIv}|g43;ln4rH%bu>vT&X3ZLi6p#TFgpjLOuLiO=Zrr#M z40?Ne=gphf)YR0|)6?DEy>Q_|pb1@FT~nt{1=`iz+}zpO36yPbZwES{qoZTmv}qG2 zOaQ8!IB_D73uM>S)Bt5`YisN3>RMV_fLeg!)z#G%V33)a31NhVg_W0=1KGvJ#d&#o zg@uLb>FGc=Py}cN5X8pD1_T7e#Kfeeq~zx2=I7@J1qB5L21Z6kMn^{jWg{XYfNY=| zpde6tK|z7PzrUNCo2#p9RaF(xMj$&lI2g#VwY7D2cJ}b_aCdhHT54cmproXvqN1Xz zs;Z`@rlFysrKP2#qob>~6>=-IPp&!0bk|MBye zFF&4yZ*T*qlu4d0jv*3~Zx8-74@s0^``})3I9uSMkmt0Z49CuuZxp>}t45nndo)w> zj7#t_7f<6a?$7UhmTNcue(&eM7wvZPf6C`A)tt&^xj3sJC+EX4RgRTr@eMqC>gO=e zwD#VjW9p=`yFV)4OohvRWv`giqJ$Z@3K&&3{aX1o-SNpaBi+;66^lPUEa~9cTb<%? zC^+uA-Ig7jHvL$%cio-l5F@Rs+Qdl*6;5tgzg>y>-KY7VdzSw!n11`#R;guTac{HE zx^h)6ovM3pdiIlB+WFq8nQ|&2{u6k4I+DNg#?GRs_8=$UlZdS8z_{XyOLS{WP9TsH*JzH5!v09@{CXR q?F^5!bNfn7k`EnA6}LG5kJ0Y^(YjMtS04u^3If>3aLn$P*t{*&kY-uIm6 zoaf|am^bUcUE0ms%^T>Rm40&O)6=YUgWQ|FOGo|TkJ3@I_l5x46mcLB;?Snpm;i-k z-y;xm?tdBf+Rl1+vNB^dcnMXybhO4J4jrxR7JlOUC4I5IJJ<58fel||TMvz!<=Dj4 zb=49`psVI;*kqQMk7rry4aPvH0fu7PEP+t*1MAP#>n;T#0Gf-uhw-ocoizPZ7mdSg;1Z9E zt5w<5t#9X7Xzh>)4Mwig*dqXeAV6aeSFbmV@X=MSG7znAZ|Xj-oKKT%-vdvCqw*_u z7Z>1*+y`dC{QnC()Het=Q{T9-VeDry}71@RWl<2t)I6TMQF(CJBVXyI0)#0K%d10lTJC#b6!~ z1D(nq4EM4-g%j4!x*CYQ(sWVOZBA zH$6b`MeWeyPK#H~wT!2odHm+!s`^C)Z4bMh4KIfvj=D!4>*CtH~q3K%M z?K4wA$h-B~UOs@3_S_VyF$D7f!O$2?k!df;0dQWP^BW-rZJA3usGIUvf)^^jv(@Ax zAQbxZRbvFcRgLMoLcs^HfvOQN5R|uAw`JNzy)hVsP-q7ScXI&*UBjE7Fp=sg) z26s1I2?Ze-^~PoUQEPsp?Uc{yTKNDmLf{Apff#&%_GIiFfslyS{AB^AJtcQ+8#3;9 z=5qn7nGb4*&K9KG-?HS6Y0oQqs-|CH-%|FIerzoO{aEQuvbRD_|0|nzOIe(KOCTDC z*8*txHqib%4lQM`zGyu19}-^A@*kQ#R=9ZTFZ;cgdq31)Uh%SQQO7K^%>%)ZLX2q0 zAVVT#5F>b5K#ap}w`5s-6|>xWjYm34XO2$QS)2Y;KT-Xyo;y6Jes*N0`j47Pm9_A% zbj0&eidnPY$`jF++EH&12+`R8`_XCjYSfPo~2XwEEb%_1Hwk zqxGC1)%3>`>{chnu2bKr>=Bhhh%kr{0WtO>8gY<93MrBxfeaA{hY+C%hp(;u;q+DK zM&E=o96%vTP=stKkckYWp#Xc4hE${?6$;3qKn6ZQ7P3){A{62PO2H;L1u(@FArfmV zIA0{782vHMy+Ks+x~e!CY}Ee-P=b_oSc$U$hG8StXKy}KtZV%X+4|Oa2d5|L00000 LNkvXXu0mjfh1Gxp literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/black-rook.png b/assets/images/chess/pieces/black-rook.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3a260c809548abe39a0cc874c116bb4dea9adf GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U|bd86XFWwu3EKf+qP{$5(t(q zUAl4O#^uYGuV24@#flZ{)~$nxuUWGO!dSFu5l|K=1?0|~H*e0IIjdK%Ub%85kh^Kq zCLjX{AR-VgKyt!_36myGnmBP{S65dH7)+l&y}iAC=FFKD6&2;><&|JiT3T9GRtDrk z1WQUv8XFr63k$8St>fb2tgNiOy}d(1LUMC+3knJ%A|fIqBcr0CqNAgMvOqE+At5m_ z5lE(_qyWX!($Z2>Q-LahCKMGFg@%R#4G#_uE-o$xiYFx{0o5oeDXFNasH&=}tE+2h zXlQ9^X=`ii=;-L_>FMk18yFZE8X6iI85tWJo0yoGnwpxKnVFlLTUc0FT3Q0#19X^; zjg76Xt(~2ny}iAIgM*`^qmz@9v$L~{i;JtPtDBpfhlhu!r>B>f7try(zP^5be*XUc zfq{WRK|w&r0KEfrSXfwCcz8Ink78nCVq;^0egV1@?u#uYbDe;(6;cx97tFxM&dDz* zrJ$^)rmm%}YXEefrIocU&>1dXKEA;rVX3KUg+(P5mGwP+lNT&pv}Mb-?MIHDIC1j) zrAwEuT)ler`i&bmZr;3g>-PQo4<5aH|NirrpO@PzEI_Hk)5S5w<9Kp{1go=L$LW(N zPH1c}Fxa4RLSgfhqlFm;Cr_U_^W{l$Lc&)@Bcs{~Nr@je4Lvr(GEzOtK)kpYDqsoNBs$G`ig#jk<~R)CB==K#LjKo);CRocUs@JZF*@AZtL{; zc;8$**%{%miPw5vLJ;@4LrhJk1#Q}!17kSYI*gN!$qF;Qn;~_F^~2G*VP?C2<>>C2 zcs5O{ZQmX%L#rL_S!117$=Q8fv@gN+q9NzUkDVU_6Z+P3T^stdb0b@ig{cO6naR{8>aB<72v3_6cj<=Uk``yn#aRxCDrt%W zkuR2a#5Q-;XK;iGyjtJnYrDRZ!|%a?X4hsH%{*SwNf9O-;*YNd==AtDZp}Z;_=K5rkZrGE|5xnU-+%%^63`Xljf2s`GI^ zLc~YuQ5KPs2-y|!QPOnNm?3FRL$%E$8JoT8clSQ;^ZefD`MuBc-v9oL5Q4uc^c)ld zftca~d_%$RaI`)&1U61#G6aDbz(Vk0SP%k)hlj)AaA#-dW9#7HfI^|%+}r?zKp~!t#>U3P#1IGsG#Z_nnwpZ50u&wG#VgDBodWM&Cbrw z&CN|pN&*a#NX*E{$jZv1P$(eh_Inf*6jWAL0$Wm2Qd3g{92Sd}nVETbcnAuC|NVOu z6%`d07KVm~R#jConatwi;>O0trlzLS($cA^spjV9j*gCmgoMt{PA-=_I5;>oGz9wT z?(QxxFK=&e2To5&n5P?9DlasT!xCp{yu-RnM@{^%M}X6%F4>x+S>a1x>BiB zsZ?8ATWYm>dwY9lXGf#a?CtGowOYMizrVkKaBu*gs4vC!XYfI=GC~R0AqIxV&{Jlx zk1bB0vAlTclC=#S{>4>0guR248xn~^dw6x(*WW)dF!&2^c$hB`j0uIJak1p_)KT}d^9xH)pZ@my@^i)N>gw8t z^2N&|Yy$kXwe{+iTD|jn_s!dPn!mNWo(R8e2;@W~&euE4^6d6_6b4U*82`z8eEIr~ z_RH2-tksQVD;ykmo*gpyByhk2imNAw-kY8bBRIb%RoC%F`Z4Eb0pgn3f6;RW?9UB% z&EyvzrRl%2lyRbPv~x0*JMQL3GLF!Cm5W&^nXrCvQjUodkCjmQn`B*Pt=U1mulwuhr~1wBV#-_MlloK!TrA=D#3$s>biw z@)!lTq^{#3adp40-nv5HZ3}FpWhK7dDBhlk_+$vKGtbS;*winfwHLkeQh0}ZRmfT& zvgnbAke&WdLxX1-v#x2mO(2Cu_iGiSMq5{}_55MddOsHVBXKke7Wpi&OCGR!W!dJt tpyDP8!B$|Dd#}%}3vu!Tv1uG?-{kplvdqb3xAy3-g2NJg`+VYx{s-e=M9csH literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/white-king.png b/assets/images/chess/pieces/white-king.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1ff667020fbffa100b2866873d9803515956b8 GIT binary patch literal 1561 zcmX|B2{fBo6xQmds(Vpg^bE=vTS+W!QA#Vd)^eDtnHY6yOI3s_6)7>L84YEuL)2QL z_I+Q2+AEZhT565P9+arLjx+Pl$<24~``*3Z_x?W#HZi&@a8%?d4-bz3N>9fWz7=*q zM|dHkhxv+lc=ivP7?|rq3d_R6LQYOjQc_Y}TwF;>NkKtDR#p}O6jfAIq@|^iNaVF^ z*W~5pAq5OukOBsvrlz)6L?955Dk>`OMQ8%dy&^=Y@1+2gm6hQ*09bnjr~pQxP>>oL z8X6fH0RdD&(ZRvN#l^+S%F5Hz6M&bOm#wWW4u^aE__3?2D_{=~4`*lRr%#`{xw$zy zIyyNy`TF`|Fc<=X0A#>eEY{!OAI<^@3=D)mP`9_Y2TUXqfj}mcAp+;^+qcot(XdM* zk$@H+9u9*-LPA1ALo+ioVH~s#3kxeOEKEsBsj8}?P$*O?wX(9ZsHi9>Cnr5UJt`{d z-Me?m$;mJacC)gw;^X5%71V(r5fK4QXdVy{kdTl7BmDgQT3cI7N=hm!DnLweadByB zX<1oWd3m{yj}Pnu8B}FtWPn=0AR{|F8>~T^mX_x3?(XgF4NN>95Bh-s5y+sbqoV_^ z1qL-XHa0aifqm$omzM`J8X6i}T3UK~daA3dCnhF9A<)1V$bjPT@NhvvL2PVnVqzkA z0jH^{sbCG-f*qKio12@TpAQ_k2e9+MV6XsJ0sU)gYHDk1>+9=b5KO1hXyCD}t*yPi zy|c5kySp2v^!E1B>GZz7zW)CHfq{X+!9fOtF*G#9WHLuaMn*?R$HvCS$Hzh5gSzv)S|W^Gi!h%gf6vD=QohXKih5eSLjnV`Fo3b8Bmh%jIrwZ}05vTxfX} z3U77+&eX_^XCE)W!0{6&Pn{JM5*8M@aPiV*Q3)w2>0e}IYBH-wQt|m zyQi;z-`whfwT%th-sy=Sf$)+T6cil%SI8Uk-*J?rj;`+BzW@BdMKVXg2iW*JJu@>iJ3F_#zQF4HTIPDqc4*;)INo99$VkCc}(*j&Farkir8k3^}x5@jX8n*LI~y*kSty7>oEDurgqUCoe@v3l*`N;>De zc~(rX5PMm@Mwg=Du_1h#{!?x9esPOR#_t3!7jK&-7}{1RUmIjm^gh|u)RsWXF8<6k zHd#b;4A8~I5se)>2h6G>*Mlu@A<0yd@eBU|eh#Kf%aa{K*S5@w`Ee|BW;tt4f%Cbd z>-Mh;{0NgieWD-Xf{)Kt^Jb1j$(X+@bJ7H%s;N`@wU>=TU-~RGeCKqfV_?>As;o1L zrObnLH{UhP**Y(jxWH>QO1H;DN^s^6vkXP-=ELuNhRxh22bSiCPdc9xKW*^Y94_B9 z?l`0;k`k_Y>cIJXdLjd2M>74+)CXTQV8jp+kK&RVdE*+eT$ZJ3Zql8i7o%n`Sd>jt zvgFkmndphOAtBF8jC{;`o-=t=B*|VOoI0p&vVWl932imuXZI+~gBn~X@keJhQc|n6 z$W+wYapL)0EhDl&L_X}{@>1)cUmW9dzU150M+QWs^?#s^bJtg{M)9M~x`c3tUy(Ht zF?PLZ-1%o$B(SzUXnq6roE#0j*UmhfDwItr!%t52-B=gBiN}6rrW;GtTOms48D*HQ zH@t^Wh^pgfx@Wi3$&~9}-&*Q;w>({#WyylpFYWwR8P?y9d%Jzu7k6mRr*u11Q$ggP nwfH8!T<=)ReJ6zJ7OFhYamV!EjGi&s{f9^C8tG(fqy7H{U;Z}5 literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/white-knight.png b/assets/images/chess/pieces/white-knight.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0cfeab82c548fb6f61782520875ea601a509fe GIT binary patch literal 1557 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 literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/white-queen.png b/assets/images/chess/pieces/white-queen.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6a25e9ed846ca67034698a43d1a409f80ac9ae GIT binary patch literal 1327 zcmV+~1wMwjid*LyU3C$L3vQ;tH0P6c(w%H8We&8Vh zIYy;YltuFs8vqg;oac|IN@b1_K+pCAwnsp9qD;?S_Qikrn#h%7@en}qkdtgg{rFYi zxVz{{EK|KZk z4g(513Y5pFR^5_}h5kV!Zz5 z02K8rRG}#*3BW{Xib7R1fE8e~Yfe2>uye~OfO2s{4Ga)-)m)P!00VmxkCbC&N6Pn} zG#~{i?0+g501|E~7mv{`4yT&{17Bx3ED{6Ycx!^r8jzqn-i`#|uqYtU0GJ3#AA2Nv zRGYJWaBrj((2UXAKSr970{o*I1_7$^^cWMMT#{<;W@zqx>LCU^&-w@}aQ{qW*=4F$ zxn!J{8hp0PvLva(r+hL1pYmi&r|Kg3?6^JKdqwzQ>W=J)Xp1vuJibaT;u_EImA^e9;FDS5W&Hp& zak}GZd%Pj*X(@wa{@WpbC;RVs!!gsD_9g)O2`{s{l#MnY|3W*&9vOTawn~Ivd zXvD|=`8QAp4abdVx+fdn6cXArjEvH8O+9D7F1B?l85G~XU#Fg9!?o-4%RgF9REvR! zv~ZthZty2{XwjmjiYDs#iwEdw;{oQ9jN^-Z+pg&wlQ_jGQpq5Xd@iHm8fPfs8l{v{ zN&&^>Q^;j5aglT~$mBH1$T!*sSf9Z?CRcDzsUaQtdYb?;b>)<*xDuKAe*;LPVhT^1 ltpGuAa-Q1r@;$|r>|eR=>HmCE{>%UX002ovPDHLkV1f)1b>sj5 literal 0 HcmV?d00001 diff --git a/assets/images/chess/pieces/white-rook.png b/assets/images/chess/pieces/white-rook.png new file mode 100644 index 0000000000000000000000000000000000000000..512c4b335f6870a6d96e02bdb104daecf8b22ade GIT binary patch literal 1050 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U_2e*6XFWwYH4YysHj+4S{fT0 z>+0$n8X6iH7y#L3W@aWPCP1#fzCMs^YHA7;v9`7b$^r%5+}vDUU5$*4fNY>Hph_SB za)HX=?69z~h=_>L(9pEBw9L%Ryu7^N;9wxb&(E)>rl!8WzPh@)uCA`Bsj0EC5y$|N zEiEmDg@xVS-HR75zIpTJjT<)(95`_B;KAPB-mP1=c6D{FTeoi2s#U93uU@)z>B5Bz z7cE)@R0$NBGiMHvJ9FktpcIho?Cb<8Zfk36Z*SkUX%oa`pb4{Q&z?7L-hu@SIyyRl z3TDlk1rz~tfrcz!zI?@s6)RV+1e&&X?OLEk>({T}uwlc-jT?a`Y~H+i%a$!b6Si;P zzH8U6-Me@1-Me?+zJ2@m?>~I_@R1`&jvhUF^5n@=r%s(defrFqGiT49J$LTh`Sa&5 zT)1%Y;>AmsE?vHS`O1|mSFc{Ze*HSoYqxIQx_$fhojZ5#-o1P8-o5+x?>~6(;NioE zj~+dG^5n_Wr%#_fd-nYK^A|5(yn6NO_3PJf-n@DD?%jtEA3lHn{N>A+Z{NQC`0?ZC z&!4}4|Nism&;S4b_pnL#0i!dxB*-tAfsLJ$Ur}!j1-UB`5A_Xg_azYJTc=T&!q&;6d$t#%MXTiO`d#Tc*()w36q0w ziOpww>$PCb%Dr2+&b9Pto;i2x)@IHLflGUxnRmNJs)_}q9qrSe5z@r9p+UiP&cjn{ z?i({Re|cg2xQ~<3+=n-h>Bl3##cZ*)y=?bRq#4g@T2lsr z+^LhNh{~?RYkv+zRl(3y}ESmPS06Ct`=J^QqLFn+apyHeZh3giwD8_ zkC?+u7VclYd-vvQr5TTvd!lV8$Hk{thLu!=#N>EYWjW=z_=H8Kua{HyU_rXpO4mmef@Gx}{SU`Vb?xP0J1BRkKlRbmYL7~`gFo$}Bgm?{`N MUHx3vIVCg!03QnukpKVy literal 0 HcmV?d00001 diff --git a/commands/games-mp/chess.js b/commands/games-mp/chess.js new file mode 100644 index 00000000..b8bc1383 --- /dev/null +++ b/commands/games-mp/chess.js @@ -0,0 +1,214 @@ +const Command = require('../../structures/Command'); +const jsChess = require('js-chess-engine'); +const { createCanvas, loadImage } = require('canvas'); +const { stripIndents } = require('common-tags'); +const path = require('path'); +const { verify, reactIfAble } = require('../../util/Util'); +const { FAILURE_EMOJI_ID } = process.env; +const turnRegex = /^([A-H][1-8]) ?([A-H][1-8])$/; +const pieces = ['pawn', 'rook', 'knight', 'king', 'queen', 'bishop']; +const cols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']; + +module.exports = class ChessCommand extends Command { + constructor(client) { + super(client, { + name: 'chess', + group: 'games-mp', + memberName: 'chess', + description: 'Play a game of Chess with another user or the AI.', + credit: [ + { + name: 'Chessboard Image', + url: 'https://chessboardimage.com/', + reason: 'Piece Images' + }, + { + name: 'Wikimedia Commons', + url: 'https://commons.wikimedia.org/wiki/Main_Page', + reason: 'Board Image', + reasonURL: 'https://commons.wikimedia.org/wiki/File:Chess_board_blank.svg' + } + ], + args: [ + { + key: 'opponent', + prompt: 'What user would you like to challenge?', + type: 'user', + default: () => this.client.user + } + ] + }); + + this.images = null; + } + + async run(msg, { opponent }) { + if (opponent.id === msg.author.id) return msg.reply('You may not play against yourself.'); + const current = this.client.games.get(msg.channel.id); + if (current) return msg.reply(`Please wait until the current game of \`${current.name}\` is finished.`); + this.client.games.set(msg.channel.id, { name: this.name }); + if (!images) await this.loadImages(); + try { + if (!opponent.bot) { + await msg.say(`${opponent}, do you accept this challenge?`); + const verification = await verify(msg.channel, opponent); + if (!verification) { + this.client.games.delete(msg.channel.id); + return msg.say('Looks like they declined...'); + } + } + const game = new jsChess.Game(); + let lastTurnTimeout = false; + while (!game.exportJson().checkMate) { + const user = game.exportJson().turn === 'black' ? opponent : msg.author; + const gameState = game.exportJson(); + if (opponent.bot && !userTurn) { + game.aiMove(3); + } else { + await msg.say(stripIndents` + ${user}, what move do you want to make (ex. A1A2)? Type \`end\` to forfeit. + _You are ${gameState.check ? '**in check!**' : 'not in check.'}_ + `, { files: [{ attachment: this.displayBoard(gameState), name: 'chess.png' }] }); + const pickFilter = res => { + if (res.author.id !== user.id) return false; + const choice = res.content.toUpperCase(); + if (choice === 'END') return true; + const move = choice.match(turnRegex); + if (!move) return false; + const moves = game.moves(); + if (!moves[move[1]].includes(move[2])) { + reactIfAble(res, res.author, FAILURE_EMOJI_ID, '❌'); + return false; + } + return true; + }; + const turn = await msg.channel.awaitMessages(pickFilter, { + max: 1, + time: 60000 + }); + if (!turn.size) { + if (lastTurnTimeout) { + await msg.say('Game ended due to inactivity.'); + break; + } else { + await msg.say('Sorry, time is up! Playing random move.'); + const moves = game.moves(); + const pieces = Object.keys(moves); + const piece = pieces[Math.floor(Math.random() * pieces.length)]; + const move = moves[piece][Math.floor(Math.random() * moves[piece].length)]; + game.move(piece, move); + lastTurnTimeout = true; + continue; + } + } + const choice = turn.first().content.toUpperCase().match(turnRegex); + game.move(choice[1], choice[2]); + } + } + this.client.games.delete(msg.channel.id); + const gameState = game.exportJson(); + if (!gameState.checkMate) return msg.say('Game ended due to inactivity or forfeit.'); + const winner = gameState.turn === 'black' ? msg.author : opponent; + return msg.say(`Checkmate! Congrats, ${winner}!`, { + files: [{ attachment: this.displayBoard(gameState), name: 'chess.png' }] + }); + } catch (err) { + this.client.games.delete(msg.channel.id); + throw err; + } + } + + displayBoard(gameState) { + const canvas = createCanvas(this.images.board.width, this.images.board.height); + const ctx = canvas.getContext('2d'); + ctx.drawImage(this.images.board, 0, 0); + let w = 36; + let h = 40; + let row = 8; + let col = 0; + for (let i = 0; i < 64; i++) { + const piece = gameState.pieces[`${cols[col]}${row}`]; + if (!piece) continue; + const parsed = this.pickImage(piece); + ctx.drawImage(this.images[parsed.color][parsed.name], w, h, 52, 52); + w += 52 + 2; + col += 1; + if (i % 8 === 0 && i !== 0) { + w = 36; + col = 0; + h += 52 + 2; + row -= 1; + } + } + return canvas.toBuffer(); + } + + async loadImages() { + const images = { black: {}, white: {} }; + images.board = await loadImage(path.join(__dirname, '..', '..', 'assets', 'images', 'chess', 'board.png')); + for (const piece of pieces) { + const blk = `black-${piece}.png`; + images.black[piece] = await loadImage(path.join(__dirname, '..', '..', 'assets', 'images', 'chess', blk)); + const whi = `white-${piece}.png`; + images.white[piece] = await loadImage(path.join(__dirname, '..', '..', 'assets', 'images', 'chess', whi)); + } + this.images = images; + return images; + } + + pickImage(piece) { + let name; + let color; + switch (piece) { + case 'p': + name = 'pawn'; + color = 'black'; + break; + case 'n': + name = 'knight'; + color = 'black'; + break; + case 'b': + name = 'bishop'; + color = 'black'; + break; + case 'r': + name = 'rook'; + color = 'black'; + break; + case 'q': + name = 'queen'; + color = 'black'; + break; + case 'k': + name = 'king'; + color = 'black'; + break; + case 'P': + name = 'pawn'; + color = 'white'; + break; + case 'N': + name = 'knight'; + color = 'white'; + break; + case 'B': + name = 'bishop'; + color = 'white'; + break; + case 'R': + name = 'rook'; + color = 'white'; + break; + case 'Q': + name = 'queen'; + color = 'white'; + break; + case 'K': + name = 'king'; + color = 'white'; + break; + } + return { name, color }; + } +}; diff --git a/package.json b/package.json index 0db7e813..b5388b3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xiao", - "version": "126.11.3", + "version": "126.12.0", "description": "Your personal server companion.", "main": "Xiao.js", "scripts": { @@ -54,6 +54,7 @@ "html-entities": "^2.0.2", "ioredis": "^4.19.4", "js-beautify": "^1.13.4", + "js-chess-engine": "^0.6.0", "mathjs": "^9.0.0", "moment": "^2.29.1", "moment-duration-format": "^2.3.2",