public SkillReader(IProcessMemoryReader reader, GameMemoryTable memory) { this.reader = reader; globals = reader.Read <D2GlobalData>(reader.ReadAddress32(memory.GlobalData, AddressingMode.Relative)); stringReader = new StringLookupTable(reader, memory); }
public UnitReader( IProcessMemoryReader reader, GameMemoryTable memory, IStringLookupTable stringReader, ISkillReader skillReader ) { this.reader = reader; this.stringReader = stringReader; this.skillReader = skillReader; cachedItemData = new Dictionary <IntPtr, D2ItemData>(); cachedDescriptions = new Dictionary <int, D2ItemDescription>(); globals = reader.Read <D2GlobalData>(reader.ReadAddress32(memory.GlobalData, AddressingMode.Relative)); lowQualityTable = reader.Read <D2SafeArray>(memory.LowQualityItems, AddressingMode.Relative); descriptionTable = reader.Read <D2SafeArray>(memory.ItemDescriptions, AddressingMode.Relative); magicModifiers = reader.Read <ModifierTable>(memory.MagicModifierTable, AddressingMode.Relative); rareModifiers = reader.Read <ModifierTable>(memory.RareModifierTable, AddressingMode.Relative); if (globals != null) { opNestings = reader.ReadArray <ushort>(globals.OpStatNesting, (int)globals.OpStatNestingCount); if (ItemStatCost == null && !globals.ItemStatCost.IsNull) { ItemStatCost = reader.ReadArray <D2ItemStatCost>(globals.ItemStatCost, (int)globals.ItemStatCostCount); } } }
public ItemInfo( Item item, D2Unit owner, UnitReader unitReader, IStringLookupTable stringReader, IInventoryReader inventoryReader ) { Class = item.Unit.eClass; ItemName = unitReader.GetFullItemName(item); ItemBaseName = BaseItemName(item, unitReader); QualityColor = QualityColorDefault(item); Properties = unitReader.GetMagicalStrings(item, owner, inventoryReader); Location = item.ItemData.BodyLoc; // TODO: fill with something useful ImageId = ""; // Backward compatibility for D2ID: // TODO: add Slug/Image/EnglishBaseName or something like that, D2ID currently uses ItemName/BaseItem for // displaying images, which doesnt work for languages other than english, so BaseItem will be // the english version, to show at least some item. also Quality is set to "YELLOW" in case of // unique and set, if game is not english, so that D2ID falls back to the // BaseItem img and shows the "unique" / "set" name above the BaseItem if (stringReader.Language == Language.English) { BaseItem = ItemBaseName; Quality = QualityColor; } else { BaseItem = BaseItemNameFallback(item, unitReader); Quality = QualityColorFallback(item); } }
void CreateReaders() { stringReader = new StringLookupTable(reader, memory); skillReader = new SkillReader(reader, memory); // note: readers need to be recreated everytime before read.. at least unitReader // unitReader fails sometimes... if this is not done .. why? not sure yet ~_~ unitReader = new UnitReader(reader, memory, stringReader, skillReader); inventoryReader = new InventoryReader(reader, unitReader); }
public string ToString(IStringLookupTable stringLookupTable) { if (min == max) { // Example: "Adds 1 to minimum damage" return(_toString(stringLookupTable, new object[] { min }, equalStringId)); } // Example: "Adds 1-2 damage" return(_toString(stringLookupTable, new object[] { min, max }, differStringId)); }
protected string _toString(IStringLookupTable stringLookupTable, object[] args, ushort stringId) { string format = stringLookupTable.ConvertCFormatString( stringLookupTable.GetString(stringId), out int arguments ); if (arguments != args.Length) { return(null); } return(string.Format(format, args).TrimEnd()); }
public new string ToString(IStringLookupTable stringLookupTable) { int min = CalculatedDamage(this.min); int max = CalculatedDamage(this.max); if (min == max) { // Example: "6 Poison damage over 2 seconds" return(_toString(stringLookupTable, new object[] { min, CalculatedDuration() }, equalStringId)); } // Example: "2-10 Poison damage over 2 seconds" return(_toString(stringLookupTable, new object[] { min, max, CalculatedDuration() }, differStringId)); }
public RangeStatData(IStringLookupTable reader, List <D2Stat> stats) { stringReader = reader; damage = new RangeStatDamage(StringConstants.DamageRange, StringConstants.DamageRange); damagePercent = new RangeStatDamage(0, 0); fireDamage = new RangeStatDamage(StringConstants.FireDamage, StringConstants.FireDamageRange); lightningDamage = new RangeStatDamage(StringConstants.LightningDamage, StringConstants.LightningDamageRange); coldDamage = new RangeStatDamage(StringConstants.ColdDamage, StringConstants.ColdDamageRange); magicDamage = new RangeStatDamage(StringConstants.MagicDamage, StringConstants.MagicDamageRange); poisonDamage = new RangeStatPoisonDamage(); ReadStatData(stats); }