예제 #1
0
 public static void ClearPosition(this IEffectHolder subject)
 {
     foreach (var position in subject.GetEffects <Effect>().Where(x => x is IPosition position && position.Subject == subject))
     {
         position.Remove();
     }
 }
예제 #2
0
 public static void ClearStatusEffects(this IEffectHolder holder)
 {
     foreach (var effect in holder.GetEffects <EffectStatusEffect>())
     {
         effect.Remove();
     }
 }
예제 #3
0
        public static void AddStatusEffect(this IEffectHolder holder, StatusEffect statusEffect)
        {
            statusEffect.Creature = holder;
            var statusEffects = holder.GetEffects <EffectStatusEffect>();
            var combineable   = statusEffects.Select(x => x.StatusEffect).Where(x => x.CanCombine(statusEffect)).ToList();

            if (combineable.Any())
            {
                var combined = combineable.SelectMany(x => x.Combine(statusEffect)).Distinct().ToList();
                var added    = combined.Except(combineable).ToList();
                var removed  = combineable.Except(combined).ToHashSet();
                foreach (var effect in added)
                {
                    effect.Apply();
                }
                foreach (var effect in statusEffects.Where(x => removed.Contains(x.StatusEffect)))
                {
                    effect.Remove();
                }
            }
            else
            {
                statusEffect.Apply();
            }
        }
예제 #4
0
 public static void ClearStatusEffects(this IEffectHolder holder, Func <StatusEffect, bool> match)
 {
     foreach (var effect in holder.GetEffects <EffectStatusEffect>().Where(effect => match(effect.StatusEffect)))
     {
         effect.Remove();
     }
 }
예제 #5
0
        private void CalculateArmor()
        {
            var equipment = Defender.GetEffects <EffectItemEquipped>();
            var mainhand  = equipment.FirstOrDefault(x => x.Slot == EquipSlot.Mainhand)?.Item;
            var offhand   = equipment.FirstOrDefault(x => x.Slot == EquipSlot.Offhand)?.Item;
            var body      = equipment.FirstOrDefault(x => x.Slot == EquipSlot.Body)?.Item;

            List <Item> armors = new List <Item>();

            //TODO: Should have some other check to find out if an item is a shield/armor
            if (mainhand is ToolPlate)
            {
                armors.Add(mainhand);
            }
            if (offhand is ToolPlate)
            {
                armors.Add(offhand);
            }
            if (body is ToolPlate)
            {
                armors.Add(body);
            }

            if (armors.Any())
            {
                ExtraEffects.Add(new AttackArmor(armors));
            }
        }
예제 #6
0
        public static IEnumerable <Wait> PushEvent <T, V>(this IEffectHolder holder, T eventParam) where V : EffectEvent <T>
        {
            IEnumerable <V> enumerable = holder.GetEffects <V>().Distinct();

            foreach (var effect in enumerable)
            {
                yield return(effect.Trigger(eventParam));
            }
        }
예제 #7
0
        public static string GetName(this IEffectHolder holder, string defaultName)
        {
            var effects = holder.GetEffects <EffectName>();

            if (effects.Any())
            {
                return(effects.WithMax(effect => effect.Priority).Name);
            }
            return(defaultName);
        }
예제 #8
0
        public static bool HasFlag(this IEffectHolder holder, Flag flag)
        {
            var effects = holder.GetEffects <EffectFlag>().Where(effect => effect.Flag == flag);

            if (effects.Any())
            {
                return(effects.WithMax(effect => effect.Priority).Value);
            }
            return(flag.DefaultValue);
        }
예제 #9
0
        public static bool HasFamily(this IEffectHolder holder, Family family)
        {
            var effects = holder.GetEffects <EffectFamily>().Where(effect => effect.Family == family);

            if (effects.Any())
            {
                return(effects.WithMax(effect => effect.Priority).Value);
            }
            return(false);
        }
예제 #10
0
 public static StatusEffect GetStatusEffect(this IEffectHolder holder, StatusEffect statusEffect)
 {
     foreach (var checkEffect in holder.GetEffects <EffectStatusEffect>())
     {
         if (checkEffect.StatusEffect == statusEffect || checkEffect.StatusEffect.CanCombine(statusEffect))
         {
             return(checkEffect.StatusEffect);
         }
     }
     return(null);
 }
예제 #11
0
 public static T GetStatusEffect <T>(this IEffectHolder holder) where T : StatusEffect
 {
     foreach (var checkEffect in holder.GetEffects <EffectStatusEffect>())
     {
         if (checkEffect.StatusEffect is T)
         {
             return((T)checkEffect.StatusEffect);
         }
     }
     return(null);
 }
