Example #1
0
        /// <summary>
        /// Wire up the references of an entity
        /// </summary>
        /// <param name="entity"></param>
        private void InjectMultiReferences(IDbEntity entity)
        {
            Type type = entity.GetType();

            EntityInfo infos = GetEntityInfo(type);


            bool changed = false;

            // single refs
            foreach (MultipleReferenceProperty referenceProperty in infos.MultipleReferenceInjectors)
            {
                IList list = (IList)referenceProperty.PropertyAccessor.GetValue(entity);

                if (LoadDbMultiReference(entity, list))
                {
                    changed = true;
                }
            }

            // trigger if event is entity is changed
            if (changed)
            {
                OnEntityChanged?.Invoke(entity);
            }
        }
Example #2
0
        /// <summary>
        /// Wire up the references of an entity
        /// </summary>
        /// <param name="entity"></param>
        private void InjectSingleReferences(IDbEntity entity)
        {
            Type entityType = entity.GetType();

            EntityInfo infos = GetEntityInfo(entityType);

            bool changed = false;

            // single refs
            foreach (SingleReferenceProperty referenceProperty in infos.SingleReferenceInjectors)
            {
                IDbReference dbReference = (IDbReference)referenceProperty.PropertyAccessor.GetValue(entity);

                if (LoadSingleDbReference(entityType, entity, dbReference))
                {
                    changed = true;
                }
            }

            // trigger if event is entity is changed
            if (changed)
            {
                OnEntityChanged?.Invoke(entity);
            }
        }
Example #3
0
 internal void EntityChanged(IEntity entity, GameTag tag, int oldValue, int newValue)
 {
     if ((tag == GameTag.DAMAGE && ((ICharacter)entity).Health <= 0) || (tag == GameTag.TO_BE_DESTROYED && newValue == 1))
     {
         _deathCheckQueue.Add(entity.Id);
     }
     // TODO: Minions who reach 0 current Health because their maximum Health becomes 0 (such as due to Confuse) also need to be added to _deathCheckQueue
     OnEntityChanged?.Invoke(this, entity, tag, oldValue, newValue);
 }
Example #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);
            });
        }
Example #5
0
 public override void TransformBy(Transformation transform)
 {
     base.TransformBy(transform);
     OnTransformed?.Invoke(this, new TransformingEventArgs(transform));
     OnEntityChanged?.Invoke(this, null);
 }
Example #6
0
        /// <summary>
        /// Remove entity from Db
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public void Remove <T>(T t) where T : IDbEntity
        {
            AddType <T>();
            Type type = typeof(T);

            Database[type].Remove(t);

            // check entity references
            foreach (KeyValuePair <Type, HashSet <IDbEntity> > kv in Database)
            {
                Type entityType = kv.Key;

                EntityInfo infos = GetEntityInfo(entityType);

                foreach (IDbEntity entity in kv.Value)
                {
                    bool changed = false;

                    // single refs
                    foreach (SingleReferenceProperty referenceProperty in infos.SingleReferenceInjectors)
                    {
                        IDbReference dbReference = (IDbReference)referenceProperty.PropertyAccessor.GetValue(entity);

                        if (dbReference.ReferenceId == t.EntityId && dbReference.EntityType == type)
                        {
                            dbReference.ReferenceId = null;
                            dbReference.Entity      = null;

                            changed = true;
                        }
                    }

                    // multiple refs
                    foreach (MultipleReferenceProperty referenceProperty in infos.MultipleReferenceInjectors)
                    {
                        IList dbReference = (IList)referenceProperty.PropertyAccessor.GetValue(entity);

                        if (dbReference == null)
                        {
                            continue;
                        }


                        for (int i = dbReference.Count - 1; i >= 0; i--)
                        {
                            IDbReference reference = (IDbReference)dbReference[i];

                            if (reference.ReferenceId == t.EntityId && reference.EntityType == type)
                            {
                                dbReference.RemoveAt(i);
                                changed = true;
                            }
                        }
                    }

                    if (changed)
                    {
                        OnEntityChanged?.Invoke(entity);
                    }
                }
            }

            OnDatabaseChanged?.Invoke(this);

            OnEntityRemoved?.Invoke(t);
        }
Example #7
0
 public void NotifyEntityChanged()
 {
     OnEntityChanged?.Invoke(this.View, null);
 }
Example #8
0
 /// <summary>
 /// 单个实例有变更
 /// <para>触发</para>
 /// </summary>
 protected void RaiseEntityChanged()
 {
     DHelper.InvokeOnMain(() => OnEntityChanged?.Invoke(Entity));
 }