Loading recipe…
A tall wild lands with most of its body hidden above the visible window. only the tail (the bottom cell) shows at row 0. The player nudges to drag the whole wild into view, then gets a respin of the OTHER reels with the wild reel held. the revealed block stays put. This recipe wires the full sequence.
Why this works end-to-end
Three pieces have to cooperate, and they do. the audit case for the buffer-row anchor feature:
-
setResultaccepts an anchor inbufferAbove. Pass the anchor id atbufferAbove[i](orframe[col][-i-1]via legacy negative indexing) and_coordinateBigSymbolspaintsOCCUPIEDacross the rest of the block. even when stubs fall in visible rows. The validation rule is the full strip (anchorRow + h <= visibleRows + bufferBelow), not just visible. -
nudge()slides the block as a unit from buffer-anchored to fully visible. The survival check (anchor + h - 1 + distance < total) applies; for a 1×3 wild atstrip[0]and adistance=2down nudge,0 + 3 - 1 + 2 = 4 < 7(where total isbufferAbove(2) + visibleRows(3) + bufferBelow(2)). The wrap pipeline never splits the anchor from its stubs. Post-nudge the anchor sits atstrip[2] = visible[0]; the block fills all three visible rows. -
spin({ holdReels: [...] })skips the held reels entirely. START / SPIN / STOP never fire on the held column. The strip array, the resized anchor sprite, and the_occupancymap all carry through unchanged. The block sits exactly where the nudge left it. no jitter, no re-land.
What the recipe runs
// 1. Land the tail-visible wild.
const initialGrid = [
ct(), ct(),
// Anchor at bufferAbove[1] = row -2. Block spans rows -2, -1, 0.
{ visible: [filler(), filler(), filler()], bufferAbove: [undefined, 'tall'] },
ct(), ct(),
];
const spin1 = reelSet.spin();
reelSet.setResult(initialGrid);
await spin1;
// 2. Nudge the held reel down by 2. block slides into full view.
await reelSet.nudge(2, {
distance: 2,
direction: 'down',
incoming: [filler(), filler()],
});
// 3. Respin reels 0, 1, 3, 4. reel 2 held, revealed block preserved.
const spin2 = reelSet.spin({ holdReels: [2] });
reelSet.setResult([
ct(), ct(),
ct(), // ignored. reel 2 is held
ct(), ct(),
]);
await spin2;
Required configuration
-
bufferSymbols(n)wheren>= the largest off-screen extension. For a 1×3 wild with its tail at row 0, the anchor sits at row -2. needsbufferAbove >= 2. The builder sets both buffers to the same value, sobufferSymbols(2)works. -
The big-symbol id needs
weight: 0. Random fill can’t place blocks; non-zero weight throws at build. -
Bounce should be 0 for big symbols.
bounceDistance: 0, bounceDuration: 0in the speed profile. the default landing bounce doesn’t account for stubs and produces a visual jitter on big anchors.
What still throws
-
Cross-reel (
w > 1) blocks held across a respin work, but you can’t nudge them. nudging shifts only the one held reel, and the block’s right-side cells live on other reels. -
Mixing
string[]andColumnTargetcolumns inside onesetResultcall.toLegacyTargetGridrejects mixed shapes. pick one form for the whole grid. The recipe usesColumnTargeteverywhere, including the held reel’s placeholder, because the wild reel needs thebufferAbovefield. -
An anchor in
bufferAbovewhose h pushes the block pastbufferBelow._coordinateBigSymbolsvalidates against the full strip; an over-tall anchor throws withextends past the bottom of the strip.
Related
- Land a big symbol partially in buffer. same buffer-anchor entry, but with both nudge directions instead of a nudge-then-hold-respin.
- Hold & Win pin. the spiritual cousin: hold CHIP symbols as 1×1 pins across respins (no big-symbol layout).
- Nudge through a big symbol. the survival rules for nudging blocks through the strip.