예제 #1
0
        public async Task <IGame> StartNewGameAsync(NewGameStarted newGameStarting)
        {
            if (newGameStarting == null)
            {
                throw new ArgumentNullException(nameof(newGameStarting));
            }
            _logger.LogTrace("GameManager.StartNewGame {newGameStarting}", newGameStarting);

            if (!_endPlayerManager.CheckUserAgainstId(newGameStarting))
            {
                return(null); // TODO - return some error state?
            }
            var newGame = await _gameFactory.SpawnNewGameAsync(newGameStarting).ConfigureAwait(false);

            if (_games.TryAdd(newGame.GameId, newGame))
            {
                _logger.LogDebug("GameManager.StartNewGame {newGame}", newGame);
            }
            else
            {
                _logger.LogError("unable to add new game {gameId} {newGame} for {user} on {connectionID}", newGame.GameId, newGame, newGameStarting.User, newGameStarting.ConnectionId);
            }

            return(newGame);
        }
예제 #2
0
        public JoinGame(NewGameStarted newGameStarted, Guid gameId)
        {
            if (newGameStarted == null)
            {
                throw new ArgumentNullException(nameof(newGameStarted));
            }

            User         = newGameStarted.User;
            ConnectionId = newGameStarted.ConnectionId;
            PlayerId     = newGameStarted.PlayerId;
            GameId       = gameId;
        }
예제 #3
0
        /*
         * Method for controller to start new game 
         */
        public void NewGame()
        {
            playerHasPassed[Color.White] = false;
            playerHasPassed[Color.Black] = false;

            turnHolder.Reset();
            
            NewGameStarted?.Invoke(this, new EventArgs());

            SetStartBoardPosition();

            countHolder.Reset();

            CountChanged?.Invoke(this, new CountChangedEventArgs
            {
                CountWhite = countHolder.GetPlayerCount(Color.White),
                CountBlack = countHolder.GetPlayerCount(Color.Black),
            });

            FinishTurnAndMoveOn();
        }
예제 #4
0
        public virtual async Task SpawnAsync(NewGameStarted newGameStarting)
        {
            if (newGameStarting == null)
            {
                throw new ArgumentNullException(nameof(newGameStarting));
            }
            if (_isSpawned)
            {
                throw new InvalidOperationException($"GameData {GameId} is already Spawned.");
            }

            GameId        = Guid.NewGuid();
            StartedUtc    = DateTime.UtcNow;
            StartedByUser = newGameStarting.User;
            CheeseCount   = newGameStarting.CheeseCount;
            Size          = newGameStarting.Size;
            Name          = newGameStarting.Name;

            try {
                Mode = (GameMode)newGameStarting.Mode;
            } catch {
                Mode = GameMode.Bingo;
            }
            _isSpawned = true;

            var callerCultureInfo = new CultureInfo("en-GB"); // TODO persist to setup game culture

            _allNumbers.Generate(Mode, callerCultureInfo);

            Logger.LogInformation("Spawning game {gameId} started on {connectionId} with {@newGameStarting}", GameId, newGameStarting.ConnectionId, newGameStarting);

            var joinGame = new JoinGame(newGameStarting, GameId);

            await AddPlayerAsync(joinGame).ConfigureAwait(false);

            await LobbyHubContext.Clients.All.LobbyNewGameHasStarted(this).ConfigureAwait(false);
        }
예제 #5
0
        public async Task <IGame> SpawnNewGameAsync(NewGameStarted newGameStarting)
        {
            if (newGameStarting == null)
            {
                throw new ArgumentNullException(nameof(newGameStarting));
            }

            _logger.LogTrace("GameFactory.SpawnNewGame {newGameStarting}", newGameStarting);

            IGame g;

            if (newGameStarting.Mode == (int)GameMode.Cheesy)
            {
                g = _serviceProvider.GetRequiredService <GamePassive>();
            }
            else
            {
                g = _serviceProvider.GetRequiredService <GameActive>();
            }

            await g.SpawnAsync(newGameStarting).ConfigureAwait(false);

            return(g);
        }
예제 #6
0
        public override async Task SpawnAsync(NewGameStarted newGameStarting)
        {
            await base.SpawnAsync(newGameStarting).ConfigureAwait(false);

            _gameNumbers = ThreadSafeRandom.Pick(AllNumbers.CountInUse, AllNumbers.CountInUse).ToList();
        }
예제 #7
0
 protected virtual void OnNewGameStarted(object source)
 {
     NewGameStarted?.Invoke(source);
 }
예제 #8
0
 public static void OnNewGameStarted(PersonalizedForSpecificPlayerStartGameDataRequest args)
 {
     NewGameStarted?.Invoke(null, new OpenNewGameWindowEventArgs {
         ReceivedData = args
     });
 }