g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","// PieceType enum\nexport enum PieceType {\n PAWN = 'P',\n BISHOP = 'B',\n KNIGHT = 'N',\n ROOK = 'R',\n QUEEN = 'Q',\n KING = 'K',\n}\n\n// TeamType enum\nexport enum TeamType {\n RED = 'r',\n BLUE = 'b',\n YELLOW = 'y',\n GREEN = 'g',\n}\n","import './PlayerName.css'\n\ninterface Props {\n whoseTurn: number\n}\n// Color names for the different players\nexport default function PlayerName({ whoseTurn }: Props) {\n let red = ''\n let yellow = ''\n let blue = ''\n let green = ''\n if (whoseTurn % 4 === 1) {\n red = 'RED'\n } else if (whoseTurn % 4 === 2) {\n blue = 'BLUE'\n } else if (whoseTurn % 4 === 3) {\n yellow = 'YELLOW'\n } else if (whoseTurn % 4 === 0) {\n green = 'GREEN'\n }\n\n return (\n <>\n \n Player RED\n
\n \n Player BLUE\n
\n \n Player YELLOW\n
\n \n Player GREEN\n
\n >\n )\n}\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nexport default function _createForOfIteratorHelper(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (!it) {\n if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n var F = function F() {};\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = it.call(o);\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\n\n// Checking if the tile is occupied or not\nexport const tileIsOccupied = (\n position: Position,\n boardState: Piece[]\n): boolean => {\n const piece = boardState.find((p) => p.samePosition(position))\n\n if (piece) {\n return true\n } else {\n return false\n }\n}\n\n// Checking if the tile is occupied by opponent or not\nexport const tileIsOccupiedByOpponent = (\n position: Position,\n boardState: Piece[],\n team: TeamType\n): boolean => {\n const piece = boardState.find(\n (p) => p.samePosition(position) && p.team !== team\n )\n\n if (piece) {\n return true\n } else {\n return false\n }\n}\n\n// Checking if the tile is empty or occupied by an opponent\nexport const tileIsEmptyOrOccupiedByOpponent = (\n position: Position,\n boardState: Piece[],\n team: TeamType\n) => {\n return (\n !tileIsOccupied(position, boardState) ||\n tileIsOccupiedByOpponent(position, boardState, team)\n )\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport {\n tileIsOccupied,\n tileIsOccupiedByOpponent,\n tileIsEmptyOrOccupiedByOpponent,\n} from './GeneralRules'\n\n// Rules to move the Kings\nexport const kingMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n // Checking for king moves\n for (let i = 1; i < 2; i++) {\n let multiplierX =\n desiredPosition.x < initialPosition.x\n ? -1\n : desiredPosition.x > initialPosition.x\n ? 1\n : 0\n let multiplierY =\n desiredPosition.y < initialPosition.y\n ? -1\n : desiredPosition.y > initialPosition.y\n ? 1\n : 0\n\n let passedPosition = new Position(\n initialPosition.x + i * multiplierX,\n initialPosition.y + i * multiplierY\n )\n\n // Checking if the tile is occupied/empty\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Kings to highlight the grids\nexport const getPossibleKingMoves = (\n king: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n // Top movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x, king.position.y + i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x, king.position.y - i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Left movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x - i, king.position.y)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Right movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x + i, king.position.y)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Upper right movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x + i, king.position.y + i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom right movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x + i, king.position.y - i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom left movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x - i, king.position.y - i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Top left movement\n for (let i = 1; i < 2; i++) {\n const destination = new Position(king.position.x - i, king.position.y + i)\n\n // If the move is outside of the board don't add it\n if (\n (destination.x < 3 && destination.y < 3) ||\n (destination.x > 10 && destination.y < 3) ||\n (destination.x > 10 && destination.y > 10) ||\n (destination.x < 3 && destination.y > 10) ||\n destination.x < 0 ||\n destination.x > 13 ||\n destination.y < 0 ||\n destination.y > 13\n ) {\n break\n }\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, king.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n return possibleMoves\n}\n\n// Getting the castling moves for the king\n// In this method, enemy moves have already been calculated\nexport const getCastlingMoves = (\n king: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n if (king.hasMoved) return possibleMoves\n\n // Get unmoved rooks from the king's team\n const rooks = boardState.filter(\n (p) => p.isRook && p.team === king.team && !p.hasMoved\n )\n\n // For red and yellow rooks\n // Loop through the rooks\n for (const rook of rooks) {\n // Determine if we have to go to right or left\n const direction =\n rook.team === TeamType.RED || rook.team === TeamType.YELLOW\n ? rook.position.x - king.position.x > 0\n ? 1\n : -1\n : rook.position.y - king.position.y > 0\n ? 1\n : -1\n\n const adjacentPosition = king.position.clone()\n if (king.team === TeamType.RED || king.team === TeamType.YELLOW) {\n adjacentPosition.x += direction\n } else {\n adjacentPosition.y += direction\n }\n\n if (!rook.possibleMoves?.some((m) => m.samePosition(adjacentPosition)))\n continue\n\n const concerningTiles =\n king.team === TeamType.RED || king.team === TeamType.YELLOW\n ? rook.possibleMoves.filter((m) => m.y === king.position.y)\n : rook.possibleMoves.filter((m) => m.x === king.position.x)\n\n // Filter out the enemy\n const enemyPieces = boardState.filter((p) => p.team !== king.team)\n\n let valid = true\n\n // Looping through all enemy pieces\n for (const enemy of enemyPieces) {\n if (enemy.possibleMoves === undefined) continue\n\n // Checking if the concerned tiles for castling has the same position\n // as the possible moves of the enemy\n for (const move of enemy.possibleMoves) {\n if (concerningTiles.some((t) => t.samePosition(move))) {\n valid = false\n }\n\n if (!valid) break\n }\n\n if (!valid) break\n }\n\n if (!valid) continue\n\n // We now want to add it as a possible move\n possibleMoves.push(rook.position.clone())\n }\n\n return possibleMoves\n}\n","import { Piece } from './Piece'\nimport { Position } from './Position'\nimport { PieceType, TeamType } from '../Types'\nimport {\n getPossibleBishopMoves,\n getPossibleKingMoves,\n getPossibleKnightMoves,\n getPossiblePawnMoves,\n getPossibleQueenMoves,\n getPossibleRookMoves,\n getCastlingMoves,\n} from '../rules'\n\n// Exporting the board class\nexport class Board {\n pieces: Piece[]\n totalTurns: number\n losingTeam?: TeamType\n\n // Defining the constructor\n constructor(pieces: Piece[], totalTurns: number) {\n this.pieces = pieces\n this.totalTurns = totalTurns\n }\n\n // Getting the current playing team\n get currentTeam(): TeamType {\n if (this.totalTurns % 4 === 1) {\n return TeamType.RED\n } else if (this.totalTurns % 4 === 2) {\n return TeamType.BLUE\n } else if (this.totalTurns % 4 === 3) {\n return TeamType.YELLOW\n } else {\n return TeamType.GREEN\n }\n }\n\n calculateAllMoves() {\n // For each piece, calculate the possible moves\n for (const piece of this.pieces) {\n piece.possibleMoves = this.getValidMoves(piece, this.pieces)\n }\n\n // Calculate castling moves\n for (const king of this.pieces.filter((p) => p.isKing)) {\n if (king.possibleMoves === undefined) continue\n\n king.possibleMoves = [\n ...king.possibleMoves,\n ...getCastlingMoves(king, this.pieces),\n ]\n }\n\n // Checking if the moves of king are valid\n this.checkCurrentTeamMoves()\n\n // Removing the possible moves of the team\n //that does not have its chance at the moment\n for (const piece of this.pieces.filter(\n (p) => p.team !== this.currentTeam\n )) {\n piece.possibleMoves = []\n }\n\n //Checking if the playing team still has moves left, else checkmate\n if (\n this.pieces\n .filter((p) => p.team === this.currentTeam)\n .some(\n (p) => p.possibleMoves !== undefined && p.possibleMoves.length > 0\n )\n )\n return\n\n this.losingTeam = this.currentTeam\n }\n\n checkCurrentTeamMoves() {\n // Looping through all the current team's pieces\n for (const piece of this.pieces.filter(\n (p) => p.team === this.currentTeam\n )) {\n if (piece.possibleMoves === undefined) continue\n\n // Simulate all the piece moves\n for (const move of piece.possibleMoves) {\n const simulatedBoard = this.clone()\n\n // Remove the piece at the destination position\n simulatedBoard.pieces = simulatedBoard.pieces.filter(\n (p) => !p.samePosition(move)\n )\n\n // Get the pieces of the cloned board\n const clonedPiece = simulatedBoard.pieces.find((p) =>\n p.samePiecePosition(piece)\n )!\n clonedPiece.position = move.clone()\n\n // Get the king of the cloned board\n const clonedKing = simulatedBoard.pieces.find(\n (p) => p.isKing && p.team === simulatedBoard.currentTeam\n )!\n\n // Loop through all enemy pieces, update their possible moves\n // And check if the current team's king will be in danger\n for (const enemy of simulatedBoard.pieces.filter(\n (p) => p.team !== simulatedBoard.currentTeam\n )) {\n enemy.possibleMoves = simulatedBoard.getValidMoves(\n enemy,\n simulatedBoard.pieces\n )\n\n if (enemy.isPawn) {\n if (\n enemy.possibleMoves.some(\n (m) =>\n m.x !== enemy.position.x &&\n m.samePosition(clonedKing.position)\n )\n ) {\n piece.possibleMoves = piece.possibleMoves?.filter(\n (m) => !m.samePosition(move)\n )\n }\n } else {\n if (\n enemy.possibleMoves.some((m) =>\n m.samePosition(clonedKing.position)\n )\n ) {\n piece.possibleMoves = piece.possibleMoves?.filter(\n (m) => !m.samePosition(move)\n )\n }\n }\n }\n }\n }\n }\n\n // Getting the valid moves of the pieces which is being played\n getValidMoves(piece: Piece, boardState: Piece[]): Position[] {\n switch (piece.type) {\n case PieceType.PAWN:\n return getPossiblePawnMoves(piece, boardState)\n case PieceType.KNIGHT:\n return getPossibleKnightMoves(piece, boardState)\n case PieceType.BISHOP:\n return getPossibleBishopMoves(piece, boardState)\n case PieceType.ROOK:\n return getPossibleRookMoves(piece, boardState)\n case PieceType.QUEEN:\n return getPossibleQueenMoves(piece, boardState)\n case PieceType.KING:\n return getPossibleKingMoves(piece, boardState)\n default:\n return []\n }\n }\n\n playMove(\n validMove: boolean,\n playedPiece: Piece,\n destination: Position\n ): boolean {\n const destinationPiece = this.pieces.find((p) =>\n p.samePosition(destination)\n )\n\n // If castling is played\n if (\n playedPiece.isKing &&\n destinationPiece?.isRook &&\n destinationPiece.team === playedPiece.team\n ) {\n // Deciding the direction of castling for different players\n const direction =\n destinationPiece.team === TeamType.RED ||\n playedPiece.team === TeamType.YELLOW\n ? destinationPiece.position.x - playedPiece.position.x > 0\n ? 1\n : -1\n : destinationPiece.position.y - playedPiece.position.y > 0\n ? 1\n : -1\n\n // Implementing the direction of castling\n if (\n playedPiece.team === TeamType.RED ||\n playedPiece.team === TeamType.YELLOW\n ) {\n const newKingXPosition = playedPiece.position.x + direction * 2\n this.pieces = this.pieces.map((p) => {\n if (p.samePiecePosition(playedPiece)) {\n p.position.x = newKingXPosition\n } else if (p.samePiecePosition(destinationPiece)) {\n p.position.x = newKingXPosition - direction\n }\n\n return p\n })\n } else {\n const newKingYPosition = playedPiece.position.y + direction * 2\n this.pieces = this.pieces.map((p) => {\n if (p.samePiecePosition(playedPiece)) {\n p.position.y = newKingYPosition\n } else if (p.samePiecePosition(destinationPiece)) {\n p.position.y = newKingYPosition - direction\n }\n\n return p\n })\n }\n\n this.calculateAllMoves()\n return true\n }\n\n // If it is a valid move\n if (validMove) {\n // Updated the pieces position\n // And if a piece is attacked, removes it\n this.pieces = this.pieces.reduce((results, piece) => {\n // Piece that we are currently playing\n if (piece.samePiecePosition(playedPiece)) {\n piece.position.x = destination.x\n piece.position.y = destination.y\n piece.hasMoved = true\n\n results.push(piece)\n } else if (!piece.samePosition(destination)) {\n results.push(piece)\n }\n\n return results\n }, [] as Piece[])\n\n this.calculateAllMoves()\n } else {\n return false\n }\n\n return true\n }\n\n // Clone function of the board\n clone(): Board {\n return new Board(\n this.pieces.map((p) => p.clone()),\n this.totalTurns\n )\n }\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport { tileIsOccupied, tileIsOccupiedByOpponent } from './GeneralRules'\n\n// Rules to move the Pawns\nexport const pawnMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n const specialRow = team === TeamType.RED || team === TeamType.BLUE ? 1 : 12\n const pawnDirection = team === TeamType.RED || team === TeamType.BLUE ? 1 : -1\n\n // Red and Yellow Pawn\n if (team === TeamType.RED || team === TeamType.YELLOW) {\n // Movement Logic\n if (\n initialPosition.x === desiredPosition.x &&\n initialPosition.y === specialRow &&\n desiredPosition.y - initialPosition.y === 2 * pawnDirection\n ) {\n if (\n !tileIsOccupied(desiredPosition, boardState) &&\n !tileIsOccupied(\n new Position(desiredPosition.x, desiredPosition.y - pawnDirection),\n boardState\n )\n ) {\n return true\n }\n } else if (\n initialPosition.x === desiredPosition.x &&\n desiredPosition.y - initialPosition.y === pawnDirection\n ) {\n if (!tileIsOccupied(desiredPosition, boardState)) {\n return true\n }\n }\n // Attack Logic\n else if (\n desiredPosition.x - initialPosition.x === -1 &&\n desiredPosition.y - initialPosition.y === pawnDirection\n ) {\n // Attack in Upper or Bottom Left Corner\n if (tileIsOccupiedByOpponent(desiredPosition, boardState, team)) {\n return true\n }\n } else if (\n desiredPosition.x - initialPosition.x === 1 &&\n desiredPosition.y - initialPosition.y === pawnDirection\n ) {\n // Attack in Upper or Bottom Right Corner\n if (tileIsOccupiedByOpponent(desiredPosition, boardState, team)) {\n return true\n }\n }\n }\n\n // Green and Blue Pawn\n else {\n // Movement Logic\n if (\n initialPosition.y === desiredPosition.y &&\n initialPosition.x === specialRow &&\n desiredPosition.x - initialPosition.x === 2 * pawnDirection\n ) {\n if (\n !tileIsOccupied(desiredPosition, boardState) &&\n !tileIsOccupied(\n new Position(desiredPosition.x - pawnDirection, desiredPosition.y),\n boardState\n )\n ) {\n return true\n }\n } else if (\n initialPosition.y === desiredPosition.y &&\n desiredPosition.x - initialPosition.x === pawnDirection\n ) {\n if (!tileIsOccupied(desiredPosition, boardState)) {\n return true\n }\n }\n // Attack Logic\n else if (\n desiredPosition.y - initialPosition.y === -1 &&\n desiredPosition.x - initialPosition.x === pawnDirection\n ) {\n // Attack in Right or Left Bottom Corner\n if (tileIsOccupiedByOpponent(desiredPosition, boardState, team)) {\n return true\n }\n } else if (\n desiredPosition.y - initialPosition.y === 1 &&\n desiredPosition.x - initialPosition.x === pawnDirection\n ) {\n // Attack in Right or Left Upper Corner\n if (tileIsOccupiedByOpponent(desiredPosition, boardState, team)) {\n return true\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Pawns to highlight the grids\nexport const getPossiblePawnMoves = (\n pawn: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n const specialRow =\n pawn.team === TeamType.RED || pawn.team === TeamType.BLUE ? 1 : 12\n const pawnDirection =\n pawn.team === TeamType.RED || pawn.team === TeamType.BLUE ? 1 : -1\n\n let normalMove = new Position(-1, -1)\n let specialMove = new Position(-1, -1)\n let upperLeftAttack = new Position(-1, -1)\n let upperRightAttack = new Position(-1, -1)\n\n // For red and yellow pawns\n if (pawn.team === TeamType.RED || pawn.team === TeamType.YELLOW) {\n normalMove = new Position(pawn.position.x, pawn.position.y + pawnDirection)\n specialMove = new Position(normalMove.x, normalMove.y + pawnDirection)\n upperLeftAttack = new Position(\n pawn.position.x - 1,\n pawn.position.y + pawnDirection\n )\n upperRightAttack = new Position(\n pawn.position.x + 1,\n pawn.position.y + pawnDirection\n )\n }\n\n // For green and blue pawns\n else {\n normalMove = new Position(pawn.position.x + pawnDirection, pawn.position.y)\n specialMove = new Position(normalMove.x + pawnDirection, normalMove.y)\n upperLeftAttack = new Position(\n pawn.position.x + pawnDirection,\n pawn.position.y - 1\n )\n upperRightAttack = new Position(\n pawn.position.x + pawnDirection,\n pawn.position.y + 1\n )\n }\n\n // Checking for possible moves\n if (!tileIsOccupied(normalMove, boardState)) {\n possibleMoves.push(normalMove)\n\n if (\n (pawn.position.y === specialRow || pawn.position.x === specialRow) &&\n !tileIsOccupied(specialMove, boardState)\n ) {\n possibleMoves.push(specialMove)\n }\n }\n\n if (tileIsOccupiedByOpponent(upperLeftAttack, boardState, pawn.team)) {\n possibleMoves.push(upperLeftAttack)\n }\n\n if (tileIsOccupiedByOpponent(upperRightAttack, boardState, pawn.team)) {\n possibleMoves.push(upperRightAttack)\n }\n\n return possibleMoves\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport { tileIsEmptyOrOccupiedByOpponent } from './GeneralRules'\n\n// Rules to move the Knights\nexport const knightMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n // Movement and Attack Logic for Knight\n for (let i = -1; i < 2; i += 2) {\n for (let j = -1; j < 2; j += 2) {\n // Top and Bottom Side Movement\n if (desiredPosition.y - initialPosition.y === 2 * i) {\n if (desiredPosition.x - initialPosition.x === j) {\n if (\n tileIsEmptyOrOccupiedByOpponent(desiredPosition, boardState, team)\n ) {\n return true\n }\n }\n }\n\n // Right and Left Side Movement\n if (desiredPosition.x - initialPosition.x === 2 * i) {\n if (desiredPosition.y - initialPosition.y === j) {\n if (\n tileIsEmptyOrOccupiedByOpponent(desiredPosition, boardState, team)\n ) {\n return true\n }\n }\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Knights to highlight the grids\nexport const getPossibleKnightMoves = (\n knight: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n // Movement and Attack Logic for Knight\n for (let i = -1; i < 2; i += 2) {\n for (let j = -1; j < 2; j += 2) {\n const verticalMove = new Position(\n knight.position.x + j,\n knight.position.y + i * 2\n )\n const horizontalMove = new Position(\n knight.position.x + i * 2,\n knight.position.y + j\n )\n\n if (\n tileIsEmptyOrOccupiedByOpponent(verticalMove, boardState, knight.team)\n ) {\n possibleMoves.push(verticalMove)\n }\n\n if (\n tileIsEmptyOrOccupiedByOpponent(horizontalMove, boardState, knight.team)\n ) {\n possibleMoves.push(horizontalMove)\n }\n }\n }\n\n return possibleMoves\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport {\n tileIsOccupied,\n tileIsOccupiedByOpponent,\n tileIsEmptyOrOccupiedByOpponent,\n} from './GeneralRules'\n\n// Rules to move the Bishops\nexport const bishopMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n // Movement and Attack Logic for Bishop\n for (let i = 1; i < 11; i++) {\n // Top right movement\n if (\n desiredPosition.x > initialPosition.x &&\n desiredPosition.y > initialPosition.y\n ) {\n let passedPosition = new Position(\n initialPosition.x + i,\n initialPosition.y + i\n )\n //Check if the tile is the destination tile\n if (passedPosition.samePosition(desiredPosition)) {\n //Dealing with destination tile\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n //Dealing with passing tile\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n\n // Top left movement\n if (\n desiredPosition.x < initialPosition.x &&\n desiredPosition.y > initialPosition.y\n ) {\n let passedPosition = new Position(\n initialPosition.x - i,\n initialPosition.y + i\n )\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n\n // Bottom right movement\n if (\n desiredPosition.x > initialPosition.x &&\n desiredPosition.y < initialPosition.y\n ) {\n let passedPosition = new Position(\n initialPosition.x + i,\n initialPosition.y - i\n )\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n\n // Bottom left movement\n if (\n desiredPosition.x < initialPosition.x &&\n desiredPosition.y < initialPosition.y\n ) {\n let passedPosition = new Position(\n initialPosition.x - i,\n initialPosition.y - i\n )\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Bishops to highlight the grids\nexport const getPossibleBishopMoves = (\n bishop: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n // Upper right movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(\n bishop.position.x + i,\n bishop.position.y + i\n )\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, bishop.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom right movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(\n bishop.position.x + i,\n bishop.position.y - i\n )\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, bishop.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom left movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(\n bishop.position.x - i,\n bishop.position.y - i\n )\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, bishop.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Top left movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(\n bishop.position.x - i,\n bishop.position.y + i\n )\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, bishop.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n return possibleMoves\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport {\n tileIsOccupied,\n tileIsOccupiedByOpponent,\n tileIsEmptyOrOccupiedByOpponent,\n} from './GeneralRules'\n\n// Rules to move the Rooks\nexport const rookMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n // Vertical Movement\n if (initialPosition.x === desiredPosition.x) {\n for (let i = 1; i < 14; i++) {\n let multiplier = desiredPosition.y < initialPosition.y ? -1 : 1\n\n let passedPosition = new Position(\n initialPosition.x,\n initialPosition.y + i * multiplier\n )\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n }\n\n // Horizontal Movement\n if (initialPosition.y === desiredPosition.y) {\n for (let i = 1; i < 14; i++) {\n let multiplier = desiredPosition.x < initialPosition.x ? -1 : 1\n\n let passedPosition = new Position(\n initialPosition.x + i * multiplier,\n initialPosition.y\n )\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Rooks to highlight the grids\nexport const getPossibleRookMoves = (\n rook: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n // Top movement\n for (let i = 1; i < 14; i++) {\n // Stop checking if move is outside of the board\n if (rook.position.x < 3 && rook.position.y + i > 10) break\n if (rook.position.x > 10 && rook.position.y + i > 10) break\n\n const destination = new Position(rook.position.x, rook.position.y + i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, rook.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom movement\n for (let i = 1; i < 14; i++) {\n // Stop checking if move is outside of the board\n if (rook.position.x < 3 && rook.position.y - i < 3) break\n if (rook.position.x > 10 && rook.position.y - i < 3) break\n\n const destination = new Position(rook.position.x, rook.position.y - i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, rook.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Left movement\n for (let i = 1; i < 14; i++) {\n // Stop checking if move is outside of the board\n if (rook.position.y < 3 && rook.position.x - i < 3) break\n if (rook.position.y > 10 && rook.position.x - i < 3) break\n\n const destination = new Position(rook.position.x - i, rook.position.y)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, rook.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Right movement\n for (let i = 1; i < 14; i++) {\n // Stop checking if move is outside of the board\n if (rook.position.y < 3 && rook.position.x + i > 10) break\n if (rook.position.y > 10 && rook.position.x + i > 10) break\n\n const destination = new Position(rook.position.x + i, rook.position.y)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, rook.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n return possibleMoves\n}\n","import { Piece, Position } from '../models'\nimport { TeamType } from '../Types'\nimport {\n tileIsOccupied,\n tileIsOccupiedByOpponent,\n tileIsEmptyOrOccupiedByOpponent,\n} from './GeneralRules'\n\n// Rules to move the Queens\nexport const queenMove = (\n initialPosition: Position,\n desiredPosition: Position,\n team: TeamType,\n boardState: Piece[]\n): boolean => {\n // Checking for queen moves\n for (let i = 1; i < 14; i++) {\n let multiplierX =\n desiredPosition.x < initialPosition.x\n ? -1\n : desiredPosition.x > initialPosition.x\n ? 1\n : 0\n let multiplierY =\n desiredPosition.y < initialPosition.y\n ? -1\n : desiredPosition.y > initialPosition.y\n ? 1\n : 0\n\n let passedPosition = new Position(\n initialPosition.x + i * multiplierX,\n initialPosition.y + i * multiplierY\n )\n\n // Checking if the tile is occupied/empty\n if (passedPosition.samePosition(desiredPosition)) {\n if (tileIsEmptyOrOccupiedByOpponent(passedPosition, boardState, team)) {\n return true\n }\n } else {\n if (tileIsOccupied(passedPosition, boardState)) {\n break\n }\n }\n }\n\n return false\n}\n\n// Checking possible moves for the Queens to highlight the grids\nexport const getPossibleQueenMoves = (\n queen: Piece,\n boardState: Piece[]\n): Position[] => {\n const possibleMoves: Position[] = []\n\n // Top movement\n for (let i = 1; i < 14; i++) {\n const destination = new Position(queen.position.x, queen.position.y + i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom movement\n for (let i = 1; i < 14; i++) {\n const destination = new Position(queen.position.x, queen.position.y - i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Left movement\n for (let i = 1; i < 14; i++) {\n const destination = new Position(queen.position.x - i, queen.position.y)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Right movement\n for (let i = 1; i < 14; i++) {\n const destination = new Position(queen.position.x + i, queen.position.y)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Upper right movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(queen.position.x + i, queen.position.y + i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom right movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(queen.position.x + i, queen.position.y - i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Bottom left movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(queen.position.x - i, queen.position.y - i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n // Top left movement\n for (let i = 1; i < 11; i++) {\n const destination = new Position(queen.position.x - i, queen.position.y + i)\n\n if (!tileIsOccupied(destination, boardState)) {\n possibleMoves.push(destination)\n } else if (tileIsOccupiedByOpponent(destination, boardState, queen.team)) {\n possibleMoves.push(destination)\n break\n } else {\n break\n }\n }\n\n return possibleMoves\n}\n","import { PieceType, TeamType } from '../Types'\nimport { Position } from './Position'\n\n// Exporting the piece class\nexport class Piece {\n image: string\n position: Position\n type: PieceType\n team: TeamType\n possibleMoves?: Position[]\n hasMoved: boolean\n\n constructor(\n position: Position,\n type: PieceType,\n team: TeamType,\n hasMoved: boolean,\n possibleMoves: Position[] = []\n ) {\n this.image = `assets/images/${team}${type}.png`\n this.position = position\n this.type = type\n this.team = team\n this.possibleMoves = possibleMoves\n this.hasMoved = hasMoved\n }\n\n get isPawn(): boolean {\n return this.type === PieceType.PAWN\n }\n\n get isRook(): boolean {\n return this.type === PieceType.ROOK\n }\n\n get isKing(): boolean {\n return this.type === PieceType.KING\n }\n\n // function for same piece position\n samePiecePosition(otherPiece: Piece): boolean {\n return this.position.samePosition(otherPiece.position)\n }\n\n // function for comparing same position\n samePosition(otherPosition: Position): boolean {\n return this.position.samePosition(otherPosition)\n }\n\n // cloning piece\n clone(): Piece {\n return new Piece(\n this.position.clone(),\n this.type,\n this.team,\n this.hasMoved,\n this.possibleMoves?.map((m) => m.clone())\n )\n }\n}\n","export class Position {\n x: number\n y: number\n\n constructor(x: number, y: number) {\n this.x = x\n this.y = y\n }\n\n samePosition(otherPosition: Position): boolean {\n return this.x === otherPosition.x && this.y === otherPosition.y\n }\n\n clone(): Position {\n return new Position(this.x, this.y)\n }\n}\n","import './Tile.css'\n\n// Interface for deciding the types\ninterface Props {\n image?: string\n num_i: number\n num_j: number\n highlight: boolean\n}\n\nexport default function Tile({ num_i, num_j, image, highlight }: Props) {\n const className: string = [\n 'tile',\n (num_i + num_j) % 2 === 0 && 'dark-tile', // Dark Tiles\n (num_i + num_j) % 2 !== 0 && 'light-tile', // Light Tiles\n highlight && 'tile-highlight', // Highlighting the tiles with possible moves\n image && 'chess-piece-tile', // Highlighting the tiles with attacked chess pieces\n ]\n .filter(Boolean)\n .join(' ')\n\n // Useless tiles\n // Useless tiles are those tiles which are at the corners of the 'squared' chess board\n if (\n (num_i < 3 && num_j < 3) ||\n (num_i > 10 && num_j < 3) ||\n (num_i > 10 && num_j > 10) ||\n (num_i < 3 && num_j > 10)\n ) {\n return \n }\n\n // Chessboard tiles\n else {\n return (\n \n )\n }\n}\n","import { Board, Piece, Position } from './models'\nimport { PieceType, TeamType } from './Types'\n\n// Axes\nexport const VERTICAL_AXIS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\nexport const HORIZONTAL_AXIS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]\n\n// Grid Size\nexport const GRID_SIZE = 50\n\n// InitialBoardState\nexport const initialBoard: Board = new Board(\n [\n // Red Pieces\n new Piece(new Position(3, 0), PieceType.ROOK, TeamType.RED, false),\n new Piece(new Position(4, 0), PieceType.KNIGHT, TeamType.RED, false),\n new Piece(new Position(5, 0), PieceType.BISHOP, TeamType.RED, false),\n new Piece(new Position(6, 0), PieceType.QUEEN, TeamType.RED, false),\n new Piece(new Position(7, 0), PieceType.KING, TeamType.RED, false),\n new Piece(new Position(8, 0), PieceType.BISHOP, TeamType.RED, false),\n new Piece(new Position(9, 0), PieceType.KNIGHT, TeamType.RED, false),\n new Piece(new Position(10, 0), PieceType.ROOK, TeamType.RED, false),\n // Pawns\n new Piece(new Position(3, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(4, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(5, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(6, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(7, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(8, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(9, 1), PieceType.PAWN, TeamType.RED, false),\n new Piece(new Position(10, 1), PieceType.PAWN, TeamType.RED, false),\n\n // Yellow Pieces\n new Piece(new Position(3, 13), PieceType.ROOK, TeamType.YELLOW, false),\n new Piece(new Position(4, 13), PieceType.KNIGHT, TeamType.YELLOW, false),\n new Piece(new Position(5, 13), PieceType.BISHOP, TeamType.YELLOW, false),\n new Piece(new Position(6, 13), PieceType.KING, TeamType.YELLOW, false),\n new Piece(new Position(7, 13), PieceType.QUEEN, TeamType.YELLOW, false),\n new Piece(new Position(8, 13), PieceType.BISHOP, TeamType.YELLOW, false),\n new Piece(new Position(9, 13), PieceType.KNIGHT, TeamType.YELLOW, false),\n new Piece(new Position(10, 13), PieceType.ROOK, TeamType.YELLOW, false),\n // Pawns\n new Piece(new Position(3, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(4, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(5, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(6, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(7, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(8, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(9, 12), PieceType.PAWN, TeamType.YELLOW, false),\n new Piece(new Position(10, 12), PieceType.PAWN, TeamType.YELLOW, false),\n\n // BLUE Pieces\n new Piece(new Position(0, 3), PieceType.ROOK, TeamType.BLUE, false),\n new Piece(new Position(0, 4), PieceType.KNIGHT, TeamType.BLUE, false),\n new Piece(new Position(0, 5), PieceType.BISHOP, TeamType.BLUE, false),\n new Piece(new Position(0, 6), PieceType.QUEEN, TeamType.BLUE, false),\n new Piece(new Position(0, 7), PieceType.KING, TeamType.BLUE, false),\n new Piece(new Position(0, 8), PieceType.BISHOP, TeamType.BLUE, false),\n new Piece(new Position(0, 9), PieceType.KNIGHT, TeamType.BLUE, false),\n new Piece(new Position(0, 10), PieceType.ROOK, TeamType.BLUE, false),\n // Pawns\n new Piece(new Position(1, 3), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 4), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 5), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 6), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 7), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 8), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 9), PieceType.PAWN, TeamType.BLUE, false),\n new Piece(new Position(1, 10), PieceType.PAWN, TeamType.BLUE, false),\n\n // Green Pieces\n new Piece(new Position(13, 3), PieceType.ROOK, TeamType.GREEN, false),\n new Piece(new Position(13, 4), PieceType.KNIGHT, TeamType.GREEN, false),\n new Piece(new Position(13, 5), PieceType.BISHOP, TeamType.GREEN, false),\n new Piece(new Position(13, 6), PieceType.KING, TeamType.GREEN, false),\n new Piece(new Position(13, 7), PieceType.QUEEN, TeamType.GREEN, false),\n new Piece(new Position(13, 8), PieceType.BISHOP, TeamType.GREEN, false),\n new Piece(new Position(13, 9), PieceType.KNIGHT, TeamType.GREEN, false),\n new Piece(new Position(13, 10), PieceType.ROOK, TeamType.GREEN, false),\n // Pawns\n new Piece(new Position(12, 3), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 4), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 5), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 6), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 7), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 8), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 9), PieceType.PAWN, TeamType.GREEN, false),\n new Piece(new Position(12, 10), PieceType.PAWN, TeamType.GREEN, false),\n ],\n 1\n)\n\ninitialBoard.calculateAllMoves()\n","import './Chessboard.css'\nimport PlayerName from '../PlayerName/PlayerName'\nimport { Piece, Position } from '../../models'\nimport Tile from '../Tile/Tile'\nimport { useRef, useState } from 'react'\nimport { VERTICAL_AXIS, HORIZONTAL_AXIS, GRID_SIZE } from '../../Constants'\n\n// Interface deciding the types\ninterface Props {\n playMove: (piece: Piece, position: Position) => boolean\n pieces: Piece[]\n whoseTurn: number\n}\n\nexport default function Chessboard({ playMove, pieces, whoseTurn }: Props) {\n // Declaring Constants\n const [activePiece, setActivePiece] = useState(null)\n const [grabPosition, setGrabPosition] = useState(\n new Position(-1, -1)\n )\n const chessboardRef = useRef(null)\n\n // Function when player grabs a piece\n function grabPiece(e: React.MouseEvent) {\n // Grabbing the pieces off the chessboard\n const chessboard = chessboardRef.current\n const element = e.target as HTMLElement\n\n if (element.classList.contains('chess-piece') && chessboard) {\n const grabX = Math.floor((e.clientX - chessboard.offsetLeft) / GRID_SIZE)\n const grabY = Math.abs(\n Math.abs(\n Math.ceil((e.clientY - chessboard.offsetTop - 700) / GRID_SIZE)\n )\n )\n\n setGrabPosition(new Position(grabX, grabY))\n\n const x = e.clientX - GRID_SIZE / 2\n const y = e.clientY - GRID_SIZE / 2\n\n element.style.position = 'absolute'\n element.style.left = `${x}px`\n element.style.top = `${y}px`\n\n setActivePiece(element)\n }\n }\n\n // Function when player tries to move a piece\n function movePiece(e: React.MouseEvent) {\n const chessboard = chessboardRef.current\n\n if (activePiece && chessboard) {\n // Declaring constants for restricting the pieces\n const leftX = chessboard.offsetLeft - 4\n const midleftX =\n chessboard.offsetLeft + (chessboard.clientWidth / 14) * 3 - 4\n const topY = chessboard.offsetTop - 4\n const midtopY =\n chessboard.offsetTop + (chessboard.clientHeight / 14) * 3 - 4\n const rightX = chessboard.offsetLeft + chessboard.clientWidth - 46\n const midrightX =\n chessboard.offsetLeft -\n (chessboard.clientWidth / 14) * 3 +\n chessboard.clientWidth -\n 46\n const bottomY = chessboard.offsetTop + chessboard.clientHeight - 46\n const midbottomY =\n chessboard.offsetTop -\n (chessboard.clientHeight / 14) * 3 +\n chessboard.clientHeight -\n 46\n const x = e.clientX - GRID_SIZE / 2\n const y = e.clientY - GRID_SIZE / 2\n activePiece.style.position = 'absolute'\n\n // Restricting the x position\n if (x < leftX) {\n activePiece.style.left = `${leftX}px`\n } else if (x > rightX) {\n activePiece.style.left = `${rightX}px`\n } else {\n activePiece.style.left = `${x}px`\n }\n\n // Restricting the y position\n if (y < topY) {\n activePiece.style.top = `${topY}px`\n } else if (y > bottomY) {\n activePiece.style.top = `${bottomY}px`\n } else {\n activePiece.style.top = `${y}px`\n }\n\n // Restricting the cutout portions\n if ((x < midleftX && y > midbottomY) || (x < midleftX && y < midtopY)) {\n activePiece.style.left = `${midleftX}px`\n } else if (\n (x > midrightX && y > midbottomY) ||\n (x > midrightX && y < midtopY)\n ) {\n activePiece.style.left = `${midrightX}px`\n }\n }\n }\n\n // Function when player drops a piece\n function dropPiece(e: React.MouseEvent) {\n const chessboard = chessboardRef.current\n\n // Dropping the pieces on the right grid\n if (activePiece && chessboard) {\n const x = Math.floor((e.clientX - chessboard.offsetLeft) / GRID_SIZE)\n const y = Math.abs(\n Math.ceil((e.clientY - chessboard.offsetTop - 700) / GRID_SIZE)\n )\n\n const currentPiece = pieces.find((p) => p.samePosition(grabPosition))\n\n if (currentPiece) {\n var success = playMove(currentPiece.clone(), new Position(x, y))\n\n if (!success) {\n // Resets the piece position\n activePiece.style.position = 'relative'\n activePiece.style.removeProperty('top')\n activePiece.style.removeProperty('left')\n }\n }\n\n setActivePiece(null)\n }\n }\n\n // Setting the four player chessboard\n let board = []\n\n for (let j = VERTICAL_AXIS.length - 1; j >= 0; j--) {\n for (let i = 0; i < HORIZONTAL_AXIS.length; i++) {\n const num_i = i\n const num_j = j\n const piece = pieces.find((p) => p.samePosition(new Position(i, j)))\n let image = piece ? piece.image : undefined\n\n let currentPiece =\n activePiece != null\n ? pieces.find((p) => p.samePosition(grabPosition))\n : undefined\n\n // For highlighting the attacked pieces\n let highlight = currentPiece?.possibleMoves\n ? currentPiece.possibleMoves.some((p) =>\n p.samePosition(new Position(i, j))\n )\n : false\n\n // Made chessboard with all the 'useful' squares\n board.push(\n \n )\n }\n }\n\n return (\n <>\n movePiece(e)}\n onMouseDown={(e) => grabPiece(e)}\n onMouseUp={(e) => dropPiece(e)}\n id='chessboard'\n ref={chessboardRef}\n >\n {board}\n
\n
\n >\n )\n}\n","import { Board } from '../../models/Board'\nimport Chessboard from '../Chessboard/Chessboard'\nimport { initialBoard } from '../../Constants'\nimport { PieceType, TeamType } from '../../Types'\nimport { Piece, Position } from '../../models'\nimport { useEffect, useRef, useState } from 'react'\nimport {\n bishopMove,\n kingMove,\n knightMove,\n pawnMove,\n queenMove,\n rookMove,\n} from '../../rules'\n\nexport default function Arbiter() {\n // Declaring the constants\n const [board, setBoard] = useState(initialBoard.clone())\n const [promotionPawn, setPromotionPawn] = useState()\n const modalRef = useRef(null)\n const checkmateModalRef = useRef(null)\n\n // Function for playing a move\n function playMove(playedPiece: Piece, destination: Position): boolean {\n if (playedPiece.possibleMoves === undefined) return false\n\n // Checking if the correct team has played the piece\n if (playedPiece.team === TeamType.RED && board.totalTurns % 4 !== 1) {\n return false\n } else if (\n playedPiece.team === TeamType.BLUE &&\n board.totalTurns % 4 !== 2\n ) {\n return false\n } else if (\n playedPiece.team === TeamType.YELLOW &&\n board.totalTurns % 4 !== 3\n ) {\n return false\n } else if (\n playedPiece.team === TeamType.GREEN &&\n board.totalTurns % 4 !== 0\n ) {\n return false\n }\n\n // Checking for valid move\n let playedMoveIsValid = false\n\n const validMove = playedPiece.possibleMoves?.some((m) =>\n m.samePosition(destination)\n )\n\n if (!validMove) return false\n\n // playMove modifies the board state\n setBoard(() => {\n const clonedBoard = board.clone()\n\n // Incrementing the totalTurns when the correct piece is played\n clonedBoard.totalTurns += 1\n\n // Playing a move\n playedMoveIsValid = clonedBoard.playMove(\n validMove,\n playedPiece,\n destination\n )\n\n if (clonedBoard.losingTeam !== undefined) {\n checkmateModalRef.current?.classList.remove('hidden')\n }\n\n return clonedBoard\n })\n\n // Checking if a pawn is promoted\n if (playedPiece.isPawn) {\n if (\n (playedPiece.team === TeamType.RED && destination.y === 7) ||\n (playedPiece.team === TeamType.YELLOW && destination.y === 6) ||\n (playedPiece.team === TeamType.BLUE && destination.x === 7) ||\n (playedPiece.team === TeamType.GREEN && destination.x === 6)\n ) {\n modalRef.current?.classList.remove('hidden')\n setPromotionPawn((previousPromotionPawn) => {\n const clonedPlayedPiece = playedPiece.clone()\n clonedPlayedPiece.position = destination.clone()\n return clonedPlayedPiece\n })\n }\n }\n return playedMoveIsValid\n }\n\n // Checking if the move is valid\n function isValidMove(\n initialPosition: Position,\n desiredPosition: Position,\n type: PieceType,\n team: TeamType\n ) {\n let validMove = false\n\n switch (type) {\n case PieceType.PAWN:\n validMove = pawnMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n break\n case PieceType.KNIGHT:\n validMove = knightMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n break\n case PieceType.BISHOP:\n validMove = bishopMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n break\n case PieceType.ROOK:\n validMove = rookMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n break\n case PieceType.QUEEN:\n validMove = queenMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n break\n case PieceType.KING:\n validMove = kingMove(\n initialPosition,\n desiredPosition,\n team,\n board.pieces\n )\n }\n\n return validMove\n }\n\n // Function to promote a pawn to the desired piece\n function promotePawn(pieceType: PieceType) {\n if (promotionPawn === undefined) {\n return\n }\n\n setBoard((previousBoard) => {\n const clonedBoard = board.clone()\n\n clonedBoard.pieces = clonedBoard.pieces.reduce((results, piece) => {\n if (piece.samePiecePosition(promotionPawn)) {\n results.push(\n new Piece(piece.position.clone(), pieceType, piece.team, true)\n )\n } else {\n results.push(piece)\n }\n\n return results\n }, [] as Piece[])\n\n clonedBoard.calculateAllMoves()\n\n return clonedBoard\n })\n\n // Toggling the modal\n modalRef.current?.classList.add('hidden')\n }\n\n // Deciding the type of color of the pieces when opening the modal\n function promotionTeamType() {\n if (promotionPawn?.team === TeamType.RED) {\n return 'r'\n } else if (promotionPawn?.team === TeamType.BLUE) {\n return 'b'\n } else if (promotionPawn?.team === TeamType.YELLOW) {\n return 'y'\n } else if (promotionPawn?.team === TeamType.GREEN) {\n return 'g'\n }\n }\n\n // Writing the full name of the winning team\n let teamWon = ''\n if (board.losingTeam === TeamType.RED) {\n teamWon = 'Blue, Yellow and Green'\n } else if (board.losingTeam === TeamType.BLUE) {\n teamWon = 'Red, Yellow and Green'\n } else if (board.losingTeam === TeamType.YELLOW) {\n teamWon = 'Red, Blue and Green'\n } else if (board.losingTeam === TeamType.GREEN) {\n teamWon = 'Red, Blue and Green'\n }\n\n function restartGame() {\n checkmateModalRef.current?.classList.add('hidden')\n\n setBoard(initialBoard.clone())\n }\n\n return (\n <>\n \n
\n
promotePawn(PieceType.ROOK)}\n src={`./assets/images/${promotionTeamType()}R.png`}\n alt='Rook'\n />\n
promotePawn(PieceType.KNIGHT)}\n src={`./assets/images/${promotionTeamType()}N.png`}\n alt='Knight'\n />\n
promotePawn(PieceType.BISHOP)}\n src={`./assets/images/${promotionTeamType()}B.png`}\n alt='Bishop'\n />\n
promotePawn(PieceType.QUEEN)}\n src={`./assets/images/${promotionTeamType()}Q.png`}\n alt='Queen'\n />\n
\n
\n\n \n
\n
\n Winning teams: {teamWon}!\n \n
\n
\n
\n\n \n >\n )\n}\n","import './App.css'\nimport Arbiter from './components/Arbiter/Arbiter'\n\n// The app component\nfunction App() {\n return (\n \n )\n}\n\nexport default App\n","import './index.css'\nimport App from './App'\nimport React from 'react'\nimport ReactDOM from 'react-dom/client'\n\nconst root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement)\nroot.render(\n \n \n \n)\n"],"names":["aa","require","ca","p","a","b","c","arguments","length","encodeURIComponent","da","Set","ea","fa","ha","add","ia","window","document","createElement","ja","Object","prototype","hasOwnProperty","ka","la","ma","v","d","e","f","g","this","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","type","sanitizeURL","removeEmptyString","z","split","forEach","toLowerCase","ra","sa","toUpperCase","ta","slice","pa","isNaN","qa","call","test","oa","removeAttribute","setAttribute","setAttributeNS","replace","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","Symbol","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","A","assign","Ma","Error","stack","trim","match","Na","Oa","prepareStackTrace","defineProperty","set","Reflect","construct","l","h","k","displayName","includes","name","Pa","tag","render","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","getOwnPropertyDescriptor","constructor","get","configurable","enumerable","getValue","setValue","stopTracking","Ua","Wa","checked","value","Xa","activeElement","body","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","ownerDocument","eb","Array","isArray","fb","options","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","innerHTML","valueOf","toString","firstChild","removeChild","appendChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","style","indexOf","setProperty","keys","charAt","substring","tb","menuitem","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","ub","vb","is","wb","xb","target","srcElement","correspondingUseElement","parentNode","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","push","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","addEventListener","removeEventListener","Nb","apply","m","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","current","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","Math","clz32","pc","qc","log","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","shift","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","id","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","Date","now","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","data","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","key","String","fromCharCode","code","location","repeat","locale","which","Rd","Td","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","date","datetime","email","month","number","password","range","search","tel","text","time","url","week","me","ne","oe","event","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","node","offset","nextSibling","Le","contains","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","href","Ne","contentEditable","Oe","focusedElem","selectionRange","documentElement","start","end","selectionStart","selectionEnd","min","defaultView","getSelection","extend","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","element","left","scrollLeft","top","scrollTop","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","concat","nf","Ub","instance","listener","D","of","has","pf","qf","rf","random","sf","bind","capture","passive","n","t","J","x","u","w","F","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","unshift","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","setTimeout","Gf","clearTimeout","Hf","Promise","Jf","queueMicrotask","resolve","then","catch","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","E","G","Vf","H","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","defaultProps","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","context","memoizedValue","next","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","ch","eventTime","lane","payload","callback","dh","K","eh","fh","gh","q","r","y","hh","ih","jh","Component","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","L","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","contextType","state","updater","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","props","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","ref","_owner","_stringRef","th","join","uh","vh","index","wh","xh","yh","implementation","zh","Ah","done","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","tagName","Jh","Kh","Lh","M","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","N","O","P","Sh","Th","Uh","Vh","Q","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","queue","di","ei","fi","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","R","ni","lastEffect","stores","oi","pi","qi","ri","create","destroy","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","message","digest","Li","Mi","console","error","Ni","WeakMap","Oi","Pi","Qi","Ri","getDerivedStateFromError","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","compare","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dataset","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","yj","Ej","S","Fj","Gj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","size","createElementNS","autoFocus","createTextNode","T","Hj","Ij","Jj","Kj","U","Lj","WeakSet","V","Mj","W","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","insertBefore","_reactRootContainer","Xj","X","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","display","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","src","Wk","mk","ceil","nk","ok","pk","Y","Z","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","cache","pendingSuspenseBoundaries","dl","el","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","splice","querySelectorAll","JSON","stringify","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","version","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","isDisabled","supportsFiber","inject","exports","createPortal","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","err","module","__self","__source","Fragment","jsx","jsxs","setState","forceUpdate","escape","_status","_result","default","Children","map","count","toArray","only","Profiler","PureComponent","StrictMode","Suspense","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","pop","sortIndex","performance","setImmediate","startTime","expirationTime","priorityLevel","navigator","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","floor","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","_arrayLikeToArray","arr","len","i","arr2","_unsupportedIterableToArray","o","minLen","from","_slicedToArray","_i","_s","_e","_x","_r","_arr","_n","_d","TypeError","PieceType","TeamType","PlayerName","whoseTurn","red","yellow","blue","green","className","_toConsumableArray","iter","_createForOfIteratorHelper","allowArrayLike","it","s","normalCompletion","didErr","step","_e2","_classCallCheck","Constructor","_typeof","obj","_toPropertyKey","arg","hint","prim","toPrimitive","res","Number","_defineProperties","descriptor","writable","_createClass","protoProps","staticProps","tileIsOccupied","position","boardState","find","samePosition","tileIsOccupiedByOpponent","team","tileIsEmptyOrOccupiedByOpponent","getCastlingMoves","king","possibleMoves","hasMoved","filter","isRook","rook","direction","RED","YELLOW","adjacentPosition","clone","some","concerningTiles","enemyPieces","valid","enemy","move","Board","pieces","totalTurns","losingTeam","BLUE","GREEN","piece","getValidMoves","isKing","checkCurrentTeamMoves","currentTeam","simulatedBoard","samePiecePosition","clonedKing","isPawn","PAWN","pawn","specialRow","pawnDirection","normalMove","Position","specialMove","upperLeftAttack","upperRightAttack","getPossiblePawnMoves","KNIGHT","knight","j","verticalMove","horizontalMove","getPossibleKnightMoves","BISHOP","bishop","destination","getPossibleBishopMoves","ROOK","getPossibleRookMoves","QUEEN","queen","getPossibleQueenMoves","KING","getPossibleKingMoves","validMove","playedPiece","destinationPiece","newKingXPosition","newKingYPosition","calculateAllMoves","reduce","results","Piece","image","otherPiece","otherPosition","Tile","num_i","num_j","highlight","Boolean","backgroundImage","VERTICAL_AXIS","HORIZONTAL_AXIS","GRID_SIZE","initialBoard","Chessboard","playMove","activePiece","setActivePiece","grabPosition","setGrabPosition","chessboardRef","board","currentPiece","onMouseMove","chessboard","leftX","offsetLeft","midleftX","clientWidth","topY","offsetTop","midtopY","clientHeight","rightX","midrightX","bottomY","midbottomY","movePiece","onMouseDown","classList","grabX","grabY","abs","grabPiece","onMouseUp","removeProperty","dropPiece","Arbiter","setBoard","promotionPawn","setPromotionPawn","modalRef","checkmateModalRef","promotePawn","pieceType","previousBoard","clonedBoard","promotionTeamType","teamWon","alt","playedMoveIsValid","remove","previousPromotionPawn","clonedPlayedPiece","ReactDOM","getElementById"],"sourceRoot":""}
\ No newline at end of file