import { ReelPhase } from './ReelPhase.js'; import { Reel } from '../../core/Reel.js'; import { SpeedProfile } from '../../config/types.js'; import { EventEmitter } from '../../events/EventEmitter.js'; import { ReelSetEvents } from '../../events/ReelEvents.js'; import { Direction } from '../../core/ReelAxis.js'; export interface CascadePlacePhaseConfig { /** Full target frame for this reel: buffer-above + visible + buffer-below. */ targetFrame: string[]; /** Visible cells whose old symbols were "winners" cleared since the last * placement. Empty AND `initial: false` ⇒ no movement on this reel. */ winnerCells: number[]; /** `true` for Moment A (initial spin); `false` for Moment B (refill). */ initial: boolean; /** Per-reel delay before placement, in ms. */ delay?: number; /** Reel-set event bus, injected by SpinController. */ events: EventEmitter; } /** * Identity-swap half of the tumble cascade. Runs after `CascadeFallPhase` * (Moment A) or right at the start of `refill()` (Moment B). * * Mechanically tiny: it calls `reel.placeSymbols(visible)` to swap visible * symbol identities, then fires `cascade:place:end`. Listeners on that * event (badges, decorations, multiplier overlays) run synchronously * BEFORE `CascadeDropInPhase` starts the drop tweens. so anything you * attach to a new symbol falls WITH it, not after landing. */ export declare class CascadePlacePhase extends ReelPhase { readonly name = "cascade:place"; readonly skippable = true; private _config; private _delayedCall; /** Build-time gravity setting; `'auto'` resolves per reel at place time. */ private readonly _gravity; constructor(reel: Reel, speed: SpeedProfile, gravity?: 'auto' | Direction); protected onEnter(config: CascadePlacePhaseConfig): void; /** * Trim the positional `targetFrame` (buffer-above … visible … buffer-below) * to the head the cascade actually lands: buffer-above plus the visible * window. The buffer-above cells matter — a big-symbol anchor can live * there (a partial-visibility "tail-visible" block), and dropping it leaves * its visible OCCUPIED stub uncovered so the block's visible cell renders * empty. Buffer-below cells are deliberately left off the end for * `placeStrip` to random-fill: they're masked and never carry a visible * anchor. */ private _placement; private _doPlace; update(_deltaMs: number): void; protected onSkip(): void; } //# sourceMappingURL=CascadePlacePhase.d.ts.map