From f596d04d6751aa726c779d1581114ff9731d84cb Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sun, 11 Sep 2016 18:53:04 +0200 Subject: Add possibility to assign certain Clonk-Arguments to certain scenarios (or folders) --- src/CRSMPackCompatibility.cpp | 62 ++++++++++++++++++++++++++++++++++++++----- src/CRSMPackCompatibility.hpp | 7 ++++- src/crsm.cpp | 46 ++++++++++++++++++++++++++++++++ src/crsm.hpp | 3 +++ 4 files changed, 110 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/CRSMPackCompatibility.cpp b/src/CRSMPackCompatibility.cpp index 9d171a8..b301288 100644 --- a/src/CRSMPackCompatibility.cpp +++ b/src/CRSMPackCompatibility.cpp @@ -3,6 +3,21 @@ #include #include +namespace { + QStringList getScenarioPathParts(const QString& scenario) + { + QStringList parts; + parts.append(scenario); + int position = scenario.length(); + while((position = scenario.lastIndexOf('/', position - 1)) != -1) + { + parts.append(scenario.left(position)); + } + + return parts; + } +} + void CRSMPackCompatibility::clear() { auto configVals = configValues; @@ -12,14 +27,8 @@ void CRSMPackCompatibility::clear() QString CRSMPackCompatibility::linkScenarioPacks(const QString &scenario) { - QStringList parts; - parts.append(scenario); QString ret; - int position = scenario.length(); - while((position = scenario.lastIndexOf('/', position - 1)) != -1) - { - parts.append(scenario.left(position)); - } + const QStringList& parts = getScenarioPathParts(scenario); QMap packs = PackDefaultVersion; foreach(const QString& filePathPart, parts) @@ -46,6 +55,31 @@ QString CRSMPackCompatibility::linkScenarioPacks(const QString &scenario) return ret; } +QString CRSMPackCompatibility::getScenarioCmdOptions(const QString& scenario, bool all) +{ + QString ret; + + QStringList parts; + if(all) + { + parts = getScenarioPathParts(scenario); + } + else + { + parts.append(scenario); + } + + foreach(const QString& part, parts) + { + if(ScenarioCmdOptions.contains(part)) + { + ret.append(' '); + ret.append(ScenarioCmdOptions[part]); + } + } + return ret; +} + QString CRSMPackCompatibility::read(const QString &fileName, const QString& clonkPath, bool writeDefault) { this->clonkPath = clonkPath; @@ -155,6 +189,20 @@ QString CRSMPackCompatibility::applyConfig() return ret; } +QString CRSMPackCompatibility::setScenarioCmdOptions(const QString& scenario, const QString& options) +{ + if(options.isEmpty()) + { + ScenarioCmdOptions.remove(scenario); + return "Removed ScenOptions for \"" + scenario + "\".\n"; + } + else + { + ScenarioCmdOptions[scenario] = options; + return "Set ScenOptions for \"" + scenario + "\" to \"" + options + "\".\n"; + } +} + QString CRSMPackCompatibility::checkPackVersion(const QString &packVersion, const QString &pack) { if(!QFile(clonkPath + PacksDirectory + QDir::separator() + packVersion).exists()) diff --git a/src/CRSMPackCompatibility.hpp b/src/CRSMPackCompatibility.hpp index 3b13cda..9e81bed 100644 --- a/src/CRSMPackCompatibility.hpp +++ b/src/CRSMPackCompatibility.hpp @@ -7,18 +7,21 @@ public: Map(String, String) PackDefaultVersion; Map(String, String) PackVersions; Map(String, List(String)) ScenarioPacks; + Map(String, String) ScenarioCmdOptions; String PacksDirectory = "Packs"; CRSMPackCompatibility() : ConfigBase::ConfigBase({ ConfigVal(PackDefaultVersion), ConfigVal(PackVersions), ConfigVal(PacksDirectory), - ConfigVal(ScenarioPacks) + ConfigVal(ScenarioPacks), + ConfigVal(ScenarioCmdOptions) }) { } void clear(); QString linkScenarioPacks(const QString& scenario); + QString getScenarioCmdOptions(const QString& scenario, bool all = true); QString read(const QString &fileName, const QString &clonkPath, bool writeDefault = true); @@ -30,6 +33,8 @@ public: QString deleteScenarioPackVersion(const QString& packVersion, const QString& scenario); QString applyConfig(); + QString setScenarioCmdOptions(const QString& scenario, const QString& options); + protected: QString checkPackVersion(const QString& packVersion, const QString& pack); QString checkScenarioPack(const QString& packVersion, const QString& scenario); diff --git a/src/crsm.cpp b/src/crsm.cpp index af4c212..e77ee3c 100644 --- a/src/crsm.cpp +++ b/src/crsm.cpp @@ -738,6 +738,9 @@ void CRSM::startScen(const ScenarioSettings &scen, QStringList argList) { argList << "/noleague"; } + + argList << Packs.getScenarioCmdOptions(filename).split(' '); + argList << filename; processManager->setWorkingDirectory(Config.Auto.Volatile.Clonk.Directory); out(Packs.linkScenarioPacks(filename)); @@ -1533,6 +1536,10 @@ void CRSM::setupCmds() addCommand("packs scenarios add", &CRSM::packsScenariosAdd, Management, UserType::Max, "Aktiviert für das die .", " "); addCommand("packs scenarios delete", &CRSM::packsScenariosDelete, Management, UserType::Max, "Löscht für das die .", " "); addCommand("packs scenarios list", &CRSM::packsScenariosList, Management, UserType::Max, "Listet alle Szenarien mit ihren Packversionen auf."); + addCommandGroup("packs scenoptions", Management, UserType::Max, "Über die packs scenoptions-Befehlsgruppe werden zusätzliche Clonk-Argumente für einzelne Szenarien/Rundenordner verwaltet."); + addCommand("packs scenoptions get", &CRSM::packsScenOptionsGet, Management, UserType::Max, "Fragt die Clonk-Argumente nur für ab.", ""); + addCommand("packs scenoptions all", &CRSM::packsScenOptionsGet, Management, UserType::Max, "Fragt die Clonk-Argumente ab, die im Endeffekt für gültig sind.", ""); + addCommand("packs scenoptions set", &CRSM::packsScenOptionsSet, Management, UserType::Max, "Setzt die Clonk-Argumente für auf [Argumente], entfernt sie, wenn keine Argumente angegeben sind.", " [Argumente]"); addCommand("relist", &CRSM::relist, Management, UserType::Max, "Durchsucht veränderte Rundenordner erneut."); } @@ -3314,6 +3321,45 @@ CMD_FUNCTION_IMPL(packsScenariosList) return Success; } +CMD_FUNCTION_IMPL(packsScenOptionsGet) + bool all = cmd == "packs scenoptions all"; + + const QString& scen = args.trimmed(); + if(scen.isEmpty()) + { + respond(client, "Eine Szenarioangabe ist notwendig!\n"); + return SyntaxFail; + } + else + { + respond(client, "\"" + Packs.getScenarioCmdOptions(scen, all) + "\"\n"); + return Success; + } +} + +CMD_FUNCTION_IMPL(packsScenOptionsSet) + if(args.trimmed().isEmpty()) + { + respond(client, "Eine Szenarioangabe ist notwendig!\n"); + return SyntaxFail; + } + + QStringList argList = Util::splitEscaped(args, ' '); + QString scen = argList.first(); + argList.removeFirst(); + + QString scenOptions; + + if(argList.length() > 0) + { + scenOptions = Util::joinEscape(argList, ' '); + } + + respond(client, Packs.setScenarioCmdOptions(scen, scenOptions)); + + return Success; +} + CMD_FUNCTION_IMPL(dccConnect) dccChatRequest(client); return Success; diff --git a/src/crsm.hpp b/src/crsm.hpp index 8fc8798..0e1464f 100644 --- a/src/crsm.hpp +++ b/src/crsm.hpp @@ -377,6 +377,9 @@ private: CMD_FUNCTION(packsScenariosDelete); CMD_FUNCTION(packsScenariosList); + CMD_FUNCTION(packsScenOptionsGet); + CMD_FUNCTION(packsScenOptionsSet); + CMD_FUNCTION(dccConnect); CMD_FUNCTION(dccDisconnect); CMD_FUNCTION(dccIdentify); -- cgit v1.2.3-54-g00ecf