private void CreatePowerUpWrappers(SkillEntry skillEntry) { if (skillEntry.Skill.PassivePowerUps.TryGetValue(skillEntry.Level, out PowerUpDefinition powerUp)) { this.passiveSkillPowerUps.Add(skillEntry, PowerUpWrapper.CreateByPowerUpDefinition(powerUp, this.player.Attributes).ToList()); } }
/// <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; } var itemsOfGroup = activeItems.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.OrderBy(o => o.Number).Take(itemCount - 1).Select(o => o.PowerUpDefinition)); } } return(result.SelectMany(p => PowerUpWrapper.CreateByPowerUpDefinition(p, attributeHolder))); }
/// <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))); }
/// <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))); }
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); } } }