コード例 #1
0
        private (ISpinResult spin, bool success, string message) SpinInner()
        {
            var spinable = IsSpinable();

            if (!spinable.valid)
            {
                return(null, spinable.valid, spinable.message);
            }

            var dimmensions      = GenerateDimensions();
            var winninDimensions = GetWinningDimensions(dimmensions);

            _currentWin = Math.Round(winninDimensions.Sum(d => d.Symbols.Sum(s => s.Coefficient)) * _stake, 2, MidpointRounding.AwayFromZero);
            _balance    = Math.Round(_balance - _stake + _currentWin, 2, MidpointRounding.AwayFromZero);

            var spinResult = new SpinResult()
            {
                Date       = DateTime.Now,
                Balance    = _balance,
                Stake      = _stake,
                Win        = _currentWin,
                Dimensions = dimmensions
            };

            return(spinResult, true, "Spinned");
        }
コード例 #2
0
    // Start is called before the first frame update
    void Start()
    {
        sR = FindObjectOfType <SpinResult>();

        check = false;

        //Result after the wheel spins

        if (winner)
        {
            rouletteValue = 7;
        }

        else
        {
            rouletteValue = Random.Range(0, 36);
        }

        //Wheel rotation values
        xAngle        = 0;
        yAngle        = 0;
        zAngle        = 0;
        spinTimer     = 0;
        wheelSpinning = true;
        check         = false;
    }
コード例 #3
0
        private int CalculateReward(SpinResult spinResult, int creditAmount)
        {
            if (spinResult.Slot1 == spinResult.Slot2 && spinResult.Slot2 == spinResult.Slot3)
            {
                switch (spinResult.Slot1)
                {
                case SlotState.Seven:
                    return(creditAmount == 3 ? 1500 : 300 * creditAmount);

                case SlotState.ThreeBar:
                    return(100 * creditAmount);

                case SlotState.TwoBar:
                    return(50 * creditAmount);

                case SlotState.OneBar:
                    return(25 * creditAmount);

                case SlotState.Cherry:
                    return(5 * creditAmount);

                case SlotState.Blank:
                    return(2 * creditAmount);

                default:
                    return(0);
                }
            }
            return(0);
        }
コード例 #4
0
        private void UpdateSummaryData(SummaryData sdata, SpinResult sr)
        {
            var alchemySpinResult = sr as FountainOfFortuneSpinResult;

            sdata.SpinCounter++;
            sdata.TotalBet += alchemySpinResult.SpinBet.TotalBet;
            sdata.TotalWin += alchemySpinResult.Win;
        }
コード例 #5
0
        private void UpdateSummaryData(SummaryData sdata, SpinResult sr)
        {
            var FaFaZhuSpinResult = sr as FaFaZhuSpinResult;

            sdata.SpinCounter++;
            sdata.TotalBet += FaFaZhuSpinResult.SpinBet.TotalBet;
            sdata.TotalWin += FaFaZhuSpinResult.Win;
        }
コード例 #6
0
        private void UpdateSummaryData(SummaryData sdata, SpinResult sr)
        {
            var alchemySpinResult = sr as AlchemyReelsCollapsingSpinResult;

            sdata.SpinCounter++;
            sdata.TotalBet += alchemySpinResult.SpinBet.TotalBet;
            sdata.TotalWin += alchemySpinResult.Win;
        }
コード例 #7
0
        private void UpdateSummaryData(SummaryData sdata, SpinResult sr)
        {
            var alchemySpinResult = sr as ChessRoyaleSpinResult;

            sdata.SpinCounter++;
            sdata.TotalBet += alchemySpinResult.SpinBet.TotalBet;
            sdata.TotalWin += alchemySpinResult.Win;
        }
コード例 #8
0
        private void UpdateSummaryData(SummaryData sdata, SpinResult sr)
        {
            var SpaceNeonSpinResult = sr as SpaceNeonSpinResult;

            sdata.SpinCounter++;
            sdata.TotalBet += SpaceNeonSpinResult.SpinBet.TotalBet;
            sdata.TotalWin += SpaceNeonSpinResult.Win;
        }
コード例 #9
0
        private void UpdateFaFaZhuSummaryData(SummaryData sd, SpinResult sr)
        {
            var FaFaZhuSpinResult = sr as FaFaZhuSpinResult;

            foreach (var wp in FaFaZhuSpinResult.WinPositions)
            {
                var vcounter = sd.WinCounter;
                vcounter[wp.Win] = vcounter.ContainsKey(wp.Win) ? vcounter[wp.Win] + 1 : 1;
            }
        }
