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);
        }