예제 #12
0
        public static void AddName(this IEffectHolder holder, string name)
        {
            var    names    = holder.GetEffects <EffectName>();
            double priority = 0;

            if (names.Any())
            {
                priority = names.Max(x => x.Priority) + 1;
            }
            Effect.Apply(new EffectName(holder, name, priority));
        }
예제 #13
0
        public static void Heal(this IEffectHolder holder, double heal, PopupHelper popupHelper)
        {
            var damageEffects = holder.GetEffects <EffectDamage>().ToList();
            var totalDamage   = damageEffects.Sum(x => x.Amount);
            var totalHeal     = heal + Math.Max(0, totalDamage - holder.GetStat(Stat.HP));
            var healAmounts   = Util.ProportionalSplit(damageEffects.Select(x => x.Amount), totalHeal);
            int i             = 0;

            foreach (var damage in damageEffects)
            {
                damage.Amount -= healAmounts[i];
                if (damage.Amount <= 0)
                {
                    damage.Remove();
                }
                i++;
            }

            popupHelper?.Add(new MessageHeal(holder, heal));
        }
예제 #14
0
        public static MovementTypeResult GetMovementType(this IEffectHolder holder)
        {
            MovementTypeResult result = new MovementTypeResult();
            var effects = holder.GetEffects <EffectMovementType>();

            foreach (var movementType in effects.OrderBy(e => e.Priority).Select(e => e.MovementType))
            {
                if (movementType.GetNeighbors != null)
                {
                    result.GetNeighbors = movementType.GetNeighbors;
                }
                if (movementType.GetTileCost != null)
                {
                    result.GetTileCost = movementType.GetTileCost;
                }
                if (movementType.CanTraverse != null)
                {
                    result.CanTraverse = movementType.CanTraverse;
                }
            }
            return(result);
        }
예제 #15
0
 public static IEnumerable <IEffectHolder> GetMasters(this IEffectHolder holder)
 {
     return(holder.GetEffects <EffectSummon>().Where(effect => effect.Slave == holder).Select(effect => effect.Master));
 }
예제 #16
0
        public static IEnumerable <Family> GetFamilies(this IEffectHolder holder)
        {
            var effectGroups = holder.GetEffects <EffectFamily>().GroupBy(effect => effect.Family);

            return(effectGroups.Select(group => group.WithMax(effect => effect.Priority)).Where(effect => effect.Value).Select(effect => effect.Family));
        }
예제 #17
0
 public static double GetStat(this IEffectHolder holder, Stat stat)
 {
     return(CalculateStat(holder, holder.GetEffects <Effect>().Where(effect => effect is IStat statEffect && statEffect.Stat == stat), stat.DefaultStat));
 }
예제 #18
0
 public static double GetStatDamage(this IEffectHolder holder, Stat stat)
 {
     return(holder.GetEffects <EffectStatDamage>().Where(x => x.Stat == stat).Sum(x => x.Amount));
 }
예제 #19
0
 public static Dictionary <Stat, double> GetStats(this IEffectHolder holder)
 {
     return(holder.GetEffects <Effect>().OfType <IStat>().GroupBy(stat => stat.Stat, stat => (Effect)stat).ToDictionary(group => group.Key, group => CalculateStat(holder, group, group.Key.DefaultStat)));
 }
예제 #20
0
 public static Dictionary <Element, double> GetElements(this IEffectHolder holder)
 {
     return(holder.GetEffects <EffectElement>().GroupBy(stat => stat.Element, stat => stat).ToDictionary(group => group.Key, group => group.Sum(element => element.Percentage)));
 }
예제 #21
0
        public static int GetTrait(this IEffectHolder holder, Trait trait)
        {
            var effects = holder.GetEffects <EffectTrait>().Where(effect => effect.Trait == trait);

            return(Math.Max(0, effects.Sum(x => x.Level)));
        }
예제 #22
0
 public static double GetTotalDamage(this IEffectHolder holder)
 {
     return(holder.GetEffects <EffectDamage>().Sum(x => x.Amount));
 }
예제 #23
0
 public static IEnumerable <Item> GetInventory(this IEffectHolder holder)
 {
     return(holder.GetEffects <EffectItemInventory>().Select(effect => effect.Item));
 }
예제 #24
0
 public static IEnumerable <StatusEffect> GetStatusEffects(this IEffectHolder holder)
 {
     return(holder.GetEffects <EffectStatusEffect>().Select(x => x.StatusEffect));
 }
예제 #25
0
 public static double GetDamage(this IEffectHolder holder, Element element)
 {
     return(holder.GetEffects <EffectDamage>().Where(x => x.Element == element).Sum(x => x.Amount));
 }