Added a command to pack an mpq from a directory

This commit is contained in:
KiritoDv
2023-10-07 21:07:04 -06:00
parent a38f895f80
commit dfbf8f1525
5 changed files with 69 additions and 7 deletions
+41
View File
@@ -166,3 +166,44 @@ RawFactory *Companion::GetFactory(const std::string &extension) {
return this->gFactories[extension];
}
void Companion::Pack(const std::string& folder, const std::string& output) {
spdlog::set_level(spdlog::level::debug);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");
SPDLOG_INFO("------------------------------------------------");
SPDLOG_INFO("Starting CubeOS...");
SPDLOG_INFO("Scanning {}", folder);
auto start = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
std::unordered_map<std::string, std::vector<char>> files;
for (const auto & entry : fs::recursive_directory_iterator(folder)){
if(entry.is_directory()) continue;
std::ifstream input( entry.path(), std::ios::binary );
auto data = std::vector<char>( std::istreambuf_iterator<char>( input ), {} );
input.close();
files[entry.path().string()] = data;
}
auto wrapper = SWrapper(output);
for(auto& [path, data] : files){
std::string normalized = path;
std::replace(normalized.begin(), normalized.end(), '\\', '/');
// Remove parent folder
normalized = normalized.substr(folder.length() + 1);
wrapper.CreateFile(normalized, data);
SPDLOG_INFO("> Added {}", normalized);
}
auto end = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
SPDLOG_INFO("Done! Took {}ms", end.count() - start.count());
SPDLOG_INFO("Exported to {}", output);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");
SPDLOG_INFO("------------------------------------------------");
wrapper.Close();
}
+2
View File
@@ -15,6 +15,8 @@ public:
void Init();
void Process();
N64::Cartridge* GetCartridge() { return this->cartridge; }
static void Pack(const std::string& folder, const std::string& output);
private:
std::filesystem::path gRomPath;
std::vector<uint8_t> gRomData;
+23 -4
View File
@@ -5,11 +5,32 @@
#ifdef STANDALONE
Companion* Companion::Instance;
void BindOTRMode(CLI::App& app){
auto otr = app.add_subcommand("otr", "Extracts the rom to a folder");
std::string filename;
otr->add_option("rom", filename, "sm64 us rom")->required()->check(CLI::ExistingFile);
otr->parse_complete_callback([&]() {
auto instance = Companion::Instance = new Companion(filename);
instance->Init();
});
}
void BindPackMode(CLI::App& app){
auto pack = app.add_subcommand("pack", "Packs the rom from a folder");
std::string folder;
pack->add_option("folder", folder, "Folder")->required()->check(CLI::ExistingDirectory);
std::string output;
pack->add_option("output", output, "MPQ Output")->required();
pack->parse_complete_callback([&]() {
Companion::Pack(folder, output);
});
}
int main(int argc, char *argv[]) {
CLI::App app{"CubeOS - Rom extractor"};
std::string filename;
app.add_option("path", filename, "sm64 us rom")->required()->check(CLI::ExistingFile);
BindOTRMode(app);
BindPackMode(app);
try {
app.parse(argc, argv);
@@ -17,8 +38,6 @@ int main(int argc, char *argv[]) {
return app.exit(e);
}
Companion::Instance = new Companion(filename);
Companion::Instance->Init();
return 0;
}
#endif
+1 -1
View File
@@ -16,7 +16,7 @@ SWrapper::SWrapper(const std::string& path) {
}
}
bool SWrapper::CreateFile(std::string path, std::vector<char> data) {
bool SWrapper::CreateFile(const std::string& path, std::vector<char> data) {
HANDLE hFile;
#ifdef _WIN32
SYSTEMTIME sysTime;
+2 -2
View File
@@ -9,8 +9,8 @@ public:
SWrapper(const std::string& path);
std::vector<char> ReadFile(std::string path);
bool CreateFile(std::string path, std::vector<char> data);
bool CreateFile(const std::string& path, std::vector<char> data);
void Close();
private:
HANDLE hMpq;
HANDLE hMpq{};
};