Exemple #1
0
        protected virtual void OnSuitCreated(CompletedSuit obj)
        {
            Action <CompletedSuit> handler = SuitCreated;

            if (handler != null)
            {
                handler(obj);
            }
        }
Exemple #2
0
        public CompletedSuit CreateCompletedSuit()
        {
            CompletedSuit suit = new CompletedSuit();

            for (int i = 0; i < nextOpenCacheIndex; i++)
            {
                suit.AddItem(cache[i].Slot, cache[i].Piece);
            }

            return(suit);
        }
        void SearchThroughBuckets(SuitBuilder builder, int index)
        {
            if (!Running)
            {
                return;
            }

            // Only continue to build any suits with a minimum potential of no less than 1 armor pieces less than our largest built suit so far
            if (builder.Count + 1 < highestArmorCountSuitBuilt - (totalArmorBucketsWithItems - Math.Min(index, totalArmorBucketsWithItems)))
            {
                return;
            }

            // Are we at the end of the line?
            if (buckets.Count <= index)
            {
                if (builder.Count == 0)
                {
                    return;
                }

                lock (lockObject)
                {
                    if (builder.TotalBodyArmorPieces > highestArmorCountSuitBuilt)
                    {
                        highestArmorCountSuitBuilt = builder.TotalBodyArmorPieces;
                    }

                    // We should keep track of the highest AL suits we built for every number of armor count suits built, and only push out ones that fall within our top X
                    List <int> list = highestArmorSuitsBuilt[builder.Count];
                    if (list.Count < list.Capacity)
                    {
                        if (!list.Contains(builder.TotalBaseArmorLevel))
                        {
                            list.Add(builder.TotalBaseArmorLevel);

                            if (list.Count == list.Capacity)
                            {
                                list.Sort();
                            }
                        }
                    }
                    else
                    {
                        if (list[list.Count - 1] > builder.TotalBaseArmorLevel)
                        {
                            return;
                        }

                        if (list[list.Count - 1] < builder.TotalBaseArmorLevel && !list.Contains(builder.TotalBaseArmorLevel))
                        {
                            list[list.Count - 1] = builder.TotalBaseArmorLevel;
                            list.Sort();
                        }
                    }

                    CompletedSuit newSuit = builder.CreateCompletedSuit();

                    // We should also keep track of all the suits we've built and make sure we don't push out a suit with the same exact pieces in swapped slots
                    foreach (CompletedSuit suit in completedSuits)
                    {
                        if (newSuit.IsSubsetOf(suit))
                        {
                            return;
                        }
                    }
                    completedSuits.Add(newSuit);

                    OnSuitCreated(newSuit);
                }

                return;
            }

            if (index == 0)             // If this is the first bucket we're searching through, multi-thread the subsearches
            {
                Parallel.ForEach(buckets[index], piece =>
                {
                    SuitBuilder clone = builder.Clone();

                    if (clone.SlotIsOpen(buckets[index].Slot) && (!piece.EquippableSlots.IsBodyArmor() || clone.HasRoomForArmorSet(Config.PrimaryArmorSet, Config.SecondaryArmorSet, piece.ItemSetId)) && clone.CanGetBeneficialSpellFrom(piece))
                    {
                        clone.Push(piece, buckets[index].Slot);

                        SearchThroughBuckets(clone, index + 1);

                        clone.Pop();
                    }
                });
            }
            else
            {
                foreach (SuitBuildableMyWorldObject piece in buckets[index])
                {
                    if (builder.SlotIsOpen(buckets[index].Slot) && (!piece.EquippableSlots.IsBodyArmor() || builder.HasRoomForArmorSet(Config.PrimaryArmorSet, Config.SecondaryArmorSet, piece.ItemSetId)) && builder.CanGetBeneficialSpellFrom(piece))
                    {
                        builder.Push(piece, buckets[index].Slot);

                        SearchThroughBuckets(builder, index + 1);

                        builder.Pop();
                    }
                }
            }

            SearchThroughBuckets(builder, index + 1);
        }
        public ArmorSearcher(SearcherConfiguration config, IEnumerable <SuitBuildableMyWorldObject> pieces, CompletedSuit startingSuit = null) : base(config, pieces, startingSuit)
        {
            // Sort the list with the highest armor first
            Equipment.Sort((a, b) => b.CalcedStartingArmorLevel.CompareTo(a.CalcedStartingArmorLevel));

            // Remove any pieces that have no armor
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (Equipment[i].CalcedStartingArmorLevel <= 0)
                {
                    Equipment.RemoveAt(i);
                }
            }
        }
        void SearchThroughBuckets(List <Bucket> buckets, int index)
        {
            if (!Running)
            {
                return;
            }

            // Only continue to build any suits with a minimum potential of no less than 1 epics less than our largest built suit so far
            if (SuitBuilder.Count + 1 < highestCountSuitBuilt - (highestCountSuitBuilt - index))
            {
                return;
            }

            // Are we at the end of the line?
            if (buckets.Count <= index)
            {
                if (SuitBuilder.Count == 0)
                {
                    return;
                }

                if (SuitBuilder.Count > highestCountSuitBuilt)
                {
                    highestCountSuitBuilt = SuitBuilder.TotalBodyArmorPieces;
                }

                CompletedSuit newSuit = SuitBuilder.CreateCompletedSuit();

                // We should keep track of the highest epic suits we built for every number of item count suits built, and only push out ones that fall within our top X
                List <int> list = highestEffectiveSpellsSuitBuilt[SuitBuilder.Count];
                if (list.Count < list.Capacity)
                {
                    list.Add(newSuit.TotalEffectiveEpics);

                    if (list.Count == list.Capacity)
                    {
                        list.Sort();
                    }
                }
                else
                {
                    if (list[list.Count - 1] >= newSuit.TotalEffectiveEpics)
                    {
                        return;
                    }

                    list[list.Count - 1] = newSuit.TotalEffectiveEpics;
                    list.Sort();
                }

                // We should also keep track of all the suits we've built and make sure we don't push out a suit with the same exact pieces in swapped slots
                foreach (CompletedSuit suit in completedSuits)
                {
                    if (newSuit.IsSubsetOf(suit))
                    {
                        return;
                    }
                }

                completedSuits.Add(newSuit);

                OnSuitCreated(newSuit);

                return;
            }

            //for (int i = 0; i < buckets[index].Count ; i++)
            foreach (var piece in buckets[index])             // Using foreach: 10.85s, for: 11s
            {
                if (SuitBuilder.CanGetBeneficialSpellFrom(piece))
                {
                    SuitBuilder.Push(piece, buckets[index].Slot);

                    SearchThroughBuckets(buckets, index + 1);

                    SuitBuilder.Pop();
                }
            }

            SearchThroughBuckets(buckets, index + 1);
        }
        public AccessorySearcher(SearcherConfiguration config, IEnumerable <LeanMyWorldObject> accessories, CompletedSuit startingSuit = null) : base(config, accessories, startingSuit)
        {
            // Sort the list with the highest amount of epics
            // As a temp fix we just sort based on spell count
            Equipment.Sort((a, b) =>
            {
                if (a.CalcedStartingArmorLevel > 0 && b.CalcedStartingArmorLevel > 0)
                {
                    return(b.CalcedStartingArmorLevel.CompareTo(a.CalcedStartingArmorLevel));
                }
                if (a.CalcedStartingArmorLevel > 0 && b.CalcedStartingArmorLevel == 0)
                {
                    return(-1);
                }
                if (a.CalcedStartingArmorLevel == 0 && b.CalcedStartingArmorLevel > 0)
                {
                    return(1);
                }
                return(b.SpellsToUseInSearch.Count.CompareTo(a.SpellsToUseInSearch.Count));
            });

            // Remove any pieces that have armor
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (Equipment[i].CalcedStartingArmorLevel > 0)
                {
                    Equipment.RemoveAt(i);
                }
            }
        }
 public bool IsSupersetOf(CompletedSuit other)
 {
     return(piecesHashSet.IsSupersetOf(other.piecesHashSet));
 }
