/// <summary> /// Decodes item specific data /// </summary> private void ReadItemDataExtendedSpecific() { if (ItemDefs.IsArmor(ItemCode)) { ReadData("Defense", ItemDefs.ItemStatCostsByName["armorclass"].SaveBits); Defense -= (uint)ItemDefs.ItemStatCostsByName["armorclass"].SaveAdd; } if (ItemDefs.IsWeapon(ItemCode) || ItemDefs.IsArmor(ItemCode)) { ReadData("MaxDurability", ItemDefs.ItemStatCostsByName["maxdurability"].SaveBits); MaxDurability -= (uint)ItemDefs.ItemStatCostsByName["maxdurability"].SaveAdd; if (MaxDurability != 0) { ReadData("Durability", ItemDefs.ItemStatCostsByName["durability"].SaveBits); Durability -= (uint)ItemDefs.ItemStatCostsByName["durability"].SaveAdd; } else { IsIndestructable = true; } } // Not sure of the order of socketed+stackable. Socketed arrows seem to mess up if (ItemDefs.IsStackable(ItemCode)) { ReadData("Quantity", 9); } if (IsSocketed) { ReadData("SocketCount", 4); } if (Quality == ItemQuality.Set) { ReadData("NumberOfSetProperties", 5); } ReadPropertyList(properties); if (Quality == ItemQuality.Set) { int numberOfSetProperties = (int)GetDataValue("NumberOfSetProperties"); while (bs.RemainingBits > 9) { ReadPropertyList(propertiesSet); } } if (IsRuneword) { ReadPropertyList(propertiesRuneword); } }
/// <summary> /// Creates a new SaveReader /// </summary> public SaveReader(string resourceSet) { // load only once if (ItemDefs.Loaded) { return; } Resources.Instance.ResourceSet = resourceSet; ItemDefs.LoadItemDefs(); }
public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append(String.Format("{0} {1}", ItemCode, ItemDefs.GetItemDescription(ItemCode))); if (this.IsSocketed) { sb.Append(" Soc: " + this.SocketsFilled + "/" + this.SocketCount); } if (!this.IsIndestructable) { sb.Append(" Dur: " + this.Durability + " / " + this.MaxDurability); } return(sb.ToString()); }
public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append(String.Format("{0} {1}", ItemCode, ItemDefs.GetItemDescription(ItemCode))); if (sockets.Count > 0) { sb.Append(" { "); for (int i = 0; i < sockets.Count; i++) { sb.Append(ItemDefs.GetItemDescription(sockets[i].ItemCode)); if (i < sockets.Count - 1) { sb.Append(", "); } } sb.Append(" }"); } return(sb.ToString()); }
/// <summary> /// Creates a new SaveReader /// </summary> public SaveReader(string resourceSet) { Resources.Instance.ResourceSet = resourceSet; ItemDefs.LoadItemDefs(); }
/// <summary> /// Decodes extended item data /// </summary> private void ReadItemDataExtended() { ReadData("SocketsFilled", 3); if (!IsPacketData) { ReadData("Id", 32); } ReadData("Level", 7); ReadData("Quality", 4); ReadData("HasGraphic", 1); if (HasGraphic) { ReadData("Graphic", 3); } // No idea what this flag is. Some say Class data others say Color data ReadData("ClassFlag", 1); if (ClassFlag) { ReadData("ClassInfo", 11); } if (!IsIdentified) { return; } switch (Quality) { case ItemQuality.Inferior: ReadData("InferiorQualityType", 3); break; case ItemQuality.Superior: ReadData("SuperiorQualityType", 3); break; case ItemQuality.Normal: if (ItemDefs.IsCharm(ItemCode)) { ReadData("CharmData", 12); } if (ItemDefs.IsScrollOrTome(ItemCode)) { ReadData("SpellId", 5); } else if (ItemDefs.IsMonsterPart(ItemCode)) { ReadData("MonsterId", 10); } break; case ItemQuality.Magic: ReadData("MagicPrefix", 11); ReadData("MagicSuffix", 11); break; case ItemQuality.Rare: case ItemQuality.Craft: ReadData("PrefixNameId", 8); ReadData("SuffixNameId", 8); for (int i = 0; i < 3; i++) { string prefixIndex = string.Format("PrefixFlag{0}", i); ReadData(prefixIndex, 1); if (GetDataBoolean(prefixIndex)) { ReadData(string.Format("Prefix{0}", i), 11); } string suffixIndex = string.Format("SuffixFlag{0}", i); ReadData(suffixIndex, 1); if (GetDataBoolean(suffixIndex)) { ReadData(string.Format("Suffix{0}", i), 11); } } break; case ItemQuality.Unique: case ItemQuality.Set: ReadData("UniqueSetId", 12); break; default: break; } if (IsRuneword) { ReadData("RunewordId", 16); } if (IsPersonalized) { ReadString("PersonalizedName", 7); //TODO: 15 in ROT? } }