@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 +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +34 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
557
|
-
|
|
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
|
-
|
|
568
|
-
|
|
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
|
|
674
|
-
const
|
|
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
|
|
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(
|
|
717
|
+
this.paddingTop[ridx].push(reel[topPos].clone());
|
|
721
718
|
const bottomPos = (reelPos + symbolsPerReel[ridx] + p) % reelLength;
|
|
722
|
-
this.paddingBottom[ridx].unshift(
|
|
719
|
+
this.paddingBottom[ridx].unshift(reel[bottomPos].clone());
|
|
723
720
|
}
|
|
724
721
|
for (let row = 0; row < symbolsPerReel[ridx]; row++) {
|
|
725
|
-
const symbol =
|
|
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
|
|
742
|
-
const
|
|
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
|
|
789
|
-
|
|
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 =
|
|
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
|
|
814
|
-
const
|
|
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 [
|
|
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;
|