diff options
-rw-r--r-- | src/gfxinit.cpp | 40 | ||||
-rw-r--r-- | src/gfxinit.h | 4 | ||||
-rw-r--r-- | src/lang/english.txt | 4 | ||||
-rw-r--r-- | src/settings_gui.cpp | 42 |
4 files changed, 88 insertions, 2 deletions
diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 2db1a4c16..984ea9730 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -569,3 +569,43 @@ bool HasGraphicsSet(const ContentInfo *ci, bool md5sum) } #endif /* ENABLE_NETWORK */ + +/** + * Count the number of available graphics sets. + */ +int GetNumGraphicsSets() +{ + int n = 0; + for (const GraphicsSet *g = _available_graphics_sets; g != NULL; g = g->next) { + if (g->found_grfs <= 1) continue; + n++; + } + return n; +} + +/** + * Get the index of the currently active graphics set + */ +int GetIndexOfCurrentGraphicsSet() +{ + int n = 0; + for (const GraphicsSet *g = _available_graphics_sets; g != NULL; g = g->next) { + if (g->found_grfs <= 1) continue; + if (g == _used_graphics_set) return n; + n++; + } + return -1; +} + +/** + * Get the name of the graphics set at the specified index + */ +const char *GetGraphicsSetName(int index) +{ + for (const GraphicsSet *g = _available_graphics_sets; g != NULL; g = g->next) { + if (g->found_grfs <= 1) continue; + if (index == 0) return g->name; + index--; + } + error("GetGraphicsSetName: index %d out of range", index); +}
\ No newline at end of file diff --git a/src/gfxinit.h b/src/gfxinit.h index deaa6c32c..3bee8c281 100644 --- a/src/gfxinit.h +++ b/src/gfxinit.h @@ -15,6 +15,10 @@ void FindGraphicsSets(); bool SetGraphicsSet(const char *name); char *GetGraphicsSetsList(char *p, const char *last); +int GetNumGraphicsSets(); +int GetIndexOfCurrentGraphicsSet(); +const char *GetGraphicsSetName(int index); + extern char *_ini_graphics_set; #endif /* GFXINIT_H */ diff --git a/src/lang/english.txt b/src/lang/english.txt index 449086d19..fb62b9cfa 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -969,6 +969,10 @@ STR_OPTIONS_SCREENSHOT_FORMAT :{BLACK}Screensh STR_OPTIONS_SCREENSHOT_FORMAT_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING} STR_OPTIONS_SCREENSHOT_FORMAT_TIP :{BLACK}Select the screenshot format to use +STR_OPTIONS_BASE_GRF :{BLACK}Base graphics set +STR_OPTIONS_BASE_GRF_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{RAW_STRING} +STR_OPTIONS_BASE_GRF_TIP :{BLACK}Select the base graphics set to use + STR_AUTOSAVE_1_MONTH :Every month STR_AUTOSAVE_FAILED :{WHITE}Autosave failed diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index f341af58a..6646fb906 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -25,6 +25,7 @@ #include "widgets/dropdown_func.h" #include "station_func.h" #include "highscore.h" +#include "gfxinit.h" #include <map> #include "table/sprites.h" @@ -112,6 +113,7 @@ enum GameOptionsWidgets { GAMEOPT_RESOLUTION_BTN = 19, GAMEOPT_FULLSCREEN, GAMEOPT_SCREENSHOT_BTN = 22, + GAMEOPT_BASE_GRF_BTN = 24, }; /** @@ -140,18 +142,34 @@ static void ShowTownnameDropdown(Window *w, int sel) static void ShowCustCurrency(); +static void ShowGraphicsSetMenu(Window *w) +{ + int n = GetNumGraphicsSets(); + int current = GetIndexOfCurrentGraphicsSet(); + + DropDownList *list = new DropDownList(); + for (int i = 0; i < n; i++) { + list->push_back(new DropDownListCharStringItem(GetGraphicsSetName(i), i, (_game_mode == GM_MENU) ? false : (current != i))); + } + + ShowDropDownList(w, list, current, GAMEOPT_BASE_GRF_BTN); +} + struct GameOptionsWindow : Window { GameSettings *opt; + bool reload; GameOptionsWindow(const WindowDesc *desc) : Window(desc) { this->opt = (_game_mode == GM_MENU) ? &_settings_newgame : &_settings_game; + this->reload = false; this->FindWindowPlacementAndResize(desc); } ~GameOptionsWindow() { DeleteWindowById(WC_CUSTOM_CURRENCY, 0); + if (this->reload) _switch_mode = SM_MENU; } virtual void OnPaint() @@ -171,6 +189,7 @@ struct GameOptionsWindow : Window { SetDParam(7, i == _num_resolutions ? STR_RES_OTHER : SPECSTR_RESOLUTION_START + i); SetDParam(8, SPECSTR_SCREENSHOT_START + _cur_screenshot_format); this->SetWidgetLoweredState(GAMEOPT_FULLSCREEN, _fullscreen); + SetDParamStr(9, GetGraphicsSetName(GetIndexOfCurrentGraphicsSet())); this->DrawWidgets(); DrawString(20, 175, STR_OPTIONS_FULLSCREEN, TC_FROMSTRING); // fullscreen @@ -246,6 +265,10 @@ struct GameOptionsWindow : Window { case GAMEOPT_SCREENSHOT_BTN: // Setup screenshot format dropdown ShowDropDownMenu(this, BuildDynamicDropdown(SPECSTR_SCREENSHOT_START, _num_screenshot_formats), _cur_screenshot_format, GAMEOPT_SCREENSHOT_BTN, 0, 0); break; + + case GAMEOPT_BASE_GRF_BTN: + ShowGraphicsSetMenu(this); + break; } } @@ -312,6 +335,18 @@ struct GameOptionsWindow : Window { SetScreenshotFormat(index); this->SetDirty(); break; + + case GAMEOPT_BASE_GRF_BTN: + if (_game_mode == GM_MENU) { + const char *name = GetGraphicsSetName(index); + + free(_ini_graphics_set); + _ini_graphics_set = strdup(name); + + SetGraphicsSet(name); + this->reload = true; + } + break; } } }; @@ -319,7 +354,7 @@ struct GameOptionsWindow : Window { static const Widget _game_options_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, { WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 369, 0, 13, STR_00B1_GAME_OPTIONS, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 369, 14, 238, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 369, 14, 280, 0x0, STR_NULL}, { WWT_FRAME, RESIZE_NONE, COLOUR_GREY, 10, 179, 20, 55, STR_02E0_CURRENCY_UNITS, STR_NULL}, { WWT_DROPDOWNIN, RESIZE_NONE, COLOUR_GREY, 20, 169, 34, 45, STR_02E1, STR_02E2_CURRENCY_UNITS_SELECTION}, { WWT_FRAME, RESIZE_NONE, COLOUR_GREY, 190, 359, 20, 55, STR_MEASURING_UNITS, STR_NULL}, @@ -345,11 +380,14 @@ static const Widget _game_options_widgets[] = { { WWT_FRAME, RESIZE_NONE, COLOUR_GREY, 190, 359, 146, 190, STR_OPTIONS_SCREENSHOT_FORMAT, STR_NULL}, { WWT_DROPDOWNIN, RESIZE_NONE, COLOUR_GREY, 200, 349, 160, 171, STR_OPTIONS_SCREENSHOT_FORMAT_CBO, STR_OPTIONS_SCREENSHOT_FORMAT_TIP}, +{ WWT_FRAME, RESIZE_NONE, COLOUR_GREY, 10, 179, 235, 270, STR_OPTIONS_BASE_GRF, STR_NULL}, +{ WWT_DROPDOWNIN, RESIZE_NONE, COLOUR_GREY, 20, 169, 249, 260, STR_OPTIONS_BASE_GRF_CBO, STR_OPTIONS_BASE_GRF_TIP}, + { WIDGETS_END}, }; static const WindowDesc _game_options_desc = { - WDP_CENTER, WDP_CENTER, 370, 239, 370, 239, + WDP_CENTER, WDP_CENTER, 370, 281, 370, 281, WC_GAME_OPTIONS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _game_options_widgets, |