Esempio n. 1
0
        public static void StartGame(long gameProjectId, bool isTestRun)
        {
            lock (_locker)
            {
                if (Games.Count > MAXGAMES)
                {
                    throw new Exception($"Максимальное количество одновременно проводимых игр ({MAXGAMES}) превышено");
                }

                // First check
                if (Games.ContainsKey(gameProjectId))
                {
                    throw new Exception("Нельзя начать игру, так как она уже была начата");
                }

                GameArchive gameArchive;
                GameProject gameProject;
                using (var db = new NiteLigaContext())
                {
                    gameProject = db.GameProjects.Single(x => x.Id == gameProjectId);

                    // Проверяем, были ли проведены НЕ ТЕСТОВЫЕ игры по этой конфигурации
                    if (gameProject.GameArchives != null && gameProject.GameArchives.Where(x => x.IsTestRun == false).Count() != 0)
                    {
                        throw new Exception("Эта игра уже проводилась");
                    }

                    // Проверяем конфигурацию на наличие ошибок
                    List <string> verifyErrors;
                    if (!gameProject.VerifyData(out verifyErrors))
                    {
                        throw new Exception($"Игра неправильно сконфигурирована ({verifyErrors.Aggregate((a, b) => a + ',' + b)})");
                    }

                    // Добавляем запись в архив
                    gameArchive = db.GameArchives.Add(new GameArchive
                    {
                        StartDate     = DateTime.Now,
                        IsTestRun     = isTestRun,
                        Log           = "{}",
                        GameProjectId = gameProject.Id
                    });
                    db.SaveChanges();
                }

                GameManager gm = new GameManager(gameProject.GetConfig(), gameProject.GetSetting());

                // Second check
                if (Games.ContainsKey(gameProjectId))
                {
                    return;
                }

                Games[gameProjectId] = gm;

                // Запускаем игру
                Games[gameProjectId].Start();
                GameWorkOn(gameProjectId, gameArchive.Id);
            }
        }
Esempio n. 2
0
        private void button1_Click(object sender, EventArgs e)
        {
            List <int>  teamIds     = null;
            List <long> playerVkIds = null;

            using (var db = new NiteLigaContext())
            {
                var teams = db.Teams.Take(3);
                teamIds     = teams.Select(x => x.Id).ToList();
                playerVkIds = db.Players.Where(x => teamIds.Contains(x.PlayersInTeams.First().TeamId)).Select(x => x.VkId).ToList();
            }

            comboBox1.Items.Clear();
            foreach (var i in playerVkIds)
            {
                comboBox1.Items.Add(i);
            }

            GameConfig  config  = new GameConfig("{\"GameDate\":\"2018-08-02T23:04:54.2585947+03:00\",\"Address\":\"Место старта\",\"Description\":\"Описание игры\",\"Tasks\":[{\"Task\":\"Задание1\",\"Hint1\":\"Задание1\",\"Hint2\":\"Задание1\",\"Address\":\"Задание1\",\"Code\":\"Задание1\",\"Lat\":\"1.0000\",\"Lon\":\"1.0000\"},{\"Task\":\"Задание2\",\"Hint1\":\"Задание2\",\"Hint2\":\"Задание2\",\"Address\":\"Задание2\",\"Code\":\"Задание2\",\"Lat\":\"2.0000\",\"Lon\":\"2.0000\"},{\"Task\":\"Задание3\",\"Hint1\":\"Задание3\",\"Hint2\":\"Задание3\",\"Address\":\"Задание3\",\"Code\":\"Задание3\",\"Lat\":\"3.0000\",\"Lon\":\"3.0000\"}],\"TaskGrid\":[[\"0\",\"1\"],[\"2\",\"0\"],[\"1\",\"0\"]]}");
            GameSetting setting = new GameSetting()
            {
                GameDurationMin        = 1,
                GameClosingDurationMin = 1,
                SecondsDelayStart      = 30,
                Hint1DelaySec          = 20,
                Hint2DelaySec          = 20,
                TaskDropDelaySec       = 10,
                TeamIds = teamIds
            };

            gm = new GameManager(config, setting);
            gm.Start();

            //GameConfig gc = JsonConvert.DeserializeObject<GameConfig>(JSONCONFIG);
        }
