@haelp/teto
Version:
A typescript-based controllable TETR.IO client.
1 lines • 12.9 kB
Source Map (JSON)
{"version":3,"sources":["../../../../src/engine/utils/tetromino/index.ts"],"sourcesContent":["import { deepCopy } from \"..\";\nimport { type BoardSquare } from \"../../board\";\nimport { Mino } from \"../../queue/types\";\nimport { type KickTable, legal, performKick } from \"../kicks\";\nimport { tetrominoes } from \"./data\";\nimport type { Rotation } from \"./types\";\n\nexport interface TetrominoInitializeParams {\n symbol: Mino;\n initialRotation: Rotation;\n boardHeight: number;\n boardWidth: number;\n from?: Tetromino | TetrominoSnapshot;\n}\n\nexport interface TetrominoSnapshot {\n symbol: Mino;\n location: [number, number];\n locking: number;\n lockResets: number;\n rotResets: number;\n safeLock: number;\n highestY: number;\n rotation: Rotation;\n fallingRotations: number;\n totalRotations: number;\n irs: number;\n ihs: boolean;\n aox: number;\n aoy: number;\n keys: number;\n}\n\nexport class Tetromino {\n #rotation!: Rotation;\n symbol: Mino;\n states: [number, number][][];\n location: [number, number];\n\n locking: number;\n lockResets: number;\n rotResets: number;\n safeLock: number;\n highestY: number;\n fallingRotations: number;\n totalRotations: number;\n irs: number;\n ihs: boolean;\n aox: number;\n aoy: number;\n keys: number;\n\n constructor(options: TetrominoInitializeParams) {\n this.rotation = options.initialRotation;\n this.symbol = options.symbol;\n const tetromino = tetrominoes[this.symbol.toLowerCase()];\n\n this.states = tetromino.matrix.data as any;\n\n this.location = [\n Math.floor(options.boardWidth / 2 - tetromino.matrix.w / 2),\n options.boardHeight + 2.04\n ];\n\n // other stuff\n this.locking = 0;\n this.lockResets = 0;\n this.rotResets = 0;\n this.safeLock = options.from?.safeLock ?? 0;\n this.highestY = options.boardHeight + 2;\n this.fallingRotations = 0;\n this.totalRotations = 0;\n this.irs = options.from?.irs ?? 0;\n this.ihs = options.from?.ihs ?? false;\n this.aox = 0;\n this.aoy = 0;\n this.keys = 0;\n }\n\n get blocks() {\n return this.states[Math.min(this.rotation, this.states.length)];\n }\n\n get absoluteBlocks() {\n return this.blocks.map((block): [number, number] => [\n block[0] + this.location[0],\n -block[1] + this.y\n ]);\n }\n\n absoluteAt({\n x = this.location[0],\n y = this.location[1],\n rotation = this.rotation\n }: {\n x?: number;\n y?: number;\n rotation?: number;\n }) {\n const currentState = [this.location[0], this.location[1], this.rotation];\n\n this.location = [x, y];\n this.rotation = rotation;\n\n const res = this.absoluteBlocks;\n\n this.location = [currentState[0], currentState[1]];\n this.rotation = currentState[2];\n\n return res;\n }\n\n get rotation(): Rotation {\n return (this.#rotation % 4) as any;\n }\n\n set rotation(value: number) {\n this.#rotation = (value % 4) as any;\n }\n\n get x() {\n return this.location[0];\n }\n\n set x(value: number) {\n this.location[0] = value;\n }\n\n get y() {\n return Math.floor(this.location[1]);\n }\n\n set y(value: number) {\n this.location[1] = value;\n }\n\n isStupidSpinPosition(board: BoardSquare[][]) {\n return !legal(\n this.blocks.map((block) => [\n block[0] + this.location[0],\n -block[1] + this.y - 1\n ]),\n board\n );\n }\n\n isAllSpinPosition(board: BoardSquare[][]) {\n return (\n !legal(\n this.blocks.map((block) => [\n block[0] + this.location[0] - 1,\n -block[1] + this.y\n ]),\n board\n ) &&\n !legal(\n this.blocks.map((block) => [\n block[0] + this.location[0] + 1,\n -block[1] + this.y\n ]),\n board\n ) &&\n !legal(\n this.blocks.map((block) => [\n block[0] + this.location[0],\n -block[1] + this.y + 1\n ]),\n board\n ) &&\n !legal(\n this.blocks.map((block) => [\n block[0] + this.location[0],\n -block[1] + this.y - 1\n ]),\n board\n )\n );\n }\n\n rotate(\n board: BoardSquare[][],\n kickTable: KickTable,\n amt: Rotation,\n maxMovement: boolean\n ) {\n const rotatedBlocks = this.states[(this.rotation + amt) % 4];\n const kickRes = performKick(\n kickTable,\n this.symbol,\n this.location,\n [this.aox, this.aoy],\n maxMovement,\n rotatedBlocks,\n this.rotation,\n ((this.rotation + amt) % 4) as any,\n board\n );\n\n if (typeof kickRes === \"object\") {\n this.location = [...kickRes.newLocation];\n }\n if (kickRes) {\n this.rotation = this.rotation + amt;\n\n return kickRes;\n }\n\n return false;\n }\n\n moveRight(board: BoardSquare[][]) {\n if (\n legal(\n this.blocks.map((block) => [\n block[0] + this.location[0] + 1,\n -block[1] + this.y\n ]),\n board\n )\n ) {\n this.location[0]++;\n return true;\n }\n return false;\n }\n moveLeft(board: BoardSquare[][]) {\n if (\n legal(\n this.blocks.map((block) => [\n block[0] + this.location[0] - 1,\n -block[1] + this.y\n ]),\n board\n )\n ) {\n this.location[0]--;\n return true;\n }\n\n return false;\n }\n\n dasRight(board: BoardSquare[][]) {\n if (this.moveRight(board)) {\n while (this.moveRight(board)) {}\n return true;\n }\n return false;\n }\n\n dasLeft(board: BoardSquare[][]) {\n if (this.moveLeft(board)) {\n while (this.moveLeft(board)) {}\n return true;\n }\n return false;\n }\n\n softDrop(board: BoardSquare[][]) {\n const start = this.location[1];\n while (\n legal(\n this.blocks.map((block) => [\n block[0] + this.location[0],\n -block[1] + this.y - 1\n ]),\n board\n )\n ) {\n this.location[1]--;\n }\n\n return start !== this.location[1];\n }\n\n snapshot(): TetrominoSnapshot {\n return {\n aox: this.aox,\n aoy: this.aoy,\n fallingRotations: this.fallingRotations,\n highestY: this.highestY,\n ihs: this.ihs,\n irs: this.irs,\n keys: this.keys,\n rotation: this.rotation,\n location: deepCopy(this.location),\n locking: this.locking,\n lockResets: this.lockResets,\n rotResets: this.rotResets,\n safeLock: this.safeLock,\n symbol: this.symbol,\n totalRotations: this.totalRotations\n };\n }\n}\n\nexport * from \"./data\";\nexport * from \"./types\";\n"],"names":["deepCopy","legal","performKick","tetrominoes","Tetromino","symbol","states","location","locking","lockResets","rotResets","safeLock","highestY","fallingRotations","totalRotations","irs","ihs","aox","aoy","keys","options","rotation","initialRotation","tetromino","toLowerCase","matrix","data","Math","floor","boardWidth","w","boardHeight","from","blocks","min","length","absoluteBlocks","map","block","y","absoluteAt","x","currentState","res","value","isStupidSpinPosition","board","isAllSpinPosition","rotate","kickTable","amt","maxMovement","rotatedBlocks","kickRes","newLocation","moveRight","moveLeft","dasRight","dasLeft","softDrop","start","snapshot"],"mappings":"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"}