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 Games.NinthPlanet StartGameFromState(NinthPlanetGameState dbGameState)
        {
            SavedGameState gameState = ToGameState(dbGameState);

            var gameServer = gameServerFactory.CreateGameFromState(gameState);
            var game       = new Games.NinthPlanet(gameServer);

            this.gameCache.TryAddGame(dbGameState.GameId, game);
            return(game);
        }