Why this page exists
The “3 scatters anywhere” rule is the most common FS trigger in the industry. The interesting part isn’t the detection. it’s producing it on demand so you can polish the transition without playing 100 spins.
Setup
1. Register a scatter symbol
builder.symbols((r) => {
r.register('scatter', BlockSymbol, { colors: { scatter: 0xffd24c } });
});
builder.weights({ scatter: 2 }); // low natural frequency
2. Detect on completion
reelSet.events.on('spin:complete', ({ symbols }) => {
const count = symbols.flat().filter((s) => s === 'scatter').length;
if (count >= 3) enterFreeSpins(count * 5);
});
3. Anticipation on near-miss
If the server response says “2 scatters visible and reel 5 is spinning,” call
setAnticipation before setResult to slow the last reel.
const promise = reelSet.spin();
setTimeout(() => {
reelSet.setAnticipation([4]); // slow reel 5
reelSet.setResult(response.symbols);
}, 200);
4. Test it
The forceScatters(3, 'scatter') cheat makes this deterministic:
const { reelSet, spinAndLand } = createTestReelSet({
reels: 5, visibleRows: 3, symbolIds: ['a','b','c','scatter'],
});
const engine = new CheatEngine({ reelCount: 5, visibleRows: 3, symbolIds: ['a','b','c','scatter'], seed: 1 });
engine.register({ id: 's', label: 's', enabled: true, cheat: forceScatters(3, 'scatter') });
await spinAndLand(engine.next().symbols);
expect(countSymbol(reelSet, 'scatter')).toBeGreaterThanOrEqual(3);
Cheats on this page
- Force 3 scatters (default on). guarantees the trigger.
- Force 4 scatters. retrigger territory.
- Near-miss on reel 5. 2 scatters on reels 1–4, reel 5 blanks with anticipation.