private Affix(IReadOnlyList <IMod> mods) { if (!mods.Any()) { ValueCount = 0; FirstTierStats = new IStat[0]; _ranges = new IReadOnlyList <Range <int> > [0]; _trees = new IRangeTree <int, ModWrapper> [0]; return; } var firstMod = mods[0]; ValueCount = firstMod.Stats.Count; FirstTierStats = firstMod.Stats; if (mods.Any(m => m.Stats.Count != ValueCount)) { throw new NotSupportedException("Mods must all have the same amount of stats"); } var comparer = new ModWrapperComparer(); _trees = new IRangeTree <int, ModWrapper> [ValueCount]; _ranges = new IReadOnlyList <Range <int> > [ValueCount]; for (int i = 0; i < ValueCount; i++) { var wrapper = mods.Select(t => new ModWrapper(t, t.Stats[i].Range)).ToList(); _trees[i] = new RangeTree <int, ModWrapper>(wrapper, comparer); _ranges[i] = wrapper.Select(w => w.Range).ToList(); } _allMods = mods.ToList(); }
private Affix(IReadOnlyList <IMod> mods) { if (!mods.Any()) { StatIds = new string[0]; _ranges = new IReadOnlyList <Range <int> > [0]; _trees = new IRangeTree <int, ModWrapper> [0]; return; } StatIds = mods.SelectMany(m => m.Stats).Select(s => s.Id).Distinct().ToList(); var valueCount = StatIds.Count; var comparer = new ModWrapperComparer(); _trees = new IRangeTree <int, ModWrapper> [valueCount]; _ranges = new IReadOnlyList <Range <int> > [valueCount]; for (int i = 0; i < valueCount; i++) { var wrapper = mods.Select(t => new ModWrapper(t, SelectStat(t, i).Range)).ToList(); _trees[i] = new RangeTree <int, ModWrapper>(wrapper, comparer); _ranges[i] = wrapper.Select(w => w.Range).ToList(); } _allMods = mods.ToList(); }