Пример #1
0
        private void AddAnyTiledImages(VirtualFolder parentFolder)
        {
            string tileLayoutPattern = @"_\d\d_\d\d\.\w\w\w";
            var    matches           = parentFolder.Files.Where(x => Regex.IsMatch(x.Name, tileLayoutPattern)).ToList();

            if (matches.Count < 1)
            {
                return;
            }

            List <IVirtualFileEntry> tiledImages = new List <IVirtualFileEntry>();
            VirtualFileTiledImage    tiledImage;

            foreach (var match in matches)
            {
                var startOfName = Regex.Split(match.Name, tileLayoutPattern)[0];

                if (tiledImages.Any(x => x.Name == startOfName))
                {
                    // add to existing
                    var existing = tiledImages.FirstOrDefault(x => x.Name == startOfName);
                    tiledImage = existing.FileData as VirtualFileTiledImage;
                }
                else
                {
                    // create a new one
                    tiledImage      = new VirtualFileTiledImage();
                    tiledImage.Type = FileType.Jpg;
                    var file = new VirtualFileEntry(startOfName, tiledImage);
                    tiledImages.Add(file);
                }
                tiledImage.Tiles.Add(match);
            }

            parentFolder.Files.InsertRange(0, tiledImages);
        }
Пример #2
0
        private IVirtualFolder CreateListingForArchive(string filePath, long fileEnd, byte[] headerData, bool containsSubFolders = true)
        {
            var entries = ExtractFileEntriesFromArchive(headerData, containsSubFolders);

            var           archiveFileName = Path.GetFileName(filePath);
            var           rootFolder      = new VirtualFolder(archiveFileName);
            VirtualFolder currentFolder   = null;

            int nodeCount      = 0;
            int imageCount     = 1;
            int spotImageCount = 1;
            int videoCount     = 1;

            foreach (var entry in entries)
            {
                string fileName = entry.Type.ToString();

                // TRANSFORM FILE TYPE
                var fileType = FileType.Unknown;
                if (entry.Type == Myst3ResourceType.CubeFace ||
                    entry.Type == Myst3ResourceType.Frame ||
                    entry.Type == Myst3ResourceType.LocalizedFrame ||
                    entry.Type == Myst3ResourceType.SpotItem ||
                    entry.Type == Myst3ResourceType.LocalizedSpotItem
                    )
                {
                    fileType = FileType.Jpg;
                }
                if (entry.Type == Myst3ResourceType.Movie ||
                    entry.Type == Myst3ResourceType.MultitrackMovie ||
                    entry.Type == Myst3ResourceType.DialogMovie ||
                    entry.Type == Myst3ResourceType.StillMovie)
                {
                    fileType = FileType.Bink;
                }
                if (entry.Type == Myst3ResourceType.RawData)
                {
                    // could be bitmap,
                    //could be archetype ascii text file
                    // could be xet file
                    fileType = FileType.Bmp;
                    // if it starts with BM, then it's a bmp
                    // if it starts with XET it's a xet
                    // if it starts with ASCII it's a text file
                }


                var fileContent = new VirtualFileDataInArchive(filePath, fileType, entry.Offset, entry.Offset + entry.Size);

                if (entry.Type == Myst3ResourceType.CubeFace)
                {
                    if (entry.CubeFace == M3CubeFace.Back) // Back is always first
                    {
                        nodeCount++;
                        spotImageCount = 1;
                    }
                    fileName += "_" + nodeCount.ToString().PadLeft(3, '0') + "_" + entry.CubeFace.ToString().ToLower();
                }
                if (fileType == FileType.Bink)
                {
                    fileName += "_" + videoCount.ToString().PadLeft(3, '0');
                    videoCount++;
                }
                if (fileType == FileType.Jpg && entry.Type != Myst3ResourceType.CubeFace)
                {
                    if (entry.Type == Myst3ResourceType.SpotItem || entry.Type == Myst3ResourceType.LocalizedSpotItem)
                    {
                        fileName = nodeCount.ToString().PadLeft(3, '0') + "_SpotItem_" + spotImageCount;
                        spotImageCount++;
                    }
                    else
                    {
                        fileName += "_" + imageCount.ToString().PadLeft(4, '0');
                        imageCount++;
                    }
                }

                // create the listing
                //var vFile = new VirtualFileEntry(entry.Offset + "_" + (entry.Offset + entry.Size) + "_" + entry.Type, fileContent);
                var vFile = new VirtualFileEntry(fileName, fileContent);
                if (containsSubFolders)
                {
                    if (!string.IsNullOrEmpty(entry.Folder))
                    {
                        if (rootFolder.SubFolders.Any(x => x.Name.ToUpper() == entry.Folder.ToUpper()))
                        {
                            currentFolder = rootFolder.SubFolders.FirstOrDefault(x => x.Name.ToUpper() == entry.Folder.ToUpper()) as VirtualFolder;
                        }
                        else
                        {
                            currentFolder = new VirtualFolder(entry.Folder.ToUpper());
                            rootFolder.SubFolders.Add(currentFolder);
                        }
                        currentFolder.Files.Add(vFile);
                    }
                    else
                    {
                        rootFolder.Files.Add(vFile);
                    }
                }
                else
                {
                    rootFolder.Files.Add(vFile);
                }
            }

            return(rootFolder);
        }
