summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/CRSMPackCompatibility.cpp62
-rw-r--r--src/CRSMPackCompatibility.hpp7
-rw-r--r--src/crsm.cpp46
-rw-r--r--src/crsm.hpp3
4 files changed, 110 insertions, 8 deletions
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 <QDir>
#include <QFile>
+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<QString, QString> 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 <Szenario> die <Packversion>.", "<Szenario> <Packversion>");
addCommand("packs scenarios delete", &CRSM::packsScenariosDelete, Management, UserType::Max, "Löscht für das <Szenario> die <Packversion>.", "<Szenario> <Packversion>");
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 <Szenario> ab.", "<Szenario>");
+ addCommand("packs scenoptions all", &CRSM::packsScenOptionsGet, Management, UserType::Max, "Fragt die Clonk-Argumente ab, die im Endeffekt für <Szenario> gültig sind.", "<Szenario>");
+ addCommand("packs scenoptions set", &CRSM::packsScenOptionsSet, Management, UserType::Max, "Setzt die Clonk-Argumente für <Szenario> auf [Argumente], entfernt sie, wenn keine Argumente angegeben sind.", "<Szenario> [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);