コード例 #1
0
        /// <summary>
        ///     Remove all StatModifierInstances of the given StatModifier from the given source.
        /// </summary>
        /// <param name="modifier">given StatModifier</param>
        /// <param name="source">given source</param>
        /// <returns>true if changed</returns>
        public bool RemoveModifier(StatModifier modifier, IStatModifierSource source)
        {
            if (modifier.attributeType.Type != attributeType.Type)
            {
                return(false);
            }

            if (_modifiers.TryGetValue(modifier.modifierType, out var statModifierInstances))
            {
                var removed = 0;
                for (var i = statModifierInstances.Count - 1; i >= 0; i--)
                {
                    var instance = statModifierInstances[i];
                    if (instance.Matches(modifier, source))
                    {
                        instance.Modifier.value.RemoveListener(OnDependencyChange);
                        statModifierInstances.RemoveAt(i);
                        removed++;
                    }
                }

                if (removed > 0)
                {
                    MarkDirty();
                    return(true);
                }
            }

            return(false);
        }
コード例 #2
0
 public virtual void AddAllModifierFromSource(IStatModifierSource source)
 {
     foreach (var mod in source.GetAllModifiers().Where(w => w.StatType == Type))
     {
         statModifiers.Add(mod);
     }
 }
コード例 #3
0
        /// <summary>
        ///     Remove all StatModifierInstances from the given source.
        /// </summary>
        /// <param name="source">given source</param>
        /// <returns>true if changed</returns>
        public bool RemoveModifiers(IStatModifierSource source)
        {
            var removed = 0;

            foreach (var statModifierInstances in _modifiers.Values)
            {
                for (var i = statModifierInstances.Count - 1; i >= 0; i--)
                {
                    var instance = statModifierInstances[i];
                    if (instance.Matches(source))
                    {
                        instance.Modifier.value.RemoveListener(OnDependencyChange);
                        statModifierInstances.RemoveAt(i);
                        removed++;
                    }
                }
            }

            if (removed > 0)
            {
                MarkDirty();
                return(true);
            }

            return(false);
        }
コード例 #4
0
 protected virtual void AddModifiersFromSource(IStatModifierSource source)
 {
     foreach (var s in stats)
     {
         s.AddAllModifierFromSource(source);
     }
 }
コード例 #5
0
        /// <summary>
        /// Remove this modifier from the first matching StatAttribute.
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="holders">holders to check</param>
        /// <returns>success</returns>
        public bool RemoveModifier(IStatModifierSource source, params AttributeHolder[] holders)
        {
            foreach (var holder in holders)
            {
                if (holder.TryGetAttribute <StatAttribute>(attributeType, out var attribute) &&
                    RemoveModifier(source, attribute))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
        /// <summary>
        ///     Add a new StatModifier.
        /// </summary>
        /// <param name="modifier">new StatModifier</param>
        /// <param name="source">modifier source</param>
        /// <returns>true if changed</returns>
        public bool AddModifier(StatModifier modifier, IStatModifierSource source)
        {
            if (modifier.attributeType.Type != attributeType.Type)
            {
                return(false);
            }

            if (!_modifiers.TryGetValue(modifier.modifierType, out var statModifiers))
            {
                statModifiers = new List <StatModifierInstance>();
                _modifiers.Add(modifier.modifierType, statModifiers);
            }

            var instance = new StatModifierInstance(modifier, this, source);

            statModifiers.Add(instance);
            modifier.value.AddListener(OnDependencyChange);
            MarkDirty();

            return(true);
        }
コード例 #7
0
 public virtual int RemoveAllModifiersFromSource(IStatModifierSource source)
 {
     isDirty = true;
     return(statModifiers.RemoveAll(w => w.Source == source));
 }
コード例 #8
0
 public bool Matches(IStatModifierSource source)
 {
     return(Source == source);
 }
コード例 #9
0
 public bool Matches(StatModifier modifier, IStatModifierSource source)
 {
     return(Modifier == modifier && Source == source);
 }
コード例 #10
0
 public StatModifierInstance(StatModifier modifier, StatAttribute attribute, IStatModifierSource source)
 {
     Modifier  = modifier;
     Attribute = attribute;
     Source    = source;
 }
コード例 #11
0
 /// <summary>
 /// Remove this modifier to the given attribute.
 /// </summary>
 /// <param name="source">source</param>
 /// <param name="attribute">attribute</param>
 /// <returns>success</returns>
 public bool RemoveModifier(IStatModifierSource source, StatAttribute attribute)
 {
     return(attribute != null && attribute.RemoveModifier(this, source));
 }
コード例 #12
0
 /// <summary>
 /// Apply this modifier to the given attribute.
 /// </summary>
 /// <param name="source">source</param>
 /// <param name="attribute">attribute</param>
 /// <returns>success</returns>
 public bool ApplyModifier(IStatModifierSource source, StatAttribute attribute)
 {
     return(attribute != null && attribute.AddModifier(this, source));
 }