Beispiel #1
0
        public ShopController(
            ShopView view,
            ShopModel shopModel,
            RoundEndModel roundEndModel,
            ProfileModel profileModel,
            UpgradesModel upgradesModel,
            UpgradeService upgradeService)
            : base(view)
        {
            _view = view;
            _view.Initialize();

            _roundEndModel  = roundEndModel;
            _shopModel      = shopModel;
            _profileModel   = profileModel;
            _upgradesModel  = upgradesModel;
            _upgradeService = upgradeService;

            _roundEndModel.OpenShop
            .Subscribe(_ => Open())
            .AddTo(Disposer);

            SetupOnClick();
            SetupProfileModel();
            SetupUpgradesModel();
        }
        public RoundEndController(
            RoundEndView view,
            RoundEndModel roundEndModel,
            GameStateModel gameStateModel,
            FlightStatsModel flightStatsModel,
            ProfileModel profileModel,
            SceneTransitionService sceneTransitionService)
            : base(view)
        {
            _view = view;
            _view.Initialize();

            _roundEndModel          = roundEndModel;
            _gameStateModel         = gameStateModel;
            _flightStatsModel       = flightStatsModel;
            _profileModel           = profileModel;
            _sceneTransitionService = sceneTransitionService;

            currencyAmountAtStart = _profileModel.Currency.Value;
            bestDistanceAtStart   = _profileModel.BestDistance.Value;

            _view.OnRetryClicked
            .Subscribe(_ => OnRetryClicked())
            .AddTo(Disposer);

            _view.OnShopClicked
            .Subscribe(_ => OnShopClicked())
            .AddTo(Disposer);

            _view.OnOpenCompleted
            .Subscribe(_ => OnOpenCompleted())
            .AddTo(Disposer);


            SetupModelSubscriptions();
        }
Beispiel #3
0
        public async Task <RoundEndModel> SendChoice(SendChoiceViewModel model, string userId, string accessToken)
        {
            var roundEndModel = new RoundEndModel(model.GameId);

            var answerCount = _roundAnswerService.RoundAnswerCount(model.GameRoundId, userId);

            if (answerCount > 1)
            {
                throw new AlreadyAnsweredException(_localizer.GetString("AlreadyAnswered").Value);
            }

            var roundAnswerEntity = _roundAnswerService.CreateOrUpdate(
                new RoundAnswerParams()
            {
                Choice      = model.Choice,
                GameRoundId = model.GameRoundId,
                UserId      = userId
            });

            if (_gameRoundService.IsRoundOver(model.GameRoundId))
            {
                var roundEnd = _gameRoundService.CalculateRoundEnd(model.GameRoundId);

                var gameRound       = _gameRoundService.Get(model.GameRoundId);
                var gameRoundParams = _mapper.Map <GameRoundParams>(gameRound);
                gameRoundParams.WinnerId = roundEnd.WinnerId;

                _gameRoundService.CreateOrUpdate(gameRoundParams);

                var game = _gameService.Get(model.GameId);

                if (!_gameRoundService.IsGameOver(model.GameId))
                {
                    var newRound = model.Round + 1;
                    await _hubContext.Clients
                    .Users(new List <string>() { game.HostUserId, game.GuestUserId })
                    .SendAsync("RoundEnds", JsonConvert.SerializeObject(roundEnd));

                    var newGameRoundEntity = _gameRoundService.CreateOrUpdate(new GameRoundParams(model.GameId, 0, newRound));
                    roundEndModel.Round       = newRound;
                    roundEndModel.GameRoundId = newGameRoundEntity.Id;


                    if (game.IsBotActivated)
                    {
                        var botUser     = _userService.GetUserByUserId(game.GuestUserId);
                        var credentials = await _userService.Login(new Services.Models.LoginModel()
                        {
                            Username = botUser.Nickname, Password = "******"
                        });

                        await BotSendAnswer(game, newGameRoundEntity, credentials.AccessToken);
                    }
                    return(roundEndModel);
                }
            }

            if (_gameRoundService.IsGameOver(model.GameId))
            {
                var gameEndResult = _gameRoundService.CalculateGameEnd(model.GameId);
                var game          = _gameService.Get(model.GameId);
                var gameParams    = _mapper.Map <GameParams>(game);
                gameParams.WinnerId = gameEndResult.UserId;
                var loserId = gameParams.WinnerId == game.HostUserId ? game.GuestUserId : game.HostUserId;
                _gameService.CreateOrUpdate(gameParams);

                var totalCreditsToAdd = game.Credit + gameEndResult.GainedCredits;

                await _loyaltySyncService.AddCredit(new CreditsModel(gameParams.WinnerId, totalCreditsToAdd), accessToken);

                await _loyaltySyncService.ChargeCredit(new CreditsModel(loserId, game.Credit), accessToken);

                await _loyaltySyncService.AddScores(new ScoreModel(gameParams.WinnerId, gameEndResult.TotalPoints), accessToken);

                if (!game.IsRematch)
                {
                    await _loyaltySyncService.AddWin(gameParams.WinnerId, accessToken);

                    await _loyaltySyncService.ResetWin(loserId, accessToken);
                }

                await _hubContext.Clients
                .Users(new List <string>() { game.HostUserId, game.GuestUserId })
                .SendAsync("GameEnds", JsonConvert.SerializeObject(gameEndResult));
            }
            else
            {
                await _bluffService.AskBluff(userId, model.GameId, model.GameRoundId);
            }

            roundEndModel.Round       = model.Round;
            roundEndModel.GameRoundId = roundAnswerEntity.GameRoundId;
            return(roundEndModel);
        }