UNPKG

@planarally/dice

Version:

3D dice rolling functionality for babylon.js.

33 lines (32 loc) 1.32 kB
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); }