Example #1
0
    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();
        }
Example #3
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);
            });
        }
Example #4
0
 internal static void InvokeOnNewDay(int priorInt, int newInt, bool newDay)
 {
     OnNewDay.Invoke(null, new EventArgsNewDay(priorInt, newInt, newDay));
 }