public Dictionary <Item, PassiveSet> GetPassives() { Dictionary <Item, PassiveSet> dict = new Dictionary <Item, PassiveSet>(); foreach (DataRow row in dataTable.Rows) { Item item = Items.items.Find(i => i.ID == row.Field <string>(0)); PassiveSet passive = Passives.passives.Where(s => s.GetPassives().Select(p => p.Name).Contains(row.Field <string>(3))).FirstOrDefault(); if (passive != null) { dict.Add(item, passive); } } return(dict); }
public override void Randomize(BackgroundWorker backgroundWorker) { if (Flags.ItemFlags.EquipmentStatsPassives) { Flags.ItemFlags.EquipmentStatsPassives.SetRand(); Dictionary <Item, PassiveSet> plandoPassives = main.equipPassivesPlando1.GetPassives(); Dictionary <Item, Tuple <int[], int[]> > plandoStats = main.equipPlando1.GetEquipment(); if (plandoPassives.Where(p => p.Value.LockingLevel == LockingLevel.SameType && p.Key.EquipPassive.Item1.Type != p.Value.Type).Count() > 0) { KeyValuePair <Item, PassiveSet> pair = plandoPassives.Where(p => p.Key.EquipPassive.Item1.LockingLevel == LockingLevel.SameType && p.Key.EquipPassive.Item1.Type != p.Value.Type).First(); throw new Exception($"{pair.Value.GetPassives()[0].Name} on {pair.Key.Name} cannot be applied to this type of equipment ({pair.Key.EquipPassive.Item1.Type})"); } Dictionary <PassiveSet, PassiveSet> mappings = GetMappings(plandoPassives); Dictionary <Character, List <PassiveSet> > sets = ((Character[])(Enum.GetValues(typeof(Character)))).ToDictionary(c => c, c => { List <PassiveSet> list = Passives.passives .Where(s => s.Type == PassiveType.Weapon) .Select(s => mappings[s]) .Where(s => s.HasCharacter(Abilities.GetCharID(c.ToString().ToLower())) && s.LockingLevel > LockingLevel.Fixed) .ToList(); list = list.ShuffleWeighted(list.Select(s => s == Passives.None ? 3 : 1).ToList()).ToList(); return(list.Take(Items.items.Where(i => i.ID.StartsWith("wea") && i.EquipPassive.Item1 != Passives.Uncapped && GetCharacter(i.ID) == c && i.EquipPassive.Item1.LockingLevel > LockingLevel.Fixed && i.EquipPassive.Item2 == 0 && !plandoPassives.ContainsKey(i)).Select(i => i.EquipPassive.Item1).Count()).ToList()); }); Dictionary <Item, Tuple <float, float> > weaponMults = GetWeaponMults(plandoPassives, sets.ToDictionary(p => p.Key, p => new List <PassiveSet>(p.Value))); Dictionary <PassiveSet, int> tierCounts = Passives.passives.ToDictionary(s => s, s => Items.items.Where(i => (i.ID.StartsWith("wea") || i.ID.StartsWith("acc")) && i.EquipPassive.Item1 == s).Max(i => i.EquipPassive.Item2) + 1); plandoPassives.Keys.ToList().Where(i => equips[i].UpgradeInto != "").ForEach(i => { for (Item i2 = Items.items.Find(i3 => i3.ID == equips[i].UpgradeInto); ; i2 = Items.items.Find(i3 => i3.ID == equips[i2].UpgradeInto)) { if (i2.EquipPassive.Item1 != i.EquipPassive.Item1) { break; } plandoPassives.Add(i2, plandoPassives[i]); if (equips[i2].UpgradeInto == "") { break; } } }); Items.items.Where(i => i.ID.StartsWith("wea") || i.ID.StartsWith("acc")).ForEach(i => { DataStoreEquip equip = equips[i]; Character curChar = GetCharacter(i.ID); int tier = i.EquipPassive.Item2; PassiveSet initPassiveSet = i.EquipPassive.Item1; PassiveSet finalPassiveSet = i.EquipPassive.Item1; Passive initPassive = i.EquipPassive.Item1.GetPassive(Abilities.GetCharID(curChar.ToString().ToLower()), tier, tierCounts[i.EquipPassive.Item1]); Passive finalPassive = initPassive; if (i.EquipPassive.Item1.LockingLevel > LockingLevel.Fixed) { PassiveSet newSet; if (plandoPassives.ContainsKey(i)) { newSet = plandoPassives[i]; } else { newSet = i.ID.StartsWith("wea") ? sets[curChar][0] : mappings[i.EquipPassive.Item1]; } Passive passive = newSet.GetPassive(Abilities.GetCharID(curChar.ToString().ToLower()), tier, tierCounts[i.EquipPassive.Item1]); finalPassive = passive; finalPassiveSet = newSet; equip.Passive = passive.ID; equip.PassiveDisplayName = passive.PassiveDisplayName; equip.HelpDisplay = passive.PassiveHelp; equip.StatType1 = passive.StatType1; equip.StatType2 = passive.StatType2; equip.StatInitial = passive.StatInitial; } if (i.ID.StartsWith("wea")) { float strMult = (float)Math.Pow(finalPassive.StrengthModifier, 1f / Math.Pow(tier + 1, 1.2f)) * weaponMults[i].Item1; float magMult = (float)Math.Pow(finalPassive.MagicModifier, 1f / Math.Pow(tier + 1, 1.2f)) * weaponMults[i].Item2; float avgInit = ((initPassive.StrengthModifier == 0 ? 0 : equip.StrengthInitial / (float)Math.Pow(initPassive.StrengthModifier, 1f / Math.Pow(tier + 1, 1.2f))) + (initPassive.MagicModifier == 0 ? 0 : equip.MagicInitial / (float)Math.Pow(initPassive.MagicModifier, 1f / Math.Pow(tier + 1, 1.2f)))) / (equip.StrengthInitial == 0 || equip.MagicInitial == 0 || initPassive.StrengthModifier == 0 || initPassive.MagicModifier == 0 ? .75f : 2f); float avgInc = ((initPassive.StrengthModifier == 0 ? 0 : equip.StrengthIncrease / (float)Math.Pow(initPassive.StrengthModifier, 0.75f)) + (initPassive.MagicModifier == 0 ? 0 : equip.MagicIncrease / (float)Math.Pow(initPassive.MagicModifier, 0.75f))) / (equip.StrengthIncrease == 0 || equip.MagicIncrease == 0 || initPassive.StrengthModifier == 0 || initPassive.MagicModifier == 0 ? .75f : 2f); equip.StrengthInitial = (short)(avgInit * strMult); equip.StrengthIncrease = (ushort)(avgInc * Math.Pow(strMult, 0.75f)); equip.MagicInitial = (short)(avgInit * magMult); equip.MagicIncrease = (ushort)(avgInc * Math.Pow(magMult, 0.75f)); if (equips[i].UpgradeInto == "") { if (initPassiveSet.LockingLevel > LockingLevel.Fixed && !plandoPassives.ContainsKey(i)) { sets[curChar].RemoveAt(0); } } } if (plandoStats.ContainsKey(i)) { if (plandoStats[i].Item1[0] != -1) { equip.StrengthInitial = (short)plandoStats[i].Item1[0]; } if (plandoStats[i].Item2[0] != -1) { equip.StrengthIncrease = (ushort)plandoStats[i].Item2[0]; } if (plandoStats[i].Item1[1] != -1) { equip.MagicInitial = (short)plandoStats[i].Item1[1]; } if (plandoStats[i].Item2[1] != -1) { equip.MagicIncrease = (ushort)plandoStats[i].Item2[1]; } if (plandoStats[i].Item1[2] != -1) { equip.StatInitial = (short)plandoStats[i].Item1[2]; } if (plandoStats[i].Item2[2] != -1) { equip.StatIncrease = (ushort)plandoStats[i].Item2[2]; } } }); RandomNum.ClearRand(); } }