{"version":3,"sources":["../../../../src/engine/utils/damageCalc/index.ts"],"sourcesContent":["import { Mino, type SpinType } from \"../..\";\n\nexport const garbageData = {\n  single: 0,\n  double: 1,\n  triple: 2,\n  quad: 4,\n  penta: 5,\n  tspinMini: 0,\n  tspin: 0,\n  tspinMiniSingle: 0,\n  tspinSingle: 2,\n  tspinMiniDouble: 1,\n  tspinMiniTriple: 2,\n  tspinDouble: 4,\n  tspinTriple: 6,\n  tspinQuad: 10,\n  tspinPenta: 12,\n  backtobackBonus: 1,\n  backtobackBonusLog: 0.8,\n  comboMinifier: 1,\n  comboMinifierLog: 1.25,\n  comboBonus: 0.25,\n  allClear: 10,\n  comboTable: {\n    none: [0],\n    \"classic guideline\": [0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5],\n    \"modern guideline\": [0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4]\n  }\n} as const;\n\nexport const garbageCalcV2 = (\n  data: {\n    lines: number;\n    spin?: SpinType;\n    piece: Mino;\n    b2b: number;\n    combo: number;\n    enemies: number;\n  },\n  config: {\n    spinBonuses: string;\n    comboTable: keyof (typeof garbageData)[\"comboTable\"] | \"multiplier\";\n    garbageTargetBonus: \"none\" | \"normal\" | string;\n    b2b: {\n      chaining: boolean;\n      charging: boolean;\n    };\n  }\n) => {\n  let garbage = 0;\n  const { spin: rawSpin, lines, piece, combo, b2b, enemies } = data;\n  const {\n    spinBonuses,\n    comboTable,\n    garbageTargetBonus,\n    b2b: b2bOptions\n  } = config;\n\n  const spin: \"mini\" | \"normal\" | null | undefined =\n    rawSpin === \"none\" ? null : rawSpin;\n\n  switch (lines) {\n    case 0:\n      garbage =\n        spin === \"mini\"\n          ? garbageData.tspinMini\n          : spin === \"normal\"\n            ? garbageData.tspin\n            : 0;\n      break;\n    case 1:\n      garbage =\n        spin === \"mini\"\n          ? garbageData.tspinMiniSingle\n          : spin === \"normal\"\n            ? garbageData.tspinSingle\n            : garbageData.single;\n      break;\n    case 2:\n      garbage =\n        spin === \"mini\"\n          ? garbageData.tspinMiniDouble\n          : spin === \"normal\"\n            ? garbageData.tspinDouble\n            : garbageData.double;\n      break;\n    case 3:\n      garbage =\n        spin === \"mini\"\n          ? garbageData.tspinMiniTriple\n          : spin === \"normal\"\n            ? garbageData.tspinTriple\n            : garbageData.triple;\n      break;\n    case 4:\n      garbage = spin ? garbageData.tspinQuad : garbageData.quad;\n      break;\n    case 5:\n      garbage = spin ? garbageData.tspinPenta : garbageData.penta;\n      break;\n    default: {\n      const t = lines - 5;\n      garbage = spin ? garbageData.tspinPenta + 2 * t : garbageData.penta + t;\n      break;\n    }\n  }\n\n  if (spin && spinBonuses === \"handheld\" && piece.toUpperCase() !== \"T\") {\n    garbage /= 2;\n  }\n\n  if (lines > 0 && b2b > 0) {\n    if (b2bOptions.chaining) {\n      const b2bGains =\n        garbageData.backtobackBonus *\n        (Math.floor(1 + Math.log1p(b2b * garbageData.backtobackBonusLog)) +\n          (b2b == 1\n            ? 0\n            : (1 + (Math.log1p(b2b * garbageData.backtobackBonusLog) % 1)) /\n              3));\n      garbage += b2bGains;\n    } else {\n      garbage += garbageData.backtobackBonus;\n    }\n  }\n\n  if (combo > 0) {\n    if (comboTable === \"multiplier\") {\n      garbage *= 1 + garbageData.comboBonus * combo;\n      if (combo > 1) {\n        garbage = Math.max(\n          Math.log1p(\n            garbageData.comboMinifier * combo * garbageData.comboMinifierLog\n          ),\n          garbage\n        );\n      }\n    } else {\n      const comboTableData = garbageData.comboTable[comboTable] || [0];\n      garbage +=\n        comboTableData[\n          Math.max(0, Math.min(combo - 1, comboTableData.length - 1))\n        ];\n    }\n  }\n\n  let garbageBonus = 0;\n  if (lines > 0 && garbageTargetBonus !== \"none\") {\n    let targetBonus = 0;\n    switch (enemies) {\n      case 0:\n      case 1:\n        break;\n      case 2:\n        targetBonus += 1;\n        break;\n      case 3:\n        targetBonus += 3;\n        break;\n      case 4:\n        targetBonus += 5;\n        break;\n      case 5:\n        targetBonus += 7;\n        break;\n      default:\n        targetBonus += 9;\n    }\n\n    if (garbageTargetBonus === \"normal\") {\n      garbage += targetBonus;\n    } else {\n      garbageBonus = targetBonus;\n    }\n  }\n\n  // TODO: how to bonus\n  return {\n    garbage,\n    bonus: garbageBonus\n  };\n};\n"],"names":["garbageData","single","double","triple","quad","penta","tspinMini","tspin","tspinMiniSingle","tspinSingle","tspinMiniDouble","tspinMiniTriple","tspinDouble","tspinTriple","tspinQuad","tspinPenta","backtobackBonus","backtobackBonusLog","comboMinifier","comboMinifierLog","comboBonus","allClear","comboTable","none","garbageCalcV2","data","config","garbage","spin","rawSpin","lines","piece","combo","b2b","enemies","spinBonuses","garbageTargetBonus","b2bOptions","t","toUpperCase","chaining","b2bGains","Math","floor","log1p","max","comboTableData","min","length","garbageBonus","targetBonus","bonus"],"mappings":"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"}