コード例 #10
0
 public static SpinViewModel Create(SpinResult spinResult)
 {
     return(new SpinViewModel
     {
         RewardAmount = spinResult.RewardAmount,
         Slot1 = spinResult.Slot1,
         Slot2 = spinResult.Slot2,
         Slot3 = spinResult.Slot3
     });
 }
コード例 #11
0
        private void UpdateAlchemyReelsSummaryData(SummaryData sd, SpinResult sr)
        {
            var alchemySpinResult = sr as AlchemyReelsCollapsingSpinResult;

            foreach (var wp in alchemySpinResult.WinPositions)
            {
                var scatter  = wp.Line == 0;
                var vcounter = scatter ? sd.ScatterCounter : sd.WinCounter;
                vcounter[wp.Win] = vcounter.ContainsKey(wp.Win) ? vcounter[wp.Win] + 1 : 1;
            }
        }
コード例 #12
0
        protected override State DoProcess()
        {
            Output.Inform("Spinning...");
            SpinResult spinResult = _spin.Execute();

            Logger.LogInformation("Spin resulted in coefficient {0}.", spinResult.Coefficient);

            Amount profit = Wallet.EndStake(spinResult.Coefficient);

            Logger.LogInformation("Spin profit is {1} {2}.", profit, Wallet.Currency);
            Output.Inform($"You won {profit} {Wallet.Currency}.");

            return(States.StakeOrWithdraw);
        }
コード例 #13
0
        private void UpdateChessRoyaleSummaryData(SummaryData sd, SpinResult sr)
        {
            var alchemySpinResult = sr as ChessRoyaleSpinResult;

            foreach (var wp in alchemySpinResult.WinPositions)
            {
                var scatter  = wp.Line == 0;
                var vcounter = scatter ? sd.ScatterCounter : sd.WinCounter;
                vcounter[wp.Win] = vcounter.ContainsKey(wp.Win) ? vcounter[wp.Win] + 1 : 1;
                //var counter80 = sd.WinCounter.Where(x => x.Key == 80).FirstOrDefault().Value;
            }

            //Console.WriteLine($"Reesl: {AlchemyReelsCommon.Rows[0]}; {AlchemyReelsCommon.Rows[1]}; {AlchemyReelsCommon.Rows[2]}");
        }
コード例 #14
0
        public SpinResult Spin(int creditAmount)
        {
            Random random = new Random();
            int    slot1  = random.Next(0, slotStates.Count - 1);
            int    slot2  = random.Next(0, slotStates.Count - 1);
            int    slot3  = random.Next(0, slotStates.Count - 1);

            var spinResult = new SpinResult
            {
                Slot1 = slotStates[slot1],
                Slot2 = slotStates[slot2],
                Slot3 = slotStates[slot3],
            };

            spinResult.RewardAmount = CalculateReward(spinResult, creditAmount);
            return(spinResult);
        }
コード例 #15
0
        /// <summary>
        ///     Performs a spin and logs the spin result
        /// </summary>
        /// <returns>The spin result</returns>
        public async Task <SpinResult> Spin()
        {
            Console.WriteLine();
            Log.Info("Spinning");

            var response = await _client.GetStringAsync(_config.SpinUrl);

            var spin = new SpinResult(response);

            if (spin.Code != "aaa")
            {
                Console.WriteLine($"\tSpin Code: {spin.Code}");
                Console.WriteLine($"\tSpins Left: {spin.SpinsLeft}");
                Console.WriteLine($"\tAmount Won: {spin.AmountWon}");
                Console.WriteLine($"\tETH Balance: {spin.EthBalance}");
                Console.WriteLine($"\tUSD Balance: {spin.UsdBalance:C2}");
                Console.WriteLine($"\tWinner? {spin.IsWinner}");
                Console.WriteLine($"\tPayout Percentage: {spin.PayoutPercentage}");
                Console.WriteLine($"\tPlay Minigame? {spin.Minigame}");
                _amountWon += spin.AmountWon;
            }
            else
            {
                Log.Info("Lost");
                Log.Info($"Spins Left: {spin.SpinsLeft}");
                Log.Info($"ETH Balance: {spin.EthBalance}");
                Log.Info($"USD Balance: {spin.UsdBalance:C2}");
            }

            if (spin.IsWinner)
            {
                _timesWon++;
            }

            if (spin.Minigame)
            {
                await ChestGame();
            }

            Console.WriteLine();

            Console.WriteLine("--------------------------------");

            return(spin);
        }
