@planarally/dice
Version:
3D dice rolling functionality for babylon.js.
33 lines (32 loc) • 1.32 kB
JavaScript
import { hasStatus, Status } from "./types";
export async function rollString(inputString, diceSystem, rollOptions) {
return await rollParts(diceSystem.parse(inputString), diceSystem, rollOptions);
}
export async function rollParts(parts, diceSystem, rollOptions) {
let allResolved = false;
// AS LONG AS THERE ARE PENDING PARTS
while (!allResolved) {
// 1 COLLECT ALL PENDING ROLLS
const collectRolls = [];
for (const [i, part] of parts.entries()) {
if (hasStatus(part, Status.PendingRoll)) {
collectRolls.push({ index: i, promise: diceSystem.roll(part, rollOptions) });
}
}
// 2 ROLL
// eslint-disable-next-line
const resolvedRolls = await Promise.all(collectRolls.map(({ promise }) => promise));
for (const [index, resolvedPart] of resolvedRolls.entries()) {
parts[collectRolls[index].index] = resolvedPart;
}
// 3 EVALUATE ALL PARTS
for (const [i, part] of parts.entries()) {
if (hasStatus(part, Status.PendingEvaluation)) {
parts[i] = diceSystem.evaluate(part);
}
}
allResolved = parts.every((part) => hasStatus(part, Status.Resolved));
}
// COLLECT RESULTS
return diceSystem.collect(parts);
}