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;
70 void (
GameHost::*addGlobalGameCustomParameters)();
77 d->argBexLoading =
"-deh";
78 d->argDehLoading =
"-deh";
79 d->argIwadLoading =
"-iwad";
80 d->argOptionalWadLoading =
"-file";
82 d->argPwadLoading =
"-file";
83 d->argDemoPlayback =
"-playdemo";
84 d->argDemoRecord =
"-record";
85 d->currentCmdLine =
nullptr;
88 set_addIwad(&GameHost::addIwad_default);
89 set_addPwads(&GameHost::addPwads_default);
90 set_addDMFlags(&GameHost::addDMFlags_default);
91 set_addGlobalGameCustomParameters(&GameHost::addGlobalGameCustomParameters_default);
98 POLYMORPHIC_DEFINE(
void,
GameHost, addIwad, (), ())
99 POLYMORPHIC_DEFINE(
void,
GameHost, addPwads, (), ())
100 POLYMORPHIC_DEFINE(
void, GameHost, addDMFlags, (), ())
101 POLYMORPHIC_DEFINE(
void, GameHost, addGlobalGameCustomParameters, (), ())
103 void GameHost::addCustomParameters()
105 args().append(params().customParameters());
108 void GameHost::addDemoPlaybackIfApplicable()
110 if (
params().hostMode() == GameCreateParams::Demo)
117 void GameHost::addDemoRecordIfApplicable()
119 if (
params().hostMode() == GameCreateParams::Offline
120 &&
params().demoRecord() != GameDemo::NoDemo)
127 void GameHost::addDMFlags_default()
135 void GameHost::addGlobalGameCustomParameters_default()
138 QString customParameters = config[
"CustomParameters"];
140 args() << tokenizer.tokenize(customParameters);
143 void GameHost::addIwad_default()
145 const QString &iwadPath =
params().iwadPath();
147 if (iwadPath.isEmpty())
157 QString error = tr(
"IWAD Path error:\n\"%1\" doesn't exist or is a directory!").arg(iwadPath);
164 void GameHost::addPwads_default()
167 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
169 const QString &pwad =
params().pwadsPaths()[i];
171 args() << fileLoadingPrefix(i) << fileInfo.absoluteFilePath();
178 QMap<QString, QStringList> groups;
179 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
181 const QString &pwad =
params().pwadsPaths()[i];
182 QString prefix = fileLoadingPrefix(i);
183 groups[prefix] << pwad;
185 for (
const QString &prefix : groups.keys())
188 for (
const QString &file : groups[prefix])
191 args() << fileInfo.absoluteFilePath();
196 QString GameHost::fileLoadingPrefix(
int index)
const
198 const QString &pwad =
params().pwadsPaths()[index];
199 bool optional =
false;
200 if (
params().pwadsOptional().size() > index)
202 optional =
params().pwadsOptional()[index];
205 if (pwad.toLower().endsWith(
".deh"))
209 else if (pwad.toLower().endsWith(
".bex"))
221 return d->argBexLoading;
226 return d->argDehLoading;
231 return d->argIwadLoading;
236 return d->argOptionalWadLoading;
246 return d->argPwadLoading;
251 return d->argDemoPlayback;
256 return d->argDemoRecord;
261 return d->argServerLaunch;
266 return d->currentCmdLine->args;
276 if (
params().hostMode() == GameCreateParams::Host &&
params().port() > 0)
285 if (c.value().type() == QVariant::Bool)
288 args() << c.command() << QString::number(c.valueInt());
292 args() << c.command() << c.valueString();
296 if (
params().hostMode() == GameCreateParams::Host)
309 addDemoPlaybackIfApplicable();
310 addDemoRecordIfApplicable();
317 d->currentCmdLine = &cmdLine;
323 if (d->message.isError())
343 const bool WRAP_IN_SSS_CONSOLE =
false;
345 const bool WRAP_IN_SSS_CONSOLE = params.hostMode() == GameCreateParams::Host;
348 if (WRAP_IN_SSS_CONSOLE)
360 return AppRunner::runExecutable(cmdLine);
374 void GameHost::saveDemoMetaData()
376 if (
params().demoRecord() == GameDemo::Managed)
378 GameDemo::saveDemoMetaData(
params().demoPath(), *
plugin(),
383 void GameHost::setArgForBexLoading(
const QString &arg)
385 d->argBexLoading = arg;
388 void GameHost::setArgForDehLoading(
const QString &arg)
390 d->argDehLoading = arg;
393 void GameHost::setArgForIwadLoading(
const QString &arg)
395 d->argIwadLoading = arg;
398 void GameHost::setArgForOptionalWadLoading(
const QString &arg)
400 d->argOptionalWadLoading = arg;
403 void GameHost::setArgForPort(
const QString &arg)
408 void GameHost::setArgForPwadLoading(
const QString &arg)
410 d->argPwadLoading = arg;
413 void GameHost::setArgForDemoPlayback(
const QString &arg)
415 d->argDemoPlayback = arg;
418 void GameHost::setArgForDemoRecord(
const QString &arg)
420 d->argDemoRecord = arg;
423 void GameHost::setArgForServerLaunch(
const QString &arg)
425 d->argServerLaunch = arg;
430 d->message = message;
433 void GameHost::setupGamePaths()
436 if (exePath.trimmed().isEmpty())
443 if (!fileInfo.isFile() && !fileInfo.isBundle())
445 QString error = tr(
"The executable\n%1\ndoesn't exist or is not a file.")
446 .arg(fileInfo.filePath());
450 d->currentCmdLine->executable = fileInfo;
451 d->currentCmdLine->applicationDir = fileInfo.dir();
456 for (
const QString &pwad :
params().pwadsPaths())
461 QString error = tr(
"PWAD path error:\n\"%1\" doesn't exist or is a directory!").arg(pwad);