public bool BeginTurn(Campaign campaign)
        {
            // Trouver l'id du joueur admin
            var players = (from p in _dal.Players
                           where p.CampaignId == campaign.Id
                           select p).ToList();
            var adminId = players.FirstOrDefault(p => p.IsAdmin).Id;

            // Générer la map de début de tour
            foreach (var player in players.Where(p => !p.IsAdmin))
            {
                var newMap = new Map()
                {
                    PlayerId     = player.Id,
                    CampaignId   = campaign.Id,
                    Name         = $"Début de Tour {campaign.CurrentTurn}",
                    Turn         = campaign.CurrentTurn,
                    Size         = 9,
                    CreationDate = DateTime.Now
                };
                _dal.Maps.Add(newMap);
                _dal.SaveChanges();
                _dal.MapTiles.AddRange(this.GenerateMapTiles(newMap.Id, campaign.Id, player.Id, 0));
                player.HasNewMap = true;
            }

            // Générer les feuilles d'ordres des joueurs
            foreach (var player in players.Where(p => !p.IsAdmin))
            {
                var playerAssets = JsonSerializer.Deserialize <PlayerAssets>(player._jsonAssets);
                var sheet        = new OrdersSheet()
                {
                    MaxOrdersCount = 5,
                    MaxPriority    = Math.Min(playerAssets.Resources.Strategy, 10),
                    PlayerId       = player.Id,
                    Priority       = 0,
                    Status         = OrdersSheetStatus.Writing,
                    Turn           = campaign.CurrentTurn
                };
                _dal.OrdersSheets.Add(sheet);
            }
            _dal.SaveChanges();

            return(true);
        }
Esempio n. 2
0
        public ActionResult Put(OrdersSheet input)
        {
            try
            {
                using (_dal)
                {
                    var claim = User.Claims.Where(x => x.Type == ClaimTypes.Sid).FirstOrDefault();
                    if (claim == null)
                    {
                        return(Unauthorized());
                    }
                    var idPlayer = long.Parse(claim.Value);

                    // On récupère la feuille d'ordres concernée
                    var ordersSheet = (from s in _dal.OrdersSheets
                                       where s.PlayerId == idPlayer && s.Id == input.Id
                                       select s).FirstOrDefault();
                    if (ordersSheet == null)
                    {
                        return(NotFound());
                    }

                    if (ordersSheet.Status != OrdersSheetStatus.Writing)
                    {
                        return(StatusCode((int)HttpStatusCode.PreconditionFailed, "Statut incorrect de la feuille d'ordres"));
                    }
                    ordersSheet.Priority = input.Priority;
                    _dal.SaveChanges();

                    return(Ok(ordersSheet));
                }
            }
            catch (Exception)
            {
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
        }
        public List <Order> CheckOrdersSheet(OrdersSheet sheet)
        {
            // On récupère les infos des joueurs de la campagne
            var dbPlayer = (from p in _dal.Players
                            where p.Id == sheet.PlayerId
                            select p).FirstOrDefault();
            var player = new Player()
            {
                Id         = dbPlayer.Id,
                Assets     = dbPlayer.Assets,
                CampaignId = dbPlayer.CampaignId,
                Name       = dbPlayer.Name
            };

            // On récupère les infos des armées du joueur
            var dbUnits = (from u in _dal.Units
                           join p in _dal.Players on u.PlayerId equals p.Id
                           where p.Id == dbPlayer.Id
                           select u).ToList();
            var units = new List <Unit>();

            foreach (var army in dbUnits.Where(u => u.Type == "Army"))
            {
                units.Add(new Unit()
                {
                    Id       = army.Id,
                    Assets   = army.Assets,
                    Name     = army.Name,
                    PlayerId = army.PlayerId,
                    Type     = army.Type,
                    X        = army.X,
                    Y        = army.Y
                });
            }

            // On récupère les ordres de la feuille d'ordres
            var orders = (from o in _dal.Orders
                          where o.OrdersSheetId == sheet.Id
                          orderby o.Rank
                          select o).ToList();

            // On nettoie les unités virtuelles des ordres de renforts supprimés
            List <Unit> expiredUnits = new List <Unit>();

            foreach (var virtualUnit in dbUnits.Where(u => u.Type == "Reinforcement"))
            {
                long orderId;
                if (virtualUnit.Assets.ContainsKey("OrderId") && long.TryParse(virtualUnit.Assets["OrderId"].Keys.FirstOrDefault(), out orderId))
                {
                    var order = orders.FirstOrDefault(o => o.Id == orderId);
                    if (order == null)
                    {
                        expiredUnits.Add(virtualUnit);
                    }
                }
            }
            _dal.Units.RemoveRange(expiredUnits);

            // On contrôle la validité des PPs
            var playerAssets = JsonSerializer.Deserialize <PlayerAssets>(player._jsonAssets);

            if (playerAssets.Resources.Strategy < sheet.Priority)
            {
                sheet.Priority = playerAssets.Resources.Strategy;
            }
            playerAssets.Resources.Strategy -= sheet.Priority;
            player._jsonAssets = JsonSerializer.Serialize <PlayerAssets>(playerAssets);

            // On contrôle la validité de chaque ordre
            foreach (var order in orders)
            {
                order.ActionType = (from a in _dal.ActionTypes
                                    where a.Id == order.ActionTypeId
                                    select a).FirstOrDefault();
                switch (order.ActionType.Label)
                {
                case "Commerce":
                {
                    this._validationEngine.Trade(order, player);
                    break;
                }

                case "Déplacement":
                {
                    this._validationEngine.Move(order, player, units);
                    break;
                }

                case "Flatterie":
                {
                    this._validationEngine.Flatter(order, player);
                    break;
                }

                case "Formation":
                {
                    this._validationEngine.Formation(order, player, units);
                    break;
                }

                case "Médisance":
                {
                    this._validationEngine.Calomny(order, player);
                    break;
                }

                case "Planification":
                {
                    this._validationEngine.Planify(order, player);
                    break;
                }

                case "Renforts":
                {
                    this._validationEngine.Reinforce(order, player, units);
                    break;
                }

                case "Renseignements":
                {
                    this._validationEngine.Spy(order, player);
                    break;
                }

                default:
                {
                    order.Status  = OrderStatus.Invalid;
                    order.Comment = "Type d'action inconnu";
                    break;
                }
                }
            }
            return(orders);
        }