Exemplo n.º 1
0
        //Finds valid corrupted essence mods and gives them (relative) weights based on the passed item and fossil weights
        public static IDictionary <PoEModData, int> FindGlyphicMods(ItemCraft item, ISet <IList <PoEModWeight> > weightmods, bool sanctified = false)
        {
            IDictionary <PoEModData, int> mods = new Dictionary <PoEModData, int>();
            string itemclass = CraftingDatabase.AllBaseItems[item.SourceData].item_class;

            if (itemclass == "Rune Dagger")
            {
                itemclass = "Dagger";
            }
            if (itemclass == "Warstaff")
            {
                itemclass = "Staff";
            }
            //check for open prefix/suffix
            bool openprefix = item.ModCountByType(Prefix) < item.GetAffixLimit(true);
            bool opensuffix = item.ModCountByType(Suffix) < item.GetAffixLimit(true);
            //track existing mod groups
            ISet <string> groups = new HashSet <string>();

            foreach (ModCraft m in item.LiveMods)
            {
                PoEModData modtemplate = CraftingDatabase.AllMods[m.SourceData];
                groups.Add(modtemplate.group);
            }
            IList <string> catalysttags = null;

            if (item.QualityType != null && CatalystTags.ContainsKey(item.QualityType))
            {
                catalysttags = CatalystTags[item.QualityType];
            }
            foreach (PoEEssenceData ess in CraftingDatabase.Essences.Values)
            {
                if (ess.type.is_corruption_only && ess.mods.Keys.Contains(itemclass))
                {
                    PoEModData m = CraftingDatabase.CoreMods[ess.mods[itemclass]];
                    if (m.generation_type == Prefix && !openprefix)
                    {
                        continue;
                    }
                    if (m.generation_type == Suffix && !opensuffix)
                    {
                        continue;
                    }
                    if (groups.Contains(m.group))
                    {
                        continue;
                    }
                    int weight = CalcGenWeight(m, item.LiveTags, weightmods, catalysttags, item.BaseQuality, sanctified, 1000);
                    if (weight > 0)
                    {
                        mods.Add(m, weight);
                    }
                }
            }
            return(mods);
        }
Exemplo n.º 2
0
        //Starts from basemods and checks ilvl, live tags (including influence), existing mod groups, option to ignore prefix/suffix space, checks ilvlcap and modweightgroups from RollOptions
        public static IDictionary <PoEModData, int> FindValidMods(ItemCraft item, IDictionary <PoEModData, int> basemods, bool ignorerarity = false, RollOptions op = null)
        {
            IDictionary <PoEModData, int> mods = new Dictionary <PoEModData, int>();

            if (item == null)
            {
                return(mods);
            }
            //check for open prefix/suffix
            bool openprefix = item.ModCountByType(Prefix) < item.GetAffixLimit(ignorerarity);
            bool opensuffix = item.ModCountByType(Suffix) < item.GetAffixLimit(ignorerarity);
            //list existing mod groups
            ISet <string> groups = new HashSet <string>();

            foreach (ModCraft m in item.LiveMods)
            {
                PoEModData modtemplate = CraftingDatabase.AllMods[m.SourceData];
                groups.Add(modtemplate.group);
            }
            int levelcap = (op != null && op.ILvlCap > 0 && op.ILvlCap < item.ItemLevel) ? op.ILvlCap : item.ItemLevel;

            foreach (PoEModData mod in basemods.Keys)
            {
                //intentionally not checking against domain here to allow delve mods, shouldn't be a problem since domain was filtered before
                if (!openprefix && mod.generation_type == Prefix || !opensuffix && mod.generation_type == Suffix)
                {
                    continue;
                }
                if (mod.required_level > levelcap || groups.Contains(mod.group))
                {
                    continue;
                }
                IList <string> catalysttags = null;
                if (item.QualityType != null && CatalystTags.ContainsKey(item.QualityType))
                {
                    catalysttags = CatalystTags[item.QualityType];
                }
                int w = CalcGenWeight(mod, item.LiveTags, op?.ModWeightGroups, catalysttags, item.BaseQuality, op == null ? false : op.Sanctified);
                if (w > 0)
                {
                    mods.Add(mod, w);
                }
            }
            return(mods);
        }
Exemplo n.º 3
0
        //Adds mod to item, destructively modifies basemods to reflect the new rollable pool
        public static void AddModAndTrim(ItemCraft item, IDictionary <PoEModData, int> basemods, PoEModData mod, bool lucky = false)
        {
            ISet <string> newtags = new HashSet <string>(mod.adds_tags);
            ISet <string> oldtags = new HashSet <string>(item.LiveTags);

            foreach (string s in oldtags)
            {
                newtags.Remove(s);
            }
            string addedgroup = mod.group;

            item.AddMod(mod, lucky);
            string affixfill = null;

            if (mod.generation_type == Prefix && item.ModCountByType(Prefix) >= item.GetAffixLimit())
            {
                affixfill = Prefix;
            }
            else if (mod.generation_type == Suffix && item.ModCountByType(Suffix) >= item.GetAffixLimit())
            {
                affixfill = Suffix;
            }
            TrimMods(basemods, oldtags, newtags, addedgroup, affixfill);
        }
Exemplo n.º 4
0
        public static double?GetValueByName(string s, ItemCraft item, ItemProperties props, IDictionary <string, double> stats)
        {
            if (s.IndexOf("[property]") == 0)
            {
                string p = s.Substring(11);
                switch (p)
                {
                case "Quality":
                    return(props.quality);

                case "Armour":
                    return(props.armour);

                case "Evasion":
                    return(props.evasion);

                case "Energy Shield":
                    return(props.energy_shield);

                case "Block":
                    return(props.block);

                case "Physical Damage":
                    return(((double)props.physical_damage_min + props.physical_damage_max) / 2);

                case "Critical Strike Chance":
                    return((double)props.critical_strike_chance / 100);

                case "Attack Speed":
                    return((double)1000 / props.attack_time);

                case "Physical DPS":
                    return(((double)props.physical_damage_min + props.physical_damage_max) * 1000 / 2 / props.attack_time);

                case "# Prefixes":
                    return(item.ModCountByType(ModLogic.Prefix));

                case "# Suffixes":
                    return(item.ModCountByType(ModLogic.Suffix));

                case "# Open Prefixes":
                    return(item.GetAffixLimit(true) - item.ModCountByType(ModLogic.Prefix));

                case "# Open Suffixes":
                    return(item.GetAffixLimit(true) - item.ModCountByType(ModLogic.Suffix));

                default:
                    if (item.TempProps != null && item.TempProps.ContainsKey(p))
                    {
                        return(item.TempProps[p]);
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
            else if (s.IndexOf("[pseudo]") == 0)
            {
                double total = 0;
                if (CraftingDatabase.PseudoStats.ContainsKey(s))
                {
                    IDictionary <string, double> definition = CraftingDatabase.PseudoStats[s];
                    foreach (string k in definition.Keys)
                    {
                        double?v = GetValueByName(k, item, props, stats);
                        if (v != null)
                        {
                            total += v.Value * definition[k];
                        }
                    }
                }
                return(total);
            }
            else
            {
                if (stats.ContainsKey(s))
                {
                    return(stats[s]);
                }
                else
                {
                    return(null);
                }
            }
        }