From 3f8702be9383654224d2c69cb660b1e43e29be38 Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sat, 4 May 2013 22:25:01 +0100 Subject: [PATCH] Started implementing GUI. The 'Sort Plugins' button just runs the tester code for now. Metadata editor is unimplemented. --- BOSS.ico | Bin 0 -> 113811 bytes CMakeLists.txt | 23 +- examples/settings.yaml | 4 +- resource.rc | 22 ++ src/game.cpp | 4 +- src/globals.h | 1 + src/gui/ids.cpp | 38 +++ src/gui/ids.h | 74 ++++++ src/gui/main.cpp | 519 +++++++++++++++++++++++++++++++++++++++++ src/gui/main.h | 71 ++++++ src/gui/settings.cpp | 239 +++++++++++++++++++ src/gui/settings.h | 50 ++++ src/helpers.cpp | 2 +- src/helpers.h | 5 +- src/metadata.cpp | 6 +- src/parsers.h | 2 +- src/tester.cpp | 251 -------------------- 17 files changed, 1042 insertions(+), 269 deletions(-) create mode 100644 BOSS.ico create mode 100644 resource.rc create mode 100644 src/gui/ids.cpp create mode 100644 src/gui/ids.h create mode 100644 src/gui/main.cpp create mode 100644 src/gui/main.h create mode 100644 src/gui/settings.cpp create mode 100644 src/gui/settings.h delete mode 100644 src/tester.cpp diff --git a/BOSS.ico b/BOSS.ico new file mode 100644 index 0000000000000000000000000000000000000000..568cbaf22adb243c5208754d626f81b86265cca7 GIT binary patch literal 113811 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 UGop$e;9uj|zzo4hnAbQ00M?^G82|tP literal 0 HcmV?d00001 diff --git a/CMakeLists.txt b/CMakeLists.txt index 47c938ec..f3dd0ad8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,8 @@ include_directories ("${PROJECT_LIBS_DIR}/alphanum" "${PROJECT_LIBS_DIR}/utf8" " # Settings when compiling for Windows. IF (CMAKE_SYSTEM_NAME MATCHES "Windows") + add_definitions (-DUNICODE -D_UNICODE) + set (BOSS_SRC ${BOSS_SRC} "${CMAKE_SOURCE_DIR}/resource.rc") IF (${PROJECT_LINK} MATCHES "STATIC") add_definitions (-DLIBLO_STATIC) add_definitions (-DBOSS_STATIC) @@ -52,8 +54,10 @@ IF (CMAKE_HOST_SYSTEM_NAME MATCHES "Linux") set (CMAKE_MODULE_LINKER_FLAGS "-static-libstdc++ -static-libgcc") IF (CMAKE_SYSTEM_NAME MATCHES "Windows") - link_directories ("${PROJECT_LIBS_DIR}/boost/stage-mingw-${PROJECT_ARCH}/lib") - set (BOSS_LIBS version) + link_directories ("${PROJECT_LIBS_DIR}/boost/stage-mingw-${PROJECT_ARCH}/lib" "${PROJECT_LIBS_DIR}/wxWidgets/build-msw/lib") + include_directories ("${PROJECT_LIBS_DIR}/wxWidgets/build-msw/lib/wx/include/i586-mingw32msvc-msw-unicode-static-2.9" "${PROJECT_LIBS_DIR}/wxWidgets/include") + set (BOSS_LIBS version wx_mswu_core-2.9-i586-mingw32msvc wx_baseu-2.9-i586-mingw32msvc wx_mswu_adv-2.9-i586-mingw32msvc wxpng-2.9-i586-mingw32msvc wxzlib-2.9-i586-mingw32msvc comctl32) + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--subsystem,windows") ENDIF () set (BOSS_LIBS ${BOSS_LIBS} zlibstatic loadorder yaml-cpp boost_locale boost_filesystem boost_system boost_regex) @@ -65,14 +69,23 @@ IF (CMAKE_HOST_SYSTEM_NAME MATCHES "Windows") set (CMAKE_CXX_FLAGS "/EHsc") ENDIF () +############################## +# More General Settings +############################## + +set (BOSS_GUI_SRC ${BOSS_SRC} "${CMAKE_SOURCE_DIR}/src/gui/ids.cpp" "${CMAKE_SOURCE_DIR}/src/gui/main.cpp" "${CMAKE_SOURCE_DIR}/src/gui/settings.cpp") + +set (BOSS_API_SRC ${BOSS_SRC} "${CMAKE_SOURCE_DIR}/src/api.cpp") + + ############################## # Actual Building ############################## # Build API. -#add_library (boss ${PROJECT_LINK} "${CMAKE_SOURCE_DIR}/src/api.cpp" ${BOSS_SRC}) +#add_library (boss ${PROJECT_LINK} ${BOSS_API_SRC}) #target_link_libraries (boss ${BOSS_LIBS}) # Build tester. -add_executable (tester "${CMAKE_SOURCE_DIR}/src/tester.cpp" ${BOSS_SRC}) -target_link_libraries (tester ${BOSS_LIBS}) +add_executable (BOSS ${BOSS_GUI_SRC}) +target_link_libraries (BOSS ${BOSS_LIBS}) diff --git a/examples/settings.yaml b/examples/settings.yaml index 28041a9b..cf7c04aa 100644 --- a/examples/settings.yaml +++ b/examples/settings.yaml @@ -3,8 +3,8 @@ Language: eng # An ISO 639-3 language string. -Game: auto # auto, oblivion, skyrim, fallout3, falloutnv -Last Game: auto # auto, oblivion, skyrim, fallout3, falloutnv +Game: auto # auto, oblivion, nehrim, skyrim, fallout3, falloutnv +Last Game: auto # auto, oblivion, nehrim, skyrim, fallout3, falloutnv Debug Verbosity: 0 # 0, 1, 2, 3. Logging takes place if > 0. Update Masterlist: true diff --git a/resource.rc b/resource.rc new file mode 100644 index 00000000..15abb9f5 --- /dev/null +++ b/resource.rc @@ -0,0 +1,22 @@ +#include "wx/msw/wx.rc" +1 VERSIONINFO + FILEVERSION 3,0,0,0 + PRODUCTVERSION 3,0,0,0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileVersion", "3.0.0" + VALUE "LegalCopyright", "Copyright (C) 2013 WrinklyNinja" + VALUE "ProductVersion", "3.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END +MAINICON ICON "BOSS.ico" diff --git a/src/game.cpp b/src/game.cpp index dc6fcc7d..acf6bf66 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -43,9 +43,7 @@ namespace fs = boost::filesystem; namespace boss { - Game::Game() { - throw error(ERROR_INVALID_ARGS, "No arguments supplied."); - } + Game::Game() {} Game::Game(const unsigned int gameCode, const string path, const bool noPathInit) : id(gameCode) { diff --git a/src/globals.h b/src/globals.h index c574624a..a4a267e8 100644 --- a/src/globals.h +++ b/src/globals.h @@ -30,6 +30,7 @@ namespace boss { const unsigned int GAME_TES5 = 2; const unsigned int GAME_FO3 = 3; const unsigned int GAME_FONV = 4; + const unsigned int GAME_NEHRIM = 5; const unsigned int VERSION_MAJOR = 3; const unsigned int VERSION_MINOR = 0; diff --git a/src/gui/ids.cpp b/src/gui/ids.cpp new file mode 100644 index 00000000..df7ec623 --- /dev/null +++ b/src/gui/ids.cpp @@ -0,0 +1,38 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#include "ids.h" + +#include + +wxString translate(const std::string& str) { + return wxString(boost::locale::translate(str).str().c_str(), wxConvUTF8); +} + +wxString FromUTF8(const std::string& str) { + return wxString(str.c_str(), wxConvUTF8); +} + +wxString FromUTF8(const boost::format& f) { + return FromUTF8(f.str()); +} diff --git a/src/gui/ids.h b/src/gui/ids.h new file mode 100644 index 00000000..a2836dcb --- /dev/null +++ b/src/gui/ids.h @@ -0,0 +1,74 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#ifndef __BOSS_GUI_IDS__ +#define __BOSS_GUI_IDS__ + +#include +#include +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP +# include "wx/wx.h" +#endif + + +enum { + //Main window. + OPTION_EditMetadata = wxID_HIGHEST + 1, // declares an id which will be used to call our button + OPTION_ViewLastReport, + OPTION_SortPlugins, + MENU_Quit, + MENU_OpenMainReadMe, + MENU_OpenSyntaxReadMe, + MENU_OpenAPIReadMe, + MENU_OpenVersionHistory, + MENU_OpenLicenses, + MENU_ShowAbout, + MENU_ShowSettings, + MENU_Oblivion, + MENU_Nehrim, + MENU_Skyrim, + MENU_Fallout3, + MENU_FalloutNewVegas, + //Settings window. + OPTION_OKExitSettings, + OPTION_CancelExitSettings +}; + +wxString translate(const std::string& str); + +wxString FromUTF8(const std::string& str); + +wxString FromUTF8(const boost::format& f); + +// Temporary hacks. +const char * const libespm_options_path = "libespm.cfg"; +const char * const libespm_game = "Skyrim"; + +const char * const masterlist_path = "masterlist.yaml"; +const char * const userlist_path = "userlist.yaml"; +const char * const results_path = "results.yaml"; +const char * const settings_path = "settings.yaml"; + +#endif diff --git a/src/gui/main.cpp b/src/gui/main.cpp new file mode 100644 index 00000000..c2674f83 --- /dev/null +++ b/src/gui/main.cpp @@ -0,0 +1,519 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#include "../globals.h" +#include "../metadata.h" +#include "../parsers.h" +#include "main.h" +#include "settings.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +BEGIN_EVENT_TABLE ( Launcher, wxFrame ) + EVT_MENU ( MENU_Quit, Launcher::OnQuit ) + EVT_MENU ( OPTION_EditMetadata, Launcher::OnEditMetadata ) + EVT_MENU ( OPTION_ViewLastReport, Launcher::OnViewLastReport ) + EVT_MENU ( OPTION_SortPlugins, Launcher::OnSortPlugins ) + EVT_MENU ( MENU_OpenMainReadMe, Launcher::OnOpenFile ) + EVT_MENU ( MENU_OpenSyntaxReadMe, Launcher::OnOpenFile ) + EVT_MENU ( MENU_OpenAPIReadMe, Launcher::OnOpenFile ) + EVT_MENU ( MENU_OpenVersionHistory, Launcher::OnOpenFile ) + EVT_MENU ( MENU_OpenLicenses, Launcher::OnOpenFile ) + EVT_MENU ( MENU_ShowAbout, Launcher::OnAbout ) + EVT_MENU ( MENU_ShowSettings, Launcher::OnOpenSettings ) + EVT_MENU ( MENU_Oblivion, Launcher::OnGameChange ) + EVT_MENU ( MENU_Nehrim, Launcher::OnGameChange ) + EVT_MENU ( MENU_Skyrim, Launcher::OnGameChange ) + EVT_MENU ( MENU_Fallout3, Launcher::OnGameChange ) + EVT_MENU ( MENU_FalloutNewVegas, Launcher::OnGameChange ) + EVT_BUTTON ( OPTION_SortPlugins, Launcher::OnSortPlugins ) + EVT_BUTTON ( OPTION_EditMetadata, Launcher::OnEditMetadata ) + EVT_BUTTON ( OPTION_ViewLastReport, Launcher::OnViewLastReport ) +END_EVENT_TABLE() + +IMPLEMENT_APP(BossGUI); + +using namespace boss; +using namespace std; + +namespace fs = boost::filesystem; +namespace loc = boost::locale; + +// Temporary hacks. +const fs::path readme_path = fs::path("Docs") / "BOSS Readme.html"; +const fs::path syntax_doc_path = fs::path("Docs") / "BOSS Metadata File Syntax.html"; +const fs::path api_doc_path = fs::path("Docs") / "BOSS API Readme.html"; +const fs::path version_history_path = fs::path("Docs") / "BOSS Version History.html"; +const fs::path licenses_path = fs::path("Docs") / "Licenses.txt"; + +bool BossGUI::OnInit() { + //Check if GUI is already running. + wxSingleInstanceChecker *checker = new wxSingleInstanceChecker; + + if (checker->IsAnotherRunning()) { + //Should print error message here. + delete checker; // OnExit() won't be called if we return false + checker = NULL; + + return false; + } + + //Load settings. + YAML::Node settings; + if (fs::exists(settings_path)) { + settings = YAML::LoadFile(settings_path); + } + + //Apply logging and language settings (skipping for tester though). + + //Also skipping game detection. + Game game(GAME_TES5); + vector detected; + detected.push_back(GAME_TES5); + + //Create launcher window. + Launcher * launcher = new Launcher(wxT("BOSS"), settings, game, detected); + + launcher->SetIcon(wxIconLocation("BOSS.exe")); + launcher->Show(); + SetTopWindow(launcher); + + return true; +} + +Launcher::Launcher(const wxChar *title, const YAML::Node& settings, const Game& game, const vector& detectedGames) : wxFrame(NULL, wxID_ANY, title), _game(game), _detectedGames(detectedGames), _settings(settings) { + + //Set up menu bar first. + MenuBar = new wxMenuBar(); + // File Menu + FileMenu = new wxMenu(); + FileMenu->Append(OPTION_ViewLastReport, translate("&View Last Report"), translate("Opens your last report.")); + FileMenu->Append(OPTION_SortPlugins, translate("&Sort Plugins"), translate("Sorts your installed plugins.")); + FileMenu->AppendSeparator(); + FileMenu->Append(MENU_Quit, translate("&Quit"), translate("Quit BOSS.")); + MenuBar->Append(FileMenu, translate("&File")); + //Edit Menu + EditMenu = new wxMenu(); + EditMenu->Append(OPTION_EditMetadata, translate("&Metadata..."), translate("Opens a window where you can edit plugin metadata.")); + EditMenu->Append(MENU_ShowSettings, translate("&Settings..."), translate("Opens the Settings window.")); + MenuBar->Append(EditMenu, translate("&Edit")); + //Game menu + GameMenu = new wxMenu(); + GameMenu->AppendRadioItem(MENU_Oblivion, wxT("&Oblivion"), translate("Switch to running BOSS for Oblivion.")); + GameMenu->AppendRadioItem(MENU_Nehrim, wxT("&Nehrim"), translate("Switch to running BOSS for Nehrim.")); + GameMenu->AppendRadioItem(MENU_Skyrim, wxT("&Skyrim"), translate("Switch to running BOSS for Skyrim.")); + GameMenu->AppendRadioItem(MENU_Fallout3, wxT("&Fallout 3"), translate("Switch to running BOSS for Fallout 3.")); + GameMenu->AppendRadioItem(MENU_FalloutNewVegas, wxT("&Fallout: New Vegas"), translate("Switch to running BOSS for Fallout: New Vegas.")); + MenuBar->Append(GameMenu, translate("&Active Game")); + // About menu + HelpMenu = new wxMenu(); + HelpMenu->Append(MENU_OpenMainReadMe, translate("Open &Main Readme"), translate("Opens the main BOSS readme in your default web browser.")); + HelpMenu->Append(MENU_OpenSyntaxReadMe, translate("Open &Metadata File Syntax Doc"), translate("Opens the BOSS metadata file syntax documentation in your default web browser.")); + HelpMenu->Append(MENU_OpenAPIReadMe, translate("&Open API Readme"), translate("Opens the BOSS API readme in your default web browser.")); + HelpMenu->Append(MENU_OpenVersionHistory, translate("Open &Version History"), translate("Opens the BOSS version history in your default web browser.")); + HelpMenu->Append(MENU_OpenLicenses, translate("View &Copyright Licenses"), translate("View the GNU General Public License v3.0 and GNU Free Documentation License v1.3.")); + HelpMenu->AppendSeparator(); + HelpMenu->Append(MENU_ShowAbout, translate("&About BOSS..."), translate("Shows information about BOSS.")); + MenuBar->Append(HelpMenu, translate("&Help")); + SetMenuBar(MenuBar); + + //Set up stuff in the frame. + SetBackgroundColour(wxColour(255,255,255)); + + //Add the three buttons. + wxBoxSizer *buttonBox = new wxBoxSizer(wxVERTICAL); + buttonBox->Add(EditButton = new wxButton(this,OPTION_EditMetadata, translate("Edit Metadata")), 1, wxEXPAND|wxALIGN_CENTRE|wxALL, 10); + buttonBox->Add(SortButton = new wxButton(this,OPTION_SortPlugins, translate("Sort Plugins")), 1, wxEXPAND|wxALIGN_CENTRE|wxLEFT|wxRIGHT, 10); + buttonBox->Add(ViewButton = new wxButton(this,OPTION_ViewLastReport, translate("View Last Report")), 1, wxEXPAND|wxALIGN_CENTRE|wxALL, 10); + + SortButton->SetDefault(); + + if (_game.Id() == GAME_TES4) + GameMenu->FindItem(MENU_Oblivion)->Check(); + else if (_game.Id() == GAME_NEHRIM) + GameMenu->FindItem(MENU_Nehrim)->Check(); + else if (_game.Id() == GAME_TES5) + GameMenu->FindItem(MENU_Skyrim)->Check(); + else if (_game.Id() == GAME_FO3) + GameMenu->FindItem(MENU_Fallout3)->Check(); + else if (_game.Id() == GAME_FONV) + GameMenu->FindItem(MENU_FalloutNewVegas)->Check(); + + DisableUndetectedGames(); + + //Now set the layout and sizes. + SetSizerAndFit(buttonBox); + SetSize(wxSize(250, 200)); +} + +//Called when the frame exits. +void Launcher::OnQuit(wxCommandEvent& event) { + Close(true); // Tells the OS to quit running this process +} + +void Launcher::OnSortPlugins(wxCommandEvent& event) { + + wxProgressDialog *progDia = new wxProgressDialog(translate("BOSS: Working..."),translate("BOSS working..."), 1000, this, wxPD_APP_MODAL|wxPD_AUTO_HIDE|wxPD_ELAPSED_TIME); + + time_t t0 = time(NULL); + + /* Stuff still missing from a normal execution of BOSS: + + - Reading of settings file. + - Detecting game to run for. + - Error handling. + - Masterlist updating. + - Checks for metadata self-consistency. + - Checks for cyclic dependencies and incompatibilities. + - Setting of load order. + + Need to include libespm setup into game setup, once the former is made to be not global. + */ + + ofstream out("out.txt"); + + out << "Setting up libespm and BOSS..." << endl; + + // Set up libesm. + common::options::setGame(libespm_game); + ifstream input(libespm_options_path); + common::readOptions(input); + input.close(); + + //Set up BOSS vars. + boss::Game game(boss::GAME_TES5); + + out << "Reading plugins in Data folder..." << endl; + time_t start, end; + start = time(NULL); + + // Get a list of the plugins. + list plugins; + for (fs::directory_iterator it(game.DataPath()); it != fs::directory_iterator(); ++it) { + if (fs::is_regular_file(it->status()) && (it->path().extension().string() == ".esp" || it->path().extension().string() == ".esm")) { + + string filename = it->path().filename().string(); + if (filename == "Skyrim.esm" + || filename == "Tamriel Compendium.esp" + || filename == "Tamriel Compendium - Skill Books.esp") + continue; // Libespm crashes with these plugins. + + out << "Reading plugin: " << filename << endl; + boss::Plugin plugin(game, filename); + plugins.push_back(plugin); + + progDia->Pulse(); + } + } + + end = time(NULL); + out << "Time taken to read plugins: " << (end - start) << " seconds." << endl; + start = time(NULL); + + YAML::Node mlist, ulist; + list messages, mlist_messages, ulist_messages; + list mlist_plugins, ulist_plugins; + + if (fs::exists(masterlist_path)) { + out << "Parsing masterlist..." << endl; + + mlist = YAML::LoadFile(masterlist_path); + if (mlist["globals"]) + mlist_messages = mlist["globals"].as< list >(); + if (mlist["plugins"]) + mlist_plugins = mlist["plugins"].as< list >(); + + end = time(NULL); + out << "Time taken to parse masterlist: " << (end - start) << " seconds." << endl; + start = time(NULL); + } + + if (fs::exists(userlist_path)) { + out << "Parsing userlist..." << endl; + + ulist = YAML::LoadFile(userlist_path); + if (ulist["globals"]) + ulist_messages = ulist["globals"].as< list >(); + if (ulist["plugins"]) + ulist_plugins = ulist["plugins"].as< list >(); + + end = time(NULL); + out << "Time taken to parse userlist: " << (end - start) << " seconds." << endl; + start = time(NULL); + } + + progDia->Pulse(); + + if (fs::exists(masterlist_path) || fs::exists(userlist_path)) { + out << "Merging plugin lists..." << endl; + + //Merge all global message lists. + messages = mlist_messages; + messages.insert(messages.end(), ulist_messages.begin(), ulist_messages.end()); + + //Merge plugin list, masterlist and userlist plugin data. + for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { + //Check if there is already a plugin in the 'plugins' list or not. + list::iterator pos = std::find(mlist_plugins.begin(), mlist_plugins.end(), *it); + + if (pos != mlist_plugins.end()) { + //Need to merge plugins. + it->Merge(*pos); + } + + pos = std::find(ulist_plugins.begin(), ulist_plugins.end(), *it); + + if (pos != ulist_plugins.end()) { + //Need to merge plugins. + it->Merge(*pos); + } + } + + end = time(NULL); + out << "Time taken to merge lists: " << (end - start) << " seconds." << endl; + start = time(NULL); + } + + progDia->Pulse(); + + out << "Evaluating any conditions in plugin list..." << endl; + + for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { + try { + it->EvalAllConditions(game); + } catch (boss::error& e) { + out << e.what() << endl; + } + } + + end = time(NULL); + out << "Time taken to evaluate plugin list: " << (end - start) << " seconds." << endl; + start = time(NULL); + + progDia->Pulse(); + + out << "Checking install validity..." << endl; + + for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) { + map issues = it->CheckInstallValidity(game); + for (map::const_iterator jt=issues.begin(), endJt=issues.end(); jt != endJt; ++jt) { + if (jt->second) + out << "Error: Invalid install detected! \"" << jt->first << "\" is incompatible with \"" << it->Name() << "\" and is present." << endl; + else + out << "Error: Invalid install detected! \"" << jt->first << "\" is required by \"" << it->Name() << "\" but is missing." << endl; + } + } + + + + progDia->Pulse(); + + out << "Printing plugin details..." << endl; + + for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) { + out << it->Name() << endl + << '\t' << "Number of records: " << it->FormIDs().size() << endl + << '\t' << "Is Master: " << it->IsMaster() << endl + << '\t' << "Masters:" << endl; + + vector masters = it->Masters(); + for(int i = 0; i < masters.size(); ++i) + out << '\t' << '\t' << i << ": " << masters[i] << endl; + + out << '\t' << "Conflicts with:" << endl; + for (list::iterator jt=plugins.begin(), endJt = plugins.end(); jt != endJt; ++jt) { + if (*jt != *it && !jt->MustLoadAfter(*it)) { + size_t overlap = jt->OverlapFormIDs(*it).size(); + if (overlap > 0) + out << '\t' << '\t' << jt->Name() << " (" << overlap << " records)" << endl; + } + } + } + + progDia->Pulse(); + + end = time(NULL); + out << "Time taken to print plugins' details: " << (end - start) << " seconds." << endl; + start = time(NULL); + + out << "Sorting plugins..." << endl; + + plugins.sort(); + + end = time(NULL); + out << "Time taken to sort plugins: " << (end - start) << " seconds." << endl; + + progDia->Pulse(); + + for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) + out << it->Name() << endl; + + out << "Writing results file..." << endl; + + YAML::Emitter yout; + yout.SetIndent(2); + yout << YAML::BeginMap + << YAML::Key << "globals" << YAML::Value << messages + << YAML::Key << "plugins" << YAML::Value << plugins + << YAML::EndMap; + + ofstream results_out(results_path); + results_out << yout.c_str(); + results_out.close(); + + progDia->Pulse(); + + out << "Tester finished. Total time taken: " << time(NULL) - t0 << endl; + out.close(); + + progDia->Destroy(); +} + +void Launcher::OnEditMetadata(wxCommandEvent& event) { + +} + +void Launcher::OnViewLastReport(wxCommandEvent& event) { + +} + +void Launcher::OnOpenSettings(wxCommandEvent& event) { + //Tell the user that stuff is happenining. + SettingsFrame *settings = new SettingsFrame(translate("BOSS: Settings"), this, _settings); + settings->SetIcon(wxIconLocation("BOSS.exe")); + settings->Show(); +} + +void Launcher::OnGameChange(wxCommandEvent& event) { + try { + switch (event.GetId()) { + case MENU_Oblivion: + _game = Game(GAME_TES4); + _settings["Last Game"] = "oblivion"; + break; + case MENU_Nehrim: + _game = Game(GAME_NEHRIM); + _settings["Last Game"] = "nehrim"; + break; + case MENU_Skyrim: + _game = Game(GAME_TES5); + _settings["Last Game"] = "skyrim"; + break; + case MENU_Fallout3: + _game = Game(GAME_FO3); + _settings["Last Game"] = "fallout3"; + break; + case MENU_FalloutNewVegas: + _game = Game(GAME_FONV); + _settings["Last Game"] = "falloutnv"; + break; + } + } catch (error& e) { + wxMessageBox(e.what(), translate("BOSS: Error"), wxOK | wxICON_ERROR, this); + } + _game.CreateBOSSGameFolder(); + SetTitle(wxT("BOSS - " + _game.Name())); //Don't need to convert name, known to be only ASCII chars. +} + +void Launcher::OnOpenFile(wxCommandEvent& event) { + string file; + if (event.GetId() == MENU_OpenMainReadMe) + file = readme_path.string(); + else if (event.GetId() == MENU_OpenSyntaxReadMe) + file = syntax_doc_path.string(); + else if (event.GetId() == MENU_OpenAPIReadMe) + file = api_doc_path.string(); + else if (event.GetId() == MENU_OpenVersionHistory) + file = version_history_path.string(); + else if (event.GetId() == MENU_OpenLicenses) + file = licenses_path.string(); + //Look for file. + if (fs::exists(file)) { + wxLaunchDefaultApplication(file); + } else //No ReadMe exists, show a pop-up message saying so. + wxMessageBox( + FromUTF8(boost::format(loc::translate("Error: \"%1%\" cannot be found.")) % file), + translate("BOSS: Error"), + wxOK | wxICON_ERROR, + this); +} + +void Launcher::OnAbout(wxCommandEvent& event) { + wxAboutDialogInfo aboutInfo; + aboutInfo.SetName("BOSS"); + aboutInfo.SetVersion(IntToString(VERSION_MAJOR)+"."+IntToString(VERSION_MINOR)+"."+IntToString(VERSION_PATCH)); + aboutInfo.SetDescription(translate("A utility that optimises \nTES IV: Oblivion, Nehrim - At Fate's Edge, TES V: Skyrim, Fallout 3 and Fallout: New Vegas mod load orders.")); + aboutInfo.SetCopyright("Copyright (C) 2009-2013 BOSS Development Team."); + aboutInfo.SetWebSite("http://code.google.com/p/better-oblivion-sorting-software/"); + aboutInfo.SetLicence("This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation, either version 3 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program. If not, see ."); + aboutInfo.SetIcon(wxIconLocation("BOSS.exe")); + wxAboutBox(aboutInfo); +} + +void Launcher::DisableUndetectedGames() { + GameMenu->FindItem(MENU_Oblivion)->Enable(false); + GameMenu->FindItem(MENU_Nehrim)->Enable(false); + GameMenu->FindItem(MENU_Skyrim)->Enable(false); + GameMenu->FindItem(MENU_Fallout3)->Enable(false); + GameMenu->FindItem(MENU_FalloutNewVegas)->Enable(false); + for (size_t i=0; i < _detectedGames.size(); i++) { + if (_detectedGames[i] == GAME_TES4) + GameMenu->FindItem(MENU_Oblivion)->Enable(); + else if (_detectedGames[i] == GAME_NEHRIM) + GameMenu->FindItem(MENU_Nehrim)->Enable(); + else if (_detectedGames[i] == GAME_TES5) + GameMenu->FindItem(MENU_Skyrim)->Enable(); + else if (_detectedGames[i] == GAME_FO3) + GameMenu->FindItem(MENU_Fallout3)->Enable(); + else if (_detectedGames[i] == GAME_FONV) + GameMenu->FindItem(MENU_FalloutNewVegas)->Enable(); + } + + SetTitle(wxT("BOSS - " + _game.Name())); //Don't need to convert name, known to be only ASCII chars. +} diff --git a/src/gui/main.h b/src/gui/main.h new file mode 100644 index 00000000..9153fc2b --- /dev/null +++ b/src/gui/main.h @@ -0,0 +1,71 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#ifndef __BOSS_GUI_MAIN__ +#define __BOSS_GUI_MAIN__ + +#include "ids.h" +#include "../game.h" + +#include +#include + +//Program class. +class BossGUI : public wxApp { +public: + bool OnInit(); //Load settings, apply logging and language settings, check if BOSS is already running, detect games, set game to last game or to first detected game if auto, create launcher window. +}; + +class Launcher : public wxFrame { +public: + Launcher(const wxChar *title, const YAML::Node& settings, const boss::Game& inGame, const std::vector& inGames); + + void OnSortPlugins(wxCommandEvent& event); + void OnEditMetadata(wxCommandEvent& event); + void OnViewLastReport(wxCommandEvent& event); + + void OnOpenSettings(wxCommandEvent& event); + void OnGameChange(wxCommandEvent& event); + void OnOpenFile(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + void OnQuit(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +private: + wxMenuBar *MenuBar; + wxMenu *FileMenu; + wxMenu *EditMenu; + wxMenu *GameMenu; + wxMenu *HelpMenu; + wxButton *SortButton; + wxButton *ViewButton; + wxButton *EditButton; + + std::vector _detectedGames; + boss::Game _game; + YAML::Node _settings; //BOSS Settings. + + void DisableUndetectedGames(); +}; + +#endif diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp new file mode 100644 index 00000000..cad68914 --- /dev/null +++ b/src/gui/settings.cpp @@ -0,0 +1,239 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#include "settings.h" +#include + +BEGIN_EVENT_TABLE ( SettingsFrame, wxFrame ) + EVT_BUTTON ( OPTION_OKExitSettings, SettingsFrame::OnQuit) + EVT_BUTTON ( OPTION_CancelExitSettings, SettingsFrame::OnQuit) +END_EVENT_TABLE() + +using namespace std; + +SettingsFrame::SettingsFrame(const wxString title, wxFrame *parent, YAML::Node& settings) : wxFrame(parent, wxID_ANY, title), _settings(settings) { + + wxString DebugVerbosity[] = { + translate("None"), + translate("Low"), + translate("Medium"), + translate("High") + }; + + wxString Game[] = { + translate("Autodetect"), + wxT("Oblivion"), + wxT("Nehrim"), + wxT("Skyrim"), + wxT("Fallout 3"), + wxT("Fallout: New Vegas"), + }; + + wxString Language[] = { + wxT("English"), + /* wxString("Español", wxConvUTF8), + wxT("Deutsch"), + wxString("Русский", wxConvUTF8), + wxString("简体中文", wxConvUTF8)*/ + }; + + //Set up stuff in the frame. + SetBackgroundColour(wxColour(255,255,255)); + + wxSizerFlags leftItem(1); + leftItem.Border(wxALL, 10).Expand().Left(); + + wxSizerFlags rightItem(0); + rightItem.Border(wxALL, 10).Expand().Right(); + + wxSizerFlags wholeItem(1); + wholeItem.Border(wxALL, 10).Expand(); + + wxBoxSizer *bigBox = new wxBoxSizer(wxVERTICAL); + + wxFlexGridSizer *GridSizer = new wxFlexGridSizer(2, 5, 5); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Default Game:")), leftItem); + GridSizer->Add(GameChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 6, Game), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Language:")), leftItem); + GridSizer->Add(LanguageChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, Language), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Debug Verbosity:")), leftItem); + GridSizer->Add(DebugVerbosityChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 4, DebugVerbosity), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Oblivion Masterlist URL:")), leftItem); + GridSizer->Add(OblivionURL = new wxTextCtrl(this, wxID_ANY), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Nehrim Masterlist URL:")), leftItem); + GridSizer->Add(NehrimURL = new wxTextCtrl(this, wxID_ANY), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Skyrim Masterlist URL:")), leftItem); + GridSizer->Add(SkyrimURL = new wxTextCtrl(this, wxID_ANY), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Fallout 3 Masterlist URL:")), leftItem); + GridSizer->Add(FO3URL = new wxTextCtrl(this, wxID_ANY), rightItem); + + GridSizer->Add(new wxStaticText(this, wxID_ANY, translate("Fallout: New Vegas Masterlist URL:")), leftItem); + GridSizer->Add(FONVURL = new wxTextCtrl(this, wxID_ANY), rightItem); + + bigBox->Add(GridSizer); + + bigBox->Add(UpdateMasterlistBox = new wxCheckBox(this, wxID_ANY, translate("Update masterlist before sorting.")), wholeItem); + + wxString text = translate("Language settings will be applied after the BOSS GUI is restarted."); + bigBox->Add(new wxStaticText(this, wxID_ANY, text), wholeItem); + + //Need to add 'OK' and 'Cancel' buttons. + wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL); + hbox->Add(new wxButton(this, OPTION_OKExitSettings, translate("OK"), wxDefaultPosition, wxSize(70, 30))); + hbox->Add(new wxButton(this, OPTION_CancelExitSettings, translate("Cancel"), wxDefaultPosition, wxSize(70, 30)), 0, wxLEFT, 20); + + //Now add TabHolder and OK button to window sizer. + bigBox->Add(hbox, 0, wxCENTER|wxALL, 10); + + //Initialise options with values. For checkboxes, they are off by default. + SetDefaultValues(); + + //Tooltips. + DebugVerbosityChoice->SetToolTip(translate("The output is logged to the BOSSDebugLog.txt file")); + + //Now set the layout and sizes. + SetSizerAndFit(bigBox); +} + +void SettingsFrame::SetDefaultValues() { + + if (_settings["Language"]) { + string lang = _settings["Language"].as(); + if (lang == "eng") + LanguageChoice->SetSelection(0); + } + + if (_settings["Game"]) { + string game = _settings["Game"].as(); + if (game == "auto") + GameChoice->SetSelection(0); + else if (game == "oblivion") + GameChoice->SetSelection(1); + else if (game == "nehrim") + GameChoice->SetSelection(2); + else if (game == "skyrim") + GameChoice->SetSelection(3); + else if (game == "fallout3") + GameChoice->SetSelection(4); + else if (game == "falloutnv") + GameChoice->SetSelection(5); + } + + if (_settings["Debug Verbosity"]) { + unsigned int verbosity = _settings["Debug Verbosity"].as(); + DebugVerbosityChoice->SetSelection(verbosity); + } + + if (_settings["Update Masterlist"]) { + bool update = _settings["Update Masterlist"].as(); + UpdateMasterlistBox->SetValue(update); + } + + if (_settings["Masterlist URLs"]) { + YAML::Node urls = _settings["Masterlist URLs"]; + + if (urls["Oblivion"]) + OblivionURL->SetValue(urls["Oblivion"].as()); + + if (urls["Nehrim"]) + NehrimURL->SetValue(urls["Nehrim"].as()); + + if (urls["Skyrim"]) + SkyrimURL->SetValue(urls["Skyrim"].as()); + + if (urls["Fallout 3"]) + FO3URL->SetValue(urls["Fallout 3"].as()); + + if (urls["Fallout New Vegas"]) + FONVURL->SetValue(urls["Fallout New Vegas"].as()); + } +} + +void SettingsFrame::OnQuit(wxCommandEvent& event) { + if (event.GetId() == OPTION_OKExitSettings) { + + switch (GameChoice->GetSelection()) { + case 0: + _settings["Game"] = "auto"; + break; + case 1: + _settings["Game"] = "oblivion"; + break; + case 2: + _settings["Game"] = "nehrim"; + break; + case 3: + _settings["Game"] = "skyrim"; + break; + case 4: + _settings["Game"] = "fallout3"; + break; + case 5: + _settings["Game"] = "falloutnv"; + break; + } + + switch (LanguageChoice->GetSelection()) { + case 0: + _settings["Language"] = "eng"; + break; + } + + _settings["Debug Verbosity"] = DebugVerbosityChoice->GetSelection(); + + _settings["Update Masterlist"] = UpdateMasterlistBox->IsChecked(); + + _settings["Masterlist URLs"]["Oblivion"] = string(OblivionURL->GetValue().ToUTF8()); + + _settings["Masterlist URLs"]["Nehrim"] = string(NehrimURL->GetValue().ToUTF8()); + + _settings["Masterlist URLs"]["Skyrim"] = string(SkyrimURL->GetValue().ToUTF8()); + + _settings["Masterlist URLs"]["Fallout 3"] = string(FO3URL->GetValue().ToUTF8()); + + _settings["Masterlist URLs"]["Fallout New Vegas"] = string(FONVURL->GetValue().ToUTF8()); + + //Also set the logger settings now. + /* g_logger.setOriginTracking(gl_debug_with_source); + g_logger.setVerbosity(static_cast(LV_WARN + gl_debug_verbosity)); + if (gl_log_debug_output) + g_logger.setStream(debug_log_path.string().c_str());*/ + + YAML::Emitter yout; + yout.SetIndent(2); + yout << _settings; + + ofstream out(settings_path); + out << yout.c_str(); + out.close(); + } + + this->Close(); +} diff --git a/src/gui/settings.h b/src/gui/settings.h new file mode 100644 index 00000000..addff22a --- /dev/null +++ b/src/gui/settings.h @@ -0,0 +1,50 @@ +/* BOSS + + A plugin load order optimiser for games that use the esp/esm plugin system. + + Copyright (C) 2013 WrinklyNinja + + This file is part of BOSS. + + BOSS is free software: you can redistribute + it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + BOSS is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BOSS. If not, see + . +*/ + +#ifndef __BOSS_GUI_SETTINGS__ +#define __BOSS_GUI_SETTINGS__ + +#include "ids.h" +#include +#include + +class SettingsFrame : public wxFrame { +public: + SettingsFrame(const wxString title, wxFrame *parent, YAML::Node& settings); + void OnQuit(wxCommandEvent& event); + void SetDefaultValues(); + DECLARE_EVENT_TABLE() +private: + wxChoice *DebugVerbosityChoice; + wxChoice *GameChoice; + wxChoice *LanguageChoice; + wxCheckBox *UpdateMasterlistBox; + wxTextCtrl *OblivionURL; + wxTextCtrl *NehrimURL; + wxTextCtrl *SkyrimURL; + wxTextCtrl *FO3URL; + wxTextCtrl *FONVURL; + + YAML::Node _settings; +}; +#endif diff --git a/src/helpers.cpp b/src/helpers.cpp index dfce504b..87bddc5b 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -63,10 +63,10 @@ namespace boss { using namespace std; - using namespace boost; using boost::algorithm::replace_all; using boost::algorithm::replace_first; namespace karma = boost::spirit::karma; + namespace fs = boost::filesystem; //Calculate the CRC of the given file for comparison purposes. uint32_t GetCrc32(const fs::path& filename) { diff --git a/src/helpers.h b/src/helpers.h index fa10083d..05d3567e 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -33,14 +33,13 @@ #include namespace boss { - namespace fs = boost::filesystem; ////////////////////////////////////////////////////////////////////////// // Helper functions ////////////////////////////////////////////////////////////////////////// //Calculate the CRC of the given file for comparison purposes. - uint32_t GetCrc32(const fs::path& filename); + uint32_t GetCrc32(const boost::filesystem::path& filename); //Converts an integer to a string using BOOST's Spirit.Karma. Faster than a stringstream conversion. std::string IntToString(const int n); @@ -65,7 +64,7 @@ namespace boss { Version(); Version(const char * ver); Version(const std::string ver); - Version(const fs::path file); + Version(const boost::filesystem::path file); std::string AsString() const; diff --git a/src/metadata.cpp b/src/metadata.cpp index 781b2d86..1351fea2 100644 --- a/src/metadata.cpp +++ b/src/metadata.cpp @@ -479,16 +479,16 @@ namespace boss { map issues; if (tags.find(Tag("Filter")) == tags.end()) { for (vector::const_iterator it=masters.begin(), endIt=masters.end(); it != endIt; ++it) { - if (!fs::exists(game.DataPath() / *it)) + if (!boost::filesystem::exists(game.DataPath() / *it)) issues.insert(pair(*it,false)); } } for (set::const_iterator it=requirements.begin(), endIt=requirements.end(); it != endIt; ++it) { - if (!fs::exists(game.DataPath() / it->Name())) + if (!boost::filesystem::exists(game.DataPath() / it->Name())) issues.insert(pair(it->Name(),false)); } for (set::const_iterator it=incompatibilities.begin(), endIt=incompatibilities.end(); it != endIt; ++it) { - if (fs::exists(game.DataPath() / it->Name())) + if (boost::filesystem::exists(game.DataPath() / it->Name())) issues.insert(pair(it->Name(),true)); } return issues; diff --git a/src/parsers.h b/src/parsers.h index 575ba4bf..92c85e9d 100644 --- a/src/parsers.h +++ b/src/parsers.h @@ -436,7 +436,7 @@ namespace boss { throw boss::error(boss::ERROR_INVALID_ARGS, "The regex string \"" + filename + "\" is invalid."); } - for (fs::directory_iterator itr(parent_path); itr != fs::directory_iterator(); ++itr) { + for (boost::filesystem::directory_iterator itr(parent_path); itr != boost::filesystem::directory_iterator(); ++itr) { if (boost::regex_match(itr->path().filename().string(), regex)) { result = true; return; diff --git a/src/tester.cpp b/src/tester.cpp deleted file mode 100644 index d1fd5689..00000000 --- a/src/tester.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* BOSS - - A plugin load order optimiser for games that use the esp/esm plugin system. - - Copyright (C) 2012 WrinklyNinja - - This file is part of BOSS. - - BOSS is free software: you can redistribute - it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - BOSS is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with BOSS. If not, see - . -*/ - -#include -#include "metadata.h" -#include "parsers.h" -#include "game.h" -#include "error.h" -#include "globals.h" - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include - -namespace fs = boost::filesystem; - -using namespace std; - -// Temporary hack. -const char * const libespm_options_path = "libespm.cfg"; -const char * const libespm_game = "Skyrim"; - -const char * const masterlist_path = "masterlist.yaml"; -const char * const userlist_path = "userlist.yaml"; -const char * const results_path = "results.yaml"; - -int main(int argc, char *argv[]) { - - time_t t0 = time(NULL); - - /* Stuff still missing from a normal execution of BOSS: - - - Reading of settings file. - - Detecting game to run for. - - Error handling. - - Masterlist updating. - - Checks for metadata self-consistency. - - Checks for cyclic dependencies and incompatibilities. - - Setting of load order. - - Need to include libespm setup into game setup, once the former is made to be not global. - */ - - cout << "Setting up libespm and BOSS..." << endl; - - // Set up libesm. - common::options::setGame(libespm_game); - ifstream input(libespm_options_path); - common::readOptions(input); - input.close(); - - //Set up BOSS vars. - boss::Game game(boss::GAME_TES5); - - cout << "Reading plugins in Data folder..." << endl; - time_t start, end; - start = time(NULL); - - // Get a list of the plugins. - list plugins; - for (fs::directory_iterator it(game.DataPath()); it != fs::directory_iterator(); ++it) { - if (fs::is_regular_file(it->status()) && (it->path().extension().string() == ".esp" || it->path().extension().string() == ".esm")) { - - string filename = it->path().filename().string(); - if (filename == "Skyrim.esm" - || filename == "Tamriel Compendium.esp" - || filename == "Tamriel Compendium - Skill Books.esp") - continue; // Libespm crashes with these plugins. - - cout << "Reading plugin: " << filename << endl; - boss::Plugin plugin(game, filename); - plugins.push_back(plugin); - } - } - - end = time(NULL); - cout << "Time taken to read plugins: " << (end - start) << " seconds." << endl; - start = time(NULL); - - YAML::Node mlist, ulist; - list messages, mlist_messages, ulist_messages; - list mlist_plugins, ulist_plugins; - - if (fs::exists(masterlist_path)) { - cout << "Parsing masterlist..." << endl; - - mlist = YAML::LoadFile(masterlist_path); - if (mlist["globals"]) - mlist_messages = mlist["globals"].as< list >(); - if (mlist["plugins"]) - mlist_plugins = mlist["plugins"].as< list >(); - - end = time(NULL); - cout << "Time taken to parse masterlist: " << (end - start) << " seconds." << endl; - start = time(NULL); - } - - if (fs::exists(userlist_path)) { - cout << "Parsing userlist..." << endl; - - ulist = YAML::LoadFile(userlist_path); - if (ulist["globals"]) - ulist_messages = ulist["globals"].as< list >(); - if (ulist["plugins"]) - ulist_plugins = ulist["plugins"].as< list >(); - - end = time(NULL); - cout << "Time taken to parse userlist: " << (end - start) << " seconds." << endl; - start = time(NULL); - } - - if (fs::exists(masterlist_path) || fs::exists(userlist_path)) { - cout << "Merging plugin lists..." << endl; - - //Merge all global message lists. - messages = mlist_messages; - messages.insert(messages.end(), ulist_messages.begin(), ulist_messages.end()); - - //Merge plugin list, masterlist and userlist plugin data. - for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { - //Check if there is already a plugin in the 'plugins' list or not. - list::iterator pos = std::find(mlist_plugins.begin(), mlist_plugins.end(), *it); - - if (pos != mlist_plugins.end()) { - //Need to merge plugins. - it->Merge(*pos); - } - - pos = std::find(ulist_plugins.begin(), ulist_plugins.end(), *it); - - if (pos != ulist_plugins.end()) { - //Need to merge plugins. - it->Merge(*pos); - } - } - - end = time(NULL); - cout << "Time taken to merge lists: " << (end - start) << " seconds." << endl; - start = time(NULL); - } - - cout << "Evaluating any conditions in plugin list..." << endl; - - for (list::iterator it=plugins.begin(), endIt=plugins.end(); it != endIt; ++it) { - try { - it->EvalAllConditions(game); - } catch (boss::error& e) { - cout << e.what() << endl; - } - } - - end = time(NULL); - cout << "Time taken to evaluate plugin list: " << (end - start) << " seconds." << endl; - start = time(NULL); - - cout << "Checking install validity..." << endl; - - for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) { - map issues = it->CheckInstallValidity(game); - for (map::const_iterator jt=issues.begin(), endJt=issues.end(); jt != endJt; ++jt) { - if (jt->second) - cout << "Error: Invalid install detected! \"" << jt->first << "\" is incompatible with \"" << it->Name() << "\" and is present." << endl; - else - cout << "Error: Invalid install detected! \"" << jt->first << "\" is required by \"" << it->Name() << "\" but is missing." << endl; - } - } - - - - cout << "Printing plugin details..." << endl; - - for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) { - cout << it->Name() << endl - << '\t' << "Number of records: " << it->FormIDs().size() << endl - << '\t' << "Is Master: " << it->IsMaster() << endl - << '\t' << "Masters:" << endl; - - vector masters = it->Masters(); - for(int i = 0; i < masters.size(); ++i) - cout << '\t' << '\t' << i << ": " << masters[i] << endl; - - cout << '\t' << "Conflicts with:" << endl; - for (list::iterator jt=plugins.begin(), endJt = plugins.end(); jt != endJt; ++jt) { - if (*jt != *it && !jt->MustLoadAfter(*it)) { - size_t overlap = jt->OverlapFormIDs(*it).size(); - if (overlap > 0) - cout << '\t' << '\t' << jt->Name() << " (" << overlap << " records)" << endl; - } - } - } - - end = time(NULL); - cout << "Time taken to print plugins' details: " << (end - start) << " seconds." << endl; - start = time(NULL); - - cout << "Sorting plugins..." << endl; - - plugins.sort(); - - end = time(NULL); - cout << "Time taken to sort plugins: " << (end - start) << " seconds." << endl; - - for (list::iterator it=plugins.begin(), endIt = plugins.end(); it != endIt; ++it) - cout << it->Name() << endl; - - cout << "Writing results file..." << endl; - - YAML::Emitter yout; - yout.SetIndent(2); - yout << YAML::BeginMap - << YAML::Key << "globals" << YAML::Value << messages - << YAML::Key << "plugins" << YAML::Value << plugins - << YAML::EndMap; - - ofstream out(results_path); - out << yout.c_str(); - out.close(); - - cout << "Tester finished. Total time taken: " << time(NULL) - t0 << endl; - return 0; -}