Exemplo n.º 1
0
    IEnumerator TimeKeeperRun()
    {
        while (true)
        {
            int currentDay = date.Day;
            if (isRunning)
            {
                date += new System.TimeSpan(0, dateUpdateRateHours, 0, 0);
                if (currentDay != date.Day)
                {
                    NewDay();

                    if (onNewDay != null)
                    {
                        onNewDay.Invoke(date);
                    }

                    currentDay = date.Day;
                }
                if (onTimeUpdate != null)
                {
                    onTimeUpdate.Invoke(dateUpdateRateHours);
                }

                UpdateUI();

                yield return(new WaitForSeconds(timeBetweenUpdates));
            }
            else
            {
                yield return(new WaitForFixedUpdate());
            }
        }
    }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
    IEnumerator WaitForNightEventFinish()
    {
        while (nightEvent != null)
        {
            yield return(null);
        }

        //progress to next day
        currentDate += new System.TimeSpan(1, 0, 0, 0);

        //Clean up dead workers and display message if any did.
        DisplayDeadWorkersMessage(GameManager.popMan.DeadWorkersCleanup());

        if (onNewDay != null)
        {
            onNewDay.Invoke(currentDate);
        }

        yield return(null);
    }
Exemplo n.º 4
0
        /// <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);
            });
        }
Exemplo n.º 5
0
 internal static void InvokeOnNewDay(int priorInt, int newInt, bool newDay)
 {
     OnNewDay.Invoke(null, new EventArgsNewDay(priorInt, newInt, newDay));
 }