Exemple #1
0
        public override void OnRebuild(VoidPtr address, int size, bool force)
        {
            ARCHeader *header = (ARCHeader *)address;

            *header = new ARCHeader((ushort)Children.Count, Name);

            ARCFileHeader *entry = header->First;

            foreach (ResourceNode child in Children)
            {
                if (child is ARCEntryNode node)
                {
                    *entry = new ARCFileHeader(node.FileType, node.FileIndex, node._calcSize, node.GroupID, node._redirectIndex);
                }
                else if (_originalHeaders.TryGetValue(child, out ARCFileHeader origHeader))
                {
                    *entry = new ARCFileHeader(origHeader.FileType, origHeader.Index, child._calcSize, origHeader.GroupIndex, origHeader.ID);
                }
                else
                {
                    throw new NotSupportedException("Cannot build a new ARCFileHeader for this node (not supported)");
                }
                child.Rebuild(entry->Data, entry->Length, force);
                entry = entry->Next;
            }
        }
Exemple #2
0
        public override void OnRebuild(VoidPtr address, int size, bool force)
        {
            ARCHeader *header = (ARCHeader *)address;

            *header = new ARCHeader((ushort)Children.Count, Name);

            ARCFileHeader *entry = header->First;

            foreach (ARCEntryNode node in Children)
            {
                *entry = new ARCFileHeader(node.FileType, node.FileIndex, node._calcSize, node.GroupID, node._redirectIndex);
                node.Rebuild(entry->Data, entry->Length, force);
                entry = entry->Next;
            }
        }
Exemple #3
0
        private void button_HeaderDump_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = "LoGH Containers|*.mvx;*.arc";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                ARCHeader     tmpHeader = new ARCHeader();
                List <ARCToc> tmpToc    = new List <ARCToc>();

                using (BinaryReader reader = new BinaryReader(new FileStream(openFileDialog.FileName, FileMode.Open)))
                {
                    //Parse Header
                    reader.BaseStream.Seek(0, SeekOrigin.Begin);
                    tmpHeader.HeaderIdentifier = reader.ReadBytes(4);
                }
            }
        }
Exemple #4
0
        internal protected override void OnRebuild(VoidPtr address, int size, bool force)
        {
            ARCHeader *header = (ARCHeader *)address;

            *header = new ARCHeader((ushort)Children.Count, Name);

            ARCFileHeader *entry = header->First;

            foreach (ARCEntryNode node in Children)
            {
                *entry = new ARCFileHeader(node.FileType, node.FileIndex, node._calcSize, node.FileGroup, node.Unknown, node.FileId);
                if (node.IsCompressed)
                {
                    node.MoveRaw(entry->Data, entry->Length);
                }
                else
                {
                    node.Rebuild(entry->Data, entry->Length, force);
                }
                entry = entry->Next;
            }
        }
