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); } }
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); }
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" }); } }
/// <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(); } } }
// 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()); }
// GET: Organizer/Games public ActionResult Games() { List <GameProject> games; using (var db = new NiteLigaContext()) games = db.GameProjects.ToList(); ViewBag.Games = games; return(View()); }
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; }
// 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()); }
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)); } }
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" }); } }
// 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()); }
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" }); } }
// 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()); }
// 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()); }
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); }); }
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])); } }
// 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()); }
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" }); } }
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); } } } } }
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" }); } }