tyrants-edge/src/managers/PackManager.js

46 lines
1.2 KiB
JavaScript

import { RNG } from '../utils/RNG.js';
export class PackManager {
constructor(packsData, cardManager) {
this.packs = new Map(packsData.map(p => [p.id, p]));
this.cardManager = cardManager;
}
getPack(id) {
return this.packs.get(id);
}
getAllPacks() {
return [...this.packs.values()];
}
openPack(packId, save) {
const pack = this.getPack(packId);
if (!pack) return null;
const rng = new RNG(Date.now() ^ (Math.random() * 0xffffffff));
const results = [];
for (let i = 0; i < pack.cardCount; i++) {
const rarity = this._rollRarity(pack.dropRates, rng);
const pool = this.cardManager.getAllCards().filter(c =>
c.rarity === rarity &&
c.type !== 'commander' &&
pack.cardPool.includes(c.faction)
);
if (pool.length === 0) continue;
const card = pool[rng.nextInt(0, pool.length - 1)];
results.push(card);
}
return results;
}
_rollRarity(dropRates, rng) {
const r = rng.next();
let cumulative = 0;
for (const [rarity, rate] of Object.entries(dropRates)) {
cumulative += rate;
if (r < cumulative) return rarity;
}
return 'common';
}
}