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.

1×2× 3×5×
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;