Exemple #8
0
        protected Searcher(SearcherConfiguration config, IEnumerable <LeanMyWorldObject> equipment, CompletedSuit startingSuit = null)
        {
            Config = config;

            foreach (var piece in equipment)
            {
                Equipment.Add(piece);
            }

            // Remove surpassed pieces
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (Equipment.ItemIsSurpassed(Equipment[i]))
                {
                    Equipment.RemoveAt(i);
                }
            }

            // If we were given a starting suit, lets start our SuitBuilder off with all those items
            if (startingSuit != null)
            {
                foreach (var o in startingSuit)
                {
                    SuitBuilder.Push(o.Value, o.Key);
                }
            }

            // Remove pieces that can provide no beneficial spell
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (!SuitBuilder.CanGetBeneficialSpellFrom(Equipment[i]))
                {
                    Equipment.RemoveAt(i);
                }
            }

            // Remove pieces we can't add to our base suit
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (!SuitBuilder.SlotIsOpen(Equipment[i].EquippableSlots))
                {
                    if (Equipment[i].EquippableSlots.GetTotalBitsSet() == 1)
                    {
                        Equipment.RemoveAt(i);
                    }
                    else
                    {
                        if (Equipment[i].EquippableSlots.IsBodyArmor())
                        {
                            var reductionOptions = Equipment[i].Coverage.ReductionOptions();

                            foreach (var option in reductionOptions)
                            {
                                if (option == CoverageMask.OuterwearChest && SuitBuilder.SlotIsOpen(EquipMask.ChestArmor))
                                {
                                    goto end;
                                }
                                if (option == CoverageMask.OuterwearUpperArms && SuitBuilder.SlotIsOpen(EquipMask.UpperArmArmor))
                                {
                                    goto end;
                                }
                                if (option == CoverageMask.OuterwearLowerArms && SuitBuilder.SlotIsOpen(EquipMask.LowerArmArmor))
                                {
                                    goto end;
                                }
                                if (option == CoverageMask.OuterwearAbdomen && SuitBuilder.SlotIsOpen(EquipMask.AbdomenArmor))
                                {
                                    goto end;
                                }
                                if (option == CoverageMask.OuterwearUpperLegs && SuitBuilder.SlotIsOpen(EquipMask.UpperLegArmor))
                                {
                                    goto end;
                                }
                                if (option == CoverageMask.OuterwearLowerLegs && SuitBuilder.SlotIsOpen(EquipMask.LowerLegArmor))
                                {
                                    goto end;
                                }
                            }

                            Equipment.RemoveAt(i);
                        }
                        else
                        {
                            if ((Equipment[i].EquippableSlots.HasFlag(EquipMask.FingerWearLeft) || Equipment[i].EquippableSlots.HasFlag(EquipMask.FingerWearRight)) && !SuitBuilder.SlotIsOpen(EquipMask.FingerWearLeft) && !SuitBuilder.SlotIsOpen(EquipMask.FingerWearRight))
                            {
                                Equipment.RemoveAt(i); goto end;
                            }
                            if ((Equipment[i].EquippableSlots.HasFlag(EquipMask.WristWearLeft) || Equipment[i].EquippableSlots.HasFlag(EquipMask.WristWearRight)) && !SuitBuilder.SlotIsOpen(EquipMask.WristWearLeft) && !SuitBuilder.SlotIsOpen(EquipMask.WristWearRight))
                            {
                                Equipment.RemoveAt(i); goto end;
                            }
                        }
                    }
                }

                end :;
            }
        }
        protected Searcher(SearcherConfiguration config, IEnumerable <SuitBuildableMyWorldObject> equipment, CompletedSuit startingSuit = null)
        {
            Config = config;

            foreach (var piece in equipment)
            {
                if (!piece.Exclude)
                {
                    Equipment.Add(piece);
                }
            }

            // Remove pieces that don't meet our minimum requirements
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (!config.ItemPassesRules(Equipment[i]))
                {
                    Equipment.RemoveAt(i);
                }
            }

            // Remove surpassed pieces
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (Equipment.ItemIsSurpassed(Equipment[i]))
                {
                    Equipment.RemoveAt(i);
                }
            }

            // If we were given a starting suit, lets start our SuitBuilder off with all those items
            if (startingSuit != null)
            {
                foreach (var o in startingSuit)
                {
                    SuitBuilder.Push(o.Value, o.Key);
                }
            }

            // Remove pieces that can provide no beneficial spell
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (!SuitBuilder.CanGetBeneficialSpellFrom(Equipment[i]))
                {
                    Equipment.RemoveAt(i);
                }
            }

            // Remove pieces we can't add to our base suit
            for (int i = Equipment.Count - 1; i >= 0; i--)
            {
                if (!SuitBuilder.SlotIsOpen(Equipment[i].EquippableSlots))
                {
                    if (Equipment[i].EquippableSlots.GetTotalBitsSet() == 1)
                    {
                        Equipment.RemoveAt(i);
                    }
                    else
                    {
                        if (Equipment[i].EquippableSlots.IsBodyArmor())
                        {
                            var reductionOptions = Equipment[i].Coverage.ReductionOptions();

                            foreach (var option in reductionOptions)
                            {
                                if (option == CoverageFlags.Chest && SuitBuilder.SlotIsOpen(EquippableSlotFlags.Chest))
                                {
                                    goto end;
                                }
                                if (option == CoverageFlags.UpperArms && SuitBuilder.SlotIsOpen(EquippableSlotFlags.UpperArms))
                                {
                                    goto end;
                                }
                                if (option == CoverageFlags.LowerArms && SuitBuilder.SlotIsOpen(EquippableSlotFlags.LowerArms))
                                {
                                    goto end;
                                }
                                if (option == CoverageFlags.Abdomen && SuitBuilder.SlotIsOpen(EquippableSlotFlags.Abdomen))
                                {
                                    goto end;
                                }
                                if (option == CoverageFlags.UpperLegs && SuitBuilder.SlotIsOpen(EquippableSlotFlags.UpperLegs))
                                {
                                    goto end;
                                }
                                if (option == CoverageFlags.LowerLegs && SuitBuilder.SlotIsOpen(EquippableSlotFlags.LowerLegs))
                                {
                                    goto end;
                                }
                            }

                            Equipment.RemoveAt(i);
                        }
                        else
                        {
                            if ((Equipment[i].EquippableSlots.HasFlag(EquippableSlotFlags.LeftRing) || Equipment[i].EquippableSlots.HasFlag(EquippableSlotFlags.RightRing)) && !SuitBuilder.SlotIsOpen(EquippableSlotFlags.LeftRing) && !SuitBuilder.SlotIsOpen(EquippableSlotFlags.RightRing))
                            {
                                Equipment.RemoveAt(i); goto end;
                            }
                            if ((Equipment[i].EquippableSlots.HasFlag(EquippableSlotFlags.LeftBracelet) || Equipment[i].EquippableSlots.HasFlag(EquippableSlotFlags.RightBracelet)) && !SuitBuilder.SlotIsOpen(EquippableSlotFlags.LeftBracelet) && !SuitBuilder.SlotIsOpen(EquippableSlotFlags.RightBracelet))
                            {
                                Equipment.RemoveAt(i); goto end;
                            }
                        }
                    }
                }

                end :;
            }
        }