diff options
author | frosch <frosch@openttd.org> | 2011-07-02 12:58:37 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2011-07-02 12:58:37 +0000 |
commit | c544dca5191112bf8a21acff36833c081d304291 (patch) | |
tree | 49342331be8f787edc274a11b3d987a814165be0 | |
parent | 1688470eb9b511990089eab1eec9f0ba3104d4c5 (diff) | |
download | openttd-c544dca5191112bf8a21acff36833c081d304291.tar.xz |
(svn r22618) -Fix [FS#4653]: When changing difficulty settings over the network, do not just reopen the difficulty window if any game options window is opened; instead invalidate them properly.
-rw-r--r-- | src/settings.cpp | 4 | ||||
-rw-r--r-- | src/settings_gui.cpp | 19 | ||||
-rw-r--r-- | src/window_type.h | 1 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/settings.cpp b/src/settings.cpp index 4b98adb86..b0c5494f7 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1009,9 +1009,7 @@ static bool DifficultyChange(int32) /* If we are a network-client, update the difficult setting (if it is open). * Use this instead of just dirtying the window because we need to load in * the new difficulty settings */ - if (_networking && FindWindowById(WC_GAME_OPTIONS, 0) != NULL) { - ShowGameDifficulty(); - } + if (_networking) InvalidateWindowClassesData(WC_GAME_OPTIONS, GOID_DIFFICULTY_CHANGED); return true; } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 55db5b102..7237574aa 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -659,9 +659,6 @@ public: { this->InitNested(desc); - /* Copy current settings (ingame or in intro) to temporary holding place - * change that when setting stuff, copy back on clicking 'OK' */ - this->opt_mod_temp = GetGameSettings(); /* Setup disabled buttons when creating window * disable all other difficulty buttons during gameplay except for 'custom' */ this->SetWidgetsDisabledState(_game_mode != GM_MENU, @@ -672,8 +669,9 @@ public: WIDGET_LIST_END); this->SetWidgetDisabledState(GDW_HIGHSCORE, _game_mode == GM_EDITOR || _networking); // highscore chart in multiplayer this->SetWidgetDisabledState(GDW_ACCEPT, _networking && !_network_server); // Save-button in multiplayer (and if client) - this->LowerWidget(GDW_LVL_EASY + this->opt_mod_temp.difficulty.diff_level); - this->OnInvalidateData(); + + /* Read data */ + this->OnInvalidateData(GOID_DIFFICULTY_CHANGED); } virtual void SetStringParameters(int widget) const @@ -803,6 +801,17 @@ public: virtual void OnInvalidateData(int data = 0, bool gui_scope = true) { if (!gui_scope) return; + + if (data == GOID_DIFFICULTY_CHANGED) { + /* Window was created or settings were changed on server. Reread everything. */ + + /* Copy current settings (ingame or in intro) to temporary holding place + * change that when setting stuff, copy back on clicking 'OK' */ + this->opt_mod_temp = GetGameSettings(); + + this->LowerWidget(GDW_LVL_EASY + this->opt_mod_temp.difficulty.diff_level); + } + uint i; const SettingDesc *sd = GetSettingFromName("difficulty.max_no_competitors", &i); for (i = 0; i < GAME_DIFFICULTY_NUM; i++, sd++) { diff --git a/src/window_type.h b/src/window_type.h index fabcf2e62..d6ac42d0d 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -123,6 +123,7 @@ enum GameOptionsInvalidationData { GOID_NEWGRF_RESCANNED, ///< NewGRFs were just rescanned. GOID_NEWGRF_LIST_EDITED, ///< List of active NewGRFs is being edited. GOID_NEWGRF_PRESET_LOADED, ///< A NewGRF preset was picked. + GOID_DIFFICULTY_CHANGED, ///< Difficulty settings were changed. }; struct Window; |