All extensions

@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.

Winners clear, survivors fall, a fresh symbol drops in on top.
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.

The ladder climbs per step and applies to that step's own win.
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.

The loop is capped, because a refill can always win again.
run.truncated;