public RawEntry(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;

                Reader.SeekTo(Address);

                Reader.SeekTo(Address + 12);
                TagID = Reader.ReadInt32();

                Reader.ReadInt16();
                Reader.ReadInt16();
                Reader.ReadInt32();

                FixupOffset = Reader.ReadInt32();
                FixupSize   = Reader.ReadInt32();

                Reader.ReadInt32();

                CacheIndex     = Reader.ReadInt32();
                RequiredOffset = Reader.ReadInt32();
                RequiredSize   = Reader.ReadInt32();

                Reader.ReadInt32();

                CacheIndex2    = Reader.ReadInt32();
                OptionalOffset = Reader.ReadInt32();
                OptionalSize   = Reader.ReadInt32();

                Reader.ReadInt32();
                Reader.ReadInt32();

                #region Resource Fixups
                int iCount  = Reader.ReadInt32();
                int iOffset = Reader.ReadInt32() - Cache.Magic;
                for (int i = 0; i < iCount; i++)
                {
                    Fixups.Add(new ResourceFixup(Cache, iOffset + 8 * i));
                }
                #endregion

                #region Resource Definition Fixups
                Reader.SeekTo(Address + 84);
                iCount  = Reader.ReadInt32();
                iOffset = Reader.ReadInt32() - Cache.Magic;
                for (int i = 0; i < iCount; i++)
                {
                    DefinitionFixups.Add(new ResourceDefinitionFixup(Cache, iOffset + 8 * i));
                }
                #endregion
            }
            public RawEntry(CacheBase Cache, int Address)
            {
                EndianReader Reader = Cache.Reader;

                Reader.SeekTo(Address);

                Reader.SeekTo(Address + 12);
                TagID = Reader.ReadInt32();
                Reader.ReadInt16();
                Reader.ReadByte();
                Reader.ReadByte();
                FixupSize = Reader.ReadInt32();
                Reader.ReadInt16();
                SegmentIndex = Reader.ReadInt16();
                Reader.ReadInt32();

                #region Resources
                Reader.SeekTo(Address + 32);
                int iCount  = Reader.ReadInt32();
                int iOffset = Reader.ReadInt32() - Cache.Magic;
                for (int i = 0; i < iCount; i++)
                {
                    Fixups.Add(new ResourceFixup(Cache, iOffset + 8 * i));
                }
                #endregion

                #region Resource Definitions
                Reader.SeekTo(Address + 44);
                iCount  = Reader.ReadInt32();
                iOffset = Reader.ReadInt32() - Cache.Magic;
                for (int i = 0; i < iCount; i++)
                {
                    DefinitionFixups.Add(new ResourceDefinitionFixup(Cache, iOffset + 8 * i));
                }
                #endregion

                #region Fixup Location
                Reader.SeekTo(Address + 56);
                iCount  = Reader.ReadInt32();
                iOffset = Reader.ReadInt32() - Cache.Magic;
                if (iCount > 0)
                {
                    Reader.SeekTo(iOffset);
                    FixupOffset = Reader.ReadInt32();
                }
                #endregion
            }
Exemplo n.º 3
0
        void ReadFixups(NomadObject obj)
        {
            var offsetsAttr = obj.GetAttribute("offsetsArray");
            var hashesAttr  = obj.GetAttribute("hashesArray");

            if ((offsetsAttr != null) && (hashesAttr != null))
            {
                var offsets = Utils.UnpackArray(offsetsAttr, BitConverter.ToInt32, 4, out int nOffsets);
                var hashes  = Utils.UnpackArray(hashesAttr, BitConverter.ToInt32, 4, out int nHashes);

                if (nOffsets != nHashes)
                {
                    throw new InvalidDataException("Yikes!");
                }

                // doesn't matter which one we use
                // but we'll be verbose anyways :)
                var count = (nOffsets & nHashes);

                Fixups = new List <FixupInfo>(count);

                for (int i = 0; i < count; i++)
                {
                    var offset = offsets[i];
                    var hash   = hashes[i];

                    var fixup = new FixupInfo(hash, offset);

                    Fixups.Add(fixup);
                }
            }
            else
            {
                foreach (var child in obj.Children)
                {
                    if (child.Id != "FIXUP")
                    {
                        throw new InvalidDataException($"Expected a FIXUP but got '{child.Id}' instead.");
                    }

                    var fixup = ParseFixup(child);

                    Fixups.Add(fixup);
                }
            }
        }
Exemplo n.º 4
0
        void ProcessFixups(ProjectState state, IO.XmlStream s)
        {
            foreach (XmlNode n in s.Cursor.ChildNodes)
            {
                if (n.Name != "fixup")
                {
                    continue;
                }

                s.SaveCursor(n);
                var fu = new Fixup(state, s);
                s.RestoreCursor();
                string name_str = fu.ToString();

                try { Fixups.Add(name_str, fu); }
                catch (ArgumentException) { Debug.LogFile.WriteLine(kDuplicateErrorStr, "fix-up definition", name_str); }
            }
        }