Files
MatchMaster/assets/pyramid/scripts/PyramidAnimationDebug.ts
T
2026-10-12 15:00:49 +08:00

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;
}
}