check-board 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.MD +0 -0
- package/dist/assets/BlackBishop.svg +1 -0
- package/dist/assets/BlackKing.svg +1 -0
- package/dist/assets/BlackKnight.svg +1 -0
- package/dist/assets/BlackPawn.svg +1 -0
- package/dist/assets/BlackQueen.svg +1 -0
- package/dist/assets/BlackRook.svg +1 -0
- package/dist/assets/WhiteBishop.svg +1 -0
- package/dist/assets/WhiteKing.svg +1 -0
- package/dist/assets/WhiteKnight.svg +1 -0
- package/dist/assets/WhitePawn.svg +1 -0
- package/dist/assets/WhiteQueen.svg +1 -0
- package/dist/assets/WhiteRook.svg +1 -0
- package/dist/assets/clock.svg +42 -0
- package/dist/assets/index.d.ts +12 -0
- package/dist/assets/index.ts +12 -0
- package/dist/check-board.cjs.js +23 -0
- package/dist/check-board.cjs.js.map +1 -0
- package/dist/check-board.es.js +3664 -0
- package/dist/check-board.es.js.map +1 -0
- package/dist/check-board.umd.js +23 -0
- package/dist/check-board.umd.js.map +1 -0
- package/dist/components/board.d.ts +3 -0
- package/dist/components/boardEngine.d.ts +5 -0
- package/dist/engine/boardRuntime/boardEvents.d.ts +11 -0
- package/dist/engine/boardRuntime/boardRuntime.d.ts +17439 -0
- package/dist/engine/boardRuntime/pipelineRender.d.ts +20 -0
- package/dist/engine/client/client.d.ts +65 -0
- package/dist/engine/client/imperativeHandle.d.ts +6 -0
- package/dist/engine/client/interface.d.ts +35 -0
- package/dist/engine/eventEmitter/eventEmitter.d.ts +10 -0
- package/dist/engine/eventEmitter/interface.d.ts +4 -0
- package/dist/engine/helpers/engineHelpers.d.ts +41 -0
- package/dist/engine/helpers/pieceHelpers.d.ts +26 -0
- package/dist/engine/helpers/pointerEventsHelpers.d.ts +36 -0
- package/dist/engine/iterators/iterators.d.ts +16 -0
- package/dist/engine/layers/baseLayer.d.ts +74 -0
- package/dist/engine/layers/boardLayer.d.ts +8 -0
- package/dist/engine/layers/canvasLayers.d.ts +44 -0
- package/dist/engine/layers/dynamicPiecesLayer.d.ts +16 -0
- package/dist/engine/layers/events.d.ts +29 -0
- package/dist/engine/layers/interface.d.ts +16 -0
- package/dist/engine/layers/layerManager.d.ts +45 -0
- package/dist/engine/layers/overlayLayer.d.ts +8 -0
- package/dist/engine/layers/spatialIndex.d.ts +23 -0
- package/dist/engine/layers/spatialNode.d.ts +8 -0
- package/dist/engine/layers/staticPieces.d.ts +14 -0
- package/dist/engine/layers/underlayLayer.d.ts +8 -0
- package/dist/engine/render/interface.d.ts +12 -0
- package/dist/engine/render/pipelineRender.d.ts +20 -0
- package/dist/engine/render/renderer2D.d.ts +19 -0
- package/dist/engine/render/renderer3D.d.ts +15 -0
- package/dist/index.d.ts +3 -0
- package/dist/types/board.d.ts +83 -0
- package/dist/types/draw.d.ts +78 -0
- package/dist/types/events.d.ts +142 -0
- package/dist/types/helpers.d.ts +20 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/piece.d.ts +29 -0
- package/dist/types/square.d.ts +9 -0
- package/dist/types/utils.d.ts +5 -0
- package/dist/utils/utils.d.ts +46 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-board.umd.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/utils/utils.ts","../src/engine/layers/canvasLayers.ts","../src/components/board.tsx","../src/types/piece.ts","../src/engine/boardRuntime/boardEvents.ts","../src/assets/WhitePawn.svg","../src/assets/WhiteBishop.svg","../src/assets/WhiteKnight.svg","../src/assets/WhiteRook.svg","../src/assets/WhiteQueen.svg","../src/assets/WhiteKing.svg","../src/assets/BlackPawn.svg","../src/assets/BlackBishop.svg","../src/assets/BlackKnight.svg","../src/assets/BlackRook.svg","../src/assets/BlackQueen.svg","../src/assets/BlackKing.svg","../src/engine/helpers/pieceHelpers.ts","../src/engine/helpers/pointerEventsHelpers.ts","../src/engine/helpers/engineHelpers.ts","../src/engine/layers/spatialIndex.ts","../src/engine/layers/spatialNode.ts","../src/engine/layers/baseLayer.ts","../src/engine/layers/boardLayer.ts","../src/engine/layers/underlayLayer.ts","../src/engine/layers/staticPieces.ts","../src/engine/layers/dynamicPiecesLayer.ts","../src/engine/layers/overlayLayer.ts","../src/engine/iterators/iterators.ts","../src/engine/layers/events.ts","../src/engine/layers/layerManager.ts","../src/engine/render/pipelineRender.ts","../src/engine/render/renderer2D.ts","../src/engine/render/renderer3D.ts","../src/engine/eventEmitter/eventEmitter.ts","../src/engine/boardRuntime/boardRuntime.ts","../src/engine/client/client.ts","../src/engine/client/imperativeHandle.ts","../src/components/boardEngine.tsx","../src/types/events.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { TCanvasCoords, TDrawRegion, TSafeCtx } from \"../types/draw\";\r\nimport { IRenderer } from \"../engine/render/interface\";\r\nimport { TSquare, TFile, TRank, TNotation } from \"../types/square\";\r\nimport { TDeepReadonly } from \"../types/utils\";\r\nimport { TPiece, TPieceBoard, TPieceId } from \"../types/piece\";\r\nimport BoardRuntime from \"engine/boardRuntime/boardRuntime\";\r\n\r\nclass Utils {\r\n static files = \"abcdefgh\";\r\n private static P1 = 73856093;\r\n private static P2 = 19349663;\r\n private static P3 = 83492791;\r\n private static P4 = 1640531513;\r\n private constructor() {}\r\n\r\n static getHashingNumbers() {\r\n const { P1, P2, P3, P4 } = this;\r\n return { P1, P2, P3, P4 };\r\n }\r\n\r\n static squareToCoords(\r\n square: TSquare | null,\r\n squareSize: number,\r\n isBlackView: boolean\r\n ) {\r\n if (square) {\r\n const file = this.files.indexOf(square.file);\r\n const rank = square.rank - 1;\r\n if (!isBlackView) {\r\n return {\r\n x: Math.floor(file * squareSize),\r\n y: Math.floor((7 - rank) * squareSize),\r\n };\r\n }\r\n return {\r\n x: Math.floor((7 - file) * squareSize),\r\n y: Math.floor(rank * squareSize),\r\n };\r\n }\r\n }\r\n\r\n static coordsToSquare = (\r\n x: number,\r\n y: number,\r\n squareSize: number,\r\n isBlackView: boolean\r\n ): TSquare | null => {\r\n let file = Math.floor(x / squareSize);\r\n let rank = 7 - Math.floor(y / squareSize);\r\n if (file < 0 || file > 7 || rank < 0 || rank > 8) return null;\r\n if (isBlackView) {\r\n file = 7 - Math.floor(x / squareSize);\r\n rank = Math.floor(y / squareSize);\r\n }\r\n const file_ = this.files[file] as TFile, //toFile(files[file]),\r\n rank_ = (rank + 1) as TRank; //toRank(rank + 1);\r\n\r\n if (file_ && rank_)\r\n return { file: file_, rank: rank_, notation: `${file_}${rank_}` };\r\n return null;\r\n };\r\n\r\n static notationToSquare(notation: TNotation): TSquare | null {\r\n if (notation.length !== 2) return null;\r\n\r\n const file = notation.charAt(0);\r\n const rank = parseInt(notation.charAt(1));\r\n\r\n if (!/^[a-h]$/.test(file)) return null;\r\n else if (rank < 1 || rank > 8) return null;\r\n\r\n return { file, rank, notation } as TSquare;\r\n }\r\n\r\n static getCanvasCoords = (e: React.PointerEvent<HTMLCanvasElement>) => {\r\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n\r\n return { offsetX: x, offsetY: y };\r\n };\r\n\r\n static async asyncHandler(\r\n fun: (arg: (value: void | PromiseLike<void>) => void) => void\r\n ): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n fun(resolve);\r\n });\r\n }\r\n\r\n static deepFreeze<T>(obj: T): TDeepReadonly<T> {\r\n const obj_ = structuredClone(obj);\r\n if (obj_ === null || typeof obj_ !== \"object\" || Object.isFrozen(obj_))\r\n return obj_ as TDeepReadonly<T>;\r\n\r\n if (obj_ instanceof Array) {\r\n obj_.forEach((val, i) => {\r\n (obj_ as any)[i] = this.deepFreeze(val);\r\n });\r\n } else if (obj_ instanceof Map) {\r\n obj_.forEach((val, key) => {\r\n obj_.set(this.deepFreeze(key), this.deepFreeze(val));\r\n });\r\n } else if (obj_ instanceof Set) {\r\n const val = Array.from(obj_).map(this.deepFreeze);\r\n obj_.clear();\r\n val.forEach((val) => obj_.add(val));\r\n } else {\r\n Object.getOwnPropertyNames(obj_).forEach((prop) => {\r\n const value = (obj_ as any)[prop];\r\n (obj_ as any)[prop] = this.deepFreeze(value);\r\n });\r\n }\r\n return Object.freeze(obj_) as TDeepReadonly<T>;\r\n }\r\n\r\n static parseFen(fen: string) {\r\n fen = fen.trim();\r\n\r\n const isValidFen = this.validateFen(fen);\r\n if (!isValidFen.status) return {} as Record<TPiece, TNotation[]>;\r\n const ranks = fen.split(\"/\");\r\n const isDigit = /^[1-8]$/;\r\n const isWhite = /^[PNBRQK]$/;\r\n const files = \"abcdefgh\";\r\n\r\n const map: Record<TPiece, TNotation[]> = {} as Record<TPiece, TNotation[]>;\r\n\r\n let rankNumber = 8;\r\n\r\n for (const rank of ranks) {\r\n let fileIndex = 0;\r\n for (const ch of rank) {\r\n if (isDigit.test(ch)) {\r\n fileIndex += Number(ch);\r\n continue;\r\n }\r\n\r\n const isWhitePiece = isWhite.test(ch);\r\n const file_ = files[fileIndex] as TFile;\r\n const rank_ = rankNumber as TRank;\r\n const type = `${isWhitePiece ? \"w\" : \"b\"}${ch.toUpperCase()}` as TPiece;\r\n const notation = `${file_}${rank_}` as TNotation;\r\n\r\n if (!map[type]) map[type] = [];\r\n map[type].push(notation);\r\n fileIndex++;\r\n }\r\n rankNumber--;\r\n }\r\n return map;\r\n }\r\n\r\n static parseBoard(board: Record<TNotation, TPieceBoard>) {\r\n const files = \"abcdefgh\";\r\n\r\n let fen = \"\";\r\n for (let rank = 8; rank >= 1; rank--) {\r\n let empty = 0;\r\n for (const file of files) {\r\n const sq = `${file}${rank}` as TNotation;\r\n const piece = board[sq];\r\n\r\n if (piece) {\r\n if (empty > 0) {\r\n fen += empty;\r\n empty = 0;\r\n }\r\n const isWhite = piece.type.startsWith(\"w\");\r\n const ch = isWhite ? piece.type[1] : piece.type[1].toLowerCase();\r\n\r\n fen += ch;\r\n } else empty++;\r\n }\r\n if (empty > 0) fen += empty;\r\n if (rank !== 1) fen += \"/\";\r\n }\r\n return fen;\r\n }\r\n\r\n static validateFen(fen: string) {\r\n fen = fen.trim();\r\n if (!/^(?:[pnbrqkPNBRQK1-8]+\\/){7}[pnbrqkPNBRQK1-8]+$/.test(fen))\r\n return { status: false, error: \"Invalid format or characters\" };\r\n\r\n const ranks = fen.split(\"/\");\r\n if (ranks.length !== 8)\r\n return { status: false, error: \"Must contain exactly 8 ranks\" };\r\n\r\n const isDigit = /^[1-8]$/;\r\n const isPiece = /^[pnbrqkPNBRQK]$/;\r\n\r\n for (const rank of ranks) {\r\n let count = 0;\r\n for (const ch of rank) {\r\n if (isDigit.test(ch)) count += Number(ch);\r\n else if (isPiece.test(ch)) count += 1;\r\n else return { status: false, error: `Invalid char '${ch}'` };\r\n }\r\n if (count !== 8)\r\n return { status: false, error: `Rank '${rank}' does not sum to 8` };\r\n }\r\n return { status: true };\r\n }\r\n\r\n static createBaseCtx(ctx: CanvasRenderingContext2D) {\r\n const cache = new Map<PropertyKey, any>();\r\n let currentPath: { x: number; y: number }[] = [];\r\n const recordedRegions: TDrawRegion[] = [];\r\n const actualRegions: TCanvasCoords[] = [];\r\n\r\n // ---- NOVO: expansão automática pelo shadow ----\r\n function expandForShadow(x: number, y: number, w: number, h: number) {\r\n const blur = ctx.shadowBlur || 0;\r\n const ox = ctx.shadowOffsetX || 0;\r\n const oy = ctx.shadowOffsetY || 0;\r\n\r\n const padX = Math.abs(ox) + blur;\r\n const padY = Math.abs(oy) + blur;\r\n\r\n return {\r\n x: x - padX,\r\n y: y - padY,\r\n w: w + padX * 2,\r\n h: h + padY * 2,\r\n };\r\n }\r\n\r\n // ---- MODIFICADO: utiliza expandForShadow() ----\r\n function recordRegion(\r\n type: string,\r\n x: number,\r\n y: number,\r\n w: number,\r\n h: number\r\n ) {\r\n if (!Number.isFinite(x) || !Number.isFinite(y) || w <= 0 || h <= 0)\r\n return;\r\n\r\n const s = expandForShadow(x, y, w, h);\r\n\r\n recordedRegions.push({\r\n x: s.x,\r\n y: s.y,\r\n w: s.w,\r\n h: s.h,\r\n type,\r\n });\r\n }\r\n\r\n function recordActualRegion(x: number, y: number, w: number, h: number) {\r\n if (!Number.isFinite(x) || !Number.isFinite(y) || w <= 0 || h <= 0)\r\n return;\r\n\r\n actualRegions.push({\r\n x,\r\n y,\r\n w,\r\n h,\r\n });\r\n }\r\n\r\n function sampleQuadratic(p0: any, p1: any, p2: any, step = 0.05) {\r\n const pts: { x: number; y: number }[] = [];\r\n for (let t = 0; t <= 1.001; t += step) {\r\n const x =\r\n (1 - t) * (1 - t) * p0.x + 2 * (1 - t) * t * p1.x + t * t * p2.x;\r\n const y =\r\n (1 - t) * (1 - t) * p0.y + 2 * (1 - t) * t * p1.y + t * t * p2.y;\r\n pts.push({ x, y });\r\n }\r\n return pts;\r\n }\r\n\r\n function sampleBezier(p0: any, p1: any, p2: any, p3: any, step = 0.05) {\r\n const pts: { x: number; y: number }[] = [];\r\n for (let t = 0; t <= 1.001; t += step) {\r\n const x =\r\n Math.pow(1 - t, 3) * p0.x +\r\n 3 * Math.pow(1 - t, 2) * t * p1.x +\r\n 3 * (1 - t) * Math.pow(t, 2) * p2.x +\r\n Math.pow(t, 3) * p3.x;\r\n const y =\r\n Math.pow(1 - t, 3) * p0.y +\r\n 3 * Math.pow(1 - t, 2) * t * p1.y +\r\n 3 * (1 - t) * Math.pow(t, 2) * p2.y +\r\n Math.pow(t, 3) * p3.y;\r\n pts.push({ x, y });\r\n }\r\n return pts;\r\n }\r\n\r\n function getFontSize(ctx: CanvasRenderingContext2D): number {\r\n const font = ctx.font;\r\n const match = font.match(/(\\d+(?:\\.\\d+)?)px/);\r\n return match ? parseFloat(match[1]) : 16;\r\n }\r\n\r\n const baseCtx = new Proxy(ctx, {\r\n get(target, prop: string) {\r\n if (cache.has(prop)) return cache.get(prop);\r\n const value = (target as any)[prop];\r\n\r\n if (typeof value !== \"function\") {\r\n cache.set(prop, value);\r\n return value;\r\n }\r\n\r\n const wrapped = (...args: any[]) => {\r\n try {\r\n switch (prop) {\r\n case \"beginPath\":\r\n currentPath = [];\r\n break;\r\n\r\n case \"moveTo\":\r\n case \"lineTo\": {\r\n const [x, y] = args;\r\n if (Number.isFinite(x) && Number.isFinite(y))\r\n currentPath.push({ x, y });\r\n break;\r\n }\r\n\r\n case \"rect\": {\r\n const [x, y, w, h] = args;\r\n recordRegion(prop, x, y, w, h);\r\n currentPath.push({ x, y }, { x: x + w, y: y + h });\r\n break;\r\n }\r\n\r\n case \"arc\": {\r\n const [x, y, r] = args;\r\n if (\r\n Number.isFinite(x) &&\r\n Number.isFinite(y) &&\r\n Number.isFinite(r)\r\n ) {\r\n recordRegion(prop, x - r, y - r, r * 2, r * 2);\r\n currentPath.push(\r\n { x: x - r, y: y - r },\r\n { x: x + r, y: y + r }\r\n );\r\n }\r\n break;\r\n }\r\n\r\n case \"ellipse\": {\r\n const [x, y, rx, ry] = args;\r\n if (Number.isFinite(x) && Number.isFinite(y) && rx && ry) {\r\n recordRegion(prop, x - rx, y - ry, rx * 2, ry * 2);\r\n currentPath.push(\r\n { x: x - rx, y: y - ry },\r\n { x: x + rx, y: y + ry }\r\n );\r\n }\r\n break;\r\n }\r\n\r\n case \"quadraticCurveTo\": {\r\n const [cx, cy, x, y] = args;\r\n const last = currentPath[currentPath.length - 1];\r\n if (last && Number.isFinite(cx) && Number.isFinite(cy)) {\r\n const pts = sampleQuadratic(last, { x: cx, y: cy }, { x, y });\r\n currentPath.push(...pts);\r\n } else {\r\n currentPath.push({ x, y });\r\n }\r\n break;\r\n }\r\n\r\n case \"bezierCurveTo\": {\r\n const [cx1, cy1, cx2, cy2, x, y] = args;\r\n const last = currentPath[currentPath.length - 1];\r\n if (last && [cx1, cy1, cx2, cy2, x, y].every(Number.isFinite)) {\r\n const pts = sampleBezier(\r\n last,\r\n { x: cx1, y: cy1 },\r\n { x: cx2, y: cy2 },\r\n { x, y }\r\n );\r\n currentPath.push(...pts);\r\n } else {\r\n currentPath.push({ x, y });\r\n }\r\n break;\r\n }\r\n\r\n case \"fill\":\r\n case \"stroke\": {\r\n const arg = args[0];\r\n if (arg instanceof Path2D) {\r\n recordRegion(prop, 0, 0, ctx.canvas.width, ctx.canvas.height);\r\n } else if (currentPath.length) {\r\n const xs = currentPath.map((p) => p.x);\r\n const ys = currentPath.map((p) => p.y);\r\n const minX = Math.min(...xs);\r\n const minY = Math.min(...ys);\r\n const maxX = Math.max(...xs);\r\n const maxY = Math.max(...ys);\r\n const pad = Math.max((ctx.lineWidth ?? 1) * 0.95, 1);\r\n\r\n recordRegion(\r\n prop,\r\n minX - pad,\r\n minY - pad,\r\n maxX - minX + pad * 2,\r\n maxY - minY + pad * 2\r\n );\r\n currentPath = [];\r\n }\r\n break;\r\n }\r\n\r\n case \"fillRect\":\r\n case \"strokeRect\": {\r\n const [x, y, w, h] = args;\r\n const pad = ctx.lineWidth ?? 2;\r\n recordRegion(prop, x - pad, y - pad, w + pad * 2, h + pad * 2);\r\n break;\r\n }\r\n\r\n case \"fillText\":\r\n case \"strokeText\": {\r\n const [text, x, y] = args;\r\n if (\r\n typeof text !== \"string\" ||\r\n !Number.isFinite(x) ||\r\n !Number.isFinite(y)\r\n )\r\n break;\r\n\r\n const fontSize = getFontSize(ctx);\r\n const metrics = ctx.measureText(text);\r\n const ascent =\r\n metrics.actualBoundingBoxAscent || fontSize * 0.8;\r\n const descent =\r\n metrics.actualBoundingBoxDescent || fontSize * 0.2;\r\n const width = metrics.width || text.length * fontSize * 0.5;\r\n\r\n const padTop = fontSize * 0.35;\r\n const padBottom = fontSize * 0.15;\r\n const padSides = fontSize * 0.2;\r\n\r\n let leftX = x;\r\n let topY = y - ascent;\r\n\r\n switch (ctx.textAlign) {\r\n case \"center\":\r\n leftX = x - width / 2;\r\n break;\r\n case \"right\":\r\n case \"end\":\r\n leftX = x - width;\r\n break;\r\n }\r\n\r\n switch (ctx.textBaseline) {\r\n case \"top\":\r\n topY = y;\r\n break;\r\n case \"middle\":\r\n topY = y - ascent * 0.6;\r\n break;\r\n case \"bottom\":\r\n topY = y - ascent - descent;\r\n break;\r\n case \"alphabetic\":\r\n default:\r\n topY = y - ascent;\r\n }\r\n\r\n const rectX = leftX - padSides;\r\n const rectY = topY - padTop;\r\n const rectW = width + padSides * 2;\r\n const rectH = ascent + descent + padTop + padBottom;\r\n\r\n recordRegion(prop, rectX, rectY, rectW, rectH);\r\n recordActualRegion(leftX, topY, width, ascent + descent);\r\n break;\r\n }\r\n\r\n case \"drawImage\": {\r\n let img: CanvasImageSource | null = null;\r\n let dx = 0,\r\n dy = 0,\r\n dw = 0,\r\n dh = 0;\r\n\r\n if (args.length === 3) {\r\n [img, dx, dy] = args;\r\n dw = (img as any)?.width ?? 32;\r\n dh = (img as any)?.height ?? 32;\r\n } else if (args.length === 5) {\r\n [img, dx, dy, dw, dh] = args;\r\n } else if (args.length === 9) {\r\n [, , , , , dx, dy, dw, dh] = args;\r\n img = args[0];\r\n }\r\n\r\n if (img instanceof HTMLVideoElement) {\r\n console.warn(\r\n \"⚠️ [SafeCtx] drawImage with video is blocked for safety reasons.\"\r\n );\r\n return;\r\n }\r\n\r\n const pad = 0; //Math.max((ctx.lineWidth ?? 1) * 0.75, 1);\r\n\r\n recordRegion(\r\n \"drawImage\",\r\n dx - pad,\r\n dy - pad,\r\n dw + pad * 2,\r\n dh + pad * 2\r\n );\r\n\r\n recordActualRegion(dx, dy, dw, dh);\r\n break;\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(`[SafeCtx:${prop}]`, err);\r\n }\r\n\r\n return value.apply(target, args);\r\n };\r\n\r\n const bound = wrapped.bind(target);\r\n cache.set(prop, bound);\r\n return bound;\r\n },\r\n\r\n set(target, prop, value) {\r\n (target as any)[prop] = value;\r\n return true;\r\n },\r\n });\r\n\r\n (baseCtx as any).__drawRegions = recordedRegions;\r\n (baseCtx as any).__currentPath = currentPath;\r\n (baseCtx as any).__clearRegions = () => {\r\n recordedRegions.length = 0;\r\n actualRegions.length = 0;\r\n };\r\n (baseCtx as any).__actualRegions = actualRegions;\r\n\r\n return baseCtx as CanvasRenderingContext2D & {\r\n __drawRegions: TDrawRegion[];\r\n __clearRegions: () => void;\r\n __actualRegions: TCanvasCoords[];\r\n };\r\n }\r\n\r\n static createSafeCtx(ctx: CanvasRenderingContext2D) {\r\n const forbiddenMethods = new Set([\r\n \"clearRect\",\r\n \"reset\",\r\n \"resetTransform\",\r\n \"restore\",\r\n \"save\",\r\n \"scale\",\r\n \"rotate\",\r\n \"translate\",\r\n \"transform\",\r\n \"setTransform\",\r\n \"clip\",\r\n \"arcTo\",\r\n ]);\r\n\r\n const forbiddenProps = new Set([\r\n \"canvas\",\r\n \"filter\",\r\n \"globalAlpha\",\r\n \"globalCompositeOperation\",\r\n ]);\r\n\r\n const cache = new Map<PropertyKey, any>();\r\n\r\n const safeCtx = new Proxy(ctx, {\r\n get(target, prop: string, receiver) {\r\n if (cache.has(prop)) return cache.get(prop);\r\n\r\n if (forbiddenMethods.has(prop)) {\r\n const blocked = () =>\r\n console.warn(`⚠️ [SafeCtx] Access to ${prop}() is restricted.`);\r\n cache.set(prop, blocked);\r\n return blocked;\r\n }\r\n\r\n const value = (target as any)[prop];\r\n cache.set(prop, value);\r\n return value;\r\n },\r\n\r\n set(target, prop, value) {\r\n if (forbiddenProps.has(prop as string)) {\r\n console.warn(\r\n `⚠️ [SafeCtx] Modification to ${String(prop)} is restricted.`\r\n );\r\n return false;\r\n }\r\n (target as any)[prop] = value;\r\n return true;\r\n },\r\n });\r\n\r\n return safeCtx as TSafeCtx;\r\n }\r\n}\r\n\r\nexport default Utils;\r\n","import Utils from \"../../utils/utils\";\r\nimport {\r\n TBaseCtx,\r\n TCanvasLayer,\r\n TDrawRegion,\r\n TSafeCtx,\r\n} from \"../../types/draw\";\r\n\r\nclass CanvasLayers {\r\n private staticPiecesCanvas: React.RefObject<HTMLCanvasElement | null>;\r\n private boardCanvas: React.RefObject<HTMLCanvasElement | null>;\r\n private overlayCanvas: React.RefObject<HTMLCanvasElement | null>;\r\n private underlayCanvas: React.RefObject<HTMLCanvasElement | null>;\r\n private dynamicPiecesCanvas: React.RefObject<HTMLCanvasElement | null>;\r\n\r\n private staticPiecesCtx: TBaseCtx | null = null;\r\n private boardCtx: TBaseCtx | null = null;\r\n private overlayCtx: TBaseCtx | null = null;\r\n private underlayCtx: TBaseCtx | null = null;\r\n private dynamicPiecesCtx: TBaseCtx | null = null;\r\n\r\n private clientStaticPiecesCtx: TSafeCtx | null = null;\r\n private clientBoardCtx: TSafeCtx | null = null;\r\n private clientOverlayCtx: TSafeCtx | null = null;\r\n private clientUnderlayCtx: TSafeCtx | null = null;\r\n private clientDynamicPiecesCtx: TSafeCtx | null = null;\r\n\r\n private clientCtxMap = {\r\n staticPieces: this.clientStaticPiecesCtx,\r\n board: this.clientBoardCtx,\r\n overlay: this.clientOverlayCtx,\r\n underlay: this.clientUnderlayCtx,\r\n dynamicPieces: this.clientDynamicPiecesCtx,\r\n };\r\n\r\n private overlayOffscreen!: OffscreenCanvas;\r\n private underlayOffscreen!: OffscreenCanvas;\r\n private dynamicPiecesOffscreen!: OffscreenCanvas;\r\n\r\n private overlayOffscreenCtx: OffscreenCanvasRenderingContext2D | null = null;\r\n private underlayOffscreenCtx: OffscreenCanvasRenderingContext2D | null = null;\r\n private dynamicPiecesOffscreenCtx: OffscreenCanvasRenderingContext2D | null =\r\n null;\r\n private size: number;\r\n private dpr: number = 1;\r\n\r\n constructor(\r\n board: React.RefObject<HTMLCanvasElement | null>,\r\n pieces: React.RefObject<HTMLCanvasElement | null>,\r\n overlay: React.RefObject<HTMLCanvasElement | null>,\r\n underlayCanvas: React.RefObject<HTMLCanvasElement | null>,\r\n dynamicPiecesCanvas: React.RefObject<HTMLCanvasElement | null>,\r\n size: number,\r\n ) {\r\n this.staticPiecesCanvas = pieces;\r\n this.boardCanvas = board;\r\n this.overlayCanvas = overlay;\r\n this.underlayCanvas = underlayCanvas;\r\n this.dynamicPiecesCanvas = dynamicPiecesCanvas;\r\n this.size = size;\r\n this.disableTouchAction();\r\n this.setContext();\r\n this.setQuality();\r\n }\r\n\r\n destroy() {\r\n this.clearAllRect();\r\n this.clearCanvas();\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n private disableTouchAction() {\r\n (\r\n [\r\n \"board\",\r\n \"staticPieces\",\r\n \"overlay\",\r\n \"underlay\",\r\n \"dynamicPieces\",\r\n ] as TCanvasLayer[]\r\n ).forEach((key) => this.setCanvasStyle(key, { touchAction: \"none\" }));\r\n }\r\n\r\n getContext(canvas: TCanvasLayer) {\r\n if (this[`${canvas}Ctx`] === null && this[`${canvas}Canvas`].current)\r\n this.setContext();\r\n return this[`${canvas}Ctx`];\r\n }\r\n\r\n getClientContext(canvas: TCanvasLayer) {\r\n return this.clientCtxMap[canvas];\r\n }\r\n\r\n getCanvas(canvas: TCanvasLayer) {\r\n return this[`${canvas}Canvas`];\r\n }\r\n\r\n keepQuality(canvas: TCanvasLayer, size: number) {\r\n const curr = this[`${canvas}Canvas`].current;\r\n if (!curr) return;\r\n\r\n const dpr = window.devicePixelRatio || 1;\r\n this.dpr = dpr;\r\n\r\n const targetW = size * dpr;\r\n const targetH = size * dpr;\r\n\r\n if (curr.width === targetW && curr.height === targetH) return;\r\n curr.width = targetW;\r\n curr.height = targetH;\r\n curr.style.width = size + \"px\";\r\n curr.style.height = size + \"px\";\r\n\r\n const ctx = this.getContext(canvas);\r\n\r\n if (ctx) {\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.scale(dpr, dpr);\r\n ctx.imageSmoothingEnabled = true;\r\n ctx.imageSmoothingQuality = \"high\";\r\n }\r\n }\r\n\r\n getDpr() {\r\n return this.dpr;\r\n }\r\n\r\n setCanvasStyle(canvas: TCanvasLayer, styles: Partial<CSSStyleDeclaration>) {\r\n const curr = this[`${canvas}Canvas`].current;\r\n if (!curr) return;\r\n for (const [style, value] of Object.entries(styles)) {\r\n if (value) (curr.style as any)[style] = value;\r\n }\r\n }\r\n\r\n setOffscreen() {\r\n if (typeof OffscreenCanvas === undefined) return;\r\n try {\r\n this.overlayOffscreen = new OffscreenCanvas(this.size, this.size);\r\n this.underlayOffscreen = new OffscreenCanvas(this.size, this.size);\r\n this.dynamicPiecesOffscreen = new OffscreenCanvas(this.size, this.size);\r\n\r\n this.overlayOffscreenCtx = this.overlayOffscreen.getContext(\"2d\");\r\n this.underlayOffscreenCtx = this.underlayOffscreen.getContext(\"2d\");\r\n this.dynamicPiecesOffscreenCtx =\r\n this.dynamicPiecesOffscreen.getContext(\"2d\");\r\n } catch {\r\n console.warn(\r\n \"OffscreenCanvas not supported, using normal canvas rendering.\",\r\n );\r\n }\r\n }\r\n\r\n private setContext() {\r\n const staticPiecesCtx = this.staticPiecesCanvas.current?.getContext(\"2d\");\r\n const boardCtx = this.boardCanvas.current?.getContext(\"2d\");\r\n const overlayCtx = this.overlayCanvas.current?.getContext(\"2d\");\r\n const underlayCtx = this.underlayCanvas.current?.getContext(\"2d\");\r\n const dynamicPiecesCtx = this.dynamicPiecesCanvas.current?.getContext(\"2d\");\r\n // base ctx\r\n this.staticPiecesCtx = staticPiecesCtx\r\n ? Utils.createBaseCtx(staticPiecesCtx)\r\n : null;\r\n this.boardCtx = boardCtx ? Utils.createBaseCtx(boardCtx) : null;\r\n this.overlayCtx = overlayCtx ? Utils.createBaseCtx(overlayCtx) : null;\r\n this.underlayCtx = underlayCtx ? Utils.createBaseCtx(underlayCtx) : null;\r\n this.dynamicPiecesCtx = dynamicPiecesCtx\r\n ? Utils.createBaseCtx(dynamicPiecesCtx)\r\n : null;\r\n // client ctx\r\n this.clientStaticPiecesCtx = this.staticPiecesCtx\r\n ? Utils.createSafeCtx(this.staticPiecesCtx)\r\n : null;\r\n this.clientBoardCtx = this.boardCtx\r\n ? Utils.createSafeCtx(this.boardCtx)\r\n : null;\r\n this.clientOverlayCtx = this.overlayCtx\r\n ? Utils.createSafeCtx(this.overlayCtx)\r\n : null;\r\n this.clientUnderlayCtx = this.underlayCtx\r\n ? Utils.createSafeCtx(this.underlayCtx)\r\n : null;\r\n this.clientDynamicPiecesCtx = this.dynamicPiecesCtx\r\n ? Utils.createSafeCtx(this.dynamicPiecesCtx)\r\n : null;\r\n\r\n this.clientCtxMap = {\r\n staticPieces: this.clientStaticPiecesCtx,\r\n board: this.clientBoardCtx,\r\n overlay: this.clientOverlayCtx,\r\n underlay: this.clientUnderlayCtx,\r\n dynamicPieces: this.clientDynamicPiecesCtx,\r\n };\r\n }\r\n\r\n setQuality() {\r\n (\r\n [\r\n \"board\",\r\n \"staticPieces\",\r\n \"overlay\",\r\n \"underlay\",\r\n \"dynamicPieces\",\r\n ] as TCanvasLayer[]\r\n ).forEach((key) => this.keepQuality(key, this.size));\r\n }\r\n\r\n blitOffscreenToMain() {\r\n const overlay = this.overlayCtx;\r\n const underlay = this.underlayCtx;\r\n const dynamic = this.dynamicPiecesCtx;\r\n\r\n if (overlay && this.overlayOffscreen)\r\n overlay.drawImage(this.overlayOffscreen, 0, 0);\r\n if (underlay && this.underlayOffscreen)\r\n underlay.drawImage(this.underlayOffscreen, 0, 0);\r\n if (dynamic && this.dynamicPiecesOffscreen)\r\n dynamic.drawImage(this.dynamicPiecesOffscreen, 0, 0);\r\n }\r\n\r\n resize(size: number) {\r\n this.size = size;\r\n this.setQuality();\r\n /*[\r\n this.overlayOffscreen,\r\n this.underlayOffscreen,\r\n this.dynamicPiecesOffscreen,\r\n ].forEach((c) => {\r\n if (c) {\r\n c.width = size;\r\n c.height = size;\r\n }\r\n });*/\r\n }\r\n\r\n clearAllRect(custom?: Record<TCanvasLayer, boolean>) {\r\n if (custom) {\r\n for (const [key, value] of Object.entries(custom)) {\r\n if (!value) continue;\r\n const layer = key as TCanvasLayer;\r\n const ctx = this[`${layer}Ctx`];\r\n ctx?.clearRect(0, 0, this.size, this.size);\r\n }\r\n return;\r\n }\r\n [\r\n this.staticPiecesCtx,\r\n this.boardCtx,\r\n this.overlayCtx,\r\n this.underlayCtx,\r\n this.dynamicPiecesCtx,\r\n ].forEach((ctx) => ctx?.clearRect(0, 0, this.size, this.size));\r\n }\r\n\r\n clearCanvas() {\r\n const canvases = [\r\n this.boardCanvas,\r\n this.overlayCanvas,\r\n this.staticPiecesCanvas,\r\n this.underlayCanvas,\r\n this.dynamicPiecesCanvas,\r\n ];\r\n canvases.forEach((ref) => {\r\n const canvas = ref.current;\r\n if (canvas) {\r\n const ctx = canvas.getContext(\"2d\");\r\n ctx?.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx?.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n (ref.current as any) = null;\r\n });\r\n\r\n this.boardCtx = null;\r\n this.overlayCtx = null;\r\n this.staticPiecesCtx = null;\r\n this.underlayCtx = null;\r\n this.dynamicPiecesCtx = null;\r\n }\r\n}\r\n\r\nexport default CanvasLayers;\r\n","import { useEffect, useCallback } from \"react\";\r\nimport { TBoard } from \"../types/board\";\r\n\r\nconst Board: React.FC<TBoard> = ({\r\n boardRuntime,\r\n boardRef,\r\n staticPiecesRef,\r\n overlayRef,\r\n underlayRef,\r\n dynamicPiecesRef,\r\n size,\r\n}) => {\r\n const handlePointerDown = useCallback(\r\n (e: React.PointerEvent<HTMLCanvasElement>) => {\r\n boardRuntime.current?.boardEvents.OnPointerDown(e);\r\n },\r\n [boardRuntime]\r\n );\r\n\r\n const handlePointerMove = useCallback(\r\n (e: React.PointerEvent<HTMLCanvasElement>) => {\r\n boardRuntime.current?.boardEvents.onPointerMove(e);\r\n },\r\n [boardRuntime]\r\n );\r\n\r\n const handlePointerUp = useCallback(\r\n (e: React.PointerEvent<HTMLCanvasElement>) => {\r\n boardRuntime.current?.boardEvents.onPointerUp(e);\r\n },\r\n [boardRuntime]\r\n );\r\n\r\n const handlePointerLeave = useCallback(\r\n (e: React.PointerEvent<HTMLCanvasElement>) => {\r\n boardRuntime.current?.boardEvents.onPointerLeave(e);\r\n },\r\n [boardRuntime]\r\n );\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n width: size,\r\n height: size,\r\n }}\r\n >\r\n <canvas\r\n ref={boardRef}\r\n width={size}\r\n height={size}\r\n style={{\r\n display: \"block\",\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n pointerEvents: \"none\",\r\n zIndex: 1,\r\n }}\r\n />\r\n <canvas\r\n ref={staticPiecesRef}\r\n width={size}\r\n height={size}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n background: \"transparent\",\r\n zIndex: 2,\r\n }}\r\n onPointerDown={handlePointerDown}\r\n onPointerMove={handlePointerMove}\r\n onPointerUp={handlePointerUp}\r\n onPointerLeave={handlePointerLeave}\r\n />\r\n <canvas\r\n ref={overlayRef}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n background: \"transparent\",\r\n pointerEvents: \"none\",\r\n zIndex: 1,\r\n }}\r\n width={size}\r\n height={size}\r\n />\r\n <canvas\r\n ref={underlayRef}\r\n width={size}\r\n height={size}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n background: \"transparent\",\r\n zIndex: 3,\r\n pointerEvents: \"none\",\r\n }}\r\n />\r\n <canvas\r\n ref={dynamicPiecesRef}\r\n width={size}\r\n height={size}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n background: \"transparent\",\r\n zIndex: 4,\r\n pointerEvents: \"none\",\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default Board;\r\n","import { TSquare } from \"./square\";\r\n\r\ntype TColor = \"w\" | \"b\";\r\ntype TPieceUp = \"P\" | \"R\" | \"N\" | \"B\" | \"Q\" | \"K\";\r\ntype TPiece = `${TColor}${TPieceUp}`;\r\ntype TPieceCount =\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6\r\n | 7\r\n | 8\r\n | 9\r\n | 10\r\n | 11\r\n | 12\r\n | 13\r\n | 14\r\n | 15\r\n | 16\r\n | 17\r\n | 18\r\n | 19\r\n | 20\r\n | 21\r\n | 22\r\n | 23\r\n | 24\r\n | 25\r\n | 26\r\n | 27\r\n | 28\r\n | 29\r\n | 30\r\n | 31\r\n | 32\r\n | 33\r\n | 34\r\n | 35\r\n | 34\r\n | 37\r\n | 38\r\n | 39\r\n | 40\r\n | 41\r\n | 42\r\n | 43\r\n | 44\r\n | 45\r\n | 46\r\n | 47\r\n | 48\r\n | 49\r\n | 50\r\n | 51\r\n | 52\r\n | 53\r\n | 54\r\n | 55\r\n | 56\r\n | 57\r\n | 58\r\n | 59\r\n | 60\r\n | 61\r\n | 62\r\n | 63\r\n | 64;\r\ntype TPieceId = `${TPiece}${TPieceCount}`;\r\ntype TPieceBoard = {\r\n square: TSquare;\r\n type: TPiece;\r\n id: TPieceId;\r\n};\r\ntype TPieceCoords = { x: number; y: number };\r\nconst pieceKey = [\r\n \"wP\",\r\n \"wB\",\r\n \"wR\",\r\n \"wN\",\r\n \"wQ\",\r\n \"wK\",\r\n \"bP\",\r\n \"bB\",\r\n \"bR\",\r\n \"bN\",\r\n \"bQ\",\r\n \"bK\",\r\n] as const;\r\ntype TPieceKey = (typeof pieceKey)[number];\r\ntype TPieceDisplay = string | HTMLImageElement;\r\ntype TPieceImage<T = unknown> = Record<TPieceKey, T>;\r\n\r\ntype TPieceInternalRef = {\r\n square: TSquare;\r\n type: TPiece;\r\n x: number;\r\n y: number;\r\n anim?: boolean;\r\n};\r\n\r\ntype TPieceType = \"static\" | \"dynamic\";\r\n\r\nexport type {\r\n TPiece,\r\n TPieceBoard,\r\n TPieceImage,\r\n TPieceId,\r\n TPieceInternalRef,\r\n TPieceDisplay,\r\n TPieceKey,\r\n TPieceCoords,\r\n TPieceType,\r\n};\r\n\r\nexport { pieceKey };\r\n","import BoardRuntime from \"./boardRuntime\";\r\n\r\nclass BoardEvents {\r\n constructor(protected boardRuntime: BoardRuntime) {\r\n this.boardRuntime = boardRuntime;\r\n }\r\n\r\n destroy() {\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n OnPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {\r\n if (this.boardRuntime.getIsMoving()) return;\r\n this.boardRuntime.getEventEmitter().emit(\"onPointerDown\");\r\n this.boardRuntime.helpers.pointerEventsHelper.startPress(e);\r\n }\r\n\r\n onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {\r\n if (this.boardRuntime.getIsMoving()) return;\r\n this.boardRuntime.getEventEmitter().emit(\"onPointerMove\");\r\n this.boardRuntime.helpers.pointerEventsHelper.handlePieceHover(e);\r\n this.boardRuntime.helpers.pointerEventsHelper.handleGrab(e);\r\n }\r\n\r\n onPointerUp(e: React.PointerEvent<HTMLCanvasElement>) {\r\n this.boardRuntime.helpers.pointerEventsHelper.handlePointerUp(e);\r\n if (this.boardRuntime.getIsMoving()) return;\r\n this.boardRuntime.getEventEmitter().emit(\"onPointerUp\");\r\n }\r\n\r\n onPointerLeave(e: React.PointerEvent<HTMLCanvasElement>) {\r\n if (this.boardRuntime.getIsMoving()) return;\r\n this.boardRuntime.helpers.pointerEventsHelper.handlePointerLeave(e);\r\n }\r\n}\r\nexport default BoardEvents;\r\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cpath%20fill='%23fff'%20stroke='%23000'%20stroke-linecap='round'%20stroke-width='1.5'%20d='M22.5%209c-2.21%200-4%201.79-4%204%200%20.89.29%201.71.78%202.38C17.33%2016.5%2016%2018.59%2016%2021c0%202.03.94%203.84%202.41%205.03-3%201.06-7.41%205.55-7.41%2013.47h23c0-7.92-4.41-12.41-7.41-13.47%201.47-1.19%202.41-3%202.41-5.03%200-2.41-1.33-4.5-3.28-5.62.49-.67.78-1.49.78-2.38%200-2.21-1.79-4-4-4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cg%20fill='%23fff'%20stroke-linecap='butt'%3e%3cpath%20d='M9%2036c3.39-.97%2010.11.43%2013.5-2%203.39%202.43%2010.11%201.03%2013.5%202%200%200%201.65.54%203%202-.68.97-1.65.99-3%20.5-3.39-.97-10.11.46-13.5-1-3.39%201.46-10.11.03-13.5%201-1.35.49-2.32.47-3-.5%201.35-1.94%203-2%203-2z'/%3e%3cpath%20d='M15%2032c2.5%202.5%2012.5%202.5%2015%200%20.5-1.5%200-2%200-2%200-2.5-2.5-4-2.5-4%205.5-1.5%206-11.5-5-15.5-11%204-10.5%2014-5%2015.5%200%200-2.5%201.5-2.5%204%200%200-.5.5%200%202z'/%3e%3cpath%20d='M25%208a2.5%202.5%200%201%201-5%200%202.5%202.5%200%201%201%205%200z'/%3e%3c/g%3e%3cpath%20stroke-linejoin='miter'%20d='M17.5%2026h10M15%2030h15m-7.5-14.5v5M20%2018h5'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20fill='%23fff'%20d='M22%2010c10.5%201%2016.5%208%2016%2029H15c0-9%2010-6.5%208-21'/%3e%3cpath%20fill='%23fff'%20d='M24%2018c.38%202.91-5.55%207.37-8%209-3%202-2.82%204.34-5%204-1.042-.94%201.41-3.04%200-3-1%200%20.19%201.23-1%202-1%200-4.003%201-4-4%200-2%206-12%206-12s1.89-1.9%202-3.5c-.73-.994-.5-2-.5-3%201-1%203%202.5%203%202.5h2s.78-1.992%202.5-3c1%200%201%203%201%203'/%3e%3cpath%20fill='%23000'%20d='M9.5%2025.5a.5.5%200%201%201-1%200%20.5.5%200%201%201%201%200zm5.433-9.75a.5%201.5%2030%201%201-.866-.5.5%201.5%2030%201%201%20.866.5z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='%23fff'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20stroke-linecap='butt'%20d='M9%2039h27v-3H9v3zm3-3v-4h21v4H12zm-1-22V9h4v2h5V9h5v2h5V9h4v5'/%3e%3cpath%20d='m34%2014-3%203H14l-3-3'/%3e%3cpath%20stroke-linecap='butt'%20stroke-linejoin='miter'%20d='M31%2017v12.5H14V17'/%3e%3cpath%20d='m31%2029.5%201.5%202.5h-20l1.5-2.5'/%3e%3cpath%20fill='none'%20stroke-linejoin='miter'%20d='M11%2014h23'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='%23fff'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20d='M8%2012a2%202%200%201%201-4%200%202%202%200%201%201%204%200zm16.5-4.5a2%202%200%201%201-4%200%202%202%200%201%201%204%200zM41%2012a2%202%200%201%201-4%200%202%202%200%201%201%204%200zM16%208.5a2%202%200%201%201-4%200%202%202%200%201%201%204%200zM33%209a2%202%200%201%201-4%200%202%202%200%201%201%204%200z'/%3e%3cpath%20stroke-linecap='butt'%20d='M9%2026c8.5-1.5%2021-1.5%2027%200l2-12-7%2011V11l-5.5%2013.5-3-15-3%2015-5.5-14V25L7%2014l2%2012z'/%3e%3cpath%20stroke-linecap='butt'%20d='M9%2026c0%202%201.5%202%202.5%204%201%201.5%201%201%20.5%203.5-1.5%201-1.5%202.5-1.5%202.5-1.5%201.5.5%202.5.5%202.5%206.5%201%2016.5%201%2023%200%200%200%201.5-1%200-2.5%200%200%20.5-1.5-1-2.5-.5-2.5-.5-2%20.5-3.5%201-2%202.5-2%202.5-4-8.5-1.5-18.5-1.5-27%200z'/%3e%3cpath%20fill='none'%20d='M11.5%2030c3.5-1%2018.5-1%2022%200M12%2033.5c6-1%2015-1%2021%200'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20stroke-linejoin='miter'%20d='M22.5%2011.63V6M20%208h5'/%3e%3cpath%20fill='%23fff'%20stroke-linecap='butt'%20stroke-linejoin='miter'%20d='M22.5%2025s4.5-7.5%203-10.5c0%200-1-2.5-3-2.5s-3%202.5-3%202.5c-1.5%203%203%2010.5%203%2010.5'/%3e%3cpath%20fill='%23fff'%20d='M11.5%2037c5.5%203.5%2015.5%203.5%2021%200v-7s9-4.5%206-10.5c-4-6.5-13.5-3.5-16%204V27v-3.5c-3.5-7.5-13-10.5-16-4-3%206%205%2010%205%2010V37z'/%3e%3cpath%20d='M11.5%2030c5.5-3%2015.5-3%2021%200m-21%203.5c5.5-3%2015.5-3%2021%200m-21%203.5c5.5-3%2015.5-3%2021%200'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cpath%20stroke='%23000'%20stroke-linecap='round'%20stroke-width='1.5'%20d='M22.5%209a4%204%200%200%200-3.22%206.38%206.48%206.48%200%200%200-.87%2010.65c-3%201.06-7.41%205.55-7.41%2013.47h23c0-7.92-4.41-12.41-7.41-13.47a6.46%206.46%200%200%200-.87-10.65A4.01%204.01%200%200%200%2022.5%209z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cg%20fill='%23000'%20stroke-linecap='butt'%3e%3cpath%20d='M9%2036c3.4-1%2010.1.4%2013.5-2%203.4%202.4%2010.1%201%2013.5%202%200%200%201.6.5%203%202-.7%201-1.6%201-3%20.5-3.4-1-10.1.5-13.5-1-3.4%201.5-10.1%200-13.5%201-1.4.5-2.3.5-3-.5%201.4-2%203-2%203-2z'/%3e%3cpath%20d='M15%2032c2.5%202.5%2012.5%202.5%2015%200%20.5-1.5%200-2%200-2%200-2.5-2.5-4-2.5-4%205.5-1.5%206-11.5-5-15.5-11%204-10.5%2014-5%2015.5%200%200-2.5%201.5-2.5%204%200%200-.5.5%200%202z'/%3e%3cpath%20d='M25%208a2.5%202.5%200%201%201-5%200%202.5%202.5%200%201%201%205%200z'/%3e%3c/g%3e%3cpath%20stroke='%23ececec'%20stroke-linejoin='miter'%20d='M17.5%2026h10M15%2030h15m-7.5-14.5v5M20%2018h5'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20fill='%23000'%20d='M22%2010c10.5%201%2016.5%208%2016%2029H15c0-9%2010-6.5%208-21'/%3e%3cpath%20fill='%23000'%20d='M24%2018c.38%202.91-5.55%207.37-8%209-3%202-2.82%204.34-5%204-1.04-.94%201.41-3.04%200-3-1%200%20.19%201.23-1%202-1%200-4%201-4-4%200-2%206-12%206-12s1.89-1.9%202-3.5c-.73-1-.5-2-.5-3%201-1%203%202.5%203%202.5h2s.78-2%202.5-3c1%200%201%203%201%203'/%3e%3cpath%20fill='%23ececec'%20stroke='%23ececec'%20d='M9.5%2025.5a.5.5%200%201%201-1%200%20.5.5%200%201%201%201%200zm5.43-9.75a.5%201.5%2030%201%201-.86-.5.5%201.5%2030%201%201%20.86.5z'/%3e%3cpath%20fill='%23ececec'%20stroke='none'%20d='m24.55%2010.4-.45%201.45.5.15c3.15%201%205.65%202.49%207.9%206.75S35.75%2029.06%2035.25%2039l-.05.5h2.25l.05-.5c.5-10.06-.88-16.85-3.25-21.34-2.37-4.49-5.79-6.64-9.19-7.16l-.51-.1z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20stroke-linecap='butt'%20d='M9%2039h27v-3H9v3zm3.5-7%201.5-2.5h17l1.5%202.5h-20zm-.5%204v-4h21v4H12z'/%3e%3cpath%20stroke-linecap='butt'%20stroke-linejoin='miter'%20d='M14%2029.5v-13h17v13H14z'/%3e%3cpath%20stroke-linecap='butt'%20d='M14%2016.5%2011%2014h23l-3%202.5H14zM11%2014V9h4v2h5V9h5v2h5V9h4v5H11z'/%3e%3cpath%20fill='none'%20stroke='%23ececec'%20stroke-linejoin='miter'%20stroke-width='1'%20d='M12%2035.5h21m-20-4h19m-18-2h17m-17-13h17M11%2014h23'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cg%20stroke='none'%3e%3ccircle%20cx='6'%20cy='12'%20r='2.75'/%3e%3ccircle%20cx='14'%20cy='9'%20r='2.75'/%3e%3ccircle%20cx='22.5'%20cy='8'%20r='2.75'/%3e%3ccircle%20cx='31'%20cy='9'%20r='2.75'/%3e%3ccircle%20cx='39'%20cy='12'%20r='2.75'/%3e%3c/g%3e%3cpath%20stroke-linecap='butt'%20d='M9%2026c8.5-1.5%2021-1.5%2027%200l2.5-12.5L31%2025l-.3-14.1-5.2%2013.6-3-14.5-3%2014.5-5.2-13.6L14%2025%206.5%2013.5%209%2026z'/%3e%3cpath%20stroke-linecap='butt'%20d='M9%2026c0%202%201.5%202%202.5%204%201%201.5%201%201%20.5%203.5-1.5%201-1.5%202.5-1.5%202.5-1.5%201.5.5%202.5.5%202.5%206.5%201%2016.5%201%2023%200%200%200%201.5-1%200-2.5%200%200%20.5-1.5-1-2.5-.5-2.5-.5-2%20.5-3.5%201-2%202.5-2%202.5-4-8.5-1.5-18.5-1.5-27%200z'/%3e%3cpath%20fill='none'%20stroke-linecap='butt'%20d='M11%2038.5a35%2035%201%200%200%2023%200'/%3e%3cpath%20fill='none'%20stroke='%23ececec'%20d='M11%2029a35%2035%201%200%201%2023%200m-21.5%202.5h20m-21%203a35%2035%201%200%200%2022%200m-23%203a35%2035%201%200%200%2024%200'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2045%2045'%3e%3cg%20fill='none'%20fill-rule='evenodd'%20stroke='%23000'%20stroke-linecap='round'%20stroke-linejoin='round'%20stroke-width='1.5'%3e%3cpath%20stroke-linejoin='miter'%20d='M22.5%2011.6V6'/%3e%3cpath%20fill='%23000'%20stroke-linecap='butt'%20stroke-linejoin='miter'%20d='M22.5%2025s4.5-7.5%203-10.5c0%200-1-2.5-3-2.5s-3%202.5-3%202.5c-1.5%203%203%2010.5%203%2010.5'/%3e%3cpath%20fill='%23000'%20d='M11.5%2037a22.3%2022.3%200%200%200%2021%200v-7s9-4.5%206-10.5c-4-6.5-13.5-3.5-16%204V27v-3.5c-3.5-7.5-13-10.5-16-4-3%206%205%2010%205%2010V37z'/%3e%3cpath%20stroke-linejoin='miter'%20d='M20%208h5'/%3e%3cpath%20stroke='%23ececec'%20d='M32%2029.5s8.5-4%206-9.7C34.1%2014%2025%2018%2022.5%2024.6v2.1-2.1C20%2018%209.9%2014%207%2019.9c-2.5%205.6%204.8%209%204.8%209'/%3e%3cpath%20stroke='%23ececec'%20d='M11.5%2030c5.5-3%2015.5-3%2021%200m-21%203.5c5.5-3%2015.5-3%2021%200m-21%203.5c5.5-3%2015.5-3%2021%200'/%3e%3c/g%3e%3c/svg%3e\"","import {\r\n TPieceDisplay,\r\n TPieceId,\r\n TPieceImage,\r\n TPieceInternalRef,\r\n TPieceKey,\r\n} from \"../../types/piece\";\r\nimport { TNotation } from \"../../types/square\";\r\nimport Utils from \"../../utils/utils\";\r\nimport { TCache } from \"../../types/helpers\";\r\nimport * as assets from \"../../assets\";\r\nclass PieceHelpers {\r\n private imagesSrc = {\r\n wP: assets.wP,\r\n wB: assets.wB,\r\n wN: assets.wN,\r\n wR: assets.wR,\r\n wQ: assets.wQ,\r\n wK: assets.wK,\r\n bP: assets.bP,\r\n bB: assets.bB,\r\n bN: assets.bN,\r\n bR: assets.bR,\r\n bQ: assets.bQ,\r\n bK: assets.bK,\r\n };\r\n private cache: TCache = new Map();\r\n\r\n destroy() {\r\n this.clearCache();\r\n\r\n const images = this.getPieceImages?.image;\r\n if (images) {\r\n for (const key in images) {\r\n const img = images[key as TPieceKey];\r\n if (img instanceof HTMLImageElement) {\r\n img.src = \"\";\r\n img.onload = null;\r\n img.onerror = null;\r\n }\r\n (images as any)[key] = null;\r\n }\r\n }\r\n\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n getPieceAt(\r\n x: number,\r\n y: number,\r\n squareSize: number,\r\n isBlackView: boolean,\r\n internalRef: Record<TPieceId, TPieceInternalRef>\r\n ) {\r\n const refObj = internalRef;\r\n if (!refObj) return;\r\n const square = Utils.coordsToSquare(x, y, squareSize, isBlackView);\r\n if (!square) return;\r\n const cached = this.cache.get(square.notation);\r\n if (cached) return { piece: { ...cached.piece }, id: cached.id };\r\n\r\n const piece = Object.entries(refObj).find(([_, piece]) => {\r\n return piece.square?.notation === square.notation;\r\n });\r\n\r\n if (!piece) return;\r\n const [id, p] = piece;\r\n\r\n this.cache.set(square.notation, {\r\n piece: p,\r\n id: id as TPieceId,\r\n });\r\n return { id: id as TPieceId, piece: p };\r\n }\r\n\r\n clearCache() {\r\n return this.cache.clear();\r\n }\r\n\r\n updateCache(\r\n from: TNotation,\r\n to: TNotation,\r\n piece: { id: TPieceId; piece: TPieceInternalRef }\r\n ) {\r\n this.cache.delete(from);\r\n this.cache.set(to, piece);\r\n }\r\n\r\n removeCache(target: TNotation) {\r\n this.cache.delete(target);\r\n }\r\n\r\n getPieceImages: Record<string, TPieceImage<TPieceDisplay>> = {\r\n string: {\r\n wK: \"♔\",\r\n wQ: \"♕\",\r\n wR: \"♖\",\r\n wB: \"♗\",\r\n wN: \"♘\",\r\n wP: \"♙\",\r\n bK: \"♔\",\r\n bQ: \"♕\",\r\n bR: \"♖\",\r\n bB: \"♗\",\r\n bN: \"♘\",\r\n bP: \"♙\",\r\n },\r\n image: (() => {\r\n const loadImage = (src: string) => {\r\n const img = new URL(src, import.meta.url).href;\r\n const image = new Image();\r\n image.src = img;\r\n return image;\r\n };\r\n return {\r\n wP: loadImage(this.imagesSrc[\"wP\"]),\r\n wB: loadImage(this.imagesSrc[\"wB\"]),\r\n wR: loadImage(this.imagesSrc[\"wR\"]),\r\n wN: loadImage(this.imagesSrc[\"wN\"]),\r\n wQ: loadImage(this.imagesSrc[\"wQ\"]),\r\n wK: loadImage(this.imagesSrc[\"wK\"]),\r\n bP: loadImage(this.imagesSrc[\"bP\"]),\r\n bB: loadImage(this.imagesSrc[\"bB\"]),\r\n bR: loadImage(this.imagesSrc[\"bR\"]),\r\n bN: loadImage(this.imagesSrc[\"bN\"]),\r\n bQ: loadImage(this.imagesSrc[\"bQ\"]),\r\n bK: loadImage(this.imagesSrc[\"bK\"]),\r\n };\r\n })(),\r\n };\r\n\r\n async preloadImages(images: TPieceImage): Promise<void> {\r\n const ImagePromises = Object.values(images).map((img) => {\r\n return new Promise<void>((resolve) => {\r\n if (!(img instanceof HTMLImageElement)) resolve();\r\n else if (img.complete && img.naturalWidth > 0) resolve();\r\n else {\r\n img.onload = () => resolve();\r\n img.onerror = () => resolve();\r\n }\r\n });\r\n });\r\n\r\n await Promise.all(ImagePromises);\r\n }\r\n}\r\n\r\nexport default PieceHelpers;\r\n","import { TPieceId } from \"../../types/piece\";\r\nimport { TSelected } from \"../../types/board\";\r\nimport Utils from \"../../utils/utils\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport { TCanvasLayer } from \"types\";\r\n\r\nclass PointerEventsHelpers {\r\n private triggerUp = true;\r\n private pointerSession = 0;\r\n private activeSession: null | number = null;\r\n\r\n constructor(protected boardRuntime: BoardRuntime) {}\r\n\r\n destroy() {\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n detectMove(e: React.PointerEvent<HTMLCanvasElement>) {\r\n const { offsetX, offsetY } = Utils.getCanvasCoords(e);\r\n const selected = this.boardRuntime.getSelected();\r\n const squareSize = this.boardRuntime.getSize() / 8,\r\n isBlackView = this.boardRuntime.getIsBlackView();\r\n const piece = selected && this.boardRuntime.getInternalRefVal(selected.id);\r\n\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onPointerHover\", [\r\n null,\r\n ]);\r\n\r\n const square = Utils.coordsToSquare(\r\n offsetX,\r\n offsetY,\r\n squareSize,\r\n isBlackView,\r\n );\r\n\r\n if (selected && square?.notation === selected.square?.notation) {\r\n return { from: null, to: null, piece: null };\r\n } else if (!selected || !square || !piece) {\r\n return { from: null, to: null, piece: null };\r\n }\r\n const piece_ = selected.square\r\n ? this.boardRuntime.getBoard()[selected.square.notation]\r\n : null;\r\n if (piece_) {\r\n return { from: selected.square, to: square, piece: piece_ };\r\n }\r\n return { from: null, to: null, piece: null };\r\n }\r\n\r\n handlePieceHover(e: React.PointerEvent<HTMLCanvasElement>) {\r\n const { offsetX, offsetY } = Utils.getCanvasCoords(e);\r\n const selected = this.boardRuntime.getSelected();\r\n const squareSize = this.boardRuntime.getSize() / 8;\r\n\r\n if (\r\n (selected && selected?.isDragging) ||\r\n this.boardRuntime.getIsMoving() ||\r\n e.pressure > 0\r\n ) {\r\n return;\r\n }\r\n\r\n const searchPiece = this.boardRuntime.helpers.pieceHelper.getPieceAt(\r\n offsetX,\r\n offsetY,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView(),\r\n this.boardRuntime.getInternalRefObj(),\r\n );\r\n if (searchPiece)\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"grab\",\r\n });\r\n\r\n if (selected && searchPiece?.id === selected?.id) {\r\n if (this.boardRuntime.getPieceHover() !== null)\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerHover\",\r\n [null],\r\n );\r\n return;\r\n }\r\n\r\n if (!searchPiece) {\r\n this.boardRuntime.getPieceHover() &&\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerHover\",\r\n [null],\r\n );\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"default\",\r\n });\r\n return;\r\n }\r\n\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onPointerHover\", [\r\n searchPiece.id,\r\n ]);\r\n }\r\n\r\n handleGrab(e: React.PointerEvent<HTMLCanvasElement>) {\r\n const { offsetX, offsetY } = Utils.getCanvasCoords(e);\r\n const squareSize = this.boardRuntime.getSize() / 8;\r\n const selected = this.boardRuntime.getSelected();\r\n const session = this.activeSession;\r\n if (\r\n session === null ||\r\n session !== this.pointerSession ||\r\n selected === null ||\r\n selected.startX === null ||\r\n selected?.startY === null ||\r\n e.pressure <= 0 ||\r\n this.boardRuntime.getIsMoving()\r\n ) {\r\n return;\r\n }\r\n\r\n const dx = offsetX - selected.startX;\r\n const dy = offsetY - selected.startY;\r\n\r\n if (Math.sqrt(dx * dx + dy * dy) > 3 /*&& !promotionRef.current.isProm*/) {\r\n if (selected.id) {\r\n const piece = this.boardRuntime.getInternalRefVal(selected.id);\r\n const half = squareSize / 2;\r\n if (piece && !selected.isDragging) {\r\n selected.isDragging = true;\r\n piece.x = offsetX - half;\r\n piece.y = offsetY - half;\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .addDraw(\"onPointerDragStart\");\r\n\r\n this.boardRuntime.getPieceHover() &&\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerHover\",\r\n [null],\r\n );\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onToggleCanvas\",\r\n [\"staticPieces\", \"dynamicPieces\", selected.id],\r\n );\r\n\r\n return;\r\n }\r\n\r\n const clampX = offsetX - half;\r\n const clampY = offsetY - half;\r\n\r\n piece.x = Math.max(\r\n 0,\r\n Math.min(clampX, this.boardRuntime.getSize() - squareSize),\r\n );\r\n piece.y = Math.max(\r\n 0,\r\n Math.min(clampY, this.boardRuntime.getSize() - squareSize),\r\n );\r\n this.boardRuntime.renderer.getLayerManager().addDraw(\"onPointerDrag\");\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(e: React.PointerEvent<HTMLCanvasElement>) {\r\n ++this.pointerSession;\r\n this.activeSession = null;\r\n if (this.boardRuntime.getIsMoving()) return;\r\n const { offsetX, offsetY } = Utils.getCanvasCoords(e);\r\n const size = this.boardRuntime.getSize();\r\n const selected = this.boardRuntime.getSelected();\r\n\r\n if (offsetX < 0 || offsetY < 0 || offsetX >= size || offsetY >= size) {\r\n this.handlePointerLeave(e);\r\n return;\r\n }\r\n\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"default\",\r\n });\r\n\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onPointerHover\", [\r\n null,\r\n true,\r\n ]);\r\n const isDragging = selected?.isDragging;\r\n\r\n if (this.triggerUp) {\r\n const { from, to, piece } =\r\n this.boardRuntime.helpers.pointerEventsHelper.detectMove(e);\r\n\r\n if (from !== null && from.notation !== to.notation) {\r\n this.boardRuntime.helpers.setNextMove({\r\n from: from.notation,\r\n to: to.notation,\r\n piece,\r\n click: false,\r\n offset: { x: offsetX, y: offsetY },\r\n });\r\n\r\n return;\r\n }\r\n } else this.triggerUp = true;\r\n\r\n isDragging && this.endDrag(offsetX, offsetY, false, true);\r\n if (selected?.secondClick || isDragging) {\r\n this.boardRuntime.helpers.toggleSelected(false);\r\n } else this.boardRuntime.helpers.toggleSelected(true);\r\n\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n\r\n handlePointerLeave(e: React.PointerEvent<HTMLCanvasElement>) {\r\n const selected = this.boardRuntime.getSelected();\r\n const secondClick = selected && selected.secondClick ? false : true;\r\n this.endDrag(-1, -1, false, true);\r\n this.boardRuntime.helpers.toggleSelected(secondClick);\r\n\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"default\",\r\n });\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onPointerHover\", [\r\n null,\r\n true,\r\n ]);\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n\r\n startPress(e: React.PointerEvent<HTMLCanvasElement>) {\r\n const { offsetX, offsetY } = Utils.getCanvasCoords(e);\r\n const squareSize = this.boardRuntime.getSize() / 8;\r\n const selected = this.boardRuntime.getSelected();\r\n\r\n if (offsetX === null || offsetY === null) return;\r\n this.activeSession = this.pointerSession;\r\n const square = Utils.coordsToSquare(\r\n offsetX,\r\n offsetY,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView(),\r\n );\r\n if (!square) return;\r\n if (selected?.isDragging) return;\r\n const piece_ = this.boardRuntime.helpers.pieceHelper.getPieceAt(\r\n offsetX,\r\n offsetY,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView(),\r\n this.boardRuntime.getInternalRefObj(),\r\n );\r\n if (piece_) {\r\n if (selected) {\r\n if (square.notation !== selected.square?.notation) {\r\n this.triggerUp = false;\r\n this.moveOnClick(e, selected, { x: offsetX, y: offsetY });\r\n } else {\r\n selected.startX = offsetX;\r\n selected.startY = offsetY;\r\n selected.secondClick = true;\r\n }\r\n } else {\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [\r\n {\r\n id: piece_.id,\r\n x: piece_.piece.x,\r\n y: piece_.piece.y,\r\n square: piece_.piece.square,\r\n isDragging: false,\r\n isPending: false,\r\n startX: offsetX,\r\n startY: offsetY,\r\n secondClick: false,\r\n },\r\n ],\r\n );\r\n }\r\n } else if (selected) {\r\n this.triggerUp = false;\r\n this.moveOnClick(e, selected, { x: offsetX, y: offsetY });\r\n }\r\n }\r\n\r\n moveOnClick(\r\n e: React.PointerEvent<HTMLCanvasElement>,\r\n selected: TSelected | null,\r\n offset: { x: number; y: number },\r\n ) {\r\n if (selected) {\r\n const { from, to, piece } =\r\n this.boardRuntime.helpers.pointerEventsHelper.detectMove(e);\r\n if (from !== null) {\r\n this.boardRuntime.helpers.setNextMove({\r\n from: from.notation,\r\n to: to.notation,\r\n piece,\r\n click: true,\r\n offset,\r\n });\r\n }\r\n }\r\n }\r\n\r\n toggleLayer(from: TCanvasLayer, to: TCanvasLayer) {\r\n const selected = this.boardRuntime.getSelected();\r\n const piece =\r\n selected && this.boardRuntime.getInternalRefVal(selected.id as TPieceId);\r\n\r\n if (selected && selected.isDragging && piece) {\r\n piece.x = selected.x;\r\n piece.y = selected.y;\r\n piece.square = structuredClone(selected.square);\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onToggleCanvas\", [\r\n from,\r\n to,\r\n selected.id,\r\n true,\r\n ]);\r\n }\r\n }\r\n\r\n endDrag(offsetX: number, offsetY: number, move: boolean, toggle: boolean) {\r\n const selected = this.boardRuntime.getSelected();\r\n const squareSize = this.boardRuntime.getSize() / 8,\r\n isBlackView = this.boardRuntime.getIsBlackView();\r\n const piece = selected && this.boardRuntime.getInternalRefVal(selected.id);\r\n const sqr = Utils.coordsToSquare(offsetX, offsetY, squareSize, isBlackView);\r\n const coords = Utils.squareToCoords(sqr, squareSize, isBlackView);\r\n\r\n if (!selected || !selected.isDragging || !piece) return;\r\n\r\n if (!move) {\r\n piece.square = structuredClone(selected.square);\r\n piece.x = selected.x;\r\n piece.y = selected.y;\r\n } else if (sqr && coords) {\r\n const { x, y } = coords;\r\n piece.square = structuredClone(sqr);\r\n piece.x = x;\r\n piece.y = y;\r\n }\r\n\r\n toggle && this.toggleLayer(\"dynamicPieces\", \"staticPieces\");\r\n selected.isDragging = false;\r\n return;\r\n }\r\n}\r\n\r\nexport default PointerEventsHelpers;\r\n","import { TEventName, TLazyReturn, TResolvers } from \"../../types/helpers\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport PieceHelpers from \"./pieceHelpers\";\r\nimport { TBoardEventContext, TBoardEvents } from \"../../types/events\";\r\nimport { TNotation, TSquare } from \"../../types/square\";\r\nimport { TPieceBoard } from \"../../types/piece\";\r\nimport { TCanvasCoords } from \"../../types/draw\";\r\nimport PointerEventsHelpers from \"./pointerEventsHelpers\";\r\nimport Utils from \"../../utils/utils\";\r\nimport EventEmmiter from \"../../engine/eventEmitter/eventEmitter\";\r\n\r\nclass EngineHelpers {\r\n public pointerEventsHelper: PointerEventsHelpers;\r\n public pieceHelper: PieceHelpers = new PieceHelpers();\r\n private pipelineMove: {\r\n from: TNotation;\r\n to: TNotation;\r\n piece: TPieceBoard;\r\n click: boolean;\r\n offset: { x: number; y: number };\r\n token: number;\r\n }[] = [];\r\n private moveToken = 0;\r\n private isMoving = false;\r\n constructor(protected boardRuntime: BoardRuntime) {\r\n this.pointerEventsHelper = new PointerEventsHelpers(this.boardRuntime);\r\n }\r\n\r\n destroy() {\r\n this.pieceHelper.destroy();\r\n this.pointerEventsHelper.destroy();\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n createLazyEventContext<TBase, TResolved>(\r\n base: TBase,\r\n resolvers: TResolvers<TResolved>,\r\n opts?: { cache: boolean },\r\n ): TLazyReturn<TBase, TResolved> {\r\n const cache = new Map<string, any>();\r\n const result: any = { ...base };\r\n const useCache = opts?.cache ?? true;\r\n\r\n for (const key of Object.keys(resolvers) as Array<keyof TResolved>) {\r\n result[key] = (...args: any[]) => {\r\n if (useCache && cache.has(key as string))\r\n return cache.get(key as string);\r\n\r\n const value = (resolvers as any)[key](...args);\r\n if (useCache) cache.set(key as string, value);\r\n return value;\r\n };\r\n }\r\n\r\n result.toPlain = () => {\r\n const plain: any = { ...base };\r\n for (const k of Object.keys(resolvers) as Array<keyof TResolved>) {\r\n plain[k] = (resolvers as any)[k]();\r\n }\r\n return plain as TBase & TResolved;\r\n };\r\n\r\n result.clearCache = () => cache.clear();\r\n\r\n result.destroy = () => {\r\n cache.clear();\r\n for (const key of Object.keys(result)) {\r\n delete (result as any)[key];\r\n }\r\n };\r\n\r\n return result;\r\n }\r\n\r\n triggerEvent<T extends TBoardEventContext = TBoardEventContext>(\r\n events: TBoardEvents<T> | undefined,\r\n event: TEventName<T>,\r\n args: T,\r\n ): void;\r\n triggerEvent<T extends TBoardEventContext = TBoardEventContext, K = unknown>(\r\n events: TBoardEvents<T> | undefined,\r\n event: TEventName<T>,\r\n args: T,\r\n extra: K,\r\n ): void;\r\n triggerEvent<T extends TBoardEventContext = TBoardEventContext, K = unknown>(\r\n events: TBoardEvents<T> | undefined,\r\n event: TEventName<T>,\r\n args: T,\r\n extra?: K,\r\n ) {\r\n let res = null;\r\n try {\r\n const fn = events?.[event];\r\n if (!fn) return;\r\n (args as any).__event = event;\r\n\r\n if (extra !== undefined) {\r\n res = (fn as (arg: T, extra: K) => TCanvasCoords[] | null | undefined)(\r\n args,\r\n extra,\r\n );\r\n } else {\r\n res = (fn as (arg: T) => TCanvasCoords[] | null | undefined)(args);\r\n }\r\n } finally {\r\n if (\"destroy\" in args && typeof args[\"destroy\"] === \"function\")\r\n (args as any).destroy();\r\n }\r\n return res;\r\n }\r\n\r\n private async movePromiseCancel(): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, 8000);\r\n });\r\n }\r\n\r\n async move(\r\n from: TNotation,\r\n to: TNotation,\r\n piece: TPieceBoard,\r\n click: boolean,\r\n offset: { x: number; y: number },\r\n ) {\r\n if (from === to) return false;\r\n const selected = this.boardRuntime.getSelected();\r\n const id = selected?.id;\r\n const moveCallback = this.boardRuntime.getMove();\r\n\r\n if (moveCallback) {\r\n const square = await this.pendingDrag(offset.x, offset.y);\r\n const move = await Promise.race([\r\n moveCallback({ from, to, piece }),\r\n this.movePromiseCancel().then(() => {\r\n this.boardRuntime.getEventEmitter().emit(\"onMoveAbort\", []);\r\n return { status: false, result: [] };\r\n }),\r\n ]);\r\n\r\n if (selected) {\r\n if (!click && square && move.status) {\r\n const piece_ = this.boardRuntime.getInternalRefVal(selected.id);\r\n piece_.square = square;\r\n }\r\n\r\n if (selected.isPending) {\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onToggleCanvas\",\r\n [\"dynamicPieces\", \"staticPieces\", id, true],\r\n );\r\n selected.isPending = false;\r\n\r\n await Utils.asyncHandler(\r\n (resolve: (value: void | PromiseLike<void>) => void) =>\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onRender\",\r\n [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ],\r\n resolve,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n if (move.status) {\r\n await this.boardRuntime.updateBoardState(move.result, click);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n // DEFAULT\r\n this.pointerEventsHelper.endDrag(offset.x, offset.y, true, false);\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onToggleCanvas\", [\r\n \"dynamicPieces\",\r\n \"staticPieces\",\r\n id,\r\n true,\r\n ]);\r\n await this.boardRuntime.updateBoardState(\r\n [{ from, to, captured: [to] }],\r\n click,\r\n );\r\n return true;\r\n }\r\n }\r\n\r\n toggleSelected(keep: boolean) {\r\n const selected = this.boardRuntime.getSelected();\r\n if (!selected) return;\r\n if (keep)\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [\r\n {\r\n ...selected,\r\n isDragging: false,\r\n startX: null,\r\n startY: null,\r\n secondClick: false,\r\n },\r\n true,\r\n ],\r\n );\r\n else\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [null, true],\r\n );\r\n }\r\n\r\n setNextMove(args: {\r\n from: TNotation;\r\n to: TNotation;\r\n piece: TPieceBoard;\r\n click: boolean;\r\n offset: { x: number; y: number };\r\n }) {\r\n const token = ++this.moveToken;\r\n this.pipelineMove.push({ ...args, token });\r\n\r\n if (!this.isMoving) this.handleMove();\r\n }\r\n\r\n private async pendingDrag(x: number, y: number) {\r\n const selected = this.boardRuntime.getSelected();\r\n this.boardRuntime.renderer.getLayerManager().removeEvent(\"onPointerSelect\");\r\n const render = (resolve: (value: void | PromiseLike<void>) => void) =>\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onRender\",\r\n [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ],\r\n resolve,\r\n );\r\n if (!selected || !selected.isDragging) {\r\n await Utils.asyncHandler(render);\r\n return;\r\n }\r\n\r\n const squareSize = this.boardRuntime.getSize() / 8,\r\n isBlackView = this.boardRuntime.getIsBlackView();\r\n const square = Utils.coordsToSquare(x, y, squareSize, isBlackView);\r\n const layer = this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getLayer(\"dynamicPieces\");\r\n\r\n if (!square) return;\r\n const coords = Utils.squareToCoords(square, squareSize, isBlackView);\r\n selected.isPending = true;\r\n const piece = layer.getPiece(selected.id);\r\n\r\n if (piece) {\r\n piece.x = coords ? coords.x : x;\r\n piece.y = coords ? coords.y : y;\r\n }\r\n\r\n selected.x = coords ? coords.x : x;\r\n selected.y = coords ? coords.y : y;\r\n selected.square = square;\r\n selected.startX = null;\r\n selected.startY = null;\r\n selected.isDragging = false;\r\n\r\n layer.addToRender(selected.id);\r\n\r\n await Utils.asyncHandler(render);\r\n layer.removeToRender(selected.id);\r\n return square;\r\n }\r\n\r\n async handleMove() {\r\n if (this.isMoving) return;\r\n this.isMoving = true;\r\n this.boardRuntime.setIsMoving(true);\r\n try {\r\n while (this.pipelineMove.length) {\r\n const selected = this.boardRuntime.getSelected();\r\n const currMove = this.pipelineMove.shift();\r\n\r\n if (!currMove) continue;\r\n const { from, to, piece, click, offset, token } = currMove;\r\n if (token !== this.moveToken) continue;\r\n let move = false;\r\n const x = selected?.x,\r\n y = selected?.y;\r\n const square =\r\n selected && selected.square !== null ? { ...selected.square } : null;\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"progress\",\r\n });\r\n move = await this.move(from, to, piece, click, offset);\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"default\",\r\n });\r\n\r\n if (move) this.boardRuntime.clearRedo();\r\n\r\n const newSelectedPiece = this.boardRuntime.getBoard()[to];\r\n const piece_ = newSelectedPiece\r\n ? this.boardRuntime.getInternalRefVal(newSelectedPiece.id)\r\n : null;\r\n const coords = newSelectedPiece\r\n ? Utils.squareToCoords(\r\n newSelectedPiece.square,\r\n this.boardRuntime.getSize() / 8,\r\n this.boardRuntime.getIsBlackView(),\r\n )\r\n : null;\r\n\r\n if (click) {\r\n if (!move) {\r\n if (newSelectedPiece && piece_) {\r\n coords &&\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [\r\n {\r\n id: newSelectedPiece.id,\r\n x: coords.x,\r\n y: coords.y,\r\n square: piece_.square,\r\n isDragging: false,\r\n startX: offset.x,\r\n startY: offset.y,\r\n secondClick: false,\r\n },\r\n true,\r\n ],\r\n );\r\n } else {\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [null, true],\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (!move) {\r\n if (!click) {\r\n if (selected && x !== undefined && y !== undefined) {\r\n const piece = this.boardRuntime.getInternalRefVal(selected.id);\r\n piece.x = x;\r\n piece.y = y;\r\n piece.square = structuredClone(square);\r\n }\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\r\n \"onPointerSelect\",\r\n [null, true],\r\n );\r\n }\r\n\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n }\r\n } finally {\r\n this.isMoving = false;\r\n this.boardRuntime.setIsMoving(false);\r\n if (this.pipelineMove.length) queueMicrotask(() => this.handleMove());\r\n }\r\n }\r\n}\r\nexport default EngineHelpers;\r\n","import { TCanvasCoords } from \"types\";\r\nimport SpatialNode from \"./spatialNode\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nconst QuadtreeKeys = {\r\n NE: \"NE\",\r\n NW: \"NW\",\r\n SE: \"SE\",\r\n SW: \"SW\",\r\n} as const;\r\ntype TQuadtreeChild = keyof typeof QuadtreeKeys;\r\n\r\nclass SpatialIndex {\r\n private capacity = 4;\r\n private boundary: TCanvasCoords;\r\n private objects: SpatialNode[] = [];\r\n private child: Record<TQuadtreeChild, SpatialIndex | null> = {\r\n NE: null,\r\n NW: null,\r\n SE: null,\r\n SW: null,\r\n };\r\n private destroyed = false;\r\n\r\n constructor(boundary: TCanvasCoords) {\r\n this.boundary = boundary;\r\n }\r\n\r\n destroy() {\r\n if (this.destroyed) return;\r\n\r\n this.destroyed = true;\r\n\r\n this.objects = [];\r\n this.child.NE?.destroy();\r\n this.child.NW?.destroy();\r\n this.child.SE?.destroy();\r\n this.child.SW?.destroy();\r\n\r\n this.child = { NE: null, NW: null, SE: null, SW: null };\r\n\r\n this.boundary = { x: 0, y: 0, w: 0, h: 0 };\r\n }\r\n\r\n insert(node: SpatialNode): boolean {\r\n if (this.destroyed) return false;\r\n\r\n if (!this.intersect(node.box, this.boundary)) return false;\r\n if (this.boundary.w <= 1 || this.boundary.h <= 1) {\r\n this.objects.push(node);\r\n return true;\r\n }\r\n\r\n if (this.objects.length < this.capacity && this.child.NE === null) {\r\n this.objects.push(node);\r\n return true;\r\n }\r\n\r\n if (this.child.NE === null) this.subdivide();\r\n const newObject: SpatialNode[] = [];\r\n for (const c of this.objects) if (!this.insertChild(c)) newObject.push(c);\r\n this.objects = newObject;\r\n\r\n if (!this.insertChild(node)) this.objects.push(node);\r\n return true;\r\n }\r\n\r\n intersect(box: TCanvasCoords, boundary: TCanvasCoords) {\r\n if (this.destroyed) return;\r\n return (\r\n box.x < boundary.x + boundary.w &&\r\n box.x + box.w > boundary.x &&\r\n box.y < boundary.y + boundary.h &&\r\n box.y + box.h > boundary.y\r\n );\r\n }\r\n\r\n contains(box: TCanvasCoords, boundary: TCanvasCoords) {\r\n if (this.destroyed) return;\r\n return (\r\n box.x >= boundary.x &&\r\n box.x + box.w <= boundary.x + boundary.w &&\r\n box.y >= boundary.y &&\r\n box.y + box.h <= boundary.y + boundary.h\r\n );\r\n }\r\n\r\n insertChild(node: SpatialNode) {\r\n if (this.destroyed) return false;\r\n\r\n let quad: null | SpatialIndex = null;\r\n for (const child of Object.values(this.child)) {\r\n if (!child || !child.contains(node.box, child.boundary)) continue;\r\n if (!quad) quad = child;\r\n else return false;\r\n }\r\n return quad === null ? false : quad.insert(node);\r\n }\r\n\r\n subdivide() {\r\n if (this.destroyed) return;\r\n\r\n const width = this.boundary.w / 2,\r\n height = this.boundary.h / 2;\r\n this.child.NW = new SpatialIndex({\r\n x: this.boundary.x,\r\n y: this.boundary.y,\r\n w: width,\r\n h: height,\r\n });\r\n this.child.NE = new SpatialIndex({\r\n x: this.boundary.x + width,\r\n y: this.boundary.y,\r\n w: width,\r\n h: height,\r\n });\r\n this.child.SW = new SpatialIndex({\r\n x: this.boundary.x,\r\n y: this.boundary.y + height,\r\n w: width,\r\n h: height,\r\n });\r\n this.child.SE = new SpatialIndex({\r\n x: this.boundary.x + width,\r\n y: this.boundary.y + height,\r\n w: width,\r\n h: height,\r\n });\r\n }\r\n\r\n search(box: TCanvasCoords, found: SpatialNode[] = []) {\r\n if (this.destroyed) return found;\r\n\r\n if (!this.intersect(box, this.boundary)) return found;\r\n\r\n for (const obj of this.objects) {\r\n if (this.intersect(obj.box, box)) found.push(obj);\r\n }\r\n\r\n if (!this.child.NE) return found;\r\n\r\n for (const child of Object.values(this.child)) {\r\n if (child && this.intersect(box, child.boundary)) {\r\n child.search(box, found);\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n searchById(id: string): SpatialNode | null {\r\n if (this.destroyed) return null;\r\n\r\n for (const obj of this.objects) {\r\n if (obj.id === id) return obj;\r\n }\r\n\r\n if (!this.child.NE) return null;\r\n\r\n for (const child of Object.values(this.child)) {\r\n if (!child) continue;\r\n const found = child.searchById(id);\r\n if (found) return found;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n remove(id: string, box: TCanvasCoords): boolean;\r\n remove(id: string): boolean;\r\n remove(id: string, box?: TCanvasCoords) {\r\n if (this.destroyed) return false;\r\n let idx = -1;\r\n if (box) {\r\n const { P1, P2, P3, P4 } = Utils.getHashingNumbers();\r\n const hash = (P1 * box.x) ^ (P2 * box.y) ^ (P3 * box.w) ^ (P4 * box.h);\r\n idx = this.objects.findIndex((o) => o.id === id && o.hash === hash);\r\n }\r\n if (idx === -1) idx = this.objects.findIndex((o) => o.id === id);\r\n\r\n if (idx !== -1) {\r\n this.objects.splice(idx, 1);\r\n return true;\r\n } else if (this.child.NE === null) return false;\r\n\r\n for (const child of Object.values(this.child)) {\r\n if (child && (box ? child.remove(id, box) : child.remove(id))) {\r\n this.tryMerge();\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n update(id: string, newBox: TCanvasCoords) {\r\n const node = this.searchById(id);\r\n if (!node) return false;\r\n this.remove(id);\r\n node.box = newBox;\r\n this.insert(node);\r\n return true;\r\n }\r\n\r\n private tryMerge() {\r\n if (this.destroyed) return;\r\n\r\n if (!this.child.NE) return;\r\n\r\n const allEmpty = Object.values(this.child).every(\r\n (c) => c && c.objects.length === 0 && !c.child.NE\r\n );\r\n if (!allEmpty) return;\r\n this.child = { NE: null, NW: null, SE: null, SW: null };\r\n }\r\n}\r\n\r\nexport default SpatialIndex;\r\n","import { TCanvasCoords } from \"types\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nclass SpatialNode {\r\n hash: number;\r\n constructor(public id: string, public box: TCanvasCoords) {\r\n const { P1, P2, P3, P4 } = Utils.getHashingNumbers();\r\n this.hash = (P1 * box.x) ^ (P2 * box.y) ^ (P3 * box.w) ^ (P4 * box.h);\r\n }\r\n}\r\n\r\nexport default SpatialNode;\r\n","import {\r\n TAnimation,\r\n TBaseCtx,\r\n TCanvasCoords,\r\n TCanvasLayer,\r\n TEvents,\r\n TPieceBoard,\r\n TPieceId,\r\n TPieceInternalRef,\r\n} from \"types\";\r\nimport { ICanvasLayer } from \"./interface\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport SpatialIndex from \"./spatialIndex\";\r\nimport SpatialNode from \"./spatialNode\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nabstract class BaseLayer implements ICanvasLayer {\r\n name: TCanvasLayer;\r\n protected boardRuntime: BoardRuntime;\r\n protected pieces = new Map<TPieceId, TPieceInternalRef>();\r\n protected coordsMap = new Map<TPieceId, TCanvasCoords>();\r\n protected clearMap = new Map<TPieceId, TCanvasCoords>();\r\n protected renderMap = new Set<TPieceId>();\r\n protected clearQueue: TCanvasCoords[] = [];\r\n protected clearQueueHash: Set<number> = new Set();\r\n protected eventsMap: Record<TEvents, TCanvasCoords[]> = {} as Record<\r\n TEvents,\r\n TCanvasCoords[]\r\n >;\r\n protected pendingResolvers: Map<number, () => void> = new Map();\r\n protected animationGen = 0;\r\n protected animationRef: number | null = null;\r\n protected animation: TAnimation[] = [];\r\n protected ctx: TBaseCtx | null = null;\r\n\r\n protected delayedPieceClear: Map<TPieceId, TPieceId> = new Map();\r\n private destroyed = false;\r\n spatialIndex: SpatialIndex;\r\n\r\n constructor(name: TCanvasLayer, boardRuntime: BoardRuntime) {\r\n this.name = name;\r\n this.boardRuntime = boardRuntime;\r\n this.ctx = boardRuntime.getCanvasLayers().getContext(name);\r\n const size = this.boardRuntime.getSize();\r\n this.spatialIndex = new SpatialIndex({ x: 0, y: 0, w: size, h: size });\r\n }\r\n\r\n destroy() {\r\n this.clearAnimation();\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n this.destroyed = true;\r\n }\r\n\r\n update(delta: number): void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n clearPieces?(board: TPieceBoard[]): void {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n clear(): void {\r\n const canvasLayers = this.boardRuntime.getCanvasLayers();\r\n const dpr = canvasLayers.getDpr();\r\n\r\n for (const c of this.clearQueue) {\r\n this.ctx?.save();\r\n this.ctx?.setTransform(1, 0, 0, 1, 0, 0);\r\n this.ctx?.clearRect(c.x * dpr, c.y * dpr, c.w * dpr, c.h * dpr);\r\n this.ctx?.restore();\r\n }\r\n this.resetClearQueue();\r\n }\r\n\r\n async draw(): Promise<void> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n addPiece?(pieceId: TPieceId, ref: TPieceInternalRef): void {\r\n this.pieces.set(pieceId, ref);\r\n }\r\n removePiece?(pieceId: TPieceId): void {\r\n this.pieces.delete(pieceId);\r\n }\r\n addAll?(\r\n pieceId: TPieceId,\r\n ref: TPieceInternalRef,\r\n coords: TCanvasCoords,\r\n clearCoords: TCanvasCoords\r\n ) {\r\n if (this.pieces.has(pieceId) || !this.boardRuntime.isActivePiece(pieceId))\r\n return;\r\n if (\r\n ref.square?.notation &&\r\n this.boardRuntime.getBoard()[ref.square.notation]\r\n ) {\r\n const curr = this.boardRuntime.getBoard()[ref.square.notation];\r\n curr.id !== pieceId;\r\n this.removeAll?.(curr.id);\r\n }\r\n this.addCoords(pieceId, coords);\r\n this.addPiece?.(pieceId, ref);\r\n this.addClearCoords(pieceId, clearCoords);\r\n this.addToRender(pieceId);\r\n }\r\n removeAll?(pieceId: TPieceId) {\r\n if (!this.pieces.has(pieceId)) return;\r\n const coords = this.getClearCoords(pieceId);\r\n coords && this.addClearQueue(coords);\r\n\r\n this.removePiece?.(pieceId);\r\n this.removeToRender(pieceId);\r\n this.removeCoords(pieceId);\r\n this.removeClearCoords(pieceId);\r\n }\r\n\r\n handleEvent?(event: TEvents, coords: TCanvasCoords): void {\r\n if (!this.eventsMap[event]) this.eventsMap[event] = [];\r\n this.eventsMap[event].push(coords);\r\n }\r\n\r\n addCoords(pieceId: TPieceId, coords: TCanvasCoords) {\r\n if (!this.spatialIndex.update(pieceId, coords))\r\n this.spatialIndex.insert(new SpatialNode(pieceId, coords));\r\n this.coordsMap.set(pieceId, { ...coords, id: pieceId });\r\n }\r\n\r\n removeCoords(pieceId: TPieceId) {\r\n const box = this.getCoords(pieceId);\r\n if (!box) return;\r\n this.spatialIndex.remove(pieceId, box), pieceId;\r\n this.coordsMap.delete(pieceId);\r\n }\r\n\r\n addClearCoords(pieceId: TPieceId, coords: TCanvasCoords) {\r\n this.clearMap.set(pieceId, { ...coords, id: pieceId });\r\n }\r\n\r\n removeClearCoords(pieceId: TPieceId) {\r\n this.clearMap.delete(pieceId);\r\n }\r\n\r\n addToRender(pieceId: TPieceId) {\r\n this.renderMap.add(pieceId);\r\n }\r\n\r\n removeToRender(pieceId: TPieceId) {\r\n this.renderMap.delete(pieceId);\r\n }\r\n\r\n addClearQueue(coords: TCanvasCoords) {\r\n const { P1, P2, P3, P4 } = Utils.getHashingNumbers();\r\n const hash =\r\n (P1 * coords.x) ^ (P2 * coords.y) ^ (P3 * coords.w) ^ (P4 * coords.h);\r\n\r\n if (this.clearQueueHash.has(hash)) return;\r\n this.clearQueueHash.add(hash);\r\n this.clearQueue.push(coords);\r\n }\r\n\r\n resetClearQueue() {\r\n this.clearQueue = [];\r\n this.clearQueueHash.clear();\r\n }\r\n\r\n addEvent(event: TEvents, coords: TCanvasCoords[] | TCanvasCoords) {\r\n if (!this.eventsMap[event]) this.eventsMap[event] = [];\r\n coords = Array.isArray(coords) ? coords : [coords];\r\n this.eventsMap[event].push(...coords);\r\n }\r\n\r\n removeEvent(event: TEvents) {\r\n const hasEvent = this.eventsMap[event];\r\n\r\n if (!hasEvent) return;\r\n const regions: TCanvasCoords[] = [];\r\n for (const e of hasEvent) {\r\n this.addClearQueue(e);\r\n regions.push(e);\r\n }\r\n delete this.eventsMap[event];\r\n const layerManager = this.boardRuntime.renderer.getLayerManager();\r\n for (const [e, coords] of Object.entries(this.eventsMap)) {\r\n for (const c of coords) {\r\n for (const r of regions) {\r\n if (this.intersects(c, r)) {\r\n layerManager.addDraw(e as TEvents);\r\n layerManager.removeEvent(e as TEvents);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n intersects(a: TCanvasCoords, b: TCanvasCoords) {\r\n return !(\r\n a.x + a.w <= b.x ||\r\n b.x + b.w <= a.x ||\r\n a.y + a.h <= b.y ||\r\n b.y + b.h <= a.y\r\n );\r\n }\r\n\r\n pieceIntersects(a: TCanvasCoords, b: TCanvasCoords) {\r\n const left = Math.max(a.x, b.x);\r\n const right = Math.min(a.x + a.w, b.x + b.w);\r\n const top = Math.max(a.y, b.y);\r\n const bottom = Math.min(a.y + a.h, b.y + b.h);\r\n\r\n const overlapW = right - left;\r\n const overlapH = bottom - top;\r\n\r\n if (overlapW <= 0 || overlapH <= 0) return false;\r\n return overlapW >= 2 && overlapH >= 2;\r\n }\r\n\r\n getCtx() {\r\n return this.ctx;\r\n }\r\n\r\n hasPiece(pieceId: TPieceId) {\r\n return this.pieces.has(pieceId);\r\n }\r\n\r\n getPiece(pieceId: TPieceId) {\r\n return this.pieces.get(pieceId);\r\n }\r\n\r\n getCoords(pieceId: TPieceId) {\r\n return this.coordsMap.get(pieceId);\r\n }\r\n\r\n getClearCoords(pieceId: TPieceId) {\r\n return this.clearMap.get(pieceId);\r\n }\r\n\r\n getToRender() {\r\n return Array.from(this.renderMap.keys());\r\n }\r\n\r\n hasToRender(pieceId: TPieceId) {\r\n return this.renderMap.has(pieceId);\r\n }\r\n\r\n clearRenderMap() {\r\n this.renderMap.clear();\r\n }\r\n\r\n resetLayer() {\r\n const size = this.boardRuntime.getSize();\r\n this.pieces.clear();\r\n this.coordsMap.clear();\r\n this.renderMap.clear();\r\n this.clearMap.clear();\r\n this.spatialIndex.destroy();\r\n this.spatialIndex = new SpatialIndex({\r\n x: 0,\r\n y: 0,\r\n w: size,\r\n h: size,\r\n });\r\n this.clearQueue.length = 0;\r\n this.eventsMap = {} as Record<TEvents, TCanvasCoords[]>;\r\n }\r\n\r\n redrawPieces() {\r\n for (const id of this.pieces.keys()) this.addToRender(id);\r\n }\r\n\r\n updateClear(): void {\r\n return;\r\n }\r\n\r\n postRender(): void {\r\n return;\r\n }\r\n\r\n setAnimationRef(ref: number | null) {\r\n this.animationRef = ref;\r\n }\r\n\r\n clearAnimation() {\r\n if (this.animationRef) {\r\n cancelAnimationFrame(this.animationRef);\r\n this.setAnimationRef(null);\r\n }\r\n\r\n this.incrementAnimationGen();\r\n\r\n if (this.pendingResolvers.size > 0) {\r\n for (const [, resolver] of this.pendingResolvers) {\r\n try {\r\n resolver();\r\n } catch (e) {\r\n /* swallow */\r\n }\r\n }\r\n this.pendingResolvers.clear();\r\n }\r\n }\r\n\r\n setPendingResolvers(key: number, resolver: () => void) {\r\n this.pendingResolvers.set(key, resolver);\r\n }\r\n\r\n getPendingResolvers() {\r\n return this.pendingResolvers;\r\n }\r\n\r\n getAnimationGen() {\r\n return this.animationGen;\r\n }\r\n\r\n setResolverGen(n: number) {\r\n this.animationGen = n;\r\n }\r\n\r\n incrementAnimationGen() {\r\n this.animationGen++;\r\n }\r\n\r\n getAnimation() {\r\n return this.animation;\r\n }\r\n\r\n getAnimationRef() {\r\n return this.animationRef;\r\n }\r\n\r\n addAnimation(anim: TAnimation) {\r\n this.animation.push(anim);\r\n }\r\n\r\n updateAnimation() {\r\n this.animation = this.animation.filter((anim) => anim.piece.anim);\r\n this.animation.length <= 0 && this.boardRuntime.setIsMoving(false);\r\n }\r\n\r\n getEvents(event?: TEvents) {\r\n if (event) return this.eventsMap[event];\r\n return this.eventsMap;\r\n }\r\n\r\n drawEvent(fun: (ctx: TBaseCtx) => void, event: TEvents) {\r\n if (!this.ctx) return;\r\n fun(this.ctx);\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .applyDrawResult(this.ctx, this.name, event);\r\n }\r\n\r\n async render(delta: number) {\r\n this.updateClear();\r\n this.update?.(delta);\r\n this.clear();\r\n this.draw();\r\n this.postRender();\r\n }\r\n\r\n async renderAsync() {\r\n await this.render(0);\r\n }\r\n}\r\n\r\nexport default BaseLayer;\r\n","import BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport BaseLayer from \"./baseLayer\";\r\nimport { TDrawRegion } from \"types\";\r\n\r\nclass BoardLayer extends BaseLayer {\r\n constructor(boardRuntime: BoardRuntime) {\r\n super(\"board\", boardRuntime);\r\n }\r\n update(delta: number): void {\r\n return;\r\n }\r\n async draw(): Promise<void> {\r\n const ctx = this.ctx;\r\n if (!ctx) return;\r\n\r\n const size = this.boardRuntime.getSize(),\r\n isBlackView = this.boardRuntime.getIsBlackView(),\r\n lightTile = this.boardRuntime.getLightTile(),\r\n darkTile = this.boardRuntime.getDarkTile();\r\n\r\n ctx.clearRect(0, 0, size, size);\r\n\r\n const squareSize = size / 8;\r\n const firstColor = !isBlackView ? lightTile : darkTile,\r\n secondColor = !isBlackView ? darkTile : lightTile;\r\n\r\n // draw board\r\n for (let rank = 0; rank < 8; ++rank) {\r\n for (let file = 0; file < 8; ++file) {\r\n const isLight = (rank + file) % 2 === 0;\r\n const rank_ = isBlackView ? 7 - rank : rank;\r\n const file_ = isBlackView ? 7 - file : file;\r\n ctx.fillStyle = isLight ? firstColor : secondColor;\r\n ctx.fillRect(\r\n file_ * squareSize,\r\n rank_ * squareSize,\r\n squareSize,\r\n squareSize\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default BoardLayer;\r\n","import BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport BaseLayer from \"./baseLayer\";\r\n\r\nclass UnderlayLayer extends BaseLayer {\r\n constructor(boardRuntime: BoardRuntime) {\r\n super(\"underlay\", boardRuntime);\r\n }\r\n\r\n update(delta: number): void {\r\n return;\r\n }\r\n\r\n async draw(): Promise<void> {\r\n return;\r\n }\r\n}\r\n\r\nexport default UnderlayLayer;\r\n","import Utils from \"../../utils/utils\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport BaseLayer from \"./baseLayer\";\r\nimport {\r\n TCanvasCoords,\r\n TDrawRegion,\r\n TPieceBoard,\r\n TPieceId,\r\n TPieceInternalRef,\r\n} from \"types\";\r\n\r\nclass StaticPiecesLayer extends BaseLayer {\r\n constructor(boardRuntime: BoardRuntime) {\r\n super(\"staticPieces\", boardRuntime);\r\n }\r\n\r\n updateClear(): void {\r\n const checked: Set<TPieceId> = new Set();\r\n for (const coords of this.clearQueue) {\r\n const search = this.spatialIndex.search(coords);\r\n for (const s of search) {\r\n const id = s.id as TPieceId;\r\n const { P1, P2, P3, P4 } = Utils.getHashingNumbers();\r\n const hash =\r\n (P1 * s.box.x) ^ (P2 * s.box.y) ^ (P3 * s.box.w) ^ (P4 * s.box.h);\r\n if (\r\n checked.has(id) ||\r\n this.renderMap.has(id) ||\r\n coords.id === id ||\r\n this.clearQueueHash.has(hash)\r\n )\r\n continue;\r\n\r\n this.addClearQueue({ ...s.box, id });\r\n this.renderMap.add(id);\r\n checked.add(id);\r\n //debug\r\n this.ctx &&\r\n ((this.ctx.strokeStyle = \"rgba(251, 0, 0, 1)\"),\r\n (this.ctx.lineWidth = 8));\r\n this.ctx?.strokeRect(coords.x, coords.y, coords.w, coords.h);\r\n console.log(coords.id, \" --- \", s.id, s.box, coords);\r\n }\r\n }\r\n }\r\n update(delta: number): void {\r\n return;\r\n }\r\n\r\n async draw() {\r\n const toRender = this.getToRender();\r\n const piecesImage = this.boardRuntime.getPieceStyle(),\r\n pieceHoverRef = this.boardRuntime.getPieceHover(),\r\n squareSize = Math.ceil(this.boardRuntime.getSize() / 8),\r\n ctx = this.ctx;\r\n\r\n if (!piecesImage || !toRender || !toRender.length) return;\r\n if (\r\n typeof piecesImage.bB !== \"string\" &&\r\n !(piecesImage.bB instanceof HTMLImageElement)\r\n )\r\n return;\r\n\r\n if (!ctx) return;\r\n\r\n for (const id of toRender) {\r\n const piece = this.getPiece(id);\r\n if (!piece) continue;\r\n ctx.save();\r\n if (piecesImage && id !== pieceHoverRef) {\r\n let image = piecesImage[piece.type];\r\n if (image instanceof HTMLImageElement)\r\n this.DrawHTMLPiece(image, ctx, piece, squareSize);\r\n else if (typeof image === \"string\")\r\n this.DrawTextPiece(image, ctx, piece, squareSize);\r\n }\r\n ctx.restore();\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .applyDrawResult(ctx, \"staticPieces\", undefined, id);\r\n }\r\n\r\n this.clearRenderMap();\r\n }\r\n\r\n clearPieces(board: TPieceBoard[]) {\r\n const squareSize = Math.ceil(this.boardRuntime.getSize() / 8);\r\n\r\n const newPieces = new Set<TPieceId>();\r\n for (const piece of board) {\r\n if (this.hasPiece(piece.id)) {\r\n newPieces.add(piece.id);\r\n }\r\n }\r\n\r\n for (const [id, piece] of this.pieces) {\r\n if (\r\n !newPieces.has(id) &&\r\n !this.boardRuntime.renderer.getLayerManager().isDelayedPieceClear(id)\r\n ) {\r\n const coords: TCanvasCoords = {\r\n x: piece.x,\r\n y: piece.y,\r\n w: squareSize,\r\n h: squareSize,\r\n };\r\n\r\n this.addClearQueue({ ...coords, id });\r\n this.removeAll?.(id);\r\n }\r\n }\r\n }\r\n\r\n private DrawHTMLPiece(\r\n image: HTMLImageElement,\r\n ctx: CanvasRenderingContext2D,\r\n piece: TPieceInternalRef,\r\n squareSize: number\r\n ) {\r\n const coords = Utils.squareToCoords(\r\n piece.square,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView()\r\n );\r\n if (!coords) return;\r\n\r\n if (image && image.complete && image.naturalWidth > 0) {\r\n ctx.drawImage(image, coords.x, coords.y, squareSize, squareSize);\r\n }\r\n }\r\n\r\n private DrawTextPiece(\r\n image: string,\r\n ctx: CanvasRenderingContext2D,\r\n piece: TPieceInternalRef,\r\n squareSize: number\r\n ) {\r\n const coords = Utils.squareToCoords(\r\n piece.square,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView()\r\n );\r\n if (!coords) return;\r\n\r\n const image_ = image.length > 1 ? image[0] : image;\r\n ctx.fillStyle = piece.type[0] === \"w\" ? \"#ffffffff\" : \"#000000ff\";\r\n ctx.font = `${squareSize * 0.7}px monospace`;\r\n let fontSize = squareSize * 0.7;\r\n ctx.font = `${fontSize}px monospace`;\r\n const textWidth = ctx.measureText(image_).width;\r\n if (textWidth > squareSize * 0.9) {\r\n fontSize *= (squareSize * 0.9) / textWidth;\r\n ctx.font = `${fontSize}px monospace`;\r\n }\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n ctx.fillText(image_, coords.x + squareSize / 2, coords.y + squareSize / 2);\r\n }\r\n\r\n private DrawPathPiece(\r\n image: Path2D,\r\n ctx: CanvasRenderingContext2D,\r\n piece: TPieceInternalRef,\r\n squareSize: number\r\n ) {\r\n ctx.save();\r\n ctx.translate(piece.x + squareSize / 2, piece.y + squareSize / 2);\r\n const scale = squareSize / 100;\r\n ctx.scale(scale, scale);\r\n ctx.fillStyle = piece.type.startsWith(\"w\") ? \"#fff\" : \"#000\";\r\n ctx.fill(image);\r\n ctx.restore();\r\n }\r\n}\r\n\r\nexport default StaticPiecesLayer;\r\n","import BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport BaseLayer from \"./baseLayer\";\r\nimport { TDrawRegion, TEvents, TPieceId, TPieceInternalRef } from \"types\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nclass DynamicPiecesLayer extends BaseLayer {\r\n private scale: number = 1.1;\r\n private toggleCanvas: TPieceId[] = [];\r\n constructor(boardRuntime: BoardRuntime) {\r\n super(\"dynamicPieces\", boardRuntime);\r\n }\r\n\r\n updateClear(): void {\r\n const CLEAR: TEvents[] = [\"onPointerDrag\"];\r\n for (const e of CLEAR) this.removeEvent(e as TEvents);\r\n }\r\n\r\n private defaultPieceAnimation(delta: number) {\r\n const animation = this.getAnimation();\r\n for (let i = 0; i < animation.length; i++) {\r\n const anim = animation[i];\r\n\r\n const distance = Math.hypot(\r\n anim.to.x - anim.from.x,\r\n anim.to.y - anim.from.y\r\n );\r\n const duration = Math.min(\r\n 400,\r\n Math.max(\r\n 150,\r\n this.boardRuntime.getAnimationDuration() + distance * 0.08\r\n )\r\n );\r\n const easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3);\r\n\r\n const progress = Math.max(\r\n 0,\r\n Math.min((delta - anim.start) / duration, 1)\r\n );\r\n const piece_ = anim.piece;\r\n const eased = easeOutCubic(progress);\r\n\r\n const coords = this.getClearCoords(anim.id);\r\n coords && this.addClearQueue(coords);\r\n\r\n piece_.x = anim.from.x + (anim.to.x - anim.from.x) * eased;\r\n piece_.y = anim.from.y + (anim.to.y - anim.from.y) * eased;\r\n\r\n if (eased < 1) {\r\n this.addPiece?.(anim.id, piece_);\r\n this.addToRender(anim.id);\r\n } else {\r\n piece_.anim = false;\r\n this.toggleCanvas.push(anim.id);\r\n }\r\n }\r\n }\r\n\r\n update(delta: number) {\r\n if (this.boardRuntime.getDefaultAnimation())\r\n this.defaultPieceAnimation(delta);\r\n }\r\n\r\n async draw() {\r\n const piecesImage = this.boardRuntime.getPieceStyle(),\r\n toRender = this.getToRender(),\r\n pieceHoverRef = this.boardRuntime.getPieceHover(),\r\n squareSize = Math.ceil(this.boardRuntime.getSize() / 8),\r\n selected = this.boardRuntime.getSelected(),\r\n ctx = this.ctx,\r\n layerManager = this.boardRuntime.renderer.getLayerManager();\r\n\r\n if (!piecesImage || !toRender || !toRender.length) return;\r\n if (\r\n typeof piecesImage.bB !== \"string\" &&\r\n !(piecesImage.bB instanceof HTMLImageElement)\r\n )\r\n return;\r\n\r\n if (!ctx) return;\r\n\r\n for (const id of toRender) {\r\n const piece = this.getPiece(id);\r\n if (!piece) continue;\r\n if (id === pieceHoverRef && !piece.anim) continue;\r\n ctx.save();\r\n const image = piecesImage && piecesImage[piece.type];\r\n\r\n if (selected?.isPending && selected.id === id) ctx.globalAlpha = 0.5;\r\n if (image instanceof HTMLImageElement)\r\n this.DrawHTMLPiece(\r\n image,\r\n ctx,\r\n piece,\r\n squareSize,\r\n selected?.isPending && selected.id === id ? true : false\r\n );\r\n else if (typeof image === \"string\")\r\n this.DrawTextPiece(\r\n image,\r\n ctx,\r\n piece,\r\n squareSize,\r\n selected?.isPending && selected.id === id ? true : false\r\n );\r\n ctx.restore();\r\n\r\n if (selected?.isDragging && selected.id === id)\r\n layerManager.applyDrawResult(ctx, \"dynamicPieces\", \"onPointerDrag\", id);\r\n else layerManager.applyDrawResult(ctx, \"dynamicPieces\", undefined, id);\r\n }\r\n\r\n for (const pieceId of this.toggleCanvas) {\r\n layerManager.clearDelayedPiece(pieceId, \"staticPieces\");\r\n await this.boardRuntime.renderer\r\n .getLayerManager()\r\n .togglePieceLayer(\"dynamicPieces\", \"staticPieces\", pieceId, true);\r\n }\r\n\r\n if (this.toggleCanvas.length > 0)\r\n await this.boardRuntime.renderer.render({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n this.toggleCanvas.length = 0;\r\n }\r\n\r\n postRender(): void {\r\n if (this.animation.length > 0) this.updateAnimation();\r\n }\r\n\r\n private DrawHTMLPiece(\r\n image: HTMLImageElement,\r\n ctx: CanvasRenderingContext2D,\r\n piece: TPieceInternalRef,\r\n squareSize: number,\r\n isPending: boolean\r\n ) {\r\n const x = isPending\r\n ? piece.x\r\n : piece.x - (squareSize * (this.scale - 1)) / 2;\r\n const y = isPending\r\n ? piece.y\r\n : piece.y - (squareSize * (this.scale - 1)) / 2;\r\n const w = isPending ? squareSize : squareSize * this.scale;\r\n if (image && image.complete && image.naturalWidth > 0) {\r\n ctx.drawImage(image, x, y, w, w);\r\n }\r\n }\r\n\r\n private DrawTextPiece(\r\n image: string,\r\n ctx: CanvasRenderingContext2D,\r\n piece: TPieceInternalRef,\r\n squareSize: number,\r\n isPending: boolean\r\n ) {\r\n const image_ = image.length > 1 ? image[0] : image;\r\n ctx.save();\r\n ctx.fillStyle = piece.type[0] === \"w\" ? \"#ffffffff\" : \"#000\";\r\n ctx.font = isPending\r\n ? `${squareSize * 0.7}px monospace`\r\n : `${squareSize * 0.8 * this.scale}px monospace`;\r\n let fontSize = isPending ? squareSize * 0.7 : squareSize * 0.8;\r\n ctx.font = `${fontSize}px monospace`;\r\n const textWidth = ctx.measureText(image_).width;\r\n if (textWidth > squareSize * 0.9) {\r\n fontSize *= (squareSize * 0.9) / textWidth;\r\n ctx.font = `${fontSize}px monospace`;\r\n }\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n ctx.fillText(image_, piece.x + squareSize / 2, piece.y + squareSize / 2);\r\n ctx.restore();\r\n }\r\n\r\n async renderAsync(): Promise<void> {\r\n const animation = this.getAnimation();\r\n\r\n if (animation.length === 0) {\r\n this.clearAnimation();\r\n await this.render(0);\r\n return;\r\n }\r\n\r\n this.incrementAnimationGen();\r\n const gen = this.getAnimationGen();\r\n\r\n return new Promise<void>((resolve) => {\r\n let resolved = false;\r\n const resolver = () => {\r\n if (resolved) return;\r\n\r\n this.getPendingResolvers().delete(gen);\r\n try {\r\n resolve();\r\n } catch (e) {\r\n /* swallow */\r\n }\r\n };\r\n\r\n this.setPendingResolvers(gen, resolver);\r\n\r\n const render = (time: number) => {\r\n if (gen !== this.getAnimationGen()) return;\r\n\r\n const animation = this.getAnimation();\r\n\r\n if (animation.length === 0) {\r\n resolver();\r\n this.setAnimationRef(null);\r\n return;\r\n }\r\n\r\n this.render(time);\r\n const nextRef = requestAnimationFrame(render);\r\n this.setAnimationRef(nextRef);\r\n };\r\n const firstRef = requestAnimationFrame(render);\r\n this.setAnimationRef(firstRef);\r\n });\r\n }\r\n}\r\n\r\nexport default DynamicPiecesLayer;\r\n","import { TDrawRegion } from \"types\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport BaseLayer from \"./baseLayer\";\r\n\r\nclass OverlayLayer extends BaseLayer {\r\n constructor(boardRuntime: BoardRuntime) {\r\n super(\"overlay\", boardRuntime);\r\n }\r\n\r\n update(delta: number): void {\r\n return;\r\n }\r\n\r\n async draw(): Promise<void> {\r\n return;\r\n }\r\n}\r\n\r\nexport default OverlayLayer;\r\n","import { TBaseCtx } from \"types\";\r\nimport { TBoardEventContext, TEvents } from \"../../types/events\";\r\nimport { TPieceInternalRef } from \"../../types/piece\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nclass Iterators {\r\n ITERATORS: Record<TEvents, any> = {\r\n onPointerSelect: \"defaultOnSelect\",\r\n onPointerHover: \"defaultOnHover\",\r\n onPointerDragStart: null,\r\n onPointerDrag: null,\r\n onPointerDrop: null,\r\n onAnimationFrame: null,\r\n onDrawPiece: null,\r\n onDrawBoard: null,\r\n onDrawOverlay: null,\r\n onDrawUnderlay: null,\r\n };\r\n constructor(protected boardRuntime: BoardRuntime) {}\r\n\r\n destroy() {\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n defaultOnSelect<T extends TBoardEventContext = TBoardEventContext>(args: T) {\r\n const { squareSize, x, y } = args;\r\n //canvas && (canvas.style.zIndex = \"3\");\r\n //const canvas = getCanvas;\r\n\r\n const drawSelect = (ctx: TBaseCtx) => {\r\n const SELECT_COLOR = \"#ffc400ff\";\r\n const SELECT_GLOW = \"rgba(255, 196, 0, 0.75)\";\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.arc(\r\n x + squareSize / 2,\r\n y + squareSize / 2,\r\n squareSize * 0.35,\r\n 0,\r\n Math.PI * 2\r\n );\r\n ctx.strokeStyle = SELECT_COLOR;\r\n ctx.lineWidth = 3;\r\n ctx.fillStyle = SELECT_GLOW;\r\n ctx.stroke();\r\n ctx.fill();\r\n ctx.restore();\r\n };\r\n\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getLayer(\"underlay\")\r\n .drawEvent(drawSelect, \"onPointerSelect\");\r\n\r\n if (\"clearCache\" in args && typeof args[\"clearCache\"] === \"function\")\r\n (args as any).clearCache();\r\n }\r\n\r\n defaultOnHover<T extends TBoardEventContext = TBoardEventContext>(args: T) {\r\n const { squareSize, piece, piecesImage } = args;\r\n const hoverConfig = this.boardRuntime.getHoverConfig();\r\n if (!piece) return;\r\n const image = piecesImage?.[piece.type];\r\n\r\n // highlight\r\n if (\r\n hoverConfig.highlight &&\r\n this.boardRuntime.getSelected()?.id !== this.boardRuntime.getPieceHover()\r\n ) {\r\n const drawHighlight = (ctx: TBaseCtx) => {\r\n ctx.save();\r\n\r\n ctx.shadowColor = \"rgba(255, 204, 0, 0.8)\";\r\n ctx.shadowBlur = 10;\r\n ctx.shadowOffsetX = 0;\r\n ctx.shadowOffsetY = 0;\r\n\r\n ctx.lineWidth = 3.5;\r\n ctx.strokeStyle = \"#ffcc00\";\r\n ctx.lineJoin = \"round\";\r\n\r\n ctx.beginPath();\r\n ctx.strokeRect(\r\n piece.x + 1,\r\n piece.y + 1,\r\n squareSize - 2,\r\n squareSize - 2\r\n );\r\n\r\n ctx.restore();\r\n };\r\n\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getLayer(\"overlay\")\r\n .drawEvent(drawHighlight, \"onPointerHover\");\r\n }\r\n\r\n // scaling\r\n if (hoverConfig.scaling && piece) {\r\n const drawScaling = (ctx: TBaseCtx) => {\r\n ctx.save();\r\n ctx.shadowColor = \"rgba(0, 0, 0, 0.5)\";\r\n ctx.shadowBlur = 10;\r\n ctx.shadowOffsetX = 5;\r\n ctx.shadowOffsetY = 5;\r\n\r\n if (image instanceof HTMLImageElement)\r\n this.drawOnHoverHTML(\r\n image,\r\n ctx,\r\n piece,\r\n squareSize,\r\n hoverConfig.scaleAmount\r\n );\r\n else if (typeof image === \"string\")\r\n this.drawOnHoverText(\r\n image,\r\n ctx,\r\n piece,\r\n squareSize,\r\n hoverConfig.scaleAmount\r\n );\r\n ctx.restore();\r\n };\r\n\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getLayer(\"dynamicPieces\")\r\n .drawEvent(drawScaling, \"onPointerHover\");\r\n }\r\n\r\n if (\"clearCache\" in args && typeof args[\"clearCache\"] === \"function\")\r\n (args as any).clearCache();\r\n }\r\n\r\n drawOnHoverHTML(\r\n image: HTMLImageElement,\r\n ctx: TBaseCtx,\r\n piece: TPieceInternalRef,\r\n squareSize: number,\r\n scale: number\r\n ) {\r\n const coords = Utils.squareToCoords(\r\n piece.square,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView()\r\n );\r\n if (!coords) return;\r\n if (image && image.complete && image.naturalWidth > 0) {\r\n ctx.drawImage(\r\n image,\r\n coords.x - (squareSize * (scale - 1)) / 2,\r\n coords.y - (squareSize * (scale - 1)) / 2,\r\n squareSize * scale,\r\n squareSize * scale\r\n );\r\n }\r\n }\r\n\r\n drawOnHoverText(\r\n image: string,\r\n ctx: TBaseCtx,\r\n piece: TPieceInternalRef,\r\n squareSize: number,\r\n scale: number\r\n ) {\r\n const coords = Utils.squareToCoords(\r\n piece.square,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView()\r\n );\r\n if (!coords) return;\r\n const image_ = image.length > 1 ? image[0] : image;\r\n ctx.save();\r\n ctx.fillStyle = piece.type[0] === \"w\" ? \"#ffffffff\" : \"#000\";\r\n ctx.font = `${squareSize * 0.8 * scale}px monospace`;\r\n let fontSize = squareSize * 0.8;\r\n ctx.font = `${fontSize}px monospace`;\r\n const textWidth = ctx.measureText(image_).width;\r\n if (textWidth > squareSize * 0.9) {\r\n fontSize *= (squareSize * 0.9) / textWidth;\r\n ctx.font = `${fontSize}px monospace`;\r\n }\r\n ctx.textAlign = \"center\";\r\n ctx.textBaseline = \"middle\";\r\n ctx.fillText(image_, coords.x + squareSize / 2, coords.y + squareSize / 2);\r\n ctx.restore();\r\n const padding = squareSize * 1.5;\r\n\r\n // DEBUG\r\n /*ctx.save();\r\n ctx.strokeStyle = \"rgba(255,0,0,0.4)\";\r\n ctx.strokeRect(\r\n piece.x + squareSize / 2 - textWidth / 2 - padding / 2,\r\n piece.y + squareSize / 2 - fontSize / 2 - padding / 2,\r\n textWidth + padding,\r\n fontSize + padding\r\n );\r\n ctx.restore();*/\r\n }\r\n\r\n drawOnHoverPath() {}\r\n}\r\nexport default Iterators;\r\n","import BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport {\r\n TCanvasCoords,\r\n TCanvasLayer,\r\n TDrawRegion,\r\n TEvents,\r\n TLazyReturn,\r\n} from \"types\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nclass Events {\r\n eventsLayerMap: Record<TEvents, TCanvasLayer | null> = {\r\n onPointerSelect: \"underlay\",\r\n onPointerHover: \"dynamicPieces\",\r\n onPointerDragStart: \"dynamicPieces\",\r\n onPointerDrag: \"dynamicPieces\",\r\n onPointerDrop: null,\r\n onAnimationFrame: null,\r\n onDrawPiece: null,\r\n onDrawBoard: null,\r\n onDrawOverlay: null,\r\n onDrawUnderlay: null,\r\n };\r\n\r\n eventsRunMap: Record<TEvents, Function> = {\r\n onPointerSelect: this.onPointerSelect.bind(this),\r\n onPointerHover: this.onPointerHover.bind(this),\r\n onPointerDragStart: this.onPointerDragStart.bind(this),\r\n onPointerDrag: this.onPointerDrag.bind(this),\r\n onPointerDrop: this.onPointerDrop.bind(this),\r\n onAnimationFrame: this.onAnimationFrame.bind(this),\r\n onDrawPiece: this.onDrawPiece.bind(this),\r\n onDrawBoard: this.onDrawBoard.bind(this),\r\n onDrawOverlay: this.onDrawOverlay.bind(this),\r\n onDrawUnderlay: this.onDrawUnderlay.bind(this),\r\n };\r\n constructor(protected boardRuntime: BoardRuntime) {}\r\n\r\n getEventLayer(event: TEvents) {\r\n return this.eventsLayerMap[event];\r\n }\r\n\r\n onPointerHover(\r\n ctx: CanvasRenderingContext2D & {\r\n __drawRegions: TDrawRegion[];\r\n __clearRegions: () => void;\r\n __actualRegions: TCanvasCoords[];\r\n }\r\n ) {\r\n const size = this.boardRuntime.getSize(),\r\n piecesImage = this.boardRuntime.getPieceStyle(),\r\n internalRef = this.boardRuntime.getInternalRefObj(),\r\n pieceHoverRef = this.boardRuntime.getPieceHover(),\r\n selectedRef = this.boardRuntime.getSelected(),\r\n events = this.boardRuntime.getEvents(),\r\n squareSize = Math.ceil(size / 8),\r\n injection = this.boardRuntime.getInjection();\r\n\r\n if (pieceHoverRef && !selectedRef?.isDragging) {\r\n const piece = internalRef[pieceHoverRef];\r\n const canvas = this.boardRuntime\r\n .getCanvasLayers()\r\n .getCanvas(\"dynamicPieces\").current\r\n ? this.boardRuntime.getCanvasLayers().getCanvas(\"dynamicPieces\").current\r\n : undefined;\r\n\r\n if (piece && !piece.anim) {\r\n if (this.boardRuntime.getDefault().onPointerHover) {\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getIterator()\r\n .defaultOnHover({\r\n ctx,\r\n size,\r\n squareSize,\r\n x: piece.x,\r\n y: piece.y,\r\n canvas: canvas ? canvas : undefined,\r\n piece: piece,\r\n square: piece.square,\r\n piecesImage: piecesImage,\r\n });\r\n }\r\n if (events?.onPointerHover) {\r\n let context = this.boardRuntime.getContext(true, {\r\n squareSize,\r\n x: piece.x,\r\n y: piece.y,\r\n size,\r\n piece: piece,\r\n square: piece.square,\r\n });\r\n\r\n (context as any).__event = \"onPointerHover\";\r\n this.boardRuntime.helpers.triggerEvent(\r\n events,\r\n \"onPointerHover\",\r\n injection ? injection(context) : context\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n onPointerSelect(\r\n ctx: CanvasRenderingContext2D & {\r\n __drawRegions: TDrawRegion[];\r\n __clearRegions: () => void;\r\n __actualRegions: TCanvasCoords[];\r\n }\r\n ) {\r\n const isBlackView = this.boardRuntime.getIsBlackView(),\r\n size = Math.ceil(this.boardRuntime.getSize()),\r\n piecesImage = this.boardRuntime.getPieceStyle(),\r\n internalRef = this.boardRuntime.getInternalRefObj(),\r\n selectedRef = this.boardRuntime.getSelected(),\r\n events = this.boardRuntime.getEvents(),\r\n injection = this.boardRuntime.getInjection();\r\n const squareSize = size / 8;\r\n\r\n if (!selectedRef?.id || !ctx) return;\r\n\r\n const sqr = internalRef[selectedRef.id]\r\n ? Utils.squareToCoords(selectedRef.square, squareSize, isBlackView)\r\n : null;\r\n\r\n if (sqr) {\r\n const { x, y } = sqr;\r\n const piece_ = this.boardRuntime.helpers.pieceHelper.getPieceAt(\r\n x,\r\n y,\r\n squareSize,\r\n isBlackView,\r\n internalRef\r\n )?.piece;\r\n\r\n if (this.boardRuntime.getDefault().onPointerSelect) {\r\n this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getIterator()\r\n .defaultOnSelect({\r\n ctx,\r\n x,\r\n y,\r\n size,\r\n squareSize,\r\n getPiece: piece_,\r\n getPiecesImage: piecesImage,\r\n getSquare: selectedRef.square,\r\n });\r\n }\r\n\r\n if (events?.onPointerSelect) {\r\n const context = this.boardRuntime.getContext(true, {\r\n squareSize,\r\n x: x,\r\n y: y,\r\n size,\r\n piece: piece_,\r\n square: selectedRef.square,\r\n });\r\n (context as any).__event = \"onPointerSelect\";\r\n this.boardRuntime.helpers.triggerEvent(\r\n events,\r\n \"onPointerSelect\",\r\n injection ? injection(context) : context\r\n );\r\n }\r\n }\r\n }\r\n\r\n onPointerDragStart() {\r\n const selected = this.boardRuntime.getSelected();\r\n if (!selected || !selected.isDragging) return;\r\n this.boardRuntime.getCanvasLayers().setCanvasStyle(\"staticPieces\", {\r\n cursor: \"grabbing\",\r\n });\r\n return;\r\n }\r\n\r\n onPointerDrag() {\r\n const selected = this.boardRuntime.getSelected();\r\n const squareSize = Math.ceil(this.boardRuntime.getSize() / 8);\r\n if (!selected || !selected.isDragging) return;\r\n const piece = this.boardRuntime.getInternalRefVal(selected.id);\r\n if (!piece) return;\r\n const layer = this.boardRuntime.renderer\r\n .getLayerManager()\r\n .getLayer(\"dynamicPieces\");\r\n\r\n layer.addCoords(selected.id, {\r\n x: piece.x,\r\n y: piece.y,\r\n w: squareSize,\r\n h: squareSize,\r\n });\r\n }\r\n onPointerDrop() {\r\n return;\r\n }\r\n onAnimationFrame() {\r\n return;\r\n }\r\n onDrawPiece() {\r\n return;\r\n }\r\n onDrawBoard() {\r\n return;\r\n }\r\n onDrawOverlay() {\r\n return;\r\n }\r\n onDrawUnderlay() {\r\n return;\r\n }\r\n\r\n run(event: TEvents) {\r\n const handler = this.eventsRunMap[event];\r\n if (!handler) return;\r\n\r\n const layer = this.getEventLayer(event);\r\n const ctx = layer\r\n ? this.boardRuntime.getCanvasLayers().getContext(layer)\r\n : null;\r\n handler(ctx);\r\n }\r\n}\r\n\r\nexport default Events;\r\n","import {\r\n TBaseCtx,\r\n TCanvasCoords,\r\n TCanvasLayer,\r\n TDrawRegion,\r\n TEvents,\r\n TPieceId,\r\n TSafeCtx,\r\n} from \"types\";\r\nimport { EVENTS } from \"../../types/events\";\r\nimport BaseLayer from \"./baseLayer\";\r\nimport BoardLayer from \"./boardLayer\";\r\nimport BoardRuntime from \"engine/boardRuntime/boardRuntime\";\r\nimport UnderlayLayer from \"./underlayLayer\";\r\nimport StaticPiecesLayer from \"./staticPieces\";\r\nimport DynamicPiecesLayer from \"./dynamicPiecesLayer\";\r\nimport OverlayLayer from \"./overlayLayer\";\r\nimport Iterators from \"../iterators/iterators\";\r\nimport Events from \"./events\";\r\nimport Utils from \"../../utils/utils\";\r\n\r\nclass LayerManager {\r\n private layers: Record<TCanvasLayer, BaseLayer>;\r\n private iterator: Iterators;\r\n private events: Events;\r\n private interaction: Record<TEvents, boolean> = {\r\n onPointerSelect: true,\r\n onPointerHover: true,\r\n onPointerDragStart: true,\r\n onPointerDrag: true,\r\n onPointerDrop: true,\r\n onAnimationFrame: true,\r\n onDrawPiece: true,\r\n onDrawBoard: true,\r\n onDrawOverlay: true,\r\n onDrawUnderlay: true,\r\n };\r\n private boardRuntime: BoardRuntime;\r\n private drawList: Set<TEvents> = new Set();\r\n private firstDrawList: Set<TEvents> = new Set();\r\n private list: Record<TEvents, Set<TEvents>> = {\r\n onPointerSelect: this.drawList,\r\n onPointerHover: this.drawList,\r\n onPointerDragStart: this.firstDrawList,\r\n onPointerDrag: this.firstDrawList,\r\n onPointerDrop: this.drawList,\r\n onAnimationFrame: this.drawList,\r\n onDrawPiece: this.drawList,\r\n onDrawBoard: this.drawList,\r\n onDrawOverlay: this.drawList,\r\n onDrawUnderlay: this.drawList,\r\n };\r\n private delayedPieceClear: Map<TPieceId, TPieceId> = new Map();\r\n\r\n constructor(boardRuntime: BoardRuntime) {\r\n this.boardRuntime = boardRuntime;\r\n this.layers = {\r\n board: new BoardLayer(boardRuntime),\r\n overlay: new OverlayLayer(boardRuntime),\r\n underlay: new UnderlayLayer(boardRuntime),\r\n staticPieces: new StaticPiecesLayer(boardRuntime),\r\n dynamicPieces: new DynamicPiecesLayer(boardRuntime),\r\n };\r\n\r\n this.iterator = new Iterators(boardRuntime);\r\n this.events = new Events(boardRuntime);\r\n }\r\n\r\n getLayer(layer: TCanvasLayer) {\r\n return this.layers[layer];\r\n }\r\n\r\n getAllLayers() {\r\n return Object.keys(this.layers);\r\n }\r\n\r\n getIterator() {\r\n return this.iterator;\r\n }\r\n\r\n getPieceLayer(pieceId: TPieceId) {\r\n for (const [name, layer] of Object.entries(this.layers))\r\n if (layer.hasPiece(pieceId)) return name as TCanvasLayer;\r\n return null;\r\n }\r\n\r\n removeFromAllLayers(pieceId: TPieceId) {\r\n for (const layer of Object.values(this.layers)) layer.removeAll?.(pieceId);\r\n }\r\n\r\n removeEvent(event: TEvents) {\r\n for (const layer of Object.values(this.layers)) layer.removeEvent(event);\r\n }\r\n\r\n async togglePieceLayer(\r\n from: TCanvasLayer,\r\n to: TCanvasLayer,\r\n pieceId: TPieceId,\r\n noRender?: boolean\r\n ) {\r\n if (from === to) return;\r\n\r\n const fromLayer = this.getLayer(from);\r\n const toLayer = this.getLayer(to);\r\n const squareSize = Math.floor(this.boardRuntime.getSize() / 8);\r\n const isActivePiece = this.boardRuntime.isActivePiece(pieceId);\r\n\r\n if (!fromLayer || !toLayer) {\r\n //console.warn(\"[togglePieceLayer] Invalid Layer:\", from, to);\r\n return;\r\n }\r\n\r\n const piece = fromLayer.getPiece(pieceId);\r\n const coords = fromLayer.getCoords(pieceId);\r\n\r\n if (!piece || !coords) {\r\n /*console.warn(`[togglePieceLayer] Incomplete state for piece ${pieceId}`, {\r\n from,\r\n piece,\r\n coords,\r\n });*/\r\n return;\r\n }\r\n\r\n const coords_ = Utils.squareToCoords(\r\n piece.square,\r\n squareSize,\r\n this.boardRuntime.getIsBlackView()\r\n );\r\n if (!coords_) return;\r\n const newCoords: TCanvasCoords =\r\n to === \"staticPieces\"\r\n ? {\r\n x: Math.floor(coords_.x),\r\n y: Math.floor(coords_.y),\r\n w: Math.ceil(squareSize),\r\n h: Math.ceil(squareSize),\r\n }\r\n : {\r\n x: Math.floor(piece.x),\r\n y: Math.floor(piece.y),\r\n w: Math.ceil(squareSize),\r\n h: Math.ceil(squareSize),\r\n };\r\n\r\n fromLayer.removeAll?.(pieceId);\r\n isActivePiece && toLayer.addAll?.(pieceId, piece, newCoords, newCoords);\r\n\r\n if (noRender) return;\r\n this.boardRuntime.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n\r\n applyDrawResult(\r\n ctx_:\r\n | (TSafeCtx & {\r\n __drawRegions: TDrawRegion[];\r\n __actualRegions: TCanvasCoords[];\r\n __clearRegions: () => void;\r\n })\r\n | TBaseCtx,\r\n layer: TCanvasLayer,\r\n event?: TEvents,\r\n record?: TPieceId\r\n ) {\r\n const regions = ctx_.__drawRegions;\r\n const actualRegions = ctx_.__actualRegions;\r\n\r\n for (const coords of regions) {\r\n const coords_ = {\r\n x: Math.floor(coords.x),\r\n y: Math.floor(coords.y),\r\n w: Math.ceil(coords.w),\r\n h: Math.ceil(coords.h),\r\n };\r\n if (record) this.getLayer(layer).addClearCoords(record, coords_);\r\n if (event) this.getLayer(layer).addEvent(event, coords_);\r\n }\r\n\r\n for (const coords of actualRegions) {\r\n const coords_ = {\r\n x: Math.floor(coords.x),\r\n y: Math.floor(coords.y),\r\n w: Math.ceil(coords.w),\r\n h: Math.ceil(coords.h),\r\n };\r\n if (record) this.getLayer(layer).addCoords(record, coords_);\r\n }\r\n\r\n ctx_.__clearRegions();\r\n }\r\n\r\n drawEvent(event: TEvents) {\r\n this.removeEvent(event);\r\n this.addDraw(event);\r\n }\r\n\r\n addDraw(event: TEvents) {\r\n this.list[event].add(event);\r\n }\r\n\r\n removeDraw(event: TEvents) {\r\n this.list[event].delete(event);\r\n }\r\n\r\n getEventEnabled() {\r\n return this.interaction;\r\n }\r\n\r\n isSelectionEnabled() {\r\n return this.interaction.onPointerSelect;\r\n }\r\n\r\n isHoverEnabled() {\r\n return this.interaction.onPointerHover;\r\n }\r\n\r\n setHoverEnabled(b: boolean) {\r\n return (this.interaction.onPointerHover = b);\r\n }\r\n\r\n setSelectionEnabled(b: boolean) {\r\n return (this.interaction.onPointerSelect = b);\r\n }\r\n\r\n resetAllLayers() {\r\n for (const layer of Object.values(this.layers)) layer.resetLayer();\r\n }\r\n\r\n renderEvents(first: boolean) {\r\n const list = first ? this.firstDrawList.values() : this.drawList.values();\r\n for (const event of list) {\r\n this.interaction[event] = false;\r\n this.events.run(event);\r\n this.interaction[event] = true;\r\n }\r\n first ? this.firstDrawList.clear() : this.drawList.clear();\r\n }\r\n\r\n addDelayedPieceClear(owner: TPieceId, target: TPieceId) {\r\n this.delayedPieceClear.set(owner, target);\r\n }\r\n\r\n getDelayedPieceClear(pieceId: TPieceId) {\r\n return this.delayedPieceClear.get(pieceId);\r\n }\r\n\r\n deleteDelayedPieceClear(pieceId: TPieceId) {\r\n this.delayedPieceClear.delete(pieceId);\r\n }\r\n\r\n resetDelayedPieceClear() {\r\n this.delayedPieceClear.clear();\r\n }\r\n\r\n isDelayedPieceClear(pieceId: TPieceId) {\r\n return Array.from(this.delayedPieceClear.values()).includes(pieceId);\r\n }\r\n\r\n clearDelayedPiece(pieceId: TPieceId, layer: TCanvasLayer) {\r\n const delayed = this.getDelayedPieceClear(pieceId);\r\n if (delayed) {\r\n const layer_ = this.getLayer(layer);\r\n const coords = layer_.getCoords(delayed);\r\n if (coords) {\r\n layer_.addClearQueue(coords);\r\n layer_.removeAll?.(delayed);\r\n layer_.clear();\r\n }\r\n\r\n this.deleteDelayedPieceClear(pieceId);\r\n }\r\n }\r\n}\r\n\r\nexport default LayerManager;\r\n","import { TPipelineRender } from \"types\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\n\r\nclass PipelineRender {\r\n private eventsNext: Record<\r\n TPipelineRender,\r\n {\r\n args: any[][];\r\n token: number;\r\n resolve?: (value: void | PromiseLike<void>) => void;\r\n }[]\r\n > = {\r\n onPointerSelect: [],\r\n onPointerHover: [],\r\n onPointerDragStart: [],\r\n onPointerDrag: [],\r\n onPointerDrop: [],\r\n onAnimationFrame: [],\r\n onDrawPiece: [],\r\n onDrawBoard: [],\r\n onDrawOverlay: [],\r\n onDrawUnderlay: [],\r\n onToggleCanvas: [],\r\n onRender: [],\r\n };\r\n\r\n private eventsToken: Record<TPipelineRender, number> = {\r\n onPointerSelect: 0,\r\n onPointerHover: 0,\r\n onPointerDragStart: 0,\r\n onPointerDrag: 0,\r\n onPointerDrop: 0,\r\n onAnimationFrame: 0,\r\n onDrawPiece: 0,\r\n onDrawBoard: 0,\r\n onDrawOverlay: 0,\r\n onDrawUnderlay: 0,\r\n onToggleCanvas: 0,\r\n onRender: 0,\r\n };\r\n\r\n private loading = false;\r\n private destroyed = false;\r\n private stream: TPipelineRender[] = [];\r\n\r\n constructor(protected boardRuntime: BoardRuntime) {}\r\n\r\n destroy() {\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n this.destroyed = true;\r\n }\r\n\r\n setNextEvent(\r\n event: TPipelineRender,\r\n next: any,\r\n resolve?: (value: void | PromiseLike<void>) => void\r\n ) {\r\n const token = ++this.eventsToken[event];\r\n this.eventsNext[event].push({ args: [...next], token, resolve });\r\n this.stream.push(event);\r\n if (!this.loading) this.loadEvents();\r\n }\r\n\r\n getNextEvent(event: TPipelineRender) {\r\n return this.eventsNext[event].shift();\r\n }\r\n\r\n async loadEvents() {\r\n if (this.loading || this.destroyed) return;\r\n this.loading = true;\r\n try {\r\n while (!this.destroyed && this.stream.length > 0) {\r\n const event = this.stream.shift()!;\r\n const next = this.getNextEvent(event);\r\n\r\n if (!next) continue;\r\n\r\n const { args, token, resolve } = next;\r\n if (token !== this.eventsToken[event]) {\r\n resolve?.();\r\n continue;\r\n }\r\n\r\n const method = this.boardRuntime.renderer.eventsRuntime[event];\r\n if (!method || !args) continue;\r\n await method(...args);\r\n resolve?.();\r\n }\r\n } finally {\r\n if (this.destroyed) return;\r\n if (this.stream.length) this.loadEvents();\r\n else this.loading = false;\r\n }\r\n }\r\n}\r\n\r\nexport default PipelineRender;\r\n","import Utils from \"../../utils/utils\";\r\nimport { TCanvasCoords, TCanvasLayer, TRender } from \"../../types/draw\";\r\nimport {\r\n TPieceBoard,\r\n TPieceCoords,\r\n TPieceId,\r\n TPieceInternalRef,\r\n} from \"../../types/piece\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport LayerManager from \"../layers/layerManager\";\r\nimport { IRenderer } from \"./interface\";\r\nimport { TPipelineRender } from \"../../types/board\";\r\nimport PipelineRender from \"./pipelineRender\";\r\n\r\nclass Renderer2D implements IRenderer {\r\n private layerManager: LayerManager;\r\n eventsRuntime: Record<TPipelineRender, Function | null>;\r\n pipelineRender: PipelineRender;\r\n\r\n constructor(protected boardRuntime: BoardRuntime) {\r\n this.layerManager = new LayerManager(boardRuntime);\r\n this.eventsRuntime = {\r\n onPointerSelect: this.boardRuntime.setSelected.bind(this.boardRuntime),\r\n onPointerHover: this.boardRuntime.setPieceHover.bind(this.boardRuntime),\r\n onPointerDragStart: null,\r\n onPointerDrag: null,\r\n onPointerDrop: null,\r\n onAnimationFrame: null,\r\n onDrawPiece: null,\r\n onDrawBoard: null,\r\n onDrawOverlay: null,\r\n onDrawUnderlay: null,\r\n onToggleCanvas: this.toggleCanvas.bind(this),\r\n onRender: this.render.bind(this),\r\n };\r\n this.pipelineRender = new PipelineRender(boardRuntime);\r\n }\r\n\r\n destroy(): void {\r\n this.pipelineRender.destroy();\r\n\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n\r\n async render(canvases: Record<TCanvasLayer, boolean>) {\r\n this.layerManager.renderEvents(true);\r\n for (const [canvas, toRender] of Object.entries(canvases))\r\n if (toRender)\r\n await this.layerManager.getLayer(canvas as TCanvasLayer).renderAsync();\r\n this.layerManager.renderEvents(false);\r\n }\r\n\r\n getLayerManager(): LayerManager {\r\n return this.layerManager;\r\n }\r\n\r\n async toggleCanvas(\r\n from: TCanvasLayer,\r\n to: TCanvasLayer,\r\n pieceId: TPieceId,\r\n noRender?: boolean\r\n ) {\r\n await this.layerManager.togglePieceLayer(from, to, pieceId, noRender);\r\n }\r\n}\r\n\r\nexport default Renderer2D;\r\n","import LayerManager from \"engine/layers/layerManager\";\r\nimport { TPieceId, TPieceInternalRef } from \"../../types/piece\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport { IRenderer } from \"./interface\";\r\nimport { TCanvasLayer, TPipelineRender } from \"types\";\r\nimport PipelineRender from \"./pipelineRender\";\r\n\r\nclass Renderer3D implements IRenderer {\r\n constructor(protected boardRuntime: BoardRuntime) {}\r\n pipelineRender!: PipelineRender;\r\n eventsRuntime: Record<TPipelineRender, Function | null> = {} as Record<\r\n TPipelineRender,\r\n Function | null\r\n >;\r\n destroy(): void {\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n }\r\n getLayerManager(): LayerManager {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n async render(init: Record<TCanvasLayer, boolean>): Promise<void> {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n\r\nexport default Renderer3D;\r\n","import { TEventListenerEvents, TListener } from \"types\";\r\nimport { IEventEmitter } from \"./interface\";\r\n\r\nclass EventEmitter implements IEventEmitter {\r\n private events = new Map<TEventListenerEvents, TListener[]>();\r\n\r\n on(event: TEventListenerEvents, listener: TListener): () => void {\r\n const listeners = this.events.get(event) ?? [];\r\n if (listeners.includes(listener)) return () => {};\r\n\r\n listeners.push(listener);\r\n this.events.set(event, listeners);\r\n\r\n return () => this.off(event, listener);\r\n }\r\n\r\n off(event: TEventListenerEvents, listener: TListener): void {\r\n const listeners = this.events.get(event);\r\n if (!listeners) return;\r\n\r\n const index = listeners.indexOf(listener);\r\n if (index === -1) return;\r\n\r\n listeners.splice(index, 1);\r\n if (!listeners.length) this.events.delete(event);\r\n }\r\n\r\n emit(event: TEventListenerEvents, ...args: any[]): void {\r\n const listeners = this.events.get(event);\r\n if (!listeners) return;\r\n\r\n for (const listener of [...listeners]) {\r\n listener(...args);\r\n }\r\n }\r\n\r\n once(event: TEventListenerEvents, listener: TListener): () => void {\r\n const wrapper: TListener = (...args) => {\r\n off();\r\n listener(...args);\r\n };\r\n\r\n const off = this.on(event, wrapper);\r\n return off;\r\n }\r\n}\r\n\r\nexport default EventEmitter;\r\n","import {\r\n TBoardRuntime,\r\n TDefault,\r\n TPipelineRender,\r\n TSelected,\r\n} from \"../../types/board\";\r\nimport {\r\n TAnimation,\r\n TBoardEventContext,\r\n TDrawFunction,\r\n TMoveResult,\r\n TMoveReturn,\r\n TMoveUndo,\r\n TUndo,\r\n} from \"../../types/events\";\r\nimport {\r\n pieceKey,\r\n TPiece,\r\n TPieceBoard,\r\n TPieceId,\r\n TPieceInternalRef,\r\n} from \"../../types/piece\";\r\nimport BoardEvents from \"./boardEvents\";\r\nimport EngineHelpers from \"../helpers/engineHelpers\";\r\nimport { TFile, TNotation, TRank, TSquare } from \"../../types/square\";\r\nimport { IRenderer } from \"../render/interface\";\r\nimport Renderer2D from \"../render/renderer2D\";\r\nimport Renderer3D from \"../render/renderer3D\";\r\nimport Utils from \"../../utils/utils\";\r\nimport {\r\n TCanvasCoords,\r\n TCanvasLayer,\r\n TDrawRegion,\r\n THoverConfig,\r\n} from \"../../types/draw\";\r\nimport { TSafeCtx } from \"../../types/draw\";\r\nimport EventEmitter from \"../../engine/eventEmitter/eventEmitter\";\r\n\r\nclass BoardRuntime<T extends TBoardEventContext = TBoardEventContext> {\r\n protected internalRef: Record<TPieceId, TPieceInternalRef> = {} as Record<\r\n TPieceId,\r\n TPieceInternalRef\r\n >;\r\n protected selected: TSelected | null = null;\r\n protected pieceHover: TPieceId | null = null;\r\n protected isImagesLoaded: boolean = false;\r\n protected destroyed = false;\r\n protected animationDuration: number = 300;\r\n protected piecesToRender: { piece: TPieceInternalRef; id: TPieceId }[] = [];\r\n protected isMoving: boolean = false;\r\n protected board!: Record<TNotation, TPieceBoard>;\r\n protected hoverConfig: THoverConfig = {\r\n highlight: true,\r\n scaling: false,\r\n scaleAmount: 1.05,\r\n };\r\n\r\n public boardEvents: BoardEvents = new BoardEvents(this);\r\n public helpers: EngineHelpers = new EngineHelpers(this);\r\n public renderer: IRenderer;\r\n private mounted = false;\r\n private default: TDefault = {\r\n onPointerSelect: true,\r\n onPointerHover: true,\r\n moveAnimation: true,\r\n };\r\n\r\n activePiecesPool: Record<TPiece, Map<TNotation, TPieceId>> = {\r\n wP: new Map(),\r\n wR: new Map(),\r\n wN: new Map(),\r\n wB: new Map(),\r\n wQ: new Map(),\r\n wK: new Map(),\r\n bP: new Map(),\r\n bR: new Map(),\r\n bN: new Map(),\r\n bB: new Map(),\r\n bQ: new Map(),\r\n bK: new Map(),\r\n };\r\n\r\n inactivePiecesPool: Record<TPiece, TPieceId[]> = {\r\n wP: [],\r\n wR: [],\r\n wN: [],\r\n wB: [],\r\n wQ: [],\r\n wK: [],\r\n bP: [],\r\n bR: [],\r\n bN: [],\r\n bB: [],\r\n bQ: [],\r\n bK: [],\r\n };\r\n\r\n piecesBoard: Map<TPieceId, TPieceBoard> = new Map();\r\n private undoStack: { undo: TMoveUndo; redo: TMoveResult }[] = [];\r\n private redoStack: TMoveResult[] = [];\r\n private eventEmitter = new EventEmitter();\r\n\r\n constructor(private args: TBoardRuntime<T>) {\r\n Object.assign(this, args);\r\n if (args.hoverConfig) this.hoverConfig = args.hoverConfig;\r\n this.renderer =\r\n args.mode === \"2d\" ? new Renderer2D(this) : new Renderer3D(this);\r\n\r\n this.setInactivePieces();\r\n if (Utils.validateFen(args.board))\r\n this.setBoard(Utils.parseFen(args.board));\r\n else\r\n this.setBoard(\r\n Utils.parseFen(\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR\"),\r\n );\r\n }\r\n\r\n static async create(args: TBoardRuntime) {\r\n const this_ = new BoardRuntime(args);\r\n await this_.init();\r\n return this_;\r\n }\r\n\r\n destroy() {\r\n if (!this.mounted) return;\r\n this.destroyed = true;\r\n this.args.canvasLayers.destroy();\r\n this.helpers.destroy();\r\n this.boardEvents.destroy();\r\n\r\n (this.args.canvasLayers as any) = null;\r\n (this.helpers as any) = null;\r\n (this.boardEvents as any) = null;\r\n\r\n if (this.args.pieceStyle) {\r\n Object.entries(this.args.pieceStyle).map(([_, val]) => {\r\n if (val instanceof HTMLImageElement) {\r\n val.src = \"\";\r\n val.onload = null;\r\n val.onerror = null;\r\n }\r\n (val as any) = null;\r\n });\r\n }\r\n }\r\n\r\n addPieceBoard(id: TPieceId, piece: TPieceBoard) {\r\n this.piecesBoard.set(id, piece);\r\n }\r\n\r\n deletePieceBoard(id: TPieceId) {\r\n this.piecesBoard.delete(id);\r\n }\r\n\r\n getPieceBoard(id: TPieceId) {\r\n return this.piecesBoard.get(id);\r\n }\r\n\r\n getSize() {\r\n return this.args.size;\r\n }\r\n\r\n mount() {\r\n this.mounted = true;\r\n }\r\n\r\n getIsBlackView() {\r\n return this.args.isBlackView;\r\n }\r\n\r\n getSelected() {\r\n return this.selected;\r\n }\r\n\r\n getInternalRefObj() {\r\n return this.internalRef;\r\n }\r\n\r\n getPieceHover() {\r\n return this.pieceHover;\r\n }\r\n\r\n getBoardCanvas() {\r\n return this.args.canvasLayers.getCanvas(\"board\");\r\n }\r\n\r\n getStaticPiecesCanvas() {\r\n return this.args.canvasLayers.getCanvas(\"staticPieces\");\r\n }\r\n\r\n getDynamicPiecesCanvas() {\r\n return this.args.canvasLayers.getCanvas(\"dynamicPieces\");\r\n }\r\n\r\n getUnderlaycanvas() {\r\n return this.args.canvasLayers.getCanvas(\"underlay\");\r\n }\r\n\r\n getOverlaycanvas() {\r\n return this.args.canvasLayers.getCanvas(\"overlay\");\r\n }\r\n\r\n getInternalRefVal(key: TPieceId) {\r\n return this.internalRef[key];\r\n }\r\n\r\n getLightTile() {\r\n return this.args.lightTile || \"#9a8b6dff\";\r\n }\r\n\r\n getDarkTile() {\r\n return this.args.darkTile || \"#3E2723\";\r\n }\r\n\r\n getPieceStyle() {\r\n return this.args.pieceStyle;\r\n }\r\n\r\n getEvents() {\r\n return this.args.events;\r\n }\r\n\r\n getInjection() {\r\n return this.args.injection;\r\n }\r\n\r\n getBoard() {\r\n return this.board;\r\n }\r\n\r\n getMove() {\r\n return this.args.onMove;\r\n }\r\n\r\n getCanvasLayers() {\r\n return this.args.canvasLayers;\r\n }\r\n\r\n getAnimationDuration() {\r\n return this.animationDuration;\r\n }\r\n\r\n getDefault() {\r\n if (this.args.default) return this.args.default;\r\n return this.default;\r\n }\r\n\r\n getReadonlyInternalRef() {\r\n return Utils.deepFreeze(this.internalRef);\r\n }\r\n\r\n getReadonlySelectedRef() {\r\n return this.selected ? Utils.deepFreeze(this.selected) : null;\r\n }\r\n\r\n getReadonlyPiece(piece?: TPieceInternalRef, at?: TNotation) {\r\n return piece ? Utils.deepFreeze(piece) : null;\r\n }\r\n\r\n getReadonlySquare(square?: TSquare) {\r\n return square ? Utils.deepFreeze(square) : null;\r\n }\r\n\r\n getReadonlyAnimation() {\r\n const animation: TAnimation[] = [];\r\n for (const layer of this.renderer.getLayerManager().getAllLayers())\r\n animation.push(\r\n ...this.renderer\r\n .getLayerManager()\r\n .getLayer(layer as TCanvasLayer)\r\n .getAnimation(),\r\n );\r\n return Utils.deepFreeze(animation);\r\n }\r\n\r\n getReadonlyBoard() {\r\n return Utils.deepFreeze(this.getBoard());\r\n }\r\n\r\n getDefaultAnimation() {\r\n return this.args.default.moveAnimation;\r\n }\r\n\r\n getContext(cache: boolean, args: TBoardEventContext) {\r\n const { squareSize, size, x, y, piece, square } = args;\r\n\r\n const context = this.helpers.createLazyEventContext(\r\n { squareSize, size, x, y },\r\n {\r\n getPiece: () => this.getReadonlyPiece(piece ? piece : undefined),\r\n getPiecesImage: () => this.getPieceStyle(),\r\n getSquare: () => this.getReadonlySquare(square ? square : undefined),\r\n getPieces: () => this.getReadonlyInternalRef(),\r\n getPieceHover: () => this.getPieceHover(),\r\n getSelected: () => this.getReadonlySelectedRef(),\r\n getIsBlackView: () => this.getIsBlackView(),\r\n getLightTile: () => this.getLightTile(),\r\n getDarkTile: () => this.getDarkTile(),\r\n getAnimation: () => this.getReadonlyAnimation(),\r\n getDraw: () => {\r\n const event = (context as any).__event;\r\n\r\n const drawFn = (opts: {\r\n onDraw: (ctx: TSafeCtx) => void;\r\n layer: TCanvasLayer;\r\n }) => {\r\n const { onDraw, layer } = opts;\r\n const ctx_ = this.getCanvasLayers().getClientContext(layer);\r\n if (!ctx_) return;\r\n onDraw(ctx_);\r\n const clearCtx = ctx_ as TSafeCtx & {\r\n __drawRegions: TDrawRegion[];\r\n __clearRegions: () => void;\r\n __actualRegions: TCanvasCoords[];\r\n };\r\n this.renderer\r\n .getLayerManager()\r\n .applyDrawResult(clearCtx, layer, event);\r\n };\r\n\r\n drawFn.batch = (\r\n optsArr: {\r\n onDraw: (ctx: TSafeCtx) => void;\r\n layer: TCanvasLayer;\r\n }[],\r\n ) => {\r\n const layers: Record<\r\n TCanvasLayer,\r\n { fn: (ctx: TSafeCtx) => void; index: number }[]\r\n > = {} as Record<\r\n TCanvasLayer,\r\n { fn: (ctx: TSafeCtx) => void; index: number }[]\r\n >;\r\n\r\n let i = 0;\r\n for (const { layer, onDraw } of optsArr) {\r\n if (!layers[layer]) {\r\n layers[layer] = [];\r\n }\r\n layers[layer].push({ fn: onDraw, index: i++ });\r\n }\r\n const ordered = Object.values(layers)\r\n .flat()\r\n .sort((a, b) => a.index - b.index);\r\n for (const { fn, index } of ordered) {\r\n const layer = optsArr[index].layer;\r\n drawFn.group(layer, (ctx, g) => {\r\n g.draw(fn);\r\n });\r\n }\r\n };\r\n\r\n drawFn.group = (\r\n layer: TCanvasLayer,\r\n fn: (\r\n ctx: TSafeCtx,\r\n g: { draw: (onDraw: (ctx: TSafeCtx) => void) => void },\r\n ) => void,\r\n ) => {\r\n const ctx_ = this.getCanvasLayers().getClientContext(layer);\r\n if (!ctx_) return;\r\n\r\n const g = {\r\n draw: (onDraw: (ctx: TSafeCtx) => void) => onDraw(ctx_),\r\n };\r\n fn(ctx_, g);\r\n const clearCtx = ctx_ as TSafeCtx & {\r\n __drawRegions: TDrawRegion[];\r\n __clearRegions: () => void;\r\n __actualRegions: TCanvasCoords[];\r\n };\r\n this.renderer\r\n .getLayerManager()\r\n .applyDrawResult(clearCtx, layer, event);\r\n };\r\n return drawFn as TDrawFunction;\r\n },\r\n },\r\n { cache },\r\n );\r\n\r\n return context;\r\n }\r\n\r\n getIsMoving() {\r\n return this.isMoving;\r\n }\r\n\r\n getHoverConfig() {\r\n const MIN_SCALE = 0.75;\r\n const MAX_SCALE = 1.15;\r\n if (\r\n this.hoverConfig.scaleAmount < MIN_SCALE ||\r\n this.hoverConfig.scaleAmount > MAX_SCALE\r\n )\r\n this.hoverConfig.scaleAmount = Math.min(\r\n MAX_SCALE,\r\n Math.max(MIN_SCALE, this.hoverConfig.scaleAmount),\r\n );\r\n\r\n return this.hoverConfig;\r\n }\r\n\r\n getEventEmitter() {\r\n return this.eventEmitter;\r\n }\r\n\r\n isActivePiece(pieceId: TPieceId) {\r\n const square = this.piecesBoard.get(pieceId)?.square;\r\n return square ? true : false;\r\n }\r\n\r\n setHoverConfig(config: THoverConfig) {\r\n this.hoverConfig = config;\r\n }\r\n\r\n setIsMoving(b: boolean) {\r\n this.isMoving = b;\r\n }\r\n\r\n setInactivePieces() {\r\n for (let total = 1; total <= 64; total++) {\r\n for (const key of pieceKey) {\r\n const id = `${key}${total}` as TPieceId;\r\n this.inactivePiecesPool[key].push(id);\r\n const piece: TPieceBoard = {\r\n square: null,\r\n type: key,\r\n id,\r\n };\r\n this.piecesBoard.set(id, piece);\r\n }\r\n }\r\n }\r\n\r\n getInactivePiece(key: TPiece) {\r\n return this.inactivePiecesPool[key].shift();\r\n }\r\n\r\n addInactivePiece(key: TPiece, id: TPieceId) {\r\n this.inactivePiecesPool[key].unshift(id);\r\n }\r\n\r\n toggleHoverScale(scale: number) {\r\n this.hoverConfig.scaleAmount = scale;\r\n }\r\n\r\n toggleHoverScaling() {\r\n this.hoverConfig.scaling = !this.hoverConfig.scaling;\r\n }\r\n\r\n toggleHoverHighlight() {\r\n this.hoverConfig.highlight = !this.hoverConfig.highlight;\r\n }\r\n\r\n async setSize(size: number) {\r\n this.args.size = Math.floor(size / 8) * 8;\r\n this.getCanvasLayers().clearAllRect();\r\n this.getCanvasLayers().resize(Math.floor(size / 8) * 8);\r\n this.setInternalRefObj({} as Record<TPieceId, TPieceInternalRef>);\r\n this.renderer.getLayerManager().resetAllLayers();\r\n await this.refreshCanvases({\r\n board: true,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n }\r\n\r\n setAnimationDuration(time: number) {\r\n if (time < 150 || time > 500) return;\r\n this.animationDuration = time;\r\n }\r\n\r\n async setBoardByFen(board: string) {\r\n if (!Utils.validateFen(board).status) return;\r\n this.setIsMoving(true);\r\n this.setBoard(Utils.parseFen(board));\r\n this.clearRedo();\r\n this.clearUndo();\r\n await this.refreshCanvases({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n this.setIsMoving(false);\r\n }\r\n\r\n setBoard(pieces: Record<TPiece, TNotation[]>) {\r\n for (const piece of pieceKey) {\r\n const needMove: { from: TNotation; to: TNotation }[] = [];\r\n const squares = pieces[piece as TPiece] ? pieces[piece as TPiece] : [];\r\n const activePool = this.activePiecesPool[piece as TPiece];\r\n const checkedSquares: Set<TNotation> = new Set();\r\n const usedSquares: Set<TNotation> = new Set();\r\n\r\n for (let i = 0; i < squares.length; i++) {\r\n const square = squares[i];\r\n const find = activePool.get(square);\r\n if (find) {\r\n usedSquares.add(square);\r\n checkedSquares.add(square);\r\n }\r\n }\r\n\r\n const create: TNotation[] = [];\r\n const keys = Array.from(activePool.keys());\r\n let k = 0;\r\n for (let i = 0; i < squares.length; i++) {\r\n const square = squares[i];\r\n if (usedSquares.has(square)) continue;\r\n\r\n while (k < keys.length) {\r\n const key = keys[k++];\r\n if (!key) continue;\r\n if (checkedSquares.has(key)) continue;\r\n\r\n needMove.push({ from: key, to: square });\r\n checkedSquares.add(key);\r\n usedSquares.add(square);\r\n break;\r\n }\r\n }\r\n\r\n for (let i = 0; i < squares.length; i++) {\r\n const square = squares[i];\r\n if (usedSquares.has(square)) continue;\r\n create.push(square);\r\n }\r\n\r\n const moveToInactive: Set<TNotation> = new Set();\r\n for (const key of keys) {\r\n if (checkedSquares.has(key)) continue;\r\n moveToInactive.add(key);\r\n }\r\n this.updateBoardPieces(needMove, moveToInactive, create, piece as TPiece);\r\n }\r\n this.createBoard();\r\n }\r\n\r\n private createBoard() {\r\n const board: Record<TNotation, TPieceBoard> = {} as Record<\r\n TNotation,\r\n TPieceBoard\r\n >;\r\n for (const [key, obj] of Object.entries(this.activePiecesPool)) {\r\n for (const o of obj.keys()) {\r\n const id = obj.get(o);\r\n if (!id) continue;\r\n const piece = this.piecesBoard.get(id);\r\n if (!piece) continue;\r\n board[o] = {\r\n id,\r\n square: piece.square,\r\n type: key as TPiece,\r\n };\r\n }\r\n }\r\n\r\n this.board = board;\r\n }\r\n\r\n private updateBoardPieces(\r\n needMove: { from: TNotation; to: TNotation }[],\r\n moveToInactive: Set<TNotation>,\r\n needCreate: TNotation[],\r\n type: TPiece,\r\n ) {\r\n for (const obj of needMove) {\r\n const id = this.activePiecesPool[type].get(obj.from);\r\n if (!id) continue;\r\n this.activePiecesPool[type].delete(obj.from);\r\n this.activePiecesPool[type].set(obj.to, id);\r\n const curr = this.piecesBoard.get(id);\r\n if (!curr) continue;\r\n\r\n curr.square = {\r\n file: obj.to[0] as TFile,\r\n rank: parseInt(obj.to[1]) as TRank,\r\n notation: obj.to,\r\n };\r\n }\r\n\r\n for (const inactive of moveToInactive.values()) {\r\n const curr = this.activePiecesPool[type].get(inactive);\r\n if (!curr) continue;\r\n this.inactivePiecesPool[type].push(curr);\r\n this.activePiecesPool[type].delete(inactive);\r\n const piece = this.piecesBoard.get(curr);\r\n piece && (piece.square = null);\r\n }\r\n\r\n for (let i = 0; i < needCreate.length; i++) {\r\n const inactive = this.inactivePiecesPool[type].shift();\r\n if (!inactive) continue;\r\n const square = needCreate[i];\r\n this.activePiecesPool[type].set(square, inactive);\r\n\r\n const curr = this.piecesBoard.get(inactive);\r\n if (!curr) continue;\r\n\r\n curr.square = {\r\n file: square.charAt(0) as TFile,\r\n rank: parseInt(square.charAt(1)) as TRank,\r\n notation: square,\r\n };\r\n }\r\n }\r\n\r\n async refreshCanvases(canvases: Record<TCanvasLayer, boolean>) {\r\n await this.resetEvents(true);\r\n this.renderer.getLayerManager().setHoverEnabled(false);\r\n this.helpers.pieceHelper.clearCache();\r\n await this.initInternalRef();\r\n\r\n const render = (resolve: (value: void | PromiseLike<void>) => void) =>\r\n this.renderer.pipelineRender.setNextEvent(\r\n \"onRender\",\r\n [canvases],\r\n resolve,\r\n );\r\n await Utils.asyncHandler(render);\r\n this.renderer.getLayerManager().setHoverEnabled(true);\r\n\r\n try {\r\n if (this.args.onUpdate) this.args.onUpdate();\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n }\r\n\r\n async resetEvents(render: boolean) {\r\n let toRender = false;\r\n\r\n if (this.selected !== null) {\r\n if (this.selected.isDragging)\r\n this.helpers.pointerEventsHelper.endDrag(-1, -1, false, true);\r\n\r\n this.renderer.pipelineRender.setNextEvent(\"onPointerSelect\", [\r\n null,\r\n true,\r\n ]);\r\n toRender = true;\r\n }\r\n\r\n if (this.pieceHover !== null) {\r\n this.renderer.pipelineRender.setNextEvent(\"onPointerHover\", [null, true]);\r\n toRender = true;\r\n }\r\n\r\n if (!render || !toRender) return;\r\n const render_ = (resolve: (value: void | PromiseLike<void>) => void) =>\r\n this.renderer.pipelineRender.setNextEvent(\r\n \"onRender\",\r\n [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ],\r\n resolve,\r\n );\r\n\r\n await Utils.asyncHandler(render_);\r\n }\r\n\r\n updateBoard(piece: TPieceBoard) {\r\n if (!piece.square) return;\r\n this.board[piece.square.notation] = piece;\r\n }\r\n\r\n setInternalRefVal(key: TPieceId, obj: TPieceInternalRef) {\r\n this.internalRef[key] = obj;\r\n }\r\n\r\n setInternalRefObj(internalRef: Record<TPieceId, TPieceInternalRef>) {\r\n this.internalRef = internalRef;\r\n }\r\n\r\n async setSelected(selected: TSelected | null, noRender?: boolean) {\r\n if (selected === null && this.selected === null) {\r\n this.selected = selected;\r\n return;\r\n } else if (selected?.id === this.selected?.id) {\r\n this.selected = selected;\r\n return;\r\n } else if (!this.renderer.getLayerManager().isSelectionEnabled()) return;\r\n const layerManager = this.renderer.getLayerManager();\r\n this.selected = selected;\r\n layerManager.drawEvent(\"onPointerSelect\");\r\n\r\n if (!noRender)\r\n this.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n\r\n async setPieceHover(piece: TPieceId | null, noRender?: boolean) {\r\n const lastHover = this.getPieceHover();\r\n const layerManager = this.renderer.getLayerManager();\r\n\r\n if (lastHover === piece) return;\r\n else if (!this.renderer.getLayerManager().isHoverEnabled()) return;\r\n\r\n this.pieceHover = piece;\r\n layerManager.drawEvent(\"onPointerHover\");\r\n\r\n if (this.hoverConfig.scaling) {\r\n if (piece === null && lastHover !== null) {\r\n await layerManager.togglePieceLayer(\r\n \"dynamicPieces\",\r\n \"staticPieces\",\r\n lastHover,\r\n noRender,\r\n );\r\n } else if (lastHover === null && piece !== null) {\r\n await layerManager.togglePieceLayer(\r\n \"staticPieces\",\r\n \"dynamicPieces\",\r\n piece,\r\n noRender,\r\n );\r\n } else if (lastHover !== null && piece !== null) {\r\n await layerManager.togglePieceLayer(\r\n \"dynamicPieces\",\r\n \"staticPieces\",\r\n lastHover,\r\n noRender,\r\n );\r\n await layerManager.togglePieceLayer(\r\n \"staticPieces\",\r\n \"dynamicPieces\",\r\n piece,\r\n noRender,\r\n );\r\n }\r\n } else if (!noRender)\r\n this.renderer.pipelineRender.setNextEvent(\"onRender\", [\r\n {\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ]);\r\n }\r\n\r\n async setBlackView(b: boolean) {\r\n if (this.getIsBlackView() === b) return;\r\n this.args.isBlackView = b;\r\n this.setInternalRefObj({} as Record<TPieceId, TPieceInternalRef>);\r\n this.getCanvasLayers().clearAllRect();\r\n this.renderer.getLayerManager().resetAllLayers();\r\n await this.refreshCanvases({\r\n board: true,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n }\r\n\r\n deleteIntervalRefVal(key: TPieceId) {\r\n delete this.internalRef[key];\r\n }\r\n\r\n async loadImages() {\r\n if (this.destroyed) return;\r\n\r\n if (!this.isImagesLoaded && this.args.pieceStyle) {\r\n await this.helpers.pieceHelper.preloadImages(this.args.pieceStyle);\r\n this.isImagesLoaded = true;\r\n }\r\n }\r\n\r\n async init() {\r\n await new Promise(requestAnimationFrame);\r\n await this.initPieceImages();\r\n await this.initInternalRef();\r\n return new Promise<void>((resolve) => {\r\n this.renderer.pipelineRender.setNextEvent(\r\n \"onRender\",\r\n [\r\n {\r\n board: true,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n },\r\n ],\r\n resolve,\r\n );\r\n });\r\n }\r\n\r\n async initPieceImages() {\r\n if (!this.args || !this.args.pieceStyle) {\r\n this.args.pieceStyle =\r\n this.helpers.pieceHelper.getPieceImages[this.args.pieceConfig?.type];\r\n }\r\n await this.loadImages();\r\n }\r\n\r\n async setPieceImages(type: \"string\" | \"image\") {\r\n if (this.destroyed || this.args.pieceConfig.type === type || this.isMoving)\r\n return;\r\n if (!this.isImagesLoaded && type === \"image\") await this.loadImages();\r\n this.args.pieceConfig.type = type;\r\n this.args.pieceStyle = this.helpers.pieceHelper.getPieceImages[type];\r\n\r\n const layerManager = this.renderer.getLayerManager();\r\n this.getCanvasLayers().clearAllRect({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n layerManager.getLayer(\"staticPieces\").redrawPieces();\r\n layerManager.getLayer(\"dynamicPieces\").redrawPieces();\r\n\r\n await this.refreshCanvases({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n }\r\n\r\n async updateBoardState(move: TMoveResult, delay: boolean) {\r\n const layerManager = this.renderer.getLayerManager();\r\n const moves = move;\r\n const undo: TMoveUndo = [];\r\n\r\n for (const move of moves) {\r\n const { from, to, promotion, captured } = move;\r\n let piece = this.board[move.from];\r\n const undoMove: TUndo = {\r\n from: to,\r\n to: from,\r\n captured: [],\r\n moved: piece.type,\r\n promoted: promotion ? true : false,\r\n };\r\n const newSquare = {\r\n file: move.to.charAt(0) as TFile,\r\n rank: parseInt(move.to.charAt(1)) as TRank,\r\n notation: move.to,\r\n };\r\n\r\n //promotion\r\n if (promotion) {\r\n const newType = `${piece.type[0]}${promotion.toUpperCase()}` as TPiece;\r\n const newId = this.inactivePiecesPool[newType].shift();\r\n if (newId) {\r\n const newPiece = this.piecesBoard.get(newId);\r\n if (newPiece) {\r\n const ref: TPieceInternalRef = {\r\n square: delay ? piece.square : newSquare,\r\n type: newType,\r\n x: this.getInternalRefVal(piece.id).x,\r\n y: this.getInternalRefVal(piece.id).y,\r\n };\r\n\r\n this.setInternalRefVal(newId, ref);\r\n\r\n const layer = layerManager.getLayer(\"staticPieces\");\r\n const piece_coords = layer.getCoords(piece.id);\r\n const coords = Utils.squareToCoords(\r\n newSquare,\r\n this.getSize() / 8,\r\n this.getIsBlackView(),\r\n );\r\n\r\n piece.square = null;\r\n newPiece.square = newSquare;\r\n this.piecesBoard.set(piece.id, piece);\r\n this.inactivePiecesPool[piece.type].push(piece.id);\r\n this.activePiecesPool[piece.type].delete(move.from);\r\n this.activePiecesPool[newType].set(move.to, newPiece.id);\r\n this.piecesBoard.set(newId, newPiece);\r\n this.deleteIntervalRefVal(piece.id);\r\n\r\n layer.removeAll?.(piece.id);\r\n const newCoords = piece_coords\r\n ? piece_coords\r\n : coords\r\n ? {\r\n x: coords.x,\r\n y: coords.y,\r\n w: this.getSize() / 8,\r\n h: this.getSize() / 8,\r\n }\r\n : null;\r\n newCoords && layer.addAll?.(newId, ref, newCoords, newCoords);\r\n piece = newPiece;\r\n }\r\n }\r\n }\r\n\r\n // capture\r\n for (const cap of captured) {\r\n const enemie = this.board[cap];\r\n\r\n if (!enemie) continue;\r\n undoMove.captured.push({\r\n square: cap,\r\n type: enemie.type,\r\n });\r\n if (delay && this.getDefaultAnimation()) {\r\n layerManager.addDelayedPieceClear(piece.id, enemie.id);\r\n } else layerManager.getLayer(\"staticPieces\").removeAll?.(enemie.id);\r\n\r\n if (enemie.square) {\r\n const inactive = this.activePiecesPool[enemie.type].get(\r\n enemie.square.notation,\r\n );\r\n this.helpers.pieceHelper.removeCache(cap);\r\n this.activePiecesPool[enemie.type].delete(enemie.square.notation);\r\n inactive && this.inactivePiecesPool[enemie.type].push(inactive);\r\n\r\n const enemie_ = this.piecesBoard.get(enemie.id);\r\n enemie_ && (enemie_.square = null);\r\n }\r\n this.deleteIntervalRefVal(enemie.id);\r\n }\r\n\r\n // move piece\r\n if (!promotion) {\r\n piece.square = newSquare;\r\n this.activePiecesPool[piece.type].set(to, piece.id);\r\n this.piecesBoard.set(piece.id, piece);\r\n }\r\n this.activePiecesPool[piece.type].delete(from);\r\n this.board[to] = piece;\r\n delete this.board[from];\r\n\r\n const piece_ = this.getInternalRefVal(piece.id);\r\n this.helpers.pieceHelper.updateCache(from, to, {\r\n id: piece.id,\r\n piece: piece_,\r\n });\r\n\r\n undo.push(undoMove);\r\n }\r\n this.undoStack.push({ undo, redo: moves });\r\n\r\n await this.refreshCanvases({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n }\r\n\r\n async undo() {\r\n const toUndo = this.undoStack.pop();\r\n if (!toUndo) return false;\r\n const layerManager = this.renderer.getLayerManager();\r\n\r\n for (const move of toUndo.undo) {\r\n const { from, to, moved, promoted, captured } = move;\r\n let piece = this.board[move.from];\r\n\r\n const newSquare = {\r\n file: move.to.charAt(0) as TFile,\r\n rank: parseInt(move.to.charAt(1)) as TRank,\r\n notation: move.to,\r\n };\r\n\r\n //promotion\r\n if (promoted) {\r\n const newType = moved as TPiece;\r\n const newId = this.inactivePiecesPool[newType].shift();\r\n if (newId) {\r\n const newPiece = this.piecesBoard.get(newId);\r\n if (newPiece) {\r\n const ref: TPieceInternalRef = {\r\n square: piece.square,\r\n type: newType,\r\n x: this.getInternalRefVal(piece.id).x,\r\n y: this.getInternalRefVal(piece.id).y,\r\n };\r\n\r\n this.setInternalRefVal(newId, ref);\r\n\r\n const layer = layerManager.getLayer(\"staticPieces\");\r\n const piece_coords = layer.getCoords(piece.id);\r\n const coords = Utils.squareToCoords(\r\n newSquare,\r\n this.getSize() / 8,\r\n this.getIsBlackView(),\r\n );\r\n\r\n piece.square = null;\r\n newPiece.square = newSquare;\r\n this.piecesBoard.set(piece.id, piece);\r\n this.inactivePiecesPool[piece.type].push(piece.id);\r\n this.activePiecesPool[piece.type].delete(move.from);\r\n this.activePiecesPool[newType].set(move.to, newPiece.id);\r\n this.piecesBoard.set(newId, newPiece);\r\n this.deleteIntervalRefVal(piece.id);\r\n\r\n layer.removeAll?.(piece.id);\r\n const newCoords = piece_coords\r\n ? piece_coords\r\n : coords\r\n ? {\r\n x: coords.x,\r\n y: coords.y,\r\n w: this.getSize() / 8,\r\n h: this.getSize() / 8,\r\n }\r\n : null;\r\n newCoords && layer.addAll?.(newId, ref, newCoords, newCoords);\r\n piece = newPiece;\r\n }\r\n }\r\n }\r\n\r\n // move piece\r\n if (!promoted) {\r\n piece.square = newSquare;\r\n this.activePiecesPool[piece.type].set(to, piece.id);\r\n this.piecesBoard.set(piece.id, piece);\r\n }\r\n this.activePiecesPool[piece.type].delete(from);\r\n this.board[to] = piece;\r\n delete this.board[from];\r\n\r\n const piece_ = this.getInternalRefVal(piece.id);\r\n this.helpers.pieceHelper.updateCache(from, to, {\r\n id: piece.id,\r\n piece: piece_,\r\n });\r\n\r\n // undo capture\r\n for (const cap of captured) {\r\n const { square, type } = cap;\r\n\r\n const enemieSquare = {\r\n file: square.charAt(0) as TFile,\r\n rank: parseInt(square.charAt(1)) as TRank,\r\n notation: square,\r\n };\r\n const enemieId = this.inactivePiecesPool[type].shift();\r\n if (!enemieId) continue;\r\n const enemie = this.piecesBoard.get(enemieId);\r\n if (!enemie) continue;\r\n enemie.square = enemieSquare;\r\n this.activePiecesPool[enemie.type].set(square, enemie.id);\r\n this.piecesBoard.set(enemie.id, enemie);\r\n this.board[square] = enemie;\r\n }\r\n }\r\n this.redoStack.push([...toUndo.redo]);\r\n await this.refreshCanvases({\r\n board: false,\r\n staticPieces: true,\r\n overlay: true,\r\n underlay: true,\r\n dynamicPieces: true,\r\n });\r\n\r\n return true;\r\n }\r\n\r\n async redo() {\r\n const redo = this.redoStack.pop();\r\n if (!redo) return false;\r\n await this.updateBoardState(redo, true);\r\n return true;\r\n }\r\n\r\n clearRedo() {\r\n this.redoStack = [];\r\n }\r\n\r\n clearUndo() {\r\n this.undoStack = [];\r\n }\r\n\r\n async initInternalRef() {\r\n const squareSize = Math.floor(this.args.size / 8);\r\n const ids = Object.values(this.board);\r\n const layerManager = this.renderer.getLayerManager();\r\n this.renderer.getLayerManager().getLayer(\"staticPieces\").clearPieces?.(ids);\r\n\r\n for (const piece of Object.values(this.board)) {\r\n const existing = this.internalRef[piece.id];\r\n\r\n if (existing && existing.square?.notation === piece.square?.notation)\r\n continue;\r\n\r\n const square =\r\n piece.square &&\r\n Utils.squareToCoords(piece.square, squareSize, this.args.isBlackView);\r\n\r\n if (!square) continue;\r\n const startX = square.x;\r\n const startY = square.y;\r\n const coords: TCanvasCoords = {\r\n x: Math.floor(startX),\r\n y: Math.floor(startY),\r\n w: Math.ceil(squareSize),\r\n h: Math.ceil(squareSize),\r\n };\r\n\r\n const ref: TPieceInternalRef = {\r\n square: piece.square,\r\n type: piece.type,\r\n x: startX,\r\n y: startY,\r\n };\r\n\r\n this.setInternalRefVal(piece.id as TPieceId, ref);\r\n if (!existing) {\r\n layerManager\r\n .getLayer(\"staticPieces\")\r\n .addAll?.(piece.id, ref, coords, coords);\r\n continue;\r\n }\r\n if (piece.square?.notation !== existing.square?.notation) {\r\n if (!this.getEvents()?.onDrawPiece && this.getDefaultAnimation()) {\r\n ref.anim = true;\r\n this.setIsMoving(true);\r\n }\r\n layerManager.getLayer(\"dynamicPieces\").addAnimation({\r\n from: { x: existing.x, y: existing.y },\r\n to: { x: square.x, y: square.y },\r\n piece: ref,\r\n start: performance.now(),\r\n id: piece.id,\r\n });\r\n\r\n if (this.getDefaultAnimation())\r\n await layerManager.togglePieceLayer(\r\n \"staticPieces\",\r\n \"dynamicPieces\",\r\n piece.id,\r\n true,\r\n );\r\n else {\r\n const layer = layerManager.getLayer(\"staticPieces\");\r\n layer.removeAll?.(piece.id);\r\n layer.addAll?.(piece.id, ref, coords, coords);\r\n }\r\n }\r\n }\r\n this.deleteInternalRef(ids);\r\n }\r\n\r\n private deleteInternalRef(pieces: TPieceBoard[]) {\r\n const nextIds = new Set(pieces.map((p) => p.id));\r\n\r\n for (const id in this.internalRef) {\r\n if (!nextIds.has(id as TPieceId)) {\r\n delete this.internalRef[id as TPieceId];\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default BoardRuntime;\r\n","import { TNotation } from \"../../types/square\";\r\nimport { TPieceDisplay, TPieceInternalRef } from \"../../types/piece\";\r\nimport BoardRuntime from \"../boardRuntime/boardRuntime\";\r\nimport Utils from \"../../utils/utils\";\r\nimport {\r\n IEventListener,\r\n TEventListenerEvents,\r\n TMoveResult,\r\n TMoveReturn,\r\n} from \"types\";\r\n\r\nconst runtimeMap = new WeakMap<Client, BoardRuntime>();\r\n\r\nclass Client {\r\n private destroyed = false;\r\n private fenStream: string[] = [];\r\n private fenStreamDelay = 0;\r\n private loading = false;\r\n private toFlip = false;\r\n private toChangeStreamDelay: number | null = null;\r\n private currFlip = false;\r\n private pauseFenStream = false;\r\n private resizeStream: number[] = [];\r\n private resizing: boolean = false;\r\n private toResize: boolean = false;\r\n private debugCountFenStream = 0;\r\n private isSettingPieceType = false;\r\n private toSetPieceType: \"string\" | \"image\" | null = null;\r\n private undoing = false;\r\n private redoing = false;\r\n private isMoving = false;\r\n private togglingPause = false;\r\n private cachedSize: { size: number; squareSize: number } | null = null;\r\n private mounted = false;\r\n constructor(boardRuntime: BoardRuntime) {\r\n runtimeMap.set(this, boardRuntime);\r\n }\r\n\r\n destroy() {\r\n runtimeMap.delete(this);\r\n\r\n for (const key of Object.getOwnPropertyNames(this)) {\r\n (this as any)[key] = null;\r\n }\r\n this.destroyed = true;\r\n }\r\n\r\n public mount(fun: () => void) {\r\n if (this.mounted) return;\r\n this.mounted = true;\r\n fun();\r\n }\r\n\r\n private getRuntime() {\r\n if (this.destroyed) throw new Error(\"Client destroyed\");\r\n const runtime = runtimeMap.get(this);\r\n if (!runtime) throw new Error(\"Runtime not found\");\r\n return runtime;\r\n }\r\n\r\n public getPieces(): Record<string, TPieceInternalRef> {\r\n return this.getRuntime()?.getReadonlyInternalRef();\r\n }\r\n\r\n public async setBoard(board: string, force?: boolean) {\r\n if (force) {\r\n this.clearFenStream();\r\n this.pauseFenStream = false;\r\n }\r\n this.fenStream.push(board);\r\n if (!this.loading) {\r\n await this.getRuntime()?.resetEvents(true);\r\n this.loadPosition();\r\n }\r\n }\r\n\r\n private clearFenStream() {\r\n this.fenStream.splice(0, this.fenStream.length);\r\n }\r\n\r\n public loadFenStream(board: string[]) {\r\n if (this.destroyed) return;\r\n this.fenStream.push(...board);\r\n if (!this.loading && !this.pauseFenStream) this.loadPosition();\r\n }\r\n\r\n public async loadPosition() {\r\n const runtime = this.getRuntime();\r\n if (this.loading || this.destroyed || !runtime) return;\r\n const eventEmitter = runtime.getEventEmitter();\r\n this.loading = true;\r\n try {\r\n while (!this.pauseFenStream && !this.destroyed && this.fenStream.length) {\r\n const nextFen = this.fenStream.shift();\r\n if (!nextFen) continue;\r\n //console.log(\"rodei\");\r\n await this.getRuntime()?.setBoardByFen(nextFen);\r\n if (this.toFlip) {\r\n await this.getRuntime()?.setBlackView(\r\n !this.getRuntime().getIsBlackView(),\r\n );\r\n this.toFlip = false;\r\n }\r\n if (this.toResize) {\r\n await this.sizeStream();\r\n this.toResize = false;\r\n }\r\n\r\n if (this.toSetPieceType !== null) {\r\n await this.setPieceType(this.toSetPieceType, true);\r\n this.toSetPieceType = null;\r\n }\r\n //console.log(nextFen);\r\n //console.log(\"resolvi\");\r\n if (this.fenStreamDelay > 0) await this.delay(this.fenStreamDelay);\r\n if (this.toChangeStreamDelay !== null) {\r\n this.fenStreamDelay = this.toChangeStreamDelay;\r\n this.toChangeStreamDelay = null;\r\n }\r\n //console.log(\"--------- \", ++this.debugCountFenStream);\r\n }\r\n } finally {\r\n if (!this.destroyed) {\r\n this.fenStream.length <= 0 && (this.debugCountFenStream = 0);\r\n this.loading = false;\r\n if (this.fenStream.length && !this.pauseFenStream)\r\n queueMicrotask(() => this.loadPosition());\r\n else if (!this.fenStream.length)\r\n eventEmitter?.emit(\"onFenStreamLoaded\");\r\n }\r\n }\r\n }\r\n\r\n public getIsLoadingFenStream() {\r\n return this.fenStream.length > 0;\r\n }\r\n\r\n public setFenStreamDelay(ms: number) {\r\n if (this.loading) this.toChangeStreamDelay = ms;\r\n else this.fenStreamDelay = ms;\r\n }\r\n\r\n private delay(ms: number) {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n }\r\n\r\n public async togglePause() {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime || this.togglingPause) return this.pauseFenStream;\r\n try {\r\n this.togglingPause = true;\r\n this.pauseFenStream = !this.pauseFenStream;\r\n if (!this.pauseFenStream && !this.loading) {\r\n await boardRuntime.resetEvents(true);\r\n this.loadPosition();\r\n }\r\n return !this.pauseFenStream;\r\n } finally {\r\n this.togglingPause = false;\r\n }\r\n }\r\n\r\n public getBoard(): string {\r\n return Utils.parseBoard(this.getRuntime().getBoard());\r\n }\r\n\r\n public async flip() {\r\n if (!this.fenStream.length || this.pauseFenStream)\r\n await this.getRuntime()?.setBlackView(\r\n !this.getRuntime().getIsBlackView(),\r\n );\r\n else this.toFlip = true;\r\n this.cachedSize = null;\r\n }\r\n\r\n public updateSize(size: number) {\r\n this.resizeStream.push(size);\r\n if (this.resizing) return;\r\n else if (this.loading) {\r\n this.toResize = true;\r\n return;\r\n }\r\n this.sizeStream();\r\n }\r\n\r\n public async sizeStream() {\r\n if (this.resizing) return;\r\n this.resizing = true;\r\n try {\r\n while (!this.destroyed && this.resizeStream.length) {\r\n const size = this.resizeStream.shift();\r\n if (size === null || size === undefined) continue;\r\n try {\r\n await this.getRuntime?.().setSize(size);\r\n } catch (e) {\r\n console.error(\"Resize failed:\", size, e);\r\n }\r\n }\r\n } finally {\r\n if (this.destroyed) return;\r\n this.resizing = false;\r\n this.cachedSize = null;\r\n if (this.resizeStream.length) queueMicrotask(() => this.sizeStream());\r\n }\r\n }\r\n\r\n public getPieceAt(notation: TNotation) {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime) return null;\r\n\r\n const internalRef = boardRuntime.getInternalRefObj();\r\n const hasPiece = Object.entries(internalRef).find(\r\n ([id, piece]) => piece.square?.notation === notation,\r\n );\r\n if (!hasPiece) return null;\r\n const [id, piece] = hasPiece;\r\n return { id, piece };\r\n }\r\n\r\n public async undo() {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime || this.undoing) return false;\r\n this.undoing = true;\r\n\r\n try {\r\n const res = await boardRuntime.undo();\r\n return res;\r\n } finally {\r\n this.undoing = false;\r\n }\r\n }\r\n\r\n public async redo() {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime || this.redoing) return false;\r\n this.redoing = true;\r\n\r\n try {\r\n const res = await boardRuntime.redo();\r\n return res;\r\n } finally {\r\n this.redoing = false;\r\n }\r\n }\r\n\r\n public getSquareCoords(notation: TNotation) {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime) return null;\r\n const square = Utils.notationToSquare(notation);\r\n if (!square) return null;\r\n const coords = Utils.squareToCoords(\r\n square,\r\n boardRuntime.getSize() / 8,\r\n boardRuntime.getIsBlackView(),\r\n );\r\n if (!coords) return null;\r\n return coords;\r\n }\r\n\r\n public toggleHoverScaling() {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime) return;\r\n boardRuntime.toggleHoverScaling();\r\n }\r\n\r\n public toggleHoverScale(scale: number) {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime) return;\r\n boardRuntime.toggleHoverScale(scale);\r\n }\r\n\r\n public toggleHoverHighlight() {\r\n const boardRuntime = this.getRuntime();\r\n if (!boardRuntime) return;\r\n boardRuntime.toggleHoverHighlight();\r\n }\r\n\r\n public getSize() {\r\n const runtime = this.getRuntime();\r\n if (!runtime) return null;\r\n if (this.cachedSize !== null) return this.cachedSize;\r\n const size = runtime.getSize();\r\n const cached = { size, squareSize: size / 8 };\r\n this.cachedSize = cached;\r\n return cached;\r\n }\r\n\r\n public async makeMove(move: TMoveResult) {\r\n const runtime = this.getRuntime();\r\n if (!runtime || this.isMoving) return false;\r\n this.isMoving = true;\r\n\r\n try {\r\n await runtime.resetEvents(false);\r\n await runtime.updateBoardState(move, true);\r\n return true;\r\n } finally {\r\n this.isMoving = false;\r\n }\r\n }\r\n\r\n public async setPieceType(type: \"string\" | \"image\", force?: boolean) {\r\n const runtime = this.getRuntime();\r\n if (this.loading && !force) {\r\n this.toSetPieceType = type;\r\n return;\r\n }\r\n if (!runtime || this.isSettingPieceType || runtime.getIsMoving()) return;\r\n this.isSettingPieceType = true;\r\n\r\n try {\r\n await runtime.setPieceImages(type);\r\n } finally {\r\n this.isSettingPieceType = false;\r\n }\r\n }\r\n\r\n public getEventEmitter() {\r\n const runtime = this.getRuntime();\r\n if (!runtime) return null;\r\n return runtime.getEventEmitter();\r\n }\r\n\r\n public getPiecesImage() {\r\n const runtime = this.getRuntime();\r\n if (!runtime) return null;\r\n const piecesImage = runtime.getPieceStyle();\r\n if (!piecesImage) return null;\r\n return piecesImage;\r\n }\r\n}\r\n\r\nexport default Client;\r\n","import Client from \"./client\";\r\nimport { BoardHandled } from \"./interface\";\r\n\r\nfunction imperativeHandle(\r\n clientRef: React.RefObject<Client | null>,\r\n pendingMountRef: React.RefObject<null | (() => void)>,\r\n): BoardHandled & { flushPendingMount?: () => void } {\r\n return {\r\n loadPosition: (b, f) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.setBoard(b, f);\r\n },\r\n flip: () => {\r\n if (!clientRef.current) return;\r\n clientRef.current.flip();\r\n },\r\n getBoard: () => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getBoard();\r\n },\r\n getSquareCoords: (notation) => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getSquareCoords(notation);\r\n },\r\n togglePause: async () => {\r\n if (!clientRef.current) return null;\r\n return await clientRef.current.togglePause();\r\n },\r\n loadFenStream: (b) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.loadFenStream(b);\r\n },\r\n\r\n setfenStreamDelay: (n) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.setFenStreamDelay(n);\r\n },\r\n\r\n updateSize: (size) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.updateSize(size);\r\n },\r\n\r\n getPieceAt: (notation) => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getPieceAt(notation);\r\n },\r\n\r\n setPieceType: (type) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.setPieceType(type);\r\n },\r\n\r\n undo: async () => {\r\n if (!clientRef.current) return false;\r\n return await clientRef.current.undo();\r\n },\r\n\r\n redo: async () => {\r\n if (!clientRef.current) return false;\r\n return await clientRef.current.redo();\r\n },\r\n\r\n toggleHoverScaling: () => {\r\n if (!clientRef.current) return;\r\n clientRef.current.toggleHoverScaling();\r\n },\r\n\r\n toggleHoverScale: (scale) => {\r\n if (!clientRef.current) return;\r\n clientRef.current.toggleHoverScale(scale);\r\n },\r\n\r\n toggleHoverHighlight: () => {\r\n if (!clientRef.current) return;\r\n clientRef.current.toggleHoverHighlight();\r\n },\r\n\r\n getSize: () => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getSize();\r\n },\r\n\r\n makeMove: (move) => {\r\n if (!clientRef.current) return false;\r\n return clientRef.current.makeMove(move);\r\n },\r\n\r\n getEventEmitter: () => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getEventEmitter();\r\n },\r\n\r\n getPiecesImage: () => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getPiecesImage();\r\n },\r\n\r\n mount: (fun) => {\r\n if (!clientRef.current) {\r\n pendingMountRef.current = fun ?? null;\r\n return;\r\n }\r\n clientRef.current.mount(fun);\r\n pendingMountRef.current = null;\r\n },\r\n\r\n getIsLoadingFenStream: () => {\r\n if (!clientRef.current) return null;\r\n return clientRef.current.getIsLoadingFenStream();\r\n },\r\n\r\n flushPendingMount: () => {\r\n if (!clientRef.current || pendingMountRef.current === null) return;\r\n clientRef.current.mount(pendingMountRef.current);\r\n },\r\n };\r\n}\r\n\r\nexport default imperativeHandle;\r\n","import {\r\n useRef,\r\n useEffect,\r\n useImperativeHandle,\r\n useLayoutEffect,\r\n useMemo,\r\n} from \"react\";\r\nimport CanvasLayers from \"../engine/layers/canvasLayers\";\r\nimport { TBoardProps, TBoardRuntime } from \"../types/board\";\r\nimport Board from \"./board\";\r\nimport BoardRuntime from \"../engine/boardRuntime/boardRuntime\";\r\nimport Client from \"../engine/client/client\";\r\nimport React from \"react\";\r\nimport { BoardHandled } from \"../engine/client/interface\";\r\nimport imperativeHandle from \"../engine/client/imperativeHandle\";\r\nimport { TBoardEventContext } from \"types\";\r\n\r\nconst BoardEngine = React.forwardRef<BoardHandled, TBoardProps>(\r\n ({ config, onMove, onUpdate }, ref) => {\r\n const { pieceConfig, size } = config;\r\n\r\n const boardCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const staticPiecesCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const overlayCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const underlayCanvasRef = useRef<HTMLCanvasElement>(null);\r\n const dynamicPiecesCanvasRef = useRef<HTMLCanvasElement>(null);\r\n\r\n const boardRuntime = useRef<BoardRuntime | null>(null);\r\n const clientRef = useRef<Client | null>(null);\r\n const pendingMountRef = useRef<null | (() => void)>(null);\r\n\r\n const imperative = useMemo(\r\n () => imperativeHandle(clientRef, pendingMountRef),\r\n [],\r\n );\r\n\r\n const disposed = useRef(0);\r\n useEffect(() => {\r\n let runtime: BoardRuntime<TBoardEventContext> | null = null;\r\n let c: Client | null = null;\r\n const id = ++disposed.current;\r\n if (\r\n boardCanvasRef.current &&\r\n staticPiecesCanvasRef.current &&\r\n overlayCanvasRef.current &&\r\n underlayCanvasRef.current &&\r\n dynamicPiecesCanvasRef.current\r\n ) {\r\n const args: TBoardRuntime = {\r\n ...config,\r\n size: Math.floor(size / 8) * 8,\r\n onMove,\r\n onUpdate,\r\n canvasLayers: new CanvasLayers(\r\n boardCanvasRef,\r\n staticPiecesCanvasRef,\r\n underlayCanvasRef,\r\n overlayCanvasRef,\r\n dynamicPiecesCanvasRef,\r\n Math.floor(size / 8) * 8,\r\n ),\r\n pieceStyle: pieceConfig.piecesImage,\r\n mode: \"2d\",\r\n };\r\n\r\n (async () => {\r\n const create = await BoardRuntime.create(args);\r\n if (disposed.current !== id) {\r\n create.destroy();\r\n return;\r\n }\r\n create.mount();\r\n runtime = create;\r\n boardRuntime.current = runtime;\r\n c = new Client(runtime);\r\n clientRef.current = c;\r\n imperative.flushPendingMount?.();\r\n })();\r\n }\r\n\r\n return () => {\r\n disposed.current++;\r\n runtime?.destroy();\r\n c?.destroy();\r\n runtime = null;\r\n c = null;\r\n boardRuntime.current = null;\r\n clientRef.current = null;\r\n pendingMountRef.current = null;\r\n };\r\n }, []);\r\n\r\n useImperativeHandle(ref, () => imperative);\r\n\r\n return (\r\n <Board\r\n boardRuntime={boardRuntime}\r\n boardRef={boardCanvasRef}\r\n staticPiecesRef={staticPiecesCanvasRef}\r\n overlayRef={overlayCanvasRef}\r\n underlayRef={underlayCanvasRef}\r\n dynamicPiecesRef={dynamicPiecesCanvasRef}\r\n size={Math.floor(size / 8) * 8}\r\n />\r\n );\r\n },\r\n);\r\nexport default BoardEngine;\r\n","import { TSelected } from \"./board\";\r\nimport { TCanvasLayer, TCanvasLayerClient, TSafeCtx } from \"./draw\";\r\nimport {\r\n TPiece,\r\n TPieceBoard,\r\n TPieceId,\r\n TPieceImage,\r\n TPieceInternalRef,\r\n} from \"./piece\";\r\nimport { TNotation, TSquare } from \"./square\";\r\nimport { TDeepReadonly } from \"./utils\";\r\n\r\ntype TPointerDown = {\r\n e: React.PointerEvent<HTMLCanvasElement>;\r\n size: number;\r\n isBlackView: boolean;\r\n selectedRef: React.RefObject<TSelected | null>;\r\n internalRef: React.RefObject<Record<TPieceId, TPieceInternalRef>>;\r\n};\r\n\r\ntype TPointerMove = {\r\n e: React.PointerEvent<HTMLCanvasElement>;\r\n size: number;\r\n isBlackView: boolean;\r\n selectedRef: React.RefObject<TSelected | null>;\r\n internalRef: React.RefObject<Record<TPieceId, TPieceInternalRef>>;\r\n pieceHoverRef: React.RefObject<TPieceId | null>;\r\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\r\n};\r\n\r\ntype TBoardEventContextBase = {\r\n squareSize: number;\r\n size: number;\r\n x: number;\r\n y: number;\r\n};\r\n\r\ntype TBoardEventContextExtras = {\r\n piece?: TPieceInternalRef | null;\r\n piecesImage?: TPieceImage | null;\r\n square?: TSquare | null;\r\n pieces?: Record<TPieceId, TPieceInternalRef>;\r\n pieceHover?: TPieceId | null;\r\n selected?: TSelected | null;\r\n isBlackView?: boolean;\r\n lightTile?: string;\r\n darkTile?: string;\r\n animation?: TDeepReadonly<TAnimation[]>;\r\n draw?: TDrawFunction;\r\n};\r\n\r\ntype TDrawFunction = {\r\n (opts: { onDraw: (ctx: TSafeCtx) => void; layer: TCanvasLayerClient }): void;\r\n\r\n batch: (\r\n opts: {\r\n onDraw: (ctx: TSafeCtx) => void;\r\n layer: TCanvasLayerClient;\r\n }[],\r\n ) => void;\r\n\r\n group: (\r\n layer: TCanvasLayerClient,\r\n fn: (\r\n ctx: TSafeCtx,\r\n g: {\r\n draw: (onDraw: (ctx: TSafeCtx) => void) => void;\r\n },\r\n ) => void,\r\n ) => void;\r\n};\r\n\r\ntype TAnimation = {\r\n from: { x: number; y: number };\r\n to: { x: number; y: number };\r\n piece: TPieceInternalRef;\r\n start: number;\r\n id: TPieceId;\r\n};\r\n\r\ntype TMove = {\r\n from: TNotation;\r\n to: TNotation;\r\n piece: TPieceBoard;\r\n};\r\n\r\ntype TMoveReturn = {\r\n status: boolean;\r\n result: TMoveResult;\r\n};\r\n\r\ntype TMoveResult = {\r\n from: TNotation;\r\n to: TNotation;\r\n captured: TNotation[];\r\n promotion?: \"q\" | \"r\" | \"n\" | \"b\" | \"p\" | \"k\";\r\n}[];\r\n\r\ntype TMoveUndo = TUndo[];\r\n\r\ntype TUndo = {\r\n from: TNotation;\r\n to: TNotation;\r\n captured: { square: TNotation; type: TPiece }[];\r\n moved: TPiece;\r\n promoted: boolean;\r\n};\r\n\r\ntype TListener = (...args: any[]) => void;\r\n\r\ninterface IEventListener {\r\n on(event: TEventListenerEvents, listener: TListener): () => void;\r\n once(event: TEventListenerEvents, listener: TListener): () => void;\r\n off(event: TEventListenerEvents, listener: TListener): void;\r\n}\r\nconst EVENT_LISTENER_EVENTS = {\r\n onMoveAbort: \"onMoveAbort\",\r\n onPointerDown: \"onPointerDown\",\r\n onPointerMove: \"onPointerMove\",\r\n onPointerUp: \"onPointerUp\",\r\n onFenStreamLoaded: \"onFenStreamLoaded\",\r\n} as const;\r\n\r\ntype TEventListenerEvents =\r\n (typeof EVENT_LISTENER_EVENTS)[keyof typeof EVENT_LISTENER_EVENTS];\r\n\r\nconst EVENTS = {\r\n onPointerSelect: \"onPointerSelect\",\r\n onPointerHover: \"onPointerHover\",\r\n onPointerDragStart: \"onPointerDragStart\",\r\n onPointerDrag: \"onPointerDrag\",\r\n onPointerDrop: \"onPointerDrop\",\r\n onAnimationFrame: \"onAnimationFrame\",\r\n onDrawPiece: \"onDrawPiece\",\r\n onDrawBoard: \"onDrawBoard\",\r\n onDrawOverlay: \"onDrawOverlay\",\r\n onDrawUnderlay: \"onDrawUnderlay\",\r\n} as const;\r\n\r\ntype TEvents = keyof typeof EVENTS;\r\n\r\ntype TBoardEventContext = TBoardEventContextBase &\r\n Partial<TBoardEventContextExtras>;\r\n\r\ntype TBoardEvent<T = TBoardEventContext, E = void> = E extends void\r\n ? (arg: T) => void\r\n : (arg: T, extra: E) => void;\r\n\r\ntype TBoardEventExtras = {\r\n onPointerSelect: void;\r\n onPointerHover: void;\r\n onPointerDragStart: void;\r\n onPointerDrag: void;\r\n onPointerDrop: void;\r\n onAnimationFrame: void;\r\n onDrawPiece: void;\r\n onDrawBoard: void;\r\n onDrawOverlay: void;\r\n onDrawUnderlay: void;\r\n};\r\n\r\ntype TBoardEvents<\r\n T extends TGetterBoardEventContext = TGetterBoardEventContext,\r\n E extends Record<string, any> = TBoardEventExtras,\r\n> = {\r\n [K in keyof E]?: TBoardEvent<T, E[K]>;\r\n};\r\n\r\ntype TGetterProp<T> = {\r\n [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];\r\n};\r\n\r\ntype TGetterBoardEventContext = TGetterProp<TBoardEventContextExtras> &\r\n TBoardEventContextBase;\r\n\r\nexport type {\r\n TPointerDown,\r\n TPointerMove,\r\n TBoardEventContext,\r\n TBoardEvents,\r\n TBoardEvent,\r\n TBoardEventExtras,\r\n TBoardEventContextBase,\r\n TBoardEventContextExtras,\r\n TMove,\r\n TMoveReturn,\r\n TMoveResult,\r\n TMoveUndo,\r\n TUndo,\r\n TAnimation,\r\n TGetterBoardEventContext,\r\n TEvents,\r\n TDrawFunction,\r\n TListener,\r\n IEventListener,\r\n TEventListenerEvents,\r\n};\r\n\r\nexport { EVENTS };\r\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","Utils","P1","P2","P3","P4","square","squareSize","isBlackView","file","rank","x","y","file_","rank_","notation","rect","fun","resolve","obj","obj_","val","i","prop","fen","ranks","isDigit","isWhite","files","map","rankNumber","fileIndex","ch","isWhitePiece","board","empty","sq","piece","isPiece","count","ctx","cache","currentPath","recordedRegions","actualRegions","expandForShadow","w","h","blur","ox","oy","padX","padY","recordRegion","s","recordActualRegion","sampleQuadratic","p0","p1","p2","step","pts","t","sampleBezier","p3","getFontSize","match","baseCtx","target","bound","args","r","rx","ry","cx","cy","last","cx1","cy1","cx2","cy2","xs","p","ys","minX","minY","maxX","maxY","pad","text","fontSize","metrics","ascent","descent","width","padTop","padBottom","padSides","leftX","topY","rectX","rectY","rectW","rectH","img","dx","dy","dw","dh","err","forbiddenMethods","forbiddenProps","receiver","blocked","CanvasLayers","pieces","overlay","underlayCanvas","dynamicPiecesCanvas","size","canvas","curr","dpr","targetW","targetH","styles","style","staticPiecesCtx","boardCtx","overlayCtx","underlayCtx","dynamicPiecesCtx","underlay","dynamic","custom","ref","Board","boardRuntime","boardRef","staticPiecesRef","overlayRef","underlayRef","dynamicPiecesRef","handlePointerDown","useCallback","e","handlePointerMove","handlePointerUp","handlePointerLeave","jsxs","jsx","pieceKey","BoardEvents","WhitePawn","WhiteBishop","WhiteKnight","WhiteRook","WhiteQueen","WhiteKing","BlackPawn","BlackBishop","BlackKnight","BlackRook","BlackQueen","BlackKing","PieceHelpers","assets.wP","assets.wB","assets.wN","assets.wR","assets.wQ","assets.wK","assets.bP","assets.bB","assets.bN","assets.bR","assets.bQ","assets.bK","images","internalRef","refObj","cached","_","id","from","to","loadImage","src","_documentCurrentScript","image","ImagePromises","PointerEventsHelpers","offsetX","offsetY","selected","piece_","searchPiece","session","half","clampX","clampY","isDragging","secondClick","offset","move","toggle","sqr","coords","EngineHelpers","base","resolvers","opts","result","useCache","plain","events","event","extra","res","fn","click","moveCallback","keep","token","render","layer","currMove","newSelectedPiece","SpatialIndex","boundary","newObject","c","box","quad","child","height","found","idx","hash","o","newBox","SpatialNode","BaseLayer","delta","pieceId","clearCoords","hasEvent","regions","layerManager","a","b","left","right","top","bottom","overlapW","overlapH","resolver","n","anim","BoardLayer","lightTile","darkTile","firstColor","secondColor","isLight","UnderlayLayer","StaticPiecesLayer","checked","search","toRender","piecesImage","pieceHoverRef","newPieces","image_","textWidth","scale","DynamicPiecesLayer","CLEAR","animation","distance","duration","easeOutCubic","progress","eased","isPending","gen","time","nextRef","firstRef","OverlayLayer","Iterators","drawSelect","SELECT_COLOR","SELECT_GLOW","hoverConfig","drawHighlight","drawScaling","Events","selectedRef","injection","context","handler","LayerManager","noRender","fromLayer","toLayer","isActivePiece","coords_","newCoords","ctx_","record","first","list","delayed","layer_","PipelineRender","next","method","Renderer2D","canvases","Renderer3D","init","EventEmitter","listener","listeners","index","wrapper","off","BoardRuntime","this_","at","drawFn","onDraw","clearCtx","optsArr","layers","ordered","g","total","needMove","squares","activePool","checkedSquares","usedSquares","create","moveToInactive","needCreate","inactive","render_","lastHover","delay","moves","undo","promotion","captured","undoMove","newSquare","newType","newId","newPiece","piece_coords","cap","enemie","enemie_","toUndo","moved","promoted","enemieSquare","enemieId","redo","ids","existing","startX","startY","nextIds","runtimeMap","Client","runtime","force","eventEmitter","nextFen","ms","hasPiece","imperativeHandle","clientRef","pendingMountRef","f","BoardEngine","onMove","onUpdate","pieceConfig","boardCanvasRef","useRef","staticPiecesCanvasRef","overlayCanvasRef","underlayCanvasRef","dynamicPiecesCanvasRef","imperative","useMemo","disposed","useEffect","useImperativeHandle","EVENTS"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|