@slot-engine/core 0.2.8 → 0.2.9

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/dist/index.d.mts CHANGED
@@ -822,7 +822,7 @@ declare class RandomNumberGenerator {
822
822
  setSeedIfDifferent(seed: number): void;
823
823
  generateRandomNumber(): number;
824
824
  randomFloat(low: number, high: number): number;
825
- weightedRandom<T extends Record<string, number>>(weights: T): string;
825
+ weightedRandom<T extends Record<string, number>>(weights: T): Extract<keyof T, string>;
826
826
  randomItem<T>(array: T[]): NonNullable<T>;
827
827
  shuffle<T>(array: T[]): T[];
828
828
  }
@@ -981,7 +981,7 @@ declare class RngService<TGameModes extends AnyGameModes = AnyGameModes, TSymbol
981
981
  /**
982
982
  * Random weighted selection from a set of items.
983
983
  */
984
- weightedRandom: <T extends Record<string, number>>(weights: T) => string;
984
+ weightedRandom: <T extends Record<string, number>>(weights: T) => Extract<keyof T, string>;
985
985
  /**
986
986
  * Selects a random item from an array.
987
987
  */
package/dist/index.d.ts CHANGED
@@ -822,7 +822,7 @@ declare class RandomNumberGenerator {
822
822
  setSeedIfDifferent(seed: number): void;
823
823
  generateRandomNumber(): number;
824
824
  randomFloat(low: number, high: number): number;
825
- weightedRandom<T extends Record<string, number>>(weights: T): string;
825
+ weightedRandom<T extends Record<string, number>>(weights: T): Extract<keyof T, string>;
826
826
  randomItem<T>(array: T[]): NonNullable<T>;
827
827
  shuffle<T>(array: T[]): T[];
828
828
  }
@@ -981,7 +981,7 @@ declare class RngService<TGameModes extends AnyGameModes = AnyGameModes, TSymbol
981
981
  /**
982
982
  * Random weighted selection from a set of items.
983
983
  */
984
- weightedRandom: <T extends Record<string, number>>(weights: T) => string;
984
+ weightedRandom: <T extends Record<string, number>>(weights: T) => Extract<keyof T, string>;
985
985
  /**
986
986
  * Selects a random item from an array.
987
987
  */
package/dist/index.js CHANGED
@@ -238,15 +238,14 @@ var RandomNumberGenerator = class {
238
238
  return float * (high - low) + low;
239
239
  }
