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); }
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)); }
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); }
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); }