diff --git a/CMakeLists.txt b/CMakeLists.txt index 097b8cc..e9c88a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.15 FATAL_ERROR) +cmake_minimum_required(VERSION 3.26 FATAL_ERROR) if (NOT WIN32) message(FATAL_ERROR "This program has been specified to compile on Microsoft Windows OS only.") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 66b5acb..4737b25 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -147,27 +147,15 @@ ) # Copying Resource folder with subfolders, configs and files - file( - COPY "${PROJECT_RESOURCE_FOLDER}" - DESTINATION ${PROJECT_DESTINATION_RESOURCES_FOLDER}/.. - ) - -# Managing additional source files - # Declare json files - set( - ADDITIONAL_RESOURCES - "${PROJECT_RESOURCE_FOLDER}/TechTree.json" - "${PROJECT_RESOURCE_FOLDER}/Settings.json" + # https://discourse.cmake.org/t/copying-files-with-destination-folder-depending-on-build-config/10686 + add_custom_target(SyncResourceDir + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different + "${PROJECT_RESOURCE_FOLDER}" + "${PROJECT_DESTINATION_RESOURCES_FOLDER}" + COMMENT "Synchronize resources directories" ) - # Copy json files if file updates - foreach(CURRENT_FILE ${ADDITIONAL_RESOURCES}) - configure_file( - ${CURRENT_FILE} - ${PROJECT_DESTINATION_RESOURCES_FOLDER} - COPYONLY - ) - endforeach() + add_dependencies(${MAIN_TARGET_NAME} SyncResourceDir) # Qt libs linking aka copying dependecies to the standalone release version of the project # Find the qt libs deploy program diff --git a/src/Core/Faction.hpp b/src/Core/Faction.hpp index 4db6ab1..98b9e5e 100644 --- a/src/Core/Faction.hpp +++ b/src/Core/Faction.hpp @@ -29,7 +29,8 @@ class Faction QString displayNameDescription; QMap techTree; public: - inline static const int BASIC_FACTION_COUNT = 12; + inline static constexpr int MINIMAL_FACTION_COUNT = 3; // 3 factions are a bare minimum set upped by vanilla + inline static constexpr int MAXIMUM_FACTION_COUNT = 15; // 15 factions are a known game maximum set upped by ZH private: // Methods QMap ParseJsonObject(const QJsonObject& obj); diff --git a/src/Core/ProgramConstants.cpp b/src/Core/ProgramConstants.cpp index 2d70e39..a2ef850 100644 --- a/src/Core/ProgramConstants.cpp +++ b/src/Core/ProgramConstants.cpp @@ -31,3 +31,8 @@ void ProgramConstants::InitializeTranslations() Languages.insert(i, {file.completeBaseName().toLower(), Windows::Locale::LanguageName(file.completeBaseName().toLower())}); } } + +void ProgramConstants::InitializeProfiles() +{ + +} diff --git a/src/Core/ProgramConstants.hpp b/src/Core/ProgramConstants.hpp index 314ee27..120712c 100644 --- a/src/Core/ProgramConstants.hpp +++ b/src/Core/ProgramConstants.hpp @@ -35,18 +35,28 @@ class ProgramConstants // Colors const QString LINK_COLOR = "#baff0c"; - // Folders + // General strings + const QString STYLES_FILENAME = "Styles.css"; + const QString TECH_TREE_FILENAME = "TechTree.json"; + const QString G_FOLDER_NAME = "Generals"; + const QString GZH_FOLDER_NAME = "GeneralsZH"; + const QString ICONS_FOLDER_NAME = "Icons"; + + // General editor folders + const QString QT_ICONS_FOLDER = ":/icons"; const QString RESOURCE_FOLDER = "Resources"; const QString BINARIES_FOLDER = RESOURCE_FOLDER + "\\Binaries"; const QString TRANSLATIONS_FOLDER = RESOURCE_FOLDER + "/Translations"; - const QString ICONS_FOLDER = RESOURCE_FOLDER + "/Icons"; - const QString THEME_FOLDER = RESOURCE_FOLDER + "/Theme"; - const QString QT_ICONS_FOLDER = ":/icons"; - - // Resource files - const QString TECH_TREE_FILE = RESOURCE_FOLDER + "/TechTree.json"; + + // Profile folders + const QString PROFILES_FOLDER = RESOURCE_FOLDER + "/Profiles"; + const QString G_PROFILE_FOLDER = PROFILES_FOLDER + "/" + G_FOLDER_NAME; + const QString GZH_PROFILE_FOLDER = PROFILES_FOLDER + "/" + GZH_FOLDER_NAME; + const QString MAIN_STYLES_FILE = PROFILES_FOLDER + "/" + STYLES_FILENAME; + + // Profile unrelated resource files const QString SETTINGS_FILE = RESOURCE_FOLDER + "/Settings.json"; - const QString STYLES_SHEET_FILE = THEME_FOLDER + "/Styles.css"; + const QString GLOBAL_STYLES_FILE = RESOURCE_FOLDER + STYLES_FILENAME; // Build-in files const QString MISSING_ICON_FILE = QT_ICONS_FOLDER + "/NoImageSmall.webp"; @@ -101,15 +111,15 @@ class ProgramConstants const QString NON_ASCII_HOTKEY_ERROR_DESCRIPTION = QObject::tr("You have assign as hotkey a non-ASCII character \"%1\".\nMake sure that you are using ASCII only symbols."); const QString FORBIDDEN_HOTKEY_ERROR_DESCRIPTION = QObject::tr("You have assign as hotkey a forbidden character \"%1\".\nMake sure that you are using only allowed symbols."); - // Other string constants + // CSF string constants const QString HOTKEY_CSF_CATEGORY = "CONTROLBAR"; const QString OBJECT_CSF_CATEGORY = "OBJECT"; const QString BIG_ARCHIVE_CSF_PATH = "Data\\English\\generals.csf"; // Constant containers - const QVector GLA_SHORT_NAMES = {"GLA", "TOX", "STL", "DML"}; - const QVector USA_SHORT_NAMES = {"USA", "SWG", "AIR", "LSR"}; - const QVector PRC_SHORT_NAMES = {"PRC", "TNK", "INF", "NUK"}; + const QVector GLA_SHORT_NAMES = {"GLA", "TOX", "STL", "DML", "DTS"}; + const QVector USA_SHORT_NAMES = {"USA", "SWG", "AIR", "LSR", "IRS"}; + const QVector PRC_SHORT_NAMES = {"PRC", "TNK", "INF", "NUK", "LNG"}; const QSet DEFAULT_ALLOWED_KEYS = { @@ -159,4 +169,6 @@ class ProgramConstants void InitializeFileSettings(); /// @brief Parse `*.qm` files in the `Resources\Translations` folder. void InitializeTranslations(); + /// @brief Parse folders in `Resources\Profiles` folder. + void InitializeProfiles(); }; diff --git a/src/GUI/CMakeLists.txt b/src/GUI/CMakeLists.txt index 098307b..d198d89 100644 --- a/src/GUI/CMakeLists.txt +++ b/src/GUI/CMakeLists.txt @@ -120,6 +120,3 @@ # Link the libwebp target to the GUI target target_link_libraries(${TARGET_NAME} PRIVATE ${LIB_WEBP_TARGET_NAME}) - -# Copy Styles.css with updates - configure_file("${PROJECT_RESOURCE_FOLDER}/Theme/Styles.css" "${PROJECT_DESTINATION_RESOURCES_FOLDER}/Theme/Styles.css") diff --git a/src/GUI/EditorWindow.cpp b/src/GUI/EditorWindow.cpp index 338009c..2c2d75a 100644 --- a/src/GUI/EditorWindow.cpp +++ b/src/GUI/EditorWindow.cpp @@ -8,14 +8,15 @@ #include #include +#include "../Extensions/ExceptionExt.hpp" #include "../Extensions/BoolExt.hpp" #include "../Extensions/L10NExt.hpp" -#include "../Windows/Registry.hpp" -#include "../Windows/Locale.hpp" -#include "../Parsers/CSFParser.hpp" #include "../Core/Logger.hpp" #include "../Core/Convert.hpp" +#include "../Parsers/CSFParser.hpp" #include "../Managers/FactionsManager.hpp" +#include "../Windows/Registry.hpp" +#include "../Windows/Locale.hpp" #include "../Info.hpp" #include "ImageManager.hpp" @@ -58,58 +59,86 @@ EditorWindow::EditorWindow(QWidget* parent) int factonsCount = FACTIONS_MANAGER->Count(); size_t language = PROGRAM_CONSTANTS->pSettingsFile->GetLanguage(); - if (factonsCount == Faction::BASIC_FACTION_COUNT) + ltFactions = new QHBoxLayout(); + ltFactions->setObjectName(nameof(ltFactions)); + + if (factonsCount > Faction::MAXIMUM_FACTION_COUNT) { - ltFactions = new QHBoxLayout(); - ltFactions->setObjectName(nameof(ltFactions)); + throw ExceptionExt("Unable to parse more than " + ToQString(Faction::MAXIMUM_FACTION_COUNT) + " factions. Found factions: " + factonsCount); + } - // Only 3 blocks with factions and subfactions. 4 in each block and 12 in total - for (int sectionIndex = 0; sectionIndex < Faction::BASIC_FACTION_COUNT; sectionIndex += 4) - { - QVBoxLayout* ltCurrentFaction = new QVBoxLayout(); - QHBoxLayout* ltCurrentSubfaction = new QHBoxLayout(); - ltCurrentFaction->setObjectName(nameof(ltCurrentFaction)); - ltCurrentSubfaction->setObjectName(nameof(ltCurrentSubfaction)); + if (factonsCount < Faction::MINIMAL_FACTION_COUNT) + { + throw ExceptionExt("Unable to parse less than " + ToQString(Faction::MINIMAL_FACTION_COUNT) + " factions. Found factions: " + factonsCount); + } - for (int i = 0; i < 4; ++i) - { - const Faction currFaction = FACTIONS_MANAGER->FindByIndex(sectionIndex + i); + QVBoxLayout* ltFactionsUSA = new QVBoxLayout(); + QHBoxLayout* ltSubfactionsUSA = new QHBoxLayout(); + ltFactionsUSA->setObjectName(nameof(ltFactionsUSA)); + ltSubfactionsUSA->setObjectName(nameof(ltSubfactionsUSA)); + + QVBoxLayout* ltFactionsPRC = new QVBoxLayout(); + QHBoxLayout* ltSubfactionsPRC = new QHBoxLayout(); + ltFactionsPRC->setObjectName(nameof(ltFactionsPRC)); + ltSubfactionsPRC->setObjectName(nameof(ltSubfactionsPRC)); + + QVBoxLayout* ltFactionsGLA = new QVBoxLayout(); + QHBoxLayout* ltSubfactionsGLA = new QHBoxLayout(); + ltFactionsGLA->setObjectName(nameof(ltFactionsGLA)); + ltSubfactionsGLA->setObjectName(nameof(ltSubfactionsGLA)); + + #define ADD_TO_LAYOUT(x) \ + { \ + if (PROGRAM_CONSTANTS->x##_SHORT_NAMES.contains(shortName)) \ + { \ + factionButton->setProperty("faction", QString(#x)); \ + if (shortName == QString(#x)) \ + ltFactions##x->addWidget(factionButton); \ + else \ + ltSubfactions##x->addWidget(factionButton); \ + } \ + } - QPushButton* factionButton = new QPushButton{currFaction.GetDisplayName()}; - factionButton->setToolTip(currFaction.GetDisplayNameDescription()); + for (int i = 0; i < FACTIONS_MANAGER->Count(); ++i) + { + const Faction& currFaction = FACTIONS_MANAGER->FindByIndex(i); - auto shortName = currFaction.GetShortName(); + QPushButton* factionButton = new QPushButton(currFaction.GetDisplayName()); + factionButton->setToolTip(currFaction.GetDisplayNameDescription()); - if (PROGRAM_CONSTANTS->USA_SHORT_NAMES.contains(shortName)) - factionButton->setProperty("faction", "USA"); + QString shortName = currFaction.GetShortName(); - if (PROGRAM_CONSTANTS->PRC_SHORT_NAMES.contains(shortName)) - factionButton->setProperty("faction", "PRC"); + ADD_TO_LAYOUT(USA); + ADD_TO_LAYOUT(PRC); + ADD_TO_LAYOUT(GLA); - if (PROGRAM_CONSTANTS->GLA_SHORT_NAMES.contains(shortName)) - factionButton->setProperty("faction", "GLA"); + connect(factionButton, &QPushButton::pressed, this, [=, this]() + { + SetGameObjectList(shortName); + }); - connect(factionButton, &QPushButton::pressed, this, [=, this]() - { - SetGameObjectList(shortName); - }); + pFactionsButtonsGroup->addButton(factionButton); + } + + #undef ADD_TO_LAYOUT + + #define RM_IF_EMPTY(x) \ + { \ + if (!ltSubfactions##x->count()) \ + ltSubfactions##x->deleteLater(); \ + else \ + ltFactions##x->addLayout(ltSubfactions##x); \ + } - pFactionsButtonsGroup->addButton(factionButton); + RM_IF_EMPTY(USA); + RM_IF_EMPTY(PRC); + RM_IF_EMPTY(GLA); - if (i == 0) // main faction - ltCurrentFaction->addWidget(factionButton); - else // subfactions - ltCurrentSubfaction->addWidget(factionButton); - } + #undef RM_IF_EMPTY - ltCurrentFaction->addLayout(ltCurrentSubfaction); - ltFactions->addLayout(ltCurrentFaction); - } - } - else - { - LOGMSG("Unable to parse more than 12 factions. Found factions : " + factonsCount); - } + ltFactions->addLayout(ltFactionsUSA); + ltFactions->addLayout(ltFactionsPRC); + ltFactions->addLayout(ltFactionsGLA); connect(pFactionsButtonsGroup, &QButtonGroup::idClicked, this, [=, this](int id) { @@ -136,7 +165,7 @@ EditorWindow::EditorWindow(QWidget* parent) QHBoxLayout* pKeyboardThirdLine; QVBoxLayout* pKeyboardLines = new QVBoxLayout(); - QPushButton* btnEmptyButton= new QPushButton(); + QPushButton* btnEmptyButton = new QPushButton(); btnEmptyButton->setProperty("key", "null"); btnEmptyButton->setFixedWidth(PROGRAM_CONSTANTS->EMPTY_KEY_WIDTH); @@ -561,10 +590,15 @@ void EditorWindow::ActSave_Triggered() if (CSF_PARSER->Path.ends_with(L".big") || CSF_PARSER->Path.ends_with(L".BIG")) { - CSF_PARSER->Path = (QString::fromStdWString( - Windows::Registry::GetPathToGame( - Windows::Registry::Games::GeneralsZeroHour)) - + "Data\\English\\generals.csf"q).toStdWString(); + CSF_PARSER->Path = + ( + ( + WINDOW_MANAGER->ProfileFolder.split('/')[2] == PROGRAM_CONSTANTS->G_FOLDER_NAME + ? QString::fromStdWString(Windows::Registry::GetPathToGame(Windows::Registry::Games::Generals)) + : QString::fromStdWString(Windows::Registry::GetPathToGame(Windows::Registry::Games::GeneralsZeroHour)) + ) + + "Data\\English\\generals.csf"q + ).toStdWString(); } CSF_PARSER->Save(); @@ -629,4 +663,3 @@ void EditorWindow::SettingsWindow_LanguageChanged() } #pragma endregion - diff --git a/src/GUI/GreetingWindow.cpp b/src/GUI/GreetingWindow.cpp deleted file mode 100644 index 2b7bac0..0000000 --- a/src/GUI/GreetingWindow.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include -#include -#include -#include - -#include "../Windows/Locale.hpp" -#include "../Core/Logger.hpp" -#include "../Core/ProgramConstants.hpp" -#include "WindowManager.hpp" -#include "ImageManager.hpp" -#include "GreetingWindow.hpp" - -GreetingWindow::GreetingWindow(QWidget* parent) : QWidget(parent) -{ - QPushButton* btnLoadFromGame = nullptr; - QPushButton* btnLoadFromFile = nullptr; - QHBoxLayout* ltButtons = nullptr; - QVBoxLayout* ltMain = nullptr; - QHBoxLayout* ltSettings = nullptr; - QVBoxLayout* ltLanguages = nullptr; - - // Add "New Project" and "Load Project" buttons to the window - btnLoadFromGame = new QPushButton(tr("LOAD FROM") + '\n' + tr("THE GAME")); - btnLoadFromGame->setFixedSize(PROGRAM_CONSTANTS->START_BUTTON_SIZE); - btnLoadFromGame->setObjectName(nameof(btnLoadFromGame)); - connect(btnLoadFromGame, &QPushButton::clicked, this, &GreetingWindow::btnLoadFromGameClicked); - - btnLoadFromFile = new QPushButton(tr("LOAD FROM") + '\n' + tr("THE FILE")); - btnLoadFromFile->setFixedSize(PROGRAM_CONSTANTS->START_BUTTON_SIZE); - btnLoadFromFile->setObjectName(nameof(btnLoadFromFile)); - connect(btnLoadFromFile, &QPushButton::clicked, this, &GreetingWindow::btnLoadFromFileClicked); - - QPushButton* btnSettings = new QPushButton(); - QPixmap pxmSettings = QPixmap{PROGRAM_CONSTANTS->GEARS_ICON_FILE}; - btnSettings->setObjectName(nameof(btnSettings)); - btnSettings->setIcon(pxmSettings); - btnSettings->setIconSize(pxmSettings.size()); - btnSettings->setFixedSize(pxmSettings.size()); - connect(btnSettings, &QPushButton::clicked, this, &GreetingWindow::btnSettingsClicked); - - ltLanguages = new QVBoxLayout(); - ltLanguages->addStretch(1); - - ltSettings = new QHBoxLayout(); - ltSettings->addLayout(ltLanguages); - ltSettings->addWidget(btnSettings); - - ltButtons = new QHBoxLayout(); - ltButtons->setSpacing(50); - ltButtons->setAlignment(Qt::AlignTop); - ltButtons->addWidget(btnLoadFromGame); - ltButtons->addWidget(btnLoadFromFile); - ltButtons->setSpacing(30); - - ltMain = new QVBoxLayout(); - ltMain->setAlignment(Qt::AlignCenter); - ltMain->addLayout(ltButtons); - ltMain->addLayout(ltSettings); - ltMain->setSpacing(20); - ltMain->setContentsMargins(160, 120, 160, 120); - - setLayout(ltMain); -} - diff --git a/src/GUI/GreetingWindow.hpp b/src/GUI/GreetingWindow.hpp deleted file mode 100644 index 83e19cf..0000000 --- a/src/GUI/GreetingWindow.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include -#include "../Core/ProgramConstants.hpp" - -class GreetingWindow : public QWidget -{ - Q_OBJECT -public: // Methods - GreetingWindow(QWidget* parent = nullptr); - -signals: - void btnLoadFromFileClicked(); - void btnLoadFromGameClicked(); - void btnSettingsClicked(); -}; diff --git a/src/GUI/ImageManager.cpp b/src/GUI/ImageManager.cpp index f8c71fe..b231f83 100644 --- a/src/GUI/ImageManager.cpp +++ b/src/GUI/ImageManager.cpp @@ -4,6 +4,7 @@ #include "../../libs/libwebp/src/webp/decode.h" #include "../Core/Logger.hpp" +#include "WindowManager.hpp" #include "ImageManager.hpp" QImage ImageManager::DecodeWebpIcon(const QString& iconName) @@ -12,8 +13,8 @@ QImage ImageManager::DecodeWebpIcon(const QString& iconName) const auto it = ImagesCache.constFind(iconName); if (it != ImagesCache.constEnd()) return it.value(); - // Find - const QFileInfo targetIconFile = FindIconFile(PROGRAM_CONSTANTS->ICONS_FOLDER, iconName); + // Search for specific image + const QFileInfo targetIconFile = FindIconFile(WINDOW_MANAGER->ProfileFolder + "/" + PROGRAM_CONSTANTS->ICONS_FOLDER_NAME, iconName); if (targetIconFile.exists()) { @@ -74,7 +75,7 @@ QImage ImageManager::DecodeWebpIconPath(const QString& iconPath) { if (!iconPath.isEmpty()) { - LOGMSG("No icon file [" + iconFile.fileName() + "] was found"); + LOGMSG("Icon file [" + iconFile.fileName() + "] was not found"); } return DecodeMissingWebpIcon(); } diff --git a/src/GUI/LoadFromTheFileWindow.cpp b/src/GUI/LoadFromTheFileWindow.cpp deleted file mode 100644 index 2888e76..0000000 --- a/src/GUI/LoadFromTheFileWindow.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../Extensions/StringExt.hpp" -#include "LoadFromTheFileWindow.hpp" - -LoadFromTheFileWindow::LoadFromTheFileWindow(QWidget* parent) : QWidget(parent) -{ - QHBoxLayout* ltOkAndCancel = new QHBoxLayout(); - QPushButton* btnOk = new QPushButton(tr("START")); - QPushButton* btnCancel = new QPushButton(tr("BACK")); - QHBoxLayout* ltBtnOk = new QHBoxLayout(); - QHBoxLayout* ltBtnCancel = new QHBoxLayout(); - QLabel* lblSelectFile = new QLabel(tr("Select .csf or .big file:")); - - btnOk->setObjectName(nameof(btnOk)); - btnOk->setFixedWidth(80); - ltBtnOk->setAlignment(Qt::Alignment::enum_type::AlignRight); - ltBtnOk->addWidget(btnOk); - btnCancel->setObjectName(nameof(btnCancel)); - btnCancel->setFixedWidth(80); - ltBtnCancel->setAlignment(Qt::Alignment::enum_type::AlignLeft); - ltBtnCancel->addWidget(btnCancel); - ltOkAndCancel->addLayout(ltBtnOk); - ltOkAndCancel->addLayout(ltBtnCancel); - connect(btnOk, &QPushButton::clicked, this, [=, this] { emit btnStartClicked(); }); - connect(btnCancel, &QPushButton::clicked, this, [=, this] { emit btnBackClicked(); }); - - lblSelectFile->setObjectName(nameof(lblSelectFile)); - lblSelectFile->setAlignment(Qt::AlignLeft); - - QLineEdit* lneFilePath = new QLineEdit(); - lneFilePath->setObjectName(nameof(lneFilePath)); - lneFilePath->setMaximumWidth(700); - connect(lneFilePath, &QLineEdit::textChanged, this, [=, this] - { - QString tmp = lneFilePath->text(); - - if (tmp.startsWith("file:///")) - tmp.remove("file:///"); - - while (tmp.startsWith("\"") || tmp.endsWith("\"")) - { - if (tmp.startsWith("\"")) - tmp.remove(0, 1); - - if (tmp.endsWith("\"")) - tmp.remove(tmp.length() - 1, 1); - } - - lneFilePath->setText(tmp); - }); - - QFont font(lneFilePath->font()); - font.setPointSize(font.pointSize()-2); // reduce standart font size - lneFilePath->setFont(font); - - QFileDialog* fileDialog = new QFileDialog(); // dialog for selecting the path to the file - fileDialog->setFileMode(QFileDialog::FileMode::ExistingFile); - fileDialog->setAcceptMode(QFileDialog::AcceptMode::AcceptOpen); - fileDialog->setNameFilters({tr("Binary files") + " (*.csf *.big)", - tr("Any files") + " (*)"}); - connect(fileDialog, &QFileDialog::fileSelected, lneFilePath, &QLineEdit::setText); - - QPushButton* btnReview = new QPushButton(tr("REVIEW")); - btnReview->setObjectName(nameof(btnReview)); - btnReview->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - connect(btnReview, &QPushButton::clicked, fileDialog, &QFileDialog::exec); - - QHBoxLayout* ltReview = new QHBoxLayout(); - ltReview->addWidget(lneFilePath); - ltReview->addSpacing(5); - ltReview->addWidget(btnReview); - - QVBoxLayout* ltMain = new QVBoxLayout(); - ltMain->setContentsMargins(80,0,80,0); - ltMain->setAlignment(Qt::Alignment::enum_type::AlignCenter); - ltMain->addStretch(3); - ltMain->addWidget(lblSelectFile); - ltMain->addSpacing(5); - ltMain->addLayout(ltReview); - ltMain->addStretch(2); - ltMain->addLayout(ltOkAndCancel); - ltMain->addStretch(1); - - setLayout(ltMain); -} diff --git a/src/GUI/LoadFromTheFileWindow.hpp b/src/GUI/LoadFromTheFileWindow.hpp deleted file mode 100644 index 28a1b96..0000000 --- a/src/GUI/LoadFromTheFileWindow.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include - -class LoadFromTheFileWindow : public QWidget -{ - Q_OBJECT -public: // Methods - LoadFromTheFileWindow(QWidget *parent = nullptr); -signals: - void btnBackClicked(); - void btnStartClicked(); -}; diff --git a/src/GUI/LoadFromTheGameWindow.cpp b/src/GUI/LoadFromTheGameWindow.cpp deleted file mode 100644 index cfa3427..0000000 --- a/src/GUI/LoadFromTheGameWindow.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "../Windows/Registry.hpp" -#include "../Core/Logger.hpp" -#include "LoadFromTheGameWindow.hpp" - -LoadFromTheGameWindow::LoadFromTheGameWindow(QWidget* parent) : QWidget(parent) -{ - QHBoxLayout* ltOkAndCancel = new QHBoxLayout(); - QPushButton* btnOk = new QPushButton(tr("START")); - QPushButton* btnCancel = new QPushButton(tr("BACK")); - QHBoxLayout* ltBtnOk = new QHBoxLayout(); - QHBoxLayout* ltBtnCancel = new QHBoxLayout(); - - btnOk->setObjectName("btnOk"); - btnOk->setFixedWidth(80); - btnOk->setObjectName(nameof(btnOk)); - ltBtnOk->setAlignment(Qt::Alignment::enum_type::AlignRight); - ltBtnOk->addWidget(btnOk); - btnCancel->setObjectName("btnCancel"); - btnCancel->setFixedWidth(80); - btnCancel->setObjectName(nameof(btnCancel)); - ltBtnCancel->setAlignment(Qt::Alignment::enum_type::AlignLeft); - ltBtnCancel->addWidget(btnCancel); - ltOkAndCancel->addLayout(ltBtnOk); - ltOkAndCancel->addLayout(ltBtnCancel); - - connect(btnOk, &QPushButton::clicked, this, [=, this] { emit btnStartClicked(); }); - connect(btnCancel, &QPushButton::clicked, this, [=, this] { emit btnBackClicked(); }); - - // configure game buttons - QRadioButton* rdxGenerals = new QRadioButton(Windows::Registry::ToQString(Windows::Registry::Games::Generals)); - rdxGenerals->setDisabled(true); - rdxGenerals->setObjectName(nameof(rdxGenerals)); - QFont rbxGeneralsFont = rdxGenerals->font(); - rbxGeneralsFont.setStrikeOut(true); - rdxGenerals->setFont(rbxGeneralsFont); - - QRadioButton* rdxZeroHour = new QRadioButton(Windows::Registry::ToQString(Windows::Registry::Games::GeneralsZeroHour)); - rdxZeroHour->setChecked(true); - rdxGenerals->setObjectName(nameof(rdxGenerals)); - - QVBoxLayout* ltChoiseGame = new QVBoxLayout(); - ltChoiseGame->addWidget(rdxGenerals); - ltChoiseGame->addWidget(rdxZeroHour); - - // configure dialog view - QVBoxLayout* ltMainBlock = new QVBoxLayout(); - ltMainBlock->setAlignment(Qt::Alignment::enum_type::AlignCenter); - ltMainBlock->addStretch(5); - ltMainBlock->addLayout(ltChoiseGame); - ltMainBlock->addStretch(5); - ltMainBlock->addLayout(ltOkAndCancel); - ltMainBlock->addStretch(1); - setLayout(ltMainBlock); -} diff --git a/src/GUI/LoadFromTheGameWindow.hpp b/src/GUI/LoadFromTheGameWindow.hpp deleted file mode 100644 index 560f512..0000000 --- a/src/GUI/LoadFromTheGameWindow.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include - -class LoadFromTheGameWindow : public QWidget -{ - Q_OBJECT -public: // Methods - LoadFromTheGameWindow(QWidget* parent = nullptr); -signals: - void btnBackClicked(); - void btnStartClicked(); -}; diff --git a/src/GUI/LoadWindow.cpp b/src/GUI/LoadWindow.cpp new file mode 100644 index 0000000..0534317 --- /dev/null +++ b/src/GUI/LoadWindow.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../Extensions/StringExt.hpp" +#include "LoadWindow.hpp" + +LoadWindow::LoadWindow(QWidget* parent) : QWidget(parent) +{ + const int SPACING = 10; + const int BUTTON_WIDTH = 80; + QVBoxLayout* ltBottomButtons = new QVBoxLayout(); + QHBoxLayout* ltOkAndCancel = new QHBoxLayout(); + QPushButton* btnOk = new QPushButton(tr("START")); + QPushButton* btnCancel = new QPushButton(tr("BACK")); + QPushButton* btnFromGame = new QPushButton(tr("FROM THE GAME")); + QLabel* lblSelectFile = new QLabel(tr("Select .csf or .big file:")); + + btnOk->setObjectName(nameof(btnOk)); + btnOk->setFixedWidth(BUTTON_WIDTH); + btnCancel->setObjectName(nameof(btnCancel)); + btnCancel->setFixedWidth(BUTTON_WIDTH); + btnFromGame->setObjectName(nameof(btnFromGame)); + btnFromGame->setFixedWidth(btnCancel->width() * 2 + SPACING); + ltOkAndCancel->addWidget(btnOk); + ltOkAndCancel->addWidget(btnCancel); + ltBottomButtons->setAlignment(Qt::AlignmentFlag::AlignCenter); + ltBottomButtons->setSpacing(SPACING); + ltBottomButtons->addWidget(btnFromGame); + ltBottomButtons->addLayout(ltOkAndCancel); + connect(btnOk, &QPushButton::clicked, this, [=, this] { emit btnStartClicked(); }); + connect(btnCancel, &QPushButton::clicked, this, [=, this] { emit btnBackClicked(); }); + connect(btnFromGame, &QPushButton::clicked, this, [=, this] { emit btnFromGameClicked(); }); + + lblSelectFile->setObjectName(nameof(lblSelectFile)); + lblSelectFile->setAlignment(Qt::AlignLeft); + + QLineEdit* lneFilePath = new QLineEdit(); + lneFilePath->setObjectName(nameof(lneFilePath)); + lneFilePath->setMaximumWidth(700); + connect(lneFilePath, &QLineEdit::textChanged, this, &LoadWindow::lneFilePath_textChanged); + + QFont font(lneFilePath->font()); + font.setPointSize(font.pointSize()-2); // reduce standart font size + lneFilePath->setFont(font); + + QFileDialog* fileDialog = new QFileDialog(); // dialog for selecting the path to the file + fileDialog->setFileMode(QFileDialog::FileMode::ExistingFile); + fileDialog->setAcceptMode(QFileDialog::AcceptMode::AcceptOpen); + fileDialog->setNameFilters({tr("Binary files") + " (*.csf *.big)", + tr("Any files") + " (*)"}); + connect(fileDialog, &QFileDialog::fileSelected, lneFilePath, &QLineEdit::setText); + + QPushButton* btnReview = new QPushButton(tr("REVIEW")); + btnReview->setObjectName(nameof(btnReview)); + btnReview->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + connect(btnReview, &QPushButton::clicked, fileDialog, &QFileDialog::exec); + + QHBoxLayout* ltReview = new QHBoxLayout(); + ltReview->addWidget(lneFilePath); + ltReview->addSpacing(5); + ltReview->addWidget(btnReview); + + QVBoxLayout* ltMain = new QVBoxLayout(); + ltMain->setContentsMargins(80, 0, 80, 0); + ltMain->setAlignment(Qt::AlignmentFlag::AlignCenter); + ltMain->addStretch(3); + ltMain->addWidget(lblSelectFile); + ltMain->addSpacing(5); + ltMain->addLayout(ltReview); + ltMain->addStretch(2); + ltMain->addLayout(ltBottomButtons); + ltMain->addStretch(1); + + setLayout(ltMain); +} + +void LoadWindow::lneFilePath_textChanged() +{ + auto* le = qobject_cast(sender()); + QString tmp = le->text(); + + if (tmp.startsWith("file:///")) + tmp.remove("file:///"); + + while (tmp.startsWith("\"") || tmp.endsWith("\"")) + { + if (tmp.startsWith("\"")) + tmp.remove(0, 1); + + if (tmp.endsWith("\"")) + tmp.remove(tmp.length() - 1, 1); + } + + le->setText(tmp); +} diff --git a/src/GUI/LoadWindow.hpp b/src/GUI/LoadWindow.hpp new file mode 100644 index 0000000..b936650 --- /dev/null +++ b/src/GUI/LoadWindow.hpp @@ -0,0 +1,15 @@ +#pragma once +#include + +class LoadWindow : public QWidget +{ + Q_OBJECT +public: // Methods + LoadWindow(QWidget *parent = nullptr); +signals: + void btnBackClicked(); + void btnStartClicked(); + void btnFromGameClicked(); +private slots: + void lneFilePath_textChanged(); +}; diff --git a/src/GUI/SelectProfileWindow.cpp b/src/GUI/SelectProfileWindow.cpp new file mode 100644 index 0000000..2c8c38d --- /dev/null +++ b/src/GUI/SelectProfileWindow.cpp @@ -0,0 +1,67 @@ +#include +#include "../Extensions/StringExt.hpp" +#include "../Core/Logger.hpp" +#include "../Core/ProgramConstants.hpp" +#include "SelectProfileWindow.hpp" + +using namespace StringExt; + +SelectProfileWindow::SelectProfileWindow(QWidget* parent) : QWidget(parent) +{ + ltMain = new QVBoxLayout(); + ltProfiles = new QHBoxLayout(); + ltGameProfiles = new QVBoxLayout(); + ltCustomProfiles = new QVBoxLayout(); + btnGenerals = new QPushButton(tr(PROGRAM_CONSTANTS->G_FOLDER_NAME.toStdString().c_str())); + btnGeneralsZH = new QPushButton(tr(PROGRAM_CONSTANTS->GZH_FOLDER_NAME.toStdString().c_str())); + btnSettings = new QPushButton(); + + btnGenerals->setObjectName(nameof(btnGenerals)); + connect(btnGenerals, &QPushButton::clicked, this, &SelectProfileWindow::BtnGenerals_Clicked); + btnGeneralsZH->setObjectName(nameof(btnGeneralsZH)); + connect(btnGeneralsZH, &QPushButton::clicked, this, &SelectProfileWindow::BtnGeneralsZH_Clicked); + QPixmap pxmSettings = QPixmap(PROGRAM_CONSTANTS->GEARS_ICON_FILE); + btnSettings->setObjectName(nameof(btnSettings)); + btnSettings->setIcon(pxmSettings); + btnSettings->setIconSize(pxmSettings.size()); + btnSettings->setFixedSize(pxmSettings.size()); + connect(btnSettings, &QPushButton::clicked, this, &SelectProfileWindow::BtnSettings_Clicked); + ltGameProfiles->addWidget(btnGenerals); + ltGameProfiles->addWidget(btnGeneralsZH); + + QDir profilesDir(PROGRAM_CONSTANTS->PROFILES_FOLDER); + auto list = profilesDir.entryList(QDir::Filter::Dirs | QDir::Filter::NoDotAndDotDot, QDir::SortFlag::Name); + list.removeOne(PROGRAM_CONSTANTS->G_FOLDER_NAME); + list.removeOne(PROGRAM_CONSTANTS->GZH_FOLDER_NAME); + for (const auto& elem : list) + { + LOGMSG("Add custom profile " + elem); + QPushButton* btnCustomProfile = new QPushButton(); + btnCustomProfile->setObjectName(nameof(btnCustomProfile)); + btnCustomProfile->setProperty("profileName", "btn"q + elem); + btnCustomProfile->setText(elem); + connect(btnCustomProfile, &QPushButton::clicked, this, &SelectProfileWindow::BtnCustomProfile_Clicked); + ltCustomProfiles->addWidget(btnCustomProfile); + } + + ltProfiles->addLayout(ltGameProfiles); + ltProfiles->addLayout(ltCustomProfiles); + + ltMain->setAlignment(Qt::AlignmentFlag::AlignHCenter); + ltMain->addLayout(ltProfiles); + ltMain->addWidget(btnSettings, 0, Qt::AlignmentFlag::AlignHCenter); + + setLayout(ltMain); +} + +void SelectProfileWindow::BtnSettings_Clicked() { emit settingsClicked(); } +void SelectProfileWindow::BtnGenerals_Clicked() { emit gProfileSelected(); } +void SelectProfileWindow::BtnGeneralsZH_Clicked() { emit gzhProfileSelected(); } +void SelectProfileWindow::BtnCustomProfile_Clicked() +{ + auto btn = qobject_cast(sender()); + if (btn == nullptr) + return; + + emit customProfileSelected(btn->text()); +} diff --git a/src/GUI/SelectProfileWindow.hpp b/src/GUI/SelectProfileWindow.hpp new file mode 100644 index 0000000..20953bb --- /dev/null +++ b/src/GUI/SelectProfileWindow.hpp @@ -0,0 +1,30 @@ +#pragma once +#include +#include +#include +#include "../Core/ProgramConstants.hpp" + +class SelectProfileWindow : public QWidget +{ + Q_OBJECT +private: // Data + QVBoxLayout* ltMain = nullptr; + QHBoxLayout* ltProfiles = nullptr; + QVBoxLayout* ltGameProfiles = nullptr; + QVBoxLayout* ltCustomProfiles = nullptr; + QPushButton* btnGenerals = nullptr; + QPushButton* btnGeneralsZH = nullptr; + QPushButton* btnSettings = nullptr; +public: // Methods + SelectProfileWindow(QWidget* parent = nullptr); +signals: + void gProfileSelected(); + void gzhProfileSelected(); + void customProfileSelected(QString data); + void settingsClicked(); +private slots: + void BtnGenerals_Clicked(); + void BtnGeneralsZH_Clicked(); + void BtnCustomProfile_Clicked(); + void BtnSettings_Clicked(); +}; diff --git a/src/GUI/SetUpWindowsWrapper.cpp b/src/GUI/SetUpWindowsWrapper.cpp index 302a015..32a1b31 100644 --- a/src/GUI/SetUpWindowsWrapper.cpp +++ b/src/GUI/SetUpWindowsWrapper.cpp @@ -8,7 +8,6 @@ #include "../Core/Logger.hpp" #include "ImageManager.hpp" #include "WindowManager.hpp" -#include "LoadFromTheGameWindow.hpp" #include "SetUpWindowsWrapper.hpp" SetUpWindowsWrapper::SetUpWindowsWrapper(QWidget* parent) : QStackedWidget(parent) @@ -20,111 +19,107 @@ SetUpWindowsWrapper::SetUpWindowsWrapper(QWidget* parent) : QStackedWidget(paren ~Qt::WindowMinimizeButtonHint); AddWidgets(); - setCurrentWidget(pGreetingWidget); + setCurrentWidget(pSelectProfileWindow); AttachConnections(); } void SetUpWindowsWrapper::AttachConnections() { - connect(pSettingsWindow, &SettingsWindow::languageChanged, - this, &SetUpWindowsWrapper::SettingsWindow_LanguageChanged); - - connect(pGreetingWidget, &GreetingWindow::btnLoadFromFileClicked, - this, &SetUpWindowsWrapper::BtnLoadFromFile_Clicked); - - connect(pGreetingWidget, &GreetingWindow::btnLoadFromGameClicked, - this, &SetUpWindowsWrapper::BtnLoadFromGame_Clicked); - - connect(pGreetingWidget, &GreetingWindow::btnSettingsClicked, - this, &SetUpWindowsWrapper::BtnSettings_Clicked); - - connect(pLoadFromTheFileWindow, &LoadFromTheFileWindow::btnBackClicked, - this, &SetUpWindowsWrapper::BtnBack_Clicked); - - connect(pLoadFromTheFileWindow, &LoadFromTheFileWindow::btnStartClicked, - this, &SetUpWindowsWrapper::LoadFromTheFileWindow_AcceptConfiguration); - - connect(pLoadFromTheGameWindow, &LoadFromTheGameWindow::btnBackClicked, - this, &SetUpWindowsWrapper::BtnBack_Clicked); - - connect(pLoadFromTheGameWindow, &LoadFromTheGameWindow::btnStartClicked, - this, &SetUpWindowsWrapper::LoadFromTheGameWindow_AcceptConfiguration); - - connect(pSettingsWindow, &SettingsWindow::btnBackClicked, - this, &SetUpWindowsWrapper::BtnBack_Clicked); + connect(pSelectProfileWindow, &SelectProfileWindow::gProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_GProfileSelected); + connect(pSelectProfileWindow, &SelectProfileWindow::gzhProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_GZHProfileSelected); + connect(pSelectProfileWindow, &SelectProfileWindow::customProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_CustomProfileSelected); + connect(pSelectProfileWindow, &SelectProfileWindow::settingsClicked, + this, &SetUpWindowsWrapper::SelectProfileWindow_SettingsClicked); + + connect(pLoadWindow, &LoadWindow::btnBackClicked, + this, &SetUpWindowsWrapper::BtnBack_Clicked); + connect(pLoadWindow, &LoadWindow::btnStartClicked, + this, &SetUpWindowsWrapper::LoadWindow_LoadFromTheFile); + connect(pLoadWindow, &LoadWindow::btnFromGameClicked, + this, &SetUpWindowsWrapper::LoadWindow_LoadFromTheGame); + + connect(pSettingsWindow, &SettingsWindow::languageChanged, + this, &SetUpWindowsWrapper::SettingsWindow_LanguageChanged); + connect(pSettingsWindow, &SettingsWindow::btnBackClicked, + this, &SetUpWindowsWrapper::BtnBack_Clicked); } void SetUpWindowsWrapper::DetachConnections() { - disconnect(pSettingsWindow, &SettingsWindow::languageChanged, - this, &SetUpWindowsWrapper::SettingsWindow_LanguageChanged); - - disconnect(pGreetingWidget, &GreetingWindow::btnLoadFromFileClicked, - this, &SetUpWindowsWrapper::BtnLoadFromFile_Clicked); - - disconnect(pGreetingWidget, &GreetingWindow::btnLoadFromGameClicked, - this, &SetUpWindowsWrapper::BtnLoadFromGame_Clicked); - - disconnect(pGreetingWidget, &GreetingWindow::btnSettingsClicked, - this, &SetUpWindowsWrapper::BtnBack_Clicked); - - disconnect(pLoadFromTheFileWindow, &LoadFromTheFileWindow::btnBackClicked, + disconnect(pSelectProfileWindow, &SelectProfileWindow::gProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_GProfileSelected); + disconnect(pSelectProfileWindow, &SelectProfileWindow::gzhProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_GZHProfileSelected); + disconnect(pSelectProfileWindow, &SelectProfileWindow::customProfileSelected, + this, &SetUpWindowsWrapper::SelectProfileWindow_CustomProfileSelected); + + disconnect(pLoadWindow, &LoadWindow::btnBackClicked, this, &SetUpWindowsWrapper::BtnBack_Clicked); + disconnect(pLoadWindow, &LoadWindow::btnStartClicked, + this, &SetUpWindowsWrapper::LoadWindow_LoadFromTheFile); + disconnect(pLoadWindow, &LoadWindow::btnFromGameClicked, + this, &SetUpWindowsWrapper::LoadWindow_LoadFromTheGame); - disconnect(pLoadFromTheFileWindow, &LoadFromTheFileWindow::btnStartClicked, - this, &SetUpWindowsWrapper::LoadFromTheFileWindow_AcceptConfiguration); - - disconnect(pLoadFromTheGameWindow, &LoadFromTheGameWindow::btnBackClicked, - this, &SetUpWindowsWrapper::BtnBack_Clicked); - - disconnect(pLoadFromTheGameWindow, &LoadFromTheGameWindow::btnStartClicked, - this, &SetUpWindowsWrapper::LoadFromTheGameWindow_AcceptConfiguration); - + disconnect(pSettingsWindow, &SettingsWindow::languageChanged, + this, &SetUpWindowsWrapper::SettingsWindow_LanguageChanged); disconnect(pSettingsWindow, &SettingsWindow::btnBackClicked, this, &SetUpWindowsWrapper::BtnBack_Clicked); } void SetUpWindowsWrapper::AddWidgets() { - pGreetingWidget = new GreetingWindow(); - pLoadFromTheGameWindow = new LoadFromTheGameWindow(); - pLoadFromTheFileWindow = new LoadFromTheFileWindow(); + pSelectProfileWindow = new SelectProfileWindow(); + pLoadWindow = new LoadWindow(); pSettingsWindow = new SettingsWindow(); - pGreetingWidget->setFixedSize(size()); - pLoadFromTheGameWindow->setFixedSize(size()); - pLoadFromTheFileWindow->setFixedSize(size()); + pSelectProfileWindow->setFixedSize(size()); + pLoadWindow->setFixedSize(size()); pSettingsWindow->setFixedSize(size()); - addWidget(pGreetingWidget); - addWidget(pLoadFromTheGameWindow); - addWidget(pLoadFromTheFileWindow); + addWidget(pSelectProfileWindow); + addWidget(pLoadWindow); addWidget(pSettingsWindow); } +void SetUpWindowsWrapper::DeleteWidgets() +{ + pSelectProfileWindow->deleteLater(); + pLoadWindow->deleteLater(); + pSettingsWindow->deleteLater(); +} + void SetUpWindowsWrapper::SettingsWindow_LanguageChanged() { WINDOW_MANAGER->SetTranslator(); - DetachConnections(); - pGreetingWidget->deleteLater(); - pLoadFromTheGameWindow->deleteLater(); - pLoadFromTheFileWindow->deleteLater(); - pSettingsWindow->deleteLater(); - + DeleteWidgets(); AddWidgets(); AttachConnections(); setCurrentWidget(pSettingsWindow); } -void SetUpWindowsWrapper::BtnLoadFromFile_Clicked() { setCurrentWidget(pLoadFromTheFileWindow); } -void SetUpWindowsWrapper::BtnLoadFromGame_Clicked() { setCurrentWidget(pLoadFromTheGameWindow); } -void SetUpWindowsWrapper::BtnSettings_Clicked() { setCurrentWidget(pSettingsWindow); } -void SetUpWindowsWrapper::BtnBack_Clicked() { WINDOW_MANAGER->SetCSFFilePath(""); setCurrentWidget(pGreetingWidget); } +void SetUpWindowsWrapper::BtnLoadFromFile_Clicked() { setCurrentWidget(pLoadWindow); } +void SetUpWindowsWrapper::SelectProfileWindow_SettingsClicked() { setCurrentWidget(pSettingsWindow); } +void SetUpWindowsWrapper::BtnBack_Clicked() +{ + setCurrentWidget(pSelectProfileWindow); + WINDOW_MANAGER->SetCSFFilePath(""); + WINDOW_MANAGER->ApplyDefaultProfileStyleSheet(); +} + +void SetUpWindowsWrapper::SelectProfileWindow_GProfileSelected() { WINDOW_MANAGER->StartUpWindow_GProfileSelected(); BtnLoadFromFile_Clicked(); } +void SetUpWindowsWrapper::SelectProfileWindow_GZHProfileSelected() { WINDOW_MANAGER->StartUpWindow_GZHProfileSelected(); BtnLoadFromFile_Clicked(); } +void SetUpWindowsWrapper::SelectProfileWindow_CustomProfileSelected(const QString& folder) { WINDOW_MANAGER->StartUpWindow_CustomProfileSelected(folder); BtnLoadFromFile_Clicked(); } -void SetUpWindowsWrapper::LoadFromTheGameWindow_AcceptConfiguration() +void SetUpWindowsWrapper::LoadWindow_LoadFromTheGame() { - const QString gamePath = QString::fromStdWString(Windows::Registry::GetPathToGame(Windows::Registry::Games::GeneralsZeroHour)); + const QString gamePath = WINDOW_MANAGER->ProfileFolder.split('/')[2] == PROGRAM_CONSTANTS->G_FOLDER_NAME + ? QString::fromStdWString(Windows::Registry::GetPathToGame(Windows::Registry::Games::Generals)) + : QString::fromStdWString(Windows::Registry::GetPathToGame(Windows::Registry::Games::GeneralsZeroHour)); + const QString pathDataEngGenCsf = gamePath + "Data\\English\\generals.csf"; if (QFile::exists(pathDataEngGenCsf)) @@ -164,8 +159,8 @@ void SetUpWindowsWrapper::LoadFromTheGameWindow_AcceptConfiguration() WINDOW_MANAGER->StartUpWindow_AcceptConfiguration(); } -void SetUpWindowsWrapper::LoadFromTheFileWindow_AcceptConfiguration() +void SetUpWindowsWrapper::LoadWindow_LoadFromTheFile() { - WINDOW_MANAGER->SetCSFFilePath(pLoadFromTheFileWindow->findChild("lneFilePath", Qt::FindChildrenRecursively)->text()); + WINDOW_MANAGER->SetCSFFilePath(pLoadWindow->findChild("lneFilePath", Qt::FindChildrenRecursively)->text()); WINDOW_MANAGER->StartUpWindow_AcceptConfiguration(); } diff --git a/src/GUI/SetUpWindowsWrapper.hpp b/src/GUI/SetUpWindowsWrapper.hpp index a6939a0..5b49f0d 100644 --- a/src/GUI/SetUpWindowsWrapper.hpp +++ b/src/GUI/SetUpWindowsWrapper.hpp @@ -1,17 +1,15 @@ #pragma once #include -#include "GreetingWindow.hpp" -#include "LoadFromTheGameWindow.hpp" -#include "LoadFromTheFileWindow.hpp" +#include "LoadWindow.hpp" +#include "SelectProfileWindow.hpp" #include "SettingsWindow.hpp" class SetUpWindowsWrapper final : public QStackedWidget { Q_OBJECT private: // Data - GreetingWindow* pGreetingWidget = nullptr; - LoadFromTheGameWindow* pLoadFromTheGameWindow = nullptr; - LoadFromTheFileWindow* pLoadFromTheFileWindow = nullptr; + SelectProfileWindow* pSelectProfileWindow = nullptr; + LoadWindow* pLoadWindow = nullptr; SettingsWindow* pSettingsWindow = nullptr; private: // Methods @@ -19,24 +17,30 @@ class SetUpWindowsWrapper final : public QStackedWidget void AttachConnections(); /// @brief Disconnects slots and signals. void DetachConnections(); - /// @brief Initialize `GreetingWindow`, `LoadFromTheGameWindow`, `LoadFromTheFileWindow`. + /// @brief Initialize `SelectProfileWindow`, `LoadFromTheGameWindow`, `LoadWindow` class objects. void AddWidgets(); + /// @brief Free heap from `SelectProfileWindow`, `LoadFromTheGameWindow`, `LoadWindow` data. + void DeleteWidgets(); public: SetUpWindowsWrapper(QWidget* parent = nullptr); private slots: - /// @brief Show `GreetingWindow`, if button `Back` has been clicked. + /// @brief Show `SeelectProfileWindow`, if button `Back` has been clicked. void BtnBack_Clicked(); /// @brief Change app language. void SettingsWindow_LanguageChanged(); /// @brief Show `SettingsWindow` if button `btnSettings` has been clicked. - void BtnSettings_Clicked(); + void SelectProfileWindow_SettingsClicked(); /// @brief Show window to load hotkeys information from .csf file. void BtnLoadFromFile_Clicked(); - /// @brief Show window to load hotkeys information from the game. - void BtnLoadFromGame_Clicked(); /// @brief Returns checked configuration of user preferences. - void LoadFromTheFileWindow_AcceptConfiguration(); + void LoadWindow_LoadFromTheFile(); /// @brief Returns checked configuration of user preferences. - void LoadFromTheGameWindow_AcceptConfiguration(); + void LoadWindow_LoadFromTheGame(); + /// @brief Handles selection of the Generals profile. + void SelectProfileWindow_GProfileSelected(); + /// @brief Handles selection of the Generals Zero Hour profile. + void SelectProfileWindow_GZHProfileSelected(); + /// @brief Handles selection of a custom profile. + void SelectProfileWindow_CustomProfileSelected(const QString& folder); }; diff --git a/src/GUI/WindowManager.cpp b/src/GUI/WindowManager.cpp index bdf7577..fd65dd6 100644 --- a/src/GUI/WindowManager.cpp +++ b/src/GUI/WindowManager.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,23 +16,12 @@ #include "WindowManager.hpp" WindowManager::WindowManager() -{ +{ SetTranslator(); qApp->setWindowIcon(QIcon(QPixmap::fromImage(ImageManager::DecodeEditorWebpIcon()))); - - LOGMSG("Loading \"" + PROGRAM_CONSTANTS->STYLES_SHEET_FILE + "\"..."); - QFile css{PROGRAM_CONSTANTS->STYLES_SHEET_FILE}; - if (css.open(QIODevice::ReadOnly)) - { - qApp->setStyleSheet(css.readAll()); - css.close(); - LOGMSG("Styles sheet has been loaded"); - } - else - { - LOGMSG("Unable to read the style file"); - } + ProfileFolder = PROGRAM_CONSTANTS->GZH_PROFILE_FOLDER; + ApplyProfileStyleSheet(ProfileFolder); LOGMSG("Loading launch window..."); pStartUpWindow = new SetUpWindowsWrapper(); @@ -89,6 +79,40 @@ bool WindowManager::InitializeCSFParser() return true; } +QString WindowManager::ReadStyleSheet(const QString& filepath, const QString& name) const +{ + LOGMSG("Loading \"" + filepath + "\"..."); + + QFile css(filepath); + if (css.open(QIODevice::ReadOnly)) + { + LOGMSG(name + " stylesheet has been loaded"); + return QString::fromUtf8(css.readAll()); + } + + LOGMSG("Unable to read the " + name + " stylesheet"); + return StringExt::EmptyString; +} + +void WindowManager::ApplyProfileStyleSheet(const QString& profileFolder) +{ + ProfileFolder = profileFolder; + + QString style = ReadStyleSheet(PROGRAM_CONSTANTS->MAIN_STYLES_FILE, "Main"); + style += "\n"; + + const QString profileName = QFileInfo(ProfileFolder).fileName(); + const QString profileStylesFile = ProfileFolder + "/Theme/" + PROGRAM_CONSTANTS->STYLES_FILENAME; + style += ReadStyleSheet(profileStylesFile, profileName); + + qApp->setStyleSheet(style); +} + +void WindowManager::ApplyDefaultProfileStyleSheet() +{ + ApplyProfileStyleSheet(PROGRAM_CONSTANTS->GZH_PROFILE_FOLDER); +} + void WindowManager::StartUpWindow_AcceptConfiguration() { // 2nd init protection @@ -122,7 +146,10 @@ void WindowManager::SetTranslator() pAppTranslator = new QTranslator(); pAppTranslator->load(lngShortName, PROGRAM_CONSTANTS->TRANSLATIONS_FOLDER); qApp->installTranslator(pAppTranslator); - FACTIONS_MANAGER->UpdateFactionNames(); + if (FACTIONS_MANAGER != nullptr) + { + FACTIONS_MANAGER->UpdateFactionNames(); + } } void WindowManager::Show() { pStartUpWindow->show(); } @@ -137,6 +164,45 @@ void WindowManager::EditorWindow_NewHotkeyFileSelected() StartUpWindow_AcceptConfiguration(); } +void WindowManager::StartUpWindow_GProfileSelected() +{ + if (FACTIONS_MANAGER != nullptr) + { + FACTIONS_MANAGER.release(); + } + + ApplyProfileStyleSheet(PROGRAM_CONSTANTS->G_PROFILE_FOLDER); + + FACTIONS_MANAGER = std::make_unique(PROGRAM_CONSTANTS->G_PROFILE_FOLDER + + "/" + PROGRAM_CONSTANTS->TECH_TREE_FILENAME); +} + +void WindowManager::StartUpWindow_GZHProfileSelected() +{ + if (FACTIONS_MANAGER != nullptr) + { + FACTIONS_MANAGER.release(); + } + + ApplyProfileStyleSheet(PROGRAM_CONSTANTS->GZH_PROFILE_FOLDER); + + FACTIONS_MANAGER = std::make_unique(PROGRAM_CONSTANTS->GZH_PROFILE_FOLDER + + "/" + PROGRAM_CONSTANTS->TECH_TREE_FILENAME); +} + +void WindowManager::StartUpWindow_CustomProfileSelected(const QString& folder) +{ + if (FACTIONS_MANAGER != nullptr) + { + FACTIONS_MANAGER.release(); + } + + const QString profileFolder = PROGRAM_CONSTANTS->PROFILES_FOLDER + "/" + folder; + ApplyProfileStyleSheet(profileFolder); + + FACTIONS_MANAGER = std::make_unique(profileFolder + "/" + PROGRAM_CONSTANTS->TECH_TREE_FILENAME); +} + WindowManager::~WindowManager() { if (pHotkeysEditor != nullptr) pHotkeysEditor->deleteLater(); diff --git a/src/GUI/WindowManager.hpp b/src/GUI/WindowManager.hpp index 2db4afc..0dc6cc6 100644 --- a/src/GUI/WindowManager.hpp +++ b/src/GUI/WindowManager.hpp @@ -18,10 +18,15 @@ class WindowManager final public: inline static std::unique_ptr Instance = nullptr; EditorWindowWrapper* pHotkeysEditor = nullptr; + QString ProfileFolder = StringExt::EmptyString; private: // Methods /// @brief Checks csf file to be compitable with GZH format. bool InitializeCSFParser(); + /// @brief Applies common styles and selected profile theme. + void ApplyProfileStyleSheet(const QString& profileFolder); + /// @brief Read stylesheet file contents and write loading result to log. + QString ReadStyleSheet(const QString& filepath, const QString& name) const; public: WindowManager(); ~WindowManager(); @@ -29,10 +34,18 @@ class WindowManager final void Show(); /// @brief Set common L10N translator for the whole project app. void SetTranslator(); - /// @brief Set CSF file path. Uses if in `LoadFromTheFileWindow` file has been set. + /// @brief Applies default startup theme. + void ApplyDefaultProfileStyleSheet(); + /// @brief Set CSF file path. Uses if in `LoadWindow` file has been set. void SetCSFFilePath(const QString& filepath); /// @brief Reinitialize CSF parser and editor window when new CSF/BIG file has been selected. void EditorWindow_NewHotkeyFileSelected(); - /// @brief Return CSF file path. Uses if in `LoadFromTheFileWindow` file has been set. + /// @brief Return CSF file path. Uses if in `LoadWindow` file has been set. void StartUpWindow_AcceptConfiguration(); + /// @brief Initialize TechTree.json parsing by Generals profile. + void StartUpWindow_GProfileSelected(); + /// @brief Initialize TechTree.json parsing by GeneralsZH profile. + void StartUpWindow_GZHProfileSelected(); + /// @brief Initialize TechTree.json parsing by custom profile. + void StartUpWindow_CustomProfileSelected(const QString& data); }; diff --git a/src/Main.cpp b/src/Main.cpp index 2271551..1fa7bb1 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include // Project headers #include "GUI/WindowManager.hpp" @@ -38,6 +39,7 @@ int main(int argc, const char** argv) QString workingDirectory = QString::fromStdWString(filesystem::current_path().c_str()); + // Change directory if user started the real executable instead of proxy if (workingDirectory.indexOf(PROGRAM_CONSTANTS->BINARIES_FOLDER) != -1) { LOGMSG("Program started from Resources\\Binaries folder. Redirect working directory to the ..\\..\\"); @@ -46,9 +48,16 @@ int main(int argc, const char** argv) filesystem::current_path(workingDirectory.toStdWString()); } + // Throw an error if there is no Translations folder in Resources + if (!filesystem::exists(PROGRAM_CONSTANTS->TRANSLATIONS_FOLDER.toStdString().c_str())) + return ShowErrorMessage(PROGRAM_CONSTANTS->TRANSLATIONS_NO_FOUND); + + // Throw an error if there is no Settings.json file in Resources if (!filesystem::exists(PROGRAM_CONSTANTS->SETTINGS_FILE.toStdString().c_str())) return ShowErrorMessage(PROGRAM_CONSTANTS->SETTINGS_NO_FOUND); + // TODO: Make it profile related + /* if (!filesystem::exists(PROGRAM_CONSTANTS->TECH_TREE_FILE.toStdString().c_str())) return ShowErrorMessage(PROGRAM_CONSTANTS->TECH_TREE_NO_FOUND); @@ -57,12 +66,11 @@ int main(int argc, const char** argv) if (!filesystem::exists(PROGRAM_CONSTANTS->THEME_FOLDER.toStdString().c_str())) return ShowErrorMessage(PROGRAM_CONSTANTS->THEME_FOLDER_NO_FOUND); - - if (!filesystem::exists(PROGRAM_CONSTANTS->TRANSLATIONS_FOLDER.toStdString().c_str())) - return ShowErrorMessage(PROGRAM_CONSTANTS->TRANSLATIONS_NO_FOUND); + */ PROGRAM_CONSTANTS->InitializeTranslations(); PROGRAM_CONSTANTS->InitializeFileSettings(); + PROGRAM_CONSTANTS->InitializeProfiles(); // Show console, that by default is hiding by Logger class if (PROGRAM_CONSTANTS->pSettingsFile->IsConsoleEnabled()) @@ -76,9 +84,6 @@ int main(int argc, const char** argv) if (PROGRAM_CONSTANTS->pSettingsFile->IsDiscordRPCEnabled()) DISCORD_MANAGER->Initialize(); - // Initialize TechTree.json parsing - FACTIONS_MANAGER = make_unique(); - // Define logger as the singleton class, that could be used anywhere in the project WINDOW_MANAGER = make_unique(); diff --git a/src/Managers/FactionsManager.cpp b/src/Managers/FactionsManager.cpp index 7427d46..4e79393 100644 --- a/src/Managers/FactionsManager.cpp +++ b/src/Managers/FactionsManager.cpp @@ -2,11 +2,15 @@ #include "../Core/Logger.hpp" #include "FactionsManager.hpp" -FactionManager::FactionManager() +using namespace StringExt; + +FactionManager::FactionManager(const QString techtreejson) { - vFactions.reserve(12); + TechTreeSource = JSONFile(techtreejson); + + vFactions.reserve(Faction::MAXIMUM_FACTION_COUNT); - for(const auto& elem : TECH_TREE_SOURCE.Query("$.TechTree").toArray()) + for(const auto& elem : TechTreeSource.Query("$.TechTree").toArray()) { vFactions.push_back(Faction{elem.toObject()}); } diff --git a/src/Managers/FactionsManager.hpp b/src/Managers/FactionsManager.hpp index 7953612..f8de9f9 100644 --- a/src/Managers/FactionsManager.hpp +++ b/src/Managers/FactionsManager.hpp @@ -9,7 +9,7 @@ class FactionManager final { private: // Data - const JSONFile TECH_TREE_SOURCE{PROGRAM_CONSTANTS->TECH_TREE_FILE}; + JSONFile TechTreeSource; QVector vFactions; public: inline static std::unique_ptr Instance = nullptr; @@ -17,8 +17,8 @@ class FactionManager final private: // Methods void Parse(); public: - /// @brief Default constructor. - explicit FactionManager(); + /// @brief Parse `TechTree.json` from the specific path as the game tech tree. + explicit FactionManager(const QString techtreejson); /// @brief Return count of parsed factions. int Count(); /// @brief Return faction by its index in container. diff --git a/src/Resources/Icons/AirGuard.webp b/src/Resources/Profiles/Generals/Icons/AirGuard.webp similarity index 100% rename from src/Resources/Icons/AirGuard.webp rename to src/Resources/Profiles/Generals/Icons/AirGuard.webp diff --git a/src/Resources/Icons/AttackMove.webp b/src/Resources/Profiles/Generals/Icons/AttackMove.webp similarity index 100% rename from src/Resources/Icons/AttackMove.webp rename to src/Resources/Profiles/Generals/Icons/AttackMove.webp diff --git a/src/Resources/Icons/CaptureBuilding.webp b/src/Resources/Profiles/Generals/Icons/CaptureBuilding.webp similarity index 100% rename from src/Resources/Icons/CaptureBuilding.webp rename to src/Resources/Profiles/Generals/Icons/CaptureBuilding.webp diff --git a/src/Resources/Icons/DisarmMinesAtPosition.webp b/src/Resources/Profiles/Generals/Icons/DisarmMinesAtPosition.webp similarity index 100% rename from src/Resources/Icons/DisarmMinesAtPosition.webp rename to src/Resources/Profiles/Generals/Icons/DisarmMinesAtPosition.webp diff --git a/src/Resources/Icons/EmergencyRepair.webp b/src/Resources/Profiles/Generals/Icons/EmergencyRepair.webp similarity index 100% rename from src/Resources/Icons/EmergencyRepair.webp rename to src/Resources/Profiles/Generals/Icons/EmergencyRepair.webp diff --git a/src/Resources/Icons/Evacuate.webp b/src/Resources/Profiles/Generals/Icons/Evacuate.webp similarity index 100% rename from src/Resources/Icons/Evacuate.webp rename to src/Resources/Profiles/Generals/Icons/Evacuate.webp diff --git a/src/Resources/Icons/GLA/DMLAdvancedDemoTrap.webp b/src/Resources/Profiles/Generals/Icons/GLA/DMLAdvancedDemoTrap.webp similarity index 100% rename from src/Resources/Icons/GLA/DMLAdvancedDemoTrap.webp rename to src/Resources/Profiles/Generals/Icons/GLA/DMLAdvancedDemoTrap.webp diff --git a/src/Resources/Icons/GLA/DMLDetonateCharges.webp b/src/Resources/Profiles/Generals/Icons/GLA/DMLDetonateCharges.webp similarity index 100% rename from src/Resources/Icons/GLA/DMLDetonateCharges.webp rename to src/Resources/Profiles/Generals/Icons/GLA/DMLDetonateCharges.webp diff --git a/src/Resources/Icons/GLA/DMLRemoteDemoCharge.webp b/src/Resources/Profiles/Generals/Icons/GLA/DMLRemoteDemoCharge.webp similarity index 100% rename from src/Resources/Icons/GLA/DMLRemoteDemoCharge.webp rename to src/Resources/Profiles/Generals/Icons/GLA/DMLRemoteDemoCharge.webp diff --git a/src/Resources/Icons/GLA/DMLSuicide.webp b/src/Resources/Profiles/Generals/Icons/GLA/DMLSuicide.webp similarity index 100% rename from src/Resources/Icons/GLA/DMLSuicide.webp rename to src/Resources/Profiles/Generals/Icons/GLA/DMLSuicide.webp diff --git a/src/Resources/Icons/GLA/DMLTimedDemoCharge.webp b/src/Resources/Profiles/Generals/Icons/GLA/DMLTimedDemoCharge.webp similarity index 100% rename from src/Resources/Icons/GLA/DMLTimedDemoCharge.webp rename to src/Resources/Profiles/Generals/Icons/GLA/DMLTimedDemoCharge.webp diff --git a/src/Resources/Icons/GLA/GLAAPBullets.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAPBullets.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAPBullets.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAPBullets.webp diff --git a/src/Resources/Icons/GLA/GLAAPRockets.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAPRockets.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAPRockets.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAPRockets.webp diff --git a/src/Resources/Icons/GLA/GLAAngryMob.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAngryMob.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAngryMob.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAngryMob.webp diff --git a/src/Resources/Icons/GLA/GLAAnthraxBeta.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxBeta.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAnthraxBeta.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxBeta.webp diff --git a/src/Resources/Icons/GLA/GLAAnthraxBomb.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxBomb.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAnthraxBomb.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxBomb.webp diff --git a/src/Resources/Icons/GLA/GLAAnthraxShells.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxShells.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAnthraxShells.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxShells.webp diff --git a/src/Resources/Icons/GLA/GLAAnthraxWarhead.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxWarhead.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAAnthraxWarhead.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAAnthraxWarhead.webp diff --git a/src/Resources/Icons/GLA/GLAArmTheMob.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAArmTheMob.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAArmTheMob.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAArmTheMob.webp diff --git a/src/Resources/Icons/GLA/GLAArmsDealer.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAArmsDealer.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAArmsDealer.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAArmsDealer.webp diff --git a/src/Resources/Icons/GLA/GLABarracks.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABarracks.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABarracks.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABarracks.webp diff --git a/src/Resources/Icons/GLA/GLABattleBus.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABattleBus.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABattleBus.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABattleBus.webp diff --git a/src/Resources/Icons/GLA/GLABecomeReal.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABecomeReal.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABecomeReal.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABecomeReal.webp diff --git a/src/Resources/Icons/GLA/GLABioBomb.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABioBomb.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABioBomb.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABioBomb.webp diff --git a/src/Resources/Icons/GLA/GLABlackMarket.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABlackMarket.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABlackMarket.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABlackMarket.webp diff --git a/src/Resources/Icons/GLA/GLABombTruck.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABombTruck.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABombTruck.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABombTruck.webp diff --git a/src/Resources/Icons/GLA/GLABoobyTraps.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLABoobyTraps.webp similarity index 100% rename from src/Resources/Icons/GLA/GLABoobyTraps.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLABoobyTraps.webp diff --git a/src/Resources/Icons/GLA/GLACamoNetting.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLACamoNetting.webp similarity index 100% rename from src/Resources/Icons/GLA/GLACamoNetting.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLACamoNetting.webp diff --git a/src/Resources/Icons/GLA/GLACamouflage.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLACamouflage.webp similarity index 100% rename from src/Resources/Icons/GLA/GLACamouflage.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLACamouflage.webp diff --git a/src/Resources/Icons/GLA/GLACarBomb.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLACarBomb.webp similarity index 100% rename from src/Resources/Icons/GLA/GLACarBomb.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLACarBomb.webp diff --git a/src/Resources/Icons/GLA/GLACombatBike.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLACombatBike.webp similarity index 100% rename from src/Resources/Icons/GLA/GLACombatBike.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLACombatBike.webp diff --git a/src/Resources/Icons/GLA/GLACommandCenter.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLACommandCenter.webp similarity index 100% rename from src/Resources/Icons/GLA/GLACommandCenter.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLACommandCenter.webp diff --git a/src/Resources/Icons/GLA/GLAContaminate.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAContaminate.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAContaminate.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAContaminate.webp diff --git a/src/Resources/Icons/GLA/GLADemoTrap.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLADemoTrap.webp similarity index 100% rename from src/Resources/Icons/GLA/GLADemoTrap.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLADemoTrap.webp diff --git a/src/Resources/Icons/GLA/GLADetonate.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLADetonate.webp similarity index 100% rename from src/Resources/Icons/GLA/GLADetonate.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLADetonate.webp diff --git a/src/Resources/Icons/GLA/GLADisguise.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLADisguise.webp similarity index 100% rename from src/Resources/Icons/GLA/GLADisguise.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLADisguise.webp diff --git a/src/Resources/Icons/GLA/GLAExplosiveWarhead.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAExplosiveWarhead.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAExplosiveWarhead.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAExplosiveWarhead.webp diff --git a/src/Resources/Icons/GLA/GLAFakeArmsDealer.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeArmsDealer.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeArmsDealer.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeArmsDealer.webp diff --git a/src/Resources/Icons/GLA/GLAFakeBarracks.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeBarracks.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeBarracks.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeBarracks.webp diff --git a/src/Resources/Icons/GLA/GLAFakeBlackMarket.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeBlackMarket.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeBlackMarket.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeBlackMarket.webp diff --git a/src/Resources/Icons/GLA/GLAFakeCommandCenter.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeCommandCenter.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeCommandCenter.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeCommandCenter.webp diff --git a/src/Resources/Icons/GLA/GLAFakeCommandSet.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeCommandSet.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeCommandSet.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeCommandSet.webp diff --git a/src/Resources/Icons/GLA/GLAFakeSupplyStash.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFakeSupplyStash.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFakeSupplyStash.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFakeSupplyStash.webp diff --git a/src/Resources/Icons/GLA/GLAFortifiedStructure.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAFortifiedStructure.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAFortifiedStructure.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAFortifiedStructure.webp diff --git a/src/Resources/Icons/GLA/GLAGPSScrambler.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAGPSScrambler.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAGPSScrambler.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAGPSScrambler.webp diff --git a/src/Resources/Icons/GLA/GLAHighExplosiveBomb.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAHighExplosiveBomb.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAHighExplosiveBomb.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAHighExplosiveBomb.webp diff --git a/src/Resources/Icons/GLA/GLAHijack.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAHijack.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAHijack.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAHijack.webp diff --git a/src/Resources/Icons/GLA/GLAHijacker.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAHijacker.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAHijacker.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAHijacker.webp diff --git a/src/Resources/Icons/GLA/GLAHole.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAHole.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAHole.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAHole.webp diff --git a/src/Resources/Icons/GLA/GLAJarmenKell.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAJarmenKell.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAJarmenKell.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAJarmenKell.webp diff --git a/src/Resources/Icons/GLA/GLAJunkRepair.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAJunkRepair.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAJunkRepair.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAJunkRepair.webp diff --git a/src/Resources/Icons/GLA/GLAManualControl.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAManualControl.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAManualControl.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAManualControl.webp diff --git a/src/Resources/Icons/GLA/GLAMarauderTank.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAMarauderTank.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAMarauderTank.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAMarauderTank.webp diff --git a/src/Resources/Icons/GLA/GLAPalace.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAPalace.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAPalace.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAPalace.webp diff --git a/src/Resources/Icons/GLA/GLAPilotKill.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAPilotKill.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAPilotKill.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAPilotKill.webp diff --git a/src/Resources/Icons/GLA/GLAProximityFuse.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAProximityFuse.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAProximityFuse.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAProximityFuse.webp diff --git a/src/Resources/Icons/GLA/GLAQuadCannon.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAQuadCannon.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAQuadCannon.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAQuadCannon.webp diff --git a/src/Resources/Icons/GLA/GLARPGTrooper.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARPGTrooper.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARPGTrooper.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARPGTrooper.webp diff --git a/src/Resources/Icons/GLA/GLARadarVan.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARadarVan.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARadarVan.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARadarVan.webp diff --git a/src/Resources/Icons/GLA/GLARadarVanScan.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARadarVanScan.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARadarVanScan.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARadarVanScan.webp diff --git a/src/Resources/Icons/GLA/GLARebel.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARebel.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARebel.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARebel.webp diff --git a/src/Resources/Icons/GLA/GLARebelAmbush.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARebelAmbush.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARebelAmbush.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARebelAmbush.webp diff --git a/src/Resources/Icons/GLA/GLARocketBuggy.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARocketBuggy.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARocketBuggy.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARocketBuggy.webp diff --git a/src/Resources/Icons/GLA/GLARocketBuggyAmmo.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLARocketBuggyAmmo.webp similarity index 100% rename from src/Resources/Icons/GLA/GLARocketBuggyAmmo.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLARocketBuggyAmmo.webp diff --git a/src/Resources/Icons/GLA/GLASaboteur.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLASaboteur.webp similarity index 100% rename from src/Resources/Icons/GLA/GLASaboteur.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLASaboteur.webp diff --git a/src/Resources/Icons/GLA/GLAScorpionRocket.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAScorpionRocket.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAScorpionRocket.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAScorpionRocket.webp diff --git a/src/Resources/Icons/GLA/GLAScorpionTank.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAScorpionTank.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAScorpionTank.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAScorpionTank.webp diff --git a/src/Resources/Icons/GLA/GLAScudLauncher.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAScudLauncher.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAScudLauncher.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAScudLauncher.webp diff --git a/src/Resources/Icons/GLA/GLAScudStorm.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAScudStorm.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAScudStorm.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAScudStorm.webp diff --git a/src/Resources/Icons/GLA/GLAScudStormLaunch.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAScudStormLaunch.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAScudStormLaunch.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAScudStormLaunch.webp diff --git a/src/Resources/Icons/GLA/GLASneakAttack.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLASneakAttack.webp similarity index 100% rename from src/Resources/Icons/GLA/GLASneakAttack.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLASneakAttack.webp diff --git a/src/Resources/Icons/GLA/GLAStingerSite.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAStingerSite.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAStingerSite.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAStingerSite.webp diff --git a/src/Resources/Icons/GLA/GLASupplyStash.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLASupplyStash.webp similarity index 100% rename from src/Resources/Icons/GLA/GLASupplyStash.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLASupplyStash.webp diff --git a/src/Resources/Icons/GLA/GLATechnical.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLATechnical.webp similarity index 100% rename from src/Resources/Icons/GLA/GLATechnical.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLATechnical.webp diff --git a/src/Resources/Icons/GLA/GLATerrorist.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLATerrorist.webp similarity index 100% rename from src/Resources/Icons/GLA/GLATerrorist.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLATerrorist.webp diff --git a/src/Resources/Icons/GLA/GLAToxinTractor.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAToxinTractor.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAToxinTractor.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAToxinTractor.webp diff --git a/src/Resources/Icons/GLA/GLATunnelNetwork.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLATunnelNetwork.webp similarity index 100% rename from src/Resources/Icons/GLA/GLATunnelNetwork.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLATunnelNetwork.webp diff --git a/src/Resources/Icons/GLA/GLAWorker.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAWorker.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAWorker.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAWorker.webp diff --git a/src/Resources/Icons/GLA/GLAWorkerShoes.webp b/src/Resources/Profiles/Generals/Icons/GLA/GLAWorkerShoes.webp similarity index 100% rename from src/Resources/Icons/GLA/GLAWorkerShoes.webp rename to src/Resources/Profiles/Generals/Icons/GLA/GLAWorkerShoes.webp diff --git a/src/Resources/Icons/GLA/TOXAnthraxGamma.webp b/src/Resources/Profiles/Generals/Icons/GLA/TOXAnthraxGamma.webp similarity index 100% rename from src/Resources/Icons/GLA/TOXAnthraxGamma.webp rename to src/Resources/Profiles/Generals/Icons/GLA/TOXAnthraxGamma.webp diff --git a/src/Resources/Icons/GLA/TOXRebel.webp b/src/Resources/Profiles/Generals/Icons/GLA/TOXRebel.webp similarity index 100% rename from src/Resources/Icons/GLA/TOXRebel.webp rename to src/Resources/Profiles/Generals/Icons/GLA/TOXRebel.webp diff --git a/src/Resources/Icons/GLA/TOXTunnelNetwork.webp b/src/Resources/Profiles/Generals/Icons/GLA/TOXTunnelNetwork.webp similarity index 100% rename from src/Resources/Icons/GLA/TOXTunnelNetwork.webp rename to src/Resources/Profiles/Generals/Icons/GLA/TOXTunnelNetwork.webp diff --git a/src/Resources/Icons/Guard.webp b/src/Resources/Profiles/Generals/Icons/Guard.webp similarity index 100% rename from src/Resources/Icons/Guard.webp rename to src/Resources/Profiles/Generals/Icons/Guard.webp diff --git a/src/Resources/Icons/PRC/INFAssaultTroopTransport.webp b/src/Resources/Profiles/Generals/Icons/PRC/INFAssaultTroopTransport.webp similarity index 100% rename from src/Resources/Icons/PRC/INFAssaultTroopTransport.webp rename to src/Resources/Profiles/Generals/Icons/PRC/INFAssaultTroopTransport.webp diff --git a/src/Resources/Icons/PRC/INFFortifiedBunker.webp b/src/Resources/Profiles/Generals/Icons/PRC/INFFortifiedBunker.webp similarity index 100% rename from src/Resources/Icons/PRC/INFFortifiedBunker.webp rename to src/Resources/Profiles/Generals/Icons/PRC/INFFortifiedBunker.webp diff --git a/src/Resources/Icons/PRC/INFMiniGunner.webp b/src/Resources/Profiles/Generals/Icons/PRC/INFMiniGunner.webp similarity index 100% rename from src/Resources/Icons/PRC/INFMiniGunner.webp rename to src/Resources/Profiles/Generals/Icons/PRC/INFMiniGunner.webp diff --git a/src/Resources/Icons/PRC/INFSuperLotus.webp b/src/Resources/Profiles/Generals/Icons/PRC/INFSuperLotus.webp similarity index 100% rename from src/Resources/Icons/PRC/INFSuperLotus.webp rename to src/Resources/Profiles/Generals/Icons/PRC/INFSuperLotus.webp diff --git a/src/Resources/Icons/PRC/NUKCarpetBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/NUKCarpetBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/NUKCarpetBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/NUKCarpetBomb.webp diff --git a/src/Resources/Icons/PRC/NUKIsotopeStability.webp b/src/Resources/Profiles/Generals/Icons/PRC/NUKIsotopeStability.webp similarity index 100% rename from src/Resources/Icons/PRC/NUKIsotopeStability.webp rename to src/Resources/Profiles/Generals/Icons/PRC/NUKIsotopeStability.webp diff --git a/src/Resources/Icons/PRC/NUKTacticalNukeMig.webp b/src/Resources/Profiles/Generals/Icons/PRC/NUKTacticalNukeMig.webp similarity index 100% rename from src/Resources/Icons/PRC/NUKTacticalNukeMig.webp rename to src/Resources/Profiles/Generals/Icons/PRC/NUKTacticalNukeMig.webp diff --git a/src/Resources/Icons/PRC/PRCAdvancedNuclearReactor.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCAdvancedNuclearReactor.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCAdvancedNuclearReactor.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCAdvancedNuclearReactor.webp diff --git a/src/Resources/Icons/PRC/PRCAirfield.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCAirfield.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCAirfield.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCAirfield.webp diff --git a/src/Resources/Icons/PRC/PRCArtilleryBarrage.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCArtilleryBarrage.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCArtilleryBarrage.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCArtilleryBarrage.webp diff --git a/src/Resources/Icons/PRC/PRCBarracks.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBarracks.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBarracks.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBarracks.webp diff --git a/src/Resources/Icons/PRC/PRCBattlemaster.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBattlemaster.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBattlemaster.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBattlemaster.webp diff --git a/src/Resources/Icons/PRC/PRCBlackLotus.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotus.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBlackLotus.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotus.webp diff --git a/src/Resources/Icons/PRC/PRCBlackLotusCaptureBuilding.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusCaptureBuilding.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBlackLotusCaptureBuilding.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusCaptureBuilding.webp diff --git a/src/Resources/Icons/PRC/PRCBlackLotusCashHack.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusCashHack.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBlackLotusCashHack.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusCashHack.webp diff --git a/src/Resources/Icons/PRC/PRCBlackLotusDisableVehicle.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusDisableVehicle.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBlackLotusDisableVehicle.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBlackLotusDisableVehicle.webp diff --git a/src/Resources/Icons/PRC/PRCBlackNapalm.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBlackNapalm.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBlackNapalm.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBlackNapalm.webp diff --git a/src/Resources/Icons/PRC/PRCBunker.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCBunker.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCBunker.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCBunker.webp diff --git a/src/Resources/Icons/PRC/PRCCarpetBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCCarpetBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCCarpetBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCCarpetBomb.webp diff --git a/src/Resources/Icons/PRC/PRCChainguns.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCChainguns.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCChainguns.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCChainguns.webp diff --git a/src/Resources/Icons/PRC/PRCClusterMine.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCClusterMine.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCClusterMine.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCClusterMine.webp diff --git a/src/Resources/Icons/PRC/PRCCommandCenter.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCCommandCenter.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCCommandCenter.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCCommandCenter.webp diff --git a/src/Resources/Icons/PRC/PRCDisableBuilding.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDisableBuilding.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDisableBuilding.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDisableBuilding.webp diff --git a/src/Resources/Icons/PRC/PRCDisableVehicle.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDisableVehicle.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDisableVehicle.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDisableVehicle.webp diff --git a/src/Resources/Icons/PRC/PRCDozer.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDozer.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDozer.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDozer.webp diff --git a/src/Resources/Icons/PRC/PRCDragonTank.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDragonTank.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDragonTank.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDragonTank.webp diff --git a/src/Resources/Icons/PRC/PRCDropNapalmBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDropNapalmBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDropNapalmBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDropNapalmBomb.webp diff --git a/src/Resources/Icons/PRC/PRCDropNukeBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCDropNukeBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCDropNukeBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCDropNukeBomb.webp diff --git a/src/Resources/Icons/PRC/PRCECMTank.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCECMTank.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCECMTank.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCECMTank.webp diff --git a/src/Resources/Icons/PRC/PRCEMPPulse.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCEMPPulse.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCEMPPulse.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCEMPPulse.webp diff --git a/src/Resources/Icons/PRC/PRCFireWall.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCFireWall.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCFireWall.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCFireWall.webp diff --git a/src/Resources/Icons/PRC/PRCFrenzy.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCFrenzy.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCFrenzy.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCFrenzy.webp diff --git a/src/Resources/Icons/PRC/PRCGattlingCannon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCGattlingCannon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCGattlingCannon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCGattlingCannon.webp diff --git a/src/Resources/Icons/PRC/PRCGattlingTank.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCGattlingTank.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCGattlingTank.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCGattlingTank.webp diff --git a/src/Resources/Icons/PRC/PRCHackInternet.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHackInternet.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHackInternet.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHackInternet.webp diff --git a/src/Resources/Icons/PRC/PRCHacker.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHacker.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHacker.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHacker.webp diff --git a/src/Resources/Icons/PRC/PRCHelix.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHelix.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHelix.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHelix.webp diff --git a/src/Resources/Icons/PRC/PRCHelixBattleBunker.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHelixBattleBunker.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHelixBattleBunker.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHelixBattleBunker.webp diff --git a/src/Resources/Icons/PRC/PRCHelixGattlingCannon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHelixGattlingCannon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHelixGattlingCannon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHelixGattlingCannon.webp diff --git a/src/Resources/Icons/PRC/PRCHelixSpeakerTower.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCHelixSpeakerTower.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCHelixSpeakerTower.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCHelixSpeakerTower.webp diff --git a/src/Resources/Icons/PRC/PRCInfernoCannon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCInfernoCannon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCInfernoCannon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCInfernoCannon.webp diff --git a/src/Resources/Icons/PRC/PRCInternetCenter.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCInternetCenter.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCInternetCenter.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCInternetCenter.webp diff --git a/src/Resources/Icons/PRC/PRCLandMine.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCLandMine.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCLandMine.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCLandMine.webp diff --git a/src/Resources/Icons/PRC/PRCListeningOutpost.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCListeningOutpost.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCListeningOutpost.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCListeningOutpost.webp diff --git a/src/Resources/Icons/PRC/PRCMIG.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCMIG.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCMIG.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCMIG.webp diff --git a/src/Resources/Icons/PRC/PRCMiGArmour.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCMiGArmour.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCMiGArmour.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCMiGArmour.webp diff --git a/src/Resources/Icons/PRC/PRCNapalmBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNapalmBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNapalmBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNapalmBomb.webp diff --git a/src/Resources/Icons/PRC/PRCNationalismIcon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNationalismIcon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNationalismIcon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNationalismIcon.webp diff --git a/src/Resources/Icons/PRC/PRCNeutronMines.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNeutronMines.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNeutronMines.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNeutronMines.webp diff --git a/src/Resources/Icons/PRC/PRCNeutronShells.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNeutronShells.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNeutronShells.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNeutronShells.webp diff --git a/src/Resources/Icons/PRC/PRCNuclearMissile.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearMissile.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNuclearMissile.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearMissile.webp diff --git a/src/Resources/Icons/PRC/PRCNuclearMissileSilo.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearMissileSilo.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNuclearMissileSilo.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearMissileSilo.webp diff --git a/src/Resources/Icons/PRC/PRCNuclearReactor.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearReactor.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNuclearReactor.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearReactor.webp diff --git a/src/Resources/Icons/PRC/PRCNuclearShells.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearShells.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNuclearShells.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearShells.webp diff --git a/src/Resources/Icons/PRC/PRCNuclearTanks.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearTanks.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNuclearTanks.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNuclearTanks.webp diff --git a/src/Resources/Icons/PRC/PRCNukeBomb.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNukeBomb.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNukeBomb.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNukeBomb.webp diff --git a/src/Resources/Icons/PRC/PRCNukeCannon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCNukeCannon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCNukeCannon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCNukeCannon.webp diff --git a/src/Resources/Icons/PRC/PRCOvercharge.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCOvercharge.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCOvercharge.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCOvercharge.webp diff --git a/src/Resources/Icons/PRC/PRCOverlordBattleBunker.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordBattleBunker.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCOverlordBattleBunker.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordBattleBunker.webp diff --git a/src/Resources/Icons/PRC/PRCOverlordGatlingCannon.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordGatlingCannon.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCOverlordGatlingCannon.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordGatlingCannon.webp diff --git a/src/Resources/Icons/PRC/PRCOverlordPropagandaTower.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordPropagandaTower.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCOverlordPropagandaTower.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordPropagandaTower.webp diff --git a/src/Resources/Icons/PRC/PRCOverlordTank.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordTank.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCOverlordTank.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCOverlordTank.webp diff --git a/src/Resources/Icons/PRC/PRCPropagandaCenter.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCPropagandaCenter.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCPropagandaCenter.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCPropagandaCenter.webp diff --git a/src/Resources/Icons/PRC/PRCRadarUpgrade.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCRadarUpgrade.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCRadarUpgrade.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCRadarUpgrade.webp diff --git a/src/Resources/Icons/PRC/PRCRedGuard.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCRedGuard.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCRedGuard.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCRedGuard.webp diff --git a/src/Resources/Icons/PRC/PRCSatelliteHack1.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSatelliteHack1.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSatelliteHack1.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSatelliteHack1.webp diff --git a/src/Resources/Icons/PRC/PRCSatelliteHack2.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSatelliteHack2.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSatelliteHack2.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSatelliteHack2.webp diff --git a/src/Resources/Icons/PRC/PRCSpeakerTower.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSpeakerTower.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSpeakerTower.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSpeakerTower.webp diff --git a/src/Resources/Icons/PRC/PRCSubliminalMessaging.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSubliminalMessaging.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSubliminalMessaging.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSubliminalMessaging.webp diff --git a/src/Resources/Icons/PRC/PRCSupplyCenter.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSupplyCenter.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSupplyCenter.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSupplyCenter.webp diff --git a/src/Resources/Icons/PRC/PRCSupplyTruck.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCSupplyTruck.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCSupplyTruck.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCSupplyTruck.webp diff --git a/src/Resources/Icons/PRC/PRCTNTAttack.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCTNTAttack.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCTNTAttack.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCTNTAttack.webp diff --git a/src/Resources/Icons/PRC/PRCTankHunter.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCTankHunter.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCTankHunter.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCTankHunter.webp diff --git a/src/Resources/Icons/PRC/PRCTroopCrawler.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCTroopCrawler.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCTroopCrawler.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCTroopCrawler.webp diff --git a/src/Resources/Icons/PRC/PRCUraniumShells.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCUraniumShells.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCUraniumShells.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCUraniumShells.webp diff --git a/src/Resources/Icons/PRC/PRCWarFactory.webp b/src/Resources/Profiles/Generals/Icons/PRC/PRCWarFactory.webp similarity index 100% rename from src/Resources/Icons/PRC/PRCWarFactory.webp rename to src/Resources/Profiles/Generals/Icons/PRC/PRCWarFactory.webp diff --git a/src/Resources/Icons/PRC/TNKAutoloader.webp b/src/Resources/Profiles/Generals/Icons/PRC/TNKAutoloader.webp similarity index 100% rename from src/Resources/Icons/PRC/TNKAutoloader.webp rename to src/Resources/Profiles/Generals/Icons/PRC/TNKAutoloader.webp diff --git a/src/Resources/Icons/PRC/TNKEmperorOverlordTank.webp b/src/Resources/Profiles/Generals/Icons/PRC/TNKEmperorOverlordTank.webp similarity index 100% rename from src/Resources/Icons/PRC/TNKEmperorOverlordTank.webp rename to src/Resources/Profiles/Generals/Icons/PRC/TNKEmperorOverlordTank.webp diff --git a/src/Resources/Icons/PRC/TNKTankDrop.webp b/src/Resources/Profiles/Generals/Icons/PRC/TNKTankDrop.webp similarity index 100% rename from src/Resources/Icons/PRC/TNKTankDrop.webp rename to src/Resources/Profiles/Generals/Icons/PRC/TNKTankDrop.webp diff --git a/src/Resources/Icons/Paradrop.webp b/src/Resources/Profiles/Generals/Icons/Paradrop.webp similarity index 100% rename from src/Resources/Icons/Paradrop.webp rename to src/Resources/Profiles/Generals/Icons/Paradrop.webp diff --git a/src/Resources/Profiles/Generals/Icons/RallyPoint.webp b/src/Resources/Profiles/Generals/Icons/RallyPoint.webp new file mode 100644 index 0000000..6f45d0a Binary files /dev/null and b/src/Resources/Profiles/Generals/Icons/RallyPoint.webp differ diff --git a/src/Resources/Icons/Sell.webp b/src/Resources/Profiles/Generals/Icons/Sell.webp similarity index 100% rename from src/Resources/Icons/Sell.webp rename to src/Resources/Profiles/Generals/Icons/Sell.webp diff --git a/src/Resources/Icons/Stop.webp b/src/Resources/Profiles/Generals/Icons/Stop.webp similarity index 100% rename from src/Resources/Icons/Stop.webp rename to src/Resources/Profiles/Generals/Icons/Stop.webp diff --git a/src/Resources/Icons/USA/AIRCarpetBomb.webp b/src/Resources/Profiles/Generals/Icons/USA/AIRCarpetBomb.webp similarity index 100% rename from src/Resources/Icons/USA/AIRCarpetBomb.webp rename to src/Resources/Profiles/Generals/Icons/USA/AIRCarpetBomb.webp diff --git a/src/Resources/Icons/USA/AIRCombatChinook.webp b/src/Resources/Profiles/Generals/Icons/USA/AIRCombatChinook.webp similarity index 100% rename from src/Resources/Icons/USA/AIRCombatChinook.webp rename to src/Resources/Profiles/Generals/Icons/USA/AIRCombatChinook.webp diff --git a/src/Resources/Icons/USA/AIRKingRaptor.webp b/src/Resources/Profiles/Generals/Icons/USA/AIRKingRaptor.webp similarity index 100% rename from src/Resources/Icons/USA/AIRKingRaptor.webp rename to src/Resources/Profiles/Generals/Icons/USA/AIRKingRaptor.webp diff --git a/src/Resources/Icons/USA/AIRStealthComancheUpgrade.webp b/src/Resources/Profiles/Generals/Icons/USA/AIRStealthComancheUpgrade.webp similarity index 100% rename from src/Resources/Icons/USA/AIRStealthComancheUpgrade.webp rename to src/Resources/Profiles/Generals/Icons/USA/AIRStealthComancheUpgrade.webp diff --git a/src/Resources/Icons/USA/LSRLaserTank.webp b/src/Resources/Profiles/Generals/Icons/USA/LSRLaserTank.webp similarity index 100% rename from src/Resources/Icons/USA/LSRLaserTank.webp rename to src/Resources/Profiles/Generals/Icons/USA/LSRLaserTank.webp diff --git a/src/Resources/Icons/USA/LSRPatriot.webp b/src/Resources/Profiles/Generals/Icons/USA/LSRPatriot.webp similarity index 100% rename from src/Resources/Icons/USA/LSRPatriot.webp rename to src/Resources/Profiles/Generals/Icons/USA/LSRPatriot.webp diff --git a/src/Resources/Icons/USA/SWGAdvancedControlRods.webp b/src/Resources/Profiles/Generals/Icons/USA/SWGAdvancedControlRods.webp similarity index 100% rename from src/Resources/Icons/USA/SWGAdvancedControlRods.webp rename to src/Resources/Profiles/Generals/Icons/USA/SWGAdvancedControlRods.webp diff --git a/src/Resources/Icons/USA/SWGAuroraAlpha.webp b/src/Resources/Profiles/Generals/Icons/USA/SWGAuroraAlpha.webp similarity index 100% rename from src/Resources/Icons/USA/SWGAuroraAlpha.webp rename to src/Resources/Profiles/Generals/Icons/USA/SWGAuroraAlpha.webp diff --git a/src/Resources/Icons/USA/SWGColdFusionReactor.webp b/src/Resources/Profiles/Generals/Icons/USA/SWGColdFusionReactor.webp similarity index 100% rename from src/Resources/Icons/USA/SWGColdFusionReactor.webp rename to src/Resources/Profiles/Generals/Icons/USA/SWGColdFusionReactor.webp diff --git a/src/Resources/Icons/USA/SWGPatriot.webp b/src/Resources/Profiles/Generals/Icons/USA/SWGPatriot.webp similarity index 100% rename from src/Resources/Icons/USA/SWGPatriot.webp rename to src/Resources/Profiles/Generals/Icons/USA/SWGPatriot.webp diff --git a/src/Resources/Icons/USA/USAA10ThunderboltMissileStrike.webp b/src/Resources/Profiles/Generals/Icons/USA/USAA10ThunderboltMissileStrike.webp similarity index 100% rename from src/Resources/Icons/USA/USAA10ThunderboltMissileStrike.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAA10ThunderboltMissileStrike.webp diff --git a/src/Resources/Icons/USA/USAAdvancedTraining.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAdvancedTraining.webp similarity index 100% rename from src/Resources/Icons/USA/USAAdvancedTraining.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAdvancedTraining.webp diff --git a/src/Resources/Icons/USA/USAAirfield.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAirfield.webp similarity index 100% rename from src/Resources/Icons/USA/USAAirfield.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAirfield.webp diff --git a/src/Resources/Icons/USA/USAAmbulance.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAmbulance.webp similarity index 100% rename from src/Resources/Icons/USA/USAAmbulance.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAmbulance.webp diff --git a/src/Resources/Icons/USA/USAAmbulanceCleanupArea.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAmbulanceCleanupArea.webp similarity index 100% rename from src/Resources/Icons/USA/USAAmbulanceCleanupArea.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAmbulanceCleanupArea.webp diff --git a/src/Resources/Icons/USA/USAAurora.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAurora.webp similarity index 100% rename from src/Resources/Icons/USA/USAAurora.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAurora.webp diff --git a/src/Resources/Icons/USA/USAAvenger.webp b/src/Resources/Profiles/Generals/Icons/USA/USAAvenger.webp similarity index 100% rename from src/Resources/Icons/USA/USAAvenger.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAAvenger.webp diff --git a/src/Resources/Icons/USA/USABarracks.webp b/src/Resources/Profiles/Generals/Icons/USA/USABarracks.webp similarity index 100% rename from src/Resources/Icons/USA/USABarracks.webp rename to src/Resources/Profiles/Generals/Icons/USA/USABarracks.webp diff --git a/src/Resources/Icons/USA/USABattleDrone.webp b/src/Resources/Profiles/Generals/Icons/USA/USABattleDrone.webp similarity index 100% rename from src/Resources/Icons/USA/USABattleDrone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USABattleDrone.webp diff --git a/src/Resources/Icons/USA/USABombardment.webp b/src/Resources/Profiles/Generals/Icons/USA/USABombardment.webp similarity index 100% rename from src/Resources/Icons/USA/USABombardment.webp rename to src/Resources/Profiles/Generals/Icons/USA/USABombardment.webp diff --git a/src/Resources/Icons/USA/USABunkerBusters.webp b/src/Resources/Profiles/Generals/Icons/USA/USABunkerBusters.webp similarity index 100% rename from src/Resources/Icons/USA/USABunkerBusters.webp rename to src/Resources/Profiles/Generals/Icons/USA/USABunkerBusters.webp diff --git a/src/Resources/Icons/USA/USABurton.webp b/src/Resources/Profiles/Generals/Icons/USA/USABurton.webp similarity index 100% rename from src/Resources/Icons/USA/USABurton.webp rename to src/Resources/Profiles/Generals/Icons/USA/USABurton.webp diff --git a/src/Resources/Icons/USA/USAChemicalSuits.webp b/src/Resources/Profiles/Generals/Icons/USA/USAChemicalSuits.webp similarity index 100% rename from src/Resources/Icons/USA/USAChemicalSuits.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAChemicalSuits.webp diff --git a/src/Resources/Icons/USA/USAChinook.webp b/src/Resources/Profiles/Generals/Icons/USA/USAChinook.webp similarity index 100% rename from src/Resources/Icons/USA/USAChinook.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAChinook.webp diff --git a/src/Resources/Icons/USA/USAColdFusionReactor.webp b/src/Resources/Profiles/Generals/Icons/USA/USAColdFusionReactor.webp similarity index 100% rename from src/Resources/Icons/USA/USAColdFusionReactor.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAColdFusionReactor.webp diff --git a/src/Resources/Icons/USA/USAComanche.webp b/src/Resources/Profiles/Generals/Icons/USA/USAComanche.webp similarity index 100% rename from src/Resources/Icons/USA/USAComanche.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAComanche.webp diff --git a/src/Resources/Icons/USA/USACombatDrop.webp b/src/Resources/Profiles/Generals/Icons/USA/USACombatDrop.webp similarity index 100% rename from src/Resources/Icons/USA/USACombatDrop.webp rename to src/Resources/Profiles/Generals/Icons/USA/USACombatDrop.webp diff --git a/src/Resources/Icons/USA/USACommandCenter.webp b/src/Resources/Profiles/Generals/Icons/USA/USACommandCenter.webp similarity index 100% rename from src/Resources/Icons/USA/USACommandCenter.webp rename to src/Resources/Profiles/Generals/Icons/USA/USACommandCenter.webp diff --git a/src/Resources/Icons/USA/USACompositeArmour.webp b/src/Resources/Profiles/Generals/Icons/USA/USACompositeArmour.webp similarity index 100% rename from src/Resources/Icons/USA/USACompositeArmour.webp rename to src/Resources/Profiles/Generals/Icons/USA/USACompositeArmour.webp diff --git a/src/Resources/Icons/USA/USAControlRods.webp b/src/Resources/Profiles/Generals/Icons/USA/USAControlRods.webp similarity index 100% rename from src/Resources/Icons/USA/USAControlRods.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAControlRods.webp diff --git a/src/Resources/Icons/USA/USACountermeasures.webp b/src/Resources/Profiles/Generals/Icons/USA/USACountermeasures.webp similarity index 100% rename from src/Resources/Icons/USA/USACountermeasures.webp rename to src/Resources/Profiles/Generals/Icons/USA/USACountermeasures.webp diff --git a/src/Resources/Icons/USA/USACrusaderTank.webp b/src/Resources/Profiles/Generals/Icons/USA/USACrusaderTank.webp similarity index 100% rename from src/Resources/Icons/USA/USACrusaderTank.webp rename to src/Resources/Profiles/Generals/Icons/USA/USACrusaderTank.webp diff --git a/src/Resources/Icons/USA/USADaisyCutter.webp b/src/Resources/Profiles/Generals/Icons/USA/USADaisyCutter.webp similarity index 100% rename from src/Resources/Icons/USA/USADaisyCutter.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADaisyCutter.webp diff --git a/src/Resources/Icons/USA/USADetentionCamp.webp b/src/Resources/Profiles/Generals/Icons/USA/USADetentionCamp.webp similarity index 100% rename from src/Resources/Icons/USA/USADetentionCamp.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADetentionCamp.webp diff --git a/src/Resources/Icons/USA/USADetonateCharges.webp b/src/Resources/Profiles/Generals/Icons/USA/USADetonateCharges.webp similarity index 100% rename from src/Resources/Icons/USA/USADetonateCharges.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADetonateCharges.webp diff --git a/src/Resources/Icons/USA/USADozer.webp b/src/Resources/Profiles/Generals/Icons/USA/USADozer.webp similarity index 100% rename from src/Resources/Icons/USA/USADozer.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADozer.webp diff --git a/src/Resources/Icons/USA/USADrone.webp b/src/Resources/Profiles/Generals/Icons/USA/USADrone.webp similarity index 100% rename from src/Resources/Icons/USA/USADrone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADrone.webp diff --git a/src/Resources/Icons/USA/USADroneArmor.webp b/src/Resources/Profiles/Generals/Icons/USA/USADroneArmor.webp similarity index 100% rename from src/Resources/Icons/USA/USADroneArmor.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADroneArmor.webp diff --git a/src/Resources/Icons/USA/USADropZone.webp b/src/Resources/Profiles/Generals/Icons/USA/USADropZone.webp similarity index 100% rename from src/Resources/Icons/USA/USADropZone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USADropZone.webp diff --git a/src/Resources/Icons/USA/USAEvacuate.webp b/src/Resources/Profiles/Generals/Icons/USA/USAEvacuate.webp similarity index 100% rename from src/Resources/Icons/USA/USAEvacuate.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAEvacuate.webp diff --git a/src/Resources/Icons/USA/USAFireBase.webp b/src/Resources/Profiles/Generals/Icons/USA/USAFireBase.webp similarity index 100% rename from src/Resources/Icons/USA/USAFireBase.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAFireBase.webp diff --git a/src/Resources/Icons/USA/USAFireRocketPods.webp b/src/Resources/Profiles/Generals/Icons/USA/USAFireRocketPods.webp similarity index 100% rename from src/Resources/Icons/USA/USAFireRocketPods.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAFireRocketPods.webp diff --git a/src/Resources/Icons/USA/USAFlashbangs.webp b/src/Resources/Profiles/Generals/Icons/USA/USAFlashbangs.webp similarity index 100% rename from src/Resources/Icons/USA/USAFlashbangs.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAFlashbangs.webp diff --git a/src/Resources/Icons/USA/USAHellfireDrone.webp b/src/Resources/Profiles/Generals/Icons/USA/USAHellfireDrone.webp similarity index 100% rename from src/Resources/Icons/USA/USAHellfireDrone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAHellfireDrone.webp diff --git a/src/Resources/Icons/USA/USAHoldTheLine.webp b/src/Resources/Profiles/Generals/Icons/USA/USAHoldTheLine.webp similarity index 100% rename from src/Resources/Icons/USA/USAHoldTheLine.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAHoldTheLine.webp diff --git a/src/Resources/Icons/USA/USAHumvee.webp b/src/Resources/Profiles/Generals/Icons/USA/USAHumvee.webp similarity index 100% rename from src/Resources/Icons/USA/USAHumvee.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAHumvee.webp diff --git a/src/Resources/Icons/USA/USAIntelligence.webp b/src/Resources/Profiles/Generals/Icons/USA/USAIntelligence.webp similarity index 100% rename from src/Resources/Icons/USA/USAIntelligence.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAIntelligence.webp diff --git a/src/Resources/Icons/USA/USAKnifeAttack.webp b/src/Resources/Profiles/Generals/Icons/USA/USAKnifeAttack.webp similarity index 100% rename from src/Resources/Icons/USA/USAKnifeAttack.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAKnifeAttack.webp diff --git a/src/Resources/Icons/USA/USALaserGuidedMissiles.webp b/src/Resources/Profiles/Generals/Icons/USA/USALaserGuidedMissiles.webp similarity index 100% rename from src/Resources/Icons/USA/USALaserGuidedMissiles.webp rename to src/Resources/Profiles/Generals/Icons/USA/USALaserGuidedMissiles.webp diff --git a/src/Resources/Icons/USA/USALaserLock.webp b/src/Resources/Profiles/Generals/Icons/USA/USALaserLock.webp similarity index 100% rename from src/Resources/Icons/USA/USALaserLock.webp rename to src/Resources/Profiles/Generals/Icons/USA/USALaserLock.webp diff --git a/src/Resources/Icons/USA/USALeafletDrop.webp b/src/Resources/Profiles/Generals/Icons/USA/USALeafletDrop.webp similarity index 100% rename from src/Resources/Icons/USA/USALeafletDrop.webp rename to src/Resources/Profiles/Generals/Icons/USA/USALeafletDrop.webp diff --git a/src/Resources/Icons/USA/USAMOAB.webp b/src/Resources/Profiles/Generals/Icons/USA/USAMOAB.webp similarity index 100% rename from src/Resources/Icons/USA/USAMOAB.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAMOAB.webp diff --git a/src/Resources/Icons/USA/USAMicrowave.webp b/src/Resources/Profiles/Generals/Icons/USA/USAMicrowave.webp similarity index 100% rename from src/Resources/Icons/USA/USAMicrowave.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAMicrowave.webp diff --git a/src/Resources/Icons/USA/USAMissileDefender.webp b/src/Resources/Profiles/Generals/Icons/USA/USAMissileDefender.webp similarity index 100% rename from src/Resources/Icons/USA/USAMissileDefender.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAMissileDefender.webp diff --git a/src/Resources/Icons/USA/USAPaladinTank.webp b/src/Resources/Profiles/Generals/Icons/USA/USAPaladinTank.webp similarity index 100% rename from src/Resources/Icons/USA/USAPaladinTank.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAPaladinTank.webp diff --git a/src/Resources/Icons/USA/USAParticleCannon.webp b/src/Resources/Profiles/Generals/Icons/USA/USAParticleCannon.webp similarity index 100% rename from src/Resources/Icons/USA/USAParticleCannon.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAParticleCannon.webp diff --git a/src/Resources/Icons/USA/USAParticleCannonFire.webp b/src/Resources/Profiles/Generals/Icons/USA/USAParticleCannonFire.webp similarity index 100% rename from src/Resources/Icons/USA/USAParticleCannonFire.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAParticleCannonFire.webp diff --git a/src/Resources/Icons/USA/USAPathfinder.webp b/src/Resources/Profiles/Generals/Icons/USA/USAPathfinder.webp similarity index 100% rename from src/Resources/Icons/USA/USAPathfinder.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAPathfinder.webp diff --git a/src/Resources/Icons/USA/USAPatriot.webp b/src/Resources/Profiles/Generals/Icons/USA/USAPatriot.webp similarity index 100% rename from src/Resources/Icons/USA/USAPatriot.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAPatriot.webp diff --git a/src/Resources/Icons/USA/USAPilot.webp b/src/Resources/Profiles/Generals/Icons/USA/USAPilot.webp similarity index 100% rename from src/Resources/Icons/USA/USAPilot.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAPilot.webp diff --git a/src/Resources/Icons/USA/USARanger.webp b/src/Resources/Profiles/Generals/Icons/USA/USARanger.webp similarity index 100% rename from src/Resources/Icons/USA/USARanger.webp rename to src/Resources/Profiles/Generals/Icons/USA/USARanger.webp diff --git a/src/Resources/Icons/USA/USARangerMachineGun.webp b/src/Resources/Profiles/Generals/Icons/USA/USARangerMachineGun.webp similarity index 100% rename from src/Resources/Icons/USA/USARangerMachineGun.webp rename to src/Resources/Profiles/Generals/Icons/USA/USARangerMachineGun.webp diff --git a/src/Resources/Icons/USA/USARaptor.webp b/src/Resources/Profiles/Generals/Icons/USA/USARaptor.webp similarity index 100% rename from src/Resources/Icons/USA/USARaptor.webp rename to src/Resources/Profiles/Generals/Icons/USA/USARaptor.webp diff --git a/src/Resources/Icons/USA/USARemoteDemoCharge.webp b/src/Resources/Profiles/Generals/Icons/USA/USARemoteDemoCharge.webp similarity index 100% rename from src/Resources/Icons/USA/USARemoteDemoCharge.webp rename to src/Resources/Profiles/Generals/Icons/USA/USARemoteDemoCharge.webp diff --git a/src/Resources/Icons/USA/USARocketPods.webp b/src/Resources/Profiles/Generals/Icons/USA/USARocketPods.webp similarity index 100% rename from src/Resources/Icons/USA/USARocketPods.webp rename to src/Resources/Profiles/Generals/Icons/USA/USARocketPods.webp diff --git a/src/Resources/Icons/USA/USASearchAndDestroy.webp b/src/Resources/Profiles/Generals/Icons/USA/USASearchAndDestroy.webp similarity index 100% rename from src/Resources/Icons/USA/USASearchAndDestroy.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASearchAndDestroy.webp diff --git a/src/Resources/Icons/USA/USASentryDrone.webp b/src/Resources/Profiles/Generals/Icons/USA/USASentryDrone.webp similarity index 100% rename from src/Resources/Icons/USA/USASentryDrone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASentryDrone.webp diff --git a/src/Resources/Icons/USA/USASentryDroneGun.webp b/src/Resources/Profiles/Generals/Icons/USA/USASentryDroneGun.webp similarity index 100% rename from src/Resources/Icons/USA/USASentryDroneGun.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASentryDroneGun.webp diff --git a/src/Resources/Icons/USA/USASpectreGunship.webp b/src/Resources/Profiles/Generals/Icons/USA/USASpectreGunship.webp similarity index 100% rename from src/Resources/Icons/USA/USASpectreGunship.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASpectreGunship.webp diff --git a/src/Resources/Icons/USA/USASpySattelite.webp b/src/Resources/Profiles/Generals/Icons/USA/USASpySattelite.webp similarity index 100% rename from src/Resources/Icons/USA/USASpySattelite.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASpySattelite.webp diff --git a/src/Resources/Icons/USA/USAStealthFighter.webp b/src/Resources/Profiles/Generals/Icons/USA/USAStealthFighter.webp similarity index 100% rename from src/Resources/Icons/USA/USAStealthFighter.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAStealthFighter.webp diff --git a/src/Resources/Icons/USA/USAStrategyCenter.webp b/src/Resources/Profiles/Generals/Icons/USA/USAStrategyCenter.webp similarity index 100% rename from src/Resources/Icons/USA/USAStrategyCenter.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAStrategyCenter.webp diff --git a/src/Resources/Icons/USA/USASupplyCenter.webp b/src/Resources/Profiles/Generals/Icons/USA/USASupplyCenter.webp similarity index 100% rename from src/Resources/Icons/USA/USASupplyCenter.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASupplyCenter.webp diff --git a/src/Resources/Icons/USA/USASupplyDropZone.webp b/src/Resources/Profiles/Generals/Icons/USA/USASupplyDropZone.webp similarity index 100% rename from src/Resources/Icons/USA/USASupplyDropZone.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASupplyDropZone.webp diff --git a/src/Resources/Icons/USA/USASupplyLines.webp b/src/Resources/Profiles/Generals/Icons/USA/USASupplyLines.webp similarity index 100% rename from src/Resources/Icons/USA/USASupplyLines.webp rename to src/Resources/Profiles/Generals/Icons/USA/USASupplyLines.webp diff --git a/src/Resources/Icons/USA/USATOWMissile.webp b/src/Resources/Profiles/Generals/Icons/USA/USATOWMissile.webp similarity index 100% rename from src/Resources/Icons/USA/USATOWMissile.webp rename to src/Resources/Profiles/Generals/Icons/USA/USATOWMissile.webp diff --git a/src/Resources/Icons/USA/USATimedDemoCharge.webp b/src/Resources/Profiles/Generals/Icons/USA/USATimedDemoCharge.webp similarity index 100% rename from src/Resources/Icons/USA/USATimedDemoCharge.webp rename to src/Resources/Profiles/Generals/Icons/USA/USATimedDemoCharge.webp diff --git a/src/Resources/Icons/USA/USATomahawkLauncher.webp b/src/Resources/Profiles/Generals/Icons/USA/USATomahawkLauncher.webp similarity index 100% rename from src/Resources/Icons/USA/USATomahawkLauncher.webp rename to src/Resources/Profiles/Generals/Icons/USA/USATomahawkLauncher.webp diff --git a/src/Resources/Icons/USA/USAWarFactory.webp b/src/Resources/Profiles/Generals/Icons/USA/USAWarFactory.webp similarity index 100% rename from src/Resources/Icons/USA/USAWarFactory.webp rename to src/Resources/Profiles/Generals/Icons/USA/USAWarFactory.webp diff --git a/src/Resources/Profiles/Generals/TechTree.json b/src/Resources/Profiles/Generals/TechTree.json new file mode 100644 index 0000000..1e0b15c --- /dev/null +++ b/src/Resources/Profiles/Generals/TechTree.json @@ -0,0 +1,1168 @@ +{ + "TechTree" : + [ + { + "ShortName" : "USA", + "DisplayName" : "USA", + "DisplayNameDescription" : "United Stated Of America", + + "Buildings" : + [ + { + "Name" : "USACommandCenter", + "IngameName" : "OBJECT:CommandCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USADozer", "HotkeyString" : "CONTROLBAR:ConstructAmericaDozer"}, + {"IconName" : "USAA10ThunderboltMissileStrike", "HotkeyString" : "CONTROLBAR:A10ThunderboltMissileStrike"}, + {"IconName" : "Paradrop", "HotkeyString" : "CONTROLBAR:Paradrop"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:SpyDrone"}, + {"IconName" : "EmergencyRepair", "HotkeyString" : "CONTROLBAR:EmergencyRepair"}, + {"IconName" : "USADaisyCutter", "HotkeyString" : "CONTROLBAR:DaisyCutter"}, + {"IconName" : "USASpySattelite", "HotkeyString" : "CONTROLBAR:SpySatellite"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAColdFusionReactor", + "IngameName" : "OBJECT:ColdFusionReactor", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAControlRods", "HotkeyString" : "CONTROLBAR:UpgradeAmericaAdvancedControlRods"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USABarracks", + "IngameName" : "OBJECT:Barracks", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USARanger", "HotkeyString" : "CONTROLBAR:ConstructAmericaInfantryRanger"}, + {"IconName" : "USAMissileDefender", "HotkeyString" : "CONTROLBAR:ConstructAmericaInfantryMissileDefender"}, + {"IconName" : "USABurton", "HotkeyString" : "CONTROLBAR:ConstructAmericaInfantryColonelBurton"}, + {"IconName" : "USAPathfinder", "HotkeyString" : "CONTROLBAR:ConstructAmericaInfantryPathfinder"}, + {"IconName" : "USAFlashbangs", "HotkeyString" : "CONTROLBAR:UpgradeAmericaFlashBangGrenade"}, + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:UpgradeAmericaRangerCaptureBuilding"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USASupplyCenter", + "IngameName" : "OBJECT:SupplyCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAChinook", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleChinook"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAPatriot", + "IngameName" : "OBJECT:PatriotBattery", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAWarFactory", + "IngameName" : "OBJECT:WarFactory", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USACrusaderTank", "HotkeyString" : "CONTROLBAR:ConstructAmericaTankCrusader"}, + {"IconName" : "USAHumvee", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleHumvee"}, + {"IconName" : "USAPaladinTank", "HotkeyString" : "CONTROLBAR:ConstructAmericaTankPaladin"}, + {"IconName" : "USATomahawkLauncher", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleTomahawk"}, + {"IconName" : "USAAmbulance", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleMedic"}, + {"IconName" : "USATOWMissile", "HotkeyString" : "CONTROLBAR:UpgradeAmericaTOWMissile"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAAirfield", + "IngameName" : "OBJECT:Airfield", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USARaptor", "HotkeyString" : "CONTROLBAR:ConstructAmericaJetRaptor"}, + {"IconName" : "USAAurora", "HotkeyString" : "CONTROLBAR:ConstructAmericaJetAurora"}, + {"IconName" : "USAComanche", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleComanche"}, + {"IconName" : "USAStealthFighter", "HotkeyString" : "CONTROLBAR:ConstructAmericaJetStealthFighter"}, + {"IconName" : "USARocketPods", "HotkeyString" : "CONTROLBAR:UpgradeComancheRocketPods"}, + {"IconName" : "USALaserGuidedMissiles", "HotkeyString" : "CONTROLBAR:UpgradeAmericaLaserMissiles"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAStrategyCenter", + "IngameName" : "OBJECT:StrategyCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USABombardment", "HotkeyString" : "CONTROLBAR:InitiateBattlePlanBombardment"}, + {"IconName" : "USAHoldTheLine", "HotkeyString" : "CONTROLBAR:InitiateBattlePlanHoldTheLine"}, + {"IconName" : "USASearchAndDestroy", "HotkeyString" : "CONTROLBAR:InitiateBattlePlanSearchAndDestroy"}, + {"IconName" : "USAAdvancedTraining", "HotkeyString" : "CONTROLBAR:UpgradeAmericaAdvancedTraining"}, + {"IconName" : "USACompositeArmour", "HotkeyString" : "CONTROLBAR:UpgradeAmericaCompositeArmor"}, + {"IconName" : "USADroneArmor", "HotkeyString" : "CONTROLBAR:UpgradeAmericaDroneArmor"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USADetentionCamp", + "IngameName" : "OBJECT:DetentionCamp", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAIntelligence", "HotkeyString" : "CONTROLBAR:CIAIntelligence"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USADropZone", + "IngameName" : "OBJECT:AmericaSupplyDropZone", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "USAParticleCannon", + "IngameName" : "OBJECT:ParticleCannon", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAParticleCannonFire", "HotkeyString" : "CONTROLBAR:FireParticleUplinkCannon"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + } + ], + "Infantry" : + [ + { + "Name" : "USARanger", + "IngameName" : "OBJECT:Ranger", + "KeyboardLayouts" : + [ + [ + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:CaptureBuilding"}, + {"IconName" : "USARangerMachineGun", "HotkeyString" : "CONTROLBAR:RangerMachineGun"}, + {"IconName" : "USAFlashbangs", "HotkeyString" : "CONTROLBAR:FlashBangGrenadeMode"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAMissileDefender", + "IngameName" : "OBJECT:MissileTeam", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USALaserLock", "HotkeyString" : "CONTROLBAR:LaserMissileAttack"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAPathfinder", + "IngameName" : "OBJECT:Pathfinder", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USABurton", + "IngameName" : "OBJECT:ColonelBurton", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAKnifeAttack", "HotkeyString" : "CONTROLBAR:KnifeAttack"}, + {"IconName" : "USATimedDemoCharge", "HotkeyString" : "CONTROLBAR:TimedDemoCharge"}, + {"IconName" : "USARemoteDemoCharge", "HotkeyString" : "CONTROLBAR:RemoteDemoCharge"}, + {"IconName" : "USADetonateCharges", "HotkeyString" : "CONTROLBAR:DetonateCharges"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ], + "Vehicles" : + [ + { + "Name" : "USADozer", + "IngameName" : "OBJECT:Dozer", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAColdFusionReactor", "HotkeyString" : "CONTROLBAR:ConstructAmericaPowerPlant"}, + {"IconName" : "USABarracks", "HotkeyString" : "CONTROLBAR:ConstructAmericaBarracks"}, + {"IconName" : "USASupplyCenter", "HotkeyString" : "CONTROLBAR:ConstructAmericaSupplyCenter"}, + {"IconName" : "USAPatriot", "HotkeyString" : "CONTROLBAR:ConstructAmericaPatriotBattery"}, + {"IconName" : "USAWarFactory", "HotkeyString" : "CONTROLBAR:ConstructAmericaWarFactory"}, + {"IconName" : "USAAirfield", "HotkeyString" : "CONTROLBAR:ConstructAmericaAirfield"}, + {"IconName" : "USAStrategyCenter", "HotkeyString" : "CONTROLBAR:ConstructAmericaStrategyCenter"}, + {"IconName" : "USASupplyDropZone", "HotkeyString" : "CONTROLBAR:ConstructAmericaSupplyDropZone"}, + {"IconName" : "USADetentionCamp", "HotkeyString" : "CONTROLBAR:ConstructAmericaDetentionCamp"}, + {"IconName" : "USAParticleCannon", "HotkeyString" : "CONTROLBAR:ConstructAmericaParticleCannonUplink"}, + {"IconName" : "USACommandCenter", "HotkeyString" : "CONTROLBAR:ConstructAmericaCommandCenter"}, + {"IconName" : "DisarmMinesAtPosition", "HotkeyString" : "CONTROLBAR:DisarmMinesAtPosition"} + ] + ] + }, + + { + "Name" : "USACrusaderTank", + "IngameName" : "OBJECT:Crusader", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USABattleDrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleBattleDrone"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleScoutDrone"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAPaladinTank", + "IngameName" : "OBJECT:Paladin", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USABattleDrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleBattleDrone"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleScoutDrone"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USATomahawkLauncher", + "IngameName" : "OBJECT:Tomahawk", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USABattleDrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleBattleDrone"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleScoutDrone"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAHumvee", + "IngameName" : "OBJECT:Humvee", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAEvacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "USABattleDrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleBattleDrone"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleScoutDrone"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAAmbulance", + "IngameName" : "OBJECT:Ambulance", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAEvacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "USAAmbulanceCleanupArea", "HotkeyString" : "CONTROLBAR:AmbulanceCleanupArea"}, + {"IconName" : "USABattleDrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleBattleDrone"}, + {"IconName" : "USADrone", "HotkeyString" : "CONTROLBAR:ConstructAmericaVehicleScoutDrone"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ], + "Aircrafts" : + [ + { + "Name" : "USAChinook", + "IngameName" : "OBJECT:Chinook", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAEvacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "USACombatDrop", "HotkeyString" : "CONTROLBAR:CombatDrop"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAComanche", + "IngameName" : "OBJECT:Comanche", + "KeyboardLayouts" : + [ + [ + {"IconName" : "USAFireRocketPods", "HotkeyString" : "CONTROLBAR:FireRocketPods"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAStealthFighter", + "IngameName" : "OBJECT:StealthFighter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USARaptor", + "IngameName" : "OBJECT:Raptor", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AirGuard", "HotkeyString" : "CONTROLBAR:GuardFlyingUnitsOnly"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "USAAurora", + "IngameName" : "OBJECT:Aurora", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ] + }, + + { + "ShortName" : "PRC", + "DisplayName" : "CHINA", + "DisplayNameDescription" : "China", + + "Buildings" : + [ + { + "Name" : "PRCNuclearReactor", + "IngameName" : "OBJECT:NuclearReactor", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCOvercharge", "HotkeyString" : "CONTROLBAR:Overcharge"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCBarracks", + "IngameName" : "OBJECT:Barracks", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCRedGuard", "HotkeyString" : "CONTROLBAR:ConstructChinaInfantryRedguard"}, + {"IconName" : "PRCTankHunter", "HotkeyString" : "CONTROLBAR:ConstructChinaInfantryTankHunter"}, + {"IconName" : "PRCHacker", "HotkeyString" : "CONTROLBAR:ConstructChinaInfantryHacker"}, + {"IconName" : "PRCBlackLotus", "HotkeyString" : "CONTROLBAR:ConstructChinaInfantryBlackLotus"}, + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:UpgradeChinaRedguardCaptureBuilding"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCSupplyCenter", + "IngameName" : "OBJECT:SupplyCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCSupplyTruck", "HotkeyString" : "CONTROLBAR:ConstructChinaVehicleSupplyTruck"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCBunker", + "IngameName" : "OBJECT:Bunker", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Evacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCGattlingCannon", + "IngameName" : "OBJECT:GattlingCannon", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCWarFactory", + "IngameName" : "OBJECT:WarFactory", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCBattlemaster", "HotkeyString" : "CONTROLBAR:ConstructGLATankBattleMaster"}, + {"IconName" : "PRCTroopCrawler", "HotkeyString" : "CONTROLBAR:ConstructChinaVehicleTroopCrawler"}, + {"IconName" : "PRCGattlingTank", "HotkeyString" : "CONTROLBAR:ConstructChinaTankGattling"}, + {"IconName" : "PRCDragonTank", "HotkeyString" : "CONTROLBAR:ConstructChinaTankDragon"}, + {"IconName" : "PRCInfernoCannon", "HotkeyString" : "CONTROLBAR:ConstructChinaVehicleInfernoCannon"}, + {"IconName" : "PRCOverlordTank", "HotkeyString" : "CONTROLBAR:ConstructChinaTankOverlord"}, + {"IconName" : "PRCNukeCannon", "HotkeyString" : "CONTROLBAR:ConstructChinaVehicleNukeLauncher"}, + {"IconName" : "PRCChainguns", "HotkeyString" : "CONTROLBAR:UpgradeChinaChainGuns"}, + {"IconName" : "PRCBlackNapalm", "HotkeyString" : "CONTROLBAR:UpgradeChinaBlackNapalm"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCAirfield", + "IngameName" : "OBJECT:Airfield", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCMIG", "HotkeyString" : "CONTROLBAR:ConstructChinaJetMIG"}, + {"IconName" : "PRCMiGArmour", "HotkeyString" : "CONTROLBAR:UpgradeChinaAircraftArmor"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCPropagandaCenter", + "IngameName" : "OBJECT:PropagandaCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCNationalismIcon", "HotkeyString" : "CONTROLBAR:UpgradeChinaFanaticism"}, + {"IconName" : "PRCSubliminalMessaging", "HotkeyString" : "CONTROLBAR:UpgradeChinaSubliminalMessaging"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCSpeakerTower", + "IngameName" : "OBJECT:SpeakerTower", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCNuclearMissileSilo", + "IngameName" : "OBJECT:NeutronMissile", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCNuclearMissile", "HotkeyString" : "CONTROLBAR:NeutronMissile"}, + {"IconName" : "PRCUraniumShells", "HotkeyString" : "CONTROLBAR:UpgradeChinaUraniumShells"}, + {"IconName" : "PRCNuclearTanks", "HotkeyString" : "CONTROLBAR:UpgradeChinaNuclearTanks"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "PRCCommandCenter", + "IngameName" : "OBJECT:CommandCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCDozer", "HotkeyString" : "CONTROLBAR:ConstructChinaDozer"}, + {"IconName" : "PRCRadarUpgrade", "HotkeyString" : "CONTROLBAR:UpgradeChinaRadar"}, + {"IconName" : "PRCBlackLotusCashHack", "HotkeyString" : "CONTROLBAR:StealCashHack"}, + {"IconName" : "EmergencyRepair", "HotkeyString" : "CONTROLBAR:EmergencyRepair"}, + {"IconName" : "PRCClusterMine", "HotkeyString" : "CONTROLBAR:ClusterMines"}, + {"IconName" : "PRCArtilleryBarrage", "HotkeyString" : "CONTROLBAR:ArtilleryBarrage"}, + {"IconName" : "PRCEMPPulse", "HotkeyString" : "CONTROLBAR:EMPPulse"}, + {"IconName" : "PRCLandMine", "HotkeyString" : "CONTROLBAR:UpgradeChinaMines"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + } + ], + "Infantry" : + [ + { + "Name" : "PRCRedGuard", + "IngameName" : "OBJECT:Redguard", + "KeyboardLayouts" : + [ + [ + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:CaptureBuilding"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCTankHunter", + "IngameName" : "OBJECT:TankHunter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCTNTAttack", "HotkeyString" : "CONTROLBAR:TNTAttack"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCHacker", + "IngameName" : "OBJECT:Hacker", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCDisableBuilding", "HotkeyString" : "CONTROLBAR:DisableBuildingHack"}, + {"IconName" : "PRCHackInternet", "HotkeyString" : "CONTROLBAR:InternetHack"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCBlackLotus", + "IngameName" : "OBJECT:BlackLotus", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCBlackLotusCaptureBuilding", "HotkeyString" : "CONTROLBAR:CaptureBuilding"}, + {"IconName" : "PRCBlackLotusDisableVehicle", "HotkeyString" : "CONTROLBAR:DisableVehicleHack"}, + {"IconName" : "PRCBlackLotusCashHack", "HotkeyString" : "CONTROLBAR:CashHack"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ], + "Vehicles" : + [ + { + "Name" : "PRCBattlemaster", + "IngameName" : "OBJECT:BattleMaster", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCInfernoCannon", + "IngameName" : "OBJECT:InfernoCannon", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCGattlingTank", + "IngameName" : "OBJECT:GattlingTank", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCDragonTank", + "IngameName" : "OBJECT:Dragon", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCFireWall", "HotkeyString" : "CONTROLBAR:FireWall"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCTroopCrawler", + "IngameName" : "OBJECT:TroopCrawler", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Evacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCOverlordTank", + "IngameName" : "OBJECT:Overlord", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCOverlordBattleBunker", "HotkeyString" : "CONTROLBAR:UpgradeChinaOverlordBattleBunker"}, + {"IconName" : "PRCOverlordGatlingCannon", "HotkeyString" : "CONTROLBAR:UpgradeChinaOverlordGattlingCannon"}, + {"IconName" : "PRCOverlordPropagandaTower", "HotkeyString" : "CONTROLBAR:UpgradeChinaOverlordPropagandaTower"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCNukeCannon", + "IngameName" : "OBJECT:NukeLauncher", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "PRCDozer", + "IngameName" : "OBJECT:Dozer", + "KeyboardLayouts" : + [ + [ + {"IconName" : "PRCNuclearReactor", "HotkeyString" : "CONTROLBAR:ConstructChinaPowerPlant"}, + {"IconName" : "PRCBarracks", "HotkeyString" : "CONTROLBAR:ConstructChinaBarracks"}, + {"IconName" : "PRCSupplyCenter", "HotkeyString" : "CONTROLBAR:ConstructChinaSupplyCenter"}, + {"IconName" : "PRCBunker", "HotkeyString" : "CONTROLBAR:ConstructChinaBunker"}, + {"IconName" : "PRCGattlingCannon", "HotkeyString" : "CONTROLBAR:ConstructChinaGattlingCannon"}, + {"IconName" : "PRCWarFactory", "HotkeyString" : "CONTROLBAR:ConstructChinaWarFactory"}, + {"IconName" : "PRCAirfield", "HotkeyString" : "CONTROLBAR:ConstructChinaAirfield"}, + {"IconName" : "PRCPropagandaCenter", "HotkeyString" : "CONTROLBAR:ConstructChinaPropagandaCenter"}, + {"IconName" : "PRCSpeakerTower", "HotkeyString" : "CONTROLBAR:ConstructChinaSpeakerTower"}, + {"IconName" : "PRCNuclearMissileSilo", "HotkeyString" : "CONTROLBAR:ConstructChinaNuclearMissileLauncher"}, + {"IconName" : "PRCCommandCenter", "HotkeyString" : "CONTROLBAR:ConstructChinaCommandCenter"}, + {"IconName" : "DisarmMinesAtPosition", "HotkeyString" : "CONTROLBAR:DisarmMinesAtPosition"} + ] + ] + } + ], + "Aircrafts" : + [ + { + "Name" : "PRCMIG", + "IngameName" : "OBJECT:MIG", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AirGuard", "HotkeyString" : "CONTROLBAR:GuardFlyingUnitsOnly"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ] + }, + + { + "ShortName" : "GLA", + "DisplayName" : "GLA", + "DisplayNameDescription" : "Global Liberation Army", + + "Buildings" : + [ + { + "Name" : "GLASupplyStash", + "IngameName" : "OBJECT:SupplyStash", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAWorker", "HotkeyString" : "CONTROLBAR:ConstructGLAWorker"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLABarracks", + "IngameName" : "OBJECT:Barracks", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLARebel", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryRebel"}, + {"IconName" : "GLATerrorist", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryTerrorist"}, + {"IconName" : "GLAHijacker", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryHijacker"}, + {"IconName" : "GLARPGTrooper", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryRPGTrooper"}, + {"IconName" : "GLAAngryMob", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryAngryMob"}, + {"IconName" : "GLAJarmenKell", "HotkeyString" : "CONTROLBAR:ConstructGLAInfantryJarmenKell"}, + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:UpgradeGLARebelCaptureBuilding"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLAStingerSite", + "IngameName" : "OBJECT:StingerSite", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLATunnelNetwork", + "IngameName" : "OBJECT:TunnelNetwork", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Evacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLAArmsDealer", + "IngameName" : "OBJECT:ArmsDealer", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAScorpionTank", "HotkeyString" : "CONTROLBAR:ConstructGLATankScorpion"}, + {"IconName" : "GLARadarVan", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleRadarVan"}, + {"IconName" : "GLAToxinTractor", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleToxinTruck"}, + {"IconName" : "GLAMarauderTank", "HotkeyString" : "CONTROLBAR:ConstructGLATankMarauder"}, + {"IconName" : "GLAScudLauncher", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleScudLauncher"}, + {"IconName" : "GLATechnical", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleTechnical"}, + {"IconName" : "GLAQuadCannon", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleQuadCannon"}, + {"IconName" : "GLARocketBuggy", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleRocketBuggy"}, + {"IconName" : "GLABombTruck", "HotkeyString" : "CONTROLBAR:ConstructGLAVehicleBombTruck"}, + {"IconName" : "GLAScorpionRocket", "HotkeyString" : "CONTROLBAR:UpgradeGLAScorpionRocket"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLADemoTrap", + "IngameName" : "OBJECT:DemoTrap", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAProximityFuse", "HotkeyString" : "CONTROLBAR:ProximityFuse"}, + {"IconName" : "GLAManualControl", "HotkeyString" : "CONTROLBAR:ManualControl"}, + {"IconName" : "GLADetonate", "HotkeyString" : "CONTROLBAR:Detonate"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLAPalace", + "IngameName" : "OBJECT:Palace", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLACamouflage", "HotkeyString" : "CONTROLBAR:UpgradeGLACamouflage"}, + {"IconName" : "GLAAnthraxBeta", "HotkeyString" : "CONTROLBAR:UpgradeGLAAnthraxBeta"}, + {"IconName" : "GLAAnthraxShells", "HotkeyString" : "CONTROLBAR:UpgradeGLAToxinShells"}, + {"IconName" : "GLAArmTheMob", "HotkeyString" : "CONTROLBAR:UpgradeGLAArmTheMob"}, + {"IconName" : "Evacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLABlackMarket", + "IngameName" : "OBJECT:BlackMarket", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAAPBullets", "HotkeyString" : "CONTROLBAR:UpgradeGLAAPBullets"}, + {"IconName" : "GLAJunkRepair", "HotkeyString" : "CONTROLBAR:UpgradeGLAJunkRepair"}, + {"IconName" : "GLARadarVanScan", "HotkeyString" : "CONTROLBAR:UpgradeGLARadarVanScan"}, + {"IconName" : "GLAAPRockets", "HotkeyString" : "CONTROLBAR:UpgradeGLAAPRockets"}, + {"IconName" : "GLARocketBuggyAmmo", "HotkeyString" : "CONTROLBAR:UpgradeGLABuggyAmmo"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLAScudStorm", + "IngameName" : "OBJECT:ScudStorm", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAScudStormLaunch", "HotkeyString" : "CONTROLBAR:ScudStorm"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + }, + + { + "Name" : "GLACommandCenter", + "IngameName" : "OBJECT:CommandCenter", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAWorker", "HotkeyString" : "CONTROLBAR:ConstructGLAWorker"}, + {"IconName" : "GLARebelAmbush", "HotkeyString" : "CONTROLBAR:Ambush"}, + {"IconName" : "GLAAnthraxBomb", "HotkeyString" : "CONTROLBAR:AnthraxBomb"}, + {"IconName" : "EmergencyRepair", "HotkeyString" : "CONTROLBAR:EmergencyRepair"}, + {"IconName" : "RallyPoint", "HotkeyString" : "CONTROLBAR:SetRallyPoint"}, + {"IconName" : "Sell", "HotkeyString" : "CONTROLBAR:Sell"} + ] + ] + } + ], + "Infantry" : + [ + { + "Name" : "GLARebel", + "IngameName" : "OBJECT:Rebel", + "KeyboardLayouts" : + [ + [ + {"IconName" : "CaptureBuilding", "HotkeyString" : "CONTROLBAR:CaptureBuilding"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLARPGTrooper", + "IngameName" : "OBJECT:TunnelDefender", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLATerrorist", + "IngameName" : "OBJECT:Terrorist", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLACarBomb", "HotkeyString" : "CONTROLBAR:CarBomb"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAJarmenKell", + "IngameName" : "OBJECT:JarmenKell", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAPilotKill", "HotkeyString" : "CONTROLBAR:SniperAttack"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAAngryMob", + "IngameName" : "OBJECT:AngryMob", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAHijacker", + "IngameName" : "OBJECT:Hijacker", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAHijack", "HotkeyString" : "CONTROLBAR:Hijack"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAWorker", + "IngameName" : "OBJECT:Worker", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLASupplyStash", "HotkeyString" : "CONTROLBAR:ConstructGLASupplyStash"}, + {"IconName" : "GLABarracks", "HotkeyString" : "CONTROLBAR:ConstructGLABarracks"}, + {"IconName" : "GLAStingerSite", "HotkeyString" : "CONTROLBAR:ConstructGLAStingerSite"}, + {"IconName" : "GLATunnelNetwork", "HotkeyString" : "CONTROLBAR:ConstructGLATunnelNetwork"}, + {"IconName" : "GLAArmsDealer", "HotkeyString" : "CONTROLBAR:ConstructGLAArmsDealer"}, + {"IconName" : "GLADemoTrap", "HotkeyString" : "CONTROLBAR:ConstructGLADemoTrap"}, + {"IconName" : "GLAPalace", "HotkeyString" : "CONTROLBAR:ConstructGLAPalace"}, + {"IconName" : "GLABlackMarket", "HotkeyString" : "CONTROLBAR:ConstructGLABlackMarket"}, + {"IconName" : "GLAScudStorm", "HotkeyString" : "CONTROLBAR:ConstructGLAScudStorm"}, + {"IconName" : "GLACommandCenter", "HotkeyString" : "CONTROLBAR:ConstructGLACommandCenter"}, + {"IconName" : "DisarmMinesAtPosition", "HotkeyString" : "CONTROLBAR:DisarmMinesAtPosition"} + ] + ] + } + ], + "Vehicles" : + [ + { + "Name" : "GLAScorpionTank", + "IngameName" : "OBJECT:Scorpion", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLATechnical", + "IngameName" : "OBJECT:Technical", + "KeyboardLayouts" : + [ + [ + {"IconName" : "Evacuate", "HotkeyString" : "CONTROLBAR:Evacuate"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAQuadCannon", + "IngameName" : "OBJECT:QuadCannon", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLARocketBuggy", + "IngameName" : "OBJECT:RocketBuggy", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAMarauderTank", + "IngameName" : "OBJECT:Marauder", + "KeyboardLayouts" : + [ + [ + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAToxinTractor", + "IngameName" : "OBJECT:ToxinTruck", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAContaminate", "HotkeyString" : "CONTROLBAR:Contaminate"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLAScudLauncher", + "IngameName" : "OBJECT:ScudLauncher", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLAExplosiveWarhead", "HotkeyString" : "CONTROLBAR:ExplosiveWarhead"}, + {"IconName" : "GLAAnthraxWarhead", "HotkeyString" : "CONTROLBAR:AnthraxWarhead"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLABombTruck", + "IngameName" : "OBJECT:BombTruck", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLADisguise", "HotkeyString" : "CONTROLBAR:DisguiseAsVehicle"}, + {"IconName" : "GLACarBomb", "HotkeyString" : "CONTROLBAR:DetonateBombTruck"}, + {"IconName" : "GLABioBomb", "HotkeyString" : "CONTROLBAR:UpgradeGLABombTruckBioBomb"}, + {"IconName" : "GLAHighExplosiveBomb", "HotkeyString" : "CONTROLBAR:UpgradeGLABombTruckHighExplosiveBomb"}, + {"IconName" : "AttackMove", "HotkeyString" : "CONTROLBAR:AttackMove"}, + {"IconName" : "Guard", "HotkeyString" : "CONTROLBAR:Guard"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + }, + + { + "Name" : "GLARadarVan", + "IngameName" : "OBJECT:RadarVan", + "KeyboardLayouts" : + [ + [ + {"IconName" : "GLARadarVanScan", "HotkeyString" : "CONTROLBAR:RadarVanScan"}, + {"IconName" : "Stop", "HotkeyString" : "CONTROLBAR:Stop"} + ] + ] + } + ], + "Aircrafts" : [] + } + ] +} diff --git a/src/Resources/Profiles/Generals/Theme/EditorBackground.png b/src/Resources/Profiles/Generals/Theme/EditorBackground.png new file mode 100644 index 0000000..bc92241 Binary files /dev/null and b/src/Resources/Profiles/Generals/Theme/EditorBackground.png differ diff --git a/src/Resources/Profiles/Generals/Theme/StartMenuBackground.png b/src/Resources/Profiles/Generals/Theme/StartMenuBackground.png new file mode 100644 index 0000000..683e5aa Binary files /dev/null and b/src/Resources/Profiles/Generals/Theme/StartMenuBackground.png differ diff --git a/src/Resources/Profiles/Generals/Theme/Styles.css b/src/Resources/Profiles/Generals/Theme/Styles.css new file mode 100644 index 0000000..c2c8b21 --- /dev/null +++ b/src/Resources/Profiles/Generals/Theme/Styles.css @@ -0,0 +1,340 @@ +/* See more about Qt .css support in documentation and questions: */ +/* 1. https://doc.qt.io/qt-5/stylesheet-syntax.html */ +/* 2. https://doc.qt.io/qt-5/stylesheet-reference.html */ +/* 3. https://doc.qt.io/qt-5/stylesheet-examples.html */ +/* 4. https://forum.qt.io/topic/40151/solved-scaled-background-image-using-stylesheet/3 */ +/* 5. https://www.qtcentre.org/threads/55152-Is-it-possible-to-logically-combine-dynamic-properties-in-a-Qt-Stylesheet */ +/* 6. https://stackoverflow.com/questions/9536725/css-multiple-attribute-selectors/9536746#9536746 */ + +/* Global style setting */ +* +{ + font-family: Calibri; + font-size: 10pt; + color: black; +} + +QComboBox +{ + width: 70px; + color: white; + background-color: #b36e2e; + + border-style: outset; + border-width: 2px; + border-color: #d8b36a; + border-radius: 3px; +} + +QComboBox:checked +{ + background-color: #b36e2e; + color: #baff0c; +} + +QComboBox QAbstractItemView +{ + border-width: 2px; + border-radius: 3px; + border-style: outset; + border-color: #d8b36a; + color: white; + background-color: #3a2414; + selection-background-color: #b36e2e; +} + +QComboBox::drop-down +{ + width: 15px; + color: white; + border-color: #d8b36a; + border-radius: 3px; + padding-left: 10px; +} + +QComboBox::down-arrow { image: url(Resources/QtSources/ScrollArrowDown.webp); } +QComboBox::up-arrow { image: url(Resources/QtSources/ScrollArrowUp.webp); } + +/* ↓ Doesn't work */ +QComboBox#cmbLanguage { height: 25px; } + +QCheckBox::indicator +{ + width: 14px; + height: 14px; + background-color: rgba(216, 179, 106, 0.18); + border: 2px solid #d8b36a; +} + +QCheckBox::indicator:hover +{ + background-color: rgba(216, 179, 106, 0.28); + border-color: #f2d187; +} + +QCheckBox::indicator:checked +{ + background-color: #f2d187; + border-color: white; +} + +QPushButton +{ + font-family: Calibri; + font-weight: bold; + padding: 10px; + + color: white; + background-color: #4a3217; + + border-style: outset; + border-width: 2px; + border-color: #d8b36a; + border-radius: 3px; +} + +QPushButton:hover +{ + background-color: #b36e2e; + color: #baff0c; +} + +GreetingWindow QPushButton#btnSettings +{ + border-color: transparent; + background-color: transparent; +} + +GreetingWindow QPushButton { font-size: 18pt; } + +QLabel, QRadioButton, QCheckBox { color: white; } + +QLineEdit#txtActionName { font-style: italic; } + +QPushButton#btnReview +{ + padding-top: 2px; + padding-bottom: 2px; +} + +QPushButton#btnCancel +{ + margin-bottom: 40px; + padding-right: 10px; +} + +QPushButton#btnOk +{ + margin-bottom: 40px; + padding-left: 10px; +} + +/* Start widgets and SettingsWindow style settings */ +LoadWindow, SetUpWindowsWrapper, LoadFromTheGameWindow, SettingsWindow, QWidget#pSettingsWindow +{ + border-image: url(Resources/Profiles/Generals/Theme/StartMenuBackground.png) 0 0 0 0 stretch stretch; + background-color: black; +} + +/* Editor window style settings */ +EditorWindow +{ + border-image: url(Resources/Profiles/Generals/Theme/EditorBackground.png) 0 0 0 0 stretch stretch; + background-color: black; +} + +EditorWindow QPushButton +{ + font-family: Calibri; + font-weight: bold; + padding: 10px; + + background-color: #4a3217; + color: white; + + border-style: outset; + border-width: 2px; + border-color: #d8b36a; + border-radius: 3px; +} + +EditorWindow QPushButton:hover { background-color: #b36e2e; color: #baff0c; } +EditorWindow QPushButton:pressed { background-color: #b36e2e; color: white; } +EditorWindow QPushButton:pressed:hover { background-color: #b36e2e; color: #baff0c; } + +QPushButton[faction="USA"] { background-color: #181d5a; border-color: #b1b7ff; } +QPushButton[faction="USA"]:hover { background-color: #3543e7; color: #baff0c; } +QPushButton[faction="USA"]:pressed { background-color: #3543e7; color: white; } +QPushButton[faction="USA"]:pressed:hover { background-color: #3543e7; color: #baff0c; } + +QPushButton[faction="GLA"] { background-color: #185a22; border-color: #b1ffbf; } +QPushButton[faction="GLA"]:hover { background-color: #427b32; color: #c9c9c9; } +QPushButton[faction="GLA"]:pressed { background-color: #427b32; /*color: black;*/ } +QPushButton[faction="GLA"]:pressed:hover { background-color: #427b32; color: #c9c9c9; } + +QPushButton[faction="PRC"] { background-color: #5a1f18; border-color: #ffbbb1; } +QPushButton[faction="PRC"]:hover { background-color: #e74135; color: #baff0c; } +QPushButton[faction="PRC"]:pressed { background-color: #e74135; color: white; } +QPushButton[faction="PRC"]:pressed:hover { background-color: #e74135; color: #baff0c; } + +/* QPushButton[faction="USA"] already defined as basic non-property */ +/* If you want to change -- copy and edit styles down below */ + +EditorWindow QTreeWidget, EditorWindow QTabWidget, EditorWindow QScrollArea, EditorWindow QStatusBar +{ + background: rgba(0, 0, 0, 0.7); + border-radius: 3px; + border-width: 1px; + border-style: outset; + border-color: white; + + color: white; +} + +QTreeWidget::item +{ + min-height: 40px; + font-family: "Collibri"; + font-size: 9pt; +} + +QTreeWidget::item:selected, QTreeWidget::item:selected:!active { background-color: #b36e2e; color: white; } + +QTreeWidget::branch:open:has-children { background-image: url(Resources/QtSources/DropArrowDown.webp); } +QTreeWidget::branch:closed:has-children { background-image: url(Resources/QtSources/DropArrowRight.webp); } + +QTabWidget QWidget +{ + background: rgba(0, 0, 0, 0); + color: white; + border: none; +} + +QTabWidget::pane +{ + background: rgba(0, 0, 0, 0); + color: white; + border: none; +} + +QTabBar::tab +{ + background: rgba(0, 0, 0, 0); + height: 30px; + width: 120px; + color: white; + + border-bottom-width: 1px; + border-bottom-style: outset; + border-bottom-color: white; +} + +QTabBar::tab:first +{ + border-right-width: 1px; + border-right-style: outset; + border-right-color: white; +} + +QTabBar::tab:selected +{ + border-right-width: 1px; + border-right-style: outset; + border-right-color: white; + + background: #b36e2e; +} + +QTabBar::tab:selected:hover, QTabBar::tab:hover +{ + color: #baff0c; +} + +QTabBar::tab:last +{ + border-bottom-right-radius: 3px; + border-right-width: 1px; + border-right-style: outset; + border-right-color: white; +} + +QScrollBar +{ + background: rgba(0, 0, 0, 0); +} + +QScrollBar::handle +{ + background: white; + border-radius: 1px; +} + +QScrollBar::add-line, QScrollBar::sub-line, +QScrollBar::up-arrow, QScrollBar::down-arrow, +QScrollBar::add-page, QScrollBar::sub-page +{ + background: none; +} + +QDialog +{ + border-image: url(Resources/Profiles/Generals/Theme/StartMenuBackground.webp) 0 0 0 0 stretch stretch; + background-color: black; +} + +QDialog QLabel { color: white; } +QDialog QLabel#left { margin: 0px 0px 0px 60px; } +QDialog QLabel#right { margin: 30px 40px 30px 0px; } + +/* Maybe will be useful in future */ +/* EditorWindow QMenu +{ + background: rgba(0, 0, 0, 0); + color: white; + border: none; +} */ + +QPushButton[unique="true"]#btnHotkey +{ + font-weight: bold; + padding-left: 30px; + padding-right: 30px; + background-color: #128d2d; +} + +QPushButton[unique="false"]#btnHotkey +{ + font-weight: bold; + padding-left: 30px; + padding-right: 30px; + background-color: #cb0d27; +} + +QScrollArea#Keyboard QPushButton +{ + background: rgba(0, 0, 0, 0); + color: white; + font-size: 9pt; + + border-width: 1px; + border-style: outset; + border-color: white; +} + +QScrollArea#Keyboard QPushButton:hover { color: #baff0c; } +QScrollArea#Keyboard QPushButton[status="good"] { background-color: #128d2d; } +QScrollArea#Keyboard QPushButton[status="bad"] { background-color: #cb0d27; } +QScrollArea#Keyboard QPushButton[status="null"] { background: rgba(0, 0, 0, 0); } + +QScrollArea#Keyboard QPushButton[key="null"] +{ + background: rgba(0, 0, 0, 0); + border-color: rgba(0, 0, 0, 0); +} + +QStatusBar +{ + font-family: Calibri; + font-weight: bold; + padding: 10px; +} diff --git a/src/Resources/Profiles/GeneralsZH/Icons/AirGuard.webp b/src/Resources/Profiles/GeneralsZH/Icons/AirGuard.webp new file mode 100644 index 0000000..c3c7dc4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/AirGuard.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/AttackMove.webp b/src/Resources/Profiles/GeneralsZH/Icons/AttackMove.webp new file mode 100644 index 0000000..f6d2431 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/AttackMove.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/CaptureBuilding.webp b/src/Resources/Profiles/GeneralsZH/Icons/CaptureBuilding.webp new file mode 100644 index 0000000..4ca1a70 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/CaptureBuilding.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/DisarmMinesAtPosition.webp b/src/Resources/Profiles/GeneralsZH/Icons/DisarmMinesAtPosition.webp new file mode 100644 index 0000000..815736e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/DisarmMinesAtPosition.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/EmergencyRepair.webp b/src/Resources/Profiles/GeneralsZH/Icons/EmergencyRepair.webp new file mode 100644 index 0000000..0ddb721 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/EmergencyRepair.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/Evacuate.webp b/src/Resources/Profiles/GeneralsZH/Icons/Evacuate.webp new file mode 100644 index 0000000..dc4130b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/Evacuate.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLAdvancedDemoTrap.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLAdvancedDemoTrap.webp new file mode 100644 index 0000000..5b89c10 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLAdvancedDemoTrap.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLDetonateCharges.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLDetonateCharges.webp new file mode 100644 index 0000000..157ae9a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLDetonateCharges.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLRemoteDemoCharge.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLRemoteDemoCharge.webp new file mode 100644 index 0000000..672aea8 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLRemoteDemoCharge.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLSuicide.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLSuicide.webp new file mode 100644 index 0000000..8ffe4af Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLSuicide.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLTimedDemoCharge.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLTimedDemoCharge.webp new file mode 100644 index 0000000..d307c6d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/DMLTimedDemoCharge.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPBullets.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPBullets.webp new file mode 100644 index 0000000..b5c2edc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPBullets.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPRockets.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPRockets.webp new file mode 100644 index 0000000..eec2cbc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAPRockets.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAngryMob.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAngryMob.webp new file mode 100644 index 0000000..a2fb50d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAngryMob.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBeta.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBeta.webp new file mode 100644 index 0000000..44b2f6a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBeta.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBomb.webp new file mode 100644 index 0000000..3519e28 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxShells.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxShells.webp new file mode 100644 index 0000000..40bf01b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxShells.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxWarhead.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxWarhead.webp new file mode 100644 index 0000000..3519e28 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAAnthraxWarhead.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmTheMob.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmTheMob.webp new file mode 100644 index 0000000..3923ffa Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmTheMob.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmsDealer.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmsDealer.webp new file mode 100644 index 0000000..39164ab Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAArmsDealer.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABarracks.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABarracks.webp new file mode 100644 index 0000000..0fe6baa Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABarracks.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABattleBus.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABattleBus.webp new file mode 100644 index 0000000..ca26094 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABattleBus.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABecomeReal.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABecomeReal.webp new file mode 100644 index 0000000..deced3f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABecomeReal.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABioBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABioBomb.webp new file mode 100644 index 0000000..33fef09 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABioBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABlackMarket.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABlackMarket.webp new file mode 100644 index 0000000..ce0b7df Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABlackMarket.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABombTruck.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABombTruck.webp new file mode 100644 index 0000000..91d76dc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABombTruck.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABoobyTraps.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABoobyTraps.webp new file mode 100644 index 0000000..280456f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLABoobyTraps.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamoNetting.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamoNetting.webp new file mode 100644 index 0000000..343d4f8 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamoNetting.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamouflage.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamouflage.webp new file mode 100644 index 0000000..a814e25 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACamouflage.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACarBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACarBomb.webp new file mode 100644 index 0000000..54c319c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACarBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACombatBike.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACombatBike.webp new file mode 100644 index 0000000..838b104 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACombatBike.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACommandCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACommandCenter.webp new file mode 100644 index 0000000..85585a6 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLACommandCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAContaminate.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAContaminate.webp new file mode 100644 index 0000000..56c8ffc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAContaminate.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADemoTrap.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADemoTrap.webp new file mode 100644 index 0000000..baebd66 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADemoTrap.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADetonate.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADetonate.webp new file mode 100644 index 0000000..cb289bd Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADetonate.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADisguise.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADisguise.webp new file mode 100644 index 0000000..59b87db Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLADisguise.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAExplosiveWarhead.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAExplosiveWarhead.webp new file mode 100644 index 0000000..ddd4792 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAExplosiveWarhead.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeArmsDealer.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeArmsDealer.webp new file mode 100644 index 0000000..783dc7f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeArmsDealer.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBarracks.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBarracks.webp new file mode 100644 index 0000000..4d2f1b8 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBarracks.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBlackMarket.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBlackMarket.webp new file mode 100644 index 0000000..2d21ff7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeBlackMarket.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandCenter.webp new file mode 100644 index 0000000..7bf8590 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandSet.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandSet.webp new file mode 100644 index 0000000..26f8d04 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeCommandSet.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeSupplyStash.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeSupplyStash.webp new file mode 100644 index 0000000..4a771c7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFakeSupplyStash.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFortifiedStructure.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFortifiedStructure.webp new file mode 100644 index 0000000..0faaa88 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAFortifiedStructure.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAGPSScrambler.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAGPSScrambler.webp new file mode 100644 index 0000000..be526e5 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAGPSScrambler.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHighExplosiveBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHighExplosiveBomb.webp new file mode 100644 index 0000000..aff438e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHighExplosiveBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijack.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijack.webp new file mode 100644 index 0000000..60c9cb8 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijack.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijacker.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijacker.webp new file mode 100644 index 0000000..825439c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHijacker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHole.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHole.webp new file mode 100644 index 0000000..3996fb0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAHole.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJarmenKell.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJarmenKell.webp new file mode 100644 index 0000000..52d60f0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJarmenKell.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJunkRepair.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJunkRepair.webp new file mode 100644 index 0000000..10c284b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAJunkRepair.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAManualControl.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAManualControl.webp new file mode 100644 index 0000000..15b508d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAManualControl.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAMarauderTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAMarauderTank.webp new file mode 100644 index 0000000..96f231b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAMarauderTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPalace.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPalace.webp new file mode 100644 index 0000000..c97cf9c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPalace.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPilotKill.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPilotKill.webp new file mode 100644 index 0000000..32d1f69 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAPilotKill.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAProximityFuse.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAProximityFuse.webp new file mode 100644 index 0000000..982b9a4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAProximityFuse.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAQuadCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAQuadCannon.webp new file mode 100644 index 0000000..2e9b7c0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAQuadCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARPGTrooper.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARPGTrooper.webp new file mode 100644 index 0000000..fd91918 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARPGTrooper.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVan.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVan.webp new file mode 100644 index 0000000..69bb4fa Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVan.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVanScan.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVanScan.webp new file mode 100644 index 0000000..d00bf4f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARadarVanScan.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebel.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebel.webp new file mode 100644 index 0000000..18db8ef Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebel.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebelAmbush.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebelAmbush.webp new file mode 100644 index 0000000..fd697dd Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARebelAmbush.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggy.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggy.webp new file mode 100644 index 0000000..d4306e5 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggy.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggyAmmo.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggyAmmo.webp new file mode 100644 index 0000000..882b0d4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLARocketBuggyAmmo.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASaboteur.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASaboteur.webp new file mode 100644 index 0000000..6a408c2 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASaboteur.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionRocket.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionRocket.webp new file mode 100644 index 0000000..1d3280c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionRocket.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionTank.webp new file mode 100644 index 0000000..f614450 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScorpionTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudLauncher.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudLauncher.webp new file mode 100644 index 0000000..f07a2cd Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudLauncher.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStorm.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStorm.webp new file mode 100644 index 0000000..55044a9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStorm.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStormLaunch.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStormLaunch.webp new file mode 100644 index 0000000..1be0687 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAScudStormLaunch.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASneakAttack.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASneakAttack.webp new file mode 100644 index 0000000..aade9c1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASneakAttack.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAStingerSite.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAStingerSite.webp new file mode 100644 index 0000000..74bc5a7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAStingerSite.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASupplyStash.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASupplyStash.webp new file mode 100644 index 0000000..075f5c7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLASupplyStash.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATechnical.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATechnical.webp new file mode 100644 index 0000000..e744df0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATechnical.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATerrorist.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATerrorist.webp new file mode 100644 index 0000000..372024c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATerrorist.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAToxinTractor.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAToxinTractor.webp new file mode 100644 index 0000000..1c78a93 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAToxinTractor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATunnelNetwork.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATunnelNetwork.webp new file mode 100644 index 0000000..8667a6c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLATunnelNetwork.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorker.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorker.webp new file mode 100644 index 0000000..61e56cf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorkerShoes.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorkerShoes.webp new file mode 100644 index 0000000..c145b1e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/GLAWorkerShoes.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXAnthraxGamma.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXAnthraxGamma.webp new file mode 100644 index 0000000..683c4b3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXAnthraxGamma.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXRebel.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXRebel.webp new file mode 100644 index 0000000..3169a13 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXRebel.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXTunnelNetwork.webp b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXTunnelNetwork.webp new file mode 100644 index 0000000..8e78388 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/GLA/TOXTunnelNetwork.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/Guard.webp b/src/Resources/Profiles/GeneralsZH/Icons/Guard.webp new file mode 100644 index 0000000..d618a54 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/Guard.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFAssaultTroopTransport.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFAssaultTroopTransport.webp new file mode 100644 index 0000000..ce97c46 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFAssaultTroopTransport.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFFortifiedBunker.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFFortifiedBunker.webp new file mode 100644 index 0000000..edcec3d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFFortifiedBunker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFMiniGunner.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFMiniGunner.webp new file mode 100644 index 0000000..605c338 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFMiniGunner.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFSuperLotus.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFSuperLotus.webp new file mode 100644 index 0000000..92cb341 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/INFSuperLotus.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKCarpetBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKCarpetBomb.webp new file mode 100644 index 0000000..39563eb Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKCarpetBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKIsotopeStability.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKIsotopeStability.webp new file mode 100644 index 0000000..80b439c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKIsotopeStability.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKTacticalNukeMig.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKTacticalNukeMig.webp new file mode 100644 index 0000000..a6d206b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/NUKTacticalNukeMig.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAdvancedNuclearReactor.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAdvancedNuclearReactor.webp new file mode 100644 index 0000000..d64f9a4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAdvancedNuclearReactor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAirfield.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAirfield.webp new file mode 100644 index 0000000..6baac7a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCAirfield.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCArtilleryBarrage.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCArtilleryBarrage.webp new file mode 100644 index 0000000..d051adf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCArtilleryBarrage.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBarracks.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBarracks.webp new file mode 100644 index 0000000..d65739e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBarracks.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBattlemaster.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBattlemaster.webp new file mode 100644 index 0000000..cd340bf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBattlemaster.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotus.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotus.webp new file mode 100644 index 0000000..026dc84 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotus.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCaptureBuilding.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCaptureBuilding.webp new file mode 100644 index 0000000..cb83333 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCaptureBuilding.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCashHack.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCashHack.webp new file mode 100644 index 0000000..959779a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusCashHack.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusDisableVehicle.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusDisableVehicle.webp new file mode 100644 index 0000000..c47ce86 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackLotusDisableVehicle.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackNapalm.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackNapalm.webp new file mode 100644 index 0000000..4f9b895 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBlackNapalm.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBunker.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBunker.webp new file mode 100644 index 0000000..2c6d403 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCBunker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCarpetBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCarpetBomb.webp new file mode 100644 index 0000000..19b6b58 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCarpetBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCChainguns.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCChainguns.webp new file mode 100644 index 0000000..48ce7f9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCChainguns.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCClusterMine.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCClusterMine.webp new file mode 100644 index 0000000..e031cdf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCClusterMine.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCommandCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCommandCenter.webp new file mode 100644 index 0000000..69367f4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCCommandCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableBuilding.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableBuilding.webp new file mode 100644 index 0000000..3a8f01c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableBuilding.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableVehicle.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableVehicle.webp new file mode 100644 index 0000000..74e3243 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDisableVehicle.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDozer.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDozer.webp new file mode 100644 index 0000000..b5d6467 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDozer.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDragonTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDragonTank.webp new file mode 100644 index 0000000..0e6651f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDragonTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNapalmBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNapalmBomb.webp new file mode 100644 index 0000000..83fe7e7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNapalmBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNukeBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNukeBomb.webp new file mode 100644 index 0000000..955689d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCDropNukeBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCECMTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCECMTank.webp new file mode 100644 index 0000000..4613edc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCECMTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCEMPPulse.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCEMPPulse.webp new file mode 100644 index 0000000..6dffb19 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCEMPPulse.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFireWall.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFireWall.webp new file mode 100644 index 0000000..4f02841 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFireWall.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFrenzy.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFrenzy.webp new file mode 100644 index 0000000..caf6813 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCFrenzy.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingCannon.webp new file mode 100644 index 0000000..3c6ef6b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingTank.webp new file mode 100644 index 0000000..fd2ab95 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCGattlingTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHackInternet.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHackInternet.webp new file mode 100644 index 0000000..34cb938 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHackInternet.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHacker.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHacker.webp new file mode 100644 index 0000000..b73e23e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHacker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelix.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelix.webp new file mode 100644 index 0000000..70c8caf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelix.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixBattleBunker.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixBattleBunker.webp new file mode 100644 index 0000000..d7d214a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixBattleBunker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixGattlingCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixGattlingCannon.webp new file mode 100644 index 0000000..9481059 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixGattlingCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixSpeakerTower.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixSpeakerTower.webp new file mode 100644 index 0000000..5640478 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCHelixSpeakerTower.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInfernoCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInfernoCannon.webp new file mode 100644 index 0000000..75238ea Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInfernoCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInternetCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInternetCenter.webp new file mode 100644 index 0000000..eb98b4d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCInternetCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCLandMine.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCLandMine.webp new file mode 100644 index 0000000..c90b764 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCLandMine.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCListeningOutpost.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCListeningOutpost.webp new file mode 100644 index 0000000..db75eb2 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCListeningOutpost.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMIG.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMIG.webp new file mode 100644 index 0000000..7741e85 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMIG.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMiGArmour.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMiGArmour.webp new file mode 100644 index 0000000..700eaac Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCMiGArmour.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNapalmBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNapalmBomb.webp new file mode 100644 index 0000000..7851ba3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNapalmBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNationalismIcon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNationalismIcon.webp new file mode 100644 index 0000000..fb7d40d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNationalismIcon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronMines.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronMines.webp new file mode 100644 index 0000000..1af36b3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronMines.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronShells.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronShells.webp new file mode 100644 index 0000000..1ed744d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNeutronShells.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissile.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissile.webp new file mode 100644 index 0000000..44c0436 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissile.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissileSilo.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissileSilo.webp new file mode 100644 index 0000000..b0bbef0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearMissileSilo.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearReactor.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearReactor.webp new file mode 100644 index 0000000..ba8c768 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearReactor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearShells.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearShells.webp new file mode 100644 index 0000000..3b925e9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearShells.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearTanks.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearTanks.webp new file mode 100644 index 0000000..1273053 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNuclearTanks.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeBomb.webp new file mode 100644 index 0000000..955689d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeCannon.webp new file mode 100644 index 0000000..e90d517 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCNukeCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOvercharge.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOvercharge.webp new file mode 100644 index 0000000..5145f64 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOvercharge.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordBattleBunker.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordBattleBunker.webp new file mode 100644 index 0000000..97a8aad Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordBattleBunker.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordGatlingCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordGatlingCannon.webp new file mode 100644 index 0000000..dfd8e92 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordGatlingCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordPropagandaTower.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordPropagandaTower.webp new file mode 100644 index 0000000..382dd51 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordPropagandaTower.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordTank.webp new file mode 100644 index 0000000..3dd20a1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCOverlordTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCPropagandaCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCPropagandaCenter.webp new file mode 100644 index 0000000..4d0b6a5 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCPropagandaCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRadarUpgrade.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRadarUpgrade.webp new file mode 100644 index 0000000..29086c9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRadarUpgrade.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRedGuard.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRedGuard.webp new file mode 100644 index 0000000..b81e50c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCRedGuard.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack1.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack1.webp new file mode 100644 index 0000000..9c889fc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack1.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack2.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack2.webp new file mode 100644 index 0000000..cffcf06 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSatelliteHack2.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSpeakerTower.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSpeakerTower.webp new file mode 100644 index 0000000..335b761 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSpeakerTower.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSubliminalMessaging.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSubliminalMessaging.webp new file mode 100644 index 0000000..ea5b1d7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSubliminalMessaging.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyCenter.webp new file mode 100644 index 0000000..697d4d7 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyTruck.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyTruck.webp new file mode 100644 index 0000000..a452fa5 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCSupplyTruck.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTNTAttack.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTNTAttack.webp new file mode 100644 index 0000000..280456f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTNTAttack.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTankHunter.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTankHunter.webp new file mode 100644 index 0000000..77a0b0e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTankHunter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTroopCrawler.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTroopCrawler.webp new file mode 100644 index 0000000..7e1ff08 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCTroopCrawler.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCUraniumShells.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCUraniumShells.webp new file mode 100644 index 0000000..1cef23a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCUraniumShells.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCWarFactory.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCWarFactory.webp new file mode 100644 index 0000000..c2d851e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/PRCWarFactory.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKAutoloader.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKAutoloader.webp new file mode 100644 index 0000000..2f0db25 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKAutoloader.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKEmperorOverlordTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKEmperorOverlordTank.webp new file mode 100644 index 0000000..579577c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKEmperorOverlordTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKTankDrop.webp b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKTankDrop.webp new file mode 100644 index 0000000..fd57494 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/PRC/TNKTankDrop.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/Paradrop.webp b/src/Resources/Profiles/GeneralsZH/Icons/Paradrop.webp new file mode 100644 index 0000000..21abcd1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/Paradrop.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/Sell.webp b/src/Resources/Profiles/GeneralsZH/Icons/Sell.webp new file mode 100644 index 0000000..168ff7c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/Sell.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/Stop.webp b/src/Resources/Profiles/GeneralsZH/Icons/Stop.webp new file mode 100644 index 0000000..a8e907e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/Stop.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCarpetBomb.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCarpetBomb.webp new file mode 100644 index 0000000..5f400e3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCarpetBomb.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCombatChinook.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCombatChinook.webp new file mode 100644 index 0000000..8f03266 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRCombatChinook.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRKingRaptor.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRKingRaptor.webp new file mode 100644 index 0000000..4442313 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRKingRaptor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRStealthComancheUpgrade.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRStealthComancheUpgrade.webp new file mode 100644 index 0000000..939518c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/AIRStealthComancheUpgrade.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRLaserTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRLaserTank.webp new file mode 100644 index 0000000..211ad61 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRLaserTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRPatriot.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRPatriot.webp new file mode 100644 index 0000000..9d3e4f9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/LSRPatriot.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAdvancedControlRods.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAdvancedControlRods.webp new file mode 100644 index 0000000..08a87d6 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAdvancedControlRods.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAuroraAlpha.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAuroraAlpha.webp new file mode 100644 index 0000000..71eed37 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGAuroraAlpha.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGColdFusionReactor.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGColdFusionReactor.webp new file mode 100644 index 0000000..d571ec1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGColdFusionReactor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGPatriot.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGPatriot.webp new file mode 100644 index 0000000..6b294b9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/SWGPatriot.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAA10ThunderboltMissileStrike.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAA10ThunderboltMissileStrike.webp new file mode 100644 index 0000000..bbcd591 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAA10ThunderboltMissileStrike.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAdvancedTraining.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAdvancedTraining.webp new file mode 100644 index 0000000..12e88bb Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAdvancedTraining.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAirfield.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAirfield.webp new file mode 100644 index 0000000..c57166b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAirfield.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulance.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulance.webp new file mode 100644 index 0000000..6647d57 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulance.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulanceCleanupArea.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulanceCleanupArea.webp new file mode 100644 index 0000000..8b2843a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAmbulanceCleanupArea.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAurora.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAurora.webp new file mode 100644 index 0000000..6e85d04 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAurora.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAvenger.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAvenger.webp new file mode 100644 index 0000000..a604e4b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAAvenger.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USABarracks.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABarracks.webp new file mode 100644 index 0000000..7a349bf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABarracks.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USABattleDrone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABattleDrone.webp new file mode 100644 index 0000000..e41f68d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABattleDrone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USABombardment.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABombardment.webp new file mode 100644 index 0000000..e511068 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABombardment.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USABunkerBusters.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABunkerBusters.webp new file mode 100644 index 0000000..5349f31 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABunkerBusters.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USABurton.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABurton.webp new file mode 100644 index 0000000..11e75ab Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USABurton.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChemicalSuits.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChemicalSuits.webp new file mode 100644 index 0000000..d21a65b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChemicalSuits.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChinook.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChinook.webp new file mode 100644 index 0000000..f3a5f6e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAChinook.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAColdFusionReactor.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAColdFusionReactor.webp new file mode 100644 index 0000000..bd690a5 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAColdFusionReactor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAComanche.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAComanche.webp new file mode 100644 index 0000000..6c68da1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAComanche.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USACombatDrop.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACombatDrop.webp new file mode 100644 index 0000000..72f5e8e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACombatDrop.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USACommandCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACommandCenter.webp new file mode 100644 index 0000000..2b536a6 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACommandCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USACompositeArmour.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACompositeArmour.webp new file mode 100644 index 0000000..97ca72b Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACompositeArmour.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAControlRods.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAControlRods.webp new file mode 100644 index 0000000..8dbba6a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAControlRods.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USACountermeasures.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACountermeasures.webp new file mode 100644 index 0000000..ec19dc9 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACountermeasures.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USACrusaderTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACrusaderTank.webp new file mode 100644 index 0000000..c3b4adb Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USACrusaderTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADaisyCutter.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADaisyCutter.webp new file mode 100644 index 0000000..b9c5dbb Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADaisyCutter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetentionCamp.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetentionCamp.webp new file mode 100644 index 0000000..d683e2c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetentionCamp.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetonateCharges.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetonateCharges.webp new file mode 100644 index 0000000..34f06a0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADetonateCharges.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADozer.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADozer.webp new file mode 100644 index 0000000..d7fb0a8 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADozer.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADrone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADrone.webp new file mode 100644 index 0000000..9dc4f63 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADrone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADroneArmor.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADroneArmor.webp new file mode 100644 index 0000000..7f95237 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADroneArmor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USADropZone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADropZone.webp new file mode 100644 index 0000000..e3f1afe Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USADropZone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAEvacuate.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAEvacuate.webp new file mode 100644 index 0000000..9e9ac4e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAEvacuate.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireBase.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireBase.webp new file mode 100644 index 0000000..92724f4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireBase.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireRocketPods.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireRocketPods.webp new file mode 100644 index 0000000..59e3dcc Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFireRocketPods.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFlashbangs.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFlashbangs.webp new file mode 100644 index 0000000..919579a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAFlashbangs.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHellfireDrone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHellfireDrone.webp new file mode 100644 index 0000000..bfeef47 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHellfireDrone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHoldTheLine.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHoldTheLine.webp new file mode 100644 index 0000000..b905d5c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHoldTheLine.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHumvee.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHumvee.webp new file mode 100644 index 0000000..46d190a Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAHumvee.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAIntelligence.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAIntelligence.webp new file mode 100644 index 0000000..0a49abb Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAIntelligence.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAKnifeAttack.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAKnifeAttack.webp new file mode 100644 index 0000000..dc65256 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAKnifeAttack.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserGuidedMissiles.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserGuidedMissiles.webp new file mode 100644 index 0000000..23b0e05 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserGuidedMissiles.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserLock.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserLock.webp new file mode 100644 index 0000000..f2a1e34 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALaserLock.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USALeafletDrop.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALeafletDrop.webp new file mode 100644 index 0000000..0fa54f4 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USALeafletDrop.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMOAB.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMOAB.webp new file mode 100644 index 0000000..5500205 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMOAB.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMicrowave.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMicrowave.webp new file mode 100644 index 0000000..1a04860 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMicrowave.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMissileDefender.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMissileDefender.webp new file mode 100644 index 0000000..d119e6d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAMissileDefender.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPaladinTank.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPaladinTank.webp new file mode 100644 index 0000000..b4b0039 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPaladinTank.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannon.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannon.webp new file mode 100644 index 0000000..8a82bc1 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannon.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannonFire.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannonFire.webp new file mode 100644 index 0000000..d63648f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAParticleCannonFire.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPathfinder.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPathfinder.webp new file mode 100644 index 0000000..d172c03 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPathfinder.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPatriot.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPatriot.webp new file mode 100644 index 0000000..91d9401 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPatriot.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPilot.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPilot.webp new file mode 100644 index 0000000..41e0f5e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAPilot.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USARanger.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARanger.webp new file mode 100644 index 0000000..4a0400c Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARanger.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USARangerMachineGun.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARangerMachineGun.webp new file mode 100644 index 0000000..4364f2e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARangerMachineGun.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USARaptor.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARaptor.webp new file mode 100644 index 0000000..3d78a65 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARaptor.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USARemoteDemoCharge.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARemoteDemoCharge.webp new file mode 100644 index 0000000..827715e Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARemoteDemoCharge.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USARocketPods.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARocketPods.webp new file mode 100644 index 0000000..03f22ec Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USARocketPods.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASearchAndDestroy.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASearchAndDestroy.webp new file mode 100644 index 0000000..69dfddf Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASearchAndDestroy.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDrone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDrone.webp new file mode 100644 index 0000000..fcc8946 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDrone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDroneGun.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDroneGun.webp new file mode 100644 index 0000000..4a75e8d Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASentryDroneGun.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpectreGunship.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpectreGunship.webp new file mode 100644 index 0000000..12ef3c3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpectreGunship.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpySattelite.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpySattelite.webp new file mode 100644 index 0000000..0bae982 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASpySattelite.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStealthFighter.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStealthFighter.webp new file mode 100644 index 0000000..ca04b23 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStealthFighter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStrategyCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStrategyCenter.webp new file mode 100644 index 0000000..acc0b14 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAStrategyCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyCenter.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyCenter.webp new file mode 100644 index 0000000..ec18282 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyCenter.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyDropZone.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyDropZone.webp new file mode 100644 index 0000000..2e76fe0 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyDropZone.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyLines.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyLines.webp new file mode 100644 index 0000000..75d8dab Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USASupplyLines.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USATOWMissile.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATOWMissile.webp new file mode 100644 index 0000000..d95c9df Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATOWMissile.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USATimedDemoCharge.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATimedDemoCharge.webp new file mode 100644 index 0000000..b7236f3 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATimedDemoCharge.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USATomahawkLauncher.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATomahawkLauncher.webp new file mode 100644 index 0000000..32a802f Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USATomahawkLauncher.webp differ diff --git a/src/Resources/Profiles/GeneralsZH/Icons/USA/USAWarFactory.webp b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAWarFactory.webp new file mode 100644 index 0000000..26f8254 Binary files /dev/null and b/src/Resources/Profiles/GeneralsZH/Icons/USA/USAWarFactory.webp differ diff --git a/src/Resources/TechTree.json b/src/Resources/Profiles/GeneralsZH/TechTree.json similarity index 100% rename from src/Resources/TechTree.json rename to src/Resources/Profiles/GeneralsZH/TechTree.json diff --git a/src/Resources/Theme/EditorBackground.webp b/src/Resources/Profiles/GeneralsZH/Theme/EditorBackground.webp similarity index 100% rename from src/Resources/Theme/EditorBackground.webp rename to src/Resources/Profiles/GeneralsZH/Theme/EditorBackground.webp diff --git a/src/Resources/Theme/EditorBackgroundWithPicture.webp b/src/Resources/Profiles/GeneralsZH/Theme/EditorBackgroundWithPicture.webp similarity index 100% rename from src/Resources/Theme/EditorBackgroundWithPicture.webp rename to src/Resources/Profiles/GeneralsZH/Theme/EditorBackgroundWithPicture.webp diff --git a/src/Resources/Theme/StartMenuBackground.webp b/src/Resources/Profiles/GeneralsZH/Theme/StartMenuBackground.webp similarity index 100% rename from src/Resources/Theme/StartMenuBackground.webp rename to src/Resources/Profiles/GeneralsZH/Theme/StartMenuBackground.webp diff --git a/src/Resources/Theme/Styles.css b/src/Resources/Profiles/GeneralsZH/Theme/Styles.css similarity index 84% rename from src/Resources/Theme/Styles.css rename to src/Resources/Profiles/GeneralsZH/Theme/Styles.css index 5b9ff1e..31c0405 100644 --- a/src/Resources/Theme/Styles.css +++ b/src/Resources/Profiles/GeneralsZH/Theme/Styles.css @@ -7,12 +7,7 @@ /* 6. https://stackoverflow.com/questions/9536725/css-multiple-attribute-selectors/9536746#9536746 */ /* Global style setting */ -* -{ - font-family: Calibri; - font-size: 10pt; - color: black; -} +QLabel, QRadioButton, QCheckBox { color: white; } QComboBox { @@ -52,8 +47,8 @@ QComboBox::drop-down padding-left: 10px; } -QComboBox::down-arrow { image: url(Resources/Theme/ScrollArrowDown.webp); } -QComboBox::up-arrow { image: url(Resources/Theme/ScrollArrowUp.webp); } +QComboBox::down-arrow { image: url(Resources/QtSources/ScrollArrowDown.webp); } +QComboBox::up-arrow { image: url(Resources/QtSources/ScrollArrowUp.webp); } /* ↓ Doesn't work */ QComboBox#cmbLanguage { height: 25px; } @@ -99,16 +94,39 @@ QPushButton:hover color: #baff0c; } -GreetingWindow QPushButton#btnSettings +/* SelectProfileWindow */ +SelectProfileWindow QPushButton#btnGenerals, +SelectProfileWindow QPushButton#btnGeneralsZH { - border-color: transparent; - background-color: transparent; + font-size: 18pt; + min-width: 230px; + max-width: 230px; + min-height: 110px; + max-height: 110px; + /* margin-top: 2px; + margin-right: 40px; + margin-bottom: 2px; + margin-left: 40px; */ } -GreetingWindow QPushButton { font-size: 18pt; } +SelectProfileWindow QPushButton#btnCustomProfile +{ + font-size: 16pt; + min-height: 64px; + max-height: 64px; + /* margin-top: 2px; + margin-right: 40px; + margin-bottom: 2px; + margin-left: 40px; */ +} -QLabel, QRadioButton, QCheckBox { color: white; } +SelectProfileWindow QPushButton#btnSettings +{ + border-color: transparent; + background-color: transparent; +} +/* LoadWindow */ QLineEdit#txtActionName { font-style: italic; } QPushButton#btnReview @@ -130,16 +148,16 @@ QPushButton#btnOk } /* Start widgets and SettingsWindow style settings */ -LoadFromTheFileWindow, SetUpWindowsWrapper, LoadFromTheGameWindow, SettingsWindow, QWidget#pSettingsWindow +SetUpWindowsWrapper, SelectProfileWindow, LoadWindow, SettingsWindow, QWidget#pSettingsWindow { - border-image: url(Resources/Theme/StartMenuBackground.webp) 0 0 0 0 stretch stretch; + border-image: url(Resources/Profiles/GeneralsZH/Theme/StartMenuBackground.webp) 0 0 0 0 stretch stretch; background-color: black; } /* Editor window style settings */ EditorWindow { - border-image: url(Resources/Theme/EditorBackground.webp) 0 0 0 0 stretch stretch; + border-image: url(Resources/Profiles/GeneralsZH/Theme/EditorBackground.webp) 0 0 0 0 stretch stretch; background-color: black; } @@ -163,8 +181,8 @@ EditorWindow QPushButton:pressed { background-color: #3543e7; color: whi EditorWindow QPushButton:pressed:hover { background-color: #3543e7; color: #baff0c; } QPushButton[faction="GLA"] { background-color: #185a22; border-color: #b1ffbf; } -QPushButton[faction="GLA"]:pressed { background-color: #427b32; /*color: black;*/ } QPushButton[faction="GLA"]:hover { background-color: #427b32; color: #c9c9c9; } +QPushButton[faction="GLA"]:pressed { background-color: #427b32; /*color: black;*/ } QPushButton[faction="GLA"]:pressed:hover { background-color: #427b32; color: #c9c9c9; } QPushButton[faction="PRC"] { background-color: #5a1f18; border-color: #ffbbb1; } @@ -195,8 +213,8 @@ QTreeWidget::item QTreeWidget::item:selected, QTreeWidget::item:selected:!active { background-color: #3543e7; color: white; } -QTreeWidget::branch:open:has-children { background-image: url(Resources/Theme/DropArrowDown.webp); } -QTreeWidget::branch:closed:has-children { background-image: url(Resources/Theme/DropArrowRight.webp); } +QTreeWidget::branch:open:has-children { background-image: url(Resources/QtSources/DropArrowDown.webp); } +QTreeWidget::branch:closed:has-children { background-image: url(Resources/QtSources/DropArrowRight.webp); } QTabWidget QWidget { @@ -273,7 +291,7 @@ QScrollBar::add-page, QScrollBar::sub-page QDialog { - border-image: url(Resources/Theme/StartMenuBackground.webp) 0 0 0 0 stretch stretch; + border-image: url(Resources/Profiles/GeneralsZH/Theme/StartMenuBackground.webp) 0 0 0 0 stretch stretch; background-color: black; } diff --git a/src/Resources/Profiles/Styles.css b/src/Resources/Profiles/Styles.css new file mode 100644 index 0000000..2f500c8 --- /dev/null +++ b/src/Resources/Profiles/Styles.css @@ -0,0 +1,15 @@ +/* See more about Qt .css support in documentation and questions: */ +/* 1. https://doc.qt.io/qt-5/stylesheet-syntax.html */ +/* 2. https://doc.qt.io/qt-5/stylesheet-reference.html */ +/* 3. https://doc.qt.io/qt-5/stylesheet-examples.html */ +/* 4. https://forum.qt.io/topic/40151/solved-scaled-background-image-using-stylesheet/3 */ +/* 5. https://www.qtcentre.org/threads/55152-Is-it-possible-to-logically-combine-dynamic-properties-in-a-Qt-Stylesheet */ +/* 6. https://stackoverflow.com/questions/9536725/css-multiple-attribute-selectors/9536746#9536746 */ + +/* Global style setting */ +* +{ + font-family: Calibri; + font-size: 10pt; + color: black; +} diff --git a/src/Resources/Theme/DropArrowDown.webp b/src/Resources/QtSources/DropArrowDown.webp similarity index 100% rename from src/Resources/Theme/DropArrowDown.webp rename to src/Resources/QtSources/DropArrowDown.webp diff --git a/src/Resources/Theme/DropArrowRight.webp b/src/Resources/QtSources/DropArrowRight.webp similarity index 100% rename from src/Resources/Theme/DropArrowRight.webp rename to src/Resources/QtSources/DropArrowRight.webp diff --git a/src/Resources/Theme/ScrollArrowDown.webp b/src/Resources/QtSources/ScrollArrowDown.webp similarity index 100% rename from src/Resources/Theme/ScrollArrowDown.webp rename to src/Resources/QtSources/ScrollArrowDown.webp diff --git a/src/Resources/Theme/ScrollArrowUp.webp b/src/Resources/QtSources/ScrollArrowUp.webp similarity index 100% rename from src/Resources/Theme/ScrollArrowUp.webp rename to src/Resources/QtSources/ScrollArrowUp.webp diff --git a/src/Resources/Settings.json b/src/Resources/Settings.json index f4c088a..2b47905 100644 --- a/src/Resources/Settings.json +++ b/src/Resources/Settings.json @@ -1,5 +1,4 @@ { - "Theme" : "Default", "DebugConsole" : false, "StatusBar" : true, "DiscordRPC" : true, diff --git a/src/Resources/Translations/ru.ts b/src/Resources/Translations/ru.ts index a91d340..bda8942 100644 --- a/src/Resources/Translations/ru.ts +++ b/src/Resources/Translations/ru.ts @@ -6,7 +6,7 @@ Edit source text - + Изменить исходный текст @@ -27,22 +27,22 @@ EditorWindow - + File Файл - + Open Открыть - + Save Сохранить - + Save As... Сохранить как... @@ -51,49 +51,49 @@ Дополнительно - + Close Закрыть - + View Вид - + Status Bar Строка состояния - + Enable Включить - + Disable Отключить - - + + Settings Настройки - - + + About О программе - + Layout %1 Раскладка %1 - + <p>Authors: %1<br>Version: %2<br><br>Program licensed with %3<br><br>GitHub repository:<br>%4<br><br>Support development:<br>%5</p> <p>Авторы: %1<br>Версия: %2<br><br>Программа лицензирована под %3<br><br>Репозиторий на GitHub:<br>%4<br><br>Поддержать разработку:<br>%5</p> @@ -118,32 +118,32 @@ Поддержать разработку: - + Changes has been saved to the file: Изменения были сохранены в файл: - + Saved as: Сохранено как: - + Opening selected file Открываем выбранный файл - + Changing editor language Изменяем язык редактора - + Binary files Двоичные файлы - + Any files Все файлы @@ -151,82 +151,81 @@ GreetingWindow - - LOAD FROM - ЗАГРУЗИТЬ + ЗАГРУЗИТЬ - THE GAME - ИЗ ИГРЫ + ИЗ ИГРЫ - THE FILE - ИЗ ФАЙЛА + ИЗ ФАЙЛА + + + + LoadFromTheGameWindow + + START + НАЧАТЬ + + + BACK + НАЗАД - LoadFromTheFileWindow + LoadWindow - + START НАЧАТЬ - + BACK НАЗАД - + + FROM THE GAME + ИЗ ИГРЫ + + + Select .csf or .big file: Выберите .csf или .big файл: - + Binary files Двоичные файлы - + Any files Все файлы - + REVIEW ОБЗОР - - LoadFromTheGameWindow - - - START - НАЧАТЬ - - - - BACK - НАЗАД - - QObject - + Error with CSF file Ошибка с CSF файлом - + Cannot process the empty file. Невозможно обработать пустой файл. - + Unable to find selected CSF file. Невозможно найти указанный CSF файл. @@ -235,179 +234,181 @@ - + Choosen CSF file doesn't have CONTROLBAR category. Make sure that you are load correct file. У выбранного CSF файла отсутствует категория CONTROLBAR. Проверьте, что вы загружаете правильный файл. - + Choosen CSF file doesn't have OBJECT category. Make sure that you are load correct file. У выбранного CSF файла отсутствует категория OBJECT. Проверьте, что вы загружаете правильный файл. - + Unable to find "generals.csf" file in "%1" folder. Невозможно найти "generals.csf" в папке "%1". - + Unable to find CSF file inside BIG archive "%1" Невозможно найти CSF файл внутри BIG архива "%1" - + Erroneous assignment - + Ошибка назначения - + USA США - + United Stated Of America Соединённые штаты Америки - + SUPERWEAPON СВГ - + Superweapons General Генерал супероружейных войск - + AIR ВВС - + Airforce General Генерал ВВС - + LASER ЛАЗЕРНИК - + Laser Weapons Generals Генерал лазерного вооружения - + CHINA КИТАЙ - + China Китай - + INFANTRY ПЕХОТНИК - + Infantry General Генерал пехотных войск - + NUKE ЯДЕРЩИК - + Nuke General Генерал ядерных войск - + TANK ТАНКОВИК - + Tank General Генерал танковых войск - + GLA МАО - + Global Liberation Army Мировая армия освобождения - + TOXIC ТОКС - + Toxic Weapons General Генерал биохимического оружия - + STEALTH СТЕЛС - + Stealth General Генерал маскировочных войск - + DEMO ПОДРЫВНИК - + Demolition General Генерал подрывных войск - + Buildings Здания - + You have assign as hotkey a non-ASCII character "%1". Make sure that you are using ASCII only symbols. - + Вы назначили не ASCII символ "%1" как горячую клавишу. +Убедитесь, что вы используете только ASCII символы. - + You have assign as hotkey a forbidden character "%1". Make sure that you are using only allowed symbols. - + Вы назначили запрещённый символ "%1" как горячую клавишу. +Убедитесь, что вы используете только разрешённые символы. - + Infantry Пехота - + Vehicles Техника - + Aircrafts Авиация