|
@@ -530,16 +530,16 @@ static const OptionData _options[] = {
|
|
|
* @param argc The number of arguments passed to this game.
|
|
|
* @param argv The values of the arguments.
|
|
|
* @return 0 when there is no error.
|
|
|
*/
|
|
|
int openttd_main(int argc, char *argv[])
|
|
|
{
|
|
|
char *musicdriver = nullptr;
|
|
|
char *sounddriver = nullptr;
|
|
|
char *videodriver = nullptr;
|
|
|
char *blitter = nullptr;
|
|
|
std::string musicdriver;
|
|
|
std::string sounddriver;
|
|
|
std::string videodriver;
|
|
|
std::string blitter;
|
|
|
std::string graphics_set;
|
|
|
std::string sounds_set;
|
|
|
std::string music_set;
|
|
|
Dimension resolution = {0, 0};
|
|
|
/* AfterNewGRFScan sets save_config to true after scanning completed. */
|
|
|
bool save_config = false;
|
|
@@ -563,25 +563,21 @@ int openttd_main(int argc, char *argv[])
|
|
|
int i;
|
|
|
while ((i = mgo.GetOpt()) != -1) {
|
|
|
switch (i) {
|
|
|
case 'I': graphics_set = mgo.opt; break;
|
|
|
case 'S': sounds_set = mgo.opt; break;
|
|
|
case 'M': music_set = mgo.opt; break;
|
|
|
case 'm': free(musicdriver); musicdriver = stredup(mgo.opt); break;
|
|
|
case 's': free(sounddriver); sounddriver = stredup(mgo.opt); break;
|
|
|
case 'v': free(videodriver); videodriver = stredup(mgo.opt); break;
|
|
|
case 'b': free(blitter); blitter = stredup(mgo.opt); break;
|
|
|
case 'm': musicdriver = mgo.opt; break;
|
|
|
case 's': sounddriver = mgo.opt; break;
|
|
|
case 'v': videodriver = mgo.opt; break;
|
|
|
case 'b': blitter = mgo.opt; break;
|
|
|
case 'D':
|
|
|
free(musicdriver);
|
|
|
free(sounddriver);
|
|
|
free(videodriver);
|
|
|
free(blitter);
|
|
|
musicdriver = stredup("null");
|
|
|
sounddriver = stredup("null");
|
|
|
videodriver = stredup("dedicated");
|
|
|
blitter = stredup("null");
|
|
|
musicdriver = "null";
|
|
|
sounddriver = "null";
|
|
|
videodriver = "dedicated";
|
|
|
blitter = "null";
|
|
|
dedicated = true;
|
|
|
SetDebugString("net=6");
|
|
|
if (mgo.opt != nullptr) {
|
|
|
/* Use the existing method for parsing (openttd -n).
|
|
|
* However, we do ignore the #company part. */
|
|
|
const char *temp = nullptr;
|
|
@@ -743,34 +739,32 @@ int openttd_main(int argc, char *argv[])
|
|
|
}
|
|
|
|
|
|
/* Initialize game palette */
|
|
|
GfxInitPalettes();
|
|
|
|
|
|
DEBUG(misc, 1, "Loading blitter...");
|
|
|
if (blitter == nullptr && _ini_blitter != nullptr) blitter = stredup(_ini_blitter);
|
|
|
_blitter_autodetected = StrEmpty(blitter);
|
|
|
if (blitter.empty() && !_ini_blitter.empty()) blitter = _ini_blitter;
|
|
|
_blitter_autodetected = blitter.empty();
|
|
|
/* Activate the initial blitter.
|
|
|
* This is only some initial guess, after NewGRFs have been loaded SwitchNewGRFBlitter may switch to a different one.
|
|
|
* - Never guess anything, if the user specified a blitter. (_blitter_autodetected)
|
|
|
* - Use 32bpp blitter if baseset or 8bpp-support settings says so.
|
|
|
* - Use 8bpp blitter otherwise.
|
|
|
*/
|
|
|
if (!_blitter_autodetected ||
|
|
|
(_support8bpp != S8BPP_NONE && (BaseGraphics::GetUsedSet() == nullptr || BaseGraphics::GetUsedSet()->blitter == BLT_8BPP)) ||
|
|
|
BlitterFactory::SelectBlitter("32bpp-anim") == nullptr) {
|
|
|
if (BlitterFactory::SelectBlitter(blitter) == nullptr) {
|
|
|
StrEmpty(blitter) ?
|
|
|
blitter.empty() ?
|
|
|
usererror("Failed to autoprobe blitter") :
|
|
|
usererror("Failed to select requested blitter '%s'; does it exist?", blitter);
|
|
|
usererror("Failed to select requested blitter '%s'; does it exist?", blitter.c_str());
|
|
|
}
|
|
|
}
|
|
|
free(blitter);
|
|
|
|
|
|
if (videodriver == nullptr && _ini_videodriver != nullptr) videodriver = stredup(_ini_videodriver);
|
|
|
if (videodriver.empty() && !_ini_videodriver.empty()) videodriver = _ini_videodriver;
|
|
|
DriverFactoryBase::SelectDriver(videodriver, Driver::DT_VIDEO);
|
|
|
free(videodriver);
|
|
|
|
|
|
InitializeSpriteSorter();
|
|
|
|
|
|
/* Initialize the zoom level of the screen to normal */
|
|
|
_screen.zoom = ZOOM_LVL_NORMAL;
|
|
|
|
|
@@ -821,19 +815,17 @@ int openttd_main(int argc, char *argv[])
|
|
|
ErrorMessageData msg(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND);
|
|
|
msg.SetDParamStr(0, music_set.c_str());
|
|
|
ScheduleErrorMessage(msg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (sounddriver == nullptr && _ini_sounddriver != nullptr) sounddriver = stredup(_ini_sounddriver);
|
|
|
if (sounddriver.empty() && !_ini_sounddriver.empty()) sounddriver = _ini_sounddriver;
|
|
|
DriverFactoryBase::SelectDriver(sounddriver, Driver::DT_SOUND);
|
|
|
free(sounddriver);
|
|
|
|
|
|
if (musicdriver == nullptr && _ini_musicdriver != nullptr) musicdriver = stredup(_ini_musicdriver);
|
|
|
if (musicdriver.empty() && !_ini_musicdriver.empty()) musicdriver = _ini_musicdriver;
|
|
|
DriverFactoryBase::SelectDriver(musicdriver, Driver::DT_MUSIC);
|
|
|
free(musicdriver);
|
|
|
|
|
|
/* Take our initial lock on whatever we might want to do! */
|
|
|
try {
|
|
|
modal_work_lock.lock();
|
|
|
modal_paint_lock.lock();
|
|
|
} catch (const std::system_error&) {
|
|
@@ -865,29 +857,15 @@ int openttd_main(int argc, char *argv[])
|
|
|
WindowDesc::SaveToConfig();
|
|
|
SaveToHighScore();
|
|
|
}
|
|
|
|
|
|
/* Reset windowing system, stop drivers, free used memory, ... */
|
|
|
ShutdownGame();
|
|
|
goto exit_normal;
|
|
|
|
|
|
exit_noshutdown:
|
|
|
/* These three are normally freed before bootstrap. */
|
|
|
free(videodriver);
|
|
|
free(blitter);
|
|
|
|
|
|
exit_bootstrap:
|
|
|
/* These are normally freed before exit, but after bootstrap. */
|
|
|
free(musicdriver);
|
|
|
free(sounddriver);
|
|
|
|
|
|
exit_normal:
|
|
|
free(_ini_musicdriver);
|
|
|
free(_ini_sounddriver);
|
|
|
free(_ini_videodriver);
|
|
|
free(_ini_blitter);
|
|
|
|
|
|
delete scanner;
|
|
|
|
|
|
extern FILE *_log_fd;
|
|
|
if (_log_fd != nullptr) {
|
|
|
fclose(_log_fd);
|