UNPKG

slotify.js

Version:

A video slot game session framework for JavaScript

293 lines (292 loc) 12.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ReelGameSessionWinCalculator = void 0; var ReelGameSessionWinningScatterModel_1 = require("./ReelGameSessionWinningScatterModel"); var ReelGameSessionWinningLineModel_1 = require("./ReelGameSessionWinningLineModel"); var ReelGameSessionWinCalculator = /** @class */ (function () { function ReelGameSessionWinCalculator(conf) { this._items = []; this._winningLines = {}; this._winningScatters = {}; this._linesWinning = 0; this._scattersWinning = 0; this._config = conf; this._reelsItemsNumber = conf.reelsItemsNumber; this._reelsNumber = conf.reelsNumber; this._wildItemId = conf.wildItemId; this._scatters = conf.scatters; this._linesDirections = conf.linesDirections; this._wildsMultipliers = conf.wildsMultipliers; this._paytable = conf.paytable; this._linesPatterns = ReelGameSessionWinCalculator.createLinesPatterns(this._reelsNumber); } ReelGameSessionWinCalculator.createLinesPatterns = function (reelsNumber) { var r = []; for (var i = 0; i < reelsNumber - 1; i++) { var arr = new Array(reelsNumber + 1) .join("0") .split("") .map(function (item) { return parseInt(item, 10); }); for (var j = 0; j < reelsNumber - i; j++) { arr[j] = 1; } r.push(arr); } return r; }; ReelGameSessionWinCalculator.getItemsForDirection = function (items, direction) { var r; r = direction.map(function (row, col) { return items[col][row]; }); return r; }; ReelGameSessionWinCalculator.getItemsMatchingPattern = function (items, pattern) { return pattern.reduce(function (arr, val, i) { if (val === 1) { arr.push(items[i]); } return arr; }, []); }; ReelGameSessionWinCalculator.getMatchingPattern = function (items, patterns, wildItemId) { var r = []; for (var _i = 0, patterns_1 = patterns; _i < patterns_1.length; _i++) { var pattern = patterns_1[_i]; if (this.isMatchPattern(items, pattern, wildItemId)) { r = pattern; break; } } return r; }; ReelGameSessionWinCalculator.isMatchPattern = function (items, pattern, wildItemId) { if (wildItemId === void 0) { wildItemId = ""; } var itemsByPattern = this.getItemsMatchingPattern(items, pattern); var unique = itemsByPattern.filter(function (value, index, self) { return self.indexOf(value) === index; }); return unique.length === 1 || (unique.length === 2 && unique.indexOf(wildItemId) >= 0); }; ReelGameSessionWinCalculator.getWinningItemId = function (items, pattern, wildItemId) { var itemsByPattern = this.getItemsMatchingPattern(items, pattern); var unique = itemsByPattern.filter(function (value, index, self) { return self.indexOf(value) === index; }); return unique.reduce(function (prev, cur) { if (cur !== wildItemId) { prev = cur; } return prev; }); }; ReelGameSessionWinCalculator.getWildItemsPositions = function (items, pattern, wildItemId) { return items.reduce(function (arr, item, i) { if (item === wildItemId && pattern[i] === 1) { arr.push(i); } return arr; }, []); }; ReelGameSessionWinCalculator.getScatterItemsPositions = function (items, scatterItemId) { var r = []; for (var i = 0; i < items.length; i++) { for (var j = 0; j < items[i].length; j++) { if (items[i][j] === scatterItemId) { r.push([i, j]); } } } return r; }; ReelGameSessionWinCalculator.getWinningLinesIds = function (items, linesDirections, patterns, wildItemId) { return Object.keys(linesDirections).reduce(function (arr, lineId) { var itemsLine = ReelGameSessionWinCalculator.getItemsForDirection(items, linesDirections[lineId]); var mPattern = ReelGameSessionWinCalculator.getMatchingPattern(itemsLine, patterns, wildItemId); if (mPattern.length > 0) { arr.push(lineId); } return arr; }, []); }; ReelGameSessionWinCalculator.getLinesWithSymbol = function (lines, symbolId) { // TODO test var r = []; for (var _i = 0, _a = Object.values(lines); _i < _a.length; _i++) { var line = _a[_i]; if (line.itemId === symbolId) { r.push(line); } } return r; }; ReelGameSessionWinCalculator.getLinesWithDifferentSymbols = function (lines) { // TODO test var symbols = []; var r = []; for (var _i = 0, _a = Object.values(lines); _i < _a.length; _i++) { var line = _a[_i]; if (symbols.indexOf(line.itemId) < 0) { symbols.push(line.itemId); r.push(line); } } return r; }; ReelGameSessionWinCalculator.isAllLinesHasSameItemId = function (lines) { // TODO test var id; var r = true; for (var _i = 0, _a = Object.values(lines); _i < _a.length; _i++) { var line = _a[_i]; if (!id) { id = line.itemId; continue; } if (Object.keys(line).length > 1 && id !== line.itemId) { r = false; break; } } return r; }; ReelGameSessionWinCalculator.getLinesContainingItem = function (lines, items, itemId) { // TODO test var r = []; for (var _i = 0, _a = Object.values(lines); _i < _a.length; _i++) { var line = _a[_i]; var lineItems = ReelGameSessionWinCalculator.getItemsForDirection(items, line.direction); for (var _b = 0, lineItems_1 = lineItems; _b < lineItems_1.length; _b++) { var item = lineItems_1[_b]; if (item === itemId) { r.push(line); break; } } } return r; }; ReelGameSessionWinCalculator.prototype.getWinningAmount = function () { return this.getLinesWinning() + this.getScattersWinning(); }; ReelGameSessionWinCalculator.prototype.getLinesWinning = function () { return this._linesWinning; }; ReelGameSessionWinCalculator.prototype.getScattersWinning = function () { return this._scattersWinning; }; ReelGameSessionWinCalculator.prototype.setGameState = function (bet, items) { if (this._paytable.hasOwnProperty(bet)) { this._items = items; this.calculateWinning(bet); } else { throw new Error("Bet " + bet + " does not specified at paytable"); } }; ReelGameSessionWinCalculator.prototype.getWinningLines = function () { return this._winningLines; }; ReelGameSessionWinCalculator.prototype.getWinningScatters = function () { return this._winningScatters; }; ReelGameSessionWinCalculator.prototype.calculateWinning = function (bet) { var _this = this; var lineId; var line; var winningLinesIds; this._winningLines = {}; this._linesWinning = 0; winningLinesIds = ReelGameSessionWinCalculator.getWinningLinesIds(this._items, this._linesDirections, this._linesPatterns, this._wildItemId); for (var _i = 0, winningLinesIds_1 = winningLinesIds; _i < winningLinesIds_1.length; _i++) { lineId = winningLinesIds_1[_i]; line = this.generateWinningLine(bet, lineId); if (this._config.scatters.filter(function (scatterData) { return scatterData[0] === line.itemId; }).length === 0 && line.winningAmount > 0) { this._winningLines[lineId] = line; this._linesWinning += line.winningAmount; } } this._scattersWinning = 0; this._winningScatters = this.generateWinningScatters(bet); Object.keys(this._winningScatters).forEach(function (scatterId) { _this._scattersWinning += _this._winningScatters[scatterId].winningAmount; }); }; ReelGameSessionWinCalculator.prototype.generateWinningScatters = function (bet) { var rv; var scatter; var i; var curScatterItemsPositions; var curScatterItemId; var curScatterMinItemsForWin; var curScatterModel; rv = {}; if (this._scatters) { for (i = 0; i < this._scatters.length; i++) { scatter = this._scatters[i]; curScatterItemId = scatter[0]; curScatterMinItemsForWin = scatter[1]; curScatterItemsPositions = this.getScatterItemsPositions(curScatterItemId); if (curScatterItemsPositions && curScatterItemsPositions.length >= curScatterMinItemsForWin) { curScatterModel = new ReelGameSessionWinningScatterModel_1.ReelGameSessionWinningScatterModel(); curScatterModel.itemId = curScatterItemId; curScatterModel.itemsPositions = curScatterItemsPositions; curScatterModel.winningAmount = this.getScatterWinningAmount(bet, curScatterModel); rv[curScatterModel.itemId] = curScatterModel; } } } return rv; }; ReelGameSessionWinCalculator.prototype.getScatterItemsPositions = function (itemId) { return ReelGameSessionWinCalculator.getScatterItemsPositions(this._items, itemId); }; ReelGameSessionWinCalculator.prototype.generateWinningLine = function (bet, lineId) { var line; var direction; var itemsLine; var pattern; direction = this._linesDirections[lineId]; itemsLine = ReelGameSessionWinCalculator.getItemsForDirection(this._items, direction); pattern = ReelGameSessionWinCalculator.getMatchingPattern(itemsLine, this._linesPatterns, this._wildItemId); line = new ReelGameSessionWinningLineModel_1.ReelGameSessionWinningLineModel(); line.winningAmount = 0; line.direction = direction; line.lineId = lineId; line.itemsPositions = pattern.reduce(function (arr, val, i) { if (val === 1) { arr.push(i); } return arr; }, []); line.wildItemsPositions = ReelGameSessionWinCalculator.getWildItemsPositions(itemsLine, pattern, this._wildItemId); line.itemId = ReelGameSessionWinCalculator.getWinningItemId(itemsLine, pattern, this._wildItemId); line.winningAmount = this.getLineWinningAmount(bet, line); return line; }; ReelGameSessionWinCalculator.prototype.getLineWinningAmount = function (bet, line) { var rv = 0; if (this._paytable[bet] && this._paytable[bet][line.itemId] && this._paytable[bet][line.itemId][line.itemsPositions.length]) { rv = this._paytable[bet][line.itemId][line.itemsPositions.length] * (this._wildsMultipliers.hasOwnProperty(line.wildItemsPositions.length) ? this._wildsMultipliers[line.wildItemsPositions.length] : 1); } return rv; }; ReelGameSessionWinCalculator.prototype.getScatterWinningAmount = function (bet, model) { var rv; if (this._paytable[bet] && this._paytable[bet][model.itemId] && this._paytable[bet][model.itemId][model.itemsPositions.length]) { rv = this._paytable[bet][model.itemId][model.itemsPositions.length]; } else { rv = 0; } return rv; }; return ReelGameSessionWinCalculator; }()); exports.ReelGameSessionWinCalculator = ReelGameSessionWinCalculator;