pokie
Version:
A server-side video slot game logic framework for JavaScript and TypeScript.
85 lines • 4.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.VideoSlotWinCalculator = void 0;
const pokie_1 = require("pokie");
class VideoSlotWinCalculator {
constructor(conf) {
this.winningLines = {};
this.winningScatters = {};
this.config = conf;
}
calculateWin(bet, symbolsCombination) {
if (this.config.getAvailableBets().some((availableBet) => availableBet === bet)) {
this.symbolsCombination = symbolsCombination;
this.calculateWinningLinesAndScatters(bet);
}
else {
throw new Error(`Bet ${bet} is not specified at paytable`);
}
}
getWinningLines() {
return this.winningLines;
}
getWinningScatters() {
return this.winningScatters;
}
getWinAmount() {
return this.getLinesWinning() + this.getScattersWinning();
}
getLinesWinning() {
return Object.values(this.getWinningLines()).reduce((sum, line) => sum + line.getWinAmount(), 0);
}
getScattersWinning() {
return Object.values(this.getWinningScatters()).reduce((sum, scatter) => sum + scatter.getWinAmount(), 0);
}
calculateWinningLinesAndScatters(bet) {
let line;
this.winningLines = {};
const winningLinesIds = pokie_1.SymbolsCombinationsAnalyzer.getWinningLinesIds(this.symbolsCombination.toMatrix(), this.config.getLinesDefinitions(), this.config.getLinesPatterns().toArray(), this.config.getWildSymbols());
winningLinesIds.forEach((lineId) => {
line = this.generateWinningLine(bet, lineId);
if (!this.config.getScatterSymbols().some((scatter) => scatter === line.getSymbolId()) &&
line.getWinAmount() > 0) {
this.winningLines[line.getLineId()] = line;
}
});
this.winningScatters = this.generateWinningScatters(bet);
}
generateWinningLine(bet, lineId) {
const definition = this.config.getLinesDefinitions().getLineDefinition(lineId);
const symbolsLine = pokie_1.SymbolsCombinationsAnalyzer.getSymbolsForDefinition(this.symbolsCombination.toMatrix(), definition);
const pattern = pokie_1.SymbolsCombinationsAnalyzer.getMatchingPattern(symbolsLine, this.config.getLinesPatterns().toArray(), this.config.getWildSymbols());
const symbolsPositions = pattern.reduce((acc, value, index) => {
if (value === 1) {
acc.push(index);
}
return acc;
}, []);
const symbolId = pokie_1.SymbolsCombinationsAnalyzer.getWinningSymbolId(symbolsLine, pattern, this.config.getWildSymbols());
const wildSymbolsPositions = pokie_1.SymbolsCombinationsAnalyzer.getWildSymbolsPositions(symbolsLine, pattern, this.config.getWildSymbols());
const winAmount = this.getWinAmountForSymbol(bet, symbolId, symbolsPositions.length);
return new pokie_1.WinningLine(winAmount, definition, pattern, lineId, symbolsPositions, wildSymbolsPositions, symbolId);
}
getWinAmountForSymbol(bet, symbolId, numOfWinningSymbols) {
return this.config.getPaytable().getWinAmountForSymbol(symbolId, numOfWinningSymbols, bet);
}
generateWinningScatters(bet) {
const rv = {};
if (this.config.getScatterSymbols() !== null) {
for (const scatter of this.config.getScatterSymbols()) {
const curScatterSymbolId = scatter;
const curScatterSymbolsPositions = this.getScatterSymbolsPositions(curScatterSymbolId);
const winAmount = this.getWinAmountForSymbol(bet, curScatterSymbolId, curScatterSymbolsPositions.length);
if (winAmount > 0) {
rv[curScatterSymbolId] = new pokie_1.WinningScatter(curScatterSymbolId, curScatterSymbolsPositions, winAmount);
}
}
}
return rv;
}
getScatterSymbolsPositions(symbolId) {
return pokie_1.SymbolsCombinationsAnalyzer.getScatterSymbolsPositions(this.symbolsCombination.toMatrix(), symbolId);
}
}
exports.VideoSlotWinCalculator = VideoSlotWinCalculator;
//# sourceMappingURL=VideoSlotWinCalculator.js.map