240
240
  weightedRandom(weights) {
241
- const totalWeight = Object.values(weights).reduce(
242
- (sum, weight) => sum + weight,
243
- 0
244
- );
245
- const randomValue = this.randomFloat(0, 1) * totalWeight;
246
- let cumulativeWeight = 0;
247
- for (const [key, weight] of Object.entries(weights)) {
248
- cumulativeWeight += weight;
249
- if (randomValue < cumulativeWeight) {
241
+ let totalWeight = 0;
242
+ for (const key in weights) {
243
+ totalWeight += weights[key];
244
+ }
245
+ let remaining = this.randomFloat(0, 1) * totalWeight;
246
+ for (const key in weights) {
247
+ remaining -= weights[key];
248
+ if (remaining < 0) {
250
249
  return key;
251
250
  }
252
251
  }
@@ -551,27 +550,23 @@ var Board = class {
551
550
  countSymbolsOnBoard(symbolOrProperties) {
552
551
  let total = 0;
553
552
  const onReel = {};
553
+ const isGameSymbol = symbolOrProperties instanceof GameSymbol;
554
554
  for (const [ridx, reel] of this.reels.entries()) {
555
555
  for (const symbol of reel) {
556
- let matches = true;
557
- if (symbolOrProperties instanceof GameSymbol) {
558
- if (symbol.id !== symbolOrProperties.id) matches = false;
556
+ if (isGameSymbol) {
557
+ if (symbol.id !== symbolOrProperties.id) continue;
559
558
  } else {
559
+ let matches = true;
560
560
  for (const [key, value] of Object.entries(symbolOrProperties)) {
561
561
  if (!symbol.properties.has(key) || symbol.properties.get(key) !== value) {
562
562
  matches = false;
563
563
  break;
564
564
  }
565
565
  }
566
+ if (!matches) continue;
566
567
  }
567
- if (matches) {
568
- total++;
569
- if (onReel[ridx] === void 0) {
570
- onReel[ridx] = 1;
571
- } else {
572
- onReel[ridx]++;
573
- }
574
- }
568
+ total++;
569
+ onReel[ridx] = (onReel[ridx] || 0) + 1;
575
570
  }
576
571
  }
577
572
  return [total, onReel];
@@ -670,8 +665,9 @@ var Board = class {
670
665
  ...opts,
671
666
  ...this.reelsLocked.length && { reelsLocked: this.reelsLocked }
672
667
  });
673
- const reelsAmount = opts.reelsAmount ?? opts.ctx.services.game.getCurrentGameMode().reelsAmount;
674
- const symbolsPerReel = opts.symbolsPerReel ?? opts.ctx.services.game.getCurrentGameMode().symbolsPerReel;
668
+ const gameMode = opts.ctx.services.game.getCurrentGameMode();
669
+ const reelsAmount = opts.reelsAmount ?? gameMode.reelsAmount;
670
+ const symbolsPerReel = opts.symbolsPerReel ?? gameMode.symbolsPerReel;
675
671
  const padSymbols = opts.padSymbols ?? opts.ctx.config.padSymbols;
676
672
  const finalReelStops = Array.from(
677
673
  { length: reelsAmount },
@@ -714,15 +710,16 @@ var Board = class {
714
710
  this.lastUsedReels = opts.reels;
715
711
  for (let ridx = 0; ridx < reelsAmount; ridx++) {
716
712
  const reelPos = finalReelStops[ridx];
717
- const reelLength = opts.reels[ridx].length;
713
+ const reel = opts.reels[ridx];
714
+ const reelLength = reel.length;
718
715
  for (let p = padSymbols - 1; p >= 0; p--) {
719
716
  const topPos = ((reelPos - (p + 1)) % reelLength + reelLength) % reelLength;
720
- this.paddingTop[ridx].push(opts.reels[ridx][topPos].clone());
717
+ this.paddingTop[ridx].push(reel[topPos].clone());
721
718
  const bottomPos = (reelPos + symbolsPerReel[ridx] + p) % reelLength;
722
- this.paddingBottom[ridx].unshift(opts.reels[ridx][bottomPos].clone());
719
+ this.paddingBottom[ridx].unshift(reel[bottomPos].clone());
723
720
  }
724
721
  for (let row = 0; row < symbolsPerReel[ridx]; row++) {
725
- const symbol = opts.reels[ridx][(reelPos + row) % reelLength];
722
+ const symbol = reel[(reelPos + row) % reelLength];
726
723
  if (!symbol) {
727
724
  throw new Error(`Failed to get symbol at pos ${reelPos + row} on reel ${ridx}`);
728
725
  }
@@ -738,8 +735,9 @@ var Board = class {
738
735
  }
739
736
  tumbleBoard(opts) {
740
737
  (0, import_assert3.default)(this.lastDrawnReelStops.length > 0, "Cannot tumble board before drawing it.");
741
- const reelsAmount = opts.reelsAmount ?? opts.ctx.services.game.getCurrentGameMode().reelsAmount;
742
- const symbolsPerReel = opts.symbolsPerReel ?? opts.ctx.services.game.getCurrentGameMode().symbolsPerReel;
738
+ const gameMode = opts.ctx.services.game.getCurrentGameMode();
739
+ const reelsAmount = opts.reelsAmount ?? gameMode.reelsAmount;
740
+ const symbolsPerReel = opts.symbolsPerReel ?? gameMode.symbolsPerReel;
743
741
  const padSymbols = opts.padSymbols ?? opts.ctx.config.padSymbols;
744
742
  if (opts.startingStops) {
745
743
  (0, import_assert3.default)(
@@ -785,11 +783,12 @@ var Board = class {
785
783
  const stopBeforePad = previousStop - padSymbols - 1;
786
784
  const symbolsNeeded = symbolsPerReel[ridx] - this.reels[ridx].length;
787
785
  for (let s = 0; s < symbolsNeeded; s++) {
788
- const symbolPos = (stopBeforePad - s + reels[ridx].length) % reels[ridx].length;
789
- let newSymbol = reels[ridx][symbolPos];
786
+ const reel = reels[ridx];
787
+ const symbolPos = (stopBeforePad - s + reel.length) % reel.length;
788
+ let newSymbol = reel[symbolPos];
790
789
  const startStops = opts.startingStops;
791
790
  if (startStops) {
792
- const forcedSym = reels[ridx][startStops?.[ridx]];
791
+ const forcedSym = reel[startStops?.[ridx]];
793
792
  (0, import_assert3.default)(
794
793
  forcedSym,
795
794
  `Failed to get forced symbol for tumbling. Tried to get symbol for position ${startStops?.[ridx]} on reel ${ridx}.`
@@ -810,8 +809,9 @@ var Board = class {
810
809
  const firstSymbolPos = newFirstSymbolPositions[ridx];
811
810
  if (firstSymbolPos === void 0) continue;
812
811
  for (let p = 1; p <= padSymbols; p++) {
813
- const topPos = (firstSymbolPos - p + reels[ridx].length) % reels[ridx].length;
814
- const padSymbol = reels[ridx][topPos]?.clone();
812
+ const reel = reels[ridx];
813
+ const topPos = (firstSymbolPos - p + reel.length) % reel.length;
814
+ const padSymbol = reel[topPos]?.clone();
815
815
  (0, import_assert3.default)(padSymbol, "Failed to get new padding symbol for tumbling.");
816
816
  this.paddingTop[ridx].unshift(padSymbol);
817
817
  if (!newPaddingTopSymbols[ridx]) {
@@ -4300,7 +4300,7 @@ var ManywaysWinType = class extends WinType {
4300
4300
  possibleWaysWins.set(baseSymbol.id, symbolList);
4301
4301
  }
4302
4302
  }
4303
- for (const [baseSymbolId, symbolList] of possibleWaysWins.entries()) {
4303
+ for (const [, symbolList] of possibleWaysWins.entries()) {
4304
4304
  const wayLength = this.getWayLength(symbolList);
4305
4305
  let baseSymbol = Object.values(symbolList).flatMap((l) => l.map((s) => s)).find((s) => !this.isWild(s.symbol))?.symbol;
4306
4306
  if (!baseSymbol) baseSymbol = symbolList[Object.keys(symbolList)[0]][0].symbol;