Пример #1
0
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int n = listBox1.SelectedIndex;

            if (n == -1)
            {
                return;
            }
            Bundle b = sb.bundles[n];

            listBox2.Items.Clear();
            sounds = new List <SoundWaveAssetEntry>();
            for (int i = 0; i < b.ebx.Count; i++)
            {
                Bundle.ebxtype ebx = b.ebx[i];
                try
                {
                    string      x   = Encoding.UTF8.GetString(Tools.ExtractEbx(new MemoryStream(Tools.GetDataBySHA1(ebx.SHA1, cat))));
                    XmlDocument xml = new XmlDocument();
                    xml.LoadXml("<xml>" + x + "</xml>");
                    XmlNodeList list = xml.GetElementsByTagName("SoundWaveAsset");
                    foreach (XmlNode node in list)
                    {
                        SoundWaveAssetEntry sound = new SoundWaveAssetEntry();
                        sound.chunks   = new List <SoundChunk>();
                        sound.segments = new List <SoundSegment>();
                        sound.Index    = i;
                        if (node.Name == "SoundWaveAsset")
                        {
                            foreach (XmlNode node2 in node.ChildNodes)
                            {
                                switch (node2.Name)
                                {
                                case "SoundDataAsset":
                                    foreach (XmlNode node3 in node2.ChildNodes)
                                    {
                                        switch (node3.Name)
                                        {
                                        case "Asset":
                                            foreach (XmlNode node4 in node3.ChildNodes)
                                            {
                                                switch (node4.Name)
                                                {
                                                case "Name":
                                                    sound.name = node4.InnerText;
                                                    break;
                                                }
                                            }
                                            break;

                                        case "Chunks":
                                            XmlNode members = node3.ChildNodes[0];
                                            if (members == null)
                                            {
                                                continue;
                                            }
                                            foreach (XmlNode node4 in members)
                                            {
                                                switch (node4.Name)
                                                {
                                                case "SoundDataChunk":
                                                    SoundChunk chunk = new SoundChunk();
                                                    XmlNode    nId   = node4.ChildNodes[0];
                                                    chunk.id = Tools.StringToByteArray(nId.InnerText);
                                                    foreach (CATFile.ChunkType c in cat.chunks)
                                                    {
                                                        if (Tools.ByteArrayCompare(c.id, chunk.id))
                                                        {
                                                            chunk.sha1 = c.sha1;
                                                        }
                                                    }
                                                    sound.chunks.Add(chunk);
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                    break;

                                case "Segments":
                                    foreach (XmlNode node3 in node2.ChildNodes)
                                    {
                                        switch (node3.Name)
                                        {
                                        case "member":
                                            XmlNode swvseg = node3.ChildNodes[0];
                                            if (swvseg != null && swvseg.Name == "SoundWaveVariationSegment")
                                            {
                                                SoundSegment seg    = new SoundSegment();
                                                XmlNode      offset = swvseg.ChildNodes[0];
                                                seg.offset = Convert.ToInt32(offset.InnerText, 16);
                                                sound.segments.Add(seg);
                                            }
                                            break;
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                        sounds.Add(sound);
                    }
                }
                catch (Exception)
                {
                }
            }
            foreach (SoundWaveAssetEntry sound in sounds)
            {
                listBox2.Items.Add(sound.name);
            }
        }
Пример #2
0
        private void ExtractSounds(int a, int b, int c, bool wav)
        {
            if (a == -1 || b == -1 || c == -1)
            {
                return;
            }
            Bundle bun = sb.bundles[a];
            SoundWaveAssetEntry sound = sounds[b];
            SoundSegment        seg   = sound.segments[c];

            byte[] data = new byte[0];
            if (sound.chunks[0].sha1 != null)
            {
                data = Tools.GetDataBySHA1(sound.chunks[0].sha1, cat);
            }
            else
            {
                foreach (DialogChunk dc in dchunks)
                {
                    if (Tools.ByteArrayCompare(sound.chunks[0].id, dc.id))
                    {
                        string     path = Path.GetDirectoryName(langTOC.MyPath) + "\\" + Path.GetFileNameWithoutExtension(langTOC.MyPath) + ".sb";
                        FileStream fs   = new FileStream(path, FileMode.Open, FileAccess.Read);
                        fs.Seek(dc.offset, 0);
                        data = new byte[dc.size];
                        fs.Read(data, 0, (int)dc.size);
                    }
                }
            }
            if (data.Length == 0)
            {
                return;
            }
            int offset = seg.offset;

            if (offset < 0)
            {
                return;
            }
            int toffset = -1;

            for (int i = offset; i >= 0; i--)
            {
                if (data[i] == 0x48 &&
                    data[i + 1] == 0x00 &&
                    data[i + 2] == 0x00 &&
                    data[i + 3] == 0x0C)
                {
                    toffset = i;
                    break;
                }
            }
            if (toffset == -1 || offset - toffset > 0x1000)
            {
                int toffset3 = -1;
                for (int i = offset; i < data.Length; i++)
                {
                    if (data[i] == 0x48 &&
                        data[i + 1] == 0x00 &&
                        data[i + 2] == 0x00 &&
                        data[i + 3] == 0x0C)
                    {
                        toffset3 = i;
                        break;
                    }
                }
                if (toffset3 != -1 && toffset3 - offset < 0x1000)
                {
                    toffset = toffset3;
                }
            }
            offset = toffset;
            int size = data.Length - offset;

            if (c + 1 < sound.segments.Count)
            {
                int offset2 = sound.segments[c + 1].offset;
                toffset = -1;
                for (int i = offset2; i > 0; i--)
                {
                    if (data[i] == 0x48 &&
                        data[i + 1] == 0x00 &&
                        data[i + 2] == 0x00 &&
                        data[i + 3] == 0x0C)
                    {
                        toffset = i;
                        break;
                    }
                }
                if (toffset == -1 || toffset == offset)
                {
                    int toffset3 = -1;
                    for (int i = offset2; i < data.Length; i++)
                    {
                        if (data[i] == 0x48 &&
                            data[i + 1] == 0x00 &&
                            data[i + 2] == 0x00 &&
                            data[i + 3] == 0x0C)
                        {
                            toffset3 = i;
                            break;
                        }
                    }
                    if (toffset3 != -1 && toffset3 - offset2 < 0x1000)
                    {
                        toffset = toffset3;
                    }
                }
                size = toffset - offset;
            }
            string basepath = Application.StartupPath + "\\ealayer3\\";

            byte[] result = new byte[size];
            for (int i = 0; i < size; i++)
            {
                result[i] = data[offset + i];
            }
            CleanUP();
            File.WriteAllBytes(basepath + "temp.bin", result);
            if (wav)
            {
                Tools.RunShell(basepath + "ealayer3.exe", "-w temp.bin");
            }
            else
            {
                Tools.RunShell(basepath + "ealayer3.exe", "temp.bin");
            }
        }
        private SoundWaveAssetEntry GetSoundData(byte[] data, SQLiteConnection con)
        {
            string      x   = Encoding.UTF8.GetString(Tools.ExtractEbx(new MemoryStream(data)));
            XmlDocument xml = new XmlDocument();

            xml.LoadXml("<xml>" + x + "</xml>");
            XmlNodeList         list  = xml.GetElementsByTagName("SoundWaveAsset");
            XmlNode             node  = list[0];
            SoundWaveAssetEntry sound = new SoundWaveAssetEntry();

            sound.chunks   = new List <SoundChunk>();
            sound.segments = new List <SoundSegment>();
            if (node.Name == "SoundWaveAsset")
            {
                foreach (XmlNode node2 in node.ChildNodes)
                {
                    switch (node2.Name)
                    {
                    case "SoundDataAsset":
                        foreach (XmlNode node3 in node2.ChildNodes)
                        {
                            switch (node3.Name)
                            {
                            case "Asset":
                                foreach (XmlNode node4 in node3.ChildNodes)
                                {
                                    switch (node4.Name)
                                    {
                                    case "Name":
                                        sound.name = node4.InnerText;
                                        break;
                                    }
                                }
                                break;

                            case "Chunks":
                                XmlNode members = node3.ChildNodes[0];
                                if (members == null)
                                {
                                    continue;
                                }
                                foreach (XmlNode node4 in members)
                                {
                                    switch (node4.Name)
                                    {
                                    case "SoundDataChunk":
                                        SoundChunk chunk = new SoundChunk();
                                        XmlNode    nId   = node4.ChildNodes[0];
                                        chunk.id = Tools.StringToByteArray(nId.InnerText);
                                        SQLiteDataReader reader = Database.getReader("SELECT sha1 FROM chunkids WHERE id='" + nId.InnerText + "'", con);
                                        if (reader.Read())
                                        {
                                            chunk.sha1 = reader.GetString(0);
                                        }
                                        sound.chunks.Add(chunk);
                                        break;
                                    }
                                }
                                break;
                            }
                        }
                        break;

                    case "Segments":
                        foreach (XmlNode node3 in node2.ChildNodes)
                        {
                            switch (node3.Name)
                            {
                            case "member":
                                XmlNode swvseg = node3.ChildNodes[0];
                                if (swvseg != null && swvseg.Name == "SoundWaveVariationSegment")
                                {
                                    SoundSegment seg    = new SoundSegment();
                                    XmlNode      offset = swvseg.ChildNodes[0];
                                    seg.offset = Convert.ToInt32(offset.InnerText, 16);
                                    sound.segments.Add(seg);
                                }
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            return(sound);
        }