public virtual List<ComparisonCalculationBase> GetReforgeCalculations(CharacterSlot slot, Character character, CharacterCalculationsBase currentCalcs, bool equippedOnly) { ClearCache(); List<ComparisonCalculationBase> reforgeCalcs = new List<ComparisonCalculationBase>(); if (!equippedOnly) { CharacterCalculationsBase calcsEquipped = null; CharacterCalculationsBase calcsUnequipped = null; // only need to get unequipped value once not every time around the loop Character charUnequipped = character.Clone(); charUnequipped.SetReforgingBySlot(slot, null); calcsUnequipped = GetCharacterCalculations(charUnequipped, null, false, false, false); Item toReforge = character[slot] != null ? character[slot].Item : null; int toReforgeSuffix = character[slot] != null ? character[slot].RandomSuffixId : 0; if (toReforge == null) return reforgeCalcs; List<Reforging> possibleReforges = GetReforgingOptions(toReforge, toReforgeSuffix); foreach (Reforging reforge in possibleReforges) { Reforging origReforge = character.GetReforgingBySlot(slot); int id1 = origReforge != null ? origReforge.Id : 0; int id2 = reforge != null ? reforge.Id : 0; bool isEquipped = id1 == id2; Character charEquipped = character.Clone(); charEquipped.SetReforgingBySlot(slot, reforge); calcsEquipped = GetCharacterCalculations(charEquipped, null, false, false, false); ComparisonCalculationBase reforgeCalc = CreateNewComparisonCalculation(); if (reforge != null) { reforgeCalc.Name = reforge.ToString(); reforgeCalc.Item = new Item(reforge.ToString(), ItemQuality.Temp, ItemType.None, -(int)AvailableItemIDModifiers.Reforges - reforge.Id, null, ItemSlot.None, null, false, new Stats(), null, ItemSlot.None, ItemSlot.None, ItemSlot.None, 0, 0, ItemDamageType.Physical, 0, null); reforgeCalc.Item.Stats._rawAdditiveData[(int)reforge.ReforgeFrom] -= reforge.ReforgeAmount; reforgeCalc.Item.Stats._rawAdditiveData[(int)reforge.ReforgeTo] += reforge.ReforgeAmount; } else { reforgeCalc.Name = "Not Reforged"; reforgeCalc.Item = new Item("Not Reforged", ItemQuality.Temp, ItemType.None, -(int)AvailableItemIDModifiers.Reforges, null, ItemSlot.None, null, false, new Stats(), null, ItemSlot.None, ItemSlot.None, ItemSlot.None, 0, 0, ItemDamageType.Physical, 0, null); } reforgeCalc.Equipped = isEquipped; reforgeCalc.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]; } reforgeCalc.SubPoints = subPoints; reforgeCalcs.Add(reforgeCalc); } } else { CharacterCalculationsBase calcsEquipped = null; CharacterCalculationsBase calcsUnequipped = null; // only need to get unequipped value once not every time around the loop Character charUnequipped = character.Clone(); charUnequipped.SetReforgingBySlot(slot, null); calcsUnequipped = GetCharacterCalculations(charUnequipped, null, false, false, false); Item toReforge = character[slot] != null ? character[slot].Item : null; if (toReforge == null) return reforgeCalcs; Reforging reforge = character[slot].Reforging; Reforging origReforge = character.GetReforgingBySlot(slot); bool isEquipped = true; Character charEquipped = character; calcsEquipped = GetCharacterCalculations(charEquipped, null, false, false, false); ComparisonCalculationBase reforgeCalc = CreateNewComparisonCalculation(); if (reforge != null) { reforgeCalc.Name = reforge.ToString(); reforgeCalc.Item = new Item(reforge.ToString(), ItemQuality.Temp, ItemType.None, -(int)AvailableItemIDModifiers.Reforges - reforge.Id, null, ItemSlot.None, null, false, new Stats(), null, ItemSlot.None, ItemSlot.None, ItemSlot.None, 0, 0, ItemDamageType.Physical, 0, null); reforgeCalc.Item.Stats._rawAdditiveData[(int)reforge.ReforgeFrom] -= reforge.ReforgeAmount; reforgeCalc.Item.Stats._rawAdditiveData[(int)reforge.ReforgeTo] += reforge.ReforgeAmount; } else { reforgeCalc.Name = "Not Reforged"; reforgeCalc.Item = new Item("Not Reforged", ItemQuality.Temp, ItemType.None, -(int)AvailableItemIDModifiers.Reforges, null, ItemSlot.None, null, false, new Stats(), null, ItemSlot.None, ItemSlot.None, ItemSlot.None, 0, 0, ItemDamageType.Physical, 0, null); } reforgeCalc.Equipped = isEquipped; reforgeCalc.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]; } reforgeCalc.SubPoints = subPoints; reforgeCalcs.Add(reforgeCalc); } return reforgeCalcs; }