UNPKG

pokie

Version:

A server-side video slot game logic framework for JavaScript and TypeScript.

85 lines (74 loc) 3.27 kB
import {PaytableRepresenting} from "pokie"; export class Paytable implements PaytableRepresenting { private paytableMap: Record<number, Record<string, Record<number, number>>>; constructor(availableBets: number[], availableSymbols?: string[], wildSymbols?: string[], reelsNumber?: number) { this.paytableMap = Paytable.createDefaultPaytableMap(availableBets, availableSymbols, wildSymbols, reelsNumber); } private static createDefaultPaytableMap( availableBets: number[], availableSymbols?: string[], wildSymbols?: string[], reelsNumber?: number, ): Record<number, Record<string, Record<number, number>>> { const paytableMap: Record<number, Record<string, Record<number, number>>> = {}; for (const bet of availableBets) { paytableMap[bet] = {}; if (availableSymbols) { for (const symbolId of availableSymbols) { if (!wildSymbols?.some((wildSymbolId) => symbolId === wildSymbolId)) { paytableMap[bet][symbolId] = {}; if (reelsNumber !== undefined) { for (let k = 3; k <= reelsNumber; k++) { paytableMap[bet][symbolId][k] = (k - 2) * bet; } } } } } } return paytableMap; } public getWinAmountForSymbol(symbolId: string, numberOfSymbols: number, bet: number): number { let rv = 0; if ( this.paytableMap[bet] && this.paytableMap[bet][symbolId] && this.paytableMap[bet][symbolId][numberOfSymbols] ) { rv = this.paytableMap[bet][symbolId][numberOfSymbols]; } return rv; } public getAvailableBets(): number[] { return Object.keys(this.paytableMap).map((key) => parseInt(key, 10)); } public getNumbersOfSymbolsForBet(bet: number, symbolId: string): number[] { return Object.keys(this.paytableMap[bet][symbolId]).map((num) => parseInt(num, 10)); } public toMap(): Record<number, Record<string, Record<number, number>>> { return JSON.parse(JSON.stringify(this.paytableMap)); } public getAvailableSymbolsForBet(bet: number): string[] { return Object.keys(this.paytableMap[bet]); } public setPayoutForSymbol(symbolId: string, times: number, betMultiplier: number, bet?: number) { if (bet !== undefined) { this.paytableMap[bet][symbolId][times] = betMultiplier * bet; } else { Object.keys(this.paytableMap).forEach((bet) => { const intBet = parseInt(bet, 10); if (!this.paytableMap[bet]) { this.paytableMap[bet] = {}; } if (!this.paytableMap[bet][symbolId]) { this.paytableMap[bet][symbolId] = {}; } this.paytableMap[bet][symbolId][times] = betMultiplier * intBet; }); } } public fromMap(map: Record<number, Record<string, Record<number, number>>>): this { this.paytableMap = JSON.parse(JSON.stringify(map)); return this; } }