Esempio n. 3
0
        public object Verify(int id)
        {
            try
            {
                GameProject game;
                using (var db = new NiteLigaContext())
                    game = db.GameProjects.Single(x => x.Id == id);

                List <string> errorList;
                bool          isGood = game.VerifyData(out errorList);

                if (isGood)
                {
                    return new { message = "Game is verified" }
                }
                ;
                else
                {
                    return new { errorList = errorList, message = "Game is not verified" }
                };
            }
            catch
            {
                return(new { error = "An error occurred while verifying the Game" });
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Добавляет новых пользователей в базу по VK id (если пользователей несколько, то их нужно указывать через запятую)
        /// </summary>
        public static void AddNewUsers(string userVkIds)
        {
            var vkData = VkontakteManager.GetUserData(userVkIds);

            if (vkData.Response.Length > 0)
            {
                using (var db = new NiteLigaContext())
                {
                    foreach (VkUserData user in vkData.Response)
                    {
                        if (db.Players.FirstOrDefault(x => x.VkId == user.Id) == null)
                        {
                            db.Players.Add(new Player
                            {
                                VkId             = user.Id,
                                FirstName        = user.FirstName,
                                LastName         = user.LastName,
                                Photo50          = user.Photo50,
                                Photo200         = user.Photo200,
                                RegistrationDate = DateTime.Now
                            });
                        }
                    }
                    db.SaveChanges();
                }
            }
        }
Esempio n. 5
0
        // GET: Organizer/Editor
        public ActionResult Editor(int id = 0)
        {
            GameProject game;

            using (var db = new NiteLigaContext())
                game = db.GameProjects.FirstOrDefault(x => x.Id == id);

            ViewBag.Game = game;

            return(View());
        }
Esempio n. 6
0
        // GET: Organizer/Games
        public ActionResult Games()
        {
            List <GameProject> games;

            using (var db = new NiteLigaContext())
                games = db.GameProjects.ToList();

            ViewBag.Games = games;

            return(View());
        }
Esempio n. 7
0
 public Message(long vkId, string text)
 {
     this.AddDate = DateTime.Now;
     using (var db = new NiteLigaContext())
     {
         Player player = db.Players.First(x => x.VkId == vkId);
         var    a      = db.PlayersInTeams.Where(x => x.PlayerId == player.Id);
         var    teamId = db.PlayersInTeams.Where(x => x.PlayerId == player.Id).First().TeamId;
         this.Player = new LocalPlayer(player, teamId);
     }
     this.Text = text;
 }
Esempio n. 8
0
        // GET: Social/Team/{id}
        public ActionResult Team(int id = 0)
        {
            Team          team        = null;
            List <Player> teamPlayers = null;

            using (var db = new NiteLigaContext()) {
                team        = db.Teams.FirstOrDefault(x => x.Id == id);
                teamPlayers = db.PlayersInTeams.Where(x => x.TeamId == id).Select(x => x.Player).ToList();
            }

            ViewBag.Team    = team;
            ViewBag.Players = teamPlayers;

            return(View());
        }
Esempio n. 9
0
        public LocalTeam(NiteLigaContext db, int teamId)
        {
            Team team = db.Teams.First(x => x.Id == teamId);

            this.Id       = team.Id;
            this.Name     = team.Name;
            this.Progress = null;
            this.Players  = new List <LocalPlayer>();

            List <Player> players = db.PlayersInTeams.Where(x => x.TeamId == team.Id).Select(x => x.Player).ToList();

            for (int i = 0; i < players.Count; i++)
            {
                this.Players.Add(new LocalPlayer(players[i], teamId));
            }
        }
Esempio n. 10
0
 public object Get(int id)
 {
     try
     {
         GameProject game;
         using (var db = new NiteLigaContext())
         {
             game = db.GameProjects.Single(x => x.Id == id);
         }
         return(new { data = game, message = "Game getted successfully" });
     }
     catch
     {
         return(new { error = "An error occurred while getting the Game" });
     }
 }
Esempio n. 11
0
        // GET: Organizer/LaunchPanel
        public ActionResult LaunchPanel()
        {
            List <GameProject> gameProjects;
            List <GameArchive> gameArchives;

            using (var db = new NiteLigaContext())
            {
                gameProjects = db.GameProjects.Where(x => x.GameArchives.FirstOrDefault(y => y.IsTestRun == false) == null).ToList();
                gameArchives = db.GameArchives.ToList();
            }

            ViewBag.GameProjects = gameProjects;
            ViewBag.GameArchives = gameArchives;

            return(View());
        }
Esempio n. 12
0
        public object Delete(int id)
        {
            try
            {
                GameProject game;
                using (var db = new NiteLigaContext())
                {
                    game = db.GameProjects.Single(x => x.Id == id);

                    db.GameProjects.Remove(game);
                    db.SaveChanges();
                }
                return(new { data = game, message = "Game deleted successfully" });
            }
            catch
            {
                return(new { error = "An error occurred while deleting the Game" });
            }
        }
Esempio n. 13
0
        // GET: Social/PlayerList/{id?}
        public ActionResult PlayerList(int id = 1)
        {
            int           pageIndex = Math.Max(id, 1);
            List <Player> players   = null;
            int           playersCount;

            using (var db = new NiteLigaContext())
            {
                players      = db.Players.OrderBy(x => x.Id).Skip((pageIndex - 1) * ROWSATPAGE).Take(ROWSATPAGE).ToList();
                playersCount = db.Players.Count();
            }

            ViewBag.Players      = players;
            ViewBag.PlayersCount = playersCount;
            ViewBag.PageCount    = (int)((double)playersCount / ROWSATPAGE) + 1;
            ViewBag.PageIndex    = pageIndex;

            return(View());
        }
Esempio n. 14
0
        // GET: Social/TeamList/{id?}
        public ActionResult TeamList(int id = 1)
        {
            int         pageIndex = Math.Max(id, 1);
            List <Team> teams     = null;
            int         teamsCount;

            using (var db = new NiteLigaContext())
            {
                teams      = db.Teams.OrderBy(x => x.Id).Skip((pageIndex - 1) * ROWSATPAGE).Take(ROWSATPAGE).ToList();
                teamsCount = db.Teams.Count();
            }

            ViewBag.Teams      = teams;
            ViewBag.TeamsCount = teamsCount;
            ViewBag.PageCount  = (int)((double)teamsCount / ROWSATPAGE) + 1;
            ViewBag.PageIndex  = pageIndex;

            return(View());
        }
Esempio n. 15
0
        private static void GameWorkOn(long gameProjectId, long gameArchiveId)
        {
            Task task = Task.Run(() =>
            {
                GameManager gm        = Games[gameProjectId];
                DateTime lastSaveTime = DateTime.Now;

                // Основной цикл игры
                while (gm.GameStatus == GameStatusType.InProgress || gm.GameStatus == GameStatusType.Stopped)
                {
                    // Просчитываем один фрейм игры
                    gm.Iterate();

                    // Сохраняем игру, если прошло нужное время
                    if (DateTime.Now > lastSaveTime.AddMinutes(SaveDelayMin))
                    {
                        using (var db = new NiteLigaContext())
                        {
                            GameArchive ga = db.GameArchives.Single(x => x.Id == gameArchiveId);
                            ga.Log         = gm.GetLastBackup();
                            db.SaveChanges();
                        }
                        lastSaveTime = DateTime.Now;
                    }

                    // Делаем паузу
                    Thread.Sleep(IterationDelayMs);
                }

                // Сохраняем время завершения игры и самый последний лог
                using (var db = new NiteLigaContext())
                {
                    GameArchive ga = db.GameArchives.Single(x => x.Id == gameArchiveId);
                    ga.Log         = gm.GetLastBackup();
                    ga.EndDate     = DateTime.Now;
                    db.SaveChanges();
                }

                // Убираем игру из общего списка
                Games.Remove(gameProjectId);
            });
        }
Esempio n. 16
0
        public GameManager(GameConfig config, GameSetting setting)
        {
            this._locker = new object();

            this.Setting      = setting;
            this.Config       = config;
            this.LaunchTime   = null;
            this.GameStatus   = GameStatusType.Created;
            this.Noticer      = new MessageManager();
            this.NewEvents    = new List <GameEvent>();
            this.StoredEvents = new List <GameEvent>();

            // Формирование локальной копии всех команд и игроков участников
            Teams = new List <LocalTeam>();
            using (var db = new NiteLigaContext())
                for (int i = 0; i < Setting.TeamIds.Count; i++)
                {
                    Teams.Add(new LocalTeam(db, Setting.TeamIds[i]));
                }
        }
Esempio n. 17
0
        // GET: Social/Player/{id?}
        public ActionResult Player(int id = 0)
        {
            Player player = null;

            if (id == 0)
            {
                long vkId = InfoManager.GetCurrentUserVkId();
                using (var db = new NiteLigaContext())
                    player = db.Players.FirstOrDefault(x => x.VkId == vkId);
            }
            else
            {
                using (var db = new NiteLigaContext())
                    player = db.Players.FirstOrDefault(x => x.Id == id);
            }

            ViewBag.Player = player;

            return(View());
        }
Esempio n. 18
0
 public object Update(int id, GameProjectModel model)
 {
     try
     {
         GameProject game;
         using (var db = new NiteLigaContext())
         {
             game            = db.GameProjects.Single(x => x.Id == id);
             game.UpdateDate = DateTime.Now;
             game.Caption    = model.Caption;
             game.Setting    = model.Setting;
             game.Config     = model.Config;
             db.SaveChanges();
         }
         return(new { message = "Game updated successfully" });
     }
     catch
     {
         return(new { error = "An error occurred while updating the Game" });
     }
 }
Esempio n. 19
0
        public static void Initialize()
        {
            lock (_locker)
            {
                List <GameArchive> notEndedGames;
                using (var db = new NiteLigaContext())
                {
                    // Получаем список незавершённых игр
                    notEndedGames = db.GameArchives.Where(x => x.EndDate == null).ToList();

                    // Восстанавливаем прогресс всех незавершённых игр, и запускаем их
                    foreach (var g in notEndedGames)
                    {
                        GameManager gm = new GameManager(g.GameProject.GetConfig(), g.GameProject.GetSetting());
                        if (!Games.ContainsKey(g.Id))
                        {
                            Games[g.GameProjectId] = gm;
                            Games[g.GameProjectId].Restore(JsonConvert.DeserializeObject <GameBackupModel>(g.Log, new GameBackupConverter()));
                            GameWorkOn(g.GameProjectId, g.Id);
                        }
                    }
                }
            }
        }
Esempio n. 20
0
 public object Create()
 {
     try
     {
         GameProject newGame;
         DateTime    dt = DateTime.Now;
         using (var db = new NiteLigaContext())
         {
             newGame = db.GameProjects.Add(new GameProject
             {
                 CreateDate = dt,
                 UpdateDate = dt,
                 Caption    = $"Новая игра ({dt.ToShortDateString()})",
                 Setting    = JsonConvert.SerializeObject(new GameSetting
                 {
                     GameClosingDurationMin = 5,
                     GameDurationMin        = 20,
                     Hint1DelaySec          = 15,
                     Hint2DelaySec          = 15,
                     TaskDropDelaySec       = 10,
                     SecondsDelayStart      = 10,
                     TeamIds = new List <int>()
                 }),
                 Config = JsonConvert.SerializeObject(new GameConfigModel
                 {
                     Address     = "Адрес проведения игры",
                     GameDate    = DateTime.Now.Date,
                     Description = "Описание игры на " + DateTime.Now.Date,
                     Tasks       = new List <GameTask>()
                     {
                         new GameTask {
                             Lat     = 33,
                             Lon     = 44,
                             Address = "ул. Тест, дом 1",
                             Task    = "Формулировка задания 1",
                             Hint1   = "Подсказка задания 1",
                             Hint2   = "Слив адреса задания 1",
                             Code    = "1",
                         },
                         new GameTask {
                             Lat     = 55,
                             Lon     = 66,
                             Address = "ул. Тест, дом 2",
                             Task    = "Формулировка задания 2",
                             Hint1   = "Подсказка задания 2",
                             Hint2   = "Слив адреса задания 2",
                             Code    = "2",
                         }
                     },
                     TaskGrid = new List <List <int> >()
                 }),
             });
             db.SaveChanges();
         }
         return(new { data = newGame, message = "New Game created successfully" });
     }
     catch
     {
         return(new { error = "An error occurred while creating the Game" });
     }
 }