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"
37 #include <QStringList>
39 #define BAIL_ON_ERROR(method) \
42 if (d->message.isError()) \
51 QString argBexLoading;
52 QString argDehLoading;
53 QString argIwadLoading;
54 QString argOptionalWadLoading;
56 QString argPwadLoading;
57 QString argDemoPlayback;
58 QString argDemoRecord;
59 QString argServerLaunch;
69 void (
GameHost::*addGlobalGameCustomParameters)();
76 d->argBexLoading =
"-deh";
77 d->argDehLoading =
"-deh";
78 d->argIwadLoading =
"-iwad";
79 d->argOptionalWadLoading =
"-file";
81 d->argPwadLoading =
"-file";
82 d->argDemoPlayback =
"-playdemo";
83 d->argDemoRecord =
"-record";
84 d->currentCmdLine =
nullptr;
87 set_addIwad(&GameHost::addIwad_default);
88 set_addPwads(&GameHost::addPwads_default);
89 set_addDMFlags(&GameHost::addDMFlags_default);
90 set_addGlobalGameCustomParameters(&GameHost::addGlobalGameCustomParameters_default);
97 POLYMORPHIC_DEFINE(
void,
GameHost, addIwad, (), ())
98 POLYMORPHIC_DEFINE(
void,
GameHost, addPwads, (), ())
99 POLYMORPHIC_DEFINE(
void, GameHost, addDMFlags, (), ())
100 POLYMORPHIC_DEFINE(
void, GameHost, addGlobalGameCustomParameters, (), ())
102 void GameHost::addCustomParameters()
104 args().append(params().customParameters());
107 void GameHost::addDemoPlaybackIfApplicable()
109 if (
params().hostMode() == GameCreateParams::Demo)
116 void GameHost::addDemoRecordIfApplicable()
118 if (
params().hostMode() == GameCreateParams::Offline
119 &&
params().demoRecord() != GameDemo::NoDemo)
126 void GameHost::addDMFlags_default()
134 void GameHost::addGlobalGameCustomParameters_default()
137 QString customParameters = config[
"CustomParameters"];
139 args() << tokenizer.tokenize(customParameters);
142 void GameHost::addIwad_default()
144 const QString &iwadPath =
params().iwadPath();
146 if (iwadPath.isEmpty())
152 QFileInfo fi(iwadPath);
156 QString error = tr(
"IWAD Path error:\n\"%1\" doesn't exist or is a directory!").arg(iwadPath);
163 void GameHost::addPwads_default()
166 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
168 const QString &pwad =
params().pwadsPaths()[i];
169 args() << fileLoadingPrefix(i) << pwad;
176 QMap<QString, QStringList> groups;
177 for (
int i = 0; i <
params().pwadsPaths().size(); ++i)
179 const QString &pwad =
params().pwadsPaths()[i];
180 QString prefix = fileLoadingPrefix(i);
181 groups[prefix] << pwad;
183 for (
const QString &prefix : groups.keys())
186 for (
const QString &file : groups[prefix])
193 QString GameHost::fileLoadingPrefix(
int index)
const
195 const QString &pwad =
params().pwadsPaths()[index];
196 bool optional =
false;
197 if (
params().pwadsOptional().size() > index)
199 optional =
params().pwadsOptional()[index];
202 if (pwad.toLower().endsWith(
".deh"))
206 else if (pwad.toLower().endsWith(
".bex"))
218 return d->argBexLoading;
223 return d->argDehLoading;
228 return d->argIwadLoading;
233 return d->argOptionalWadLoading;
243 return d->argPwadLoading;
248 return d->argDemoPlayback;
253 return d->argDemoRecord;
258 return d->argServerLaunch;
263 return d->currentCmdLine->args;
273 if (
params().hostMode() == GameCreateParams::Host &&
params().port() > 0)
282 args() << QString(c.command()) << c.valueString();
285 if (
params().hostMode() == GameCreateParams::Host)
298 addDemoPlaybackIfApplicable();
299 addDemoRecordIfApplicable();
306 d->currentCmdLine = &cmdLine;
312 if (d->message.isError())
332 const bool WRAP_IN_SSS_CONSOLE =
false;
334 const bool WRAP_IN_SSS_CONSOLE = params.hostMode() == GameCreateParams::Host;
337 if (WRAP_IN_SSS_CONSOLE)
349 return AppRunner::runExecutable(cmdLine);
363 void GameHost::saveDemoMetaData()
365 if (
params().demoRecord() == GameDemo::Managed)
367 GameDemo::saveDemoMetaData(
params().demoPath(), *
plugin(),
372 void GameHost::setArgForBexLoading(
const QString &arg)
374 d->argBexLoading = arg;
377 void GameHost::setArgForDehLoading(
const QString &arg)
379 d->argDehLoading = arg;
382 void GameHost::setArgForIwadLoading(
const QString &arg)
384 d->argIwadLoading = arg;
387 void GameHost::setArgForOptionalWadLoading(
const QString &arg)
389 d->argOptionalWadLoading = arg;
392 void GameHost::setArgForPort(
const QString &arg)
397 void GameHost::setArgForPwadLoading(
const QString &arg)
399 d->argPwadLoading = arg;
402 void GameHost::setArgForDemoPlayback(
const QString &arg)
404 d->argDemoPlayback = arg;
407 void GameHost::setArgForDemoRecord(
const QString &arg)
409 d->argDemoRecord = arg;
412 void GameHost::setArgForServerLaunch(
const QString &arg)
414 d->argServerLaunch = arg;
419 d->message = message;
422 void GameHost::setupGamePaths()
424 QFileInfo fileInfo(
params().executablePath());
425 if (!fileInfo.isFile() && !fileInfo.isBundle())
427 QString error = tr(
"%1\n doesn't exist or is not a file.").arg(fileInfo.filePath());
432 d->currentCmdLine->applicationDir = fileInfo.dir();
437 for (
const QString &pwad :
params().pwadsPaths())
442 QString error = tr(
"PWAD path error:\n\"%1\" doesn't exist or is a directory!").arg(pwad);