public void Initialize(uint difficulty) { currentDate = new System.DateTime(startYear, startMonth, 1); progress = 0.0f; goalCell = Grid.grid.GetRandomCellID(1, 1); workPlan = new WorkPlan(); finances = new Finances(); simParam = new SimulationParameters(difficulty); statEffects = new StatusEffects(); onNewDay = null; // dayEvents = new List<ScenarioEvent>(); // nightEvents = new List<ScenarioEvent>(); StopAllCoroutines(); workingAnimation = null; workingProcess = null; nightProcess = null; nightAnimation = null; helperCounter = 0; helperCounter2 = 0; workPlan.SetExcavationArea(Grid.grid.GetRandomCellID(), ControlManager.minVizFieldRadius); }
private NewDayListener() { var checkingDuration = TimeSpan.FromMinutes(30).TotalMilliseconds; _checkNewDayTimer = new Timer(); _checkNewDayTimer.Interval = checkingDuration; _checkNewDayTimer.Elapsed += (sender, args) => { if (_currentDate == DateTime.Now.Day) { return; } OnNewDay?.Invoke(); _currentDate = DateTime.Now.Day; }; _checkNewDayTimer.Start(); }
/// <summary> /// Запуск эмуляции /// </summary> public async void Start() { EngineStatus = true; OnStatusChanged?.Invoke(EngineStatus); await Task.Run(() => { bool _newDay = true; while (EngineStatus) { //Если не прошел день, то эмулируем его if (CurrentHour < 24) { //Обрабатываем ТУ _entityList.Each((e, id) => { //Если это первый цикл дня, то надо сбросить Кол-во отказов if (_newDay) { e.Settings.Z = _entitySettings.Z; } //Если ТУ в процессе починки, то пропускаем его if (e.Status == EntityStatus.EntityInRepairing) { goto each_cont; } //Если устройство сломано, то ищем, линию, на которой есть свободное место if (e.Status == EntityStatus.EntityBroken) { tryFix(); goto each_cont; } //Если с устройством все норм, то смотрим, можно ли его сломать //Если устройство сломалось, то пытаемся его починить if (MathTools.GetChance(e.Settings.Z / 24m)) { //Уменьшаем вероятность отказа (также ограничиваем снизу) e.Settings.Z--; if (e.Settings.Z <= 0) { e.Settings.Z = 0; } e.Status = EntityStatus.EntityBroken; OnEntityChanged?.Invoke(id, e.Status); tryFix(); } each_cont: //Вложенный метод, для попытки отправить ТУ на починку void tryFix() { var line = _fixingLines.Where(x => x.Count < _engineSettings.L).OrderBy(x => x.Count).FirstOrDefault(); if (line != null) { e.Status = EntityStatus.EntityInRepairing; line.Enqueue(e); OnEntityChanged?.Invoke(id, e.Status); } } }); foreach (Queue <Entity> q in _fixingLines) { //Если линия пуста, то пропускаем ее if (q.Count == 0) { continue; } //Берем первое ТУ и смотрим, можно ли его починить var e = q.Peek(); //Есил починить можно if (MathTools.GetChance((decimal)MathTools.Qt(e.DaysInFix, MathTools.Lambda(e.Settings.R)))) { //Обнуляем кол-во дней, которое было потрачено на ремонт e.DaysInFix = 0; //Ставим статус нужный e.Status = EntityStatus.EntityFixed; //Убираем ТУ с очереди q.Dequeue(); OnEntityChanged?.Invoke(e.Id, e.Status); } } _newDay = false; OnHourTick?.Invoke(CurrentHour); CurrentHour++; Thread.Sleep(_engineSettings.HourTime);//Один час симуляции } else { //Увеличиваем у каждого время починки (у тех, которые чинятся) foreach (Entity e in _entityList) { if (e.Status != EntityStatus.EntityInRepairing) { continue; } e.DaysInFix++; } CurrentHour = 0; TotalDays++; _newDay = false; OnNewDay?.Invoke(TotalDays); } } OnStatusChanged?.Invoke(EngineStatus); }); }
internal static void InvokeOnNewDay(int priorInt, int newInt, bool newDay) { OnNewDay.Invoke(null, new EventArgsNewDay(priorInt, newInt, newDay)); }