diff --git a/libs/fastfile/360/fastfile_cod10_360.cpp b/libs/fastfile/360/fastfile_cod10_360.cpp index 8ab1f72..005d649 100644 --- a/libs/fastfile/360/fastfile_cod10_360.cpp +++ b/libs/fastfile/360/fastfile_cod10_360.cpp @@ -99,7 +99,7 @@ bool FastFile_COD10_360::Load(const QByteArray aData) { decompressedData = Encryption::decryptFastFile_BO2(aData); // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -107,7 +107,7 @@ bool FastFile_COD10_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/360/fastfile_cod11_360.cpp b/libs/fastfile/360/fastfile_cod11_360.cpp index 990373f..33477b2 100644 --- a/libs/fastfile/360/fastfile_cod11_360.cpp +++ b/libs/fastfile/360/fastfile_cod11_360.cpp @@ -91,11 +91,11 @@ bool FastFile_COD11_360::Load(const QByteArray aData) { decompressedData = Encryption::decryptFastFile_BO3(encryptedData); // Output for verification/testing - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); // Load the zone file with decompressed data ZoneFile_COD11_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); if (!zoneFile.Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod12_360.cpp b/libs/fastfile/360/fastfile_cod12_360.cpp index f0581a4..8e051b9 100644 --- a/libs/fastfile/360/fastfile_cod12_360.cpp +++ b/libs/fastfile/360/fastfile_cod12_360.cpp @@ -91,11 +91,11 @@ bool FastFile_COD12_360::Load(const QByteArray aData) { decompressedData = Encryption::decryptFastFile_BO3(encryptedData); // Output for verification/testing - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); // Load the zone file with decompressed data ZoneFile_COD12_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); if (!zoneFile.Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod2_360.cpp b/libs/fastfile/360/fastfile_cod2_360.cpp index e61690b..bf234d8 100644 --- a/libs/fastfile/360/fastfile_cod2_360.cpp +++ b/libs/fastfile/360/fastfile_cod2_360.cpp @@ -55,10 +55,9 @@ bool FastFile_COD2_360::Load(const QString aFilePath) { } // Decompress fastfile and close - const QString fastFileStem = aFilePath.section("/", -1, -1).section(".", 0, 0); - SetStem(fastFileStem); + SetStem(aFilePath.section("/", -1, -1)); if (!Load(file->readAll())) { - qDebug() << "Error: Failed to load fastfile: " << fastFileStem; + qDebug() << "Error: Failed to load fastfile: " << GetStem(); return false; } @@ -77,11 +76,11 @@ bool FastFile_COD2_360::Load(const QByteArray aData) { QByteArray compressedData = aData.mid(fastFileStream.device()->pos()); QByteArray decompressedData = Compression::DecompressZLIB(compressedData); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD2_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/360/fastfile_cod4_360.cpp b/libs/fastfile/360/fastfile_cod4_360.cpp index 5ac6889..a6e9899 100644 --- a/libs/fastfile/360/fastfile_cod4_360.cpp +++ b/libs/fastfile/360/fastfile_cod4_360.cpp @@ -75,17 +75,63 @@ bool FastFile_COD4_360::Load(const QByteArray aData) { StatusBarManager::instance().updateStatus("Loading COD5 Fast File w/data", 1000); QByteArray decompressedData; - // Create a QDataStream on the input data. - QDataStream fastFileStream(aData); - fastFileStream.setByteOrder(QDataStream::LittleEndian); + const QString header = aData.left(8); + if (header == "IWffu100") { + // For COD5, simply decompress from offset 12. + decompressedData = Compression::DecompressZLIB(aData.mid(12)); + } else if (header == "IWff0100") { + // Create a QDataStream on the input data. + QDataStream fastFileStream(aData.mid(12)); + fastFileStream.setByteOrder(QDataStream::LittleEndian); - // For COD5, simply decompress from offset 12. - decompressedData = Compression::DecompressZLIB(aData.mid(12)); + QByteArray magic(8, Qt::Uninitialized); + fastFileStream.readRawData(magic.data(), 8); + if (magic != "IWffs100") { + qDebug() << "Found invalid signed header: " << magic; + return false; + } + fastFileStream.skipRawData(4); - Utils::ExportData(GetStem() + ".zone", decompressedData); + QByteArray rsaSigChecksum(32, Qt::Uninitialized); + fastFileStream.readRawData(rsaSigChecksum.data(), 32); + + QByteArray rsaSig(256, Qt::Uninitialized); + fastFileStream.readRawData(rsaSig.data(), 256); + + QByteArray fileName(32, Qt::Uninitialized); + fastFileStream.readRawData(fileName.data(), 32); + + fastFileStream.skipRawData(4); + + QByteArray bigSigBlock(7856, Qt::Uninitialized); + fastFileStream.readRawData(bigSigBlock.data(), 7856); + + QVector sigBlocks = QVector(); + QByteArray compressedData; + + for (int i = 0; i < (aData.size() / 202000) + 1; i++) + { + QByteArray newSigBlocks; + for (int j = 0; j < 256; j++) { + QByteArray newSigBlock(32, Qt::Uninitialized); + fastFileStream.readRawData(newSigBlock.data(), 32); + sigBlocks.append(newSigBlock); + } + newSigBlocks.append(newSigBlocks); + for (int j = 0; j < 256; j++) { + QByteArray compressedChunk(8192, Qt::Uninitialized); + fastFileStream.readRawData(compressedChunk.data(), 8192); + compressedData.append(compressedChunk); + } + } + decompressedData = Compression::DecompressZLIB(compressedData); + } + + + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD4_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/360/fastfile_cod5_360.cpp b/libs/fastfile/360/fastfile_cod5_360.cpp index 8608958..1488c3c 100644 --- a/libs/fastfile/360/fastfile_cod5_360.cpp +++ b/libs/fastfile/360/fastfile_cod5_360.cpp @@ -78,10 +78,10 @@ bool FastFile_COD5_360::Load(const QByteArray aData) { // For COD5, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD5_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/360/fastfile_cod6_360.cpp b/libs/fastfile/360/fastfile_cod6_360.cpp index 34ada0f..51d2132 100644 --- a/libs/fastfile/360/fastfile_cod6_360.cpp +++ b/libs/fastfile/360/fastfile_cod6_360.cpp @@ -3,6 +3,7 @@ #include "compression.h" #include "encryption.h" +#include "utils.h" #include #include @@ -69,83 +70,40 @@ bool FastFile_COD6_360::Load(const QString aFilePath) { } bool FastFile_COD6_360::Load(const QByteArray aData) { - QByteArray decompressedData; - - // Create a QDataStream on the input data. - QDataStream fastFileStream(aData); - - // Load the zone file with the decompressed data (using an Xbox platform flag). - ZoneFile_COD6_360 zoneFile; - zoneFile.SetStem(GetStem()); - - // For COD7/COD9, use BigEndian. - fastFileStream.setByteOrder(QDataStream::BigEndian); - - // Select key based on game. - QByteArray key = QByteArray::fromHex("1ac1d12d527c59b40eca619120ff8217ccff09cd16896f81b829c7f52793405d"); - fastFileStream.skipRawData(4); - - // Read the 8-byte magic. - QByteArray fileMagic(8, Qt::Uninitialized); - fastFileStream.readRawData(fileMagic.data(), 8); - if (fileMagic != "PHEEBs71") { - qWarning() << "Invalid fast file magic!"; + const qint64 zlibOffset = Compression::FindZlibOffset(aData); + if (zlibOffset == -1) + { + qWarning() << "Z-Lib stream not found"; return false; } - fastFileStream.skipRawData(4); + QByteArray compressed = aData.mid(zlibOffset); - // Read IV table name (32 bytes). - QByteArray fileName(32, Qt::Uninitialized); - fastFileStream.readRawData(fileName.data(), 32); + // 2. Try plain decompression first ------------------------------ + QByteArray decompressed = Compression::DecompressZLIB(compressed); - // Build the IV table from the fileName. - QByteArray ivTable = Encryption::InitIVTable(fileName); - - // Skip the RSA signature (256 bytes). - QByteArray rsaSignature(256, Qt::Uninitialized); - fastFileStream.readRawData(rsaSignature.data(), 256); - - // Now the stream should be positioned at 0x13C, where sections begin. - int sectionIndex = 0; - while (true) { - qint32 sectionSize = 0; - fastFileStream >> sectionSize; - qDebug() << "Section index:" << sectionIndex << "Size:" << sectionSize - << "Pos:" << fastFileStream.device()->pos(); - if (sectionSize == 0) - break; - - // Read the section data. - QByteArray sectionData; - sectionData.resize(sectionSize); - fastFileStream.readRawData(sectionData.data(), sectionSize); - - // Compute the IV for this section. - QByteArray iv = Encryption::GetIV(ivTable, sectionIndex); - - // Decrypt the section using Salsa20. - QByteArray decData = Encryption::salsa20DecryptSection(sectionData, key, iv); - - // Compute SHA1 hash of the decrypted data. - QByteArray sectionHash = QCryptographicHash::hash(decData, QCryptographicHash::Sha1); - - // Update the IV table based on the section hash. - Encryption::UpdateIVTable(ivTable, sectionIndex, sectionHash); - - // Build a compressed data buffer by prepending the two-byte zlib header. - QByteArray compressedData; - compressedData.append(char(0x78)); - compressedData.append(char(0x01)); - compressedData.append(decData); - - decompressedData.append(Compression::DecompressZLIB(compressedData)); - - sectionIndex++; + // 3. If that failed or looks too small, try stripping hash blocks + if (decompressed.isEmpty() || decompressed.size() < 1024) + { + QByteArray stripped = Compression::StripHashBlocks(compressed); + QByteArray retry = Compression::DecompressZLIB(stripped); + if (!retry.isEmpty()) + decompressed.swap(retry); } - zoneFile.Load(decompressedData); + if (decompressed.isEmpty()) + { + qWarning() << "Unable to decompress fast-file"; + return false; + } - SetZoneFile(std::make_shared(zoneFile)); + // Optional – keep a copy on disk for quick inspection + Utils::ExportData(GetBaseStem() + ".zone", decompressed); + + // 4. Forward to zone-file loader -------------------------------- + auto zoneFile = std::make_shared(); + zoneFile->SetStem(GetStem()); + zoneFile->Load(decompressed); + SetZoneFile(zoneFile); return true; } diff --git a/libs/fastfile/360/fastfile_cod7_360.cpp b/libs/fastfile/360/fastfile_cod7_360.cpp index 7da1f6e..90d645e 100644 --- a/libs/fastfile/360/fastfile_cod7_360.cpp +++ b/libs/fastfile/360/fastfile_cod7_360.cpp @@ -76,7 +76,7 @@ bool FastFile_COD7_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD7_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::BigEndian); diff --git a/libs/fastfile/360/fastfile_cod8_360.cpp b/libs/fastfile/360/fastfile_cod8_360.cpp index afdb404..746fc9e 100644 --- a/libs/fastfile/360/fastfile_cod8_360.cpp +++ b/libs/fastfile/360/fastfile_cod8_360.cpp @@ -99,7 +99,7 @@ bool FastFile_COD8_360::Load(const QByteArray aData) { decompressedData = Encryption::decryptFastFile_BO2(aData); // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -107,7 +107,7 @@ bool FastFile_COD8_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD8_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/360/fastfile_cod9_360.cpp b/libs/fastfile/360/fastfile_cod9_360.cpp index 04205f3..1362e59 100644 --- a/libs/fastfile/360/fastfile_cod9_360.cpp +++ b/libs/fastfile/360/fastfile_cod9_360.cpp @@ -99,7 +99,7 @@ bool FastFile_COD9_360::Load(const QByteArray aData) { decompressedData = Encryption::decryptFastFile_BO2(aData); // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -107,7 +107,7 @@ bool FastFile_COD9_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_360 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod10_pc.cpp b/libs/fastfile/PC/fastfile_cod10_pc.cpp index 34ef0b8..fcde932 100644 --- a/libs/fastfile/PC/fastfile_cod10_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod10_pc.cpp @@ -121,7 +121,7 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod11_pc.cpp b/libs/fastfile/PC/fastfile_cod11_pc.cpp index dafaf47..300e1eb 100644 --- a/libs/fastfile/PC/fastfile_cod11_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod11_pc.cpp @@ -121,7 +121,7 @@ bool FastFile_COD11_PC::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD11_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD11_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod12_pc.cpp b/libs/fastfile/PC/fastfile_cod12_pc.cpp index 5541223..b405990 100644 --- a/libs/fastfile/PC/fastfile_cod12_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod12_pc.cpp @@ -78,7 +78,7 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD12_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // Skip header magic fastFileStream.skipRawData(8); @@ -141,7 +141,7 @@ bool FastFile_COD12_PC::Load(const QByteArray aData) { fastFileStream.device()->seek(blockPosition + 16 + blockSize); } - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); zoneFile.Load(decompressedData); diff --git a/libs/fastfile/PC/fastfile_cod4_pc.cpp b/libs/fastfile/PC/fastfile_cod4_pc.cpp index c457d97..a2fe992 100644 --- a/libs/fastfile/PC/fastfile_cod4_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod4_pc.cpp @@ -44,7 +44,7 @@ QByteArray FastFile_COD4_PC::GetBinaryData() { } bool FastFile_COD4_PC::Load(const QString aFilePath) { - StatusBarManager::instance().updateStatus("Loading COD5 Fast File w/path", 1000); + StatusBarManager::instance().updateStatus("Loading " + GetGame() + " Fast File w/path", 1000); if (aFilePath.isEmpty()) { return false; @@ -82,10 +82,10 @@ bool FastFile_COD4_PC::Load(const QByteArray aData) { // For COD5, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD4_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod5_pc.cpp b/libs/fastfile/PC/fastfile_cod5_pc.cpp index a277a56..6cb91f0 100644 --- a/libs/fastfile/PC/fastfile_cod5_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod5_pc.cpp @@ -82,10 +82,10 @@ bool FastFile_COD5_PC::Load(const QByteArray aData) { // For COD5, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD5_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod6_pc.cpp b/libs/fastfile/PC/fastfile_cod6_pc.cpp index df8c444..00413af 100644 --- a/libs/fastfile/PC/fastfile_cod6_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod6_pc.cpp @@ -75,17 +75,14 @@ bool FastFile_COD6_PC::Load(const QByteArray aData) { StatusBarManager::instance().updateStatus("Loading COD5 Fast File w/data", 1000); QByteArray decompressedData; - // Create a QDataStream on the input data. - QDataStream fastFileStream(aData); - fastFileStream.setByteOrder(QDataStream::LittleEndian); + // Assume the first 12 bytes are a header; the rest is zlib-compressed zone data. + const QByteArray compressedData = aData.mid(21); + decompressedData = Compression::DecompressZLIB(compressedData); - // For COD5, simply decompress from offset 12. - decompressedData = Compression::DecompressZLIB(aData.mid(12)); - - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD6_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PC/fastfile_cod7_pc.cpp b/libs/fastfile/PC/fastfile_cod7_pc.cpp index 787688c..59f10b9 100644 --- a/libs/fastfile/PC/fastfile_cod7_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod7_pc.cpp @@ -88,7 +88,7 @@ bool FastFile_COD7_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD7_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::LittleEndian); diff --git a/libs/fastfile/PC/fastfile_cod8_pc.cpp b/libs/fastfile/PC/fastfile_cod8_pc.cpp index 472098f..85629dd 100644 --- a/libs/fastfile/PC/fastfile_cod8_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod8_pc.cpp @@ -88,7 +88,7 @@ bool FastFile_COD8_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD8_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::LittleEndian); diff --git a/libs/fastfile/PC/fastfile_cod9_pc.cpp b/libs/fastfile/PC/fastfile_cod9_pc.cpp index 2b920c9..7bb5b77 100644 --- a/libs/fastfile/PC/fastfile_cod9_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod9_pc.cpp @@ -121,7 +121,7 @@ bool FastFile_COD9_PC::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD9_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_PC zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod10_ps3.cpp b/libs/fastfile/PS3/fastfile_cod10_ps3.cpp index e0f1bca..b8535a3 100644 --- a/libs/fastfile/PS3/fastfile_cod10_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod10_ps3.cpp @@ -121,7 +121,7 @@ bool FastFile_COD10_PS3::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD10_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod11_ps3.cpp b/libs/fastfile/PS3/fastfile_cod11_ps3.cpp index 34c7e91..a2bc836 100644 --- a/libs/fastfile/PS3/fastfile_cod11_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod11_ps3.cpp @@ -121,7 +121,7 @@ bool FastFile_COD11_PS3::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD11_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD11_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod12_ps3.cpp b/libs/fastfile/PS3/fastfile_cod12_ps3.cpp index b3768e1..36d0b04 100644 --- a/libs/fastfile/PS3/fastfile_cod12_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod12_ps3.cpp @@ -121,7 +121,7 @@ bool FastFile_COD12_PS3::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD12_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD12_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod4_ps3.cpp b/libs/fastfile/PS3/fastfile_cod4_ps3.cpp index d6ccbe3..d21402a 100644 --- a/libs/fastfile/PS3/fastfile_cod4_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod4_ps3.cpp @@ -109,10 +109,10 @@ bool FastFile_COD4_PS3::Load(const QByteArray aData) { pos += chunkSize; } - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD4_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod5_ps3.cpp b/libs/fastfile/PS3/fastfile_cod5_ps3.cpp index 4c84099..b341169 100644 --- a/libs/fastfile/PS3/fastfile_cod5_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod5_ps3.cpp @@ -109,10 +109,10 @@ bool FastFile_COD5_PS3::Load(const QByteArray aData) { pos += chunkSize; } - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD5_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod6_ps3.cpp b/libs/fastfile/PS3/fastfile_cod6_ps3.cpp index f0d0929..d6d1b7c 100644 --- a/libs/fastfile/PS3/fastfile_cod6_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod6_ps3.cpp @@ -93,10 +93,10 @@ bool FastFile_COD6_PS3::Load(const QByteArray aData) { // For COD5, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); ZoneFile_COD6_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/PS3/fastfile_cod7_ps3.cpp b/libs/fastfile/PS3/fastfile_cod7_ps3.cpp index 8bc980a..eefe0ff 100644 --- a/libs/fastfile/PS3/fastfile_cod7_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod7_ps3.cpp @@ -88,7 +88,7 @@ bool FastFile_COD7_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD7_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::BigEndian); diff --git a/libs/fastfile/PS3/fastfile_cod8_ps3.cpp b/libs/fastfile/PS3/fastfile_cod8_ps3.cpp index fef9e69..3d10fb5 100644 --- a/libs/fastfile/PS3/fastfile_cod8_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod8_ps3.cpp @@ -88,7 +88,7 @@ bool FastFile_COD8_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD8_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::BigEndian); diff --git a/libs/fastfile/PS3/fastfile_cod9_ps3.cpp b/libs/fastfile/PS3/fastfile_cod9_ps3.cpp index 787c08d..e13fdef 100644 --- a/libs/fastfile/PS3/fastfile_cod9_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod9_ps3.cpp @@ -121,7 +121,7 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -129,7 +129,7 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_PS3 zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/Wii/fastfile_cod4_wii.cpp b/libs/fastfile/Wii/fastfile_cod4_wii.cpp index b661fc3..c2c920c 100644 --- a/libs/fastfile/Wii/fastfile_cod4_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod4_wii.cpp @@ -69,46 +69,18 @@ bool FastFile_COD4_Wii::Load(const QString aFilePath) { bool FastFile_COD4_Wii::Load(const QByteArray aData) { QByteArray decompressedData; - // Create a QDataStream on the input data. - QDataStream fastFileStream(aData); - fastFileStream.setByteOrder(QDataStream::LittleEndian); - - // Parse header values. - SetCompany(pParseFFCompany(&fastFileStream)); - SetType(pParseFFFileType(&fastFileStream)); - SetSignage(pParseFFSignage(&fastFileStream)); - SetMagic(pParseFFMagic(&fastFileStream)); - quint32 version = pParseFFVersion(&fastFileStream); - SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD7"); - // Load the zone file with the decompressed data (using an Xbox platform flag). - ZoneFile_COD7_Wii zoneFile; - zoneFile.SetStem(GetStem()); - - // For COD7/COD9, use BigEndian. - fastFileStream.setByteOrder(QDataStream::BigEndian); + ZoneFile_COD4_Wii zoneFile; + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); - - QDir workingDir = QDir::currentPath(); - workingDir.mkdir("exports"); - - QFile outputFile("exports/" + GetStem() + ".zone"); - if (!outputFile.open(QIODevice::WriteOnly)) { - qDebug() << "Failed to extract IPAK file."; - } - qDebug() << " - File Name: " << outputFile.fileName(); - outputFile.write(decompressedData); - outputFile.close(); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); zoneFile.Load(decompressedData); - SetZoneFile(std::make_shared(zoneFile)); + SetZoneFile(std::make_shared(zoneFile)); return true; } diff --git a/libs/fastfile/Wii/fastfile_cod7_wii.cpp b/libs/fastfile/Wii/fastfile_cod7_wii.cpp index 26735d2..fed87bc 100644 --- a/libs/fastfile/Wii/fastfile_cod7_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod7_wii.cpp @@ -85,7 +85,7 @@ bool FastFile_COD7_Wii::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD7_Wii zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::BigEndian); @@ -93,16 +93,15 @@ bool FastFile_COD7_Wii::Load(const QByteArray aData) { // For COD7, simply decompress from offset 12. decompressedData = Compression::DecompressZLIB(aData.mid(12)); - Utils::ExportData(GetStem() + ".zone", decompressedData); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); QDir workingDir = QDir::currentPath(); workingDir.mkdir("exports"); - QFile outputFile("exports/" + GetStem() + ".zone"); + QFile outputFile("exports/" + GetBaseStem() + ".zone"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to extract IPAK file."; } - qDebug() << " - File Name: " << outputFile.fileName(); outputFile.write(decompressedData); outputFile.close(); diff --git a/libs/fastfile/Wii/fastfile_cod8_wii.cpp b/libs/fastfile/Wii/fastfile_cod8_wii.cpp index 8252db3..aef0884 100644 --- a/libs/fastfile/Wii/fastfile_cod8_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod8_wii.cpp @@ -14,7 +14,7 @@ FastFile_COD8_Wii::FastFile_COD8_Wii() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD7"); + SetGame("COD8"); SetPlatform("Wii"); } @@ -78,37 +78,23 @@ bool FastFile_COD8_Wii::Load(const QByteArray aData) { SetType(pParseFFFileType(&fastFileStream)); SetSignage(pParseFFSignage(&fastFileStream)); SetMagic(pParseFFMagic(&fastFileStream)); - quint32 version = pParseFFVersion(&fastFileStream); - SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD7"); + SetVersion(pParseFFVersion(&fastFileStream)); // Load the zone file with the decompressed data (using an Xbox platform flag). - ZoneFile_COD7_Wii zoneFile; - zoneFile.SetStem(GetStem()); + ZoneFile_COD8_Wii zoneFile; + zoneFile.SetStem(GetBaseStem() + ".zone"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(QDataStream::BigEndian); // For COD7, simply decompress from offset 12. - decompressedData = Compression::DecompressZLIB(aData.mid(12)); + decompressedData = Compression::DecompressZLIB(aData.mid(25)); - Utils::ExportData(GetStem() + ".zone", decompressedData); - - QDir workingDir = QDir::currentPath(); - workingDir.mkdir("exports"); - - QFile outputFile("exports/" + GetStem() + ".zone"); - if (!outputFile.open(QIODevice::WriteOnly)) { - qDebug() << "Failed to extract IPAK file."; - } - qDebug() << " - File Name: " << outputFile.fileName(); - outputFile.write(decompressedData); - outputFile.close(); + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); zoneFile.Load(decompressedData); - SetZoneFile(std::make_shared(zoneFile)); + SetZoneFile(std::make_shared(zoneFile)); return true; } diff --git a/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp b/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp index 165dd42..1bab0e9 100644 --- a/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp +++ b/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp @@ -119,7 +119,7 @@ bool FastFile_COD10_WiiU::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -127,7 +127,7 @@ bool FastFile_COD10_WiiU::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_WiiU zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile)); diff --git a/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp b/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp index 52078d2..49e19e0 100644 --- a/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp +++ b/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp @@ -119,7 +119,7 @@ bool FastFile_COD9_WiiU::Load(const QByteArray aData) { } // For COD9, write out the complete decompressed zone for testing. - QFile testFile("exports/" + GetStem() + ".zone"); + QFile testFile("exports/" + GetBaseStem() + ".zone"); if(testFile.open(QIODevice::WriteOnly)) { testFile.write(decompressedData); testFile.close(); @@ -127,7 +127,7 @@ bool FastFile_COD9_WiiU::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_WiiU zoneFile; - zoneFile.SetStem(GetStem()); + zoneFile.SetStem(GetBaseStem() + ".zone"); zoneFile.Load(decompressedData); SetZoneFile(std::make_shared(zoneFile));