UNPKG

pokie

Version:

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

195 lines (160 loc) 6.05 kB
import { LinesDefinitionsDescribing, LinesPatternsDescribing, PaytableRepresenting, SymbolsCombinationDescribing, SymbolsCombinationsGenerating, SymbolsCombinationsGenerator, SymbolsSequenceDescribing, VideoSlotSession, VideoSlotSessionHandling, VideoSlotWinCalculating, VideoSlotWinCalculator, VideoSlotWithFreeGamesConfig, VideoSlotWithFreeGamesConfigRepresenting, VideoSlotWithFreeGamesSessionHandling, WinningLineDescribing, WinningScatterDescribing, } from "pokie"; export class VideoSlotWithFreeGamesSession implements VideoSlotWithFreeGamesSessionHandling { private readonly baseSession: VideoSlotSessionHandling; private readonly config: VideoSlotWithFreeGamesConfigRepresenting; private freeGamesNum = 0; private freeGamesSum = 0; private freeBank = 0; constructor( config: VideoSlotWithFreeGamesConfigRepresenting = new VideoSlotWithFreeGamesConfig(), combinationsGenerator: SymbolsCombinationsGenerating = new SymbolsCombinationsGenerator(config), winCalculator: VideoSlotWinCalculating = new VideoSlotWinCalculator(config), baseSession: VideoSlotSessionHandling = new VideoSlotSession(config, combinationsGenerator, winCalculator), ) { this.baseSession = baseSession; this.config = config; } public getWonFreeGamesNumber(): number { let rv = 0; const wonScatters = this.getWinningScatters(); for (const scatterModel of Object.values(wonScatters)) { const freeGamesForScatters = this.config.getFreeGamesForScatters( scatterModel.getSymbolId(), scatterModel.getSymbolsPositions().length, ); if (freeGamesForScatters > 0) { rv += freeGamesForScatters; } } return rv; } public getFreeGamesNum(): number { return this.freeGamesNum; } public setFreeGamesNum(value: number): void { this.freeGamesNum = value; } public getFreeGamesSum(): number { return this.freeGamesSum; } public setFreeGamesSum(value: number): void { this.freeGamesSum = value; } public getFreeGamesBank(): number { return this.freeBank; } public setFreeGamesBank(value: number): void { this.freeBank = value; } public getPaytable(): PaytableRepresenting { return this.config.getPaytable(); } public getSymbolsCombination(): SymbolsCombinationDescribing { return this.baseSession.getSymbolsCombination(); } public getWinningLines(): Record<number, WinningLineDescribing> { return this.baseSession.getWinningLines(); } public getWinningScatters(): Record<string, WinningScatterDescribing> { return this.baseSession.getWinningScatters(); } public getSymbolsSequences(): SymbolsSequenceDescribing[] { return this.baseSession.getSymbolsSequences(); } public getReelsSymbolsNumber(): number { return this.baseSession.getReelsSymbolsNumber(); } public getReelsNumber(): number { return this.baseSession.getReelsNumber(); } public getAvailableSymbols(): string[] { return this.baseSession.getAvailableSymbols(); } public getCreditsAmount(): number { return this.baseSession.getCreditsAmount(); } public setCreditsAmount(creditsAmount: number): void { this.baseSession.setCreditsAmount(creditsAmount); } public getWinAmount(): number { return this.baseSession.getWinAmount(); } public getAvailableBets(): number[] { return this.baseSession.getAvailableBets(); } public getBet(): number { return this.baseSession.getBet(); } public setBet(bet: number): void { this.baseSession.setBet(bet); } public canPlayNextGame(): boolean { return this.baseSession.canPlayNextGame(); } public play(): void { if (this.getFreeGamesNum() === this.getFreeGamesSum()) { this.setFreeGamesBank(0); this.setFreeGamesNum(0); this.setFreeGamesSum(0); } const creditsBeforePlay = this.getCreditsAmount(); this.baseSession.play(); if (this.getFreeGamesSum() > 0 && this.getFreeGamesNum() < this.getFreeGamesSum()) { this.setFreeGamesNum(this.getFreeGamesNum() + 1); this.setFreeGamesBank(this.getFreeGamesBank() + this.getWinAmount()); this.setCreditsAmount(creditsBeforePlay); } const wonFreeGames = this.getWonFreeGamesNumber(); if (wonFreeGames > 0) { this.setFreeGamesSum(this.getFreeGamesSum() + wonFreeGames); } else { if (this.getFreeGamesSum() > 0 && this.getFreeGamesNum() === this.getFreeGamesSum()) { this.setCreditsAmount(this.getCreditsAmount() + this.getFreeGamesBank()); } } } public getFreeGamesForScatters(symbolId: string, numberOfSymbols: number): number { return this.config.getFreeGamesForScatters(symbolId, numberOfSymbols); } public isSymbolWild(symbolId: string): boolean { return this.baseSession.isSymbolWild(symbolId); } public isSymbolScatter(symbolId: string): boolean { return this.baseSession.isSymbolScatter(symbolId); } public getWildSymbols(): string[] { return this.baseSession.getWildSymbols(); } public getScatterSymbols(): string[] { return this.baseSession.getScatterSymbols(); } public getLinesDefinitions(): LinesDefinitionsDescribing { return this.baseSession.getLinesDefinitions(); } public getLinesPatterns(): LinesPatternsDescribing { return this.baseSession.getLinesPatterns(); } public getLinesWinning(): number { return this.baseSession.getLinesWinning(); } public getScattersWinning(): number { return this.baseSession.getScattersWinning(); } }