private IEnumerable <Recommendation> GetRecommendations(CharacterRecomendationInfo info, IDictionary <ItemSlot.SlotHashes, int> seasonPassSlots) { if (info.IntPowerLevel < SoftCap) { var collections = GetVendorRecommendations(info.Items, info.IntPowerLevel); return(collections.Concat(new[] { new Recommendation($"Rare and Legendary Engrams to increase your power level to {SoftCap}") })); } Recommendation engramsRecommendation = null; var engramUpgrades = info.Engrams.Where(engram => { return(info.Items.Any(item => engram.PowerLevel > item.PowerLevel)); }); if (engramUpgrades.Any()) { var count = engramUpgrades.Count(); var countString = count > 1 ? $" {count}" : string.Empty; engramsRecommendation = new Recommendation($"Decrypt Engrams at the Cryptarch{count}"); } if (info.IntPowerLevel < PowerfulCap) { var recommendations = new List <Recommendation>(GetVendorRecommendations(info.Items, info.IntPowerLevel)); if (engramsRecommendation != null) { recommendations.Add(engramsRecommendation); } // Recommmend legendary engrams for any slots that could easily be upgraded recommendations.AddRange(CombineItems(info.Items, info.IntPowerLevel - 2, "Rare/Legendary Engrams")); var seasonPassRewards = GetItemRecommendations(info.Items, seasonPassSlots, info.IntPowerLevel, 1); if (seasonPassRewards.Any()) { var recommendation = new Recommendation(GetDisplayString("Season Pass Rewards", seasonPassRewards)); recommendations.Add(recommendation); } recommendations.Add(new Recommendation("Powerful Engrams")); recommendations.Add(new Recommendation("Pinnacle Engrams")); return(recommendations); } if (info.IntPowerLevel < HardCap) { var recommendations = new List <Recommendation>(); if (engramsRecommendation != null) { recommendations.Add(engramsRecommendation); } var seasonPassRewards = GetSeasonPassPinnacleRecomendations(info.Items, seasonPassSlots, info.PowerLevel); if (seasonPassRewards.Any()) { var recommendation = new Recommendation(GetDisplayString("Season Pass Rewards", seasonPassRewards)); recommendations.Add(recommendation); } // If any slot is at least two power levels behind, // a Powerful Engram would increase the max power level. // Ignore any slots where a season pass reward can be used first. var trailingSlots = info.Items.Where(item => info.IntPowerLevel - item.PowerLevel >= TrailingPowerLevelDifference) .OrderBy(item => item.PowerLevel) .Select(item => (item.Slot, 1)) .Except(seasonPassRewards, new ItemComparer()); if (trailingSlots.Any()) { var recommendation = new Recommendation(GetDisplayString("Powerful Engrams", trailingSlots)); recommendations.Add(recommendation); } recommendations.AddRange(CreatePinnacleRecommendations(info.IntPowerLevel, info.Items)); return(recommendations); } // At the hard cap. Nothing to do. return(Enumerable.Empty <Recommendation>()); }
public async Task <IEnumerable <Recommendation> > GetRecommendations(CharacterRecomendationInfo info) { var seasonPassSlots = await _seasonPass.LoadAvailableSeasonPassItems(SeasonHash, info.Progressions); return(GetRecommendations(info, seasonPassSlots)); }