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