Example #1
0
        /// <inheritdoc/>
        public IEnumerable <PowerUpWrapper> GetSetPowerUps(IEnumerable <Item> equippedItems, AttributeSystem attributeHolder)
        {
            var itemGroups = equippedItems
                             .Where(i => i.Durability > 0)
                             .Where(i => i.ItemSetGroups != null)
                             .SelectMany(i => i.ItemSetGroups)
                             .Distinct();

            var result = Enumerable.Empty <PowerUpDefinition>();

            foreach (var group in itemGroups)
            {
                if (group.AlwaysApplies)
                {
                    result = result.Concat(group.Options.Select(o => o.PowerUpDefinition));

                    continue;
                }

                var itemsOfGroup = equippedItems.Where(i => group.SetLevel == 0 || i.Level == group.SetLevel).Select(i => i.Definition);

                var itemCount = group.CountDistinct ? itemsOfGroup.Distinct().Count() : itemsOfGroup.Count();
                if (itemCount >= group.MinimumItemCount)
                {
                    result = result.Concat(group.Options.Take(itemCount - 1).Select(o => o.PowerUpDefinition));
                }
            }

            return(result.SelectMany(p => PowerUpWrapper.CreateByPowerUpDefintion(p, attributeHolder)));
        }
Example #2
0
        private IEnumerable <PowerUpWrapper> GetPowerUpsOfItemOptions(Item item, AttributeSystem attributeHolder)
        {
            var options = item.ItemOptions;

            if (options == null)
            {
                yield break;
            }

            foreach (var optionLink in options)
            {
                var option  = optionLink.ItemOption;
                var powerUp = option.PowerUpDefinition;
                var level   = option.LevelType == LevelType.ItemLevel ? item.Level : optionLink.Level;
                if (level > 1)
                {
                    var optionOfLevel = option.LevelDependentOptions.FirstOrDefault(l => l.Level == level);
                    if (optionOfLevel == null)
                    {
                        // TODO: Log, this should never happen.
                        continue;
                    }

                    powerUp = optionOfLevel.PowerUpDefinition;
                }

                foreach (var wrapper in PowerUpWrapper.CreateByPowerUpDefintion(powerUp, attributeHolder))
                {
                    yield return(wrapper);
                }
            }
        }
Example #3
0
 private void CreatePowerUpWrappers(SkillEntry skillEntry)
 {
     if (skillEntry.Skill.PassivePowerUps.TryGetValue(skillEntry.Level, out PowerUpDefinition powerUp))
     {
         this.passiveSkillPowerUps.Add(skillEntry, PowerUpWrapper.CreateByPowerUpDefintion(powerUp, this.player.Attributes).ToList());
     }
 }
Example #4
0
        private IEnumerable <PowerUpWrapper> GetPowerUpsOfItemOptions(IEnumerable <ItemOptionLink> options, AttributeSystem attributeHolder)
        {
            if (options == null)
            {
                yield break;
            }

            foreach (var optionLink in options)
            {
                var option  = optionLink.ItemOption;
                var powerUp = option.PowerUpDefinition;
                if (optionLink.Level > 1)
                {
                    var levelRelated  = option as IncreasableItemOption;
                    var optionOfLevel = levelRelated?.LevelDependentOptions.FirstOrDefault(l => l.Level == optionLink.Level);
                    if (optionOfLevel == null)
                    {
                        // TODO: Log, this should never happen.
                        continue;
                    }

                    powerUp = optionOfLevel.PowerUpDefinition;
                }

                foreach (var wrapper in PowerUpWrapper.CreateByPowerUpDefintion(powerUp, attributeHolder))
                {
                    yield return(wrapper);
                }
            }
        }