Exemple #5
0
        private void button_Decompress_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = "LoGH Containers|*.mvx;*.arc";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string      outputFolderPath = openFileDialog.FileName + "_";
                GenericInfo tmpGeneric       = new GenericInfo
                {
                    ContainerName = openFileDialog.FileName,
                    ContainerType = Path.GetExtension(openFileDialog.FileName)
                };

                ARCHeader     tmpHeader = new ARCHeader();
                List <ARCToc> tmpToc    = new List <ARCToc>();

                using (BinaryReader reader = new BinaryReader(new FileStream(openFileDialog.FileName, FileMode.Open)))
                {
                    //Parse Header
                    reader.BaseStream.Seek(0, SeekOrigin.Begin);
                    tmpHeader.HeaderIdentifier     = reader.ReadBytes(4);
                    tmpHeader.FileReaderBufferSize = reader.ReadByte();
                    tmpHeader.UnknownType          = reader.ReadByte();

                    reader.BaseStream.Seek(3, SeekOrigin.Current); //0x00 three times

                    tmpHeader.UnknownValue1   = reader.ReadByte();
                    tmpHeader.TocPointer2     = reader.ReadByte();
                    tmpHeader.UnknownValue2   = reader.ReadByte();
                    tmpHeader.UnknownType2    = reader.ReadByte();
                    tmpHeader.FileCount       = reader.ReadByte();
                    tmpHeader.UnknownValue3   = reader.ReadByte();
                    tmpHeader.CompressionType = reader.ReadByte();

                    tmpHeader.HeaderLeftover = reader.ReadBytes(112);

                    //Begin of TOC
                    reader.BaseStream.Seek(2, SeekOrigin.Current); //skip two 0x00
                    for (int i = 1; i <= tmpHeader.FileCount; i++)
                    {
                        long   entryOffset = reader.BaseStream.Position;
                        ARCToc localToc    = new ARCToc();

                        for (int j = 1; j <= 5; j++)
                        {
                            var VAL1 = reader.ReadByte();
                            reader.BaseStream.Seek(6, SeekOrigin.Current);
                            var VAL2 = reader.ReadByte();
                            reader.BaseStream.Seek(6, SeekOrigin.Current);
                            var VAL3 = reader.ReadByte();
                            reader.BaseStream.Seek(6, SeekOrigin.Current);
                            var VAL4 = reader.ReadByte();
                            reader.BaseStream.Seek(6, SeekOrigin.Current);

                            var tmpVal = (VAL1 | (VAL2 << 8) | (VAL3 << 16) | (VAL4 << 24));

                            switch (j)
                            {
                            case 1:
                                localToc.NameOffset = tmpVal;
                                break;

                            case 2:
                                localToc.NameLength = tmpVal;
                                break;

                            case 3:
                                localToc.Offset = tmpVal;
                                break;

                            case 4:
                                localToc.Zsize = tmpVal;
                                break;

                            case 5:
                                localToc.Size = tmpVal;
                                break;

                            default:
                                throw new Exception("NOPE!");
                            }

                            entryOffset += 1;
                            reader.BaseStream.Seek(entryOffset, SeekOrigin.Begin);
                        }

                        //Readout name string
                        long preOffset = reader.BaseStream.Position;
                        reader.BaseStream.Seek(localToc.NameOffset, SeekOrigin.Begin);
                        localToc.NameBytes = reader.ReadBytes(localToc.NameLength);
                        localToc.Name      = new ASCIIEncoding().GetString(localToc.NameBytes, 0, localToc.NameLength - 1); //-1 because we dont want the null terminator

                        //Read DATA (offset since file begin)
                        reader.BaseStream.Seek(localToc.Offset, SeekOrigin.Begin);
                        localToc.Data      = reader.ReadBytes(localToc.Zsize);
                        localToc.OffsetEnd = (int)reader.BaseStream.Position;

                        //Reset Seek for next header file
                        reader.BaseStream.Seek(preOffset, SeekOrigin.Begin);

                        //Add toc to list
                        tmpToc.Add(localToc);

                        //Everything is ready to readout compressed data
                        if (localToc.Zsize == localToc.Size)
                        {
                            //Content is unencrypted... passtrough directly to filewriter
                            localToc.DataDecompressed = localToc.Data;
                        }
                        else
                        {
                            //decompress with lzss
                            localToc.DataDecompressed = LZSS.Decompress(localToc.Data);
                        }

                        reader.BaseStream.Seek(27, SeekOrigin.Current);
                    }
                }

                //PHASE 2: Export data from memory to Filesystem
                DirectoryInfo di = Directory.CreateDirectory(outputFolderPath);
                foreach (var toc in tmpToc)
                {
                    //Check name for sub-folders - when there are some - create
                    Directory.CreateDirectory(Path.GetDirectoryName(outputFolderPath + "//" + toc.Name));

                    //Decompressed file
                    using (FileStream fs = File.Create(outputFolderPath + "//" + toc.Name))
                    {
                        fs.Write(toc.DataDecompressed, 0, toc.DataDecompressed.Length);
                    }

                    //Compressed file
                    using (FileStream fs = File.Create(outputFolderPath + "//" + toc.Name + "_COMP"))
                    {
                        fs.Write(toc.Data, 0, toc.Data.Length);
                    }
                }

                SerializeCollection tmpSer = new SerializeCollection
                {
                    generic   = tmpGeneric,
                    arcHeader = tmpHeader,
                    arcToc    = tmpToc
                };

                //Serialize header & toc
                IFormatter formatter = new BinaryFormatter();
                Stream     stream    = new FileStream(outputFolderPath + "//_header.bin", FileMode.Create, FileAccess.Write, FileShare.None);
                //GZipStream gzip = new GZipStream(stream, CompressionLevel.Fastest);
                formatter.Serialize(stream, tmpSer);
                stream.Close();
            }
        }