コード例 #16
0
        public SpinResult Spin(decimal amount)
        {
            var    symbolsGrid    = new List <List <Symbol> >();
            double winCoefficient = 0;

            for (int i = 0; i < COLUMN_NUMBER; i++)
            {
                List <Symbol> symbols = m_SymbolGenerator.GenerateSymbols(ROW_NUMBER);
                symbolsGrid.Add(symbols);
                winCoefficient += m_CoefficientCalculator.CalculateCoefficient(symbols);
            }

            var winValue = (decimal)winCoefficient * amount;

            m_Player.Balance += winValue;
            var spinResult = new SpinResult(symbolsGrid, winValue, m_Player.Balance, true);

            return(spinResult);
        }
コード例 #17
0
        public async Task UpdateLastSpinData(UserSession userSession, Game game, SpinResult spinResult)
        {
            var user     = userSession.User;
            var spinData = new UserGameSpinData()
            {
                UserId = user.Id,
                GameId = game.Id,
                Data   = spinResult.ToByteArray()
            };

            if (userSession.IsFunPlay)
            {
                var key = userSession.SessionKey + "_" + game.Id.ToString();
                await cache.SetAsync(key, spinData, new DistributedCacheEntryOptions
                {
                    SlidingExpiration = TimeSpan.FromMinutes(5)
                });
            }
            else
            {
                using (var db = databaseManager.GetWritableDatabase())
                {
                    var lastSpin = await db.UserGameSpinDatas
                                   .Where(x => x.UserId == user.Id)
                                   .Where(x => x.GameId == game.Id)
                                   .AsNoTracking()
                                   .FirstOrDefaultAsync();

                    if (lastSpin == null)
                    {
                        db.UserGameSpinDatas.Add(spinData);
                    }
                    else
                    {
                        lastSpin.Data = spinData.Data;
                        db.UserGameSpinDatas.Update(lastSpin);
                    }
                    await db.SaveChangesAsync();
                }
            }
        }
コード例 #18
0
        public Result <Bonus, ErrorCode> CreateBonus(SpinResult spinResult)
        {
            var   result = spinResult as BullRushSpinResult;
            Bonus bonus;

            try
            {
                if (result.IsRacing)
                {
                    bonus = BullRushFreeSpinFeature.CreateBonus(result);
                }
                else if (result.IsInnerWheelBonus)
                {
                    bonus = BullRushJackPotFeature.CreateBonus(result);
                }
                else
                {
                    return(ErrorCode.NonexistenceBonus);
                }

                result.BonusElement = new BullRushBonusElement {
                    Id = bonus.Id, Value = bonus.Guid.ToString("N")
                };

                result.Bonus = new BonusStruct()
                {
                    Id = bonus.Id,
                };
            }
            catch (Exception ex)
            {
                logger.LogError("[Determine Freespin Bonus]: Create bonus position wrongly");
                logger.LogError(ex, ex.Message);
                return(ErrorCode.NonexistenceBonus);
            }

            return(bonus);
        }
