static void RandomTreeInsert(IRangeTree <int, string> tree, int limit) { var a = s_rnd.Next(limit); var b = s_rnd.Next(limit); tree.Add(Math.Min(a, b), Math.Max(a, b), "value"); }
static void RandomTreeInsert(IRangeTree<int, RangeItem> tree, int limit) { var a = s_rnd.Next(limit); var b = s_rnd.Next(limit); tree.Add(new RangeItem(Math.Min(a, b), Math.Max(a, b))); }
static void RandomTreeInsert(IRangeTree <int, RangeItem> tree, int limit) { var a = rnd.Next(limit); var b = rnd.Next(limit); tree.Add(new RangeItem(Math.Min(a, b), Math.Max(a, b))); }
private Affix(ItemType itemType, IEnumerable <ItemModTier> tiers) { ItemType = itemType; var tierList = tiers.ToList(); if (!tierList.Any()) { StatNames = new string[0]; _firstTierStats = new Stat[0]; return; } var firstTier = tierList[0]; _firstTierStats = firstTier.Stats; var statCount = _firstTierStats.Count; if (tierList.Any(t => t.Stats.Count != statCount)) { throw new NotSupportedException("Tiers must all have the same amount of stats"); } var comparer = new ItemModComparer(); var mods = new List <string>(); _trees = new IRangeTree <float, ModWrapper> [statCount][]; _ranges = new IReadOnlyList <Range <float> > [statCount][]; var valueCounts = new int[statCount]; for (int i = 0; i < _firstTierStats.Count; i++) { var stat = _firstTierStats[i]; int rangeCount = stat.Ranges.Count; mods.Add(stat.Name); _trees[i] = new IRangeTree <float, ModWrapper> [rangeCount]; _ranges[i] = new IReadOnlyList <Range <float> > [rangeCount]; valueCounts[i] = rangeCount; if (tierList.Any(t => t.Stats[i].Ranges.Count != rangeCount)) { throw new NotSupportedException( $"Tiers of stat {stat.Name} must all have the same amount of ranges"); } for (int j = 0; j < rangeCount; j++) { var wrapper = tierList.Select(t => new ModWrapper(t, t.Stats[i].Ranges[j])).ToList(); _trees[i][j] = new RangeTree <float, ModWrapper>(wrapper, comparer); _ranges[i][j] = wrapper.Select(w => w.Range).ToList(); } } StatNames = mods; ValueCountPerStat = valueCounts; }
private static IEnumerable <ItemModTier> QueryForTree(float value, IRangeTree <float, ModWrapper> tree) => tree.Query(value).Select(w => w.ItemModTier);
private static IEnumerable <IMod> QueryForTree(int value, IRangeTree <int, ModWrapper> tree) => tree.Query(value).Select(w => w.Mod);