chess-base
Version:
chess board logic
1 lines • 13.3 kB
JavaScript
!function(t,o){"object"==typeof exports&&"object"==typeof module?module.exports=o():"function"==typeof define&&define.amd?define([],o):"object"==typeof exports?exports.chess=o():t.chess=o()}(this,function(){return function(t){var o={};function e(r){if(o[r])return o[r].exports;var n=o[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,e),n.l=!0,n.exports}return e.m=t,e.c=o,e.d=function(t,o,r){e.o(t,o)||Object.defineProperty(t,o,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,o){if(1&o&&(t=e(t)),8&o)return t;if(4&o&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&o&&"string"!=typeof t)for(var n in t)e.d(r,n,function(o){return t[o]}.bind(null,n));return r},e.n=function(t){var o=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(o,"a",o),o},e.o=function(t,o){return Object.prototype.hasOwnProperty.call(t,o)},e.p="",e(e.s=0)}([function(t,o,e){"use strict";e.r(o);const r={WHITE:"w",BLACK:"b"},n={PAWN:"p",KNIGHT:"n",BISHOP:"b",ROOK:"r",QUEEN:"q",KING:"k"},i=[[0,1],[0,-1],[1,0],[-1,0]],a=[[1,1],[-1,1],[1,-1],[-1,-1]],s={n:[[1,2],[-1,2],[1,-2],[-1,-2],[2,1],[2,-1],[-2,1],[-2,-1]],b:a,r:i,q:[...i,...a],k:[...i,...a]},c={w:8,b:1},u={w:2,b:7},l={w:[[1,0],[1,-1],[1,1]],b:[[-1,0],[-1,-1],[-1,1]]},f={n:1,b:-1,r:-1,q:-1,k:1},p={KING:"k",QUEEN:"q"},b={k:{king:{from:"e",to:"g"},rook:{from:"h",to:"f"}},q:{king:{from:"e",to:"c"},rook:{from:"a",to:"d"}}},g={k:["e","f","g"],q:["b","c","d","e"]};function m({activeColour:t,castlingType:o}){const e=r.WHITE===t?"1":"8",{king:{from:n,to:i},rook:{from:a,to:s}}=b[o];return{king:{from:`${n}${e}`,to:`${i}${e}`},rook:{from:`${a}${e}`,to:`${s}${e}`}}}function d(t){return t&&t.type===n.PAWN}function P(t){return r.WHITE===t?r.BLACK:r.WHITE}function T(t){return[].concat.apply([],t)}function v(t){return JSON.parse(JSON.stringify(t))}const y=/(r|n|b|q|k|p)/i,q=/(R|N|B|Q|K|P)/;function h(t){return t.split("/").reverse().map(t=>(function(t){return T([...t].map(t=>y.test(t)?function(t){return{type:t.toLowerCase(),color:q.test(t)?r.WHITE:r.BLACK}}(t):Array(Number(t)).fill().map(()=>null)))})(t))}function C(t){return[...t].reverse().map(t=>t.map(t=>(function(t){if(null===t)return".";return r.WHITE===t.color?t.type.toUpperCase():t.type})(t))).map(t=>(function(t){return[...t].reduce((t,o)=>{if(y.test(o))return t.concat(o);if(""===t)return t.concat("1");const e=t.slice(-1);return y.test(e)?t.concat("1"):t.slice(0,-1).concat(Number(e)+1)},"")})(t)).join("/")}function N({board:t,algebraicPosition:o,offset:e}){const r=S(o);if(e&&(r[0]+=e[0],r[1]+=e[1]),!function({arrayPosition:t}){const[o,e]=t;return o<0||o>7||e<0||e>7}({board:t,arrayPosition:r}))return{square:k(r),piece:t[r[0]][r[1]]}}function S(t){const[o,e]=t;return["12345678".indexOf(e),"abcdefgh".indexOf(o)]}function k(t){const[o,e]=t;return`${"abcdefgh"[e]}${"12345678"[o]}`}function F({state:t,withColor:o,withPieceType:e}){const{board:r,activeColour:n}=t;return T(function({board:t,withColor:o=!1,withPieceType:e=!1}){return T(t.map((t,r)=>t.map((t,o)=>({piece:t,algebraicPosition:k([r,o])})).filter(({piece:t})=>{if(!t)return!1;const r=!o||o&&t.color===o,n=!e||e&&t.type===e;return r&&n})))}({board:r,withColor:o||n,withPieceType:e}).map(({piece:o,algebraicPosition:e})=>{return K({state:t,algebraicPosition:e}).map(t=>({piece:o,from:e,to:t.square,capture:t.piece}))}))}function K({state:t,algebraicPosition:o}){const e=N({board:t.board,algebraicPosition:o});return e&&e.piece&&e.piece.color===t.activeColour?T(function(t){return d(t.piece)?l[t.piece.color]:s[t.piece.type]}(e).map(o=>(function t({state:o,square:e,offset:r,numMoves:n,nextMoves:i,currentSquare:a}){const{board:s,passantTarget:c}=o;const u=N({board:s,algebraicPosition:a,offset:r});(function({square:t,nextSquare:o,passantTarget:e}){const r=o&&null!==o.piece,n=o&&null===o.piece,i=r&&o.piece.color!==t.piece.color;return d(t.piece)?function({square:t,nextSquare:o,passantTarget:e}){const r=o&&o.square===e,n=I({square:t,nextSquare:o}),i=o&&null!==o.piece,a=i&&o.piece.color!==t.piece.color;return o&&!n&&!i||o&&n&&a||r}({square:t,nextSquare:o,passantTarget:e}):n||i})({square:e,nextSquare:u,passantTarget:c})&&i.push(u);return function({square:t,nextMoves:o,nextSquare:e,numMoves:r}){const n=e&&null!==e.piece,i=-1!==r&&o.length===r;return!e||n||i||d(t.piece)&&I({square:t,nextSquare:e})}({square:e,nextMoves:i,nextSquare:u,numMoves:n})?i:t({state:o,square:e,offset:r,numMoves:n,nextMoves:i,currentSquare:u.square})})({state:t,square:e,offset:o,numMoves:E(e),nextMoves:[],currentSquare:e.square}))):[]}function E(t){return d(t.piece)?function(t){const o=t.piece.color,[,e]=t.square;return u[o]===Number(e)?2:1}(t):f[t.piece.type]}function I({square:t,nextSquare:o}){return!(o&&t.square[0]===o.square[0])}function x({state:t,algebraicPositionFrom:o,algebraicPositionTo:e,promotionType:r}){return e?O({state:t,algebraicPositionFrom:o,algebraicPositionTo:e,promotionType:r}):function({state:t,movementSAN:o}){const{castlingKing:e,castlingQueen:r,from:i,to:a,pieceType:s,promotionType:c}=function({state:t,movementSAN:o}){const e="0-0"===o||"O-O"===o,r="0-0-0"===o||"O-O-O"===o;if(e||r)return{castlingKing:e,castlingQueen:r};const{promotionType:i,movementWithoutPromotion:a}=function(t){const o=function({target:t,chars:o}){return o.reduce((t,o)=>t.replace(o,""),t)}({target:t,chars:["x","e.p.","+","=",":"]}),e=A(M(o))&&M(o).toLowerCase(),r=e?o.slice(0,o.length-1):o;return{promotionType:e,movementWithoutPromotion:r}}(o),{from:s,to:c,pieceType:u}=function(t){const[o,e]=(a=t,[a.slice(0,a.length-2),a.slice(-2)]),{from:r,pieceType:i}=A(Q(o))?{from:o.slice(1),pieceType:Q(o).toLowerCase()}:{from:o,pieceType:n.PAWN};var a;return{from:r,to:e,pieceType:i}}(a),{halfCastlingKing:l,halfCastlingQueen:f}=function({state:t,from:o,to:e}){const{activeColour:r,board:i}=t,a=N({board:i,algebraicPosition:o});if(!a||!a.piece||a.piece.type!==n.KING)return{halfCastlingKing:!1,halfCastlingQueen:!1};return{halfCastlingKing:w({activeColour:r,castlingType:p.KING,from:o,to:e}),halfCastlingQueen:w({activeColour:r,castlingType:p.QUEEN,from:o,to:e})}}({state:t,from:s,to:c});if(l||f)return{castlingKing:l,castlingQueen:f};return{castlingKing:e,castlingQueen:r,from:s,to:c,pieceType:u,promotionType:i}}({state:t,movementSAN:o});if(e)return B({state:t,castlingType:p.KING});if(r)return B({state:t,castlingType:p.QUEEN});const u=function({state:t,withPieceType:o,moveFrom:e,moveTo:r}){return F({state:t,withPieceType:o}).filter(({to:t,from:o})=>{const[n,i]=o,a=t===r,s=!e||e===o||e===n||e===i;return a&&s})}({state:t,withPieceType:s,moveFrom:i,moveTo:a});if(1!==u.length)throw 0===u.length?`Invalid SAN: ${o}`:`Invalid SAN, amibiguous piece: ${u.map(({from:t})=>t).join(",")}`;return O({state:t,algebraicPositionFrom:u[0].from,algebraicPositionTo:a,promotionType:c})}({state:t,movementSAN:o})}function w({activeColour:t,castlingType:o,from:e,to:r}){const{king:{from:n,to:i}}=m({activeColour:t,castlingType:o});return n===e&&i===r}function M(t){return t.slice(-1)}function Q(t){return t.slice(0,1)}function A(t){return/(R|N|B|Q|K)/.test(t)}function O({state:t,algebraicPositionFrom:o,algebraicPositionTo:e,promotionType:r}){const{activeColour:i}=t,a=v(t),s=function({state:t,algebraicPositionFrom:o,algebraicPositionTo:e}){if(!function({state:t,algebraicPositionFrom:o,algebraicPositionTo:e}){return K({state:t,algebraicPosition:o}).find(t=>t.square===e)}({state:t,algebraicPositionFrom:o,algebraicPositionTo:e}))throw"move invalid";const{board:r,passantTarget:n}=t,i=S(o),a=S(e),{squareFrom:s,squareTo:c}=H({board:r,boardPositionFrom:i,boardPositionTo:a}),u=d(s)&&e===n?function({state:t,squareFrom:o,boardPositionTo:e}){const{board:r}=t,n=$({color:o.color,boardPosition:e});return function({board:t,boardPosition:o}){const e=t[o[0]][o[1]];return t[o[0]][o[1]]=null,e}({board:r,boardPosition:n})}({state:t,squareFrom:s,boardPositionTo:a}):c;return function({state:t,squareFrom:o,boardPositionFrom:e,boardPositionTo:r}){const n=2===Math.abs(e[0]-r[0]);if(!d(o)||!n)return void(t.passantTarget="-");const i=$({color:o.color,boardPosition:r});t.passantTarget=k(i)}({state:t,squareFrom:s,boardPositionFrom:i,boardPositionTo:a}),function({state:t,squareFrom:o,squareTarget:e}){const r=null!==e;t.halfMoveClock=d(o)||r?0:t.halfMoveClock+1}({state:t,squareFrom:s,squareTarget:u}),W(t),L({state:t,algebraicPositionFrom:o}),j(t),u}({state:a,algebraicPositionFrom:o,algebraicPositionTo:e});if(G(a))throw"target king";const u=N({board:a.board,algebraicPosition:e});return function({square:t,activeColour:o}){const e=Number(t.square[1])===c[o];return d(t.piece)&&e}({square:u,activeColour:i})&&function({state:{activeColour:t},virtualState:o,virtualSquareTo:e,promotionType:r}){if(!Object.values(n).find(t=>n.PAWN!==t&&t===r))throw"promotion type required";const{board:i}=o;!function({board:t,piece:o,algebraicPosition:e}){const r=S(e);t[r[0]][r[1]]=o}({board:i,piece:{type:r,color:t},algebraicPosition:e.square})}({state:t,virtualState:a,virtualSquareTo:u,promotionType:r}),{state:v(a),squareCaptured:s}}function W(t){t.activeColour===r.BLACK&&(t.fullMoveNumber+=1)}function j(t){t.activeColour=t.activeColour===r.WHITE?r.BLACK:r.WHITE}function $({color:t,boardPosition:o}){const e=t===r.WHITE?-1:1,n=o;return n[0]+=e,n}function H({board:t,boardPositionFrom:o,boardPositionTo:e}){const r=t[o[0]][o[1]],n=t[e[0]][e[1]];return t[e[0]][e[1]]=r,t[o[0]][o[1]]=null,{squareFrom:r,squareTo:n}}function G(t){const{board:o,activeColour:e}=t,r=function({board:t,color:o}){return t.map((t,e)=>t.map((t,o)=>({piece:t,square:k([e,o])})).find(t=>null!==t.piece&&t.piece.color===o&&t.piece.type===n.KING)).filter(t=>!!t)[0]}({board:o,color:P(e)});return!!r&&U({state:t,algebraicPosition:r.square})}function U({state:t,algebraicPosition:o}){return!!F({state:t}).find(({to:t})=>t===o)}function B({state:t,castlingType:o}){const{activeColour:e,board:i}=t,a=function({activeColour:t,castlingType:o}){const e=r.WHITE===t?"1":"8";return g[o].map(t=>`${t}${e}`)}({activeColour:e,castlingType:o});!function({safeSquares:t,board:o}){if(t.find(t=>!function({board:t,algebraicPosition:o}){return null===N({board:t,algebraicPosition:o}).piece}({board:o,algebraicPosition:t})&&!function({board:t,algebraicPosition:o}){const e=N({board:t,algebraicPosition:o});return null!==e.piece&&e.piece.type===n.KING}({board:o,algebraicPosition:t})))throw"castling invalid"}({safeSquares:a,board:i}),function({safeSquares:t,state:o}){const e=v(o);if(e.activeColour=P(o.activeColour),t.find(t=>U({state:e,algebraicPosition:t})))throw"castling target"}({safeSquares:a,state:t});const{king:{from:s,to:c},rook:{from:u,to:l}}=m({activeColour:e,castlingType:o});return H({board:i,boardPositionFrom:S(s),boardPositionTo:S(c)}),H({board:i,boardPositionFrom:S(u),boardPositionTo:S(l)}),t.passantTarget="-",t.halfMoveClock+=1,L({state:t}),W(t),j(t),{state:t}}function L({state:t,algebraicPositionFrom:o}){const e=function({state:t,algebraicPositionFrom:o}){if(!o)return[n.KING,n.QUEEN];const{kingFrom:e,rookFromSideKing:r,rookFromSideQueen:i}=function(t){const{king:{from:o},rook:{from:e}}=m({activeColour:t,castlingType:p.KING}),{rook:{from:r}}=m({activeColour:t,castlingType:p.QUEEN});return{kingFrom:o,rookFromSideKing:e,rookFromSideQueen:r}}(t.activeColour);if(o===e)return[n.KING,n.QUEEN];if(o===r)return[n.KING];if(o===i)return[n.QUEEN];return[]}({state:t,algebraicPositionFrom:o}),i=t.activeColour===r.WHITE?e.map(t=>t.toUpperCase()):e,a=(s=t.castlingAvailability,c="",i.reduce((t,o)=>t.replace(o,c),s));var s,c;t.castlingAvailability=a||"-"}const R={K:"♔",Q:"♕",R:"♖",B:"♗",N:"♘",P:"♙",k:"♚",q:"♛",r:"♜",b:"♝",n:"♞",p:"♟"};function _({board:t,showAlgebraic:o}){return[...t].reverse().map(t=>t.map(t=>(function(t){if(null===t)return" ";const o=t.color===r.WHITE?t.type.toUpperCase():t.type;return R[o]})(t))).map((t,e,r)=>o?`${r.length-e} ${t.join(" ")}`:t.join(" ")).join("\n").concat(o?"\n ":"").concat(o?"\n a b c d e f g h":"")}e.d(o,"Chess",function(){return z});const J="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";class z{constructor(t){this.state=function(t){const o=t.split(" "),e=o[0],r=o[1],n=o[2],i=o[3],a=Number(o[4]),s=Number(o[5]);return{board:h(e),activeColour:r,castlingAvailability:n,passantTarget:i,halfMoveClock:a,fullMoveNumber:s}}(t||J)}getSquare(t){return N({board:this.state.board,algebraicPosition:t})}getMovesTurn(){return F({state:this.state})}getMoves(t){return K({state:this.state,algebraicPosition:t})}castlingKing(){B({state:this.state,castlingType:p.KING})}castlingQueen(){B({state:this.state,castlingType:p.QUEEN})}target(t){return U({state:this.state,algebraicPosition:t})}targetKing(){return G(this.state)}move(t,o,e){const{state:r,squareCaptured:n}=x({state:this.state,algebraicPositionFrom:t,algebraicPositionTo:o,promotionType:e});return this.state=r,n}toFen(){return[C((t=this.state).board),t.activeColour,t.castlingAvailability,t.passantTarget,t.halfMoveClock.toString(),t.fullMoveNumber.toString()].join(" ");var t}toAscii(t){const o=t&&t.extend;return _({board:this.state.board,showAlgebraic:o})}}}])});