crazyhouse.js
Version:
A Javascript library for crazyhouse with 960 support, based on the chess.js library.
8 lines (7 loc) • 23.5 kB
JavaScript
/* @license
* Copyright (c) 2017, Joe Ksiazek (jak3122@rit.edu)
* Copyright (c) 2017, Jeff Hlywa (jhlywa@gmail.com)
* Released under the BSD license
* https://github.com/jak3122/crazyhouse.js/blob/master/LICENSE
*/
var Chess=function(r){function e(){kr=new Array(128),Kr={w:ur,b:ur},Qr=ar,Or={w:0,b:0},Rr={w:null,b:null},Pr={w:[{square:ur,flag:0},{square:ur,flag:0}],b:[{square:ur,flag:0},{square:ur,flag:0}]},Nr=ur,Ur=0,xr=1,Mr=[],Br={},jr={w:[],b:[]},$r=[],c(s())}function n(){t(hr)}function t(r){var n=r.split(/\s+/),t=n[0],f=0,i=0,a=!1,p=l(r);if(!p.valid)return!1;e();for(var v=0;v<t.length;v++){var g=t.charAt(v);if(a){var d="a">g?ar:ir;h({type:g.toLowerCase(),color:d})}else if("/"===g){if(i++,8===i){a=!0;continue}f+=8}else if(Y(g))f+=parseInt(g,10);else if("~"===g)$r.push(f-1);else{var d="a">g?ar:ir;E({type:g.toLowerCase(),color:d},V(f)),f++}}for(var v=Dr.a8;v<=Dr.h8;v++)kr[v]&&kr[v].type==cr&&(Pr.b[0].square==ur?Pr.b[0].square=v:Pr.b[1].square=v);for(var v=Dr.a1;v<=Dr.h1;v++)kr[v]&&kr[v].type==cr&&(Pr.w[0].square==ur?Pr.w[0].square=v:Pr.w[1].square=v);jr[ar].reverse(),jr[ir].reverse(),Qr=n[1];var S=n[2].match(/([ABCDEFGH])/);S&&(Rr.w=F(S[1]),J(kr[Kr.w])>Rr.w?(Or.w|=mr.QSIDE_CASTLE,o(j(1,S[1]),mr.QSIDE_CASTLE,ar)):(Or.w|=mr.KSIDE_CASTLE,o(j(1,S[1]),mr.KSIDE_CASTLE,ar)));var _=n[2].match(/([abcdefgh])/);return _&&(Rr.b=F(_[1]),J(kr[Kr.b])>Rr.b?(Or.b|=mr.QSIDE_CASTLE,o(j(8,_[1]),mr.QSIDE_CASTLE,ir)):(Or.b|=mr.KSIDE_CASTLE,o(j(8,_[1]),mr.KSIDE_CASTLE,ir))),n[2].indexOf("K")>-1&&(Or.w|=mr.KSIDE_CASTLE,u(mr.KSIDE_CASTLE,ar)),n[2].indexOf("Q")>-1&&(Or.w|=mr.QSIDE_CASTLE,u(mr.QSIDE_CASTLE,ar)),n[2].indexOf("k")>-1&&(Or.b|=mr.KSIDE_CASTLE,u(mr.KSIDE_CASTLE,ir)),n[2].indexOf("q")>-1&&(Or.b|=mr.QSIDE_CASTLE,u(mr.QSIDE_CASTLE,ir)),Nr="-"===n[3]?ur:Dr[n[3]],Ur=parseInt(n[4],10),xr=parseInt(n[5],10),c(s()),!0}function o(r,e,n){for(var t=0;t<Pr[n].length;t++){var o=Pr[n][t];o.square==r&&(Pr[n][t].flag=e)}}function f(r,e,n){for(var t=0;t<Pr[n].length;t++)Pr[n][t].square==r&&(Pr[n][t].square=e)}function i(r){var e="";return e+="[W rooks: ",e+=V(r.w[0].square)+"("+a(r.w[0].flag)+")",e+=", ",e+=V(r.w[1].square)+"("+a(r.w[1].flag)+")",e+="][B rooks: ",e+=V(r.b[0].square)+"("+a(r.b[0].flag)+")",e+=", ",e+=V(r.b[1].square)+"("+a(r.b[1].flag)+")",e+="]"}function a(r){return r&mr.KSIDE_CASTLE?"k":r&mr.QSIDE_CASTLE?"q":""}function u(r,e){if(e===ar){if(r&mr.KSIDE_CASTLE){for(var n=Dr.h1;n>=Dr.b1;n--)if(kr[n]&&kr[n].type==cr){o(n,mr.KSIDE_CASTLE,e);break}}else if(r&mr.QSIDE_CASTLE)for(var n=Dr.a1;n<=Dr.g1;n++)if(kr[n]&&kr[n].type==cr){o(n,mr.QSIDE_CASTLE,e);break}}else if(e===ir)if(r&mr.KSIDE_CASTLE){for(var n=Dr.h8;n>=Dr.b8;n--)if(kr[n]&&kr[n].type==cr){o(n,mr.KSIDE_CASTLE,e);break}}else if(r&mr.QSIDE_CASTLE)for(var n=Dr.a8;n<=Dr.g8;n++)if(kr[n]&&kr[n].type==cr){o(n,mr.QSIDE_CASTLE,e);break}}function l(r){var e={0:"No errors.",1:"FEN string must contain six space-delimited fields.",2:"6th field (move number) must be a positive integer.",3:"5th field (half move counter) must be a non-negative integer.",4:"4th field (en-passant square) is invalid.",5:"3rd field (castling availability) is invalid.",6:"2nd field (side to move) is invalid.",7:"1st field (piece positions) does not contain 9 '/'-delimited rows.",8:"1st field (piece positions) is invalid [consecutive numbers].",9:"1st field (piece positions) is invalid [invalid piece].",10:"1st field (piece positions) is invalid [row too large].",11:"Illegal en-passant square",12:"Fake piece indicator (~) does not follow a piece value."},n=r.split(/\s+/);if(6!==n.length)return{valid:!1,error_number:1,error:e[1]};if(isNaN(n[5])||parseInt(n[5],10)<=0)return{valid:!1,error_number:2,error:e[2]};if(isNaN(n[4])||parseInt(n[4],10)<0)return{valid:!1,error_number:3,error:e[3]};if(!/^(-|[abcdefgh][36])$/.test(n[3]))return{valid:!1,error_number:4,error:e[4]};if(!/^(((KQ?)|(Q)|[A-H])?((kq?)|(q)|[a-h])?)|-$/.test(n[2]))return{valid:!1,error_number:5,error:e[5]};if(!/^(w|b)$/.test(n[1]))return{valid:!1,error_number:6,error:e[6]};var t=n[0].split("/");if(9!==t.length)return{valid:!1,error_number:7,error:e[7]};for(var o=0;8>o;o++){for(var f=0,i=!1,a=!1,u=0;u<t[o].length;u++)if(isNaN(t[o][u]))if("~"===t[o][u]){if(!a)return{valid:!1,error_number:12,error:e[12]}}else{if(!/^[prnbqkPRNBQK]$/.test(t[o][u]))return{valid:!1,error_number:9,error:e[9]};f+=1,i=!1,a=!0}else{if(i)return{valid:!1,error_number:8,error:e[8]};f+=parseInt(t[o][u],10),i=!0,a=!1}if(8!==f)return{valid:!1,error_number:10,error:e[10]}}return"3"===n[3][1]&&"w"===n[1]||"6"===n[3][1]&&"b"===n[1]?{valid:!1,error_number:11,error:e[11]}:{valid:!0,error_number:0,error:e[0]}}function s(){for(var r=0,e="",n=Dr.a8;n<=Dr.h1;n++){if(null==kr[n])r++;else{r>0&&(e+=r,r=0);var t=kr[n].color,o=kr[n].type;e+=t===ar?o.toUpperCase():o.toLowerCase(),$r.includes(n)&&kr[n].type!==lr&&(e+="~")}n+1&136&&(r>0&&(e+=r),n!==Dr.h1&&(e+="/"),r=0,n+=8)}e+="/";var f=jr[ar],i=jr[ir];for(n=f.length-1;n>=0;n--)e+=f[n].type.toUpperCase();for(n=i.length-1;n>=0;n--)e+=i[n].type.toLowerCase();var a="";Rr[ar]?a+=$(Rr[ar]).toUpperCase():(Or[ar]&mr.KSIDE_CASTLE&&(a+="K"),Or[ar]&mr.QSIDE_CASTLE&&(a+="Q")),Rr[ir]?a+=$(Rr[ir]):(Or[ir]&mr.KSIDE_CASTLE&&(a+="k"),Or[ir]&mr.QSIDE_CASTLE&&(a+="q")),a=a||"-";var u=Nr===ur?"-":V(Nr);return[e,Qr,a,u,Ur,xr].join(" ")}function p(r){for(var e=0;e<r.length;e+=2)"string"==typeof r[e]&&"string"==typeof r[e+1]&&(Br[r[e]]=r[e+1]);return Br}function c(r){Mr.length>0||(r!==hr?(Br.SetUp="1",Br.FEN=r):(delete Br.SetUp,delete Br.FEN))}function v(r){var e=kr[Dr[r]];return e?{type:e.type,color:e.color}:null}function E(r,e){if(!("type"in r&&"color"in r))return!1;if(-1===gr.indexOf(r.type.toLowerCase()))return!1;if(!(e in Dr))return!1;var n=Dr[e];return r.type===Er&&Kr[r.color]!==ur&&Kr[r.color]!=n?!1:(kr[n]={type:r.type,color:r.color},r.type===Er&&(Kr[r.color]=n),c(s()),!0)}function g(r){var e=v(r);return kr[Dr[r]]=null,e&&e.type===Er&&(Kr[e.color]=ur),c(s()),e}function h(r){return"type"in r&&"color"in r?-1===gr.indexOf(r.type.toLowerCase())?!1:r.type==Er?!1:(jr[r.color].push(r),c(s()),!0):!1}function d(r){for(var e=jr[r.color],n=e.length-1;n>=0;n--)if(e[n].type===r.type&&e[n].color===r.color){jr[r.color].splice(n,1);break}return c(s()),r}function S(r,e,n,t,o){var f={color:Qr,from:e,to:n,flags:t,piece:r[e].type};return o&&(f.flags|=mr.PROMOTION,f.promotion=o),r[n]?f.captured=r[n].type:t&mr.EP_CAPTURE&&(f.captured=lr),f}function _(r,e){var n={color:Qr,to:r,from:qr,piece:e};return n}function b(r){function e(r,e,n,t,o){if(r[n].type!==lr||Z(t)!==wr&&Z(t)!==Ir)e.push(S(r,n,t,o));else for(var f=[vr,cr,pr,sr],i=0,a=f.length;a>i;i++)e.push(S(r,n,t,o,f[i]))}function n(r,e,n){r.push(_(e,n))}var t=[],o=Qr,f=X(o),i={b:Lr,w:Tr},a=Dr.a8,u=Dr.h1,l=!1,s="undefined"!=typeof r&&"legal"in r?r.legal:!0;if("undefined"!=typeof r&&"square"in r){if(!(r.square in Dr))return[];a=u=Dr[r.square],l=!0}for(var p=a;u>=p;p++)if(136&p)p+=7;else{var c=kr[p];if(null!=c&&c.color===o)if(c.type===lr){var v=p+Sr[o][0];if(null==kr[v]){e(kr,t,p,v,mr.NORMAL);var v=p+Sr[o][1];i[o]===Z(p)&&null==kr[v]&&e(kr,t,p,v,mr.BIG_PAWN)}for(E=2;4>E;E++){var v=p+Sr[o][E];136&v||(null!=kr[v]&&kr[v].color===f?e(kr,t,p,v,mr.CAPTURE):v===Nr&&e(kr,t,p,Nr,mr.EP_CAPTURE))}}else for(var E=0,g=_r[c.type].length;g>E;E++)for(var h=_r[c.type][E],v=p;;){if(v+=h,136&v)break;if(null!=kr[v]){if(kr[v].color===o)break;e(kr,t,p,v,mr.CAPTURE);break}if(e(kr,t,p,v,mr.NORMAL),"n"===c.type||"k"===c.type)break}}if(!l){var d=jr[o],b=[];d.forEach(function(r){b.includes(r.type)||b.push(r.type)}),b.forEach(function(r){for(var e=a;u>=e;e++)if(136&e)e+=7;else{var o=Z(e)===Ir||Z(e)===wr;r==lr&&o||null==kr[e]&&n(t,e,r)}})}if(!l||u===Kr[o]){if(Or[o]&mr.KSIDE_CASTLE){var C,A=Kr[o];C=y(mr.KSIDE_CASTLE,o);var I=m(A,C,mr.KSIDE_CASTLE,o);I&&e(kr,t,Kr[o],C,mr.KSIDE_CASTLE)}if(Or[o]&mr.QSIDE_CASTLE){var C,A=Kr[o];C=y(mr.QSIDE_CASTLE,o);var I=m(A,C,mr.QSIDE_CASTLE,o);I&&e(kr,t,Kr[o],C,mr.QSIDE_CASTLE)}}if(!s)return t;for(var T=[],p=0,g=t.length;g>p;p++)N(t[p]),w(o)||T.push(t[p]),x();return T}function y(r,e){if(Rr[e]){var n=e===ar?"1":"8",t=Rr[e];return j(n,t)}for(var o=0;o<Pr[e].length;o++)if(Pr[e][o].flag&r)return Pr[e][o].square}function C(r,e,n){for(var t=!1,o=0;o<Pr[n].length;o++)if(Pr[n][o].square==r&&Pr[n][o].flag&e){t=!0;break}return t}function A(r,e){for(var n=0;n<Pr[e].length;n++)if(Pr[e][n].square==r)return Pr[e][n].flag}function m(r,e,n,t){var o=t,f=X(o);if(L(f,Kr[o]))return!1;if(!kr[e]||kr[e].type!=cr)return!1;if(!C(e,n,t))return!1;var i,a;if(n&mr.KSIDE_CASTLE){i=o===ar?Dr.f1:Dr.f8,a=o===ar?Dr.g1:Dr.g8;for(var u=Math.min(i,r),l=u;a>=l;l++)if(null!=kr[l]&&kr[l].type!==Er&&l!==e)return!1;for(var l=r;a>=l;l++)if(L(f,l))return!1}else if(n&mr.QSIDE_CASTLE)if(i=o===ar?Dr.d1:Dr.d8,a=o===ar?Dr.c1:Dr.c8,a>=r){for(var l=e;i>=l;l++)if(null!=kr[l]&&kr[l].type!==Er&&l!==e)return!1;for(var l=r;a>=l;l++)if(L(f,l))return!1}else{for(var u=Math.min(a,e),l=u;r>=l;l++)if(null!=kr[l]&&kr[l].type!==Er&&l!==e)return!1;for(var l=a;r>=l;l++)if(L(f,l))return!1}return!0}function I(r,e){var n="";if(r.from===qr)r.piece!==lr&&(n+=r.piece.toUpperCase()),n+="@",n+=V(r.to);else if(r.flags&mr.KSIDE_CASTLE)n="O-O";else if(r.flags&mr.QSIDE_CASTLE)n="O-O-O";else{var t=M(r,e);r.piece!==lr&&(n+=r.piece.toUpperCase()+t),r.flags&(mr.CAPTURE|mr.EP_CAPTURE)&&(r.piece===lr&&(n+=V(r.from)[0]),n+="x"),n+=V(r.to),r.flags&mr.PROMOTION&&(n+="="+r.promotion.toUpperCase())}return N(r),D()&&(n+=q()?"#":"+"),x(),n}function T(r){return r.replace(/=/,"").replace(/[+#]?[?!]*$/,"").replace(/P@/,"@")}function L(r,e){for(var n=Dr.a8;n<=Dr.h1;n++)if(136&n)n+=7;else if(null!=kr[n]&&kr[n].color===r){var t=kr[n],o=n-e,f=o+119;if(br[f]&1<<Cr[t.type]){if(t.type===lr){if(o>0){if(t.color===ar)return!0}else if(t.color===ir)return!0;continue}if("n"===t.type||"k"===t.type)return!0;for(var i=yr[f],a=n+i,u=!1;a!==e;){if(null!=kr[a]){u=!0;break}a+=i}if(!u)return!0}}return!1}function w(r){return L(X(r),Kr[r])}function D(){return w(Qr)}function q(){return D()&&0===b().length}function P(){return!D()&&0===b().length}function k(){return!1}function K(){for(var r=[],e={},n=!1;;){var t=x();if(!t)break;r.push(t)}for(;;){var o=s().split(" ").slice(0,4).join(" ");if(e[o]=o in e?e[o]+1:1,e[o]>=3&&(n=!0),!r.length)break;N(r.pop())}return n}function Q(r){var e={w:[],b:[]};return r.w.forEach(function(r){var n={color:r.color,type:r.type};e.w.push(n)}),r.b.forEach(function(r){var n={color:r.color,type:r.type};e.b.push(n)}),e}function O(r){var e={w:[{square:r.w[0].square,flag:r.w[0].flag},{square:r.w[1].square,flag:r.w[1].flag}],b:[{square:r.b[0].square,flag:r.b[0].flag},{square:r.b[1].square,flag:r.b[1].flag}]};return e}function R(r){var e=Q(jr);Mr.push({move:r,kings:{b:Kr.b,w:Kr.w},rooks:O(Pr),turn:Qr,castling:{b:Or.b,w:Or.w},ep_square:Nr,half_moves:Ur,move_number:xr,zh_hand:e,fake_piece_squares:$r.slice()})}function N(r){var e=Qr,n=X(e);if(R(r),r.from===qr){var t={color:r.color,type:r.piece.toLowerCase()};kr[r.to]=t,d(t),Nr=ur}else{var i;if(kr[r.to]&&kr[r.to].color==n&&($r.includes(r.to)?(i=lr,$r.splice($r.indexOf(r.to),1)):i=null==kr[r.to]?null:kr[r.to].type,null!=i&&h({color:e,type:i})),$r.includes(r.from)&&($r.splice($r.indexOf(r.from),1),$r.push(r.to)),kr[r.from].type===Er){if(Kr[kr[r.from].color]=r.to,r.flags&(mr.KSIDE_CASTLE|mr.QSIDE_CASTLE)){var a,u,l,s;r.flags&mr.KSIDE_CASTLE?(a=e===ar?Dr.g1:Dr.g8,u=e===ar?Dr.f1:Dr.f8,s=mr.KSIDE_CASTLE,l=y(mr.KSIDE_CASTLE,e)):r.flags&mr.QSIDE_CASTLE&&(a=e===ar?Dr.c1:Dr.c8,u=e===ar?Dr.d1:Dr.d8,s=mr.QSIDE_CASTLE,l=y(mr.QSIDE_CASTLE,e)),o(l,0,e),Rr[e]==J(l)&&(Rr[e]=null),kr[u]={type:cr,color:e},u!==l&&(kr[l]=null),kr[a]={type:Er,color:e},r.from!==a&&kr[r.from]&&kr[r.from].type==Er&&(kr[r.from]=null),Kr[e]=a}Rr[e]=null,Or[e]=0,o(r.to,0,e)}if(r.flags&(mr.KSIDE_CASTLE|mr.QSIDE_CASTLE)||(kr[r.to]=kr[r.from],kr[r.from]=null),r.flags&mr.EP_CAPTURE&&(Qr===ir?kr[r.to-16]=null:kr[r.to+16]=null),r.flags&mr.PROMOTION&&(kr[r.to]={type:r.promotion,color:e},$r.push(r.to)),r.piece==cr&&(Or[e]&&(Or[e]^=A(r.from,e)),o(r.from,0,e),f(r.from,r.to,e)),Or[n]&&(Or[n]&&(Or[n]^=A(r.to,n)),o(r.to,0,n),f(r.to,ur,n)),r.flags&mr.BIG_PAWN){var p=kr[r.to-1],c=kr[r.to+1],v=p&&p.color==n&&p.type==lr,E=c&&c.color==n&&c.type==lr;if(Nr="b"===Qr?r.to-16:r.to+16,v){var g=U(r.to-1,Nr);g||(E?(g=U(r.to+1,Nr),g||(Nr=ur)):Nr=ur)}else E?(g=U(r.to+1,Nr),g||(Nr=ur)):Nr=ur}else Nr=ur}if(r.piece==cr){var S=e==ar?Ir:wr;if(Z(r.to)==S&&Or[e])for(var _=0,b=Pr[e].length;b>_;_++)mr.KSIDE_CASTLE&Pr[e][_].flag?J(r.to)>J(Pr[e][_].square)&&(Rr[e]=J(Pr[e][_].square)):mr.QSIDE_CASTLE&Pr[e][_].flag&&J(r.to)<J(Pr[e][_].square)&&(Rr[e]=J(Pr[e][_].square))}Ur++,Qr===ir&&xr++,Qr=X(Qr)}function U(r,e){var n=!1,t=Qr;return Qr=X(Qr),N(S(kr,r,e,Ar.EP_CAPTURE)),w(t)||(n=!0),x(),Qr=X(Qr),n}function x(){var r=Mr.pop();if(null==r)return null;var e=r.move;Kr=r.kings,Pr=O(r.rooks),Qr=r.turn,Or=r.castling,Nr=r.ep_square,Ur=r.half_moves,xr=r.move_number,jr=Q(r.zh_hand),$r=r.fake_piece_squares.slice();var n=Qr,t=X(Qr);if(e.from==qr)kr[e.to]=null;else{var o=e.to,f=e.from;if(e.flags&(mr.KSIDE_CASTLE|mr.QSIDE_CASTLE)){f=Kr[n];var i,a;if(e.flags&mr.KSIDE_CASTLE){for(var u=0;u<Pr[n].length;u++)if(Pr[n][u].flag&mr.KSIDE_CASTLE){i=Pr[n][u].square;break}o=n===ar?Dr.g1:Dr.g8,a=n===ar?Dr.f1:Dr.f8}else if(e.flags&mr.QSIDE_CASTLE){for(var u=0;u<Pr[n].length;u++)if(Pr[n][u].flag&mr.QSIDE_CASTLE){i=Pr[n][u].square;break}o=n===ar?Dr.c1:Dr.c8,a=n===ar?Dr.d1:Dr.d8}kr[a]=null,kr[i]={type:cr,color:n},o!==f&&(kr[f]={type:Er,color:n},kr[o]&&kr[o].type==cr||(kr[o]=null))}else kr[f]=kr[o],null!=kr[f]&&(kr[f].type=e.piece),kr[o]=null;if(e.flags&mr.CAPTURE)kr[e.to]={type:e.captured,color:t};else if(e.flags&mr.EP_CAPTURE){var l;l=n===ir?e.to-16:e.to+16,kr[l]={type:lr,color:t}}}return e}function M(r,e){var n=b({legal:!e}),t=r.from,o=r.to,f=r.piece;if(t==qr)return"";n=n.filter(function(r){return r.from!==qr});for(var i=0,a=0,u=0,l=0,s=n.length;s>l;l++){var p=n[l].from,c=n[l].to,v=n[l].piece;f===v&&t!==p&&o===c&&(i++,Z(t)===Z(p)&&a++,J(t)===J(p)&&u++)}return i>0?a>0&&u>0?V(t):V(t).charAt(u>0?1:0):""}function B(){for(var r=" +------------------------+\n",e=Dr.a8;e<=Dr.h1;e++){if(0===J(e)&&(r+=" "+"87654321"[Z(e)]+" |"),null==kr[e])r+=" . ";else{var n=kr[e].type,t=kr[e].color,o=t===ar?n.toUpperCase():n.toLowerCase();r+=" "+o+" "}e+1&136&&(r+="|\n",e+=8)}for(r+=" +------------------------+\n",r+=" a b c d e f g h\n",r+="W hand: ",e=0;e<jr[ar].length;e++)r+=jr[ar][e].type.toUpperCase();for(r+=" | B hand: ",e=0;e<jr[ir].length;e++)r+=jr[ir][e].type.toLowerCase();return r+="\n",$r.length>0&&(r+="fake pieces: ",r+=$r.map(function(r){return V(r)}).join(", "),r+="\n"),r+=i(Pr)+"\n",r+="kings: [w:"+V(Kr.w)+"][b:"+V(Kr.b)+"]\n"}function j(r,e){Number.isInteger(e)&&(e=$(e));var n=""+e+r;return n=n.toLowerCase(),Dr[n]}function $(r){return"abcdefgh".substring(r,r+1)}function F(r){return"abcdefgh".indexOf(r.toLowerCase())}function G(r,e){var n=T(r);if(e){var t=n.match(/([pnbrqkPNBRQK])?([a-h][1-8])?x?-?@?([a-h][1-8])([qrbnQRBN])?/);if(t)var o=t[1],f=t[2],i=t[3],a=t[4]}for(var u=b(),l=0,s=u.length;s>l;l++){if(n===T(I(u[l]))||e&&n===T(I(u[l],!0)))return u[l];if(!(!t||o&&o.toLowerCase()!=u[l].piece||Dr[f]!=u[l].from||Dr[i]!=u[l].to||a&&a.toLowerCase()!=u[l].promotion))return u[l]}return null}function W(r){var e,n;return"undefined"!=typeof r?0>r||r>959?(e=hr,n=518):(n=r,e=z(n)):(n=H(),e=z(n)),or=n,t(e),{fen:e,position_number:n}}function H(){return Math.floor(960*Math.random())}function z(r){var e=[["n","n",0,0,0],["n",0,"n",0,0],["n",0,0,"n",0],["n",0,0,0,"n"],[0,"n","n",0,0],[0,"n",0,"n",0],[0,"n",0,0,"n"],[0,0,"n","n",0],[0,0,"n",0,"n"],[0,0,0,"n","n"]],n=[0,0,0,0,0,0,0,0],t=Math.floor(r/4),o=r%4;n[2*o+1]="b";var f=Math.floor(t/4),i=t%4;n[2*i]="b";for(var a=Math.floor(f/6),u=f%6,l=n.indexOf(0),s=0;u>s;s++)l=n.indexOf(0,l+1);n[l]="q";for(var p=e[a],c=0,s=0;s<n.length;s++)0==n[s]&&(n[s]=p[c++]);n[n.indexOf(0)]="r",n[n.indexOf(0)]="k",n[n.indexOf(0)]="r";var v="",E=n.join(""),g=E.toUpperCase();return v+=E+"/",v+="pppppppp/",v+="8/8/8/8/",v+="PPPPPPPP/",v+=g+"/",v+=" w KQkq - 0 1"}function Z(r){return r>>4}function J(r){return 15&r}function V(r){if(r==qr)return"@";var e=J(r),n=Z(r);return"abcdefgh".substring(e,e+1)+"87654321".substring(n,n+1)}function X(r){return r===ar?ir:ar}function Y(r){return-1!=="0123456789".indexOf(r)}function rr(r){var e=er(r);e.san=I(e,!1),e.to=V(e.to),e.from=V(e.from);var n="";for(var t in mr)mr[t]&e.flags&&(n+=Ar[t]);return e.flags=n,e}function er(r){var e=r instanceof Array?[]:{};for(var n in r)"object"==typeof n?e[n]=er(r[n]):e[n]=r[n];return e}function nr(r){return r.replace(/^\s+|\s+$/g,"")}function tr(r){for(var e=b({legal:!1}),n=0,t=Qr,o=0,f=e.length;f>o;o++){if(N(e[o]),!w(t))if(r-1>0){var i=tr(r-1);n+=i}else n++;x()}return n}var or,fr,ir="b",ar="w",ur=-1,lr="p",sr="n",pr="b",cr="r",vr="q",Er="k",gr="pnbrqkPNBRQK",hr="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR/ w KQkq - 0 1",dr=["1-0","0-1","1/2-1/2","*"],Sr={b:[16,32,17,15],w:[-16,-32,-17,-15]},_r={n:[-18,-33,-31,-14,18,33,31,14],b:[-17,-15,17,15],r:[-16,1,16,-1],q:[-17,-16,-15,1,17,16,15,-1],k:[-17,-16,-15,1,17,16,15,-1]},br=[20,0,0,0,0,0,0,24,0,0,0,0,0,0,20,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,24,24,24,24,24,24,56,0,56,24,24,24,24,24,24,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,20,0,0,0,0,0,0,24,0,0,0,0,0,0,20],yr=[17,0,0,0,0,0,0,16,0,0,0,0,0,0,15,0,0,17,0,0,0,0,0,16,0,0,0,0,0,15,0,0,0,0,17,0,0,0,0,16,0,0,0,0,15,0,0,0,0,0,0,17,0,0,0,16,0,0,0,15,0,0,0,0,0,0,0,0,17,0,0,16,0,0,15,0,0,0,0,0,0,0,0,0,0,17,0,16,0,15,0,0,0,0,0,0,0,0,0,0,0,0,17,16,15,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,-15,-16,-17,0,0,0,0,0,0,0,0,0,0,0,0,-15,0,-16,0,-17,0,0,0,0,0,0,0,0,0,0,-15,0,0,-16,0,0,-17,0,0,0,0,0,0,0,0,-15,0,0,0,-16,0,0,0,-17,0,0,0,0,0,0,-15,0,0,0,0,-16,0,0,0,0,-17,0,0,0,0,-15,0,0,0,0,0,-16,0,0,0,0,0,-17,0,0,-15,0,0,0,0,0,0,-16,0,0,0,0,0,0,-17],Cr={p:0,n:1,b:2,r:3,q:4,k:5},Ar={NORMAL:"n",CAPTURE:"c",BIG_PAWN:"b",EP_CAPTURE:"e",PROMOTION:"p",KSIDE_CASTLE:"k",QSIDE_CASTLE:"q"},mr={NORMAL:1,CAPTURE:2,BIG_PAWN:4,EP_CAPTURE:8,PROMOTION:16,KSIDE_CASTLE:32,QSIDE_CASTLE:64},Ir=7,Tr=6,Lr=1,wr=0,Dr={a8:0,b8:1,c8:2,d8:3,e8:4,f8:5,g8:6,h8:7,a7:16,b7:17,c7:18,d7:19,e7:20,f7:21,g7:22,h7:23,a6:32,b6:33,c6:34,d6:35,e6:36,f6:37,g6:38,h6:39,a5:48,b5:49,c5:50,d5:51,e5:52,f5:53,g5:54,h5:55,a4:64,b4:65,c4:66,d4:67,e4:68,f4:69,g4:70,h4:71,a3:80,b3:81,c3:82,d3:83,e3:84,f3:85,g3:86,h3:87,a2:96,b2:97,c2:98,d2:99,e2:100,f2:101,g2:102,h2:103,a1:112,b1:113,c1:114,d1:115,e1:116,f1:117,g1:118,h1:119},qr=200,Pr={w:[{square:ur,flag:0},{square:ur,flag:0}],b:[{square:ur,flag:0},{square:ur,flag:0}]},kr=new Array(128),Kr={w:ur,b:ur},Qr=ar,Or={w:0,b:0},Rr={w:null,b:null},Nr=ur,Ur=0,xr=1,Mr=[],Br={},jr={w:[],b:[]},$r=[];return"undefined"!=typeof r?("undefined"!=typeof r[960]&&(fr=r[960]),"undefined"!=typeof r.position_number&&(or=r.position_number)):fr=!1,fr?W(or):t(hr),{WHITE:ar,BLACK:ir,PAWN:lr,KNIGHT:sr,BISHOP:pr,ROOK:cr,QUEEN:vr,KING:Er,SQUARES:function(){for(var r=[],e=Dr.a8;e<=Dr.h1;e++)136&e?e+=7:r.push(V(e));return r}(),FLAGS:Ar,load:function(r){return t(r)},reset:function(){return n()},moves:function(r){for(var e=b(r),n=[],t=0,o=e.length;o>t;t++)n.push("undefined"!=typeof r&&"verbose"in r&&r.verbose?rr(e[t]):I(e[t],!1));return n},in_check:function(){return D()},in_checkmate:function(){return q()},in_stalemate:function(){return P()},in_draw:function(){return P()||k()||K()},insufficient_material:function(){return k()},in_threefold_repetition:function(){return K()},game_over:function(){return q()||P()||k()||K()},validate_fen:function(r){return l(r)},fen:function(){return s()},board:function(){for(var r=[],e=[],n=Dr.a8;n<=Dr.h1;n++)e.push(null==kr[n]?null:{type:kr[n].type,color:kr[n].color}),n+1&136&&(r.push(e),e=[],n+=8);return r},pgn:function(r){var e="object"==typeof r&&"string"==typeof r.newline_char?r.newline_char:"\n",n="object"==typeof r&&"number"==typeof r.max_width?r.max_width:0,t=[],o=!1;for(var f in Br)t.push("["+f+' "'+Br[f]+'"]'+e),o=!0;o&&Mr.length&&t.push(e);for(var i=[];Mr.length>0;)i.push(x());for(var a=[],u="";i.length>0;){var l=i.pop();Mr.length||"b"!==l.color?"w"===l.color&&(u.length&&a.push(u),u=xr+"."):u=xr+". ...",u=u+" "+I(l,!1),N(l)}if(u.length&&a.push(u),"undefined"!=typeof Br.Result&&a.push(Br.Result),0===n)return t.join("")+a.join(" ");for(var s=0,f=0;f<a.length;f++)s+a[f].length>n&&0!==f?(" "===t[t.length-1]&&t.pop(),t.push(e),s=0):0!==f&&(t.push(" "),s++),t.push(a[f]),s+=a[f].length;return t.join("")},load_pgn:function(r,e){function o(r){return r.replace(/\\/g,"\\")}function f(r){for(var e in r)return!0;return!1}function i(r,e){for(var n="object"==typeof e&&"string"==typeof e.newline_char?e.newline_char:"\r?\n",t={},f=r.split(new RegExp(o(n))),i="",a="",u=0;u<f.length;u++)i=f[u].replace(/^\[([A-Z][A-Za-z]*)\s.*\]$/,"$1"),a=f[u].replace(/^\[[A-Za-z]+\s"(.*)"\]$/,"$1"),nr(i).length>0&&(t[i]=a);return t}var a="undefined"!=typeof e&&"sloppy"in e?e.sloppy:!1,u="object"==typeof e&&"string"==typeof e.newline_char?e.newline_char:"\r?\n",l=new RegExp("^(\\[(.|"+o(u)+")*\\])("+o(u)+")*1.("+o(u)+"|.)*$","g"),s=r.replace(l,"$1");"["!==s[0]&&(s=""),n();var c=i(s,e);for(var v in c)p([v,c[v]]);if("1"===c.SetUp&&!("FEN"in c&&t(c.FEN)))return!1;var E=r.replace(s,"").replace(new RegExp(o(u),"g")," ");E=E.replace(/(\{[^}]+\})+?/g,"");for(var g=/(\([^\(\)]+\))+?/g;g.test(E);)E=E.replace(g,"");E=E.replace(/\d+\.(\.\.)?/g,""),E=E.replace(/\.\.\./g,""),E=E.replace(/\$\d+/g,"");var h=nr(E).split(new RegExp(/\s+/));h=h.join(",").replace(/,,+/g,",").split(",");for(var d="",S=0;S<h.length-1;S++){if(d=G(h[S],a),null==d)return!1;N(d)}if(d=h[h.length-1],dr.indexOf(d)>-1)f(Br)&&"undefined"==typeof Br.Result&&p(["Result",d]);else{if(d=G(d,a),null==d)return!1;N(d)}return!0},header:function(){return p(arguments)},ascii:function(){return B()},turn:function(){return Qr},move:function(r,e){var n="undefined"!=typeof e&&"sloppy"in e?e.sloppy:!1,t=null;if("string"==typeof r)t=G(r,n);else if("object"==typeof r)for(var o=b(),f=0,i=o.length;i>f;f++)if(!(r.from!==V(o[f].from)||r.to!==V(o[f].to)||"promotion"in o[f]&&r.promotion!==o[f].promotion)){t=o[f];break}if(!t)return null;var a=rr(t);return N(t),a},undo:function(){var r=x();return r?rr(r):null},clear:function(){return e()},put:function(r,e){return E(r,e)},get:function(r){return v(r)},remove:function(r){return g(r)},put_in_hand:function(r){return h(r)},remove_from_hand:function(r){return d(r)},get_hand:function(r){return r?jr[r].map(function(e){return"w"===r.charAt(0)?e.type.toUpperCase():e.type}):{w:jr.w.map(function(r){return r.type.toUpperCase()}),b:jr.b.map(function(r){return r.type})}},perft:function(r){return tr(r)},square_color:function(r){if(r in Dr){var e=Dr[r];return(Z(e)+J(e))%2===0?"light":"dark"}return null},history:function(r){for(var e=[],n=[],t=("undefined"!=typeof r&&"verbose"in r&&r.verbose);Mr.length>0;)e.push(x());for(;e.length>0;){var o=e.pop();n.push(t?rr(o):I(o)),N(o)}return n},new_960:function(r){return W(r)},position_number:function(){return"undefined"!=typeof or?or:-1},castling_legal:function(r,e,n,t){return r=Dr[r],e=Dr[e],n="k"===n?mr.KSIDE_CASTLE:mr.QSIDE_CASTLE,m(r,e,n,t)}}};"undefined"!=typeof exports&&(exports.Chess=Chess),"undefined"!=typeof define&&define(function(){return Chess});