Пример #3
0
        private long ReadFileInfo(VirtualFolder parentFolder, FileStream fileStream, long fileStart, long startIndex)
        {
            long index = startIndex;

            var buffer = new byte[sizeof(uint)];

            fileStream.Seek(index, SeekOrigin.Begin);
            fileStream.Read(buffer, 0, buffer.Length);
            index += sizeof(uint);

            var fileNameSize = BitConverter.ToUInt32(buffer, 0);

            if (fileNameSize > 512)
            {
                throw new Exception("FileNameSize Too Big");
            }

            buffer = new byte[fileNameSize];
            fileStream.Seek(index, SeekOrigin.Begin);
            fileStream.Read(buffer, 0, buffer.Length);
            index += buffer.Length;

            var FileName = Encoding.ASCII.GetString(buffer);

            buffer = new byte[sizeof(uint)];
            fileStream.Seek(index, SeekOrigin.Begin);
            fileStream.Read(buffer, 0, buffer.Length);
            index += sizeof(uint);

            var FileSize = BitConverter.ToUInt32(buffer, 0);

            buffer = new byte[sizeof(uint)];
            fileStream.Seek(index, SeekOrigin.Begin);
            fileStream.Read(buffer, 0, buffer.Length);
            index += sizeof(uint);

            var FileOffset = BitConverter.ToUInt32(buffer, 0);

            var fileType          = FileType.Unknown;
            var fileNameLowercase = FileName.TrimEnd(new char[1] {
                '\0'
            }).ToLower();

            if (fileNameLowercase.EndsWith(".jpg"))
            {
                fileType = FileType.Jpg;
            }
            else if (fileNameLowercase.EndsWith(".zap"))
            {
                fileType = FileType.Zap;
            }
            else if (fileNameLowercase.EndsWith(".m4b"))
            {
                fileType = FileType.M4B;
            }
            else if (fileNameLowercase.EndsWith(".bik"))
            {
                fileType = FileType.Bink;
            }
            else if (fileNameLowercase.EndsWith(".bin"))
            {
                fileType = FileType.Binary;
            }
            else
            {
                fileType = FileType.Unknown;
            }

            if (fileType == FileType.M4B)
            {
                var folder = ReadM4BFileData(fileStream, fileNameLowercase, fileStart + FileOffset, FileOffset + FileSize);
                parentFolder.SubFolders.Add(folder);
            }
            else
            {
                var totalStartOffset = fileStart + FileOffset;
                var totalEndOffset   = fileStart + FileOffset + FileSize;
                var thisFile         = new VirtualFileEntry(fileNameLowercase, new VirtualFileDataInArchive(fileStream.Name, fileType, totalStartOffset, totalEndOffset));
                parentFolder.Files.Add(thisFile);
            }
            return(index);
        }