{"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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"}