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); }
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); } }
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); }