Ejemplo n.º 1
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));
        }
Ejemplo n.º 2
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);
        }