private ScriptExpressionTable LoadSyntax(IReader reader, StructureValueCollection values, StringTableReader stringReader) { var stringsSize = (int)values.GetInteger("script string table size"); var tableSize = (int)values.GetInteger("script syntax table size"); uint tableAddress = (uint)values.GetInteger("script syntax table address"); long expand = _expander.Expand(tableAddress); StructureLayout headerLayout = _buildInfo.Layouts.GetLayout("script syntax table header"); StructureValueCollection[] headerEntry = TagBlockReader.ReadTagBlock(reader, 1, expand, headerLayout, _metaArea); int count = (int)headerEntry[0].GetInteger("element count"); StructureLayout layout = _buildInfo.Layouts.GetLayout("script syntax table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand + headerLayout.Size, layout, _metaArea); var result = new ScriptExpressionTable(); result.AddExpressions(entries.Select((e, i) => new ScriptExpression(e, (ushort)i, stringReader, stringsSize))); foreach (ScriptExpression expr in result.Where(expr => expr != null)) { expr.ResolveReferences(result); } return(result); }
private List <ITagGroup> LoadTagGroups(IReader reader, StructureValueCollection headerValues) { var count = (int)headerValues.GetInteger("number of tag groups"); long address = (long)headerValues.GetInteger("tag group table address"); StructureLayout layout = _buildInfo.Layouts.GetLayout("tag group element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, _metaArea); return(entries.Select <StructureValueCollection, ITagGroup>(e => new ThirdGenTagGroup(e)).ToList()); }
private void LoadSoundNames(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo) { var count = (int)values.GetInteger("number of sound names"); var address = (uint)values.GetInteger("sound name table address"); var layout = buildInfo.Layouts.GetLayout("sound names"); var entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, metaArea); SoundNames = entries.Select(e => new StringID(e.GetInteger("name index"))).ToArray(); }
private void LoadSoundPlaybacks(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo) { var count = (int)values.GetInteger("number of playbacks"); var address = (uint)values.GetInteger("playback table address"); var layout = buildInfo.Layouts.GetLayout("sound playbacks"); var entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, metaArea); SoundPlaybacks = (from entry in entries select new ThirdGenSoundPlayback(entry, SoundNames)).ToArray <ISoundPlayback>(); }
private List <ScriptGlobal> LoadVariables(IReader reader, StructureValueCollection values) { int count = (int)values.GetInteger("number of script variables"); uint address = (uint)values.GetInteger("script variable table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("script variable element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => new ScriptGlobal(e, _stringIDs)).ToList()); }
private List <ITag> LoadTags(IReader reader, StructureValueCollection headerValues, IList <ITagGroup> groups) { var count = (int)headerValues.GetInteger("number of tags"); long address = (long)headerValues.GetInteger("tag table address"); StructureLayout layout = _buildInfo.Layouts.GetLayout("tag element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, _metaArea); return (entries.Select <StructureValueCollection, ITag>((e, i) => new ThirdGenTag(e, (ushort)i, _metaArea, groups, _expander)) .ToList()); }
private StructureValueCollection[] ReadTagBlock(StructureValueCollection values, IReader reader, string countName, string addressName, string layoutName) { var count = (int)values.GetInteger(countName); uint address = (uint)values.GetInteger(addressName); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout(layoutName); return(TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea)); }
private List <Script> LoadScripts(IReader reader, StructureValueCollection values) { int count = (int)values.GetInteger("number of scripts"); uint address = (uint)values.GetInteger("script table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("script element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); var result = entries.Select(e => new Script(e, reader, _metaArea, _stringIDs, _buildInfo, _expander)).ToList(); return(result); }
private void LoadPermutations(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo) { var count = (int)values.GetInteger("number of permutations"); uint address = (uint)values.GetInteger("permutation table address"); StructureLayout layout = buildInfo.Layouts.GetLayout("model permutation"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, metaArea); Permutations = (from entry in entries select new ThirdGenModelPermutation(entry)).ToArray(); }
private void LoadBoundingBoxes(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo) { var count = (int)values.GetInteger("number of bounding boxes"); uint address = (uint)values.GetInteger("bounding box table address"); StructureLayout layout = buildInfo.Layouts.GetLayout("model bounding box"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, 1, address, layout, metaArea); BoundingBoxes = (from entry in entries select BoundingBox.Deserialize(entry)).ToArray(); }
private void LoadRegions(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo) { var count = (int)values.GetInteger("number of regions"); long address = (long)owningCacheFile.PointerExpander.Expand((uint)values.GetInteger("region table address")); StructureLayout layout = buildInfo.Layouts.GetLayout("model region"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, metaArea); Regions = (from entry in entries select new ThirdGenModelRegion(entry, reader, metaArea, buildInfo)).ToArray(); }
private ThirdGenCacheFileReference[] LoadExternalFiles(StructureValueCollection values, IReader reader) { var count = (int)values.GetInteger("number of external cache files"); uint address = (uint)values.GetInteger("external cache file table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("external cache file table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => new ThirdGenCacheFileReference(e)).ToArray()); }
private void LoadVertexGroups(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, EngineDescription buildInfo, IModelSubmesh[] submeshes) { var count = (int)values.GetInteger("number of vertex groups"); uint address = (uint)values.GetInteger("vertex group table address"); StructureLayout layout = buildInfo.Layouts.GetLayout("model vertex group"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, metaArea); VertexGroups = (from entry in entries select new ThirdGenModelVertexGroup(entry, submeshes)).ToArray(); }
private IList <ScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, EngineDescription buildInfo, IPointerExpander expander) { var count = (int)values.GetInteger("number of parameters"); uint address = (uint)values.GetInteger("address of parameter list"); long expand = expander.Expand(address); StructureLayout layout = buildInfo.Layouts.GetLayout("script parameter element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, metaArea); return(entries.Select(e => new ScriptParameter(e)).ToList()); }
public IEnumerable <ResourcePointer> LoadPointers(IReader reader, IList <ResourcePage> pages, IList <ResourceSize> sizes) { StructureValueCollection values = LoadTag(reader); var count = (int)values.GetInteger("number of raw segments"); uint address = (uint)values.GetInteger("raw segment table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("raw segment table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => LoadPointer(e, pages, sizes))); }
public List <ResourceSize> LoadSizes(IReader reader) { StructureValueCollection values = LoadTag(reader); var count = (int)values.GetInteger("number of raw sizes"); uint address = (uint)values.GetInteger("raw size table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("raw size table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select((e, i) => LoadSize(e, i, reader)).ToList()); }
/// <summary> /// Reads all child objects of this block. /// </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, EngineDescription buildInfo, IPointerExpander expander) { var count = (int)values.GetInteger(_countEntryName); uint address = (uint)values.GetInteger(_addressEntryName); long expand = expander.Expand(address); StructureLayout layout = buildInfo.Layouts.GetLayout(_layoutName); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, metaArea); return(entries.Select(e => ReadScriptObject(e, reader, metaArea, stringIDs, buildInfo, expander)).ToArray()); }
private void Load(IReader reader) { reader.SeekTo(_scenario.MetaLocation.AsOffset()); var scenarioLayout = _buildInfo.Layouts.GetLayout("scnr"); var scenarioData = StructureReader.ReadStructure(reader, scenarioLayout); var count = (int)scenarioData.GetInteger("simulation definition table count"); var address = (uint)scenarioData.GetInteger("simulation definition table address"); var entryLayout = _buildInfo.Layouts.GetLayout("simulation definition table element"); _table = TagBlockReader.ReadTagBlock(reader, count, address, entryLayout, _metaArea).Select((e) => _tags[new DatumIndex(e.GetInteger("datum index"))]).ToList(); }
public IEnumerable <ResourcePage> LoadPages(IReader reader) { StructureValueCollection values = LoadTag(reader); ThirdGenCacheFileReference[] files = LoadExternalFiles(values, reader); var count = (int)values.GetInteger("number of raw pages"); uint address = (uint)values.GetInteger("raw page table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("raw page table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select((e, i) => LoadPage(e, i, files))); }
private IEnumerable <ResourceSizePart> LoadSizeParts(StructureValueCollection values, IReader reader) { var count = (int)values.GetInteger("number of size parts"); uint address = (uint)values.GetInteger("size part table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("size part table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => new ResourceSizePart { Offset = (int)e.GetInteger("offset"), Size = (int)e.GetInteger("size") })); }
private IEnumerable <ResourceDefinitionFixup> LoadDefinitionFixups(StructureValueCollection values, IReader reader) { var count = (int)values.GetInteger("number of definition fixups"); uint address = (uint)values.GetInteger("definition fixup table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("definition fixup element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => new ResourceDefinitionFixup { Offset = (int)e.GetInteger("offset"), Type = (int)e.GetInteger("type index") })); }
private IEnumerable <ThirdGenZoneSet> ReadZoneSetTable(StructureValueCollection tagValues, string countName, string addressName, IReader reader) { if (!tagValues.HasInteger(countName) || !tagValues.HasInteger(addressName)) { return(Enumerable.Empty <ThirdGenZoneSet>()); } var count = (int)tagValues.GetInteger(countName); uint address = (uint)tagValues.GetInteger(addressName); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("zone set definition"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(entries.Select(e => new ThirdGenZoneSet(e, reader, _metaArea, _expander))); }
private void LoadResourceTypes(StructureValueCollection values, IReader reader, StringIDSource stringIDs) { if (!values.HasInteger("number of resource types") || !values.HasInteger("resource type table address")) { return; } var count = (int)values.GetInteger("number of resource types"); uint address = (uint)values.GetInteger("resource type table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("resource type element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); _resourceTypes = entries.Select(e => new ThirdGenResourceType(e, stringIDs)).ToArray(); }
private Dictionary <int, ITag> LoadGlobalTags(IReader reader, StructureValueCollection headerValues, List <ITag> tags) { var count = (int)headerValues.GetInteger("number of global tags"); long address = (long)headerValues.GetInteger("global tag table address"); StructureLayout layout = _buildInfo.Layouts.GetLayout("global tag element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, address, layout, _metaArea); Dictionary <int, ITag> output = new Dictionary <int, ITag>(); foreach (StructureValueCollection ent in entries) { output[(int)ent.GetInteger("tag group magic")] = tags[(int)ent.GetInteger("datum index") & 0xFFFF]; } return(output); }
private ScriptObject[] ReadPointSets(IReader reader, StructureValueCollection values) { // Point sets are nested in another block for whatever reason // Seems like the length of the outer is always 1, so just take the first element and process it var count = (int)values.GetInteger("point set data count"); if (count == 0) { return(new ScriptObject[0]); } uint address = (uint)values.GetInteger("point set data address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("point set data element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); return(ReadObjects(reader, entries.First(), _pointSets)); }
private void FreeZoneSetsInTable(StructureValueCollection tagValues, string countName, string addressName, IReader reader) { if (!tagValues.HasInteger(countName) || !tagValues.HasInteger(addressName)) { return; } var count = (int)tagValues.GetInteger(countName); uint address = (uint)tagValues.GetInteger(addressName); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("zone set definition"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); foreach (StructureValueCollection entry in entries) { ThirdGenZoneSet.Free(entry, _allocator, _expander); } }
private void FreeResources(StructureValueCollection values, IReader reader) { var count = (int)values.GetInteger("number of resources"); uint address = (uint)values.GetInteger("resource table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("resource table element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); foreach (StructureValueCollection entry in entries) { FreeResource(entry); } int size = count * layout.Size; if (expand >= 0 && size > 0) { _allocator.Free(expand, size); } }
private ScriptExpressionTable LoadExpressions(IReader reader, StructureValueCollection values, StringTableReader stringReader) { var count = (int)values.GetInteger("number of script expressions"); uint address = (uint)values.GetInteger("script expression table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("script expression element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, count, expand, layout, _metaArea); var result = new ScriptExpressionTable(); result.AddExpressions(entries.Select((e, i) => new ScriptExpression(e, (ushort)i, stringReader))); foreach (ScriptExpression expr in result.Where(expr => expr != null)) { expr.ResolveReferences(result); } return(result); }
/// <summary> /// Frees the old Script Parameters and writes new ones to the stream. /// </summary> /// <param name="data">The new script data</param> /// <param name="stream">The stream to write to</param> /// <param name="scnr">scnr Meta Data</param> /// <returns>A dictionary containing the hashes of parameter groups an their new addresses.</returns> private Dictionary <int, uint> WriteParams(ScriptData data, IStream stream, StructureValueCollection scnr) { StructureLayout scrlayout = _buildInfo.Layouts.GetLayout("script element"); StructureLayout paramlayout = _buildInfo.Layouts.GetLayout("script parameter element"); int oldScriptCount = (int)scnr.GetInteger("number of scripts"); uint oldScriptAddress = (uint)scnr.GetInteger("script table address"); long expOldScriptAddress = _expander.Expand(oldScriptAddress); int oldParamSize = 0; StructureValueCollection[] oldScripts = TagBlockReader.ReadTagBlock(stream, oldScriptCount, expOldScriptAddress, scrlayout, _metaArea); HashSet <uint> freedParamAddresses = new HashSet <uint>(); int oldTotalParamCount = 0; // loop through old scripts for (int i = 0; i < oldScripts.Length; i++) { int paramCount = (int)oldScripts[i].GetInteger("number of parameters"); uint addr = (uint)oldScripts[i].GetInteger("address of parameter list"); oldTotalParamCount += paramCount; // free params if (addr != 0 && !freedParamAddresses.Contains(addr)) { long exp = _expander.Expand(addr); int blockSize = paramCount * paramlayout.Size; _allocator.Free(exp, blockSize); oldParamSize += blockSize; freedParamAddresses.Add(addr); } } int newTotalParamCount = 0; int newParamSize = 0; Dictionary <int, uint> newParamAddresses = new Dictionary <int, uint>(); // loop through new scripts foreach (var scr in data.Scripts) { int count = scr.Parameters.Count; if (count > 0) { int paramHash = SequenceHash.GetSequenceHashCode(scr.Parameters); if (!newParamAddresses.ContainsKey(paramHash)) { long newAddr = _allocator.Allocate(paramlayout.Size * count, stream); uint conNewAddr = _expander.Contract(newAddr); stream.SeekTo(_metaArea.PointerToOffset(newAddr)); // write params to stream foreach (var par in scr.Parameters) { par.Write(stream); } newParamAddresses.Add(paramHash, conNewAddr); newParamSize += scr.Parameters.Count * 36; } } newTotalParamCount += scr.Parameters.Count; } return(newParamAddresses); }
private Resource LoadResource(StructureValueCollection values, int index, TagTable tags, IList <ResourcePointer> pointers, byte[] infoBuffer, IReader reader) { var result = new Resource(); var parentTag = new DatumIndex(values.GetInteger("parent tag datum index")); result.ParentTag = parentTag.IsValid ? tags[parentTag] : null; var salt = (ushort)values.GetInteger("datum index salt"); result.Index = new DatumIndex(salt, (ushort)index); var typeIndex = (int)values.GetInteger("resource type index"); if (typeIndex >= 0 && typeIndex < _resourceTypes.Length) { result.Type = _resourceTypes[typeIndex].Name; } result.Flags = (uint)values.GetInteger("flags"); var infoSize = (int)values.GetInteger("resource info size"); if (infoSize > 0) { var infoOffset = 0; if (values.HasInteger("number of resource info offsets")) //for h4 { var infocount = (int)values.GetInteger("number of resource info offsets"); uint address = (uint)values.GetInteger("resource info offsets table address"); long expand = _expander.Expand(address); StructureLayout layout = _buildInfo.Layouts.GetLayout("resource info offset element"); StructureValueCollection[] entries = TagBlockReader.ReadTagBlock(reader, infocount, expand, layout, _metaArea); if (infocount > 0) { infoOffset = (int)entries[0].GetInteger("offset"); } } else { infoOffset = (int)values.GetInteger("resource info offset"); } // Copy the section of the info buffer that the resource is pointing to result.Info = new byte[infoSize]; Buffer.BlockCopy(infoBuffer, infoOffset, result.Info, 0, infoSize); } result.ResourceBits = (ushort)values.GetInteger("resource bits"); var segmentIndex = (int)values.GetInteger("segment index"); result.Location = (segmentIndex >= 0) ? pointers[segmentIndex] : null; result.BaseDefinitionAddress = (int)values.GetInteger("base definition address"); result.ResourceFixups.AddRange(LoadResourceFixups(values, reader)); result.DefinitionFixups.AddRange(LoadDefinitionFixups(values, reader)); return(result); }