269 lines
7.5 KiB
C++
269 lines
7.5 KiB
C++
#include <string>
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <vector>
|
|
|
|
#include "../include/rapidjson/document.h"
|
|
#include "../include/rapidjson/istreamwrapper.h"
|
|
#include "../include/rapidjson/error/en.h"
|
|
|
|
int file_not_exists(const std::string&);
|
|
int yn_query(const std::string&, bool);
|
|
|
|
int install_query(const std::string &hd, const std::string &mod, std::string& ver)
|
|
{
|
|
const std::string modjson_path(hd + "/modlist/" + mod + ".json");
|
|
|
|
if (file_not_exists(modjson_path))
|
|
{
|
|
std::cerr << mod << " not found!" << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
rapidjson::Document modlist;
|
|
std::ifstream modjson_stream(modjson_path);
|
|
rapidjson::IStreamWrapper isw_modlist(modjson_stream);
|
|
modlist.ParseStream(isw_modlist);
|
|
|
|
std::cout << "Name: " << modlist["name"].GetString() << std::endl
|
|
<< "Author: " << modlist["author"].GetString() << std::endl
|
|
<< "Last update: " << modlist["update"].GetString() << std::endl;
|
|
|
|
const rapidjson::Value& versions = modlist["versions"];
|
|
|
|
std::cout << "Latest version: " << versions[0].GetString() << std::endl
|
|
<< "Available versions: ";
|
|
|
|
for (rapidjson::SizeType i = 0; i < versions.Size(); i++)
|
|
{
|
|
if (i != 0)
|
|
{
|
|
std::cout << ", ";
|
|
}
|
|
|
|
std::cout << versions[i].GetString();
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
|
|
/* PRE-INSTALLATION PROCESS */
|
|
/* --VERSION */
|
|
|
|
if (yn_query("Are you sure you want to install " + mod + " version " + versions[0].GetString() + "?", true))
|
|
{
|
|
ver = versions[0].GetString();
|
|
}
|
|
else
|
|
{
|
|
if (versions.Size() > 1)
|
|
{
|
|
// std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
do
|
|
{
|
|
std::string install_ver_input;
|
|
std::cout << "Please type in the version you would like to install [enter q to quit]: ";
|
|
std::cin.clear();
|
|
|
|
std::getline(std::cin, install_ver_input);
|
|
|
|
if (install_ver_input == "q" || install_ver_input == "q\n")
|
|
{
|
|
std::cout << "Quitting!" << std::endl;
|
|
return 0;
|
|
}
|
|
|
|
std::cout << install_ver_input << std::endl;
|
|
|
|
bool install_ver_set = false;
|
|
|
|
for (rapidjson::SizeType i = 0; i < versions.Size(); i++)
|
|
{
|
|
if (install_ver_input == versions[i].GetString())
|
|
{
|
|
ver = install_ver_input;
|
|
install_ver_set = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (install_ver_set)
|
|
{
|
|
break;
|
|
}
|
|
|
|
std::cout << "Error! " << install_ver_input << " not found in versions list!" << std::endl;
|
|
} while (true);
|
|
}
|
|
else
|
|
{
|
|
std::cout << "Exiting installation!" << std::endl;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
std::cout << "Preparing to install " << mod << " version " << ver << "..." << std::endl;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int install(const std::string &hd, const std::string &mod)
|
|
{
|
|
std::string install_ver;
|
|
if (install_query(hd, mod, install_ver))
|
|
{
|
|
return 1;
|
|
}
|
|
/* --PACKPREINSTALLATION*/
|
|
|
|
const std::string modconfig_path(hd + "/" + mod + "/" + install_ver + "/modconfig.json");
|
|
|
|
std::cout << modconfig_path << std::endl;
|
|
|
|
if (file_not_exists(modconfig_path))
|
|
{
|
|
std::cerr << modconfig_path << " not found!" << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
rapidjson::Document modconfig;
|
|
std::ifstream modconfig_stream(modconfig_path);
|
|
rapidjson::IStreamWrapper isw_config(modconfig_stream);
|
|
if (modconfig.ParseStream<0>(isw_config).HasParseError())
|
|
{
|
|
std::cerr << GetParseError_En(modconfig.GetParseError()) << std::endl;
|
|
return 1;
|
|
}
|
|
modconfig.ParseStream(isw_config);
|
|
|
|
std::cout << "CAMPAIGN SELECTION" << std::endl
|
|
<< "==================" << std::endl;
|
|
|
|
for (rapidjson::SizeType i = 0; i < modconfig["campaigns"].Size(); i++)
|
|
{
|
|
std::cout << "[" << (i+1) << "] " << modconfig["campaigns"][i]["name"].GetString() << std::endl << "Description: " << modconfig["campaigns"][i]["desc"].GetString() << std::endl << std::endl;
|
|
}
|
|
|
|
int campaign_selection, turn_selection;
|
|
|
|
/* CAMPAIGN SELECTION */
|
|
do
|
|
{
|
|
char campaign_selection_char;
|
|
std::cout << std::endl << "Please select a campaign:";
|
|
|
|
for (rapidjson::SizeType i = 0; i < modconfig["campaigns"].Size(); i++)
|
|
{
|
|
std::cout << " [" << (i+1) << "] " << modconfig["campaigns"][i]["name"].GetString();
|
|
}
|
|
|
|
std::cout << " [press q to exit]" << std::endl;
|
|
std::cin.get(campaign_selection_char);
|
|
campaign_selection = campaign_selection_char - '0';
|
|
if (campaign_selection_char == 'q')
|
|
{
|
|
return 0;
|
|
}
|
|
else if (campaign_selection < 1 || campaign_selection > (int) modconfig["campaigns"].Size())
|
|
{
|
|
std::cin.clear();
|
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
std::cout << "Error! \"" << campaign_selection_char << "\" is not a valid input." << std::endl;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
} while (true);
|
|
|
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
|
|
/* TURN SELECTION */
|
|
do
|
|
{
|
|
char turn_selection_char;
|
|
std::cout << std::endl << "Please select your preferred number of turns per campaign year:";
|
|
|
|
const rapidjson::Value& turns = modconfig["turns"];
|
|
|
|
for (rapidjson::SizeType i = 0; i < turns.Size(); i++)
|
|
{
|
|
std::cout << " [" << (i+1) << "] " << turns[i]["name"].GetString();
|
|
}
|
|
|
|
std::cout << " [press q to exit]" << std::endl;
|
|
std::cin.get(turn_selection_char);
|
|
turn_selection = turn_selection_char - '0';
|
|
if (turn_selection_char == 'q')
|
|
{
|
|
return 0;
|
|
}
|
|
else if (turn_selection < 1 || turn_selection > (int) turns.Size())
|
|
{
|
|
std::cin.clear();
|
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
std::cout << "Error! \"" << turn_selection_char << "\" is not a valid input." << std::endl;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
} while (true);
|
|
|
|
std::cout << std::endl << "You have selected:" << std::endl
|
|
<< "Campaign: " << modconfig["campaigns"][campaign_selection-1]["name"].GetString() << std::endl
|
|
<< "Turns: " << modconfig["turns"][turn_selection-1]["name"].GetString() << std::endl << std::endl;
|
|
|
|
/* PACKS SELECTION */
|
|
|
|
std::cout << "PACK SELECTION" << std::endl
|
|
<< "==============" << std::endl;
|
|
|
|
std::vector<bool> pack_vector;
|
|
|
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
// std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
|
for (rapidjson::SizeType i = 0; i < modconfig["packs"].Size(); i++)
|
|
{
|
|
std::cout << std::endl << modconfig["packs"][i]["name"].GetString() << std::endl
|
|
<< modconfig["packs"][i]["desc"].GetString() << std::endl;
|
|
|
|
if (yn_query("Do you want to install this pack?", true))
|
|
{
|
|
pack_vector.insert(pack_vector.end(), true);
|
|
}
|
|
else pack_vector.insert(pack_vector.end(), false);
|
|
|
|
std::cin.clear();
|
|
}
|
|
|
|
/* SELECTION SUMMARY */
|
|
|
|
std::cout << "SELECTION SUMMARY" << std::endl
|
|
<< "=================" << std::endl;
|
|
|
|
std::cout << "Campaign: " << modconfig["campaigns"][campaign_selection-1]["name"].GetString() << std::endl
|
|
<< "Turns: " << modconfig["turns"][turn_selection-1]["name"].GetString() << std::endl
|
|
<< "Packs: ";
|
|
|
|
for (rapidjson::SizeType i = 0; i < modconfig["packs"].Size(); i++)
|
|
{
|
|
if (pack_vector[i])
|
|
{
|
|
std::cout << modconfig["packs"][i]["name"].GetString();
|
|
if (i != (modconfig["packs"].Size() - 1))
|
|
{
|
|
std::cout << ", ";
|
|
}
|
|
}
|
|
}
|
|
|
|
std::cout << std::endl << std::endl;
|
|
|
|
if (!yn_query("Are you sure you want to install this selection?", true))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|