Example #5
0
        /// <inheritdoc/>
        public IEnumerable <PowerUpWrapper> GetSetPowerUps(
            IEnumerable <Item> equippedItems,
            AttributeSystem attributeHolder,
            GameConfiguration gameConfiguration)
        {
            var activeItems = equippedItems
                              .Where(i => i.Durability > 0)
                              .ToList();
            var itemGroups = activeItems
                             .SelectMany(i => i.ItemSetGroups ?? Enumerable.Empty <ItemSetGroup>())
                             .Distinct();

            var result = Enumerable.Empty <PowerUpDefinition>();

            foreach (var group in itemGroups)
            {
                if (group.AlwaysApplies)
                {
                    result = result.Concat(group.Options.Select(o => o.PowerUpDefinition));

                    continue;
                }

                var itemsOfGroup = activeItems.Where(i => (i.ItemSetGroups?.Contains(group) ?? false) &&
                                                     (group.SetLevel == 0 || i.Level >= group.SetLevel));
                var setMustBeComplete = group.MinimumItemCount == group.Items.Count;
                if (group.SetLevel > 0 && setMustBeComplete && itemsOfGroup.All(i => i.Level > group.SetLevel))
                {
                    // When all items are of higher level and the set bonus is applied when all items are there, another item set group will take care.
                    // This should prevent that for example set bonus defense is applied multiple times.
                    continue;
                }

                var itemCount     = group.CountDistinct ? itemsOfGroup.Select(item => item.Definition).Distinct().Count() : itemsOfGroup.Count();
                var setIsComplete = itemCount == group.Items.Count;
                if (setIsComplete)
                {
                    // Take all options when the set is complete
                    result = result.Concat(group.Options.Select(o => o.PowerUpDefinition));
                    continue;
                }

                if (itemCount >= group.MinimumItemCount)
                {
                    // Take the first n-1 options
                    result = result.Concat(group.Options.OrderBy(o => o.Number)
                                           .Take(itemCount - 1)
                                           .Select(o => o.PowerUpDefinition));
                }
            }

            result = result.Concat(this.GetOptionCombinationBonus(activeItems, gameConfiguration));

            return(result.SelectMany(p => PowerUpWrapper.CreateByPowerUpDefinition(p, attributeHolder)));
        }
Example #6
0
        /// <inheritdoc/>
        public IEnumerable <PowerUpWrapper> GetSetPowerUps(IEnumerable <Item> equippedItems, AttributeSystem attributeHolder)
        {
            var activeItems = equippedItems
                              .Where(i => i.Durability > 0)
                              .Where(i => i.ItemSetGroups != null)
                              .ToList();
            var itemGroups = activeItems
                             .SelectMany(i => i.ItemSetGroups)
                             .Distinct();

            var result = Enumerable.Empty <PowerUpDefinition>();

            foreach (var group in itemGroups)
            {
                if (group.AlwaysApplies)
                {
                    result = result.Concat(group.Options.Select(o => o.PowerUpDefinition));

                    continue;
                }

                if (group.SetLevel > 0 && group.MinimumItemCount == group.Items.Count && activeItems.All(i => i.Level > group.SetLevel))
                {
                    // When all items are of higher level and the set bonus is applied when all items are there, another item set group will take care.
                    // This should prevent that for example set bonus defense is applied multiple times.
                    continue;
                }

                var itemsOfGroup = activeItems.Where(i => group.SetLevel == 0 || i.Level >= group.SetLevel).Select(i => i.Definition).ToList();

                // The set item bonus options are always given, regardless if the set is complete or not.
                result = result.Concat(group.Items.Where(i => i.BonusOption != null && itemsOfGroup.Contains(i.ItemDefinition)).Select(i => i.BonusOption.PowerUpDefinition));

                var itemCount = group.CountDistinct ? itemsOfGroup.Distinct().Count() : itemsOfGroup.Count;
                if (itemCount >= group.MinimumItemCount)
                {
                    result = result.Concat(group.Options.OrderBy(o => o.Number).Take(itemCount - 1).Select(o => o.PowerUpDefinition));
                }
            }

            return(result.SelectMany(p => PowerUpWrapper.CreateByPowerUpDefinition(p, attributeHolder)));
        }
Example #7
0
        private IEnumerable <PowerUpWrapper> GetPowerUpsOfItemOptions(Item item, AttributeSystem attributeHolder)
        {
            var options = item.ItemOptions;

            if (options == null)
            {
                yield break;
            }

            foreach (var optionLink in options)
            {
                var option  = optionLink.ItemOption;
                var powerUp = option.PowerUpDefinition;
                var level   = option.LevelType == LevelType.ItemLevel ? item.Level : optionLink.Level;
                if (level > 1)
                {
                    var optionOfLevel = option.LevelDependentOptions.FirstOrDefault(l => l.Level == level);
                    if (optionOfLevel == null)
                    {
                        Log.Warn($"Item has {nameof(IncreasableItemOption)} with level > 0, but no definition in {nameof(IncreasableItemOption.LevelDependentOptions)}");
                        continue;
                    }

                    powerUp = optionOfLevel.PowerUpDefinition;
                }

                if (powerUp?.Boost == null)
                {
                    // Some options are level dependent. If they are at level 0, they might not have any boost yet.
                    continue;
                }

                foreach (var wrapper in PowerUpWrapper.CreateByPowerUpDefinition(powerUp, attributeHolder))
                {
                    yield return(wrapper);
                }
            }
        }