slotify.js
Version:
A video slot game session framework for JavaScript
293 lines (292 loc) • 12.3 kB
JavaScript
"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;