summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/openttd.cpp41
-rw-r--r--src/settings.cpp35
-rw-r--r--src/settings_func.h2
3 files changed, 54 insertions, 24 deletions
diff --git a/src/openttd.cpp b/src/openttd.cpp
index 5033eff35..cda4aa3c1 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -370,11 +370,19 @@ struct AfterNewGRFScan : NewGRFScanCallback {
char *network_conn; ///< Information about the server to connect to, or NULL.
const char *join_server_password; ///< The password to join the server with.
const char *join_company_password; ///< The password to join the company with.
+ bool *save_config_ptr; ///< The pointer to the save config setting.
+ bool save_config; ///< The save config setting.
- AfterNewGRFScan() :
+ /**
+ * Create a new callback.
+ * @param save_config_ptr Pointer to the save_config local variable which
+ * decides whether to save of exit or not.
+ */
+ AfterNewGRFScan(bool *save_config_ptr) :
startyear(INVALID_YEAR), generation_seed(GENERATE_NEW_SEED),
dedicated_host(NULL), dedicated_port(0), network_conn(NULL),
- join_server_password(NULL), join_company_password(NULL)
+ join_server_password(NULL), join_company_password(NULL),
+ save_config_ptr(save_config_ptr), save_config(true)
{
}
@@ -382,10 +390,24 @@ struct AfterNewGRFScan : NewGRFScanCallback {
{
ResetGRFConfig(false);
+ TarScanner::DoScan(TarScanner::SCENARIO);
+
+ AI::Initialize();
+
+ /* We want the new (correct) NewGRF count to survive the loading. */
+ uint last_newgrf_count = _settings_client.gui.last_newgrf_count;
+ LoadFromConfig();
+ _settings_client.gui.last_newgrf_count = last_newgrf_count;
+
+ AI::Uninitialize(true);
CheckConfig();
LoadFromHighScore();
LoadHotkeysFromConfig();
+ /* We have loaded the config, so we may possibly save it. */
+ *save_config_ptr = save_config;
+
+
if (startyear != INVALID_YEAR) _settings_newgame.game_creation.starting_year = startyear;
if (generation_seed != GENERATE_NEW_SEED) _settings_newgame.game_creation.generation_seed = generation_seed;
@@ -485,8 +507,9 @@ int ttd_main(int argc, char *argv[])
char *sounds_set = NULL;
char *music_set = NULL;
Dimension resolution = {0, 0};
- bool save_config = true;
- AfterNewGRFScan *scanner = new AfterNewGRFScan();
+ /* AfterNewGRFScan sets save_config to true after scanning completed. */
+ bool save_config = false;
+ AfterNewGRFScan *scanner = new AfterNewGRFScan(&save_config);
#if defined(ENABLE_NETWORK)
bool dedicated = false;
char *debuglog_conn = NULL;
@@ -606,7 +629,7 @@ int ttd_main(int argc, char *argv[])
}
case 'G': scanner->generation_seed = atoi(mgo.opt); break;
case 'c': _config_file = strdup(mgo.opt); break;
- case 'x': save_config = false; break;
+ case 'x': scanner->save_config = false; break;
case 'h':
i = -2; // Force printing of help.
break;
@@ -636,7 +659,7 @@ int ttd_main(int argc, char *argv[])
#endif
DeterminePaths(argv[0]);
- TarScanner::DoScan(TarScanner::BASESET | TarScanner::SCENARIO);
+ TarScanner::DoScan(TarScanner::BASESET);
BaseGraphics::FindSets();
BaseSounds::FindSets();
BaseMusic::FindSets();
@@ -651,11 +674,9 @@ int ttd_main(int argc, char *argv[])
#endif
#endif
- AI::Initialize();
- LoadFromConfig();
- AI::Uninitialize(true);
+ LoadFromConfig(true);
- if (resolution.width != 0) { _cur_resolution = resolution; }
+ if (resolution.width != 0) _cur_resolution = resolution;
/*
* The width and height must be at least 1 pixel and width times
diff --git a/src/settings.cpp b/src/settings.cpp
index 3415108aa..0cffb6360 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1489,13 +1489,15 @@ static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *li
}
/* Common handler for saving/loading variables to the configuration file */
-static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescProcList *proc_list)
+static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescProcList *proc_list, bool minimal = false)
{
proc(ini, (const SettingDesc*)_misc_settings, "misc", NULL);
#if defined(WIN32) && !defined(DEDICATED)
proc(ini, (const SettingDesc*)_win32_settings, "win32", NULL);
#endif /* WIN32 */
+ if (minimal) return;
+
proc(ini, _settings, "patches", &_settings_newgame);
proc(ini, _currency_settings,"currency", &_custom_currency);
proc(ini, _company_settings, "company", &_settings_client.company);
@@ -1514,23 +1516,30 @@ static IniFile *IniLoadConfig()
return ini;
}
-/** Load the values from the configuration files */
-void LoadFromConfig()
+/**
+ * Load the values from the configuration files
+ * @param minimal Load the minimal amount of the configuration to "bootstrap" the blitter and such.
+ */
+void LoadFromConfig(bool minimal)
{
IniFile *ini = IniLoadConfig();
- ResetCurrencies(false); // Initialize the array of curencies, without preserving the custom one
+ if (!minimal) ResetCurrencies(false); // Initialize the array of curencies, without preserving the custom one
- HandleSettingDescs(ini, IniLoadSettings, IniLoadSettingList);
- _grfconfig_newgame = GRFLoadConfig(ini, "newgrf", false);
- _grfconfig_static = GRFLoadConfig(ini, "newgrf-static", true);
- NewsDisplayLoadConfig(ini, "news_display");
- AILoadConfig(ini, "ai_players");
+ HandleSettingDescs(ini, IniLoadSettings, IniLoadSettingList, minimal);
- PrepareOldDiffCustom();
- IniLoadSettings(ini, _gameopt_settings, "gameopt", &_settings_newgame);
- HandleOldDiffCustom(false);
+ if (!minimal) {
+ _grfconfig_newgame = GRFLoadConfig(ini, "newgrf", false);
+ _grfconfig_static = GRFLoadConfig(ini, "newgrf-static", true);
+ NewsDisplayLoadConfig(ini, "news_display");
+ AILoadConfig(ini, "ai_players");
+
+ PrepareOldDiffCustom();
+ IniLoadSettings(ini, _gameopt_settings, "gameopt", &_settings_newgame);
+ HandleOldDiffCustom(false);
+
+ ValidateSettings();
+ }
- ValidateSettings();
delete ini;
}
diff --git a/src/settings_func.h b/src/settings_func.h
index 65fca20f8..c6f0892c7 100644
--- a/src/settings_func.h
+++ b/src/settings_func.h
@@ -20,7 +20,7 @@ void IConsoleSetSetting(const char *name, int32 value);
void IConsoleGetSetting(const char *name, bool force_newgame = false);
void IConsoleListSettings(const char *prefilter);
-void LoadFromConfig();
+void LoadFromConfig(bool minimal = false);
void SaveToConfig();
void CheckConfig();