コード例 #19
0
        public async Task <Result <IGameResult, ErrorCode> > Spin(RequestContext <SpinArgs> requestContext)
        {
            using (logger.BeginScope(new Dictionary <string, object>
            {
                ["SessionKey"] = requestContext.UserSession.SessionKey,
                ["UserId"] = requestContext.UserSession.UserId,
                ["GameKey"] = requestContext.GameKey,
                ["Platform"] = requestContext.Platform,
                ["BettingLines"] = requestContext.Parameters.BettingLines,
                ["LineBet"] = requestContext.Parameters.LineBet,
                ["Multiplier"] = requestContext.Parameters.Multiplier
            }))
            {
                var        module      = gameModules.GetModule(requestContext.GameKey);
                var        userSession = requestContext.UserSession;
                SpinResult result      = null;
                var        level       = await userService.GetLevel(requestContext.UserGameKey);

                try
                {
                    var transaction = await transactionService.GenerateGameTransactionId(requestContext.UserGameKey, GameTransactionType.Spin);

                    requestContext.GameTransaction = transaction;

                    var roundId = await transactionService.GenerateAutoNumber(CounterType.RoundId);

                    requestContext.CurrentRound = roundId;

                    var lastSpinData = await userService.GetLastSpinData(userSession, requestContext.Game);

                    var totalBet = module.CalculateTotalBet(lastSpinData, requestContext);

                    logger.LogInformation("User spin on level {Level}, trx id {GameTransactionId}, round {CurrentRoundId}, total bet {TotalBet}", level, transaction.Id, roundId, totalBet);

                    var deductBet = await payoutService.DeductBetFromWallet(requestContext, totalBet);

                    // TODO we should check the wallet result if it's success

                    var spinResult = module.ExecuteSpin(level, lastSpinData, requestContext);
                    if (spinResult.IsError)
                    {
                        return(spinResult.Error);
                    }

                    result               = spinResult.Value;
                    result.Bet           = totalBet;
                    result.RoundId       = roundId;
                    result.TransactionId = transaction.Id;
                    result.UniqueID      = result.TransactionId.ToString();
                    result.DateTimeUtc   = transaction.DateTimeUtc;
                    result.ExchangeRate  = deductBet.ExchangeRate;
                    result.Balance       = Balance.Create(deductBet.Balance);

                    if (result.HasBonus)
                    {
                        logger.LogInformation("User got bonus");
                        var bonusCreated = module.CreateBonus(result);
                        if (bonusCreated.IsError)
                        {
                            logger.LogWarning("Create bonus got error {Error} with {SpinResult}", bonusCreated.Error, JsonHelper.FullString(result));
                            return(ErrorCode.InternalError);
                        }

                        var bonus = bonusCreated.Value;
                        bonus.SpinTransactionId = transaction.Id;
                        bonus.GameResult        = result;
                        var entity = new BonusEntity
                        {
                            UserId       = userSession.UserId,
                            GameId       = requestContext.Game.Id,
                            Guid         = bonus.Guid.ToString("N"),
                            Data         = bonus.ToByteArray(),
                            BonusType    = bonus.GetType().Name,
                            Version      = 3,
                            IsOptional   = bonus.IsOptional,
                            IsStarted    = bonus.IsStarted,
                            RoundId      = roundId,
                            BetReference = deductBet.BetReference
                        };
                        await bonusService.UpdateBonus(userSession, entity);

                        await userService.UpdateGameState(requestContext, UserGameState.ForBonus(roundId));
                    }
                    else
                    {
                        await userService.UpdateGameState(requestContext, UserGameState.ForNormal(roundId));
                    }

                    var paied = await payoutService.PayoutToUser(requestContext, result, new BonusExtraInfo { RoundId = roundId, BetId = deductBet.BetReference }, !result.HasBonus, deductBet.Guid);

                    result.ExchangeRate = deductBet.ExchangeRate;
                    result.Balance      = Balance.Create(paied.Balance);

                    await transactionService.ProfileSpinBet(requestContext);

                    await userService.UpdateLastSpinData(userSession, requestContext.Game, result);

                    if (!userSession.IsFunPlay)
                    {
                        await userService.UpdateUserGameData(new UserGameData
                        {
                            UserId = userSession.UserId,
                            GameId = requestContext.Game.Id,
                            Bet    = requestContext.Parameters.LineBet,
                            Lines  = requestContext.Game.Lines,
                        });
                    }
                }
                catch (InsufficientBalanceException ex)
                {
                    logger.LogInformation(ex, ex.Message);
                    return(ErrorCode.InsufficientCredit);
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, ex.Message);
                    throw;
                }
                finally
                {
                    await TrySaveGameHistory(requestContext, result);
                }
                return(result);
            }
        }
