Пример #1
0
 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;
 }