pixi-reels 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # pixi-reels
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#61](https://github.com/schmooky/pixi-reels/pull/61) [`28551ca`](https://github.com/schmooky/pixi-reels/commit/28551ca72e6cbc1e95984cf1b35e71bdb5f18d22) Thanks [@schmooky](https://github.com/schmooky)! - Add: per-reel geometry, MultiWays, big symbols, and expanding wilds.
8
+
9
+ - **Per-reel static shape (pyramids):** `builder.visibleRowsPerReel([3, 5, 5, 5, 3])`, optional `reelPixelHeights`, `reelAnchor: 'top' | 'center' | 'bottom'`. Reels can now have non-uniform row counts at build time.
10
+ - **MultiWays (per-spin row variation):** `builder.multiways({ minRows, maxRows, reelPixelHeight })` plus `reelSet.setShape(rowsPerReel)` mid-spin. A new `AdjustPhase` (inserted only when `.multiways(...)` is called) reshapes reels between SPIN and STOP. Pin migration follows: pins gain a frozen `originRow` and migrate back toward it on each reshape.
11
+ - **Big symbols (`N×M` blocks):** `register('bonus', SymbolClass, { size: { w: 2, h: 2 } })`. The result grid stays `string[][]` — the engine paints OCCUPIED across the block. `getSymbolFootprint(col, row)` resolves any cell to the anchor.
12
+ - **Expanding wilds:** unchanged from the existing pin API; reaffirmed via tests as a degenerate big-symbol case.
13
+
14
+ New events: `shape:changed`, `adjust:start`, `adjust:complete`, `pin:migrated`. They only fire on MultiWays slots — non-MultiWays event surfaces are unchanged.
15
+
16
+ New runtime: `reelSet.setShape()`, `reelSet.getSymbolFootprint()`, `reelSet.getVisibleGrid()`, `reelSet.isMultiWaysSlot`. New builder fluents: `.visibleRowsPerReel()`, `.reelPixelHeights()`, `.reelAnchor()`, `.multiways()`, `.pinMigrationDuration()`, `.pinMigrationEase()`. Pin gains optional `originRow`.
17
+
18
+ AdjustPhase animates the reshape: every visible symbol tweens its height + Y from the old shape to the new one over `pinMigrationDuration` ms with the configurable `pinMigrationEase`. Pin overlays tween in lock-step so a sticky wild visibly slides to its migrated row. Set `pinMigrationDuration(0)` for an instant snap.
19
+
20
+ Constraints: big symbols and MultiWays are mutually exclusive per slot in v1. Cascade mode + MultiWays throws at build.
21
+
22
+ **Breaking** (debug-only, not protected by semver but called out): `DebugSnapshot.visibleRows` widens from `number` to `number[]` so jagged shapes are representable. Adapt downstream code that deep-reads the snapshot.
23
+
24
+ ### Patch Changes
25
+
26
+ - [#61](https://github.com/schmooky/pixi-reels/pull/61) [`4b22c00`](https://github.com/schmooky/pixi-reels/commit/4b22c00b0f5733d141de1fee4ed8bf515cc2a513) Thanks [@schmooky](https://github.com/schmooky)! - Fix and harden a handful of follow-ups from the per-reel-geometry / MultiWays / big-symbols PR:
27
+
28
+ - `Reel.reshape()` now keeps `_reelHeight` in sync with the new geometry so the field doesn't go stale after a reshape. Previously a direct external call left `reelHeight` reporting the construction-time value. The method is also marked `@internal` in JSDoc — `ReelSet.setShape()` is the supported entry point.
29
+ - `ReelSetBuilder.maskStrategy()` now validates its argument synchronously: passing `null`, `undefined`, or an object missing `build()` / `update()` methods throws with a grep-able error instead of crashing later inside `ReelViewport`.
30
+ - Added a comment in `SpinController.skip()` documenting the reshape-on-skip contract — pin overlays migrate instantly on slam-stop regardless of `pinMigrationDuration`, and the rationale (overlays are destroyed at land anyway).
31
+
32
+ No new public API; behaviour for existing well-formed callers is unchanged.
33
+
3
34
  ## 0.2.0
4
35
 
5
36
  ### Minor Changes
@@ -31,17 +31,64 @@ export interface SymbolData {
31
31
  zIndex?: number;
32
32
  /** If true, this symbol renders above the reel mask (for oversized animations). */
33
33
  unmask?: boolean;
34
+ /**
35
+ * Footprint in cells. Default `{ w: 1, h: 1 }`. When `w * h > 1` this
36
+ * symbol is a "big symbol" — at landing it occupies an `w × h` block of
37
+ * cells anchored at the (col, row) where its id appears in the result.
38
+ * Big-symbol registration is rejected on MultiWays slots.
39
+ */
40
+ size?: {
41
+ w: number;
42
+ h: number;
43
+ };
44
+ }
45
+ /** How to vertically align reels of differing pixel heights. */
46
+ export type ReelAnchor = 'top' | 'center' | 'bottom';
47
+ /**
48
+ * MultiWays configuration knobs. Set via `builder.multiways({ ... })` —
49
+ * mutually exclusive with big-symbol registration.
50
+ */
51
+ export interface MultiWaysConfig {
52
+ /** Minimum visible rows the server can request. Inclusive. */
53
+ minRows: number;
54
+ /** Maximum visible rows the server can request. Inclusive. */
55
+ maxRows: number;
56
+ /**
57
+ * Pixel height of every reel box. Cell height per reel becomes
58
+ * `reelPixelHeight / visibleRows[i]` after each reshape.
59
+ */
60
+ reelPixelHeight: number;
34
61
  }
35
62
  /** Configuration for the reel grid layout. */
36
63
  export interface ReelGridConfig {
37
64
  /** Number of reel columns. */
38
65
  reelCount: number;
39
- /** Number of visible symbol rows per reel. */
66
+ /**
67
+ * Default visible rows when all reels are uniform. Ignored if
68
+ * `visibleRowsPerReel` is set.
69
+ */
40
70
  visibleRows: number;
71
+ /**
72
+ * Per-reel row counts (static shape). Length MUST equal `reelCount`.
73
+ * Example: `[3, 5, 5, 5, 3]` for a pyramid layout. Mutually exclusive
74
+ * with the scalar `visibleRows` field at the builder level.
75
+ */
76
+ visibleRowsPerReel?: number[];
41
77
  /** Symbol width in pixels. */
42
78
  symbolWidth: number;
43
- /** Symbol height in pixels. */
79
+ /** Symbol height in pixels. Used as the SPIN-time uniform cell height. */
44
80
  symbolHeight: number;
81
+ /**
82
+ * Per-reel pixel-box heights. Length MUST equal `reelCount` when set.
83
+ * For MultiWays: every entry is the same fixed reel height. For static
84
+ * pyramids: defaults to `visibleRowsPerReel[i] * symbolHeight`.
85
+ */
86
+ reelPixelHeights?: number[];
87
+ /**
88
+ * How short reels align vertically inside the tallest reel's height.
89
+ * Default: 'center'.
90
+ */
91
+ reelAnchor?: ReelAnchor;
45
92
  /** Gap between symbols. Default: { x: 0, y: 0 }. */
46
93
  symbolGap?: {
47
94
  x: number;
@@ -49,6 +96,13 @@ export interface ReelGridConfig {
49
96
  };
50
97
  /** Number of buffer symbols above and below the visible area. Default: 1. */
51
98
  bufferSymbols?: number;
99
+ /**
100
+ * MultiWays configuration. Set by `builder.multiways(...)`. When present:
101
+ * - `setShape(rowsPerReel)` becomes callable mid-spin
102
+ * - AdjustPhase is inserted between SPIN and STOP
103
+ * - big-symbol registration throws at build time
104
+ */
105
+ multiways?: MultiWaysConfig;
52
106
  }
53
107
  /** Extra symbols above/below config per reel. */
54
108
  export interface ReelExtraSymbols {
@@ -135,9 +189,29 @@ export interface MaskConfig {
135
189
  mask: Container;
136
190
  position: Position;
137
191
  }
192
+ /**
193
+ * Resolved grid view used internally — every defaulted field is filled in,
194
+ * but per-reel-shape and MultiWays extensions stay optional because they're
195
+ * genuinely opt-in.
196
+ */
197
+ export interface ResolvedReelGridConfig {
198
+ reelCount: number;
199
+ visibleRows: number;
200
+ symbolWidth: number;
201
+ symbolHeight: number;
202
+ symbolGap: {
203
+ x: number;
204
+ y: number;
205
+ };
206
+ bufferSymbols: number;
207
+ visibleRowsPerReel?: number[];
208
+ reelPixelHeights?: number[];
209
+ reelAnchor: ReelAnchor;
210
+ multiways?: MultiWaysConfig;
211
+ }
138
212
  /** Full internal configuration assembled by the builder. */
139
213
  export interface ReelSetInternalConfig {
140
- grid: Required<ReelGridConfig>;
214
+ grid: ResolvedReelGridConfig;
141
215
  symbols: Record<string, SymbolData>;
142
216
  speeds: Map<string, SpeedProfile>;
143
217
  initialSpeed: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,yDAAyD;IACzD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,oEAAoE;IACpE,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,oDAAoD;IACpD,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,kDAAkD;AAClD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/C,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,cAAc,CAAC;AAE5D,mCAAmC;AACnC,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AAE9B,0BAA0B;AAC1B,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,CAAC,EAAE,MAAM,CAAC;IACV,oDAAoD;IACpD,CAAC,EAAE,MAAM,CAAC;IACV,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,GAAG;IAClB,4DAA4D;IAC5D,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACrC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -21,7 +21,31 @@ export interface ReelConfig {
21
21
  symbolGapY: number;
22
22
  symbolsData: Record<string, SymbolData>;
23
23
  initialSymbols: string[];
24
+ /**
25
+ * Y offset of this reel relative to the viewport's top edge. Set by the
26
+ * builder so jagged shapes (pyramids) align according to `reelAnchor`.
27
+ * Default 0.
28
+ */
29
+ offsetY?: number;
30
+ /**
31
+ * Pixel height of this reel's box. Used for MultiWays cell-height
32
+ * derivation (`reelHeight / visibleRows`). Defaults to
33
+ * `visibleRows * symbolHeight`.
34
+ */
35
+ reelHeight?: number;
36
+ /**
37
+ * SPIN-time uniform cell height. During SPIN every reel uses this same
38
+ * height. AdjustPhase later swaps to per-reel `reelHeight / visibleRows`.
39
+ * Defaults to `symbolHeight`.
40
+ */
41
+ spinSymbolHeight?: number;
24
42
  }
43
+ /**
44
+ * Internal sentinel marking non-anchor cells of a big symbol's block.
45
+ * Never crosses the public API — `getVisibleSymbols()` resolves it to the
46
+ * anchor's id.
47
+ */
48
+ export declare const OCCUPIED_SENTINEL = "__pixi_reels_occupied__";
25
49
  /**
26
50
  * One vertical column of a slot board.
27
51
  *
@@ -59,8 +83,37 @@ export declare class Reel implements Disposable {
59
83
  private _bufferAbove;
60
84
  private _symbolWidth;
61
85
  private _symbolHeight;
86
+ private _offsetY;
87
+ private _reelHeight;
88
+ private _spinSymbolHeight;
89
+ private _symbolGapY;
90
+ private _symbolGapX;
62
91
  private _isDestroyed;
63
92
  private _isStopping;
93
+ /**
94
+ * Internal stub instances reused for OCCUPIED cells inside a big-symbol
95
+ * block. Allocated on demand (one per concurrent OCCUPIED cell on this
96
+ * reel), never pooled through `SymbolFactory`. The views are invisible —
97
+ * the anchor symbol is sized up to cover the whole block.
98
+ */
99
+ private _occupiedStubs;
100
+ /**
101
+ * Per-row marker recording which rows are non-anchor cells of a big
102
+ * symbol. Populated when frames are placed; consulted by `getVisibleSymbols`
103
+ * and `getSymbolAt` so anchor identity propagates through the block.
104
+ *
105
+ * Indexed by visible-row 0..visibleRows-1. Each entry is `null` for a
106
+ * normal cell, or `{ anchorRow }` for a cell occupied by another row's
107
+ * anchor.
108
+ */
109
+ private _occupancy;
110
+ /**
111
+ * Optional resolver for cross-reel OCCUPIED cells. Set by `ReelSet` so
112
+ * `getVisibleSymbols()` returns the anchor's id even when the anchor
113
+ * lives on a different reel (a 2×2 bonus straddles cols c, c+1).
114
+ * Without it, cross-reel OCCUPIED cells return the OCCUPIED sentinel.
115
+ */
116
+ private _crossReelResolver;
64
117
  constructor(config: ReelConfig, symbolFactory: SymbolFactory, randomProvider: RandomSymbolProvider, viewport: ReelViewport);
65
118
  get isDestroyed(): boolean;
66
119
  get isStopping(): boolean;
@@ -70,26 +123,104 @@ export declare class Reel implements Disposable {
70
123
  get visibleRows(): number;
71
124
  /** The symbol cell width (in pixels). Constant for the reel's lifetime. */
72
125
  get symbolWidth(): number;
73
- /** The symbol cell height (in pixels). Constant for the reel's lifetime. */
126
+ /**
127
+ * The symbol cell height (in pixels). Mutates on MultiWays reshape via
128
+ * `reshape()`. During SPIN this still equals `spinSymbolHeight`; the
129
+ * per-reel target value comes into effect when AdjustPhase commits the
130
+ * reshape. For non-MultiWays slots this is constant for the reel's lifetime.
131
+ */
74
132
  get symbolHeight(): number;
133
+ /** Pixel height of this reel's box. Set by builder, immutable. */
134
+ get reelHeight(): number;
135
+ /** Y offset of this reel relative to the viewport top. Set by builder, immutable. */
136
+ get offsetY(): number;
137
+ /**
138
+ * SPIN-time uniform cell height. All reels in a slot use this value during
139
+ * the SPIN phase regardless of their per-reel `symbolHeight`. Frozen at
140
+ * construction.
141
+ */
142
+ get spinSymbolHeight(): number;
75
143
  /** Update reel for one frame. Called by SpinController via ticker. */
76
144
  update(deltaMs: number): void;
77
145
  /** Set the target frame for stopping. */
78
146
  setStopFrame(frame: string[]): void;
79
- /** Get visible symbol IDs (top to bottom, excluding buffers). */
147
+ /**
148
+ * Get visible symbol IDs (top to bottom, excluding buffers).
149
+ *
150
+ * Big-symbol cells resolve to the anchor's id — both **same-reel**
151
+ * (the anchor lives on this reel) and **cross-reel** (the anchor is on
152
+ * a leftward reel of a wider block). The cross-reel resolver is
153
+ * injected by `ReelSet`; without it, cross-reel OCCUPIED cells would
154
+ * return the OCCUPIED sentinel, which is the only difference vs.
155
+ * `ReelSet.getVisibleGrid()`. With the resolver wired, the two are
156
+ * equivalent for any reel — `reels.map(r => r.getVisibleSymbols())`
157
+ * matches `reelSet.getVisibleGrid()`.
158
+ */
80
159
  getVisibleSymbols(): string[];
81
- /** Get symbol at a visible row (0-indexed from top visible). */
160
+ /**
161
+ * Internal: register a callback used to resolve cross-reel OCCUPIED
162
+ * cells to the originating big-symbol's id. Wired by `ReelSet` so this
163
+ * reel can answer "what id is at (myCol, row)?" even when the anchor is
164
+ * on a different reel.
165
+ *
166
+ * @internal
167
+ */
168
+ setCrossReelResolver(resolver: ((col: number, row: number) => string) | null): void;
169
+ /**
170
+ * Get symbol at a visible row (0-indexed from top visible).
171
+ * For non-anchor cells of a big symbol, walks up to the anchor row and
172
+ * returns the anchor symbol so animations target the actual visual.
173
+ */
82
174
  getSymbolAt(visibleRow: number): ReelSymbol;
175
+ /**
176
+ * Anchor row for a visible row. Equals `visibleRow` for normal cells;
177
+ * for non-anchor cells inside a big-symbol block, returns the row where
178
+ * the anchor lives.
179
+ *
180
+ * @internal — used by `ReelSet.getSymbolFootprint` and the cross-reel
181
+ * resolver wired in `ReelSet`'s constructor. Not intended for consumer
182
+ * use; prefer `ReelSet.getSymbolFootprint(col, row)` which returns full
183
+ * anchor + size info.
184
+ */
185
+ _getAnchorRow(visibleRow: number): number;
186
+ /**
187
+ * Record that the given visible row is the non-anchor cell of a big
188
+ * symbol whose anchor lives at `anchorRow`. Pass `null` to clear the
189
+ * occupancy mark.
190
+ *
191
+ * @internal — called by `_finalizeFrame` and the big-symbol coordinator.
192
+ */
193
+ _setOccupancy(visibleRow: number, anchorRow: number | null): void;
83
194
  /** Notify all visible symbols that the reel has started spinning. */
84
195
  notifySpinStart(): void;
85
196
  /** Notify all visible symbols that the reel is about to stop (just before bounce). */
86
197
  notifySpinEnd(): void;
87
198
  /** Notify all visible symbols that the reel has landed on its target. */
88
199
  notifyLanded(): void;
89
- /** Snap all symbols to grid. */
200
+ /**
201
+ * Snap all symbols to grid and finalize big-symbol layout. Called at the
202
+ * end of every stop sequence.
203
+ */
90
204
  snapToGrid(): void;
91
205
  /** Place symbols immediately at target positions (for skip/turbo). */
92
206
  placeSymbols(symbolIds: string[]): void;
207
+ /**
208
+ * @internal — MultiWays orchestration only.
209
+ *
210
+ * Commit a new visible-row count and per-reel cell height. Resizes every
211
+ * existing symbol on the strip to the new cell height, rebuilds the
212
+ * symbol array (extending or truncating buffers as needed), reshapes the
213
+ * motion layer, and recomputes `_reelHeight` from the new geometry so
214
+ * `reelHeight` stays consistent. Idempotent if the shape doesn't change.
215
+ *
216
+ * Only the engine should call this — `SpinController._applyReshape` is
217
+ * the single source of truth for reshape orchestration. Direct external
218
+ * calls are unsupported and may leave pin overlays, the cross-reel
219
+ * resolver, and the parent `ReelSet`'s shape state out of sync. Use
220
+ * `ReelSet.setShape()` instead, which gates this method on a MultiWays
221
+ * slot and migrates pins atomically.
222
+ */
223
+ reshape(newVisibleRows: number, newSymbolHeight: number, bufferAbove: number, bufferBelow: number): void;
93
224
  /**
94
225
  * Recompute `zIndex` for every symbol in the reel.
95
226
  *
@@ -106,5 +237,22 @@ export declare class Reel implements Disposable {
106
237
  private _setupSymbolPositions;
107
238
  private _onSymbolWrapped;
108
239
  private _replaceSymbol;
240
+ /**
241
+ * Acquire an OCCUPIED stub. Reuses any free stub stored locally; allocates
242
+ * a new one if none are available. Stubs are never returned to
243
+ * `SymbolFactory`.
244
+ */
245
+ private _acquireOccupiedStub;
246
+ private _releaseOccupiedStub;
247
+ /**
248
+ * After the visible target frame has been placed, scan visible rows to
249
+ * size big-symbol anchors and populate the OCCUPIED occupancy map.
250
+ *
251
+ * Called from `snapToGrid` and `placeSymbols` so it runs both for normal
252
+ * stop landing AND for skip/turbo. For non-anchor rows of a block, the
253
+ * anchor symbol is sized to span the block; the OCCUPIED stub at that
254
+ * row stays invisible underneath.
255
+ */
256
+ private _finalizeFrame;
109
257
  }
110
258
  //# sourceMappingURL=Reel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Reel.d.ts","sourceRoot":"","sources":["../../src/core/Reel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Reel.d.ts","sourceRoot":"","sources":["../../src/core/Reel.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,14 @@ export declare class ReelMotion {
37
37
  /** Get the correct Y position for a symbol at a given row. */
38
38
  getRowY(row: number): number;
39
39
  get slotHeight(): number;
40
+ /**
41
+ * Reshape the motion layer for a new visible-row count and cell height.
42
+ * Recomputes wrap bounds and the slot height. Called by `Reel.reshape()`
43
+ * during AdjustPhase on MultiWays slots. The symbol array is re-bound by
44
+ * `Reel.reshape()` directly via the same array reference, so this method
45
+ * doesn't take a new array.
46
+ */
47
+ reshape(symbolHeight: number, symbolGapY: number, bufferAbove: number, visibleRows: number): void;
40
48
  private _wrapBottomToTop;
41
49
  private _wrapTopToBottom;
42
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ReelMotion.d.ts","sourceRoot":"","sources":["../../src/core/ReelMotion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU;IAQnB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,gBAAgB;IAZ1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;gBAGZ,QAAQ,EAAE,UAAU,EAAE,EAC9B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EAC5B,WAAW,EAAE,MAAM,EACX,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI;IAStG;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY9B,mFAAmF;IACnF,UAAU,IAAI,IAAI;IAOlB,4EAA4E;IAC5E,gBAAgB,IAAI,IAAI;IAMxB,8DAA8D;IAC9D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,gBAAgB;CAUzB"}
1
+ {"version":3,"file":"ReelMotion.d.ts","sourceRoot":"","sources":["../../src/core/ReelMotion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU;IAQnB,OAAO,CAAC,QAAQ;IAGhB,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,gBAAgB;IAZ1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;gBAGZ,QAAQ,EAAE,UAAU,EAAE,EAC9B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EAC5B,WAAW,EAAE,MAAM,EACX,gBAAgB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI;IAStG;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY9B,mFAAmF;IACnF,UAAU,IAAI,IAAI;IAOlB,4EAA4E;IAC5E,gBAAgB,IAAI,IAAI;IAMxB,8DAA8D;IAC9D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;;OAMG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IASjG,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -69,7 +69,28 @@ export interface FrameAPI {
69
69
  * Teardown cascades: one `reelSet.destroy()` disposes every child.
70
70
  */
71
71
  export declare class ReelSet extends Container implements Disposable {
72
- /** zIndex applied to pin overlays so they render above the reel strip. */
72
+ /**
73
+ * zIndex applied to pin overlays so they render above the reel strip.
74
+ *
75
+ * **The library's z-index budget**, for reference if you author symbols
76
+ * that need to layer above defaults:
77
+ *
78
+ * | Layer | zIndex | Source |
79
+ * |---|---|---|
80
+ * | 1×1 symbol, default | `0 * 100 + arrayIndex` (~0–10) | `symbolData.zIndex ?? 0` |
81
+ * | 1×1 symbol, elevated (`zIndex: 1` on `symbolData`) | `1 * 100 + arrayIndex` (~100) | `symbolData.zIndex` |
82
+ * | Big-symbol anchor, default registration | `5 * 100 + arrayIndex` (~500) | recipe convention |
83
+ * | Pin overlay (sticky/expanding wild during spin) | `10000` | `PIN_OVERLAY_Z_INDEX` |
84
+ *
85
+ * The 100× multiplier on `symbolData.zIndex` leaves room for per-row
86
+ * stacking inside a layer (bottom rows render in front of top rows on
87
+ * the same layer). The 10000 ceiling on pin overlays is set very high
88
+ * so a consumer who sets `symbolData.zIndex: 50` (= 5000) still sits
89
+ * below pins. If you need to stack ABOVE pin overlays — e.g. a win-
90
+ * presenter symbol promotion — re-parent the symbol to
91
+ * `viewport.spotlightContainer`, which is its own DisplayObject layer
92
+ * above pin overlays.
93
+ */
73
94
  private static readonly PIN_OVERLAY_Z_INDEX;
74
95
  private _events;
75
96
  private _reels;
@@ -92,6 +113,29 @@ export declare class ReelSet extends Container implements Disposable {
92
113
  * removed from `_pins` (e.g. during unpin()).
93
114
  */
94
115
  private _pinOverlays;
116
+ /**
117
+ * MultiWays: target row counts for the next AdjustPhase. Recorded by
118
+ * `setShape()`, consumed by `SpinController` when it builds AdjustPhase
119
+ * configs. `null` means "no shape change pending".
120
+ */
121
+ private _targetShape;
122
+ /**
123
+ * True once `setResult()` has been called for the current spin. Reset on
124
+ * every `spin:start`. Used to enforce the contract that `setShape()`
125
+ * must be called BEFORE `setResult()` — calling it after corrupts the
126
+ * cached frames (pins were applied at their pre-migration rows; a later
127
+ * setShape would migrate them but the frames are already built).
128
+ */
129
+ private _resultSetForCurrentSpin;
130
+ /** Set at construction by the builder when `.multiways(...)` was called. */
131
+ private _isMultiWaysSlot;
132
+ private _multiwaysMinRows;
133
+ private _multiwaysMaxRows;
134
+ private _multiwaysReelPixelHeight;
135
+ /** Resolved per-symbol metadata (size, zIndex, etc). */
136
+ private _symbolsData;
137
+ /** Horizontal symbol gap (px). Used by `getBlockBounds` for big symbols. */
138
+ private _configGapX;
95
139
  constructor(params: ReelSetParams);
96
140
  /** The event emitter for reel-specific events. */
97
141
  get events(): EventEmitter<ReelSetEvents>;
@@ -135,6 +179,86 @@ export declare class ReelSet extends Container implements Disposable {
135
179
  */
136
180
  setDropOrder(order: 'ltr' | 'rtl' | 'all' | number[], stepMs?: number): void;
137
181
  get isSpinning(): boolean;
182
+ /** Whether this slot was built with `.multiways(...)`. */
183
+ get isMultiWaysSlot(): boolean;
184
+ /**
185
+ * MultiWays: record the row count each reel should land on this spin. The
186
+ * AdjustPhase between SPIN and STOP will reshape reels (resize symbols,
187
+ * reshape motion) before the stop sequence runs.
188
+ *
189
+ * Must be called between `spin()` and `setResult()`. The shape stays in
190
+ * effect for the current spin only — call again on every spin.
191
+ *
192
+ * Throws if:
193
+ * - this slot was not built with `.multiways(...)`
194
+ * - `rowsPerReel.length !== reelCount`
195
+ * - any entry falls outside `[multiways.minRows, multiways.maxRows]`
196
+ */
197
+ setShape(rowsPerReel: number[]): void;
198
+ /**
199
+ * Internal: read the pending MultiWays target shape (does not clear).
200
+ * Used by `SpinController` via the hooks interface. Not part of the
201
+ * public API — call `setShape()` to change shape.
202
+ *
203
+ * @internal
204
+ */
205
+ private _peekTargetShape;
206
+ /**
207
+ * Internal: clear the pending MultiWays target shape after the spin lands.
208
+ *
209
+ * @internal
210
+ */
211
+ private _clearTargetShape;
212
+ /**
213
+ * Resolved grid, with all OCCUPIED cells (same-reel and cross-reel)
214
+ * replaced by their anchor's symbol id. A 2×2 bonus reads as four
215
+ * `'bonus'` cells.
216
+ *
217
+ * Equivalent to `reelSet.reels.map(r => r.getVisibleSymbols())` because
218
+ * each reel has a cross-reel resolver wired in by ReelSet's constructor —
219
+ * the per-reel surface and the grid surface are the same.
220
+ */
221
+ getVisibleGrid(): string[][];
222
+ /**
223
+ * Footprint of the symbol at `(col, row)`.
224
+ *
225
+ * - 1×1 symbols: `{ anchor: { col, row }, size: { w: 1, h: 1 } }`.
226
+ * - Big symbols: returns the anchor cell and block size.
227
+ * - OCCUPIED cells: resolves transparently to the anchor.
228
+ *
229
+ * Useful for win presenters that need to highlight a whole NxM block.
230
+ */
231
+ getSymbolFootprint(col: number, row: number): {
232
+ anchor: {
233
+ col: number;
234
+ row: number;
235
+ };
236
+ size: {
237
+ w: number;
238
+ h: number;
239
+ };
240
+ };
241
+ /**
242
+ * Pixel rectangle covering a big symbol's whole `N×M` block, in
243
+ * ReelSet-local coordinates. Returns the anchor cell's bounds for 1×1
244
+ * symbols. Pass any cell of a block — anchor or non-anchor — and you
245
+ * get the same rect.
246
+ *
247
+ * Useful for win presenters drawing an outline around a whole bonus, or
248
+ * any overlay aligned to the visible footprint of a big symbol:
249
+ *
250
+ * ```ts
251
+ * const rect = reelSet.getBlockBounds(2, 1);
252
+ * gfx.rect(rect.x, rect.y, rect.width, rect.height)
253
+ * .stroke({ color: 0xff6b35, width: 4 });
254
+ * reelSet.addChild(gfx);
255
+ * ```
256
+ *
257
+ * For 1×1 cells this is equivalent to `getCellBounds(col, row)`. For
258
+ * big-symbol cells it multiplies width/height by the block size and
259
+ * starts from the anchor cell's bounds.
260
+ */
261
+ getBlockBounds(col: number, row: number): CellBounds;
138
262
  /** Speed profile manager. */
139
263
  get speed(): SpeedManager;
140
264
  /** Change speed and emit event. */
@@ -248,6 +372,15 @@ export declare class ReelSet extends Container implements Disposable {
248
372
  * (fast path; identical behaviour to pre-pin code).
249
373
  */
250
374
  private _applyPinsToGrid;
375
+ /** Pins on a given reel, in row order. Used by AdjustPhase migration. */
376
+ private _pinsOnReel;
377
+ /**
378
+ * MultiWays: relocate pins on a reel for a new visible-row count. The new
379
+ * row is computed as `min(originRow, newRows - 1)` — clamped only when
380
+ * the origin no longer fits. Returns the migrated pins so AdjustPhase
381
+ * can build tween descriptors. Mutates the pins map in place.
382
+ */
383
+ private _migratePinsForReel;
251
384
  /**
252
385
  * Apply a pin to the idle reel's visible display immediately. Used when
253
386
  * `pin()` is called while no spin is in flight — the grid updates right
@@ -274,6 +407,28 @@ export declare class ReelSet extends Container implements Disposable {
274
407
  * (e.g. setting a Spine track).
275
408
  */
276
409
  private _ensurePinOverlay;
410
+ /**
411
+ * Reposition + resize every pin overlay on the given reel.
412
+ *
413
+ * The engine calls this automatically after every MultiWays AdjustPhase
414
+ * reshape (and from the skip path), so applications that just use
415
+ * `setShape()` / `setResult()` never need to invoke it. **Call it
416
+ * yourself only if** you mutate `Reel.symbolWidth`, `Reel.symbolHeight`,
417
+ * or a pin's row outside the normal MultiWays flow — e.g. a custom
418
+ * mid-spin layout swap that bypasses `AdjustPhase`.
419
+ *
420
+ * No-op for reels with no active pin overlays.
421
+ */
422
+ refreshPinOverlaysForReel(reelIndex: number): void;
423
+ /**
424
+ * Internal: build AdjustPhase pin-overlay tween descriptors for a reel.
425
+ * Captures the overlays' CURRENT on-screen Y + size as the tween's
426
+ * `from` state, then computes the post-reshape `to` state from the
427
+ * pin's already-migrated row + the upcoming cell height. Called BEFORE
428
+ * AdjustPhase commits the reshape, so the snapshot reflects what the
429
+ * player actually sees.
430
+ */
431
+ private _buildPinOverlayTweens;
277
432
  /**
278
433
  * Destroy a single pin's overlay, if present. Fires
279
434
  * `pin:overlayDestroyed` BEFORE the overlay is released to the pool, so
@@ -1 +1 @@
1
- {"version":3,"file":"ReelSet.d.ts","sourceRoot":"","sources":["../../src/core/ReelSet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReelSet.d.ts","sourceRoot":"","sources":["../../src/core/ReelSet.ts"],"names":[],"mappings":"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"}