Esempio n. 1
0
        internal static ResourceNode TryParse(DataSource source)
        {
            ItmFreqHeader *header = (ItmFreqHeader *)source.Address;

            return(header->_Length == source.Length &&
                   header->_DataLength < source.Length &&
                   header->Str == "genParamSet" ? new ItmFreqNode() : null);
        }
Esempio n. 2
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            // Update base address for children.
            BaseAddress  = (VoidPtr)address + 0x20;
            _pointerList = new List <bint>();

            // Initiate header struct
            ItmFreqHeader *Header = (ItmFreqHeader *)address;

            *Header = new ItmFreqHeader();
            Header->_Length     = _fileSize;
            Header->_DataTable  = _DTableCount;
            Header->_OffCount   = _offCount;
            Header->_DataLength = _dataLength;
            Header->_pad0       = Header->_pad1 =
                Header->_pad2   = Header->_pad3 = 0;

            // Initiate the table list and update pointer to pointer list
            ItmFreqTableList *TList = (ItmFreqTableList *)(address + Header->_DataLength - 0x08);

            *TList = new ItmFreqTableList();
            TList->_table1 = _t1;
            TList->_table2 = _t2;
            TList->_table3 = _t3;
            TList->_table4 = _t4;
            TList->_table5 = _t5;

            _pPointerList = (VoidPtr)TList + 0x28;

            // Rebuild children using new TableList location
            for (int i = 0; i < Children.Count; i++)
            {
                Children[i].Rebuild(TList + (i * 8), 0x08, true);
            }

            // Add Data header offsets to pointer list
            foreach (ItmFreqOffPair p in _DataTable)
            {
                _pointerList.Add(p._offset1);
            }

            // Write pointers to the rebuilt address
            for (int i = 0; i < _pointerList.Count; i++)
            {
                *(bint *)((VoidPtr)_pPointerList + (i * 4)) = _pointerList[i];
            }

            // Update the pointer to the data table and write data table to it
            _pDataTable = (VoidPtr)_pPointerList + (_pointerList.Count * 4);
            for (int i = 0; i < _DataTable.Count; i++)
            {
                *(ItmFreqOffPair *)((VoidPtr)_pDataTable + (i * 8)) = _DataTable[i];
            }

            // Finally, write the string table for the Data and external data tables
            _strings.WriteTable(_pDataTable + (_DataTable.Count * 8));
        }
Esempio n. 3
0
        public override bool OnInitialize()
        {
            base.OnInitialize();

            ItmFreqHeader *Header = (ItmFreqHeader *)WorkingUncompressed.Address;

            _dataLength  = Header->_DataLength;
            _fileSize    = Header->_Length;
            _DTableCount = Header->_DataTable;
            _offCount    = Header->_OffCount;

            BaseAddress   = (VoidPtr)Header + 0x20;
            _pPointerList = BaseAddress + _dataLength;
            _strings.Add("genParamSet");

            _t1 = TableList->_table1;
            _t2 = TableList->_table2;
            _t3 = TableList->_table3;
            _t4 = TableList->_table4;
            _t5 = TableList->_table5;

            for (int i = 0; i < 5; i++)
            {
                if (TableList->Entries[i]._count > 0)
                {
                    _numTables++;
                }
            }

            // Add the offsets to the pointers list, then the offset to the table list.
            for (int i = 0; i < _offCount; i++)
            {
                _pointerList.Add(*(bint *)(_pPointerList + i * 4));
            }

            // Get the location for the Data Table, then add each entry to the list.
            _pDataTable = _pPointerList + _offCount * 4;
            for (int i = 0; i < Header->_DataTable; i++)
            {
                _DataTable.Add(new ItmFreqOffPair(*(bint *)(_pDataTable + i * 8), *(bint *)(_pDataTable + i * 8 + 4)));
            }

            if (_name == null)
            {
                _name = "Item Generation";
            }

            return(_numTables > 0);
        }
Esempio n. 4
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            ItmFreqHeader *header = (ItmFreqHeader *)address;

            *header = new ItmFreqHeader();
            header->_Length = length;
            int offCount = 0; // save for later;

            //header->_OffCount;
            header->_DataTable = 1;
            header->_pad0      = 0;
            header->_pad1      = 0;
            header->_pad2      = 0;
            header->_pad3      = 0;

            List <uint> groupOffsets = new List <uint>();
            List <uint> tableOffsets = new List <uint>();

            uint offset = ItmFreqHeader.Size;

            // First, rebuild the items themselves, updating the group offset to the proper value (also reset both sets of offsets)
            foreach (ItmTableNode table in Children)
            {
                table._offset   = 0;
                table._dataSize = 0;
                if (table.HasChildren)
                {
                    offCount++;
                    foreach (ItmTableGroupNode group in table.Children)
                    {
                        group._offset = 0;
                        if (group.HasChildren)
                        {
                            offCount++;
                            group._offset = offset - ItmFreqHeader.Size;
                            foreach (ResourceNode item in group.Children)
                            {
                                int size = item.OnCalculateSize(true);
                                item.OnRebuild(address + offset, size, true);
                                offset          += (uint)size;
                                table._dataSize += (uint)size;
                            }
                        }
                    }
                    // Rebuild the table's groups
                    table._offset = offset - ItmFreqHeader.Size;
                    foreach (ResourceNode group in table.Children)
                    {
                        int size = group.OnCalculateSize(true);
                        group.OnRebuild(address + offset, size, true);
                        if (group.HasChildren)
                        {
                            groupOffsets.Add(offset - 0x14);
                        }
                        offset          += (uint)size;
                        table._dataSize += (uint)size;
                    }
                }

                // Add padding to match vBrawl
                if (table.HasChildren && (table.NextSibling()?.HasChildren ?? true))
                {
                    buint *ptr = (buint *)(address + offset);
                    ptr[0]  = 0;
                    offset += 4;
                }
            }

            header->_OffCount   = offCount;
            header->_DataLength = length - (ItmFreqHeader.Size + (offCount + 2) * 0x04 + "genParamSet".UTF8Length() + 1);

            // Finally, rebuild tables
            foreach (ResourceNode table in Children)
            {
                int size = table.OnCalculateSize(true);
                table.OnRebuild(address + offset, size, true);
                if (table.HasChildren)
                {
                    tableOffsets.Add(offset - 0x14 - 0x0C);
                }
                offset += (uint)size;
            }

            foreach (uint i in groupOffsets)
            {
                buint *ptr = (buint *)(address + offset);
                ptr[0]  = i;
                offset += 4;
            }

            foreach (uint i in tableOffsets)
            {
                buint *ptr = (buint *)(address + offset);
                ptr[0]  = i;
                offset += 4;
            }

            if (tableOffsets.Count > 0)
            {
                buint *ptr = (buint *)(address + offset);
                ptr[0]  = tableOffsets[0];
                offset += 4;
            }

            buint *clear = (buint *)(address + offset);

            clear[0] = 0;
            offset  += 4;

            (address + offset).WriteUTF8String("genParamSet", true);
        }