Beispiel #1
0
 public ViewUI TransferData(DataMessage data)
 {
     if (_Editor.labelFileName.Text == $"{data.Name}")
     {
         return(_Editor);
     }
     _Editor.labelFileName.Text      = data.Name;
     _Editor.dataGridView.DataSource = null;
     _Editor.dataGridView.Rows.Clear();
     for (int i = 0; i < data.Strings.Count; i++)
     {
         string title = data.Speakers == null ? $"{i}" : data.Speakers[i].Name;
         _Editor.dataGridView.Rows.Add(title, data.Strings[i]);
     }
     return(_Editor);
 }
Beispiel #2
0
        private void listFiles_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (listFiles.SelectedIndex < 0 || _IsBusy)
            {
                return;
            }
            int index = listFiles.SelectedIndex;

            try
            {
                DataMessage data   = _DataMessage[index];
                ViewUI      editor = _Editor.TransferData(data);
                if (!editor.Visible)
                {
                    editor.Show();
                }
            }
            catch (Exception err)
            {
                MessageBox.Show($"An error occurred:\n\n{err.Message}", _MessageBoxTitle);
            }
        }
Beispiel #3
0
        public static List <DataMessage> Decrypt(byte[] input)
        {
            List <DataMessage> result = new List <DataMessage>();
            MemoryStream       stream = new MemoryStream(input);
            BinaryReaderBE     reader = new BinaryReaderBE(stream);

            if (reader.ReadUInt32() == ArchiveConfig.Signature)
            {
                reader.BaseStream.Position = ArchiveConfig.CompressionTypeOffset;
                uint compressType = reader.ReadUInt32();
                switch (compressType)
                {
                case 0:
                    reader.BaseStream.Position = ArchiveConfig.TableOffset;

                    uint nameCount    = reader.ReadUInt32();
                    uint nameOffset   = reader.ReadUInt32();
                    uint exportCount  = reader.ReadUInt32();
                    uint exportOffset = reader.ReadUInt32();
                    uint importCount  = reader.ReadUInt32();
                    uint importOffset = reader.ReadUInt32();

                    string[] nameTable = new string[nameCount];
                    reader.BaseStream.Position = nameOffset;
                    for (int i = 0; i < nameCount; i++)
                    {
                        uint strLength = reader.ReadUInt32();
                        nameTable[i] = Encoding.UTF8.GetString(reader.ReadBytes((int)strLength - 1));
                        reader.BaseStream.Position += 9;
                    }
                    string[] nameImport = new string[importCount];
                    reader.BaseStream.Position = importOffset;
                    for (int i = 0; i < importCount; i++)
                    {
                        reader.BaseStream.Position += 20;
                        uint index = reader.ReadUInt32();
                        nameImport[i] = nameTable[(int)index];
                        reader.BaseStream.Position += 4;
                    }
                    reader.BaseStream.Position = exportOffset;
                    long current = reader.BaseStream.Position;
                    for (int i = 0; i < exportCount; i++)
                    {
                        reader.BaseStream.Position = current;
                        uint indexType = (uint)reader.ReadInt32() ^ 0xFFFFFFFF;
                        reader.BaseStream.Position += 8;
                        uint   nameIndex  = reader.ReadUInt32();
                        uint   suffixName = reader.ReadUInt32();
                        string name       = nameTable[(int)nameIndex];
                        if (suffixName != 0)
                        {
                            name += $"_{suffixName}";
                        }
                        reader.BaseStream.Position += 12;
                        uint size   = reader.ReadUInt32();
                        uint offset = reader.ReadUInt32();
                        reader.BaseStream.Position += 4;
                        if (reader.ReadUInt32() > 0)
                        {
                            reader.BaseStream.Position += 4;
                        }
                        reader.BaseStream.Position += 20;
                        current = reader.BaseStream.Position;
                        if (nameImport[indexType] == "Sqex03DataMessage")
                        {
                            reader.BaseStream.Position = offset;
                            uint           order    = reader.ReadUInt32();
                            List <Speaker> speakers = new List <Speaker>();
                            while (true)
                            {
                                string nameID = nameTable[reader.ReadInt32()];
                                if (nameID == "None")
                                {
                                    break;
                                }
                                string classID = nameTable[reader.ReadInt64()];
                                if (classID == "IntProperty")
                                {
                                    long lengthProperty = reader.ReadInt64();
                                    long intProperty    = reader.ReadInt64();
                                }
                                else if (classID == "ArrayProperty")
                                {
                                    long lengthProperty = reader.ReadInt64();
                                    if (nameID == "m_String")
                                    {
                                        DataMessage dataMessage = GetStrings(ref reader, name, false);
                                        result.Add(dataMessage);
                                    }
                                    else if (nameID == "m_Name")
                                    {
                                        DataMessage dataMessage = GetStrings(ref reader, $"{name}_Name", true);
                                        if (!string.IsNullOrWhiteSpace(string.Join("", dataMessage.Strings)))
                                        {
                                            result.Add(dataMessage);
                                        }
                                    }
                                    else if (nameID == "m_MesData")
                                    {
                                        GetSpeakers(ref reader, ref speakers, nameTable);
                                    }
                                    else
                                    {
                                        reader.BaseStream.Position += lengthProperty + 4;
                                    }
                                }
                            }
                            if (result.Any(entry => entry.Name == $"{name}_Name"))
                            {
                                DataMessage data     = result.Find(entry => entry.Name == name);
                                DataMessage dataName = result.Find(entry => entry.Name == $"{name}_Name");
                                for (int y = 0; y < speakers.Count; y++)
                                {
                                    try
                                    {
                                        speakers[y].Name = dataName.Strings[speakers[y].ID];
                                    }
                                    catch
                                    {
                                        speakers[y].Name = "";
                                    }
                                }
                                data.Speakers = speakers;
                            }
                        }
                    }
                    break;

                case 1:
                    byte[] decompressedData = Decompress(input, (uint)reader.BaseStream.Position);
                    return(Decrypt(decompressedData));

                default:
                    throw new Exception("The file has an unsupported compression type.");
                }
            }
            else
            {
                throw new Exception("The file is not a Drakengard 3 (Unreal 3) file.");
            }
            reader.Close();
            return(result);
        }