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