From c32cd190f26e8ea1461c14d401f1eb0c9e244440 Mon Sep 17 00:00:00 2001 From: krs Date: Fri, 25 Nov 2022 00:21:24 +0200 Subject: [PATCH] ResourceExtractor code moved to a static class. --- mapeditor/mainwindow.cpp | 39 +++++++---------- mapeditor/mainwindow.h | 10 ----- .../resourceExtractor/ResourceConverter.cpp | 29 +++++-------- .../resourceExtractor/ResourceConverter.h | 42 +++++++++++++++++-- 4 files changed, 66 insertions(+), 54 deletions(-) diff --git a/mapeditor/mainwindow.cpp b/mapeditor/mainwindow.cpp index 920e3c0f8..d7536eea1 100644 --- a/mapeditor/mainwindow.cpp +++ b/mapeditor/mainwindow.cpp @@ -41,15 +41,8 @@ #include "resourceExtractor/ResourceConverter.h" static CBasicLogConfigurator * logConfig; -ExtractionOptions * extractionOptions; // All command line options for resource extractor -ExtractionOptions::ExtractionOptions(const bool extractArchives, const bool splitDefs, const bool convertPcxToPng, const bool deleteOriginals) : - extractArchives(extractArchives), - splitDefs(splitDefs), - convertPcxToPng(convertPcxToPng), - deleteOriginals(deleteOriginals) -{ -} +ExtractionOptions extractionOptions; QJsonValue jsonFromPixmap(const QPixmap &p) { @@ -118,10 +111,10 @@ void MainWindow::parseCommandLine() if (!positionalArgs.isEmpty()) mapFilePath = positionalArgs.at(0); - extractionOptions = new ExtractionOptions(parser.isSet("e"), parser.isSet("s"), parser.isSet("c"), parser.isSet("d")); + extractionOptions = {parser.isSet("e"), {parser.isSet("s"), parser.isSet("c"), parser.isSet("d")}}; } -MainWindow::MainWindow(QWidget *parent) : +MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), controller(this) @@ -129,7 +122,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); loadUserSettings(); //For example window size setTitle(); - + // Set current working dir to executable folder. // This is important on Mac for relative paths to work inside DMG. QDir::setCurrent(QApplication::applicationDirPath()); @@ -144,39 +137,39 @@ MainWindow::MainWindow(QWidget *parent) : logGlobal->info("The log file will be saved to %s", logPath); //init - preinitDLL(::console, false, extractionOptions->extractArchives); + preinitDLL(::console, false, extractionOptions.extractArchives); settings.init(); - + // Initialize logging based on settings logConfig->configure(); logGlobal->debug("settings = %s", settings.toJsonNode().toJson()); - + // Some basic data validation to produce better error messages in cases of incorrect install auto testFile = [](std::string filename, std::string message) -> bool { if (CResourceHandler::get()->existsResource(ResourceID(filename))) return true; - + logGlobal->error("Error: %s was not found!", message); return false; }; - - if(!testFile("DATA/HELP.TXT", "Heroes III data") || - !testFile("MODS/VCMI/MOD.JSON", "VCMI data")) + + if (!testFile("DATA/HELP.TXT", "Heroes III data") || + !testFile("MODS/VCMI/MOD.JSON", "VCMI data")) { QApplication::quit(); } - + conf.init(); logGlobal->info("Loading settings"); - + init(); - + graphics = new Graphics(); // should be before curh->init() graphics->load();//must be after Content loading but should be in main thread - if (extractionOptions->extractArchives) - convertExtractedResourceFiles(extractionOptions->splitDefs, extractionOptions->convertPcxToPng, extractionOptions->deleteOriginals); + if (extractionOptions.extractArchives) + ResourceConverter::convertExtractedResourceFiles(extractionOptions.conversionOptions); ui->mapView->setScene(controller.scene(0)); ui->mapView->setController(&controller); diff --git a/mapeditor/mainwindow.h b/mapeditor/mainwindow.h index 9e400c1c5..5c419f74e 100644 --- a/mapeditor/mainwindow.h +++ b/mapeditor/mainwindow.h @@ -148,13 +148,3 @@ private: // command line options QString mapFilePath; // FilePath to the H3 or VCMI map to open }; - -struct ExtractionOptions -{ - ExtractionOptions(const bool extractArchives, const bool splitDefs, const bool convertPcxToPng, const bool deleteOriginals); - - bool extractArchives = false; // extract original H3 archives into a separate folder - bool splitDefs = false; // splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's - bool convertPcxToPng = false; // converts single Images (found in Images folder) from .pcx to png. - bool deleteOriginals = false; // delete original files, for the ones splitted / converted. -}; diff --git a/mapeditor/resourceExtractor/ResourceConverter.cpp b/mapeditor/resourceExtractor/ResourceConverter.cpp index cdebe9300..d2be795b1 100644 --- a/mapeditor/resourceExtractor/ResourceConverter.cpp +++ b/mapeditor/resourceExtractor/ResourceConverter.cpp @@ -22,10 +22,16 @@ #include "boost/filesystem/path.hpp" #include "boost/locale.hpp" -namespace bfs = boost::filesystem; +void ResourceConverter::convertExtractedResourceFiles(ConversionOptions conversionOptions) +{ + if (conversionOptions.splitDefs) + splitDefFiles(conversionOptions.deleteOriginals); -// converts all pcx files from /Images into PNG -void doConvertPcxToPng(bool deleteOriginals) + if (conversionOptions.convertPcxToPng) + doConvertPcxToPng(conversionOptions.deleteOriginals); +} + +void ResourceConverter::doConvertPcxToPng(bool deleteOriginals) { std::string filename; @@ -61,8 +67,7 @@ void doConvertPcxToPng(bool deleteOriginals) } } -// splits a def file into individual parts and converts the output to PNG format -void splitDefFile(const std::string & fileName, const bfs::path & spritesPath, bool deleteOriginals) +void ResourceConverter::splitDefFile(const std::string & fileName, const bfs::path & spritesPath, bool deleteOriginals) { if(CResourceHandler::get()->existsResource(ResourceID("SPRITES/" + fileName))) { @@ -77,22 +82,10 @@ void splitDefFile(const std::string & fileName, const bfs::path & spritesPath, b logGlobal->error("Def File Split error! " + fileName); } -// splits def files (TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44) so that faction resources are independent -// (town creature portraits, hero army creature portraits, adventure map dwellings, small town icons, big town icons, -// hero speciality small icons, hero speciality large icons) -void splitDefFiles(bool deleteOriginals) +void ResourceConverter::splitDefFiles(bool deleteOriginals) { bfs::path spritesPath = VCMIDirs::get().userExtractedPath() / "SPRITES"; for(std::string defFilename : {"TwCrPort.def", "CPRSMALL.def", "FlagPort.def", "ITPA.def", "ITPt.def", "Un32.def", "Un44.def"}) splitDefFile(defFilename, spritesPath, deleteOriginals); -} - -void convertExtractedResourceFiles(bool splitDefs, bool convertPcxToPng, bool deleteOriginals) -{ - if(splitDefs) - splitDefFiles(deleteOriginals); - - if(convertPcxToPng) - doConvertPcxToPng(deleteOriginals); } \ No newline at end of file diff --git a/mapeditor/resourceExtractor/ResourceConverter.h b/mapeditor/resourceExtractor/ResourceConverter.h index dca12f4ed..17d3361d6 100644 --- a/mapeditor/resourceExtractor/ResourceConverter.h +++ b/mapeditor/resourceExtractor/ResourceConverter.h @@ -8,6 +8,42 @@ * */ #pragma once - - // Splits def files that are shared between factions and converts pcx to bmp -void convertExtractedResourceFiles(bool splitDefs, bool convertPcxToPng, bool deleteOriginals); + +namespace bfs = boost::filesystem; + +// Struct for holding all Convertor Options +struct ConversionOptions +{ + bool splitDefs = false; // splits TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44 into individual PNG's + bool convertPcxToPng = false; // converts single Images (found in Images folder) from .pcx to png. + bool deleteOriginals = false; // delete original files, for the ones splitted / converted. +}; + +// Struct for holding all Resource Extractor / Converter options +struct ExtractionOptions +{ + bool extractArchives = false; // if set, original H3 archives will be extracted into a separate folder + ConversionOptions conversionOptions; +}; + +class ResourceConverter +{ + +public: + + // Splits def files that are shared between factions and converts pcx to bmp depending on Extraction Options + static void convertExtractedResourceFiles(ConversionOptions conversionOptions); + +private: + + // converts all pcx files from /Images into PNG + static void doConvertPcxToPng(bool deleteOriginals); + + // splits a def file into individual parts and converts the output to PNG format + static void splitDefFile(const std::string& fileName, const bfs::path& spritesPath, bool deleteOriginals); + + // splits def files (TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44) so that faction resources are independent + // (town creature portraits, hero army creature portraits, adventure map dwellings, small town icons, big town icons, + // hero speciality small icons, hero speciality large icons) + static void splitDefFiles(bool deleteOriginals); +}; \ No newline at end of file