@open-rgs/cascade
Clear, fall, refill, repeat.
Gravity is per column
A short reel drops its symbols a shorter distance. Treating the board as a rectangle mixes symbols between columns - a bug that reads as a shuffle rather than a fall, and still looks plausible on screen.
import { clear, collapse, refill, tumble } from "@open-rgs/cascade";
const next = tumble(grid, winningCells, (n) => symbols.pick(n()), host.rng_next); The ladder applies per step
It multiplies that step's own win, never the running total. Applying it to the total compounds across steps and inflates RTP badly.
1×2× 3×5×
import { runCascade } from "@open-rgs/cascade";
const run = runCascade(start, evaluate, pick, host.rng_next, {
stepMultipliers: [1, 2, 3, 5, 8, 12],
maxSteps: 30,
});
run.steps[1].paid; The loop is bounded
A refill can always produce another win, so in principle a cascade never ends. Unbounded, one unlucky spin hangs the process; the cap turns that into a finite, auditable round.
run.truncated;