Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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>();
        }
Exemplo n.º 5
0
        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());
        }
Exemplo n.º 6
0
        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());
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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();
        }
Exemplo n.º 10
0
        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();
        }
Exemplo n.º 11
0
        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());
        }
Exemplo n.º 13
0
        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();
        }
Exemplo n.º 14
0
        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());
        }
Exemplo n.º 17
0
        /// <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());
        }
Exemplo n.º 18
0
        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")
            }));
        }
Exemplo n.º 21
0
        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")
            }));
        }
Exemplo n.º 22
0
        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)));
        }
Exemplo n.º 23
0
        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();
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
        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));
        }
Exemplo n.º 26
0
        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);
            }
        }
Exemplo n.º 27
0
        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);
            }
        }
Exemplo n.º 28
0
        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);
        }
Exemplo n.º 29
0
        /// <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);
        }
Exemplo n.º 30
0
        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);
        }