Ejemplo n.º 1
0
        public async Task <CreateGameResponse> CreateGame(ShitheadGameConfig config, CreateShitheadGameRequest request)
        {
            await using (var transaction = await _dbContext.Database.BeginTransactionAsync())
            {
                var game = new Game(ShitheadConstants.GAME_TYPE, ShitheadConstants.GameModes.NORMAL);
                await _dbContext.Games.AddAsync(game);

                await _dbContext.SaveChangesAsync();

                var deckCount = 1 + request.NumberPlayers / 5;
                var deckPile  = new Pile(game, PileType.Deck, ShitheadConstants.PileIdentifiers.DECK);
                for (var i = 0; i < deckCount; i++)
                {
                    _deckFactory.AddDeckCardsToPile(config, deckPile, new CreateDeckOptions
                    {
                        IncludeJokers = true,
                        Shuffled      = true,
                    });
                }

                game.Piles.Add(deckPile);

                var playerFaceDownPiles = new List <Pile>();
                var playerFaceUpPiles   = new List <Pile>();
                var playerHandPiles     = new List <Pile>();
                for (var i = 0; i < request.NumberPlayers; i++)
                {
                    var player = new Player(game);
                    game.Players.Add(player);
                    await _dbContext.SaveChangesAsync();

                    var faceDownPile = game.CreatePlayerPile(player, PlayerHandType.FaceDown);
                    game.Piles.Add(faceDownPile);
                    playerFaceDownPiles.Add(faceDownPile);

                    var faceUpPile = game.CreatePlayerPile(player, PlayerHandType.FaceUp);
                    game.Piles.Add(faceUpPile);
                    playerFaceUpPiles.Add(faceUpPile);

                    var handPile = game.CreatePlayerPile(player, PlayerHandType.Hand);
                    game.Piles.Add(handPile);
                    playerHandPiles.Add(handPile);
                }

                for (var i = 1; i <= config.FaceDownCount; i++)
                {
                    foreach (var faceDownPile in playerFaceDownPiles)
                    {
                        var firstDeckCard = deckPile.Cards.First();
                        deckPile.Cards.Remove(firstDeckCard);
                        faceDownPile.Cards.Add(firstDeckCard);
                    }
                }

                for (var i = 1; i <= config.FaceUpCount; i++)
                {
                    foreach (var faceUpPile in playerFaceUpPiles)
                    {
                        var firstDeckCard = deckPile.Cards.First();
                        deckPile.Cards.Remove(firstDeckCard);
                        faceUpPile.Cards.Add(firstDeckCard);
                    }
                }

                for (var i = 1; i <= config.HandCount; i++)
                {
                    foreach (var handPile in playerHandPiles)
                    {
                        var firstDeckCard = deckPile.Cards.First();
                        deckPile.Cards.Remove(firstDeckCard);
                        handPile.Cards.Add(firstDeckCard);
                    }
                }

                var discardPile = new Pile(game, PileType.Discard, ShitheadConstants.PileIdentifiers.DISCARD);
                game.Piles.Add(discardPile);

                var burnPile = new Pile(game, PileType.Discard, ShitheadConstants.PileIdentifiers.BURN);
                game.Piles.Add(burnPile);

                game.State = game.Players.First().Id.ToString();

                await _dbContext.SaveChangesAsync();

                await transaction.CommitAsync();

                return(new CreateGameResponse(game));
            }
        }