public override void OnRebuild(VoidPtr address, int length, bool force) { // Update base address for children. VoidPtr BaseAddress = (VoidPtr)address + sizeof(SndBgmTitleHeader); // Calculate data length int dataLength = sizeof(SndBgmTitleEntry) * Children.Count; VoidPtr stringAddress = BaseAddress + dataLength + 8; VoidPtr endAddress = stringAddress + EndString.Length; int fileSize = endAddress - address; if (fileSize != length) { throw new Exception("Wrong amount of memory allocated for rebuild of sndBgmTitleData"); } // Create header struct at address SndBgmTitleHeader *header = (SndBgmTitleHeader *)address; header->_Length = fileSize; header->_DataLength = dataLength; header->_OffCount = 0; header->_DataTable = 1; header->_pad0 = header->_pad1 = header->_pad2 = header->_pad3 = 0; // Rebuild children using new address for (int i = 0; i < Children.Count; i++) { Children[i].Rebuild(BaseAddress + (i * sizeof(SndBgmTitleEntry)), sizeof(SndBgmTitleEntry), true); } // Finally, write the string Marshal.Copy(EndString, 0, stringAddress, EndString.Length); }
internal static ResourceNode TryParse(DataSource source) { SndBgmTitleHeader *header = (SndBgmTitleHeader *)source.Address; return(header->_Length == source.Length && header->_DataLength < source.Length && header->Str == "sndBgmTitleData" ? new SndBgmTitleDataNode() : null); }