# SlotMachines Framework

## SingleSlotReelsSpinSystem settings

`SingleSlotReelsSpinSystem` extends the base reel system with per-slot timing controls. In addition to the common spin settings, it now supports a `slotStopDelay` option that waits after each slot in a column actually stops before triggering the next slot in that same column. Column-to-column pacing continues to use `reelStopDelay`, so the first slot of each column still fires on the familiar cadence while the remaining slots inherit the intra-column delay. This enables sequential stopping visuals without manual timers and keeps the machine symbol map in sync as every slot lands. When a delay is configured the system trims transient filler symbols and collapses each reel to the final landed symbol, so no duplicate entities remain on screen while the column settles. A dedicated `slotStopDelay` knob is now available in `HoldAndWin.stories.ts` to preview the staggered stop cadence directly in Storybook, and every numeric control in that story uses fractional steps for precise tuning.

## SlotMultipliersSystem

`SlotMultipliersSystem` renders a configurable overlay entity for every reel cell based on `machine.maps.slotMultipliers`. The default `SlotMultiplierEntity` boots a Spine asset with `in`/`out` animations, injects a centred red label into the `placehoder` slot, and automatically hides itself when the outro finishes. The accompanying Storybook story (`SlotMultipliersSystem.stories.ts`) wires the feature into `HoldAndWinMachine`, generates random multiplier maps on every spin, and demonstrates how to swap the display entity via the system settings. The machine itself does not create or register the system; consumers should instantiate `SlotMultipliersSystem`, push it into the relevant state lists, and supply their preferred entity class when wiring machines together.

The system now keeps overlays alive across state transitions so multipliers that remain active do not replay their `in` animation. Clear `slotMultipliers` (or unregister the system) when the overlays should disappear entirely.

## MaskingSystem

`MaskingSystem` manages a reusable rectangular mask sized through system settings (defaulting to the machine configuration). When active it walks through every child entity each frame and synchronises their `mask` property with their `isMasked` flag: entities opt-in by toggling the flag to `true`, at which point the system applies its mask if no other mask is present; when the flag returns to `false` the system restores the entity's original rendering by clearing its mask. The mask graphic is created once, attached to the machine container, tinted red for easy debugging, and automatically refreshed when the system enters or leaves a state. Set the new `enabled` setting to `false` to globally disable masking without deregistering the system; the Storybook controls mirror this flag so designers can toggle masks while keeping the state machine intact.

`ReelsSpinSystem` now toggles `isMasked` for each symbol while its reel state is `Spinning` and keeps the flag active through deceleration, clearing it only once the reel enters `Bouncing` or `Stopped`. This keeps the mask in place for every symbol that is still visibly moving and ensures it disappears as soon as the reel finishes its bounce or comes to rest.

Storybook now ships focused demos for the masking and blur orchestration helpers:

- `src/stories/MaskingSystem.stories.ts` mirrors the standard spin story boot flow and forwards the enable/size controls straight into `MaskingSystem#setSettings`, making it easy to iterate on viewport dimensions while reels spin.
- `src/stories/BlurSymbolsSystem.stories.ts` reuses the same template but exposes motion blur velocity, kernel size, and offset knobs that feed into `BlurSymbolsSystem#setSettings` for rapid strength tuning.
