unmask? | boolean | If true, the engine parents this symbol’s view to viewport.unmaskedContainer instead of the reel’s masked container. the symbol renders above the reel mask, useful for oversized win animations (expanding wilds, splash frames) that should not be clipped at the cell boundary. At-rest presentation: unmask lifts a symbol above the mask ONLY while its reel is stopped. On notifyLanded each visible-row instance is re-parented into viewport.unmaskedContainer (X = reel.container.x, Y = reel.container.y + reelLocalY so it lines up with its grid cell); the instant the reel starts moving again it is pulled back into the masked reel container. So while spinning, an unmasked id is masked like everything else. nothing scrolls above the grid, and buffer rows are never lifted. If you need a symbol to stay above the mask while the reel moves, use a cell pin instead. Works on jagged/pyramid layouts: a reel with non-zero offsetY is handled. Reel._syncUnmaskedViewOffsets() re-bakes container.y into lifted views after every absolute motion.snapToGrid() (which writes bare reel-local Y); displace() is incremental and preserves the offset. Because lifted views exist only at rest, the frequent mid-spin snaps never touch them. Mask-strategy auto-pick: when any registered symbol sets unmask: true and symbolGap.x > 0, the builder switches the default RectMaskStrategy to SharedRectMaskStrategy so that neighboring (masked) symbols don’t get clipped at the column gap next to the unmasked overlay. Passing .maskStrategy(...) explicitly always wins. For symbols that need to overlap across reel boundaries while unmasked, prefer SharedRectMaskStrategy. | config/types.ts:196 |