示例#1
0
        public DIDXSection ReadDIDXSection(Stream input)
        {
            DIDXSection    retVar      = new DIDXSection();
            List <WEMFile> WEMFileList = new List <WEMFile>();

            uint SectionSize = input.ReadValueU32();

            retVar.SectionSize = SectionSize;
            long EndOfDIDXSection = input.Position + SectionSize;

            Console.WriteLine("section='{0}' {1}", "DIDX", SectionSize);

            long zeroPos = 0L;

            if (_ZeroWrite)
            {
                _Zero.Clear();
            }

            while (input.Position != EndOfDIDXSection)
            {
                uint id     = input.ReadValueU32();
                long offset = input.ReadValueS32();
                uint size   = input.ReadValueU32();

                retVar.ObjCount++;

                WEMFile tempWEM = new WEMFile();

                tempWEM.Num    = retVar.ObjCount;
                tempWEM.Id     = id;
                tempWEM.Offset = offset;
                tempWEM.Length = size;

                WEMFileList.Add(tempWEM);

                if (_ZeroWrite)
                {
                    if (zeroPos != offset)
                    {
                        int  num  = (int)retVar.ObjCount - 2;
                        long zero = offset - zeroPos;

                        _Zero.Add(num, zero);
                        //Console.WriteLine("> " + zero);
                    }
                    zeroPos = offset + size;
                }

                // Console.WriteLine("[" + tempWEM.Num + "]" + " Position:" + offset + " Size:" + size + " ID:" + tempWEM.Id);
            }
            retVar.DIDXFiles = WEMFileList;

            return(retVar);
        }
示例#2
0
        private void ConvertAll(DIDXSection didxSection)
        {
            if (InvokeRequired == true)
            {
                Invoke((MethodInvoker) delegate
                {
                    UseWaitCursor = true;
                });
            }

            string dirExt  = Program.ExtractPath(Program.FilePath);
            string dirType = Path.Combine(dirExt, "MemFile");
            string dirBnk  = _Description;

            if (dirBnk.StartsWith("/") == true)
            {
                dirBnk = dirBnk.Substring(1);
            }
            dirBnk = dirBnk.Replace("/", "\\");
            dirBnk = Path.Combine(dirType, Path.GetDirectoryName(dirBnk), Path.GetFileNameWithoutExtension(dirBnk));

            if (!Directory.Exists(dirBnk))
            {
                Directory.CreateDirectory(dirBnk);
            }

            StringBuilder sb = new StringBuilder();

            foreach (WEMFile wem in didxSection.DIDXFiles)
            {
                string wemName = wem.Name;
                string sndFile = ConvertWemToWav(wem, true, 10);
                if (sndFile != null)
                {
                    string soundRename = Path.Combine(dirBnk, Path.ChangeExtension(wem.Name, Path.GetExtension(sndFile)));
                    try
                    {
                        if (File.Exists(soundRename))
                        {
                            File.Delete(soundRename);
                            System.Threading.Thread.Sleep(10);
                        }

                        File.Move(sndFile, Path.Combine(dirBnk, soundRename));
                    }
                    catch { }
                }

                sb.AppendFormat("{0} to {1} {2}\r\n", wemName, Path.GetExtension(sndFile), sndFile != null ? "ok" : "error");
            }

            if (InvokeRequired == true)
            {
                Invoke((MethodInvoker) delegate
                {
                    UseWaitCursor = false;
                });
            }

            FlexibleMessageBox.Show("Output: " + dirBnk + "\r\n\n" + sb.ToString() + "\r\nCompleted.", "Conversion", MessageBoxButtons.OK);
        }
示例#3
0
        public void LoadResourceEntry(ResourceEntry resourceEntry, string description, Endian endian)
        {
            var resource = new ResourceFormats.MemFileResource();

            using (var data = new MemoryStream(resourceEntry.Data, false))
            {
                resource.Deserialize(resourceEntry.Version, data, endian);
            }

            _ResourceEntry = resourceEntry;
            _Endian        = endian;
            _Description   = description;
            _Resource      = resource;

            //
            textLog.Clear();
            _LastPlaySound = 0;
            _LastWemPath   = "";

            _HeaderGeneral = null;
            _DIDXSection   = null;
            if (_DIDXData != null)
            {
                _DIDXData.Close();
                _DIDXData = null;
            }
            _Section.Clear();

            var input = new MemoryStream(resource.Data, false);

            if (input.ReadValueU32() != 0x44484b42)
            {
                Console.WriteLine("Invalid .bnk file");
                return;
            }

            uint headerSize = input.ReadValueU32();

            _HeaderGeneral = input.ReadBytes(headerSize);

#if DEBUG
            string hex = BitConverter.ToString(_HeaderGeneral).Replace("-", "");
            Console.WriteLine("header=" + hex);
#endif

            while (input.Position != input.Length)
            {
                uint section = input.ReadValueU32();
                if (section == 0x58444944) // DIDX
                {
                    _DIDXSection = ReadDIDXSection(input);
                }
                else if (section == 0x41544144) // DATA
                {
                    uint SectionSize = input.ReadValueU32();;
                    _DIDXData = new FileStream(_PathCache, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                    _DIDXData.WriteFromStream(input, SectionSize);
                    _DIDXData.Seek(0L, SeekOrigin.Begin);
                    Console.WriteLine("section='{0}' {1}", "DATA", SectionSize);
                }
                else if (section == 0x43524948) // HIRC
                {
#if _DEBUG
                    var posBegin = input.Position;
#endif

                    uint SectionSize = input.ReadValueU32();
                    _Section.Add(section, input.ReadBytes(SectionSize));
                    Console.WriteLine("section='{0}' {1}", "HIRC", SectionSize);
#if _DEBUG
                    var posEnd = input.Position;
                    input.Seek(posBegin, SeekOrigin.Begin);
                    var pHIRCSection = ReadHIRCSection(input);
                    input.Seek(posEnd, SeekOrigin.Begin);
#endif
                }
                else
                {
                    uint   SectionSize = input.ReadValueU32();
                    byte[] buffer      = input.ReadBytes(SectionSize);
                    _Section.Add(section, buffer);
                    string name = Encoding.ASCII.GetString(BitConverter.GetBytes(section));
                    Console.WriteLine("section='{0}' {1}", name, SectionSize);
                }
            }

            BuildEntryTree();

            input.Close();
        }