{"version":3,"sources":["../../src/engine/index.ts"],"sourcesContent":["import type { Game } from \"../types/game\";\nimport { EventEmitter } from \"../utils/events\";\nimport { Board, type BoardInitializeParams, ConnectedBoard } from \"./board\";\nimport { constants } from \"./constants\";\nimport {\n  GarbageQueue,\n  type GarbageQueueInitializeParams,\n  type IncomingGarbage,\n  LegacyGarbageQueue,\n  type OutgoingGarbage\n} from \"./garbage\";\nimport { IGEHandler, type MultiplayerOptions } from \"./multiplayer\";\nimport { Queue, type QueueInitializeParams } from \"./queue\";\nimport { Mino } from \"./queue/types\";\nimport type {\n  EngineSnapshot,\n  Events,\n  IncreasableValue,\n  LockRes,\n  SpinType\n} from \"./types\";\nimport { IncreaseTracker, deepCopy } from \"./utils\";\nimport { garbageCalcV2, garbageData } from \"./utils/damageCalc\";\nimport { type KickTable, legal, performKick } from \"./utils/kicks\";\nimport {\n  type KickTableName,\n  cornerTable,\n  kicks,\n  spinbonusRules\n} from \"./utils/kicks/data\";\nimport { Tetromino, tetrominoes } from \"./utils/tetromino\";\nimport type { Rotation } from \"./utils/tetromino/types\";\n\nimport chalk from \"chalk\";\n\nexport interface GameOptions {\n  spinBonuses: Game.SpinBonuses;\n  comboTable: keyof (typeof garbageData)[\"comboTable\"] | \"multiplier\";\n  garbageTargetBonus: \"none\" | \"normal\" | string;\n  clutch: boolean;\n  garbageBlocking: \"combo blocking\" | \"limited blocking\" | \"none\";\n}\n\nexport type PCOptions =\n  | false\n  | {\n      garbage: number;\n      b2b: number;\n    };\n\nexport interface B2BOptions {\n  chaining: boolean;\n  charging:\n    | false\n    | {\n        at: number;\n        base: number;\n      };\n}\n\nexport interface MiscellaneousOptions {\n  movement: {\n    infinite: boolean;\n    lockResets: number;\n    lockTime: number;\n    may20G: boolean;\n  };\n  allowed: {\n    spin180: boolean;\n    hardDrop: boolean;\n    hold: boolean;\n  };\n  infiniteHold: boolean;\n  username?: string;\n  date?: Date;\n}\n\nexport interface EngineInitializeParams {\n  queue: QueueInitializeParams;\n  board: BoardInitializeParams;\n  kickTable: KickTable;\n  options: GameOptions;\n  gravity: IncreasableValue;\n  garbage: GarbageQueueInitializeParams;\n  handling: Game.Handling;\n  pc: PCOptions;\n  b2b: B2BOptions;\n  multiplayer?: MultiplayerOptions;\n  misc: MiscellaneousOptions;\n}\n\nexport class Engine {\n  queue!: Queue;\n  held!: Mino | null;\n  holdLocked!: boolean;\n  falling!: Tetromino;\n  private _kickTable!: KickTableName;\n  board!: Board;\n  connectedBoard!: ConnectedBoard;\n  lastSpin!: {\n    piece: Mino;\n    type: SpinType;\n  } | null;\n  lastWasClear!: boolean;\n  stats!: {\n    garbage: {\n      sent: number;\n      attack: number;\n      receive: number;\n      cleared: number;\n    };\n    combo: number;\n    b2b: number;\n    pieces: number;\n    lines: number;\n  };\n  gameOptions!: GameOptions;\n  garbageQueue!: GarbageQueue | LegacyGarbageQueue;\n\n  frame!: number;\n  subframe!: number;\n\n  initializer: EngineInitializeParams;\n\n  handling!: Game.Handling;\n\n  input!: {\n    lShift: { held: boolean; arr: number; das: number; dir: -1 };\n    rShift: { held: boolean; arr: number; das: number; dir: 1 };\n    lastShift: number;\n    keys: {\n      [k in\n        | \"softDrop\"\n        | \"rotateCCW\"\n        | \"rotateCW\"\n        | \"rotate180\"\n        | \"hold\"]: boolean;\n    };\n    firstInputTime: number;\n    time: {\n      start: number;\n      zero: boolean;\n      locked: boolean;\n      prev: number;\n      frameoffset: number;\n    };\n    lastPieceTime: number;\n  };\n\n  pc!: PCOptions;\n  b2b!: B2BOptions;\n\n  dynamic!: {\n    gravity: IncreaseTracker;\n    garbageMultiplier: IncreaseTracker;\n    garbageCap: IncreaseTracker;\n  };\n\n  glock!: number;\n\n  multiplayer?: {\n    options: MultiplayerOptions;\n    targets: number[];\n    passthrough: {\n      network: boolean;\n      replay: boolean;\n      travel: boolean;\n    };\n  };\n  igeHandler!: IGEHandler;\n\n  misc!: MiscellaneousOptions;\n\n  state!: number;\n\n  currentSpike!: number;\n\n  events = new EventEmitter<Events>();\n\n  private resCache!: {\n    pieces: number;\n    garbage: {\n      sent: number[];\n      received: OutgoingGarbage[];\n    };\n    keys: Game.Key[];\n    lastLock: number;\n  };\n\n  constructor(options: EngineInitializeParams) {\n    this.initializer = deepCopy(options, [\n      { type: Date, copy: (d) => new Date(d) }\n    ]);\n\n    this.init();\n  }\n\n  init() {\n    const options = this.initializer;\n\n    this.queue = new Queue(options.queue);\n\n    this.queue.onRepopulate(this.#onQueueRepopulate.bind(this));\n\n    this._kickTable = options.kickTable;\n\n    this.board = new Board(options.board);\n    this.connectedBoard = new ConnectedBoard(options.board);\n\n    this.garbageQueue = new (\n      (options.misc.date ?? new Date()) > new Date(\"2025-05-06T15:00:00-04:00\")\n        ? GarbageQueue\n        : LegacyGarbageQueue\n    )(options.garbage);\n\n    this.igeHandler = new IGEHandler(options.multiplayer?.opponents || []);\n\n    if (options.multiplayer)\n      this.multiplayer = {\n        options: options.multiplayer,\n        targets: [],\n        passthrough: {\n          network: [\"consistent\", \"zero\"].includes(\n            options.multiplayer.passthrough\n          ),\n          replay: options.multiplayer.passthrough !== \"full\",\n          travel: [\"zero\", \"limited\"].includes(options.multiplayer.passthrough)\n        }\n      };\n\n    this.held = null;\n    this.holdLocked = false;\n    this.lastSpin = null;\n    this.lastWasClear = false;\n\n    this.stats = {\n      combo: -1,\n      b2b: -1,\n      pieces: 0,\n      lines: 0,\n      garbage: {\n        sent: 0,\n        attack: 0,\n        receive: 0,\n        cleared: 0\n      }\n    };\n\n    this.pc = options.pc;\n    this.b2b = {\n      chaining: options.b2b.chaining,\n      charging: options.b2b.charging\n    };\n\n    this.dynamic = {\n      gravity: new IncreaseTracker(\n        options.gravity.value,\n        options.gravity.increase,\n        options.gravity.marginTime\n      ),\n      garbageMultiplier: new IncreaseTracker(\n        options.garbage.multiplier.value,\n        options.garbage.multiplier.increase,\n        options.garbage.multiplier.marginTime\n      ),\n      garbageCap: new IncreaseTracker(\n        options.garbage.cap.value,\n        options.garbage.cap.increase,\n        options.garbage.cap.marginTime\n      )\n    };\n\n    this.glock = 0;\n\n    this.misc = options.misc;\n\n    this.gameOptions = options.options;\n    this.handling = options.handling;\n    this.input = {\n      lShift: { held: false, arr: 0, das: 0, dir: -1 },\n      rShift: { held: false, arr: 0, das: 0, dir: 1 },\n      lastShift: -1,\n      firstInputTime: -1,\n      time: { start: 0, zero: true, locked: false, prev: 0, frameoffset: 0 },\n      lastPieceTime: 0,\n      keys: {\n        softDrop: false,\n        hold: false,\n        rotateCW: false,\n        rotateCCW: false,\n        rotate180: false\n      }\n    };\n    this.frame = 0;\n    this.subframe = 0;\n\n    this.state = 0;\n\n    this.currentSpike = 0;\n\n    this.flushRes();\n\n    this.nextPiece();\n\n    this.bindAll();\n  }\n\n  private flushRes() {\n    const res = this.resCache ? deepCopy(this.resCache) : null;\n    this.resCache = {\n      pieces: 0,\n      garbage: {\n        sent: [],\n        received: []\n      },\n      keys: [],\n      lastLock: res?.lastLock ?? 0\n    };\n\n    return res!;\n  }\n\n  reset() {\n    this.init();\n  }\n\n  bindAll() {\n    this.moveRight = this.moveRight.bind(this);\n    this.moveLeft = this.moveLeft.bind(this);\n    this.dasRight = this.dasRight.bind(this);\n    this.dasLeft = this.dasLeft.bind(this);\n    this.softDrop = this.softDrop.bind(this);\n    this.hardDrop = this.hardDrop.bind(this);\n    this.hold = this.hold.bind(this);\n    this.rotateCW = this.rotateCW.bind(this);\n    this.rotateCCW = this.rotateCCW.bind(this);\n    this.rotate180 = this.rotate180.bind(this);\n    this.snapshot = this.snapshot.bind(this);\n    this.fromSnapshot = this.fromSnapshot.bind(this);\n    this.nextPiece = this.nextPiece.bind(this);\n  }\n\n  #onQueueRepopulate(pieces: Mino[]) {\n    this.events.emit(\"queue.add\", pieces);\n  }\n\n  snapshot(): EngineSnapshot {\n    return {\n      board: deepCopy(this.board.state),\n      connectedBoard: deepCopy(this.connectedBoard.state),\n      falling: this.falling.snapshot(),\n      frame: this.frame,\n      garbage: this.garbageQueue.snapshot(),\n      hold: this.held,\n      holdLocked: this.holdLocked,\n      lastSpin: deepCopy(this.lastSpin),\n      lastWasClear: this.lastWasClear,\n      queue: this.queue.index,\n      input: deepCopy(this.input),\n      subframe: this.subframe,\n      targets: this.multiplayer?.targets,\n      stats: deepCopy(this.stats),\n      glock: this.glock,\n      ige: this.igeHandler.snapshot(),\n      state: this.state,\n      currentSpike: this.currentSpike,\n      resCache: deepCopy(this.resCache)\n    };\n  }\n\n  fromSnapshot(snapshot: EngineSnapshot) {\n    this.board.state = deepCopy(snapshot.board);\n    this.connectedBoard.state = deepCopy(snapshot.connectedBoard);\n    this.falling = new Tetromino({\n      boardHeight: this.board.height,\n      boardWidth: this.board.width,\n      initialRotation:\n        this.kickTable.spawn_rotation[\n          snapshot.falling.symbol.toLowerCase() as keyof typeof this.kickTable.spawn_rotation\n        ] ?? 0,\n      symbol: snapshot.falling.symbol,\n      from: snapshot.falling\n    });\n    for (const key of Object.keys(snapshot.falling)) {\n      // @ts-expect-error\n      this.falling[key] = deepCopy(snapshot.falling[key]);\n    }\n    this.frame = snapshot.frame;\n    this.subframe = snapshot.subframe;\n    this.garbageQueue.fromSnapshot(snapshot.garbage);\n    this.held = snapshot.hold;\n    this.holdLocked = snapshot.holdLocked;\n    this.lastSpin = deepCopy(snapshot.lastSpin);\n    this.lastWasClear = snapshot.lastWasClear;\n    this.queue = new Queue(this.initializer.queue);\n    for (let i = 0; i < snapshot.queue; i++) this.queue.shift();\n\n    this.queue.onRepopulate(this.#onQueueRepopulate.bind(this));\n\n    this.dynamic = {\n      gravity: new IncreaseTracker(\n        this.initializer.gravity.value,\n        this.initializer.gravity.increase,\n        this.initializer.gravity.marginTime\n      ),\n      garbageMultiplier: new IncreaseTracker(\n        this.initializer.garbage.multiplier.value,\n        this.initializer.garbage.multiplier.increase,\n        this.initializer.garbage.multiplier.marginTime\n      ),\n      garbageCap: new IncreaseTracker(\n        this.initializer.garbage.cap.value,\n        this.initializer.garbage.cap.increase,\n        this.initializer.garbage.cap.marginTime\n      )\n    };\n\n    for (let i = 0; i < this.frame; i++)\n      for (const key of Object.keys(this.dynamic))\n        this.dynamic[key as keyof typeof this.dynamic].tick();\n\n    this.input = deepCopy(snapshot.input);\n\n    if (this.multiplayer && snapshot.targets)\n      this.multiplayer.targets = [...snapshot.targets];\n\n    this.stats = deepCopy(snapshot.stats);\n    this.glock = snapshot.glock;\n    this.state = snapshot.state;\n    this.currentSpike = snapshot.currentSpike;\n    this.igeHandler.fromSnapshot(snapshot.ige);\n\n    this.resCache = deepCopy(snapshot.resCache);\n  }\n\n  get kickTable(): (typeof kicks)[KickTableName] {\n    return kicks[this._kickTable];\n  }\n\n  get kickTableName(): KickTableName {\n    return this._kickTable;\n  }\n\n  set kickTable(value: KickTableName) {\n    this._kickTable = value;\n  }\n\n  get dynamicStats() {\n    return {\n      apm: this.stats.garbage.attack / (this.frame / 60 / 60) || 0,\n      pps: this.stats.pieces / (this.frame / 60) || 0,\n      vs:\n        ((this.stats.garbage.attack + this.stats.garbage.cleared) /\n          (this.frame / 60)) *\n          100 || 0,\n      surgePower: this.b2b.charging\n        ? Math.floor(\n            this.stats.b2b - this.b2b.charging.at + this.b2b.charging.base + 1\n          )\n        : 0\n    };\n  }\n\n  #getEffectiveGravity() {\n    return this.glock <= 0\n      ? this.dynamic.gravity.get()\n      : this.glock <= 180\n        ? (1 - this.glock / 180) ** 2 * this.dynamic.gravity.get()\n        : 0;\n  }\n\n  #hasHitWall() {\n    return !!(this.state & constants.flags.STATE_WALL);\n  }\n\n  // @ts-expect-error unused\n  #hasRotated() {\n    return !!(\n      this.state &\n      (constants.flags.ROTATION_LEFT | constants.flags.ROTATION_RIGHT)\n    );\n  }\n\n  // @ts-expect-error unused\n  #hasRotated180() {\n    return !!(this.state & constants.flags.ROTATION_180);\n  }\n\n  // @ts-expect-error unused\n  #isSpin() {\n    return !!(this.state & constants.flags.ROTATION_SPIN);\n  }\n\n  // @ts-expect-error unused\n  #isSpinMini() {\n    return !(\n      ~this.state &\n      (constants.flags.ROTATION_SPIN | constants.flags.ROTATION_MINI)\n    );\n  }\n\n  // @ts-expect-error unused\n  #isSpinAll() {\n    return !!(this.state & constants.flags.ROTATION_SPIN_ALL);\n  }\n\n  #isSleep() {\n    return !!(this.state & constants.flags.STATE_SLEEP);\n  }\n\n  // @ts-expect-error unused\n  #isFloored() {\n    return !!(this.state & constants.flags.STATE_FLOOR);\n  }\n\n  // @ts-expect-error unused\n  #isVisible() {\n    return !(this.state & constants.flags.STATE_NODRAW);\n  }\n\n  // @ts-expect-error unused\n  #isSoftDropped() {\n    return !!(this.state & constants.flags.ACTION_SOFTDROP);\n  }\n\n  #isForcedToLock() {\n    return !!(this.state & constants.flags.ACTION_FORCELOCK);\n  }\n\n  #is20G() {\n    const is20G = this.dynamic.gravity.get() > this.board.height;\n    const mode20G = this.misc.movement.may20G;\n\n    if (this.input.keys.softDrop) {\n      const preferSoftDrop = this.handling.may20g || (is20G && mode20G);\n      return (\n        (this.handling.sdf === 41 ||\n          this.dynamic.gravity.get() * this.handling.sdf > this.board.height) &&\n        preferSoftDrop\n      );\n    }\n\n    return is20G && mode20G;\n  }\n\n  #shouldLock() {\n    return (\n      !this.misc.movement.infinite &&\n      this.falling.lockResets >= this.misc.movement.lockResets\n    );\n  }\n\n  #shouldFallFaster() {\n    return this.misc.movement.infinite\n      ? false\n      : this.falling.rotResets > this.misc.movement.lockResets + 15;\n  }\n\n  #clearFlags(e: number) {\n    this.state &= ~e;\n  }\n\n  #__internal_lock(subframe = 1 - this.subframe) {\n    this.falling.locking += subframe;\n    return (\n      this.falling.locking > this.misc.movement.lockTime ||\n      !!this.#isForcedToLock() ||\n      this.#shouldLock()\n    );\n  }\n\n  #__internal_fall(value: number) {\n    let y1 = Math.round(1e6 * (this.falling.location[1] - value)) / 1e6,\n      y2 = this.falling.location[1] - 1;\n\n    if (y1 % 1 === 0) y1 -= 1e-6;\n    if (y2 % 1 === 0) y2 += 2e-6;\n\n    if (\n      !legal(this.falling.absoluteAt({ y: y1 }), this.board.state) ||\n      !legal(this.falling.absoluteAt({ y: y2 }), this.board.state)\n    )\n      return false;\n\n    const { highestY } = this.falling;\n    if (highestY > y1) this.falling.highestY = Math.floor(y1);\n    this.falling.location[1] = y1;\n    if (this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    this.state &= ~constants.flags.STATE_FLOOR;\n\n    if (y1 < highestY || this.misc.movement.infinite) {\n      this.falling.lockResets = 0;\n      this.falling.rotResets = 0;\n    }\n\n    return true;\n  }\n\n  // @ts-expect-error unused\n  #__internal_lockout() {\n    // TODO: implement\n    // if (this.options.nolockout) return;\n    // if (!e || false === this.options.clutch)\n    //   return this.self.stm.LoseStockOrGameOver(\n    //     this.options.topoutisclear ? \"topout_clear\" : \"topout\",\n    //   );\n  }\n\n  #__internal_dcd() {\n    if (!this.#hasHitWall() || !this.handling.dcd) return;\n\n    this.input.lShift.das = Math.min(\n      this.input.lShift.das,\n      this.handling.das - this.handling.dcd\n    );\n    this.input.lShift.arr = this.handling.arr;\n\n    this.input.rShift.das = Math.min(\n      this.input.rShift.das,\n      this.handling.das - this.handling.dcd\n    );\n    this.input.rShift.arr = this.handling.arr;\n  }\n\n  #fall(subframe = 1 - this.subframe) {\n    if (this.falling.safeLock > 0) this.falling.safeLock--;\n    // TODO: if pause, return: if ((this.piece.safelock > 0 && this.piece.safelock--, this.S.pause)) return;\n\n    if (this.#isSleep()) return;\n\n    let fall = this.#getEffectiveGravity() * subframe;\n\n    if (this.glock > 0) this.glock -= subframe;\n    if (this.glock < 0) this.glock = 0;\n\n    if (this.input.keys.softDrop) {\n      if (this.handling.sdf === 41) fall = 400 * subframe;\n      else {\n        fall *= this.handling.sdf;\n\n        fall = Math.max(fall, 0.05 * this.handling.sdf);\n      }\n    }\n\n    if (\n      this.#shouldLock() &&\n      !legal(\n        this.falling.absoluteAt({ y: this.falling.location[1] - 1 }),\n        this.board.state\n      )\n    ) {\n      fall = 20;\n      this.state |= constants.flags.ACTION_FORCELOCK;\n    }\n\n    if (this.#shouldFallFaster()) {\n      fall +=\n        0.5 *\n        subframe *\n        (this.falling.rotResets - (this.misc.movement.lockResets + 15));\n    }\n\n    for (\n      let dropFactor = fall;\n      dropFactor > 0;\n      dropFactor -= Math.min(1, dropFactor)\n    ) {\n      const y = this.falling.location[1];\n\n      if (!this.#__internal_fall(Math.min(1, dropFactor))) {\n        if (this.#__internal_lock(subframe)) {\n          if (this.handling.safelock) this.falling.safeLock = 7;\n          this.#lock(false);\n        }\n        return;\n      }\n\n      if (Math.floor(y) !== Math.floor(this.falling.location[1])) {\n        this.state &= ~constants.flags.ROTATION_ALL;\n      }\n    }\n  }\n\n  #clampRotation(amount: number): Rotation {\n    return ((((this.falling.rotation + amount) % 4) + 4) % 4) as Rotation;\n  }\n\n  #__internal_rotate(\n    newX: number,\n    newY: number,\n    newRotation: number,\n    rotationDirection: number,\n    kick: ReturnType<typeof performKick>,\n    _isIRS = false\n  ) {\n    // Handle rotation flags based on direction\n    if (rotationDirection >= 2) {\n      // 180 degree rotation\n      rotationDirection = newRotation > this.falling.rotation ? 1 : -1;\n      this.state |= constants.flags.ROTATION_180;\n    }\n\n    // Update this.falling properties\n    this.falling.x = newX;\n    this.falling.y = newY;\n    this.falling.rotation = newRotation;\n\n    // Set rotation direction flags\n    this.state |=\n      rotationDirection === 1\n        ? constants.flags.ROTATION_RIGHT\n        : constants.flags.ROTATION_LEFT;\n    this.state &= ~(\n      constants.flags.ROTATION_SPIN |\n      constants.flags.ROTATION_MINI |\n      constants.flags.ROTATION_SPIN_ALL\n    );\n\n    // Update lock and rotation resets with caps\n    if (this.falling.lockResets < 31) this.falling.lockResets++;\n    if (this.falling.rotResets < 63) this.falling.rotResets++;\n\n    // Check for T-Spin\n    const spin = this.#detectSpin(this.#isTSpinKick(kick));\n\n    this.lastSpin = {\n      piece: this.falling.symbol,\n      type: spin\n    };\n\n    if (spin) {\n      this.state |= constants.flags.ROTATION_SPIN;\n      if (spin === \"mini\") {\n        this.state |= constants.flags.ROTATION_MINI;\n      }\n    }\n\n    this.falling.totalRotations++;\n\n    // Handle post-rotation actions\n    this.#__internal_dcd();\n\n    // Reset locking if not going to lock\n    if (!this.#shouldLock()) {\n      this.falling.locking = 0;\n    }\n\n    return true as const;\n  }\n\n  #kick(to: Rotation): false | Exclude<ReturnType<typeof performKick>, true> {\n    const kick = performKick(\n      this.kickTableName,\n      this.falling.symbol,\n      this.falling.location,\n      [this.falling.aox, this.falling.aoy],\n      !this.misc.movement.infinite &&\n        this.falling.totalRotations > this.misc.movement.lockResets + 15,\n      this.falling.states[to],\n      this.falling.rotation,\n      to,\n      this.board.state\n    );\n\n    if (typeof kick === \"object\") return kick;\n    else\n      return kick === false\n        ? false\n        : {\n            kick: [0, 0],\n            newLocation: [this.falling.location[0], this.falling.location[1]],\n            id: \"00\",\n            index: 0\n          };\n  }\n\n  #rotate(amount: number, isIRS = false) {\n    if (this.#isSleep()) {\n      if (this.handling.irs === \"tap\")\n        this.falling.irs = (((this.falling.irs + amount) % 4) + 4) % 4;\n      return false;\n    }\n\n    const to = this.#clampRotation(amount);\n\n    this.state |= constants.flags.ACTION_MOVE;\n    this.state |= constants.flags.ACTION_ROTATE;\n    const kick = this.#kick(to);\n\n    return kick\n      ? this.#__internal_rotate(\n          kick.newLocation[0],\n          kick.newLocation[1],\n          to,\n          amount,\n          kick,\n          isIRS\n        )\n      : false;\n  }\n\n  nextPiece(ignoreBlockout = false, isHold = false) {\n    const newTetromino = this.queue.shift()!;\n\n    this.initiatePiece(newTetromino, ignoreBlockout, isHold);\n  }\n\n  initiatePiece(piece: Mino, ignoreBlockout = false, isHold = false) {\n    if (this.handling.irs === \"hold\" && this.falling) {\n      let rotationState = 0;\n\n      // Calculate rotation based on input\n      if (this.input.keys.rotateCCW) rotationState -= 1;\n      if (this.input.keys.rotateCW) rotationState += 1;\n      if (this.input.keys.rotate180) rotationState += 2;\n\n      // Ensure rotation state is in 0-3 range\n      this.falling.irs = ((rotationState % 4) + 4) % 4;\n    }\n\n    if (this.handling.ihs === \"hold\" && this.input.keys.hold && !isHold) {\n      this.state |= constants.flags.ACTION_IHS;\n    }\n\n    this.#__internal_dcd();\n\n    this.state &= ~(\n      constants.flags.ROTATION_ALL |\n      constants.flags.STATE_ALL |\n      constants.flags.ACTION_FORCELOCK |\n      constants.flags.ACTION_SOFTDROP |\n      constants.flags.ACTION_MOVE |\n      constants.flags.ACTION_ROTATE\n    );\n\n    this.input.firstInputTime = -1;\n\n    if (!isHold) this.holdLocked = false;\n\n    this.falling = new Tetromino({\n      boardHeight: this.board.height,\n      boardWidth: this.board.width,\n      initialRotation:\n        this.kickTable.spawn_rotation[\n          piece.toLowerCase() as keyof typeof this.kickTable.spawn_rotation\n        ] ?? 0,\n      symbol: piece,\n      from: this.falling\n    });\n\n    if (!ignoreBlockout && this.#considerBlockout(isHold)) {\n      // Lose Stock or Game Over\n      this.state ^= constants.flags.ACTION_IHS;\n      this.falling.irs = 0;\n    } else {\n      if (this.state & constants.flags.ACTION_IHS) {\n        this.state ^= constants.flags.ACTION_IHS;\n        this.hold(true, ignoreBlockout);\n      } else {\n        if (this.falling.irs !== 0) {\n          this.#rotate(this.falling.irs, true);\n          this.falling.irs = 0;\n        }\n\n        if (this.#considerBlockout(!ignoreBlockout || isHold)) {\n          // lose stock or game over\n        } else {\n          if (this.#is20G()) {\n            this.#slamToFloor();\n          }\n        }\n      }\n    }\n  }\n\n  #considerBlockout(isSilent: boolean = false) {\n    if (legal(this.falling.absoluteBlocks, this.board.state)) {\n      // TODO: clutch count\n      // if (!isSilent) {\n      //   this.S.clutchCount = 0;\n      // }\n      return false;\n    }\n\n    let clutched = false;\n\n    if (this.lastWasClear && this.gameOptions.clutch !== false) {\n      const originalY = this.falling.location[1];\n      const originalHy = this.falling.highestY;\n\n      while (this.falling.y < this.board.fullHeight) {\n        this.falling.location[1]++;\n        this.falling.highestY++;\n\n        if (legal(this.falling.absoluteBlocks, this.board.state)) {\n          clutched = true;\n          break;\n        }\n      }\n\n      if (!clutched) {\n        this.falling.location[1] = originalY;\n        this.falling.highestY = originalHy;\n      }\n    }\n\n    if (!clutched) return true;\n\n    if (!isSilent) {\n      // TODO: update clutch count +1\n    }\n\n    return false;\n  }\n\n  hold(_ihs = false, ignoreBlockout = false) {\n    if (this.#isSleep()) {\n      if (this.handling.ihs === \"tap\") this.state |= constants.flags.ACTION_IHS;\n      return false;\n    }\n    if (this.holdLocked || !this.misc.allowed.hold) return false;\n    this.holdLocked = !this.misc.infiniteHold;\n    if (this.held) {\n      const save = this.held;\n      this.held = this.falling.symbol;\n      this.initiatePiece(save, ignoreBlockout, true);\n    } else {\n      this.held = this.falling.symbol;\n      this.nextPiece(ignoreBlockout, true);\n    }\n\n    this.holdLocked = !this.misc.infiniteHold;\n\n    return true;\n  }\n\n  #slamToFloor() {\n    while (this.#__internal_fall(1)) {}\n  }\n\n  get toppedOut() {\n    try {\n      for (const block of this.falling.blocks) {\n        if (\n          this.board.state[-block[1] + this.falling.y][\n            block[0] + this.falling.location[0]\n          ] !== null\n        )\n          return true;\n      }\n\n      return false;\n    } catch {\n      return true;\n    }\n  }\n\n  #isTSpinKick(kick: ReturnType<typeof Tetromino.prototype.rotate>) {\n    if (typeof kick === \"object\") {\n      return (\n        // fin cw and tst ccw\n        ((kick.id === \"23\" || kick.id === \"03\") &&\n          kick.kick[0] === 1 &&\n          kick.kick[1] === -2) ||\n        // fin ccw and tst cw\n        ((kick.id === \"21\" || kick.id === \"01\") &&\n          kick.kick[0] === -1 &&\n          kick.kick[1] === -2)\n      );\n    }\n\n    return false;\n  }\n\n  rotateCW() {\n    return this.#processRotate(1);\n  }\n\n  rotateCCW() {\n    return this.#processRotate(-1);\n  }\n\n  rotate180() {\n    return this.#processRotate(2);\n  }\n\n  moveRight() {\n    const res = this.falling.moveRight(this.board.state);\n    if (res && this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    return res;\n  }\n\n  moveLeft() {\n    const res = this.falling.moveLeft(this.board.state);\n    if (res && this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    return res;\n  }\n\n  dasRight() {\n    const res = this.falling.dasRight(this.board.state);\n    if (res && this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    return res;\n  }\n\n  dasLeft() {\n    const res = this.falling.dasLeft(this.board.state);\n    if (res && this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    return res;\n  }\n\n  softDrop() {\n    const res = this.falling.softDrop(this.board.state);\n    if (res && this.gameOptions.spinBonuses !== \"stupid\") this.lastSpin = null;\n    return res;\n  }\n\n  #maxSpin(...spins: SpinType[]) {\n    const score = (spin: SpinType) => [\"none\", \"mini\", \"normal\"].indexOf(spin);\n    return spins.reduce((a, b) => {\n      return score(a) > score(b) ? a : b;\n    });\n  }\n\n  #detectSpin(finOrTst: boolean): SpinType {\n    if (this.gameOptions.spinBonuses === \"none\") return \"none\";\n    const tSpin =\n      (\n        [\n          \"all\",\n          \"all-mini\",\n          \"all-mini+\",\n          \"all+\",\n          \"T-spins\",\n          \"T-spins+\"\n        ] as Game.SpinBonuses[]\n      ).includes(this.gameOptions.spinBonuses) && this.falling.symbol === \"t\"\n        ? this.#detectSpinFromCorners(finOrTst)\n        : false;\n    const allSpin = this.falling.isAllSpinPosition(this.board.state);\n\n    switch (this.gameOptions.spinBonuses) {\n      case \"stupid\":\n        return this.falling.isStupidSpinPosition(this.board.state)\n          ? \"normal\"\n          : \"none\";\n      case \"T-spins\":\n        return tSpin || \"none\";\n      case \"T-spins+\":\n        return this.#maxSpin(\n          tSpin || \"none\",\n          allSpin ? (this.falling.symbol === \"t\" ? \"mini\" : \"none\") : \"none\"\n        );\n      case \"all\":\n        return tSpin || (allSpin ? \"normal\" : \"none\");\n      case \"all-mini\":\n        return tSpin || (allSpin ? \"mini\" : \"none\");\n      case \"all+\":\n        return this.#maxSpin(\n          tSpin || \"none\",\n          allSpin ? (this.falling.symbol === \"t\" ? \"mini\" : \"normal\") : \"none\"\n        );\n      case \"all-mini+\":\n        return this.#maxSpin(tSpin || \"none\", allSpin ? \"mini\" : \"none\");\n      case \"mini-only\":\n        return tSpin === \"normal\"\n          ? \"mini\"\n          : this.#maxSpin(tSpin || \"none\", allSpin ? \"mini\" : \"none\");\n      case \"handheld\":\n        return this.#detectSpinFromCorners(finOrTst);\n    }\n  }\n\n  #spinbonuses(piece: Mino) {\n    const p = tetrominoes[piece];\n    const rules =\n      spinbonusRules[\n        this.gameOptions.spinBonuses as keyof typeof spinbonusRules\n      ];\n    // @ts-expect-error\n    return p?.spinbonus_override\n      ? // @ts-expect-error\n        p.spinbonus_override?.mini\n      : // @ts-expect-error\n        !!rules?.types_mini?.includes(piece);\n  }\n\n  #detectSpinFromCorners(finOrTst: boolean): SpinType {\n    if (\n      legal(\n        this.falling.blocks.map((block) => [\n          block[0] + this.falling.location[0],\n          -block[1] + this.falling.y - 1\n        ]),\n        this.board.state\n      )\n    )\n      return \"none\";\n\n    let corners = 0;\n    let frontCorners = 0;\n\n    for (let i = 0; i < 4; i++) {\n      const table =\n        cornerTable[this.falling.symbol as keyof typeof cornerTable]?.[\n          this.falling.rotation\n        ];\n      if (!table) break;\n\n      if (\n        this.board.occupied(\n          this.falling.x + table[i][0] + 1,\n          this.falling.y - table[i][1] - 1\n        )\n      ) {\n        corners++;\n        if (\n          this.falling.rotation === table[i][2] ||\n          this.falling.rotation === table[i][3]\n        ) {\n          frontCorners++;\n        }\n      }\n    }\n\n    if (corners < 3) return \"none\";\n\n    let spin: SpinType = \"normal\";\n    if (this.#spinbonuses(this.falling.symbol) && frontCorners !== 2)\n      spin = \"mini\";\n    if (finOrTst) spin = \"normal\";\n\n    return spin;\n  }\n\n  /** */\n  hardDrop() {\n    while (this.#__internal_fall(1));\n\n    return this.#lock(true);\n  }\n\n  #lock(hard: boolean): LockRes {\n    this.holdLocked = false;\n\n    // TODO: ARE (line clear, garbage)\n\n    const placed = this.falling.blocks.map(\n      (block) =>\n        [\n          this.falling.symbol,\n          this.falling.location[0] + block[0],\n          this.falling.y - block[1]\n        ] as [Mino, number, number]\n    );\n\n    this.board.add(...placed);\n    this.connectedBoard.add(\n      ...this.connect(placed.map(([_, x, y]) => [x, -y])).map(\n        ([x, y, s]) =>\n          [{ mino: this.falling.symbol, connection: s }, x, -y] as [\n            { mino: Mino; connection: number },\n            number,\n            number\n          ]\n      )\n    );\n\n    this.connectedBoard.clearBombsAndLines(placed.map((b) => [b[1], b[2]]));\n    const { lines, garbageCleared } = this.board.clearBombsAndLines(\n      placed.map((b) => [b[1], b[2]])\n    );\n    const pc = this.board.perfectClear;\n\n    this.stats.garbage.cleared += garbageCleared;\n\n    let brokeB2B: false | number = this.stats.b2b;\n    if (lines > 0) {\n      this.stats.combo++;\n      if (\n        ((this.lastSpin && this.lastSpin.type !== \"none\") || lines >= 4) &&\n        !(pc && this.pc && this.pc.b2b)\n      ) {\n        this.stats.b2b++;\n        brokeB2B = false;\n      }\n      if (pc && this.pc && this.pc.b2b) {\n        this.stats.b2b += this.pc.b2b;\n        brokeB2B = false;\n      }\n\n      if (brokeB2B !== false) {\n        this.stats.b2b = -1;\n      }\n    } else {\n      this.stats.combo = -1;\n      brokeB2B = false;\n    }\n\n    const gSpecialBonus =\n      this.initializer.garbage.specialBonus &&\n      garbageCleared > 0 &&\n      ((this.lastSpin && this.lastSpin.type !== \"none\") || lines >= 4)\n        ? 1\n        : 0;\n\n    const garbage = garbageCalcV2(\n      {\n        b2b: Math.max(this.stats.b2b, 0),\n        combo: Math.max(this.stats.combo, 0),\n        enemies: 0,\n        lines,\n        piece: this.falling.symbol,\n        spin: this.lastSpin ? this.lastSpin.type : \"none\"\n      },\n      {\n        ...this.gameOptions,\n        b2b: { chaining: this.b2b.chaining, charging: !!this.b2b.charging }\n      }\n    );\n\n    const gEvents =\n      garbage.garbage > 0 || gSpecialBonus > 0\n        ? [\n            this.garbageQueue.round(\n              garbage.garbage * this.dynamic.garbageMultiplier.get() +\n                gSpecialBonus\n            )\n          ]\n        : [];\n\n    let surged = 0;\n\n    if (brokeB2B !== false) {\n      let btb = brokeB2B;\n      if (this.b2b.charging !== false && btb + 1 > this.b2b.charging.at) {\n        surged = Math.floor(\n          (btb - this.b2b.charging.at + this.b2b.charging.base + 1) *\n            this.dynamic.garbageMultiplier.get()\n        );\n\n        const garbages = [\n          Math.round(surged / 3),\n          Math.round(surged / 3),\n          surged - 2 * Math.round(surged / 3)\n        ];\n        gEvents.splice(0, 0, ...garbages);\n        brokeB2B = false;\n      }\n    }\n    if (pc && this.pc) {\n      gEvents.push(\n        this.garbageQueue.round(\n          this.pc.garbage * this.dynamic.garbageMultiplier.get()\n        )\n      );\n    }\n\n    const res: LockRes = {\n      mino: this.falling.symbol,\n      garbageCleared,\n      lines,\n      spin: this.lastSpin ? this.lastSpin.type : \"none\",\n      garbage: gEvents.filter((g) => g > 0),\n      rawGarbage: gEvents.filter((g) => g > 0),\n      surge: surged,\n      stats: this.stats,\n      garbageAdded: false,\n      topout: false,\n      keysPresses: this.resCache.keys.splice(0),\n      pieceTime:\n        Math.round((this.frame + this.subframe - this.resCache.lastLock) * 10) /\n        10\n    };\n\n    for (const gb of res.garbage) this.stats.garbage.attack += gb;\n\n    if (lines > 0) {\n      const cancelEvents: Events[\"garbage.cancel\"][] = [];\n      this.lastWasClear = true;\n      while (res.garbage.length > 0) {\n        if (res.garbage[0] === 0) {\n          res.garbage.shift();\n          continue;\n        }\n        const [r, cancelled] = this.garbageQueue.cancel(\n          res.garbage[0],\n          this.stats.pieces,\n          {\n            openerPhase: (this.misc.date ?? new Date()) < new Date(2025, 1, 16)\n          }\n        );\n        cancelEvents.push(\n          ...cancelled.map((c) => ({\n            iid: c.cid,\n            amount: c.amount,\n            size: c.size\n          }))\n        );\n\n        if (r === 0) res.garbage.shift();\n        else {\n          res.garbage[0] = r;\n          break;\n        }\n      }\n\n      cancelEvents.forEach((event) => {\n        this.events.emit(\"garbage.cancel\", event);\n      });\n    } else {\n      this.lastWasClear = false;\n      const garbages = this.garbageQueue.tank(\n        this.frame,\n        this.dynamic.garbageCap.get(),\n        hard\n      );\n      res.garbageAdded = garbages;\n\n      if (res.garbageAdded) {\n        const tankEvent: Events[\"garbage.tank\"][] = [];\n        garbages.forEach((garbage, idx) => {\n          this.board.insertGarbage({\n            ...garbage,\n            bombs: this.garbageQueue.options.bombs\n          });\n          this.connectedBoard.insertGarbage({\n            ...garbage,\n            bombs: this.garbageQueue.options.bombs,\n            isBeginning: idx === 0 || garbages[idx - 1].id !== garbage.id,\n            isEnd:\n              idx === garbages.length - 1 || garbages[idx + 1].id !== garbage.id\n          });\n\n          if (\n            tankEvent.length === 0 ||\n            tankEvent[tankEvent.length - 1].iid !== garbage.id\n          ) {\n            tankEvent.push({\n              iid: garbage.id,\n              column: garbage.column,\n              amount: garbage.amount,\n              size: garbage.size\n            });\n          } else {\n            tankEvent[tankEvent.length - 1].amount += garbage.amount;\n          }\n        });\n\n        tankEvent.forEach((event) => {\n          this.events.emit(\"garbage.tank\", event);\n        });\n      }\n    }\n\n    this.nextPiece();\n\n    this.lastSpin = null;\n\n    try {\n      if (!legal(this.falling.absoluteBlocks, this.board.state))\n        res.topout = true;\n    } catch {\n      res.topout = true;\n    }\n\n    if (res.garbage.length > 0)\n      if (this.multiplayer)\n        this.multiplayer.targets.forEach((target) =>\n          res.garbage.forEach((g) =>\n            this.igeHandler.send({ amount: g, playerID: target })\n          )\n        );\n\n    const sent = res.garbage.reduce((a, b) => a + b, 0);\n    this.stats.garbage.sent += sent;\n\n    if (this.stats.combo >= 0) this.currentSpike += sent;\n    else this.currentSpike = 0;\n\n    this.resCache.pieces++;\n    this.resCache.garbage.sent.push(...res.garbage);\n    this.resCache.garbage.received.push(...(res.garbageAdded || []));\n    this.resCache.lastLock = this.frame + this.subframe;\n\n    this.stats.pieces++;\n    this.stats.lines += lines;\n\n    this.events.emit(\"falling.lock\", deepCopy(res));\n\n    return res;\n  }\n\n  press<T extends Game.Key | \"dasLeft\" | \"dasRight\">(key: T) {\n    if (key in this) return this[key]();\n    else throw new Error(\"invalid key: \" + key);\n  }\n\n  #keydown({ data: event }: Game.Replay.Frames.Keypress) {\n    this.#processSubframe(event.subframe);\n    this.resCache.keys.push(event.key);\n    // TODO: inversion?\n    // if (this.misc.inverted)\n    //   switch (e.key) {\n    //     case \"moveLeft\":\n    //       e.key = \"moveRight\";\n    //       break;\n    //     case \"moveRight\":\n    //       e.key = \"moveLeft\";\n    //   }\n\n    switch (event.key) {\n      case \"moveLeft\":\n        this.falling.keys++;\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        this.#activateShift(\"lShift\", !!event.hoisted);\n        this.#__internal_shift();\n        return;\n\n      case \"moveRight\":\n        this.falling.keys++;\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        this.#activateShift(\"rShift\", !!event.hoisted);\n        this.#__internal_shift();\n        return;\n\n      case \"softDrop\":\n        this.input.keys.softDrop = true;\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        return;\n\n      case \"rotateCCW\":\n        this.input.keys.rotateCCW = true;\n        break;\n\n      case \"rotateCW\":\n        this.input.keys.rotateCW = true;\n        break;\n\n      case \"rotate180\":\n        this.input.keys.rotate180 = true;\n        break;\n      case \"hold\":\n        this.input.keys.hold = true;\n        break;\n    }\n\n    // todo: all in if (!this.pause)\n    switch (event.key) {\n      case \"rotateCCW\":\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        this.#processRotate(-1);\n        break;\n\n      case \"rotateCW\":\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        this.#processRotate(1);\n        break;\n\n      case \"rotate180\":\n        if (!this.misc.allowed.spin180) return;\n        if (this.input.firstInputTime == -1)\n          this.input.firstInputTime = this.frame + this.subframe;\n        this.#processRotate(2);\n        break;\n\n      case \"hardDrop\":\n        if (this.misc.allowed.hardDrop === false || this.falling.safeLock !== 0)\n          return;\n        this.hardDrop();\n        return;\n\n      case \"hold\":\n        this.hold();\n        return;\n    }\n  }\n\n  #keyup({ data: event }: Game.Replay.Frames.Keypress) {\n    this.#processSubframe(event.subframe);\n    // TODO: inversion?\n    // if (this.misc.inverted)\n    //   switch (e.key) {\n    //     case \"moveLeft\":\n    //       e.key = \"moveRight\";\n    //       break;\n    //     case \"moveRight\":\n    //       e.key = \"moveLeft\";\n    //   }\n\n    switch (event.key) {\n      case \"moveLeft\":\n        this.input.lShift.held = false;\n        this.input.lShift.das = 0;\n        this.input.lastShift = this.input.rShift.held\n          ? this.input.rShift.dir\n          : this.input.lastShift;\n        if (this.handling.cancel) {\n          this.input.rShift.arr = this.handling.arr;\n          this.input.rShift.das = 0;\n        }\n        break;\n\n      case \"moveRight\":\n        this.input.rShift.held = false;\n        this.input.rShift.das = 0;\n        this.input.lastShift = this.input.lShift.held\n          ? this.input.lShift.dir\n          : this.input.lastShift;\n        if (this.handling.cancel) {\n          this.input.lShift.arr = this.handling.arr;\n          this.input.lShift.das = 0;\n        }\n        break;\n\n      case \"softDrop\":\n        this.state |= constants.flags.ACTION_SOFTDROP;\n        this.input.keys.softDrop = false;\n        break;\n\n      case \"rotateCCW\":\n        this.input.keys.rotateCCW = false;\n        break;\n\n      case \"rotateCW\":\n        this.input.keys.rotateCW = false;\n        break;\n\n      case \"rotate180\":\n        this.input.keys.rotate180 = false;\n        break;\n\n      case \"hold\":\n        this.input.keys.hold = false;\n        break;\n    }\n  }\n\n  #activateShift(shift: \"lShift\" | \"rShift\", hoisted: boolean) {\n    this.input[shift].held = true;\n    this.input[shift].das = hoisted ? this.handling.das - this.handling.dcd : 0;\n    this.input[shift].arr = this.handling.arr;\n    this.input.lastShift = this.input[shift].dir;\n  }\n\n  #processRotate(rotation: number) {\n    this.falling.keys += rotation >= 2 ? 2 : 1;\n    return this.#rotate(rotation as Rotation);\n  }\n\n  #processSubframe(subframe: number) {\n    if (subframe <= this.subframe) return;\n    const delta = subframe - this.subframe;\n    this.#processAllShift(delta);\n    this.#fall(delta);\n    this.subframe = subframe;\n  }\n\n  #__internal_shift() {\n    if (!this.#isSleep()) {\n      // TODO: missing: && !this.pause\n      this.state |= constants.flags.ACTION_MOVE;\n      if (\n        legal(\n          this.falling.absoluteAt({\n            x: this.falling.location[0] + this.input.lastShift\n          }),\n          this.board.state\n        )\n      ) {\n        this.falling.location[0] += this.input.lastShift;\n        if (this.falling.lockResets < 31) this.falling.lockResets++;\n        this.#clearFlags(\n          constants.flags.ROTATION_ALL | constants.flags.STATE_WALL\n        );\n        // fallingdirty = true;\n        if (this.#is20G()) this.#slamToFloor();\n        if (!this.#shouldLock()) this.falling.locking = 0;\n        return true;\n      } else {\n        this.state |= constants.flags.STATE_WALL;\n        return false;\n      }\n    }\n  }\n\n  #processShift(shift: \"lShift\" | \"rShift\", delta: number) {\n    if (\n      !this.input[shift].held ||\n      this.input.lastShift !== this.input[shift].dir\n    )\n      return;\n    const arrDelta = Math.max(\n      0,\n      delta - Math.max(0, this.handling.das - this.input[shift].das)\n    );\n    this.input[shift].das = Math.min(\n      this.input[shift].das + delta,\n      this.handling.das\n    );\n    if (this.input[shift].das < this.handling.das) return;\n    if (this.#isSleep()) return; // TODO: missing: && !this.pause\n    this.input[shift].arr += arrDelta;\n    if (this.input[shift].arr < this.handling.arr) return;\n    const arrMultiplier =\n      this.handling.arr === 0\n        ? this.board.width\n        : Math.floor(this.input[shift].arr / this.handling.arr);\n    this.input[shift].arr -= this.handling.arr * arrMultiplier;\n    for (let i = 0; i < arrMultiplier; i++) this.#__internal_shift();\n  }\n\n  #processAllShift(subFrameDiff = 1 - this.subframe) {\n    for (const shift of [\"lShift\", \"rShift\"] as const)\n      this.#processShift(shift, subFrameDiff);\n  }\n\n  #run(...frames: Game.Replay.Frame[]) {\n    frames.forEach((frame) => {\n      switch (frame.type) {\n        case \"keydown\":\n          this.#keydown(frame);\n          break;\n        case \"keyup\":\n          this.#keyup(frame);\n          break;\n        case \"ige\":\n          if (frame.data.type === \"interaction\") {\n            if (frame.data.data.type === \"garbage\") {\n              const original = frame.data.data.amt;\n              const amount = this.multiplayer?.passthrough?.network\n                ? this.igeHandler.receive({\n                    playerID: frame.data.data.gameid,\n                    ackiid: frame.data.data.ackiid,\n                    amount: frame.data.data.amt,\n                    iid: frame.data.data.iid\n                  })\n                : frame.data.data.amt;\n              this.receiveGarbage({\n                frame:\n                  Number.MAX_SAFE_INTEGER -\n                  this.garbageQueue.options.garbage.speed,\n                amount,\n                size: frame.data.data.size,\n                cid: frame.data.data.iid,\n                gameid: frame.data.data.gameid,\n                confirmed: false\n              });\n              this.stats.garbage.receive += amount;\n              this.events.emit(\"garbage.receive\", {\n                iid: frame.data.data.iid,\n                amount,\n                originalAmount: original\n              });\n            }\n          } else if (frame.data.type === \"interaction_confirm\") {\n            if (frame.data.data.type === \"garbage\") {\n              this.garbageQueue.confirm(\n                frame.data.data.iid,\n                frame.data.data.gameid,\n                frame.frame\n              );\n\n              this.events.emit(\"garbage.confirm\", {\n                iid: frame.data.data.iid,\n                gameid: frame.data.data.gameid,\n                frame: frame.frame\n              });\n            }\n          } else if (frame.data.type === \"target\" && this.multiplayer) {\n            this.multiplayer.targets = frame.data.data.targets;\n          }\n          break;\n      }\n    });\n  }\n\n  tick(frames: Game.Replay.Frame[]) {\n    this.subframe = 0;\n\n    this.#run(...frames);\n\n    this.frame++;\n    this.#processAllShift();\n    this.#fall();\n    // TODO: execute waiting frames\n    // TODO: process garbage are\n    Object.keys(this.dynamic).forEach((key) =>\n      this.dynamic[key as keyof typeof this.dynamic].tick()\n    );\n\n    return { ...this.flushRes() };\n  }\n\n  receiveGarbage(...garbage: IncomingGarbage[]) {\n    this.garbageQueue.receive(...garbage);\n  }\n\n  getPreview(piece: Mino) {\n    return tetrominoes[piece.toLowerCase()].preview;\n  }\n\n  connect(blocks: [x: number, y: number][]) {\n    const exists = (x: number, y: number) =>\n      !!blocks.find(([a, b]) => a === x && y === b);\n\n    return blocks.map(([x, y]) => {\n      let state = 0;\n      if (!exists(x, y - 1)) state |= 0b1000;\n      if (!exists(x + 1, y)) state |= 0b0100;\n      if (!exists(x, y + 1)) state |= 0b0010;\n      if (!exists(x - 1, y)) state |= 0b0001;\n      if (\n        (state === 0b1001 && !exists(x + 1, y + 1)) ||\n        (state === 0b1100 && !exists(x - 1, y + 1)) ||\n        (state === 0b0011 && !exists(x + 1, y - 1)) ||\n        (state === 0b0110 && !exists(x - 1, y - 1)) ||\n        (state === 0b0010 && !exists(x + 1, y - 1) && !exists(x - 1, y - 1)) ||\n        (state === 0b0001 && !exists(x + 1, y - 1) && !exists(x + 1, y + 1)) ||\n        (state === 0b1000 && !exists(x - 1, y + 1) && !exists(x + 1, y + 1)) ||\n        (state === 0b0100 && !exists(x - 1, y - 1) && !exists(x - 1, y + 1))\n      ) {\n        state |= 0b1_0000;\n      }\n\n      return [x, y, state] as const;\n    });\n  }\n\n  getConnectedPreview(piece: Mino) {\n    const data = tetrominoes[piece.toLowerCase()].preview;\n\n    return {\n      ...data,\n      data: this.connect(data.data as any[])\n    };\n  }\n\n  /** @deprecated Engine.onQueuePieces is deprecated and no longer functional. Switch to Engine.events.on(\"queue.add\", (pieces) => {}) instead. */\n  onQueuePieces(_listener: (pieces: Mino[]) => void) {\n    console.log(\n      `${chalk.redBright(\"[Triangle.js]\")} Engine.onQueuePieces is deprecated and no longer functional. Switch to Engine.events.on(\"queue.add\", (pieces) => {}) instead.`\n    );\n  }\n\n  private static colorMap = {\n    i: chalk.bgCyan,\n    j: chalk.bgBlue,\n    l: chalk.bgYellow,\n    o: chalk.bgWhite,\n    s: chalk.bgGreenBright,\n    t: chalk.bgMagentaBright,\n    z: chalk.bgRedBright,\n    gb: chalk.bgBlackBright,\n    bomb: chalk.bgHex(\"#FFA500\")\n  };\n\n  get text() {\n    const boardTop = this.board.state.findIndex((row: (string | null)[]) =>\n      row.every((block) => block === null)\n    );\n    const height = Math.max(this.garbageQueue.size, boardTop, 0);\n\n    const output: string[] = [];\n    for (let i = 0; i < height; i++) {\n      let str = i % 2 === 0 ? \"|\" : \" \";\n      if (i < this.garbageQueue.size) str += \" \" + chalk.bgRed(\" \") + \" \";\n      else str += \"   \";\n      if (i > boardTop) {\n        output.push(\n          str + \"  \".repeat(this.board.width) + \" \" + (i % 2 === 0 ? \"|\" : \" \")\n        );\n        continue;\n      }\n\n      for (let j = 0; j < this.board.width; j++) {\n        const block = this.board.state[i][j];\n        str += block ? Engine.colorMap[block](\"  \") : \"  \";\n      }\n\n      output.push(str + \" \" + (i % 2 === 0 ? \"|\" : \" \"));\n    }\n\n    return output.reverse().join(\"\\n\");\n  }\n\n  /** Return an engine with the same config. Does not preserve state. */\n  clone() {\n    return new Engine(this.initializer);\n  }\n}\n\nexport * from \"./queue\";\nexport * from \"./garbage\";\nexport * from \"./utils\";\nexport * from \"./board\";\nexport * from \"./types\";\nexport * from \"./multiplayer\";\n"],"names":["EventEmitter","Board","ConnectedBoard","constants","GarbageQueue","LegacyGarbageQueue","IGEHandler","Queue","IncreaseTracker","deepCopy","garbageCalcV2","legal","performKick","cornerTable","kicks","spinbonusRules","Tetromino","tetrominoes","chalk","Engine","queue","held","holdLocked","falling","_kickTable","board","connectedBoard","lastSpin","lastWasClear","stats","gameOptions","garbageQueue","frame","subframe","initializer","handling","input","pc","b2b","dynamic","glock","multiplayer","igeHandler","misc","state","currentSpike","events","resCache","options","type","Date","copy","d","init","onRepopulate","bind","kickTable","date","garbage","opponents","targets","passthrough","network","includes","replay","travel","combo","pieces","lines","sent","attack","receive","cleared","chaining","charging","gravity","value","increase","marginTime","garbageMultiplier","multiplier","garbageCap","cap","lShift","arr","das","dir","rShift","lastShift","firstInputTime","time","start","zero","locked","prev","frameoffset","lastPieceTime","keys","softDrop","hold","rotateCW","rotateCCW","rotate180","flushRes","nextPiece","bindAll","res","received","lastLock","reset","moveRight","moveLeft","dasRight","dasLeft","hardDrop","snapshot","fromSnapshot","emit","index","ige","boardHeight","height","boardWidth","width","initialRotation","spawn_rotation","symbol","toLowerCase","from","key","Object","i","shift","tick","kickTableName","dynamicStats","apm","pps","vs","surgePower","Math","floor","at","base","get","flags","STATE_WALL","ROTATION_LEFT","ROTATION_RIGHT","ROTATION_180","ROTATION_SPIN","ROTATION_MINI","ROTATION_SPIN_ALL","STATE_SLEEP","STATE_FLOOR","STATE_NODRAW","ACTION_SOFTDROP","ACTION_FORCELOCK","is20G","mode20G","movement","may20G","preferSoftDrop","may20g","sdf","infinite","lockResets","rotResets","e","locking","lockTime","y1","round","location","y2","absoluteAt","y","highestY","spinBonuses","dcd","min","safeLock","fall","max","dropFactor","safelock","ROTATION_ALL","amount","rotation","newX","newY","newRotation","rotationDirection","kick","_isIRS","x","spin","piece","totalRotations","to","aox","aoy","states","newLocation","id","isIRS","irs","ACTION_MOVE","ACTION_ROTATE","ignoreBlockout","isHold","newTetromino","initiatePiece","rotationState","ihs","ACTION_IHS","STATE_ALL","isSilent","absoluteBlocks","clutched","clutch","originalY","originalHy","fullHeight","_ihs","allowed","infiniteHold","save","toppedOut","block","blocks","spins","score","indexOf","reduce","a","b","finOrTst","tSpin","allSpin","isAllSpinPosition","isStupidSpinPosition","p","rules","spinbonus_override","mini","types_mini","map","corners","frontCorners","table","occupied","hard","placed","add","connect","_","s","mino","connection","clearBombsAndLines","garbageCleared","perfectClear","brokeB2B","gSpecialBonus","specialBonus","enemies","gEvents","surged","btb","garbages","splice","push","filter","g","rawGarbage","surge","garbageAdded","topout","keysPresses","pieceTime","gb","cancelEvents","length","r","cancelled","cancel","openerPhase","c","iid","cid","size","forEach","event","tank","tankEvent","idx","insertGarbage","bombs","isBeginning","isEnd","column","target","send","playerID","press","Error","data","hoisted","spin180","delta","arrDelta","arrMultiplier","subFrameDiff","frames","original","amt","gameid","ackiid","receiveGarbage","Number","MAX_SAFE_INTEGER","speed","confirmed","originalAmount","confirm","getPreview","preview","exists","find","getConnectedPreview","onQueuePieces","_listener","console","log","redBright","colorMap","bgCyan","j","bgBlue","l","bgYellow","o","bgWhite","bgGreenBright","t","bgMagentaBright","z","bgRedBright","bgBlackBright","bomb","bgHex","text","boardTop","findIndex","row","every","output","str","bgRed","repeat","reverse","join","clone"],"mappings":"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"}