public async Task <Games.NinthPlanet> CreateNewGameAsync( int ownerId, NinthPlanetNewGameOptions newGameOptions, CancellationToken cancellationToken) { await semaphore.WaitAsync(cancellationToken); try { var gameInfo = new DbGameInfo { GameType = GameType.NinthPlanet, Name = newGameOptions.Name, MaximumNumberOfPlayers = newGameOptions.MaxNumberOfPlayers, IsPublic = newGameOptions.IsPublic, OwnerId = ownerId }; var gameServer = gameServerFactory.CreateNewGame(gameInfo); var state = gameServer.SaveCurrentState(); NinthPlanetGameState dbGameState = ToStoredState(gameInfo, state); dbContext.NinthPlanetGames.Add(dbGameState); await dbContext.SaveChangesAsync(cancellationToken); var game = new Games.NinthPlanet(gameServer); this.gameCache.TryAddGame(gameInfo.Id, game); return(game); } finally { semaphore.Release(); } }
private NinthPlanetGameState ToStoredState(DbGameInfo gameInfo, SavedGameState state) { var playerStates = state.PlayersInLobby .Select(x => new NinthPlanetPlayerState { PlayerId = x }) .ToList(); var dbGameState = new NinthPlanetGameState { GameInfo = gameInfo, RoundIsInProgress = state.RoundState != null, PlayerStates = playerStates, }; if (state.RoundState != null) { foreach (var playerState in state.RoundState.PlayerStates) { var storedState = playerStates.First(x => x.PlayerId == playerState.Key); storedState.PlayOrder = state.RoundState.PlayerOrder.IndexOf(playerState.Key); storedState.FinishedTasks = playerState.Value.FinishedTasks; storedState.UnfinishedTasks = playerState.Value.UnfinishedTasks; storedState.CardsInHand = playerState.Value.CardsInHand; storedState.ComunicatedCardColor = playerState.Value.DisplayedCard.Color; storedState.ComunicatedCardValue = playerState.Value.DisplayedCard.Value; storedState.CommunicationTokenPosition = playerState.Value.DisplayedCardTokenPosition; } } return(dbGameState); }