50 lines
2.3 KiB
TypeScript
50 lines
2.3 KiB
TypeScript
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;
|
|
}
|
|
}
|