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)); } }
public async Task <ActionResult <CreateGameResponse> > CreateShitheadGame( CreateShitheadGameRequest request) { return(await _shitheadGameEngine.CreateGame(ShitheadGameConfig.Default, request)); }