protected virtual byte[] GetSoundResource(F4SoundResourceHeader resourceHeader) { if (resourceHeader == null) { return(null); } var curByte = (int)resourceHeader.Offset; curByte += 4; var dataSize = BitConverter.ToUInt32(_resourceIndex.ResourceData.Data, curByte); curByte += 4; var toReturn = new byte[dataSize + 8]; Array.Copy(_resourceIndex.ResourceData.Data, curByte - 8, toReturn, 0, dataSize + 8); return(toReturn); }
public virtual void Load(string resourceBundleIndexPath) { var resourceIndexFileInfo = new FileInfo(resourceBundleIndexPath); if (resourceIndexFileInfo.Exists) { var bytes = new byte[resourceIndexFileInfo.Length]; using (var fs = new FileStream(resourceBundleIndexPath, FileMode.Open, FileAccess.Read)) { fs.Seek(0, SeekOrigin.Begin); fs.Read(bytes, 0, (int)resourceIndexFileInfo.Length); } _resourceIndex = new F4ResourceBundleIndex(); var curByte = 0; _resourceIndex.Size = BitConverter.ToUInt32(bytes, curByte); curByte += 4; _resourceIndex.ResourceIndexVersion = BitConverter.ToUInt32(bytes, curByte); curByte += 4; var size = _resourceIndex.Size; var headers = new List <F4ResourceHeader>(); while (size > 0) { _resourceIndex.NumResources++; var resourceType = BitConverter.ToUInt32(bytes, curByte); curByte += 4; var resourceId = new byte[32]; for (var j = 0; j < 32; j++) { resourceId[j] = bytes[curByte]; curByte++; } var resourceName = Encoding.ASCII.GetString(resourceId); var nullLoc = resourceName.IndexOf('\0'); resourceName = nullLoc > 0 ? resourceName.Substring(0, nullLoc) : null; if (resourceType == (uint)(ResourceType.ImageResource)) { var thisResourceHeader = new F4ImageResourceHeader { Type = resourceType, ID = resourceName, Flags = BitConverter.ToUInt32(bytes, curByte) }; curByte += 4; thisResourceHeader.CenterX = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.CenterY = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.Width = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.Height = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.ImageOffset = BitConverter.ToUInt32(bytes, curByte); curByte += 4; thisResourceHeader.PaletteSize = BitConverter.ToUInt32(bytes, curByte); curByte += 4; thisResourceHeader.PaletteOffset = BitConverter.ToUInt32(bytes, curByte); curByte += 4; headers.Add(thisResourceHeader); size -= 60; } else if (resourceType == (uint)(ResourceType.SoundResource)) { var thisResourceHeader = new F4SoundResourceHeader { Type = resourceType, ID = resourceName, Flags = BitConverter.ToUInt32(bytes, curByte) }; curByte += 4; thisResourceHeader.Channels = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.SoundType = BitConverter.ToUInt16(bytes, curByte); curByte += 2; thisResourceHeader.Offset = BitConverter.ToUInt32(bytes, curByte); curByte += 4; thisResourceHeader.HeaderSize = BitConverter.ToUInt32(bytes, curByte); curByte += 4; headers.Add(thisResourceHeader); size -= 52; } else if (resourceType == (uint)(ResourceType.FlatResource)) { var thisResourceHeader = new F4FlatResourceHeader { Type = resourceType, ID = resourceName, Offset = BitConverter.ToUInt32(bytes, curByte) }; curByte += 4; thisResourceHeader.Size = BitConverter.ToUInt32(bytes, curByte); curByte += 4; headers.Add(thisResourceHeader); size -= 44; } } _resourceIndex.ResourceHeaders = headers.ToArray(); var resourceDataFileInfo = new FileInfo( Path.GetDirectoryName(resourceIndexFileInfo.FullName) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(resourceIndexFileInfo.FullName) + RESOURCE_FILE_EXTENSION); if (resourceDataFileInfo.Exists) { bytes = new byte[resourceDataFileInfo.Length]; using (var fs = new FileStream(resourceDataFileInfo.FullName, FileMode.Open, FileAccess.Read)) { fs.Seek(0, SeekOrigin.Begin); fs.Read(bytes, 0, (int)resourceDataFileInfo.Length); } var rawDataPackage = new F4ResourceRawDataPackage(); curByte = 0; rawDataPackage.Size = BitConverter.ToUInt32(bytes, curByte); curByte += 4; rawDataPackage.Version = BitConverter.ToUInt32(bytes, curByte); curByte += 4; rawDataPackage.Data = new byte[rawDataPackage.Size]; var numBytesToCopy = Math.Min(rawDataPackage.Data.Length, bytes.Length - curByte); Array.Copy(bytes, curByte, rawDataPackage.Data, 0, numBytesToCopy); curByte += numBytesToCopy; _resourceIndex.ResourceData = rawDataPackage; } else { throw new FileNotFoundException(resourceDataFileInfo.FullName); } } else { throw new FileNotFoundException(resourceBundleIndexPath); } }