{"version":3,"file":"index.cjs","sources":["../src/gacha-engine.ts"],"sourcesContent":["import {\n  RarityInput,\n  GachaEngineConfig,\n  WeightedGachaEngineConfig,\n  FlatRateGachaEngineConfig,\n} from './types';\n\nexport class GachaEngine {\n  private static readonly SCALE = 1_000_000;\n  private static readonly MAX_SAFE_SCALE = Math.floor(Number.MAX_SAFE_INTEGER / GachaEngine.SCALE);\n\n  private mode: 'weighted' | 'flatRate';\n  private pools: RarityInput[] = [];\n  private rarityRatesScaled: Record<string, number> = {};\n  private flatRateMap: Map<string, number> = new Map();\n  private dropRateCacheScaled = new Map<string, number>();\n  private flatRateRateUpItems: string[] = [];\n\n  constructor(config: GachaEngineConfig) {\n    this.mode = config.mode;\n\n    if (config.mode === 'weighted') {\n      const weightedConfig = config as WeightedGachaEngineConfig;\n      this.pools = weightedConfig.pools;\n      this.rarityRatesScaled = this.scaleRarityRates(weightedConfig.rarityRates);\n      this.validateConfig(weightedConfig.rarityRates);\n    } else if (config.mode === 'flatRate') {\n      const flatConfig = config as FlatRateGachaEngineConfig;\n      this.pools = flatConfig.pools; // Keep pools for reference\n\n      for (const pool of flatConfig.pools) {\n        for (const item of pool.items) {\n          if (item.weight < 0) {\n            throw new Error(`FlatRate item \"${item.name}\" must have non-negative weight`);\n          }\n          this.flatRateMap.set(item.name, item.weight); // direct probability\n          if (item.rateUp) {\n            this.flatRateRateUpItems.push(item.name);\n          }\n        }\n      }\n      const total = Array.from(this.flatRateMap.values()).reduce((sum, v) => sum + v, 0);\n      if (Math.abs(total - 1.0) > 1e-6) {\n        throw new Error(`FlatRate item rates must sum to 1.0, but got ${total}`);\n      }\n    } else {\n      throw new Error(`Unknown gacha mode: ${this.mode}`);\n    }\n  }\n\n  private scaleRarityRates(rarityRates: Record<string, number>): Record<string, number> {\n    const scaled: Record<string, number> = {};\n    for (const [rarity, rate] of Object.entries(rarityRates)) {\n      if (rate < 0 || rate > 1) {\n        throw new Error(`Rarity rate for \"${rarity}\" must be between 0 and 1, got ${rate}`);\n      }\n      scaled[rarity] = this.toScaled(rate);\n    }\n    return scaled;\n  }\n\n  private toScaled(probability: number): number {\n    if (probability > GachaEngine.MAX_SAFE_SCALE / GachaEngine.SCALE) {\n      throw new Error(`Probability ${probability} too large for safe integer arithmetic`);\n    }\n    return Math.round(probability * GachaEngine.SCALE);\n  }\n\n  private fromScaled(scaledInt: number): number {\n    return scaledInt / GachaEngine.SCALE;\n  }\n\n  private validateConfig(originalRates: Record<string, number>): void {\n    const configuredRarities = new Set(Object.keys(this.rarityRatesScaled));\n    const usedRarities = new Set(this.pools.map(p => p.rarity));\n    const missing = Array.from(usedRarities).filter(r => !configuredRarities.has(r));\n\n    if (missing.length > 0) {\n      throw new Error(`Missing rarity rates for: ${missing.join(', ')}`);\n    }\n\n    const totalRate = Object.values(originalRates).reduce((sum, rate) => sum + rate, 0);\n    if (Math.abs(totalRate - 1.0) > 1e-10) {\n      throw new Error(`Rarity rates must sum to 1.0, got ${totalRate}`);\n    }\n\n    for (const pool of this.pools) {\n      if (pool.items.length === 0) {\n        throw new Error(`Rarity \"${pool.rarity}\" has no items`);\n      }\n\n      const totalWeight = pool.items.reduce((sum, i) => sum + i.weight, 0);\n      if (totalWeight <= 0) {\n        throw new Error(`Rarity \"${pool.rarity}\" has zero total weight`);\n      }\n\n      for (const item of pool.items) {\n        if (item.weight < 0) {\n          throw new Error(`Item \"${item.name}\" weight must be non-negative, got ${item.weight}`);\n        }\n      }\n\n      if (!pool.items.some(i => i.weight > 0)) {\n        throw new Error(`Rarity \"${pool.rarity}\" must have at least one item with positive weight`);\n      }\n    }\n  }\n\n  getItemDropRate(name: string): number {\n    if (this.mode === 'flatRate') {\n      return this.flatRateMap.get(name) || 0;\n    }\n\n    if (this.dropRateCacheScaled.has(name)) {\n      return this.fromScaled(this.dropRateCacheScaled.get(name)!);\n    }\n\n    for (const pool of this.pools) {\n      const item = pool.items.find(i => i.name === name);\n      if (item) {\n        if (item.weight === 0) {\n          this.dropRateCacheScaled.set(name, 0);\n          return 0;\n        }\n\n        const totalPoolWeight = pool.items.reduce((sum, i) => sum + i.weight, 0);\n        const baseRarityRateScaled = this.rarityRatesScaled[pool.rarity];\n        const itemWeightScaled = this.toScaled(item.weight);\n        const totalWeightScaled = this.toScaled(totalPoolWeight);\n        const numeratorScaled = Math.round((itemWeightScaled * baseRarityRateScaled) / GachaEngine.SCALE);\n        const rateScaled = Math.round((numeratorScaled * GachaEngine.SCALE) / totalWeightScaled);\n\n        this.dropRateCacheScaled.set(name, rateScaled);\n        return this.fromScaled(rateScaled);\n      }\n    }\n\n    throw new Error(`Item \"${name}\" not found`);\n  }\n\n  getCumulativeProbabilityForItem(name: string, rolls: number): number {\n    const rate = this.getItemDropRate(name);\n    if (rate === 0) return 0;\n    if (rate >= 1) return 1;\n\n    const cumulativeFailProbability = Math.pow(1 - rate, rolls);\n    return 1 - cumulativeFailProbability;\n  }\n\n  getRollsForTargetProbability(name: string, targetProbability: number): number {\n    if (targetProbability <= 0) return 0;\n    if (targetProbability >= 1) return 1;\n\n    const rate = this.getItemDropRate(name);\n    if (rate <= 0) return Infinity;\n    return Math.ceil(Math.log(1 - targetProbability) / Math.log(1 - rate));\n  }\n\n  getRateUpItems(): string[] {\n    if (this.mode === 'weighted') {\n      return this.pools.flatMap(p => p.items.filter(i => i.rateUp).map(i => i.name));\n    } else {\n      return this.flatRateRateUpItems;\n    }\n  }\n\n  getAllItemDropRates(): { name: string; dropRate: number; rarity: string }[] {\n    if (this.mode === 'flatRate') {\n      return Array.from(this.flatRateMap.entries()).map(([name, dropRate]) => ({\n        name,\n        dropRate,\n        rarity: 'flatRate',\n      }));\n    }\n\n    return this.pools.flatMap(p =>\n      p.items.map(i => ({\n        name: i.name,\n        dropRate: this.getItemDropRate(i.name),\n        rarity: p.rarity,\n      }))\n    );\n  }\n\n  roll(count: number = 1): string[] {\n    const results: string[] = [];\n    for (let i = 0; i < count; i++) {\n      if (this.mode === 'flatRate') {\n        const rand = Math.random();\n        let cumulative = 0;\n        for (const [name, rate] of this.flatRateMap.entries()) {\n          cumulative += rate;\n          if (rand < cumulative) {\n            results.push(name);\n            break;\n          }\n        }\n      } else {\n        const rarity = this.selectRarity();\n        const pool = this.pools.find(p => p.rarity === rarity)!;\n        const item = this.selectItemFromPool(pool);\n        results.push(item.name);\n      }\n    }\n    return results;\n  }\n\n  private selectRarity(): string {\n    const rand = Math.floor(Math.random() * GachaEngine.SCALE);\n    let cumulative = 0;\n\n    for (const [rarity, scaledRate] of Object.entries(this.rarityRatesScaled)) {\n      cumulative += scaledRate;\n      if (rand < cumulative) return rarity;\n    }\n\n    return Object.keys(this.rarityRatesScaled)[0];\n  }\n\n  private selectItemFromPool(pool: RarityInput): { name: string; weight: number } {\n    const items = pool.items.filter(i => i.weight > 0);\n    const scaledItems = items.map(i => ({\n      ...i,\n      scaledWeight: this.toScaled(i.weight),\n    }));\n\n    const totalScaledWeight = scaledItems.reduce((sum, i) => sum + i.scaledWeight, 0);\n    const rand = Math.floor(Math.random() * totalScaledWeight);\n    let cumulative = 0;\n\n    for (const item of scaledItems) {\n      cumulative += item.scaledWeight;\n      if (rand < cumulative) {\n        return { name: item.name, weight: item.weight };\n      }\n    }\n\n    return items[0]; // Fallback\n  }\n\n  getDebugInfo(): {\n    scale: number;\n    rarityRatesScaled: Record<string, number>;\n    rarityRatesFloat: Record<string, number>;\n  } {\n    const rarityRatesFloat: Record<string, number> = {};\n    for (const [rarity, scaledRate] of Object.entries(this.rarityRatesScaled)) {\n      rarityRatesFloat[rarity] = this.fromScaled(scaledRate);\n    }\n\n    return {\n      scale: GachaEngine.SCALE,\n      rarityRatesScaled: { ...this.rarityRatesScaled },\n      rarityRatesFloat,\n    };\n  }\n}\n"],"names":["GachaEngine","config","this","mode","pools","rarityRatesScaled","flatRateMap","Map","dropRateCacheScaled","flatRateRateUpItems","weightedConfig","scaleRarityRates","rarityRates","validateConfig","Error","flatConfig","_iterator","_step","_createForOfIteratorHelperLoose","done","_step2","_iterator2","value","items","item","weight","name","set","rateUp","push","total","Array","from","values","reduce","sum","v","Math","abs","_proto","prototype","scaled","_i","_Object$entries","Object","entries","length","_Object$entries$_i","rarity","rate","toScaled","probability","MAX_SAFE_SCALE","SCALE","round","fromScaled","scaledInt","originalRates","configuredRarities","Set","keys","usedRarities","map","p","missing","filter","r","has","join","totalRate","_step3","_iterator3","pool","i","_iterator4","_step4","some","getItemDropRate","get","_iterator5","_step5","find","totalPoolWeight","baseRarityRateScaled","itemWeightScaled","totalWeightScaled","numeratorScaled","rateScaled","getCumulativeProbabilityForItem","rolls","pow","getRollsForTargetProbability","targetProbability","Infinity","ceil","log","getRateUpItems","flatMap","getAllItemDropRates","_this","_ref","dropRate","roll","count","_this2","results","_loop","_step6","rand","random","cumulative","_iterator6","_step6$value","selectRarity","selectItemFromPool","floor","_i2","_Object$entries2","_Object$entries2$_i","_this3","_step7","scaledItems","_extends","scaledWeight","totalScaledWeight","_iterator7","getDebugInfo","rarityRatesFloat","_i3","_Object$entries3","_Object$entries3$_i","scale","Number","MAX_SAFE_INTEGER"],"mappings":"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"}