UNPKG

@haelp/teto

Version:

A typescript-based controllable TETR.IO client.

1 lines 4.54 kB
{"version":3,"sources":["../../../../src/engine/utils/kicks/index.ts"],"sourcesContent":["import { type BoardSquare } from \"../../board\";\nimport { Mino } from \"../../queue/types\";\nimport type { Rotation } from \"../tetromino/types\";\nimport { kicks } from \"./data\";\n\nexport { kicks as kickData };\nexport type KickTable = keyof typeof kicks;\n\nexport const legal = (blocks: [number, number][], board: BoardSquare[][]) => {\n if (board.length === 0) return false;\n for (const block of blocks) {\n if (block[0] < 0) return false;\n if (block[0] >= board[0].length) return false;\n if (block[1] < 0) return false;\n if (block[1] >= board.length) return false;\n if (board[block[1]][block[0]]) return false;\n }\n\n return true;\n};\n\nexport const performKick = (\n kicktable: KickTable,\n piece: Mino,\n pieceLocation: [number, number],\n ao: [number, number],\n maxMovement: boolean,\n blocks: [number, number][],\n startRotation: Rotation,\n endRotation: Rotation,\n board: BoardSquare[][]\n):\n | {\n kick: [number, number];\n newLocation: [number, number];\n id: string;\n index: number;\n }\n | boolean => {\n try {\n if (\n legal(\n blocks.map((block) => [\n pieceLocation[0] + block[0] - ao[0],\n Math.floor(pieceLocation[1]) - block[1] - ao[1]\n ]),\n board\n )\n )\n return true;\n\n const kickID = `${startRotation}${endRotation}`;\n const table = kicks[kicktable];\n const customKicksetID =\n `${piece.toLowerCase()}_kicks` as keyof typeof table;\n const kickset: [number, number][] =\n customKicksetID in table\n ? table[customKicksetID][\n kickID as keyof (typeof table)[typeof customKicksetID]\n ]\n : (table.kicks[kickID as keyof typeof table.kicks] as [\n number,\n number\n ][]);\n\n for (let i = 0; i < kickset.length; i++) {\n const [dx, dy] = kickset[i];\n\n const newY = maxMovement\n ? pieceLocation[1] - dy - ao[1]\n : Math.ceil(pieceLocation[1]) - 0.1 - dy - ao[1];\n\n if (\n legal(\n blocks.map((block) => [\n pieceLocation[0] + block[0] + dx - ao[0],\n Math.floor(newY) - block[1]\n ]),\n board\n )\n ) {\n return {\n newLocation: [pieceLocation[0] + dx - ao[0], newY],\n kick: [dx, -dy],\n id: kickID,\n index: i\n };\n }\n }\n\n return false;\n } catch {\n return false;\n }\n};\n"],"names":["kicks","kickData","legal","blocks","board","length","block","performKick","kicktable","piece","pieceLocation","ao","maxMovement","startRotation","endRotation","map","Math","floor","kickID","table","customKicksetID","toLowerCase","kickset","i","dx","dy","newY","ceil","newLocation","kick","id","index"],"mappings":"AAGA,SAASA,KAAK,QAAQ,SAAS;AAE/B,SAASA,SAASC,QAAQ,GAAG;AAG7B,OAAO,MAAMC,QAAQ,CAACC,QAA4BC;IAChD,IAAIA,MAAMC,MAAM,KAAK,GAAG,OAAO;IAC/B,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAIG,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO;QACzB,IAAIA,KAAK,CAAC,EAAE,IAAIF,KAAK,CAAC,EAAE,CAACC,MAAM,EAAE,OAAO;QACxC,IAAIC,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO;QACzB,IAAIA,KAAK,CAAC,EAAE,IAAIF,MAAMC,MAAM,EAAE,OAAO;QACrC,IAAID,KAAK,CAACE,KAAK,CAAC,EAAE,CAAC,CAACA,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO;IACxC;IAEA,OAAO;AACT,EAAE;AAEF,OAAO,MAAMC,cAAc,CACzBC,WACAC,OACAC,eACAC,IACAC,aACAT,QACAU,eACAC,aACAV;IASA,IAAI;QACF,IACEF,MACEC,OAAOY,GAAG,CAAC,CAACT,QAAU;gBACpBI,aAAa,CAAC,EAAE,GAAGJ,KAAK,CAAC,EAAE,GAAGK,EAAE,CAAC,EAAE;gBACnCK,KAAKC,KAAK,CAACP,aAAa,CAAC,EAAE,IAAIJ,KAAK,CAAC,EAAE,GAAGK,EAAE,CAAC,EAAE;aAChD,GACDP,QAGF,OAAO;QAET,MAAMc,SAAS,GAAGL,gBAAgBC,aAAa;QAC/C,MAAMK,QAAQnB,KAAK,CAACQ,UAAU;QAC9B,MAAMY,kBACJ,GAAGX,MAAMY,WAAW,GAAG,MAAM,CAAC;QAChC,MAAMC,UACJF,mBAAmBD,QACfA,KAAK,CAACC,gBAAgB,CACpBF,OACD,GACAC,MAAMnB,KAAK,CAACkB,OAAmC;QAKtD,IAAK,IAAIK,IAAI,GAAGA,IAAID,QAAQjB,MAAM,EAAEkB,IAAK;YACvC,MAAM,CAACC,IAAIC,GAAG,GAAGH,OAAO,CAACC,EAAE;YAE3B,MAAMG,OAAOd,cACTF,aAAa,CAAC,EAAE,GAAGe,KAAKd,EAAE,CAAC,EAAE,GAC7BK,KAAKW,IAAI,CAACjB,aAAa,CAAC,EAAE,IAAI,MAAMe,KAAKd,EAAE,CAAC,EAAE;YAElD,IACET,MACEC,OAAOY,GAAG,CAAC,CAACT,QAAU;oBACpBI,aAAa,CAAC,EAAE,GAAGJ,KAAK,CAAC,EAAE,GAAGkB,KAAKb,EAAE,CAAC,EAAE;oBACxCK,KAAKC,KAAK,CAACS,QAAQpB,KAAK,CAAC,EAAE;iBAC5B,GACDF,QAEF;gBACA,OAAO;oBACLwB,aAAa;wBAAClB,aAAa,CAAC,EAAE,GAAGc,KAAKb,EAAE,CAAC,EAAE;wBAAEe;qBAAK;oBAClDG,MAAM;wBAACL;wBAAI,CAACC;qBAAG;oBACfK,IAAIZ;oBACJa,OAAOR;gBACT;YACF;QACF;QAEA,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF,EAAE"}