import { remainingProbabilities } from "./PyramidProbability"; /** Temporary, panel-local simulation. Delete this file before release. No service or inventory access. */ export default class PyramidAnimationDebug { readonly state: any; constructor(source: any, readonly identity: string) { this.state = JSON.parse(JSON.stringify(source)); this.state.pendingOrder = null; this.state.pendingGrants = []; this.state.status = "active"; this.state.canPay = false; this.refresh(); } private refresh(): void { const s = this.state; s.canDraw = !s.completed && s.currentLevel < 6; s.drawCount = s.canDraw ? 1 : 0; s.canClaimFinal = !s.completed && s.currentLevel === 6; s.revision = (s.revision || 0) + 1; } draw(random = Math.random): any { const s = this.state; if (!s.canDraw) return null; const level = s.levels.find(l => l.level === s.currentLevel); const probabilities = remainingProbabilities(level.level, level.rewards); const available = level.rewards.filter(r => !r.gain).map(r => r.rewardId); let ticket = random(), selected: any = null; for (let i = 0; i < probabilities.length; i++) { if (probabilities[i] <= 0) continue; selected = level.rewards[i]; ticket -= probabilities[i]; if (ticket < 0) break; } if (!selected) return null; const previousLevel = s.currentLevel; selected.gain = true; selected.deliveryStatus = "delivered"; if (selected.up) s.currentLevel++; if (s.currentLevel === 6) s.levels.forEach(l => l.rewards.forEach(r => { if (r.deliveryStatus !== "delivered") { r.gain = true; r.deliveryStatus = "unclaimed"; } })); this.refresh(); return { rewardId: selected.rewardId, previousLevel, goods: selected.goods, available }; } claim(): Array<{ id: number; count: number }> { const s = this.state; if (!s.canClaimFinal) return []; const goods = []; s.levels.forEach(l => l.rewards.forEach(r => { if (r.deliveryStatus === "delivered") return; goods.push(...r.goods); r.gain = true; r.deliveryStatus = "delivered"; })); s.completed = true; this.refresh(); return goods; } }