Exemple #1
0
        public JsonResult PlayerTurn(int x, int y, int UnitId)
        {
            ApplicationUser user       = UserManager.FindByEmail(User.Identity.Name);
            ResultTurn      resultTurn = repository.Turn(user.UserName, user.Name, UnitId, x, y);

            return(Json(resultTurn, JsonRequestBehavior.AllowGet));
        }
        public ResultTurn Turn(string PlayerMail, string playerName, int UnitId, int X, int Y)
        {
            ResultTurn mes      = new ResultTurn();
            Unit       Attacker = context.Units.Find(UnitId);

            if (PlayerMail != Attacker.PlayerMail)
            {
                mes.Message = "Данный юнит не принадлежит игроку" + playerName;
                mes.Correct = false;
                return(mes);
            }
            else
            {
                if ((Math.Abs(Attacker.X - X) > 1) || (Math.Abs(Attacker.Y - Y) > 1))
                {
                    mes.Message = "Данный юнит не может произвести перемещение в току, с координатами x: " + X + " y: " + Y + ", так как находится на расстоянии большем чем 1 от данной области.";
                    mes.Correct = false;
                    return(mes);
                }
                Unit Defence = context.Units.Where(a => a.X == X && a.Y == Y).OrderBy(s => s.HP).FirstOrDefault();
                if (Defence == null)
                {
                    Attacker.X    = X;
                    Attacker.Y    = Y;
                    Attacker.Turn = DateTime.Now;
                    // context.SaveChanges();
                    mes.Message     = Attacker.Land + " произвёл захват области с координатами x: " + X + " y: " + Y + ", захват произвёл игрок " + playerName;
                    mes.Correct     = true;
                    mes.AtackerUnit = Attacker;
                    //Реализовать запись в журнал событий
                    context.Journals.Add(new Journal(PlayerMail, mes.Message, false));
                    context.SaveChanges();
                    return(mes);
                }

                if (Defence.Land == Attacker.Land)
                {
                    Attacker.X    = X;
                    Attacker.Y    = Y;
                    Attacker.Turn = DateTime.Now;
                    // context.SaveChanges();
                    mes.Message     = Attacker.Land + " произвёл перемещение в область с координатами x: " + X + " y: " + Y + ", игрок " + playerName;
                    mes.Correct     = true;
                    mes.AtackerUnit = Attacker;
                    //Реализовать запись в журнал событий
                    context.Journals.Add(new Journal(PlayerMail, mes.Message, false));
                    context.SaveChanges();
                    return(mes);
                }
                if (Defence.Land != Attacker.Land)
                {
                    if (Attacker.Ammunition <= 0)
                    {
                        //Если у атакующего нет снарядов
                        mes.Message = "Данный юнит не может произвести атаку, так как у нет боеприпасов!";
                        mes.Correct = false;
                        return(mes);
                    }
                    //Происходит бой. Производим расчёт
                    Unit      Defencer   = context.Units.Where(a => a.X == X && a.Y == Y).OrderBy(b => b.HP).FirstOrDefault();
                    Random    rand       = new Random();
                    UnitParam AtackParam = context.UnitParams.Where(a => a.Class == Attacker.Class).FirstOrDefault();
                    UnitParam DefenceParam;
                    if (Attacker.Class == Defencer.Class)
                    {
                        DefenceParam = AtackParam;
                    }
                    else
                    {
                        DefenceParam = context.UnitParams.Where(a => a.Class == Defencer.Class).FirstOrDefault();
                    }
                    mes.IsAttackMove = true;
                    if (Attacker.Type == "Artillery")
                    {
                        //Расчёт артобстрела
                        switch (Defencer.Type)
                        {
                        case "Infantry": mes.AtackerUron = AtackParam.InfantryAttack - AtackParam.InfantryAttack * (Defencer.Trench / 10) - DefenceParam.ArtilleryDefence; break;

                        case "Artillery": mes.AtackerUron = AtackParam.ArtilleryAttack - AtackParam.ArtilleryAttack * (Defencer.Trench / 10) - DefenceParam.ArtilleryDefence; break;

                        default: mes.AtackerUron = AtackParam.InfantryAttack; break;
                        }
                        mes.AtackerUron     += (rand.Next(0, 11) - 5); //Небольшой разбег на удачу для разнообразия
                        mes.AtackerUron      = mes.AtackerUron * (Attacker.HP / 100);
                        Attacker.Ammunition -= 1;
                        Attacker.Turn        = DateTime.Now;
                        Defencer.HP         -= mes.AtackerUron;
                        mes.Message          = Attacker.Land + " произвёл артобстрел местности, с координатами x: " + Defencer.X + " , y: " + Defencer.Y + " . В результате осбстрела юнит " + Defencer.Name + " ( " + Defencer.Type + " )" +
                                               ", принадлежащий игроку " + Defencer.PlayerMail + " , получил повреждения " + mes.AtackerUron + ".";
                        if (Defencer.HP <= 0)
                        {
                            // Защищающийся юнит уничтожен
                            context.Units.Remove(Defencer);
                            mes.Message     += " Юнит в результате артобстрела был полностью уничтожен!";
                            mes.DefencyIsRIP = true;
                        }
                        context.Entry(Attacker).State = System.Data.Entity.EntityState.Modified;
                        context.Entry(Defencer).State = System.Data.Entity.EntityState.Modified;
                        context.Journals.Add(new Journal(PlayerMail, mes.Message, false));
                        context.SaveChanges();
                        return(mes);
                    }
                    else
                    {
                        switch (Defencer.Type)
                        {
                        case "Infantry": mes.AtackerUron = AtackParam.InfantryAttack - AtackParam.InfantryAttack * (Defencer.Trench / 10); break;

                        case "Artillery": mes.AtackerUron = AtackParam.ArtilleryAttack - AtackParam.ArtilleryAttack * (Defencer.Trench / 10); break;

                        default: mes.AtackerUron = AtackParam.InfantryAttack; break;
                        }

                        switch (Attacker.Type)
                        {
                        case "Infantry": mes.AtackerUron -= DefenceParam.InfantryDefence; mes.DefenceUron = DefenceParam.InfantryAttack * (Defencer.HP / 100); break;

                        default: mes.AtackerUron = AtackParam.InfantryAttack; mes.DefenceUron = DefenceParam.InfantryAttack; break;
                        }

                        mes.AtackerUron     += (rand.Next(0, 11) - 5); //Небольшой разбег на удачу для разнообразия
                        mes.AtackerUron      = mes.AtackerUron * (Attacker.HP / 100);
                        Attacker.Ammunition -= 1;
                        Attacker.Turn        = DateTime.Now;
                        mes.Message          = Attacker.Land + " произвёл атаку местности, с координатами x: " + Defencer.X + " , y: " + Defencer.Y + " . В результате атаки юнит " + Defencer.Name + " ( " + Defencer.Type + " )" +
                                               ", принадлежащий игроку " + Defencer.PlayerMail + " , получил повреждения " + mes.AtackerUron + ".";
                        if (Defencer.Ammunition > 0)
                        {
                            mes.DefenceUron     += (rand.Next(0, 11) - 5);
                            mes.DefenceUron      = mes.DefenceUron * (Defencer.HP / 100);
                            Attacker.HP         -= mes.DefenceUron;
                            Defencer.Ammunition -= 1;
                            mes.Message         += " Атакующий юнит " + Attacker.Name + " ( " + Attacker.Type + " ) получил урон " + mes.DefenceUron;
                        }
                        Defencer.HP -= mes.AtackerUron;
                        if (Defencer.HP <= 0)
                        {
                            // Защищающийся юнит уничтожен
                            context.Units.Remove(Defencer);
                            mes.Message     += " Юнит в результате атаки был полностью уничтожен!";
                            Attacker.X       = X;
                            Attacker.Y       = Y;
                            mes.DefencyIsRIP = true;
                        }
                        if (Attacker.HP <= 0)
                        {
                            // Атакующий юнит уничтожен
                            context.Units.Remove(Attacker);
                            mes.Message     += " Атакующий в ходе атаки был полностью уничтожен!";
                            mes.AtackerIsRIP = true;
                        }
                        context.Journals.Add(new Journal(PlayerMail, mes.Message, false));
                        context.Entry(Attacker).State = System.Data.Entity.EntityState.Modified;
                        context.Entry(Defencer).State = System.Data.Entity.EntityState.Modified;
                        context.SaveChanges();
                        return(mes);
                    }

                    return(mes);
                }
            }

            return(mes);
        }