示例#1
0
        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");
        }
示例#2
0
        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)));
        }
示例#3
0
        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)));
        }
示例#4
0
        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;
        }
示例#5
0
 private static IEnumerable <ItemModTier> QueryForTree(float value, IRangeTree <float, ModWrapper> tree)
 => tree.Query(value).Select(w => w.ItemModTier);
示例#6
0
 private static IEnumerable <IMod> QueryForTree(int value, IRangeTree <int, ModWrapper> tree)
 => tree.Query(value).Select(w => w.Mod);