//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); }
//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); }
//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); }
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); } } }