diff --git a/ndsfactory/ndsfactory.cpp b/ndsfactory/ndsfactory.cpp index 078e4d4..607ce6d 100644 --- a/ndsfactory/ndsfactory.cpp +++ b/ndsfactory/ndsfactory.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "ndsfactory.h" #include "fatstruct.h" #include "crctable.h" @@ -61,6 +62,18 @@ bool NDSFactory::dumpDataFromFile(const std::string& romPath, const std::string& return false; } +bool NDSFactory::logToFile(const std::string& logPath, const std::string& log) +{ + std::ofstream savedFile(logPath, std::ios::out | std::ios::binary | std::ios::app); + if (savedFile.is_open()) + { + savedFile.write(log.c_str(), log.size()); + savedFile.close(); + return true; + } + return false; +} + bool NDSFactory::readBytesFromFile(std::vector& byteBuffer, const std::string& romPath, uint32_t startAddr, uint32_t size) { @@ -135,7 +148,7 @@ bool NDSFactory::checkArm9FooterPresence(const std::string& sectionPath, uint32_ } bool NDSFactory::extractFatData(const std::string& fatDataSectionPath, const std::string& fatSectionPath, - const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath) + const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath, bool logFileIDs) { std::vector fatDataBytes; std::vector fatBytes; @@ -169,7 +182,7 @@ bool NDSFactory::extractFatData(const std::string& fatDataSectionPath, const std // This lambda function was written by NyuBlara, all credits to him. // I edited it a bit to make it work with the rest of the updated code. - auto parseFolder = [this, fntBytes, pfatrange, fatDataSectionPath, originalFatDataAddr](uint32_t folderId, std::string curPath, auto& parseFolder) { + auto parseFolder = [this, fntBytes, pfatrange, fatDataSectionPath, originalFatDataAddr, savePath, logFileIDs](uint32_t folderId, std::string curPath, auto& parseFolder) { uint32_t currentOffset = 8 * (folderId & FNT_HEADER_OFFSET_MASK); // offset for the current directory's info in the FNT header // Only the lower 12 bit of the given offset are relevant @@ -236,6 +249,12 @@ bool NDSFactory::extractFatData(const std::string& fatDataSectionPath, const std if (!std::filesystem::exists(newPath)) if (!std::filesystem::create_directory(newPath)) return false; + if (logFileIDs) + { + std::string log = std::format("{:x}",subFolderId) + "::D::" + newPath.substr(savePath.size()+1) + '\n'; + if (!logToFile(savePath + "/_file_IDs.txt", log)) return false; + } + // Jump back to the FNT header and repeat the process for subdirectory ! if (!parseFolder(subFolderId, newPath, parseFolder)) return false; } @@ -249,6 +268,12 @@ bool NDSFactory::extractFatData(const std::string& fatDataSectionPath, const std uint32_t fileSize = (pfatrange + fatOffset)->endAddr - (pfatrange + fatOffset)->startAddr; if (!dumpDataFromFile(fatDataSectionPath, newPath, fileStartAddr, fileSize)) return false; + if (logFileIDs) + { + std::string log = std::format("{:x}", fatOffset) + "::F::" + newPath.substr(savePath.size()+1) + '\n'; + if (!logToFile(savePath + "/_file_IDs.txt", log)) return false; + } + fatOffset++; } } diff --git a/ndsfactory/ndsfactory.h b/ndsfactory/ndsfactory.h index f388951..540ffd4 100644 --- a/ndsfactory/ndsfactory.h +++ b/ndsfactory/ndsfactory.h @@ -14,6 +14,7 @@ public: NDSFactory(); bool loadRomHeader(const std::string& romPath, std::vector& header); bool dumpDataFromFile(const std::string& romPath, const std::string& savePath, uint32_t startAddr, uint32_t size); + bool logToFile(const std::string& logPath, const std::string& log); bool readBytesFromFile(std::vector& byteBuffer, const std::string& romPath, uint32_t startAddr, uint32_t size); bool writeSectionToFile(const std::string& sectionPath, const std::string& savePath, uint32_t startAddr, uint32_t size); bool writeBytesToFile(std::vector& byteBuffer, const std::string& savePath, uint32_t startAddr, uint32_t size); @@ -21,7 +22,7 @@ public: int getCardSizeInBytes(int cardType); bool checkArm9FooterPresence(const std::string& sectionPath, uint32_t size); bool extractFatData(const std::string& fatDataSectionPath, const std::string& fatSectionPath, - const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath); + const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath, bool logFileIDs); bool patchFat(const std::string& sectionPath, uint32_t shiftSize, const std::string& savePath); uint16_t calcHeaderCrc16(const std::vector& romHeader); diff --git a/ui/dialogs/about/revision.h b/ui/dialogs/about/revision.h index a30a693..6e5910d 100644 --- a/ui/dialogs/about/revision.h +++ b/ui/dialogs/about/revision.h @@ -1,6 +1,6 @@ #ifndef REVISION_H #define REVISION_H -#define GIT_COMMIT_HASH "e788d95" +#define GIT_COMMIT_HASH "fb12309" #endif diff --git a/ui/mainwindow.h b/ui/mainwindow.h index 47bac5c..488b946 100644 --- a/ui/mainwindow.h +++ b/ui/mainwindow.h @@ -108,6 +108,6 @@ private: QString extractPackerHeaderTableData(int index); bool extractFatData(const std::string& fatDataSectionPath, const std::string& fatSectionPath, - const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath); + const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath, bool logFileIDs); bool patchFat(const std::string& loadPath, uint32_t shiftSize, const std::string& savePath); }; diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 42bcf2e..2c51789 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -697,6 +697,17 @@ + + + + + + Save file IDs to _file_IDs.txt (required for games that access files by their ID) + + + + + diff --git a/ui/tabs/fattools/fattoolstabfunctions.cpp b/ui/tabs/fattools/fattoolstabfunctions.cpp index 61570ce..160065c 100644 --- a/ui/tabs/fattools/fattoolstabfunctions.cpp +++ b/ui/tabs/fattools/fattoolstabfunctions.cpp @@ -2,9 +2,9 @@ bool MainWindow::extractFatData(const std::string& fatDataSectionPath, const std::string& fatSectionPath, - const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath) + const std::string& fntSectionPath, uint32_t originalFatDataAddr, const std::string& savePath, bool logFileIDs) { - return ndsFactory.extractFatData(fatDataSectionPath, fatSectionPath, fntSectionPath, originalFatDataAddr, savePath); + return ndsFactory.extractFatData(fatDataSectionPath, fatSectionPath, fntSectionPath, originalFatDataAddr, savePath, logFileIDs); } bool MainWindow::patchFat(const std::string& loadPath, uint32_t shiftSize, const std::string& savePath) diff --git a/ui/tabs/fattools/fattoolstabsignals.cpp b/ui/tabs/fattools/fattoolstabsignals.cpp index 6caff20..010ac68 100644 --- a/ui/tabs/fattools/fattoolstabsignals.cpp +++ b/ui/tabs/fattools/fattoolstabsignals.cpp @@ -54,10 +54,11 @@ void MainWindow::on_fatExtractorExtractBtn_clicked() if (!dirPath.isNull()) extractFatData(ui->fatExtractorFatDataPathEdt->text().toStdString(), - ui->fatExtractorFatPathEdt->text().toStdString(), - ui->fatExtractorFntPathEdt->text().toStdString(), - ui->fatExtractorOriginalFatFilesAddrEdt->text().toUInt(nullptr, 16), - dirPath.toStdString()) ? QMessageBox::information(this, tr("NDS Factory"), tr("FAT files extraction completed!")) + ui->fatExtractorFatPathEdt->text().toStdString(), + ui->fatExtractorFntPathEdt->text().toStdString(), + ui->fatExtractorOriginalFatFilesAddrEdt->text().toUInt(nullptr, 16), + dirPath.toStdString(), + ui->fatExtractorSaveFileIDsCbx->isChecked()) ? QMessageBox::information(this, tr("NDS Factory"), tr("FAT files extraction completed!")) : QMessageBox::critical(this, tr("NDS Factory"), tr("Error extracting FAT files!")); }