using System;
using System.Collections.Generic;
using Mag.Shared.Constants;
using Mag.Shared.Spells;
namespace Mag.Shared
{
///
/// Instantiate this object with the item you want info for.
/// ToString() this object for the info.
///
public class ItemInfo
{
private readonly MyWorldObject mwo;
public ItemInfo(MyWorldObject myWorldObject)
{
mwo = myWorldObject;
}
public override string ToString()
{
return ToString(true, true);
}
public string ToString(bool showBuffedValues, bool showValueAndBurden)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
if (mwo.Values(IntValueKey.MaterialType) > 0)
{
if (Dictionaries.MaterialInfo.ContainsKey(mwo.Values(IntValueKey.MaterialType)))
sb.Append(Dictionaries.MaterialInfo[mwo.Values(IntValueKey.MaterialType)] + " ");
else
sb.Append("unknown material " + mwo.Values(IntValueKey.MaterialType) + " ");
}
sb.Append(mwo.Name);
if (mwo.Values((IntValueKey)353) > 0)
{
if (Dictionaries.MasteryInfo.ContainsKey(mwo.Values((IntValueKey)353)))
sb.Append(" (" + Dictionaries.MasteryInfo[mwo.Values((IntValueKey)353)] + ")");
else
sb.Append(" (Unknown mastery " + mwo.Values((IntValueKey)353) + ")");
}
int set = mwo.Values((IntValueKey)265, 0);
if (set != 0)
{
sb.Append(", ");
if (Dictionaries.AttributeSetInfo.ContainsKey(set))
sb.Append(Dictionaries.AttributeSetInfo[set]);
else
sb.Append("Unknown set " + set);
}
if (mwo.Values(IntValueKey.ArmorLevel) > 0)
sb.Append(", AL " + mwo.Values(IntValueKey.ArmorLevel));
if (mwo.Values(IntValueKey.ImbuedEffect) > 0)
{
sb.Append(",");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 1) == 1) sb.Append(" CS");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 2) == 2) sb.Append(" CB");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 4) == 4) sb.Append(" AR");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 8) == 8) sb.Append(" SlashRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 16) == 16) sb.Append(" PierceRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 32) == 32) sb.Append(" BludgeRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 64) == 64) sb.Append(" AcidRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 128) == 128) sb.Append(" FrostRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 256) == 256) sb.Append(" LightRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 512) == 512) sb.Append(" FireRend");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 1024) == 1024) sb.Append(" MeleeImbue");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 4096) == 4096) sb.Append(" MagicImbue");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 8192) == 8192) sb.Append(" Hematited");
if ((mwo.Values(IntValueKey.ImbuedEffect) & 536870912) == 536870912) sb.Append(" MagicAbsorb");
}
if (mwo.Values(IntValueKey.NumTimesTinkered) > 0)
sb.Append(", Tinks " + mwo.Values(IntValueKey.NumTimesTinkered));
if (mwo.Values(IntValueKey.MaxDamage_Decal) != 0 && mwo.Values(DoubleValueKey.Variance_Decal) != 0)
sb.Append(", " + (mwo.Values(IntValueKey.MaxDamage_Decal) - (mwo.Values(IntValueKey.MaxDamage_Decal) * mwo.Values(DoubleValueKey.Variance_Decal))).ToString("N2") + "-" + mwo.Values(IntValueKey.MaxDamage_Decal));
else if (mwo.Values(IntValueKey.MaxDamage_Decal) != 0 && mwo.Values(DoubleValueKey.Variance_Decal) == 0)
sb.Append(", " + mwo.Values(IntValueKey.MaxDamage_Decal));
if (mwo.Values(IntValueKey.ElementalDamageBonus, 0) != 0)
sb.Append(", +" + mwo.Values(IntValueKey.ElementalDamageBonus));
if (mwo.Values(DoubleValueKey.DamageBonus_Decal, 1) != 1)
sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.DamageBonus_Decal) - 1) * 100)) + "%");
if (mwo.Values(DoubleValueKey.ElementalDamageMod, 1) != 1)
sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.ElementalDamageMod) - 1) * 100)) + "%vs. Monsters");
if (mwo.Values(DoubleValueKey.AttackBonus_Decal, 1) != 1)
sb.Append(", +" + Math.Round(((mwo.Values(DoubleValueKey.AttackBonus_Decal) - 1) * 100)) + "%a");
if (mwo.Values(DoubleValueKey.WeaponDefense, 1) != 1)
sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponDefense) - 1) * 100)) + "%md");
if (mwo.Values(DoubleValueKey.WeaponMagicDefense, 1) != 1)
sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponMagicDefense) - 1) * 100), 1) + "%mgc.d");
if (mwo.Values(DoubleValueKey.WeaponMissileDefense, 1) != 1)
sb.Append(", " + Math.Round(((mwo.Values(DoubleValueKey.WeaponMissileDefense) - 1) * 100), 1) + "%msl.d");
if (mwo.Values(DoubleValueKey.ManaConversionMod) != 0)
sb.Append(", " + Math.Round((mwo.Values(DoubleValueKey.ManaConversionMod) * 100)) + "%mc");
if (showBuffedValues && (mwo.ObjectClass == (int)ObjectClass.MeleeWeapon || mwo.ObjectClass == (int)ObjectClass.MissileWeapon || mwo.ObjectClass == (int)ObjectClass.WandStaffOrb))
{
sb.Append(", (");
// (Damage)
if (mwo.ObjectClass == (int)ObjectClass.MeleeWeapon)
sb.Append(mwo.CalcedBuffedTinkedDoT.ToString("N1") + "/" + mwo.GetBuffedIntValueKey((int)IntValueKey.MaxDamage_Decal));
if (mwo.ObjectClass == (int)ObjectClass.MissileWeapon)
sb.Append(mwo.CalcedBuffedMissileDamage.ToString("N1"));
if (mwo.ObjectClass == (int)ObjectClass.WandStaffOrb)
sb.Append(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.ElementalDamageMod) - 1) * 100).ToString("N1"));
// (AttackBonus/MeleeDefenseBonus/ManaCBonus)
sb.Append(" ");
if (mwo.Values(DoubleValueKey.AttackBonus_Decal, 1) != 1)
sb.Append(Math.Round(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.AttackBonus_Decal) - 1) * 100)).ToString("N1") + "/");
if (mwo.Values(DoubleValueKey.WeaponDefense, 1) != 1)
sb.Append(Math.Round(((mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.WeaponDefense) - 1) * 100)).ToString("N1"));
if (mwo.Values(DoubleValueKey.ManaConversionMod) != 0)
sb.Append("/" + Math.Round(mwo.GetBuffedDoubleValueKey((int)DoubleValueKey.ManaConversionMod) * 100));
sb.Append(")");
}
if (mwo.Spells.Count > 0)
{
List sortedSpellIds = new List();
foreach (var spell in mwo.Spells)
sortedSpellIds.Add(spell);
sortedSpellIds.Sort();
sortedSpellIds.Reverse();
foreach (int spellId in sortedSpellIds)
{
Spell spell = SpellTools.GetSpell(spellId);
if (spell == null)
continue;
// If the item is not loot generated, show all spells
if (!mwo.IntValues.ContainsKey((int)IntValueKey.MaterialType))
goto ShowSpell;
// Always show Minor/Major/Epic Impen
if (spell.Name.Contains("Minor Impenetrability") || spell.Name.Contains("Major Impenetrability") || spell.Name.Contains("Epic Impenetrability") || spell.Name.Contains("Legendary Impenetrability"))
goto ShowSpell;
// Always show trinket spells
if (spell.Name.Contains("Augmented"))
goto ShowSpell;
if (mwo.Values(IntValueKey.ResistMagic, 0) != 0)
{
// Show banes and impen on unenchantable equipment
if (spell.Name.Contains(" Bane") || spell.Name.Contains("Impen") || spell.Name.StartsWith("Brogard"))
goto ShowSpell;
}
else
{
// Hide banes and impen on enchantable equipment
if (spell.Name.Contains(" Bane") || spell.Name.Contains("Impen") || spell.Name.StartsWith("Brogard"))
continue;
}
//Debug.WriteToChat(spellById.Name + ", Difficulty: " + spellById.Difficulty + ", Family: " + spellById.Family + ", Generation: " + spellById.Generation + ", Type: " + spellById.Type + ", " + spellById.Unknown1 + " " + spellById.Unknown2 + " " + spellById.Unknown3 + " " + spellById.Unknown4 + " " + spellById.Unknown5 + " " + spellById.Unknown6 + " " + spellById.Unknown7 + " " + spellById.Unknown8 + " " + spellById.Unknown9 + " " + spellById.Unknown10);
// <{Mag-Tools}>: Major Coordination, Difficulty: 15, Family: 267, Generation: 1, Type: 1, 0 1 1 2572 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Epic Magic Resistance, Difficulty: 20, Family: 299, Generation: 1, Type: 1, 0 1 1 4704 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Epic Life Magic Aptitude, Difficulty: 20, Family: 357, Generation: 1, Type: 1, 0 1 1 4700 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Epic Endurance, Difficulty: 20, Family: 263, Generation: 1, Type: 1, 0 1 1 4226 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Essence Glutton, Difficulty: 30, Family: 279, Generation: 1, Type: 1, 0 0 1 2666 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Might of the Lugians, Difficulty: 300, Family: 1, Generation: 1, Type: 1, 0 0 1 2087 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Executor's Blessing, Difficulty: 300, Family: 115, Generation: 1, Type: 1, 0 0 1 2053 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Regeneration Other Incantation, Difficulty: 400, Family: 93, Generation: 1, Type: 1, 5 0.25 1 3982 -2.07525870829232E+20 0 0 0 0 0
// Focusing stone
// <{Mag-Tools}>: Brilliance, Difficulty: 250, Family: 15, Generation: 1, Type: 1, 5 0.25 1 2348 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Concentration, Difficulty: 100, Family: 13, Generation: 1, Type: 1, 0 0 1 2347 -2.07525870829232E+20 0 0 0 0 0
// <{Mag-Tools}>: Malediction, Difficulty: 50, Family: 284, Generation: 1, Type: 1, 0 0 1 2346 -2.07525870829232E+20 0 0 0 0 0
// Weapon buffs
// <{Mag-Tools}>: Elysa's Sight, Difficulty: 300, Family: 152, Generation: 1, Type: 1, 25 0 1 2106 -2.07525870829232E+20 0 0 0 0 0 (Attack Skill)
// <{Mag-Tools}>: Infected Caress, Difficulty: 300, Family: 154, Generation: 1, Type: 1, 25 0 1 2096 -2.07525870829232E+20 0 0 0 0 0 (Damage)
// <{Mag-Tools}>: Infected Spirit Caress, Difficulty: 300, Family: 154, Generation: 1, Type: 1, 25 0 1 3259 -2.07525870829232E+20 0 0 0 0 0 (Damage)
// <{Mag-Tools}>: Cragstone's Will, Difficulty: 300, Family: 156, Generation: 1, Type: 1, 25 0 1 2101 -2.07525870829232E+20 0 0 0 0 0 (Defense)
// <{Mag-Tools}>: Atlan's Alacrity, Difficulty: 300, Family: 158, Generation: 1, Type: 1, 25 0 1 2116 -2.07525870829232E+20 0 0 0 0 0 (Speed)
// <{Mag-Tools}>: Mystic's Blessing, Difficulty: 300, Family: 195, Generation: 1, Type: 1, 25 0 1 2117 -2.07525870829232E+20 0 0 0 0 0 (Mana C)
// <{Mag-Tools}>: Vision of the Hunter, Difficulty: 500, Family: 325, Generation: 1, Type: 1, 25 0 1 2968 -2.07525870829232E+20 0 0 0 0 0 (Damage Mod)
if ((spell.Family >= 152 && spell.Family <= 158) || spell.Family == 195 || spell.Family == 325)
{
// This is a weapon buff
// Lvl 6
if (spell.Difficulty == 250)
continue;
// Lvl 7
if (spell.Difficulty == 300)
goto ShowSpell;
// Lvl 8+
if (spell.Difficulty >= 400)
goto ShowSpell;
continue;
}
// This is not a weapon buff.
// Filter all 1-5 spells
if (spell.Name.EndsWith(" I") || spell.Name.EndsWith(" II") || spell.Name.EndsWith(" III") || spell.Name.EndsWith(" IV") || spell.Name.EndsWith(" V"))
continue;
// Filter 6's
if (spell.Name.EndsWith(" VI"))
continue;
// Filter 7's
if (spell.Difficulty == 300)
continue;
// Filter 8's
if (spell.Name.Contains("Incantation"))
continue;
ShowSpell:
sb.Append(", " + spell.Name);
}
}
// Wield Lvl 180
if (mwo.Values(IntValueKey.WieldDifficulty) > 0)
{
// I don't quite understand this.
if (mwo.Values(IntValueKey.WieldRequirements) == 7 && mwo.Values(IntValueKey.WieldSkillType) == 1)
sb.Append(", Wield Lvl " + mwo.Values(IntValueKey.WieldDifficulty));
else
{
if (Dictionaries.SkillInfo.ContainsKey(mwo.Values(IntValueKey.WieldSkillType)))
sb.Append(", " + Dictionaries.SkillInfo[mwo.Values(IntValueKey.WieldSkillType)] + " " + mwo.Values(IntValueKey.WieldDifficulty));
else
sb.Append(", Unknown skill: " + mwo.Values(IntValueKey.WieldSkillType) + " " + mwo.Values(IntValueKey.WieldDifficulty));
}
}
// Summoning Gem
if (mwo.Values((IntValueKey)369) > 0)
sb.Append(", Lvl " + mwo.Values((IntValueKey)369));
// Melee Defense 300 to Activate
// If the activation is lower than the wield requirement, don't show it.
if (mwo.Values(IntValueKey.ItemSkillLevelLimit) > 0 && (mwo.Values(IntValueKey.WieldSkillType) != mwo.Values(IntValueKey.AppraisalItemSkill) || mwo.Values(IntValueKey.WieldDifficulty) < mwo.Values(IntValueKey.ItemSkillLevelLimit)))
{
if (Dictionaries.SkillInfo.ContainsKey(mwo.Values(IntValueKey.AppraisalItemSkill)))
sb.Append(", " + Dictionaries.SkillInfo[mwo.Values(IntValueKey.AppraisalItemSkill)] + " " + mwo.Values(IntValueKey.ItemSkillLevelLimit) + " to Activate");
else
sb.Append(", Unknown skill: " + mwo.Values(IntValueKey.AppraisalItemSkill) + " " + mwo.Values(IntValueKey.ItemSkillLevelLimit) + " to Activate");
}
// Summoning Gem
if (mwo.Values((IntValueKey)366) > 0 && mwo.Values((IntValueKey)367) > 0)
{
if (Dictionaries.SkillInfo.ContainsKey(mwo.Values((IntValueKey)366)))
sb.Append(", " + Dictionaries.SkillInfo[mwo.Values((IntValueKey)366)] + " " + mwo.Values((IntValueKey)367));
else
sb.Append(", Unknown skill: " + mwo.Values((IntValueKey)366) + " " + mwo.Values((IntValueKey)367));
}
// Summoning Gem
if (mwo.Values((IntValueKey)368) > 0 && mwo.Values((IntValueKey)367) > 0)
{
if (Dictionaries.SkillInfo.ContainsKey(mwo.Values((IntValueKey)368)))
sb.Append(", Spec " + Dictionaries.SkillInfo[mwo.Values((IntValueKey)368)] + " " + mwo.Values((IntValueKey)367));
else
sb.Append(", Unknown skill spec: " + mwo.Values((IntValueKey)368) + " " + mwo.Values((IntValueKey)367));
}
if (mwo.Values(IntValueKey.ItemDifficulty) > 0)
sb.Append(", Diff " + mwo.Values(IntValueKey.ItemDifficulty));
if (mwo.ObjectClass == (int)ObjectClass.Salvage)
{
if (mwo.Values(DoubleValueKey.SalvageWorkmanship_Decal) > 0)
sb.Append(", Work " + mwo.Values(DoubleValueKey.SalvageWorkmanship_Decal).ToString("N2"));
}
else
{
if (mwo.Values(IntValueKey.ItemWorkmanship) > 0 && mwo.Values(IntValueKey.NumTimesTinkered) != 10) // Don't show the work if its already 10 tinked.
sb.Append(", Craft " + mwo.Values(IntValueKey.ItemWorkmanship));
}
if (mwo.ObjectClass == (int)ObjectClass.Armor && mwo.Values(IntValueKey.ResistMagic, 0) != 0)
{
sb.Append(", [" +
mwo.Values(DoubleValueKey.SlashProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.PierceProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.BludgeonProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.ColdProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.FireProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.AcidProt_Decal).ToString("N1") + "/" +
mwo.Values(DoubleValueKey.LightningProt_Decal).ToString("N1") + "]");
}
if (showValueAndBurden)
{
if (mwo.Values(IntValueKey.Value) > 0)
sb.Append(", Value " + String.Format("{0:n0}", mwo.Values(IntValueKey.Value)));
if (mwo.Values(IntValueKey.EncumbranceVal) > 0)
sb.Append(", BU " + mwo.Values(IntValueKey.EncumbranceVal));
}
if (mwo.TotalRating > 0)
{
sb.Append(", [");
bool first = true;
if (mwo.DamRating > 0) { sb.Append("D " + mwo.DamRating); first = false; }
if (mwo.DamResistRating > 0) { if (!first) sb.Append(", "); sb.Append("DR " + mwo.DamResistRating); first = false; }
if (mwo.CritRating > 0) { if (!first) sb.Append(", "); sb.Append("C " + mwo.CritRating); first = false; }
if (mwo.CritDamRating > 0) { if (!first) sb.Append(", "); sb.Append("CD " + mwo.CritDamRating); first = false; }
if (mwo.CritResistRating > 0) { if (!first) sb.Append(", "); sb.Append("CR " + mwo.CritResistRating); first = false; }
if (mwo.CritDamResistRating > 0) { if (!first) sb.Append(", "); sb.Append("CDR " + mwo.CritDamResistRating); first = false; }
if (mwo.HealBoostRating > 0) { if (!first) sb.Append(", "); sb.Append("HB " + mwo.HealBoostRating); first = false; }
if (mwo.VitalityRating > 0) { if (!first) sb.Append(", "); sb.Append("V " + mwo.VitalityRating); first = false; }
sb.Append("]");
}
if (mwo.ObjectClass == (int)ObjectClass.Misc && mwo.Name.Contains("Keyring"))
sb.Append(", Keys: " + mwo.Values(IntValueKey.NumKeys) + ", Uses: " + mwo.Values(IntValueKey.Structure));
return sb.ToString();
}
}
}