Пример #1
0
        public SkillReader(IProcessMemoryReader reader, GameMemoryTable memory)
        {
            this.reader = reader;

            globals      = reader.Read <D2GlobalData>(reader.ReadAddress32(memory.GlobalData, AddressingMode.Relative));
            stringReader = new StringLookupTable(reader, memory);
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        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));
        }
Пример #6
0
        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());
        }
Пример #7
0
        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));
        }
Пример #8
0
        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);
        }