public virtual List<ComparisonCalculationBase> GetTinkeringCalculations(ItemSlot slot, Character character, CharacterCalculationsBase currentCalcs, bool equippedOnly, bool forceSlotName=false) { ClearCache(); List<ComparisonCalculationBase> tinkerCalcs = new List<ComparisonCalculationBase>(); CharacterCalculationsBase calcsEquipped = null; CharacterCalculationsBase calcsUnequipped = null; // only need to get unequipped value once not every time around the loop Character charUnequipped = character.Clone(); charUnequipped.SetTinkeringBySlot(slot, null); calcsUnequipped = GetCharacterCalculations(charUnequipped, null, false, false, false); foreach (Tinkering tinkering in Tinkering.FindTinkerings(slot, character)) { bool isEquipped = character.GetTinkeringBySlot(slot) == tinkering; if (equippedOnly && !isEquipped) continue; Character charEquipped = character.Clone(); charEquipped.SetTinkeringBySlot(slot, tinkering); calcsEquipped = GetCharacterCalculations(charEquipped, null, false, false, false); ComparisonCalculationBase tinkeringCalc = CreateNewComparisonCalculation(); tinkeringCalc.Name = forceSlotName || equippedOnly ? string.Format("{0} ({1})", tinkering.Name, slot) : tinkering.Name; tinkeringCalc.Item = new Item(tinkering.Name, ItemQuality.Temp, ItemType.None, -1 * (tinkering.Id + ((int)AvailableItemIDModifiers.Tinkerings * (int)tinkering.Slot)), null, ItemSlot.None, null, false, tinkering.Stats, null, ItemSlot.None, ItemSlot.None, ItemSlot.None, 0, 0, ItemDamageType.Physical, 0, null); tinkeringCalc.Item.Name = forceSlotName || equippedOnly ? string.Format("{0} ({1})", tinkering.Name, slot) : tinkering.Name; ; tinkeringCalc.Item.Stats = tinkering.Stats; tinkeringCalc.Equipped = isEquipped; tinkeringCalc.OverallPoints = calcsEquipped.OverallPoints - calcsUnequipped.OverallPoints; float[] subPoints = new float[calcsEquipped.SubPoints.Length]; for (int i = 0; i < calcsEquipped.SubPoints.Length; i++) { subPoints[i] = calcsEquipped.SubPoints[i] - calcsUnequipped.SubPoints[i]; } tinkeringCalc.SubPoints = subPoints; tinkeringCalc.ImageSource = tinkering.IconSource; tinkerCalcs.Add(tinkeringCalc); if (equippedOnly && isEquipped) break; } return tinkerCalcs; }