コード例 #20
0
        public void TestFreeGameFullCycle(int gameId, int level, string reelStripId)
        {
            var timeStart           = DateTime.Now;
            var module              = SimulationHelper.GetModule(gameId);
            var configuration       = new Configuration();
            var targetRtpLevel      = Math.Round(configuration.RtpLevels.FirstOrDefault(rl => rl.Level == level).Rtp, 2);
            var totalSummaryData    = new SummaryData();
            var spinRequestContext  = SimulationHelper.GetMockSpinRequestContext(gameId);
            var bonusRequestContext = SimulationHelper.GetMockBonusRequestContext(0, gameId);
            var targetWheel         = MainGameEngine.GetTargetWheel(level, configuration, reelStripId);
            var userGameKey         = new UserGameKey()
            {
                UserId = -1,
                GameId = gameId,
                Level  = level
            };

            var spinBet = MainGameEngine.GenerateSpinBet(spinRequestContext);
            var wheel   = new Wheel(Game.WheelWidth, Game.WheelHeight)
            {
                ReelStripsId = reelStripId
            };

            for (var reel1 = 0; reel1 < targetWheel[0].Count; reel1++)
            {
                for (var reel2 = 0; reel2 < targetWheel[1].Count; reel2++)
                {
                    for (var reel3 = 0; reel3 < targetWheel[2].Count; reel3++)
                    {
                        for (var reel4 = 0; reel4 < targetWheel[3].Count; reel4++)
                        {
                            for (var reel5 = 0; reel5 < targetWheel[4].Count; reel5++)
                            {
                                wheel.Reels[0] = SimulationHelper.GetReelRange(targetWheel[0], reel1);
                                wheel.Reels[1] = SimulationHelper.GetReelRange(targetWheel[1], reel2);
                                wheel.Reels[2] = SimulationHelper.GetReelRange(targetWheel[2], reel3);
                                wheel.Reels[3] = SimulationHelper.GetReelRange(targetWheel[3], reel4);
                                wheel.Reels[4] = SimulationHelper.GetReelRange(targetWheel[4], reel5);

                                var topIndices = new List <int> {
                                    reel1, reel2, reel3, reel4, reel5
                                };
                                var avalancheMultiplier = configuration.BonusConfig.FreeSpin.Multipliers.First();
                                var winPositions        = MainGameEngine.GenerateWinPositions(configuration.Payline, configuration.PayTable, wheel, spinBet.LineBet, spinBet.Lines, avalancheMultiplier);
                                var bonusPositions      = MainGameEngine.GenerateBonusPositions(wheel);

                                var spinResult = new SpinResult(spinBet, wheel, topIndices, winPositions, bonusPositions, avalancheMultiplier)
                                {
                                    PlatformType = spinRequestContext.Platform,
                                    Level        = level
                                };

                                totalSummaryData.Update(spinResult);

                                if (spinResult.HasBonus)
                                {
                                    var bonus = module.CreateBonus(spinResult).Value;

                                    if (bonus is FreeSpinBonus)
                                    {
                                        bonus = CollapsingBonusEngine.CreateCollapsingSpinBonus(spinResult);
                                    }

                                    var collapsingSpinBonus = bonus as CollapsingSpinBonus;

                                    while (!bonus.IsCompleted)
                                    {
                                        var previousSpinResult = collapsingSpinBonus.PreviousGameResult == null ? collapsingSpinBonus.SpinResult : collapsingSpinBonus.PreviousSpinResult;

                                        var referenceWheel       = MainGameEngine.GetTargetWheel(level, configuration, previousSpinResult.Wheel.ReelStripsId);
                                        var collapsingSpinResult = CollapsingBonusEngine.CreateCollapsingSpinResult(
                                            previousSpinResult,
                                            referenceWheel,
                                            configuration.BonusConfig.FreeSpin.Multipliers,
                                            configuration.Payline,
                                            configuration.PayTable);

                                        collapsingSpinBonus.UpdateBonus(collapsingSpinResult);
                                        var bonusResult = CollapsingBonusEngine.CreateCollapsingBonusResult(collapsingSpinBonus, collapsingSpinResult);

                                        totalSummaryData.UpdateBonus(bonusResult);

                                        bonus = bonusResult.Bonus;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            totalSummaryData.DisplayData(level, timeStart, targetRtpLevel);
            var resultOverallRtp = Math.Round(totalSummaryData.RtpData.OverallRtp, 2);

            var isWithinRtp = totalSummaryData.RtpData.OverallRtp >= targetRtpLevel - 0.5m && totalSummaryData.RtpData.OverallRtp <= targetRtpLevel + 0.5m;

            Assert.True(isWithinRtp, $"RTP not matching. The result is {resultOverallRtp}. Expected is {targetRtpLevel}");
        }
コード例 #21
0
        public void TestMainGameFullCycle(int gameId, int level, string reelStripId)
        {
            var timeStart           = DateTime.Now;
            var module              = SimulationHelper.GetModule(gameId);
            var configuration       = new Configuration();
            var targetRtpLevel      = Math.Round(configuration.RtpLevels.FirstOrDefault(rl => rl.Level == level).Rtp, 2);
            var totalSummaryData    = new SummaryData();
            var spinRequestContext  = SimulationHelper.GetMockSpinRequestContext(gameId);
            var bonusRequestContext = SimulationHelper.GetMockBonusRequestContext(0, gameId);
            var targetWheel         = MainGameEngine.GetTargetWheel(level, configuration, reelStripId);
            var userGameKey         = new UserGameKey()
            {
                UserId = -1,
                GameId = gameId,
                Level  = level
            };

            var spinBet = MainGameEngine.GenerateSpinBet(spinRequestContext);
            var wheel   = new Wheel(Game.WheelWidth, Game.WheelHeight)
            {
                ReelStripsId = reelStripId
            };

            for (var reel1 = 0; reel1 < targetWheel[0].Count; reel1++)
            {
                for (var reel2 = 0; reel2 < targetWheel[1].Count; reel2++)
                {
                    for (var reel3 = 0; reel3 < targetWheel[2].Count; reel3++)
                    {
                        for (var reel4 = 0; reel4 < targetWheel[3].Count; reel4++)
                        {
                            for (var reel5 = 0; reel5 < targetWheel[4].Count; reel5++)
                            {
                                wheel.Reels[0] = SimulationHelper.GetReelRange(targetWheel[0], reel1);
                                wheel.Reels[1] = SimulationHelper.GetReelRange(targetWheel[1], reel2);
                                wheel.Reels[2] = SimulationHelper.GetReelRange(targetWheel[2], reel3);
                                wheel.Reels[3] = SimulationHelper.GetReelRange(targetWheel[3], reel4);
                                wheel.Reels[4] = SimulationHelper.GetReelRange(targetWheel[4], reel5);

                                var topIndices          = MainGameEngine.GenerateRandomWheelIndices(targetWheel);
                                var stackedReels        = MainGameEngine.GetStackedSymbols(wheel);
                                var bonusPositions      = MainGameEngine.GenerateBonusPositions(wheel);
                                var hasWildStackedReels = stackedReels.Any(sr => sr.Symbol == Symbols.Wild);
                                var multiplier          = hasWildStackedReels ? configuration.StackedWildMultiplier : spinBet.Multiplier;

                                if (stackedReels.Any(sr => sr.Symbol == Symbols.Mystery)) /// Calculate wins with replaced mystery symbols
                                {
                                    var replacementSymbol          = MainGameEngine.GetMysterySymbolReplacement(configuration.MysterySymbolReplacementWeights);
                                    var replacedMysterySymbolWheel = MainGameEngine.GenerateReplacedMysterySymbolWheel(configuration, wheel, replacementSymbol);
                                    var winPositions = MainGameEngine.GenerateWinPositions(
                                        configuration.Payline,
                                        configuration.PayTable,
                                        replacedMysterySymbolWheel,
                                        spinBet.LineBet,
                                        spinBet.Lines,
                                        multiplier);

                                    var spinResult = new SpinResult(level, spinBet, wheel, winPositions, bonusPositions, multiplier, replacementSymbol);

                                    totalSummaryData.Update(spinResult);
                                }
                                else /// Calculate wins with initial wheel
                                {
                                    var winPositions = MainGameEngine.GenerateWinPositions(
                                        configuration.Payline,
                                        configuration.PayTable,
                                        wheel,
                                        spinBet.LineBet,
                                        spinBet.Lines,
                                        multiplier);

                                    var spinResult = new SpinResult(level, spinBet, wheel, winPositions, bonusPositions, multiplier);

                                    totalSummaryData.Update(spinResult);
                                }
                            }
                        }
                    }
                }
            }

            totalSummaryData.DisplayData(level, timeStart, targetRtpLevel);
            var resultOverallRtp = Math.Round(totalSummaryData.RtpData.OverallRtp, 2);

            var isWithinRtp = totalSummaryData.RtpData.OverallRtp >= targetRtpLevel - 0.5m && totalSummaryData.RtpData.OverallRtp <= targetRtpLevel + 0.5m;

            Assert.True(isWithinRtp, $"RTP not matching. The result is {resultOverallRtp}. Expected is {targetRtpLevel}");
        }
コード例 #22
0
        public SpinResult Spin(long accountId, string accountName, int roomId, MoneyType moneyType, string lineData)
        {
            String s = "[tamquoc] Spin play: " +
                       "\r\naccountId: " + accountId +
                       "\r\naccountName: " + accountName +
                       "\r\nroomId: " + roomId +
                       "\r\nmoneyType: " + moneyType +
                       "\r\nlineData: " + lineData;
            var roomValue     = GetBetValueByRoom(roomId);
            var totalBetValue = lineData.Split(',').Length *roomValue;
            var slotsData     = _testService.IsTestAccount(accountName) ? _testService.GetTestData() : _slotsGeneService.GenerateSlotsData();

            var       newSlotsData = _slotsGeneService.HandleSlotsData(slotsData);
            var       slotMachine  = new SlotMachine();
            var       prizeLines   = slotMachine.GetLinesPrize(newSlotsData, roomValue, lineData, out var isJackpot, out var payLinePrizeValue);
            var       countBonus   = slotsData.Count(x => x == 3); // Đếm biểu tượng bonus
            var       countScatter = slotsData.Count(x => x == 2); // đếm biểu tượng freeSpins
            BonusGame bonusGame    = null;

            // Tạo Bonus Game nếu có
            if (countBonus >= 3)
            {
                bonusGame = _bonusGeneService.GenerateBonusGame(totalBetValue, countBonus - 2);
                s        += "\r\nWin bonus: " + JsonConvert.SerializeObject(bonusGame);
            }

            var addFreeSpins = 0;

            if (countScatter >= 3)
            {
                addFreeSpins = (countScatter - 2) * 4;  // Thêm lượt FreeSpins
                s           += "\r\nWin Free spin: " + addFreeSpins;
            }
            var inputSpinData = new InputSpinData()
            {
                AccountId       = accountId,
                AccountName     = accountName,
                MoneyType       = moneyType,
                AddFreeSpins    = addFreeSpins,
                RoomId          = roomId,
                IsJackpot       = isJackpot,
                SlotsData       = string.Join(",", slotsData.Select(x => x.ToString())),
                TotalBonusValue = countBonus > 3 ? bonusGame.TotalPrizeValue : 0,
                TotalPrizeValue = payLinePrizeValue,
                LineData        = lineData,
                TotalBetValue   = totalBetValue
            };
            var outputSpinData = _dbService.Spin(inputSpinData);

            if (outputSpinData.ResponseStatus < 0)
            {
                if (outputSpinData.ResponseStatus == -90) // Limit Fund
                {
                    return(new SpinResult()
                    {
                        SpinId = outputSpinData.SpinId,
                        SlotsData = _missData[RandomUtil.NextInt(0, _missData.Length)],
                        AddFreeSpin = 0,
                        PrizeLines = new List <PrizeLine>(),
                        Balance = outputSpinData.Balance,
                        FreeSpins = outputSpinData.FreeSpins,
                        Jackpot = outputSpinData.Jackpot,
                        ResponseStatus = 1
                    });
                }
                return(new SpinResult()
                {
                    ResponseStatus = outputSpinData.ResponseStatus
                });
            }

            if (countBonus >= 3)
            {
                _dbService.CreateBonusGame(moneyType, outputSpinData.SpinId, roomId, accountId, accountName, totalBetValue, bonusGame.BonusData, bonusGame.Mutiplier, bonusGame.TotalPrizeValue, out var bonusResponse);
            }

            UpdateCacheJackpot(roomId, outputSpinData.Jackpot, moneyType); // Cập nhật jackpot cho cache
            var totalPrizeValue = payLinePrizeValue + outputSpinData.TotalJackpotValue;

            HonorHandler.Instance.SaveHonor(accountName, roomId, totalPrizeValue, inputSpinData.IsJackpot ? 1 : 2); // Luu vinh danh

            var d = new SpinResult()
            {
                SpinId                 = outputSpinData.SpinId,
                SlotsData              = slotsData,
                AddFreeSpin            = addFreeSpins,
                IsJackpot              = isJackpot,
                PrizeLines             = prizeLines,
                BonusGame              = bonusGame,
                TotalPrizeValue        = payLinePrizeValue + outputSpinData.TotalJackpotValue,
                TotalPaylinePrizeValue = payLinePrizeValue,
                TotalJackpotValue      = outputSpinData.TotalJackpotValue,
                Balance                = outputSpinData.Balance,
                FreeSpins              = outputSpinData.FreeSpins,
                Jackpot                = outputSpinData.Jackpot,
                ResponseStatus         = outputSpinData.ResponseStatus
            };

            s += "\r\nResponse: " + JsonConvert.SerializeObject(d);
            NLogManager.LogMessage(s);
            return(d);
        }
コード例 #23
0
        public void TestFullCycle(int gameId, int level)
        {
            var timeStart           = DateTime.Now;
            var module              = SimulationHelper.GetModule(gameId);
            var configuration       = new Configuration();
            var targetRtpLevel      = Math.Round(configuration.RtpLevels.FirstOrDefault(rl => rl.Level == level).Rtp, 2);
            var totalSummaryData    = new SummaryData();
            var spinRequestContext  = SimulationHelper.GetMockSpinRequestContext(gameId);
            var bonusRequestContext = SimulationHelper.GetMockBonusRequestContext(gameId, 0);
            var targetWheel         = MainGameEngine.GetTargetWheel(level, configuration);
            var userGameKey         = new UserGameKey()
            {
                UserId = -1,
                GameId = gameId,
                Level  = level
            };

            var spinBet = MainGameEngine.GenerateSpinBet(spinRequestContext);
            var wheel   = new Wheel(Game.WheelWidth, Game.WheelHeight);

            for (var reel1 = 0; reel1 < targetWheel[0].Count; reel1++)
            {
                for (var reel2 = 0; reel2 < targetWheel[1].Count; reel2++)
                {
                    for (var reel3 = 0; reel3 < targetWheel[2].Count; reel3++)
                    {
                        wheel.Reels[0] = SimulationHelper.GetReelRange(targetWheel[0], reel1);
                        wheel.Reels[1] = SimulationHelper.GetReelRange(targetWheel[1], reel2);
                        wheel.Reels[2] = SimulationHelper.GetReelRange(targetWheel[2], reel3);

                        var topIndices = new List <int> {
                            reel1, reel2, reel3
                        };
                        var winPositions   = MainGameEngine.GenerateWinPositions(configuration.Payline, configuration.PayTable, wheel, spinBet.LineBet, spinBet.Lines, spinBet.Multiplier);
                        var stackedReels   = MainGameEngine.GetStackedReels(wheel, configuration.PayTable);
                        var bonusPositions = MainGameEngine.GenerateBonusPositions(stackedReels);

                        var spinResult = new SpinResult(spinBet, wheel, winPositions, bonusPositions)
                        {
                            PlatformType = spinRequestContext.Platform,
                            Level        = level
                        };

                        totalSummaryData.Update(spinResult);

                        if (spinResult.HasBonus)
                        {
                            var bonus = module.CreateBonus(spinResult).Value;

                            while (!bonus.IsCompleted)
                            {
                                var bonusResult = SimulationHelper.ExecuteBonus(level, bonus, bonusRequestContext, configuration).Value;

                                totalSummaryData.UpdateBonus(bonusResult);
                                bonus = bonusResult.Bonus;
                            }
                        }
                    }
                }
            }

            totalSummaryData.DisplayData(level, timeStart, targetRtpLevel);
            var resultOverallRtp = Math.Round(totalSummaryData.RtpData.OverallRtp, 2);

            var isWithinRtp = totalSummaryData.RtpData.OverallRtp >= targetRtpLevel - 0.5m && totalSummaryData.RtpData.OverallRtp <= targetRtpLevel + 0.5m;

            Assert.True(isWithinRtp, $"RTP not matching. The result is {resultOverallRtp}. Expected is {targetRtpLevel}");
        }
コード例 #24
0
        public void FullCycle(int gameId, int level)
        {
            var timeStart          = DateTime.Now;
            var module             = SimulationHelper.GetModule(gameId);
            var configuration      = module.Configuration;
            var targetRtpLevel     = Math.Round(configuration.RtpLevels.FirstOrDefault(rl => rl.Level == level).Rtp, 2);
            var totalSummaryData   = new SummaryData();
            var spinRequestContext = SimulationHelper.GetMockSpinRequestContext(gameId);
            var targetWheel        = MainGameEngine.GetTargetWheel(level, configuration);
            var userGameKey        = new UserGameKey()
            {
                UserId = -1,
                GameId = gameId,
                Level  = level
            };

            var spinBet = MainGameEngine.GenerateSpinBet(spinRequestContext);
            var wheel   = new Wheel(Game.WheelWidth, Game.WheelHeight);

            for (var reel1 = 0; reel1 < targetWheel[0].Count; reel1++)
            {
                for (var reel2 = 0; reel2 < targetWheel[1].Count; reel2++)
                {
                    for (var reel3 = 0; reel3 < targetWheel[2].Count; reel3++)
                    {
                        for (var reel4 = 0; reel4 < targetWheel[3].Count; reel4++)
                        {
                            for (var reel5 = 0; reel5 < targetWheel[4].Count; reel5++)
                            {
                                wheel.Reels[0] = SimulationHelper.GetReelRange(targetWheel[0], reel1);
                                wheel.Reels[1] = SimulationHelper.GetReelRange(targetWheel[1], reel2);
                                wheel.Reels[2] = SimulationHelper.GetReelRange(targetWheel[2], reel3);
                                wheel.Reels[3] = SimulationHelper.GetReelRange(targetWheel[3], reel4);
                                wheel.Reels[4] = SimulationHelper.GetReelRange(targetWheel[4], reel5);

                                var expandedWheel = ExpandingWildsEngine.GenerateWheelWithExpandedWilds(wheel, configuration);
                                var winPositions  = MainGameEngine.GenerateWinPositions(
                                    configuration.Payline,
                                    configuration.PayTable,
                                    expandedWheel,
                                    spinBet.LineBet,
                                    spinBet.Lines,
                                    spinBet.Multiplier);

                                var spinResult = new SpinResult(spinBet, wheel, winPositions)
                                {
                                    PlatformType = spinRequestContext.Platform,
                                    Level        = level
                                };

                                totalSummaryData.Update(spinResult);
                            }
                        }
                    }
                }
            }

            totalSummaryData.DisplayData(level, timeStart, targetRtpLevel);
            var resultOverallRtp = Math.Round(totalSummaryData.RtpData.OverallRtp, 2);

            var isWithinRtp = totalSummaryData.RtpData.OverallRtp >= targetRtpLevel - 0.5m && totalSummaryData.RtpData.OverallRtp <= targetRtpLevel + 0.5m;

            Assert.True(isWithinRtp, $"RTP not matching. The result is {resultOverallRtp}. Expected is {targetRtpLevel}");
        }