public static IEnumerable<Rune>[] MakeSets(IList<Rune> runes, Attr slot2, Attr slot4, Attr slot6, Predicate<Rune> odds, RuneSet[] reqsets = null) { Rune[][] runesSlot = new Rune[6][]; Predicate<Rune> set = r => true; if (reqsets != null) { int reqCount = 0; foreach (RuneSet s in reqsets) reqCount += Rune.SetRequired(s); if (reqCount == 6) set = r => reqsets.Any(s => s == r.Set); } var unlocked = runes.Where(r => !r.Locked).ToArray(); var sets = unlocked.Where(r => set.Invoke(r)).ToArray(); var odd = sets.Where(r => odds.Invoke(r)).ToArray(); runesSlot[0] = odd.Where(r => r.Slot == 1).ToArray(); runesSlot[1] = sets.Where(r => r.Slot == 2 && (r.MainType == slot2 || slot2 == Attr.Null)).ToArray(); runesSlot[2] = odd.Where(r => r.Slot == 3).ToArray(); runesSlot[3] = sets.Where(r => r.Slot == 4 && (r.MainType == slot4 || slot4 == Attr.Null)).ToArray(); runesSlot[4] = odd.Where(r => r.Slot == 5).ToArray(); runesSlot[5] = sets.Where(r => r.Slot == 6 && (r.MainType == slot6 || slot6 == Attr.Null)).ToArray(); foreach (Rune[] rs in runesSlot.Where(r => r.Length == 0)) Console.WriteLine("No runes for slot " + (runesSlot.ToList().IndexOf(rs) + 1) + ":("); return runesSlot; }
public static IEnumerable<Rune>[] MakeSets(IList<Rune> runes, Predicate<Rune> evens, Predicate<Rune> odds, RuneSet[] reqsets = null) { IEnumerable<Rune>[] runesSlot = new IEnumerable<Rune>[6]; Predicate<Rune> set = r => true; if (reqsets != null) { int reqCount = 0; foreach (RuneSet s in reqsets) reqCount += Rune.SetRequired(s); if (reqCount == 6) set = r => reqsets.Any(s => s == r.Set); } runesSlot[0] = runes.Where(r => r.Slot == 1 && !r.Locked && odds.Invoke(r) && set.Invoke(r)); runesSlot[1] = runes.Where(r => r.Slot == 2 && !r.Locked && evens.Invoke(r) && set.Invoke(r)); runesSlot[2] = runes.Where(r => r.Slot == 3 && !r.Locked && odds.Invoke(r) && set.Invoke(r)); runesSlot[3] = runes.Where(r => r.Slot == 4 && !r.Locked && evens.Invoke(r) && set.Invoke(r)); runesSlot[4] = runes.Where(r => r.Slot == 5 && !r.Locked && odds.Invoke(r) && set.Invoke(r)); runesSlot[5] = runes.Where(r => r.Slot == 6 && !r.Locked && evens.Invoke(r) && set.Invoke(r)); return runesSlot; }