{"version":3,"sources":["../../../src/engine/board/index.ts"],"sourcesContent":["import { Mino } from \"../queue/types\";\n\nexport interface BoardInitializeParams {\n  width: number;\n  height: number;\n  buffer: number;\n}\n\nexport type BoardSquare = Mino | null;\n\nexport class Board {\n  state: BoardSquare[][];\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  occupied(x: number, y: number): boolean {\n    return (\n      x < 0 ||\n      y < 0 ||\n      x >= this.width ||\n      y >= this.fullHeight ||\n      this.state[y][x] !== null\n    );\n  }\n\n  add(...blocks: [BoardSquare, number, number][]) {\n    blocks.forEach(([char, x, y]) => {\n      if (y < 0 || y >= this.fullHeight || x < 0 || x >= this.width) return;\n      this.state[y][x] = char;\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.BOMB)) {\n        lines.push(idx);\n        if (row.some((block) => block === 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.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((col) => this.state[lowestY - 1][col] === Mino.BOMB)\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  }: {\n    amount: number;\n    size: number;\n    column: number;\n    bombs: boolean;\n  }) {\n    this.state.splice(\n      0,\n      0,\n      ...Array.from({ length: amount }, () =>\n        Array.from({ length: this.width }, (_, idx) =>\n          idx >= column && idx < column + size\n            ? bombs\n              ? Mino.BOMB\n              : null\n            : Mino.GARBAGE\n        )\n      )\n    );\n\n    this.state.splice(this.fullHeight - amount - 1, amount);\n  }\n}\n\nexport * from \"./connected\";\n"],"names":["Mino","Board","state","_height","_width","_buffer","options","width","height","buffer","Array","fullHeight","fill","map","value","occupied","x","y","add","blocks","forEach","char","clearLines","garbageCleared","lines","row","idx","every","block","BOMB","push","some","GARBAGE","reverse","line","splice","length","clearBombs","placedBlocks","lowestY","reduce","acc","_","Math","min","lowestBlocks","filter","bombColumns","col","clearBombsAndLines","bombs","perfectClear","insertGarbage","amount","size","column","from"],"mappings":"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"}