{"version":3,"sources":["../../../src/engine/board/connected.ts"],"sourcesContent":["import { type BoardInitializeParams } from \".\";\nimport { Mino } from \"../queue\";\n\nexport type ConnectedBoardSquare = {\n  mino: Mino;\n  connection: number;\n} | null;\n\nexport class ConnectedBoard {\n  state: ConnectedBoardSquare[][];\n\n  private _height: number;\n  private _width: number;\n  private _buffer: number;\n\n  constructor(options: BoardInitializeParams) {\n    this._width = options.width;\n    this._height = options.height;\n    this._buffer = options.buffer;\n    this.state = Array(this.fullHeight)\n      .fill(null)\n      .map(() => Array(this.width).fill(null));\n  }\n\n  get height(): number {\n    return this._height;\n  }\n\n  set height(value: number) {\n    this._height = value;\n  }\n\n  get width(): number {\n    return this._width;\n  }\n\n  set width(value: number) {\n    this._width = value;\n  }\n\n  get buffer(): number {\n    return this._buffer;\n  }\n\n  set buffer(value: number) {\n    this._buffer = value;\n  }\n\n  get fullHeight(): number {\n    return this.height + this.buffer;\n  }\n\n  add(...blocks: [ConnectedBoardSquare, number, number][]) {\n    blocks.forEach(([item, x, y]) => {\n      if (y < 0 || y >= this.fullHeight || x < 0 || x >= this.width) return;\n      this.state[y][x] = item;\n    });\n  }\n\n  clearLines() {\n    let garbageCleared = 0;\n    const lines: number[] = [];\n    this.state.forEach((row, idx) => {\n      if (row.every((block) => block !== null && block.mino !== Mino.BOMB)) {\n        lines.push(idx);\n        if (idx > 0) {\n          this.state[idx - 1].forEach((block) => {\n            if (block) {\n              block.connection |= 0b1000;\n              if (block.connection & 0b0010) block.connection &= 0b0_1111;\n            }\n          });\n        }\n        if (idx < this.fullHeight - 1) {\n          this.state[idx + 1].forEach((block) => {\n            if (block) {\n              block.connection |= 0b0010;\n              if (block.connection & 0b1000) block.connection &= 0b0_1111;\n            }\n          });\n        }\n        if (row.some((block) => block?.mino === Mino.GARBAGE)) garbageCleared++;\n      }\n    });\n\n    [...lines].reverse().forEach((line) => {\n      this.state.splice(line, 1);\n      this.state.push(new Array(this.width).fill(null));\n    });\n    return { lines: lines.length, garbageCleared };\n  }\n\n  clearBombs(placedBlocks: [number, number][]) {\n    let lowestY = placedBlocks.reduce(\n      (acc, [_, y]) => Math.min(acc, y),\n      this.fullHeight\n    );\n    if (lowestY === 0) return { lines: 0, garbageCleared: 0 };\n\n    const lowestBlocks = placedBlocks.filter(([_, y]) => y === lowestY);\n\n    const bombColumns = lowestBlocks\n      .filter(([x, y]) => this.state[y - 1][x]?.mino === Mino.BOMB)\n      .map(([x, _]) => x);\n    if (bombColumns.length === 0) return { lines: 0, garbageCleared: 0 };\n\n    const lines: number[] = [];\n\n    while (\n      lowestY > 0 &&\n      bombColumns.some(\n        (col) => this.state[lowestY - 1][col]?.mino === Mino.BOMB\n      )\n    ) {\n      lines.push(--lowestY);\n    }\n\n    if (lines.length === 0) return { lines: 0, garbageCleared: 0 };\n\n    lines.forEach((line) => {\n      this.state.splice(line, 1);\n      this.state.push(new Array(this.width).fill(null));\n    });\n\n    return { lines: lines.length, garbageCleared: lines.length };\n  }\n\n  clearBombsAndLines(placedBlocks: [number, number][]) {\n    const bombs = this.clearBombs(placedBlocks);\n    const lines = this.clearLines();\n    return {\n      lines: lines.lines + bombs.lines,\n      garbageCleared: bombs.garbageCleared + lines.garbageCleared\n    };\n  }\n\n  get perfectClear() {\n    return this.state.every((row) => row.every((block) => block === null));\n  }\n\n  insertGarbage({\n    amount,\n    size,\n    column,\n    bombs,\n    isBeginning,\n    isEnd\n  }: {\n    amount: number;\n    size: number;\n    column: number;\n    bombs: boolean;\n    isBeginning: boolean;\n    isEnd: boolean;\n  }) {\n    this.state.splice(\n      0,\n      0,\n      ...Array.from({ length: amount }, (_, y) =>\n        Array.from({ length: this.width }, (_, x) =>\n          x >= column && x < column + size\n            ? bombs\n              ? { mino: Mino.BOMB, connection: 0 }\n              : null\n            : {\n                mino: Mino.GARBAGE,\n                connection: (() => {\n                  let connection = 0;\n\n                  if (isEnd && y === 0) connection |= 0b0010;\n                  if (isBeginning && y === amount - 1) connection |= 0b1000;\n                  if (x === 0) connection |= 0b0001;\n                  if (x === this.width - 1) connection |= 0b0100;\n                  if (x === column - 1) connection |= 0b0100;\n                  if (x === column + size) connection |= 0b0001;\n\n                  return connection;\n                })()\n              }\n        )\n      )\n    );\n\n    this.state.splice(this.fullHeight - amount - 1, amount);\n  }\n}\n\nexport * from \"./connected\";\n"],"names":["Mino","ConnectedBoard","state","_height","_width","_buffer","options","width","height","buffer","Array","fullHeight","fill","map","value","add","blocks","forEach","item","x","y","clearLines","garbageCleared","lines","row","idx","every","block","mino","BOMB","push","connection","some","GARBAGE","reverse","line","splice","length","clearBombs","placedBlocks","lowestY","reduce","acc","_","Math","min","lowestBlocks","filter","bombColumns","col","clearBombsAndLines","bombs","perfectClear","insertGarbage","amount","size","column","isBeginning","isEnd","from"],"mappings":"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"}