예제 #1
0
        public dynamic ViewCards(string gameId, string from, string count)
        {
            var gameRequest = new ViewCardsRequest
            {
                GameId   = gameId,
                PlayerId = UserId,
                From     = (ViewFrom)Enum.Parse(typeof(ViewFrom), from),
                Count    = string.IsNullOrEmpty(count) ? 0 : int.Parse(count)
            };
            var result = Network.MakePostRequest <List <CardLink> >("cards/viewCards", gameRequest);
            var cards  = result.Data.Result.Select(c => new CardDto(c)).ToList();

            var failed = result.StatusCode != HttpStatusCode.OK || result.Data.Failed;

            return(Json(new
            {
                Failed = failed,
                Error = failed ? result.Content : null,
                Data = cards
            }));
        }
예제 #2
0
        public async Task <dynamic> ViewCards(ViewCardsRequest request)
        {
            Guid gameIdGuid;

            if (!Guid.TryParse(request.GameId, out gameIdGuid))
            {
                return(InvalidGameId(request.GameId));
            }

            var gameQuery = _context.Games
                            .Where(g => g.Id == gameIdGuid)
                            .Include(g => g.FirstPlayer)
                            .Include(g => g.SecondPlayer);

            switch (request.From)
            {
            case ViewFrom.Graveyard:
                gameQuery = gameQuery.Include(g => g.Grave.Select(i => i.CardLink.Card.rulings));
                break;

            case ViewFrom.Exile:
                gameQuery = gameQuery.Include(g => g.Exile.Select(i => i.CardLink.Card.rulings));
                break;

            case ViewFrom.TopOfTheDeck:
                gameQuery = gameQuery.Include(g => g.Top.Select(i => i.CardLink.Card.rulings));
                break;

            case ViewFrom.EnemyHand:
                break;
            }

            var game = await gameQuery.FirstOrDefaultAsync();

            if (game == null)
            {
                return(GameNotFound(request.GameId));
            }

            var player = await _context.Users.FirstOrDefaultAsync(u => u.Id == request.PlayerId);

            if (player == null)
            {
                return(PlayerNotFound(request.PlayerId));
            }

            if (game.FirstPlayer != player && game.SecondPlayer != player)
            {
                return(PlayerNotInGame(request.PlayerId, request.GameId));
            }

            List <CardLink> cardLinks = new List <CardLink>();

            switch (request.From)
            {
            case ViewFrom.Graveyard:
                cardLinks = game.Grave.Select(g => g.CardLink).ToList();
                break;

            case ViewFrom.Exile:
                cardLinks = game.Exile.Select(g => g.CardLink).ToList();
                break;

            case ViewFrom.TopOfTheDeck:
                if (game.Top.Count < request.Count)
                {
                    var delta       = request.Count - game.Top.Count;
                    var randomCards = await Utils.GetRandomCards(delta, _context);

                    var randomCardLinks = new List <CardLink>();

                    //save links to DB
                    foreach (var randomCard in randomCards)
                    {
                        var cardLink = new CardLink {
                            Card = randomCard
                        };
                        _context.CardLinks.Add(cardLink);
                        await _context.SaveChangesAsync();

                        _context.SaveChanges();
                        randomCardLinks.Add(cardLink);
                    }

                    foreach (var top in game.Top)
                    {
                        top.Number += delta;
                    }

                    for (int i = 0; i < delta; i++)
                    {
                        game.Top.Add(new Top
                        {
                            CardLink = randomCardLinks[i],
                            Number   = i + 1
                        });
                    }
                    foreach (var t in game.Top)
                    {
                        _context.Tops.AddOrUpdate(t);
                    }
                    await _context.SaveChangesAsync();
                }

                cardLinks = game.Top.OrderByDescending(t => t.Number).Take(request.Count).OrderBy(t => t.Number).Select(g => g.CardLink).ToList();

                break;

            case ViewFrom.EnemyHand:
                break;
            }

            Utils.FillImages(cardLinks.Select(l => l.Card));
            return(Json(new Response <List <CardLink> >
            {
                Result = cardLinks
            }));
        }