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 }
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); } } }
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); } } }