private List <ItemChance> GetPossibleItems(Seed seed, YieldTier tier) { var baseTier = decimal.Floor(tier.Tier); var actualTier = tier.Tier; var possibleItems = ItemList.Where(x => x.Seeds.Any(y => y.Name == seed.Name && y.Tiers.Any(z => decimal.Floor(z.Tier) == baseTier))) .Select(x => new Item() { Name = x.Name, Seeds = x.Seeds.Select(y => new SeedTier() { Name = y.Name, Tiers = y.Tiers.Where(z => decimal.Floor(z.Tier) == baseTier).ToList() }) .Where(y => y.Name == seed.Name && y.Tiers.Any()) .ToList() }); List <ItemChance> results = new List <ItemChance>(); foreach (var item in possibleItems) { // take count for each applicable tier var tierCounts = item.Seeds.Single().Tiers.Where(x => decimal.Floor(x.Tier) == baseTier); // count x ratio for that tier var mainTierRatio = tier.Ratio; var subTierRatio = 1 - mainTierRatio; var mainTier = tierCounts.Where(x => x.Tier == actualTier).SingleOrDefault(); var subTier = tierCounts.Where(x => x.Tier != actualTier).SingleOrDefault(); decimal mainTierCount = mainTier == null ? 0 : mainTier.Count; decimal subTierCount = subTier == null ? 0 : subTier.Count; var mainTierChance = mainTierRatio * (mainTierCount / 5); var subTierChance = subTierRatio * (subTierCount / 5); if (mainTierChance + subTierChance > 0) { results.Add(new ItemChance(item.Name, mainTierChance + subTierChance)); } } return(results); }
public (int, int) GetTierMinMaxRankSum(YieldTier tier) { var minScore = tier.ScoreRange.Lower - 40; int modMax = 12; if (minScore > 0) { modMax = (int)decimal.Floor(Math.Abs(12 - (decimal)minScore / 5)); } if (modMax > 11) { modMax = 11; } var maxScore = tier.ScoreRange.Upper - 10; var modMin = 12 - (int)decimal.Floor((decimal)maxScore / 5); if (modMin < 0) { modMin = 0; } return(modMin, modMax); }
public (int, int) GetTierMinMaxGradeSum(YieldTier tier, (int min, int max) minMaxMod, int currGradeSum)