25 #include "apprunner.h"
26 #include "commandlinetokenizer.h"
27 #include "configuration/doomseekerconfig.h"
29 #include "ini/inisection.h"
30 #include "ini/inivariable.h"
31 #include "plugins/engineplugin.h"
32 #include "serverapi/gamecreateparams.h"
33 #include "serverapi/message.h"
35 #include "templatedpathresolver.h"
38 #include <QStringList>
40 #define BAIL_ON_ERROR(method) \
43 if (d->message.isError()) \
52 QString argBexLoading;
53 QString argDehLoading;
54 QString argIwadLoading;
55 QString argOptionalWadLoading;
57 QString argPwadLoading;
58 QString argDemoPlayback;
59 QString argDemoRecord;
60 QString argServerLaunch;
71 void (
GameHost::*addGlobalGameCustomParameters)();
78 d->argBexLoading =
"-deh";
79 d->argDehLoading =
"-deh";
80 d->argIwadLoading =
"-iwad";
81 d->argOptionalWadLoading =
"-file";
83 d->argPwadLoading =
"-file";
84 d->argDemoPlayback =
"-playdemo";
85 d->argDemoRecord =
"-record";
86 d->currentCmdLine =
nullptr;
90 set_addIwad(&GameHost::addIwad_default);
91 set_addPwads(&GameHost::addPwads_default);
92 set_addDMFlags(&GameHost::addDMFlags_default);
93 set_addGlobalGameCustomParameters(&GameHost::addGlobalGameCustomParameters_default);
100 POLYMORPHIC_DEFINE(
void,
GameHost, addIwad, (), ())
101 POLYMORPHIC_DEFINE(
void,
GameHost, addPwads, (), ())
102 POLYMORPHIC_DEFINE(
void, GameHost, addDMFlags, (), ())
103 POLYMORPHIC_DEFINE(
void, GameHost, addGlobalGameCustomParameters, (), ())
105 void GameHost::addCustomParameters()
107 args().append(params().customParameters());
110 void GameHost::addDemoPlaybackIfApplicable()
112 if (
params().hostMode() == GameCreateParams::Demo)
119 void GameHost::addDemoRecordIfApplicable()
121 if (
params().hostMode() == GameCreateParams::Offline
129 void GameHost::addDMFlags_default()
137 void GameHost::addGlobalGameCustomParameters_default()
140 QString customParameters = config[
"CustomParameters"];
142 args() << tokenizer.tokenize(customParameters);
145 void GameHost::addIwad_default()
147 const QString &iwadPath =
params().iwadPath();
149 if (iwadPath.isEmpty())
159 QString error = tr(
"IWAD Path error:\n\"%1\" doesn't exist or is a directory!").arg(iwadPath);
166 void GameHost::addPwads_default()
169 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
171 const QString &pwad =
params().pwadsPaths()[i];
173 args() << fileLoadingPrefix(i) << fileInfo.absoluteFilePath();
180 QMap<QString, QStringList> groups;
181 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
183 const QString &pwad =
params().pwadsPaths()[i];
184 QString prefix = fileLoadingPrefix(i);
185 groups[prefix] << pwad;
187 for (
const QString &prefix : groups.keys())
190 for (
const QString &file : groups[prefix])
193 args() << fileInfo.absoluteFilePath();
198 QString GameHost::fileLoadingPrefix(
int index)
const
200 const QString &pwad =
params().pwadsPaths()[index];
201 bool optional =
false;
202 if (
params().pwadsOptional().size() > index)
204 optional =
params().pwadsOptional()[index];
207 if (pwad.toLower().endsWith(
".deh"))
211 else if (pwad.toLower().endsWith(
".bex"))
223 return d->argBexLoading;
228 return d->argDehLoading;
233 return d->argIwadLoading;
238 return d->argOptionalWadLoading;
248 return d->argPwadLoading;
253 return d->argDemoPlayback;
258 return d->argDemoRecord;
263 return d->argServerLaunch;
268 return d->currentCmdLine->args;
278 if (
params().hostMode() == GameCreateParams::Host &&
params().port() > 0)
287 if (c.value().type() == QVariant::Bool)
290 args() << c.command() << QString::number(c.valueInt());
294 args() << c.command() << c.valueString();
298 if (
params().hostMode() == GameCreateParams::Host)
311 addDemoPlaybackIfApplicable();
312 addDemoRecordIfApplicable();
319 d->currentCmdLine = &cmdLine;
325 if (d->message.isError())
345 const bool WRAP_IN_SSS_CONSOLE =
false;
347 const bool WRAP_IN_SSS_CONSOLE = params.hostMode() == GameCreateParams::Host;
350 if (WRAP_IN_SSS_CONSOLE)
362 return AppRunner::runExecutable(cmdLine);
376 void GameHost::saveDemoMetaData()
380 d->demoStore.saveDemoMetaData(
params().demoPath(), *
plugin(),
385 void GameHost::setArgForBexLoading(
const QString &arg)
387 d->argBexLoading = arg;
390 void GameHost::setArgForDehLoading(
const QString &arg)
392 d->argDehLoading = arg;
395 void GameHost::setArgForIwadLoading(
const QString &arg)
397 d->argIwadLoading = arg;
400 void GameHost::setArgForOptionalWadLoading(
const QString &arg)
402 d->argOptionalWadLoading = arg;
405 void GameHost::setArgForPort(
const QString &arg)
410 void GameHost::setArgForPwadLoading(
const QString &arg)
412 d->argPwadLoading = arg;
415 void GameHost::setArgForDemoPlayback(
const QString &arg)
417 d->argDemoPlayback = arg;
420 void GameHost::setArgForDemoRecord(
const QString &arg)
422 d->argDemoRecord = arg;
425 void GameHost::setArgForServerLaunch(
const QString &arg)
427 d->argServerLaunch = arg;
432 d->message = message;
435 void GameHost::setupGamePaths()
438 if (exePath.trimmed().isEmpty())
445 if (!fileInfo.isFile() && !fileInfo.isBundle())
447 QString error = tr(
"The executable\n%1\ndoesn't exist or is not a file.")
448 .arg(fileInfo.filePath());
452 d->currentCmdLine->executable = fileInfo;
453 d->currentCmdLine->applicationDir = fileInfo.dir();
458 for (
const QString &pwad :
params().pwadsPaths())
463 QString error = tr(
"PWAD path error:\n\"%1\" doesn't exist!").arg(pwad);