public Employee(Guid id, string name, string email) { Id = id; _name = name; _email = email; NewEvents.Add(new EmployeeCreated(this)); }
public void Restore(GameBackupModel backup) { if (GameStatus != GameStatusType.Created) { throw new Exception("Нельзя восстановить игру, так как она уже была запущена."); } StoredEvents.AddRange(backup.StoredEvents); GameStatus = backup.GameStatus; LaunchTime = backup.LaunchTime; EndTime = backup.EndTime; foreach (var td in backup.TeamProgress) { LocalTeam team = Teams.Single(x => x.Id == td.Key); team.Progress = new TeamGameProgress( Config.Grid[Teams.IndexOf(team)], td.Value.LastHintTime, td.Value.LastTaskCompleteTime, td.Value.CurrentTaskIndex ); } NewEvents.Add(new GameRestored(DateTime.Now)); SendBroadcastMessage("Игра была восстановлена после перезапуска"); }
public void Stop() { if (GameStatus != GameStatusType.InProgress) { throw new Exception("Остановить игру можно только в процессе игры."); } NewEvents.Add(new GameStopped(DateTime.Now)); }
public void Abort() { if (GameStatus != GameStatusType.InProgress) { throw new Exception("Прервать игру можно только в процессе игры."); } NewEvents.Add(new GameAborted(DateTime.Now)); }
/// <summary> /// Adds a new history event to the Events list and optionally NewEvents list /// </summary> /// <param name="historyEvent">The history event to add</param> /// <param name="isNewEvent">Flag indicating whether this is a new event or not</param> void AddEvent(HistoryEvent historyEvent, bool isNewEvent) { Events.Add(historyEvent); if (isNewEvent) { NewEvents.Add(historyEvent); } SetMarkerEvents(historyEvent); }
public void Start() { if (GameStatus != GameStatusType.Created) { throw new Exception("Нельзя начать игру, так как она уже была запущена."); } GameStatus = GameStatusType.InProgress; LaunchTime = DateTime.Now; NewEvents.Add(new GameStarted((DateTime)LaunchTime)); SendBroadcastMessage("Игра началась!"); }
/// <summary> /// Отправляет широковещательное сообщение каждому игроку в игре. /// </summary> public void SendBroadcastMessage(string message) { NewEvents.Add(new AdminSendMessage(DateTime.Now, message)); // Формирование списка всех игроков List <LocalPlayer> allPlayers = new List <LocalPlayer>(); foreach (var team in Teams) { allPlayers.AddRange(team.Players); } Noticer.AddOutputMessages(allPlayers, message); }
/// <summary> /// Adds a new history event to the Events list and optionally NewEvents list /// </summary> /// <param name="historyEvent">The history event to add</param> /// <param name="isNewEvent">Flag indicating whether this is a new event or not</param> void AddEvent(HistoryEvent historyEvent, bool isNewEvent) { if (IsDuplicateEvent(historyEvent)) { return; } Events.Add(historyEvent); if (isNewEvent) { NewEvents.Add(historyEvent); } SetMarkerEvents(historyEvent); }
/// <summary> /// Обрабатывает один фрейм игры, на текущий момент времени. /// </summary> public void Iterate() { if (GameStatus != GameStatusType.InProgress && GameStatus != GameStatusType.Stopped) { return; } lock (_locker) { // Запоминаем время начала итерации DateTime curTime = DateTime.Now; int eventsCount = NewEvents.Count; // STEP 1: Обрабатываем все ивенты (если они есть) if (eventsCount > 0) { // Получаем список ивентов, обрабатываемый на текущей итерации List <GameEvent> processedEvents = NewEvents.GetRange(0, eventsCount).OrderBy(x => x.AddDate).ToList(); NewEvents.RemoveRange(0, eventsCount); // Выполняем каждый ивент foreach (GameEvent currentEvent in processedEvents) { currentEvent.Run(this); } // Добавляем все обработанные ивенты в список StoredEvents.AddRange(processedEvents); } // STEP 2: Добавляем новые ивенты, если прошло необходимое время (подсказка, слив адреса, слив задания) if (GameStatus != GameStatusType.Stopped) { foreach (LocalTeam t in Teams) { // Получение первого задания, если прошло достаточно времени и команда еще не начала играть. if (t.Progress == null) { if (curTime > ((DateTime)LaunchTime).AddSeconds(Setting.SecondsDelayStart * Teams.IndexOf(t))) { NewEvents.Add(new TeamStartsPlay(curTime, t.Id)); } continue; } if (t.Progress.IsAllTaskCompleted()) { continue; } // Кол-во секунд, прошедшее со сдачи последнего задания double lastCompleteTaskSec = curTime.Subtract(t.Progress.LastTaskCompleteTime).TotalSeconds; // Кол-во секунд, прошедшее с получения последней подсказки double lastHintSec = curTime.Subtract(t.Progress.LastHintTime).TotalSeconds; // ... сливаем задание if (lastCompleteTaskSec > (Setting.TaskDropDelaySec + Setting.Hint2DelaySec + Setting.Hint1DelaySec)) { NewEvents.Add(new TeamDropTask(curTime, t.Id, t.Progress.CurrentTaskIndex)); } // ... сливаем адрес else if (lastCompleteTaskSec > (Setting.Hint2DelaySec + Setting.Hint1DelaySec) && lastHintSec > Setting.Hint2DelaySec) { NewEvents.Add(new TeamGetAddress(curTime, t.Id, t.Progress.CurrentTaskIndex)); } // ... сливаем подсказку else if (lastCompleteTaskSec > (Setting.Hint1DelaySec) && lastHintSec > Setting.Hint1DelaySec) { NewEvents.Add(new TeamGetHint(curTime, t.Id, t.Progress.CurrentTaskIndex)); } } } // STEP 3: Анализируем пришедшие сообщения от пользователей и добавляем новые ивенты List <Message> inputMessages = Noticer.PullInput(); foreach (Message m in inputMessages) { LocalTeam playerTeam = Teams.First(x => x.Id == m.Player.TeamId); if (playerTeam.Progress == null) { m.Player.SendMessage(Noticer, $"Ваша команда еще не получила первое задание."); continue; } if (playerTeam.Progress.GetCurrentTask() == null) { m.Player.SendMessage(Noticer, $"Ваша команда уже выполнила все задания."); continue; } switch (m.Text) { case "задание": m.Player.SendMessage(Noticer, $"Какая-то подсказка."); continue; } if (playerTeam.Progress.GetCurrentTask().Code == m.Text) { NewEvents.Add(new PlayerCompletedTask(curTime, playerTeam.Id, m.Player.Id, playerTeam.Progress.CurrentTaskIndex)); } else { NewEvents.Add(new PlayerFailedTask(curTime, playerTeam.Id, m.Player.Id, playerTeam.Progress.CurrentTaskIndex)); } } // STEP 4: Завершение игры // Переводим игру в статус "останавливается", если пришло время конца игры. if (GameStatus == GameStatusType.InProgress && curTime.Subtract((DateTime)LaunchTime).TotalMinutes > Setting.GameDurationMin) { NewEvents.Add(new GameStopped(DateTime.Now)); } // Если после остановки игры прошло необходимое кол-во минут - завершаем игру. if (GameStatus == GameStatusType.Stopped && EndTime != null && curTime > EndTime?.AddMinutes(Setting.GameClosingDurationMin)) { GameStatus = GameStatusType.Ended; SendBroadcastMessage("Приём кодов завершён."); } } }