public MetaReader(IStreamManager streamManager, uint baseOffset, ICacheFile cache, BuildInformation buildInfo, FieldChangeSet ignore) { _streamManager = streamManager; BaseOffset = baseOffset; _cache = cache; _ignoredFields = ignore; // Load layouts _reflexiveLayout = buildInfo.GetLayout("reflexive"); _tagRefLayout = buildInfo.GetLayout("tag reference"); _dataRefLayout = buildInfo.GetLayout("data reference"); }
/// <summary> /// Save meta to the Blam Cache File /// </summary> public MetaWriter(IWriter writer, uint baseOffset, ICacheFile cache, BuildInformation buildInfo, SaveType type, FieldChangeSet changes) { _writer = writer; _baseOffset = baseOffset; _cache = cache; _type = type; _changes = changes; // Load layouts _reflexiveLayout = buildInfo.GetLayout("reflexive"); _tagRefLayout = buildInfo.GetLayout("tag reference"); _dataRefLayout = buildInfo.GetLayout("data reference"); }
private void Load(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, StringIDSource stringIDs, BuildInformation buildInfo) { StringTableReader stringReader = new StringTableReader(); ScriptExpressions = LoadScriptExpressions(values, reader, metaArea, stringReader, buildInfo.GetLayout("script expression entry")); ScriptObjects = LoadScriptObjects(values, reader, metaArea, stringIDs, buildInfo.GetLayout("script object entry")); ScriptGlobals = LoadScriptGlobals(values, reader, metaArea, ScriptExpressions, buildInfo.GetLayout("script global entry")); Scripts = LoadScripts(values, reader, metaArea, stringIDs, ScriptExpressions, buildInfo.GetLayout("script entry"), buildInfo); CachedStringTable strings = LoadStrings(values, reader, stringReader, metaArea); foreach (IExpression expr in ScriptExpressions) { // FIXME: hax if (expr != null) ((ThirdGenExpression)expr).ResolveStrings(strings); } }
/// <summary> /// Reads all child objects of this reflexive. /// </summary> /// <param name="values">The values read from the parent.</param> /// <param name="reader">The stream to read from.</param> /// <param name="metaArea">The meta area of the cache file.</param> /// <param name="stringIDs">The string ID source for the cache file.</param> /// <param name="buildInfo">The build info for the cache file.</param> /// <returns>The objects that were read.</returns> public ScriptObject[] ReadObjects(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, StringIDSource stringIDs, BuildInformation buildInfo) { int count = (int)values.GetInteger(_countEntryName); uint address = (uint)values.GetInteger(_addressEntryName); var layout = buildInfo.GetLayout(_layoutName); var entries = ReflexiveReader.ReadReflexive(reader, count, address, layout, metaArea); return entries.Select(e => ReadScriptObject(e, reader, metaArea, stringIDs, buildInfo)).ToArray(); }
public ThirdGenLanguage(StructureValueCollection values, FileSegmenter segmenter, FileSegmentGroup localeArea, BuildInformation buildInfo) { _pointerLayout = buildInfo.GetLayout("locale index table entry"); _encryptionKey = buildInfo.LocaleKey; _symbols = buildInfo.LocaleSymbols; _localeArea = localeArea; _sizeAlign = (_encryptionKey != null) ? AES.BlockSize : 1; Load(values, segmenter, localeArea); }
private void LoadPermutations(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo) { int count = (int)values.GetInteger("number of permutations"); uint address = values.GetInteger("permutation table address"); var layout = buildInfo.GetLayout("model permutation"); var entries = ReflexiveReader.ReadReflexive(count, address, reader, layout, metaArea); Permutations = (from entry in entries select new ThirdGenModelPermutation(entry)).ToArray(); }
private void LoadSegments(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo, ThirdGenResourcePage[] pages) { int count = (int)values.GetInteger("number of raw segments"); uint address = values.GetInteger("raw segment table address"); var layout = buildInfo.GetLayout("raw segment table entry"); var entries = ReflexiveReader.ReadReflexive(count, address, reader, layout, metaArea); Segments = (from entry in entries select new ThirdGenResourceSegment(entry, pages)).ToArray(); }
private void LoadFileReferences(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo) { int count = (int)values.GetInteger("number of external cache files"); uint address = values.GetInteger("external cache file table address"); var layout = buildInfo.GetLayout("external cache file table entry"); var entries = ReflexiveReader.ReadReflexive(count, address, reader, layout, metaArea); FileReferences = (from entry in entries select new ThirdGenCacheFileReference(entry)).ToArray(); }
private void LoadSubmeshes(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo) { int count = (int)values.GetInteger("number of submeshes"); uint address = values.GetInteger("submesh table address"); var layout = buildInfo.GetLayout("model submesh"); var entries = ReflexiveReader.ReadReflexive(reader, count, address, layout, metaArea); Submeshes = (from entry in entries select new ThirdGenModelSubmesh(entry)).ToArray(); }
private void LoadVertexGroups(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo, IModelSubmesh[] submeshes) { int count = (int)values.GetInteger("number of vertex groups"); uint address = values.GetInteger("vertex group table address"); var layout = buildInfo.GetLayout("model vertex group"); var entries = ReflexiveReader.ReadReflexive(reader, count, address, layout, metaArea); VertexGroups = (from entry in entries select new ThirdGenModelVertexGroup(entry, submeshes)).ToArray(); }
private void LoadResources(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo, ThirdGenTagTable tags, ThirdGenResourceLayoutTable layoutInfo) { int count = (int)values.GetInteger("number of resources"); uint address = values.GetInteger("resource table address"); var layout = buildInfo.GetLayout("resource table entry"); var entries = ReflexiveReader.ReadReflexive(count, address, reader, layout, metaArea); _resources = new ThirdGenResource[entries.Length]; for (ushort i = 0; i < entries.Length; i++) _resources[i] = new ThirdGenResource(entries[i], i, tags, layoutInfo); }
private static List<ITagClass> ReadClasses(IReader reader, uint classTableOffset, int numClasses, BuildInformation buildInfo) { StructureLayout layout = buildInfo.GetLayout("class entry"); List<ITagClass> result = new List<ITagClass>(); reader.SeekTo(classTableOffset); for (int i = 0; i < numClasses; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new SecondGenTagClass(values)); } return result; }
private void LoadBoundingBox(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, BuildInformation buildInfo) { int count = (int)values.GetInteger("number of bounding boxes"); if (count < 1) return; uint address = values.GetInteger("bounding box table address"); var layout = buildInfo.GetLayout("model bounding box"); var entries = ReflexiveReader.ReadReflexive(reader, 1, address, layout, metaArea); // Just take the first bounding box // Is it even possible for models to have more than one? BoundingBox = new ThirdGenModelBoundingBox(entries.First()); }
private IList<IScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, BuildInformation buildInfo) { int paramCount = (int)values.GetInteger("number of parameters"); if (paramCount == 0) return new List<IScriptParameter>(); SegmentPointer paramListLocation = SegmentPointer.FromPointer(values.GetInteger("address of parameter list"), metaArea); StructureLayout layout = buildInfo.GetLayout("script parameter entry"); List<IScriptParameter> result = new List<IScriptParameter>(); reader.SeekTo(paramListLocation.AsOffset()); for (int i = 0; i < paramCount; i++) { StructureValueCollection paramValues = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenScriptParameter(paramValues)); } return result; }
private SecondGenHeader LoadHeader(IReader reader, BuildInformation buildInfo, string buildString) { reader.SeekTo(0); StructureValueCollection values = StructureReader.ReadStructure(reader, buildInfo.GetLayout("header")); return new SecondGenHeader(values, buildInfo, buildString, _segmenter); }
private IList<ScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, BuildInformation buildInfo) { int count = (int)values.GetInteger("number of parameters"); uint address = values.GetInteger("address of parameter list"); var layout = buildInfo.GetLayout("script parameter entry"); var entries = ReflexiveReader.ReadReflexive(reader, count, address, layout, metaArea); return entries.Select(e => new ScriptParameter(e)).ToList(); }
private List<ITagClass> ReadClasses(IReader reader, SegmentPointer classTableLocation, int numClasses, BuildInformation buildInfo) { StructureLayout layout = buildInfo.GetLayout("class entry"); List<ITagClass> result = new List<ITagClass>(); reader.SeekTo(classTableLocation.AsOffset()); for (int i = 0; i < numClasses; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTagClass(values)); } return result; }
private List<ITag> ReadTags(IReader reader, SegmentPointer tagTableLocation, int numTags, BuildInformation buildInfo, FileSegmentGroup metaArea) { StructureLayout layout = buildInfo.GetLayout("tag entry"); List<ITag> result = new List<ITag>(); reader.SeekTo(tagTableLocation.AsOffset()); for (int i = 0; i < numTags; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new ThirdGenTag(values, (ushort)i, metaArea, _classes)); } return result; }
private List<ITag> ReadTags(IReader reader, uint tagTableOffset, int numTags, BuildInformation buildInfo, FileSegmentGroup metaArea) { StructureLayout layout = buildInfo.GetLayout("tag entry"); List<ITag> result = new List<ITag>(); reader.SeekTo(tagTableOffset); for (int i = 0; i < numTags; i++) { StructureValueCollection values = StructureReader.ReadStructure(reader, layout); result.Add(new SecondGenTag(values, metaArea, _classesById)); } return result; }
private SecondGenTagTable LoadTagTable(IReader reader, BuildInformation buildInfo) { reader.SeekTo(MetaArea.Offset); StructureValueCollection values = StructureReader.ReadStructure(reader, buildInfo.GetLayout("meta header")); return new SecondGenTagTable(reader, values, MetaArea, buildInfo); }