public void RemoveEffect(Effect effect)
 {
     effect.Unapply();
     effect.GetDefinitionComponent().MarkExpired();
     m_active_effects.Remove(effect);
     effect.GetLogicWorld().GetEffectManager().DestroyObject(effect.ID);
 }
        public bool AddEffect(Effect effect)
        {
            EffectDefinitionComponent definition_cmp = effect.GetDefinitionComponent();

            if (definition_cmp.ExpirationTime <= effect.GetCurrentTime())
            {
                effect.Apply();
                effect.Unapply();
                return(false);
            }

            int count = m_active_effects.Count;

            for (int i = 0; i < count;)
            {
                Effect active_effect = m_active_effects[i];
                if (!AreConflicting(effect, active_effect))
                {
                    ++i;
                    continue;
                }
                Effect rejected_effect = PickRejectedEffect(effect, active_effect);
                if (rejected_effect == effect)
                {
                    return(false);
                }
                else
                {
                    m_registry.RemoveEffect(active_effect.ID);
                    count = m_active_effects.Count;
                }
            }

            m_active_effects.Add(effect);
            effect.Apply();
            definition_cmp.StartExpirationTask();
            return(true);
        }