diff --git a/data/language/dutch.txt b/data/language/dutch.txt index 5e9b2bbcae..4b1a0d6bfb 100644 --- a/data/language/dutch.txt +++ b/data/language/dutch.txt @@ -2771,9 +2771,9 @@ STR_2769 :Park openen STR_2770 :Park sluiten STR_2771 :Lagere spelsnelheid STR_2772 :Hogere spelsnelheid -STR_2773 :??? -STR_2774 :??? -STR_2775 :??? +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) STR_2776 :Taal STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b60498c9b2..23535f2a06 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -2775,9 +2775,9 @@ STR_2769 :Open Park STR_2770 :Close Park STR_2771 :Slower Gamespeed STR_2772 :Faster Gamespeed -STR_2773 :??? -STR_2774 :??? -STR_2775 :??? +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) STR_2776 :Language STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} diff --git a/data/language/english_us.txt b/data/language/english_us.txt index 4b588c57bd..1788d14dcf 100644 --- a/data/language/english_us.txt +++ b/data/language/english_us.txt @@ -2775,13 +2775,13 @@ STR_2769 :Open Park STR_2770 :Close Park STR_2771 :Slower Gamespeed STR_2772 :Faster Gamespeed -# End of new strings -STR_2773 :??? -STR_2774 :??? -STR_2775 :??? +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) STR_2776 :Language STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +# End of new strings STR_2779 :??? STR_2780 :??? STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} diff --git a/data/language/french.txt b/data/language/french.txt index 4b588c57bd..1788d14dcf 100644 --- a/data/language/french.txt +++ b/data/language/french.txt @@ -2775,13 +2775,13 @@ STR_2769 :Open Park STR_2770 :Close Park STR_2771 :Slower Gamespeed STR_2772 :Faster Gamespeed -# End of new strings -STR_2773 :??? -STR_2774 :??? -STR_2775 :??? +STR_2773 :Windowed +STR_2774 :Fullscreen +STR_2775 :Fullscreen (desktop) STR_2776 :Language STR_2777 :{MOVE_X}{SMALLFONT}{STRING} STR_2778 :{RIGHTGUILLEMET}{MOVE_X}{SMALLFONT}{STRING} +# End of new strings STR_2779 :??? STR_2780 :??? STR_2781 :{STRINGID}:{MOVE_X}{195}{STRINGID}{STRINGID} diff --git a/src/window_options.c b/src/window_options.c index 6b56894a93..db918f03c9 100644 --- a/src/window_options.c +++ b/src/window_options.c @@ -18,43 +18,49 @@ * along with this program. If not, see . *****************************************************************************/ +/** + * To better group the options together and allow the window to be scalable with additional OpenRCT2 options, the window has + * been changed to a tab interface similar to the options window seen in Locomotion. + * + * TODO Some parts, particularly the string handling and order of widgets needs reorganising. + * Padding between the widgets and the window needs reducing, an artifact from originally being inside group boxes. + */ + +#include + #include "addresses.h" #include "audio.h" #include "config.h" #include "gfx.h" #include "language.h" #include "osinterface.h" +#include "sprites.h" #include "string_ids.h" #include "viewport.h" #include "widget.h" #include "window.h" #include "window_dropdown.h" -#include +enum { + WINDOW_OPTIONS_PAGE_DISPLAY, + WINDOW_OPTIONS_PAGE_CULTURE, + WINDOW_OPTIONS_PAGE_AUDIO, + WINDOW_OPTIONS_PAGE_INPUT, + WINDOW_OPTIONS_PAGE_MISC, + WINDOW_OPTIONS_PAGE_COUNT +}; enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE, - WIDX_SOUND_GROUP, - WIDX_SOUND, - WIDX_SOUND_DROPDOWN, - WIDX_MUSIC, - WIDX_MUSIC_DROPDOWN, - WIDX_SOUND_QUALITY, - WIDX_SOUND_QUALITY_DROPDOWN, - WIDX_SOUND_SW_BUFFER_CHECKBOX, - WIDX_SOUND_PAUSED_CHECKBOX, - WIDX_UNITS_GROUP, - WIDX_CURRENCY, - WIDX_CURRENCY_DROPDOWN, - WIDX_DISTANCE, - WIDX_DISTANCE_DROPDOWN, - WIDX_TEMPERATURE, - WIDX_TEMPERATURE_DROPDOWN, - WIDX_HEIGHT_LABELS, - WIDX_HEIGHT_LABELS_DROPDOWN, - WIDX_DISPLAY_GROUP, + WIDX_PAGE_BACKGROUND, + WIDX_TAB_1, + WIDX_TAB_2, + WIDX_TAB_3, + WIDX_TAB_4, + WIDX_TAB_5, + WIDX_RESOLUTION, WIDX_RESOLUTION_DROPDOWN, WIDX_FULLSCREEN, @@ -63,67 +69,103 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_GRIDLINES_CHECKBOX, WIDX_CONSTRUCTION_MARKER, WIDX_CONSTRUCTION_MARKER_DROPDOWN, - WIDX_CONTROLS_GROUP, + + WIDX_LANGUAGE, + WIDX_LANGUAGE_DROPDOWN, + WIDX_CURRENCY, + WIDX_CURRENCY_DROPDOWN, + WIDX_DISTANCE, + WIDX_DISTANCE_DROPDOWN, + WIDX_TEMPERATURE, + WIDX_TEMPERATURE_DROPDOWN, + WIDX_HEIGHT_LABELS, + WIDX_HEIGHT_LABELS_DROPDOWN, + + WIDX_SOUND, + WIDX_SOUND_DROPDOWN, + WIDX_MUSIC, + WIDX_MUSIC_DROPDOWN, + WIDX_SOUND_QUALITY, + WIDX_SOUND_QUALITY_DROPDOWN, + WIDX_SOUND_SW_BUFFER_CHECKBOX, + WIDX_SOUND_PAUSED_CHECKBOX, + WIDX_SCREEN_EDGE_SCROLLING, WIDX_HOTKEY_DROPDOWN, - WIDX_GENERAL_GROUP, + WIDX_REAL_NAME_CHECKBOX, WIDX_SAVE_PLUGIN_DATA_CHECKBOX, - WIDX_LANGUAGE_GROUP, - WIDX_LANGUAGE_DROPDOWN, - WIDX_LANGUAGE_DROPDOWN_BUTTON }; #define WW 310 -#define WH 437 +#define WH 135 static rct_widget window_options_widgets[] = { { WWT_FRAME, 0, 0, WW - 1, 0, WH - 1, STR_NONE, STR_NONE }, { WWT_CAPTION, 0, 1, WW - 2, 1, 14, STR_OPTIONS, STR_WINDOW_TITLE_TIP }, { WWT_CLOSEBOX, 0, WW-13, WW - 3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, - { WWT_GROUPBOX, 0, 3, 306, 17, 105, STR_SOUND, STR_NONE }, - { WWT_DROPDOWN, 0, 10, 299, 31, 42, 0x361, STR_NONE }, // sound - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 32, 41, 0x36C, STR_NONE }, - { WWT_DROPDOWN, 0, 155, 299, 46, 57, 0x365, STR_NONE }, // music - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 47, 56, 0x36C, STR_NONE }, - { WWT_DROPDOWN, 0, 155, 299, 61, 72, 0x366, STR_NONE }, // sound quality - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 62, 71, 0x36C, STR_NONE }, - { WWT_CHECKBOX, 0, 10, 299, 76, 87, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP }, - { WWT_CHECKBOX, 0, 10, 229, 88, 99, STR_SOUND, STR_NONE }, // enable/disable sound - { WWT_GROUPBOX, 0, 3, 306, 112, 188, STR_UNITS, STR_NONE }, - { WWT_DROPDOWN, 0, 155, 299, 126, 137, 0x367, STR_NONE }, // currency - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 127, 136, 0x36C, STR_NONE },// - { WWT_DROPDOWN, 0, 155, 299, 141, 152, 0x368, STR_NONE }, // distance - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 142, 151, 0x36C, STR_NONE }, - { WWT_DROPDOWN, 0, 155, 299, 156, 168, 0x36B, STR_NONE }, // temperature - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 157, 166, 0x36C, STR_NONE }, //jjj - { WWT_DROPDOWN, 0, 155, 299, 171, 182, 0x364, STR_NONE }, // height labels - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 172, 181, 0x36C, STR_NONE }, - { WWT_GROUPBOX, 0, 3, 306, 194, 285, STR_DISPLAY, STR_NONE },// - { WWT_DROPDOWN, 0, 155, 299, 208, 219, 0x348, STR_NONE }, // resolution - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 209, 218, 0x36C, STR_NONE }, - { WWT_DROPDOWN, 0, 155, 299, 223, 234, 0x348, STR_NONE }, // fullscreen - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 224, 233, 0x36C, STR_NONE }, - { WWT_CHECKBOX, 0, 10, 299, 239, 250, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, - { WWT_CHECKBOX, 0, 10, 299, 254, 265, STR_GRIDLINES, STR_GRIDLINES_TIP }, - { WWT_DROPDOWN, 0, 155, 299, 268, 279, STR_NONE, STR_NONE }, // construction marker - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 269, 278, 0x36C, STR_NONE }, - { WWT_GROUPBOX, 0, 3, 306, 291, 337, STR_CONTROLS, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 306, 317, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, - { WWT_DROPDOWN_BUTTON, 0, 26, 185, 321, 331, STR_HOTKEY, STR_HOTKEY_TIP }, - { WWT_GROUPBOX, 0, 3, 306, 344, 392, STR_GENERAL, STR_NONE }, - { WWT_CHECKBOX, 2, 10, 299, 358, 369, STR_REAL_NAME, STR_REAL_NAME_TIP }, - { WWT_CHECKBOX, 2, 10, 299, 372, 384, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, - { WWT_GROUPBOX, 0, 3, 306, 399, 430, 2776, STR_NONE }, - { WWT_DROPDOWN, 0, 10, 299, 413, 424, STR_NONE, STR_NONE }, // language - { WWT_DROPDOWN_BUTTON, 0, 288, 298, 414, 423, 0x36C, STR_NONE }, + { WWT_RESIZE, 1, 0, WW - 1, 43, WH - 1, 0xFFFFFFFF, STR_NONE }, + { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_NONE }, + { WWT_TAB, 1, 127, 157, 17, 43, 0x2000144E, STR_NONE }, + + // Display tab + { WWT_DROPDOWN, 0, 155, 299, 53, 64, 840, STR_NONE }, // resolution + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 54, 63, 876, STR_NONE }, + { WWT_DROPDOWN, 0, 155, 299, 68, 79, 871, STR_NONE }, // fullscreen + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 69, 78, 876, STR_NONE }, + { WWT_CHECKBOX, 0, 10, 299, 84, 95, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, + { WWT_CHECKBOX, 0, 10, 299, 99, 110, STR_GRIDLINES, STR_GRIDLINES_TIP }, + { WWT_DROPDOWN, 0, 155, 299, 113, 124, STR_NONE, STR_NONE }, // construction marker + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 114, 123, 876, STR_NONE }, + + // Culture / units tab + { WWT_DROPDOWN, 0, 155, 299, 53, 64, STR_NONE, STR_NONE }, // language + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 54, 63, 876, STR_NONE }, + { WWT_DROPDOWN, 0, 155, 299, 68, 79, 871, STR_NONE }, // currency + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 69, 78, 876, STR_NONE }, // + { WWT_DROPDOWN, 0, 155, 299, 83, 94, 872, STR_NONE }, // distance + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 84, 93, 876, STR_NONE }, + { WWT_DROPDOWN, 0, 155, 299, 98, 110, 875, STR_NONE }, // temperature + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 99, 108, 876, STR_NONE }, //jjj + { WWT_DROPDOWN, 0, 155, 299, 113, 124, 868, STR_NONE }, // height labels + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 114, 123, 876, STR_NONE }, + + // Audio tab + { WWT_DROPDOWN, 0, 10, 299, 53, 64, 865, STR_NONE }, // sound + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 54, 63, 876, STR_NONE }, + { WWT_DROPDOWN, 0, 155, 299, 68, 79, 869, STR_NONE }, // music + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 69, 78, 876, STR_NONE }, + { WWT_DROPDOWN, 0, 155, 299, 83, 94, 870, STR_NONE }, // sound quality + { WWT_DROPDOWN_BUTTON, 0, 288, 298, 84, 93, 876, STR_NONE }, + { WWT_CHECKBOX, 0, 10, 299, 99, 110, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING, STR_SOUND_FORCED_SOFTWARE_BUFFER_MIXING_TIP }, + { WWT_CHECKBOX, 0, 10, 229, 114, 125, STR_SOUND, STR_NONE }, // enable/disable sound + + // Controls tab + { WWT_CHECKBOX, 2, 10, 299, 53, 64, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, + { WWT_DROPDOWN_BUTTON, 0, 26, 185, 68, 78, STR_HOTKEY, STR_HOTKEY_TIP }, + + // Misc + { WWT_CHECKBOX, 2, 10, 299, 53, 64, STR_REAL_NAME, STR_REAL_NAME_TIP }, + { WWT_CHECKBOX, 2, 10, 299, 68, 79, STR_SAVE_PLUGIN_DATA, STR_SAVE_PLUGIN_DATA_TIP }, { WIDGETS_END }, }; +const int window_options_tab_animation_divisor[] = { 4, 8, 2, 2, 2 }; +const int window_options_tab_animation_frames[] = { 16, 8, 16, 4, 16 }; + +static void window_options_set_page(rct_window *w, int page); +static void window_options_set_pressed_tab(rct_window *w); +static void window_options_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, int page, int spriteIndex); +static void window_options_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); + static void window_options_emptysub() { } static void window_options_mouseup(); static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* widget); static void window_options_dropdown(); +static void window_options_update(rct_window *w); static void window_options_invalidate(); static void window_options_paint(); static void window_options_show_dropdown(rct_window *w, rct_widget *widget, int num_items); @@ -136,7 +178,7 @@ static void* window_options_events[] = { window_options_mousedown, window_options_dropdown, window_options_emptysub, - window_options_emptysub, + window_options_update, window_options_emptysub, window_options_emptysub, window_options_emptysub, @@ -176,36 +218,42 @@ void window_options_open() w = window_create_auto_pos(WW, WH, (uint32*)window_options_events, WC_OPTIONS, 0); w->widgets = window_options_widgets; w->enabled_widgets = - (1 << WIDX_CLOSE) | - (1 << WIDX_SOUND) | - (1 << WIDX_SOUND_DROPDOWN) | - (1 << WIDX_MUSIC) | - (1 << WIDX_MUSIC_DROPDOWN) | - (1 << WIDX_SOUND_QUALITY) | - (1 << WIDX_SOUND_QUALITY_DROPDOWN) | - (1 << WIDX_CURRENCY) | - (1 << WIDX_CURRENCY_DROPDOWN) | - (1 << WIDX_DISTANCE) | - (1 << WIDX_DISTANCE_DROPDOWN) | - (1 << WIDX_RESOLUTION) | - (1 << WIDX_RESOLUTION_DROPDOWN) | - (1 << WIDX_FULLSCREEN) | - (1 << WIDX_FULLSCREEN_DROPDOWN) | - (1 << WIDX_TEMPERATURE) | - (1 << WIDX_TEMPERATURE_DROPDOWN) | + (1ULL << WIDX_CLOSE) | + (1ULL << WIDX_TAB_1) | + (1ULL << WIDX_TAB_2) | + (1ULL << WIDX_TAB_3) | + (1ULL << WIDX_TAB_4) | + (1ULL << WIDX_TAB_5) | + (1ULL << WIDX_SOUND) | + (1ULL << WIDX_SOUND_DROPDOWN) | + (1ULL << WIDX_MUSIC) | + (1ULL << WIDX_MUSIC_DROPDOWN) | + (1ULL << WIDX_SOUND_QUALITY) | + (1ULL << WIDX_SOUND_QUALITY_DROPDOWN) | + (1ULL << WIDX_CURRENCY) | + (1ULL << WIDX_CURRENCY_DROPDOWN) | + (1ULL << WIDX_DISTANCE) | + (1ULL << WIDX_DISTANCE_DROPDOWN) | + (1ULL << WIDX_RESOLUTION) | + (1ULL << WIDX_RESOLUTION_DROPDOWN) | + (1ULL << WIDX_FULLSCREEN) | + (1ULL << WIDX_FULLSCREEN_DROPDOWN) | + (1ULL << WIDX_TEMPERATURE) | + (1ULL << WIDX_TEMPERATURE_DROPDOWN) | (1ULL << WIDX_HOTKEY_DROPDOWN) | (1ULL << WIDX_SCREEN_EDGE_SCROLLING) | (1ULL << WIDX_REAL_NAME_CHECKBOX) | - (1 << WIDX_CONSTRUCTION_MARKER) | - (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | - (1 << WIDX_HEIGHT_LABELS) | - (1 << WIDX_HEIGHT_LABELS_DROPDOWN) | - (1 << WIDX_TILE_SMOOTHING_CHECKBOX) | - (1 << WIDX_GRIDLINES_CHECKBOX) | - (1 << WIDX_SOUND_SW_BUFFER_CHECKBOX) | - (1 << WIDX_SOUND_PAUSED_CHECKBOX) | + (1ULL << WIDX_CONSTRUCTION_MARKER) | + (1ULL << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | + (1ULL << WIDX_HEIGHT_LABELS) | + (1ULL << WIDX_HEIGHT_LABELS_DROPDOWN) | + (1ULL << WIDX_TILE_SMOOTHING_CHECKBOX) | + (1ULL << WIDX_GRIDLINES_CHECKBOX) | + (1ULL << WIDX_SOUND_SW_BUFFER_CHECKBOX) | + (1ULL << WIDX_SOUND_PAUSED_CHECKBOX) | (1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX); // doesn't seem to work? + w->page = WINDOW_OPTIONS_PAGE_DISPLAY; window_init_scroll_widgets(w); w->colours[0] = 7; w->colours[1] = 7; @@ -221,23 +269,19 @@ static void window_options_mouseup() short widgetIndex; rct_window *w; - #ifdef _MSC_VER - __asm mov widgetIndex, dx - #else - __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); - #endif - - #ifdef _MSC_VER - __asm mov w, esi - #else - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); - #endif - + window_mouse_up_get_registers(w, widgetIndex); switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; + case WIDX_TAB_1: + case WIDX_TAB_2: + case WIDX_TAB_3: + case WIDX_TAB_4: + case WIDX_TAB_5: + window_options_set_page(w, widgetIndex - WIDX_TAB_1); + break; case WIDX_HOTKEY_DROPDOWN: RCT2_CALLPROC_EBPSAFE(0x006E3884); break; @@ -400,9 +444,9 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsFormat[0] = 1142; gDropdownItemsFormat[1] = 1142; gDropdownItemsFormat[2] = 1142; - gDropdownItemsArgs[0] = STR_CELSIUS; - gDropdownItemsArgs[1] = STR_FAHRENHEIT; - gDropdownItemsArgs[2] = STR_METRIC; + gDropdownItemsArgs[0] = 2773; + gDropdownItemsArgs[1] = 2774; + gDropdownItemsArgs[2] = 2775; window_options_show_dropdown(w, widget, 3); @@ -428,7 +472,7 @@ static void window_options_mousedown(int widgetIndex, rct_window*w, rct_widget* gDropdownItemsChecked = 1 << RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); break; - case WIDX_LANGUAGE_DROPDOWN_BUTTON: + case WIDX_LANGUAGE_DROPDOWN: for (i = 1; i < LANGUAGE_COUNT; i++) { gDropdownItemsFormat[i - 1] = 2777; gDropdownItemsArgs[i - 1] = (sint64)language_names[i]; @@ -449,24 +493,7 @@ static void window_options_dropdown() short widgetIndex; rct_window *w; - #ifdef _MSC_VER - __asm mov dropdownIndex, ax - #else - __asm__ ( "mov %[dropdownIndex], ax " : [dropdownIndex] "+m" (dropdownIndex) ); - #endif - - #ifdef _MSC_VER - __asm mov widgetIndex, dx - #else - __asm__ ( "mov %[widgetIndex], dx " : [widgetIndex] "+m" (widgetIndex) ); - #endif - - #ifdef _MSC_VER - __asm mov w, esi - #else - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); - #endif - + window_dropdown_get_registers(w, widgetIndex, dropdownIndex); if (dropdownIndex == -1) return; @@ -536,8 +563,7 @@ static void window_options_dropdown() if (dropdownIndex == 2){ w->disabled_widgets |= (1 << WIDX_RESOLUTION_DROPDOWN); w->disabled_widgets |= (1 << WIDX_RESOLUTION); - } - else { + } else { w->disabled_widgets &= ~(1 << WIDX_RESOLUTION_DROPDOWN); w->disabled_widgets &= ~(1 << WIDX_RESOLUTION); } @@ -559,7 +585,7 @@ static void window_options_dropdown() gfx_invalidate_screen(); } break; - case WIDX_LANGUAGE_DROPDOWN_BUTTON: + case WIDX_LANGUAGE_DROPDOWN: if (dropdownIndex != gCurrentLanguage - 1) { language_open(dropdownIndex + 1); gGeneral_config.language = dropdownIndex + 1; @@ -577,107 +603,154 @@ static void window_options_dropdown() static void window_options_invalidate() { rct_window *w; - #ifdef _MSC_VER - __asm mov w, esi - #else - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); - #endif + int i; + sint32 currentSoundDevice; - sint32 currentSoundDevice = RCT2_GLOBAL(0x009AF280, sint32); + window_get_register(w); - // sound devices - if (currentSoundDevice == -1 || gAudioDeviceCount == 0) { - RCT2_GLOBAL(0x013CE952, uint16) = STR_SOUND_NONE; - } else { - RCT2_GLOBAL(0x013CE952, uint16) = 1170; - RCT2_GLOBAL(0x013CE952 + 2, uint32) = (uint32)gAudioDevices[currentSoundDevice].name; + window_options_set_pressed_tab(w); + for (i = WIDX_RESOLUTION; i <= WIDX_SAVE_PLUGIN_DATA_CHECKBOX; i++) { + window_options_widgets[i].type = WWT_EMPTY; } - - // height: units/real values - RCT2_GLOBAL(0x013CE952 + 6, uint16) = ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) ? - STR_UNITS : STR_REAL_VALUES; - - // music: on/off - RCT2_GLOBAL(0x013CE952 + 8, uint16) = STR_OFF + - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8); - - // sound quality: low/medium/high - RCT2_GLOBAL(0x013CE952 + 10, uint16) = STR_SOUND_LOW + - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, uint8); - // currency: pounds, dollars, etc. (10 total) - RCT2_GLOBAL(0x013CE952 + 12, uint16) = STR_POUNDS + - (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, uint8) & 0x3F); + switch (w->page) { + case WINDOW_OPTIONS_PAGE_DISPLAY: + // resolution + RCT2_GLOBAL(0x013CE952 + 16, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_WIDTH, uint16); + RCT2_GLOBAL(0x013CE952 + 18, uint16) = RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_HEIGHT, uint16); + RCT2_GLOBAL(0x013CE952 + 12, uint16) = 2773 + gGeneral_config.fullscreen_mode; - // distance: metric/imperial - RCT2_GLOBAL(0x013CE952 + 14, uint16) = STR_IMPERIAL + - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, uint8); + // landscape tile smoothing checkbox + if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE)) + w->pressed_widgets &= ~(1ULL << WIDX_TILE_SMOOTHING_CHECKBOX); + else + w->pressed_widgets |= (1ULL << WIDX_TILE_SMOOTHING_CHECKBOX); - // resolution - RCT2_GLOBAL(0x013CE952 + 16, uint16) = - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_WIDTH, uint16); - RCT2_GLOBAL(0x013CE952 + 18, uint16) = - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_RESOLUTION_HEIGHT, uint16); + // show gridlines checkbox + if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES)) + w->pressed_widgets |= (1ULL << WIDX_GRIDLINES_CHECKBOX); + else + w->pressed_widgets &= ~(1ULL << WIDX_GRIDLINES_CHECKBOX); - // temperature: celsius/fahrenheit - RCT2_GLOBAL(0x013CE952 + 20, uint16) = STR_CELSIUS + - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, uint8); + // construction marker: celsius/fahrenheit + window_options_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); - // construction marker: celsius/fahrenheit - window_options_widgets[WIDX_CONSTRUCTION_MARKER].image = STR_WHITE + - RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CONSTRUCTION_MARKER, uint8); - - //Sound pause checkbox - if (!g_sounds_disabled) - w->pressed_widgets |= (1 << WIDX_SOUND_PAUSED_CHECKBOX); - else - w->pressed_widgets &= ~(1 << WIDX_SOUND_PAUSED_CHECKBOX); + window_options_widgets[WIDX_RESOLUTION].type = WWT_DROPDOWN; + window_options_widgets[WIDX_RESOLUTION_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_FULLSCREEN].type = WWT_DROPDOWN; + window_options_widgets[WIDX_FULLSCREEN_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_TILE_SMOOTHING_CHECKBOX].type = WWT_CHECKBOX; + window_options_widgets[WIDX_GRIDLINES_CHECKBOX].type = WWT_CHECKBOX; + window_options_widgets[WIDX_CONSTRUCTION_MARKER].type = WWT_DROPDOWN; + window_options_widgets[WIDX_CONSTRUCTION_MARKER_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + break; + case WINDOW_OPTIONS_PAGE_CULTURE: + // currency: pounds, dollars, etc. (10 total) + RCT2_GLOBAL(0x013CE952 + 12, uint16) = STR_POUNDS + (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_CURRENCY, uint8) & 0x3F); + + // distance: metric/imperial + RCT2_GLOBAL(0x013CE952 + 14, uint16) = STR_IMPERIAL + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_METRIC, uint8); + + // temperature: celsius/fahrenheit + RCT2_GLOBAL(0x013CE952 + 20, uint16) = STR_CELSIUS + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_TEMPERATURE, uint8); + + // height: units/real values + RCT2_GLOBAL(0x013CE952 + 6, uint16) = + ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SHOW_HEIGHT_AS_UNITS)) ? STR_UNITS : STR_REAL_VALUES; + + window_options_widgets[WIDX_LANGUAGE].type = WWT_DROPDOWN; + window_options_widgets[WIDX_LANGUAGE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_CURRENCY].type = WWT_DROPDOWN; + window_options_widgets[WIDX_CURRENCY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_DISTANCE].type = WWT_DROPDOWN; + window_options_widgets[WIDX_DISTANCE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_TEMPERATURE].type = WWT_DROPDOWN; + window_options_widgets[WIDX_TEMPERATURE_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_HEIGHT_LABELS].type = WWT_DROPDOWN; + window_options_widgets[WIDX_HEIGHT_LABELS_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + break; + case WINDOW_OPTIONS_PAGE_AUDIO: + currentSoundDevice = RCT2_GLOBAL(0x009AF280, sint32); + + // sound devices + if (currentSoundDevice == -1 || gAudioDeviceCount == 0) { + RCT2_GLOBAL(0x013CE952, uint16) = STR_SOUND_NONE; + } else { + RCT2_GLOBAL(0x013CE952, uint16) = 1170; + RCT2_GLOBAL(0x013CE952 + 2, uint32) = (uint32)gAudioDevices[currentSoundDevice].name; + } + + // music: on/off + RCT2_GLOBAL(0x013CE952 + 8, uint16) = STR_OFF + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_MUSIC, uint8); + + // sound quality: low/medium/high + RCT2_GLOBAL(0x013CE952 + 10, uint16) = STR_SOUND_LOW + RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_QUALITY, uint8); + + //Sound pause checkbox + if (!g_sounds_disabled) + w->pressed_widgets |= (1ULL << WIDX_SOUND_PAUSED_CHECKBOX); + else + w->pressed_widgets &= ~(1ULL << WIDX_SOUND_PAUSED_CHECKBOX); - // sound software mixing buffer checkbox - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint8)) - w->pressed_widgets |= (1 << WIDX_SOUND_SW_BUFFER_CHECKBOX); - else - w->pressed_widgets &= ~(1 << WIDX_SOUND_SW_BUFFER_CHECKBOX); + // sound software mixing buffer checkbox + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_SOUND_SW_BUFFER, uint8)) + w->pressed_widgets |= (1ULL << WIDX_SOUND_SW_BUFFER_CHECKBOX); + else + w->pressed_widgets &= ~(1ULL << WIDX_SOUND_SW_BUFFER_CHECKBOX); - // screen edge scrolling checkbox - if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, uint8)) - w->pressed_widgets |= (1ULL << WIDX_SCREEN_EDGE_SCROLLING); - else - w->pressed_widgets &= ~(1ULL << WIDX_SCREEN_EDGE_SCROLLING); + window_options_widgets[WIDX_SOUND].type = WWT_DROPDOWN; + window_options_widgets[WIDX_SOUND_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_MUSIC].type = WWT_DROPDOWN; + window_options_widgets[WIDX_MUSIC_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_SOUND_QUALITY].type = WWT_DROPDOWN; + window_options_widgets[WIDX_SOUND_QUALITY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + window_options_widgets[WIDX_SOUND_SW_BUFFER_CHECKBOX].type = WWT_CHECKBOX; + window_options_widgets[WIDX_SOUND_PAUSED_CHECKBOX].type = WWT_CHECKBOX; + break; + case WINDOW_OPTIONS_PAGE_INPUT: + // screen edge scrolling checkbox + if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_EDGE_SCROLLING, uint8)) + w->pressed_widgets |= (1ULL << WIDX_SCREEN_EDGE_SCROLLING); + else + w->pressed_widgets &= ~(1ULL << WIDX_SCREEN_EDGE_SCROLLING); - // real name checkbox - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) - w->pressed_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX); - else - w->pressed_widgets &= ~(1ULL << WIDX_REAL_NAME_CHECKBOX); - - // landscape tile smoothing checkbox - if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_DISABLE_SMOOTH_LANDSCAPE)) - w->pressed_widgets &= ~(1 << WIDX_TILE_SMOOTHING_CHECKBOX); - else - w->pressed_widgets |= (1 << WIDX_TILE_SMOOTHING_CHECKBOX); + window_options_widgets[WIDX_SCREEN_EDGE_SCROLLING].type = WWT_CHECKBOX; + window_options_widgets[WIDX_HOTKEY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; + break; + case WINDOW_OPTIONS_PAGE_MISC: + // real name checkbox + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) + w->pressed_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX); + else + w->pressed_widgets &= ~(1ULL << WIDX_REAL_NAME_CHECKBOX); - // show gridlines checkbox - if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_ALWAYS_SHOW_GRIDLINES)) - w->pressed_widgets |= (1 << WIDX_GRIDLINES_CHECKBOX); - else - w->pressed_widgets &= ~(1 << WIDX_GRIDLINES_CHECKBOX); + // save plugin data checkbox + if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SAVE_PLUGIN_DATA)) + w->pressed_widgets |= (1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX); + else + w->pressed_widgets &= ~(1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX); - // save plugin data checkbox - if ((RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & CONFIG_FLAG_SAVE_PLUGIN_DATA)) - w->pressed_widgets |= (1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX); - else - w->pressed_widgets &= ~(1ULL << WIDX_SAVE_PLUGIN_DATA_CHECKBOX); + // unknown park flag can disable real name checkbox + if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x8000) + w->disabled_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX); - // unknown park flag can disable real name checkbox - if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x8000) - w->disabled_widgets |= (1ULL << WIDX_REAL_NAME_CHECKBOX); + // save plugin data checkbox: visible or not + if (RCT2_GLOBAL(0x00F42BDA, uint8) == 1) + window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_EMPTY; + else + window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; - // save plugin data checkbox: visible or not - if (RCT2_GLOBAL(0x00F42BDA, uint8) == 1) - window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_EMPTY; - else + window_options_widgets[WIDX_REAL_NAME_CHECKBOX].type = WWT_CHECKBOX; window_options_widgets[WIDX_SAVE_PLUGIN_DATA_CHECKBOX].type = WWT_CHECKBOX; + break; + } +} + +static void window_options_update(rct_window *w) +{ + // Tab animation + w->frame_no++; + widget_invalidate(w->classification, w->number, WIDX_TAB_1 + w->page); } /** @@ -688,58 +761,42 @@ static void window_options_paint() { rct_window *w; rct_drawpixelinfo *dpi; + char buffer[256]; - #ifdef _MSC_VER - __asm mov w, esi - #else - __asm__ ( "mov %[w], esi " : [w] "+m" (w) ); - #endif - - #ifdef _MSC_VER - __asm mov dpi, edi - #else - __asm__ ( "mov %[dpi], edi " : [dpi] "+m" (dpi) ); - #endif - + window_paint_get_registers(w, dpi); window_draw_widgets(w, dpi); + window_options_draw_tab_images(dpi, w); - // units - gfx_draw_string_left(dpi, STR_CURRENCY, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_CURRENCY].top + 1); - gfx_draw_string_left(dpi, STR_DISTANCE_AND_SPEED, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_DISTANCE].top + 1); - gfx_draw_string_left(dpi, STR_TEMPERATURE, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_TEMPERATURE].top + 1); - gfx_draw_string_left(dpi, STR_HEIGHT_LABELS, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_HEIGHT_LABELS].top + 1); + switch (w->page) { + case WINDOW_OPTIONS_PAGE_DISPLAY: + gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_RESOLUTION].top + 1); - // display - gfx_draw_string_left(dpi, STR_DISPLAY_RESOLUTION, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_RESOLUTION].top + 1); + sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_WINDOW_COLOUR_2, "Fullscreen mode:"); + gfx_draw_string(dpi, buffer, 0, w->x + 10, w->y + window_options_widgets[WIDX_FULLSCREEN].top + 1); - char buffer[256]; - sprintf(buffer, "%c%c%s", FORMAT_MEDIUMFONT, FORMAT_WINDOW_COLOUR_2, "Fullscreen mode:"); - gfx_draw_string(dpi, buffer, 0, w->x + 10, - w->y + window_options_widgets[WIDX_FULLSCREEN].top + 1); + gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_CONSTRUCTION_MARKER].top + 1); + break; + case WINDOW_OPTIONS_PAGE_CULTURE: + gfx_draw_string_left(dpi, 2776, w, 12, w->x + 10, w->y + window_options_widgets[WIDX_LANGUAGE].top + 1); + gfx_draw_string( + dpi, + (char*)language_names[gCurrentLanguage], + 12, + w->x + window_options_widgets[WIDX_LANGUAGE].left + 1, + w->y + window_options_widgets[WIDX_LANGUAGE].top + ); - gfx_draw_string_left(dpi, STR_CONSTRUCTION_MARKER, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_CONSTRUCTION_MARKER].top + 1); - - // sound - gfx_draw_string_left(dpi, STR_MUSIC, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_MUSIC].top + 1); - gfx_draw_string_left(dpi, STR_SOUND_QUALITY, w, 0, w->x + 10, - w->y + window_options_widgets[WIDX_SOUND_QUALITY].top + 1); - - // language - gfx_draw_string( - dpi, - (char*)language_names[gCurrentLanguage], - 12, - w->x + window_options_widgets[WIDX_LANGUAGE_DROPDOWN].left + 1, - w->y + window_options_widgets[WIDX_LANGUAGE_DROPDOWN].top - ); + gfx_draw_string_left(dpi, STR_CURRENCY, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_CURRENCY].top + 1); + gfx_draw_string_left(dpi, STR_DISTANCE_AND_SPEED, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_DISTANCE].top + 1); + gfx_draw_string_left(dpi, STR_TEMPERATURE, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_TEMPERATURE].top + 1); + gfx_draw_string_left(dpi, STR_HEIGHT_LABELS, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_HEIGHT_LABELS].top + 1); + break; + case WINDOW_OPTIONS_PAGE_AUDIO: + gfx_draw_string_left(dpi, STR_MUSIC, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_MUSIC].top + 1); + gfx_draw_string_left(dpi, STR_SOUND_QUALITY, w, 0, w->x + 10, w->y + window_options_widgets[WIDX_SOUND_QUALITY].top + 1); + break; + } } // helper function, all dropdown boxes have similar properties @@ -768,3 +825,52 @@ static void window_options_update_height_markers() config_save(); gfx_invalidate_screen(); } + +#pragma region Common + +static void window_options_set_page(rct_window *w, int page) +{ + w->page = page; + w->frame_no = 0; + + window_invalidate(w); + + RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0); + RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0); + + window_init_scroll_widgets(w); + window_invalidate(w); +} + +static void window_options_set_pressed_tab(rct_window *w) +{ + int i; + for (i = 0; i < WINDOW_OPTIONS_PAGE_COUNT; i++) + w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); + w->pressed_widgets |= 1LL << (WIDX_TAB_1 + w->page); +} + +static void window_options_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, int page, int spriteIndex) +{ + int widgetIndex = WIDX_TAB_1 + page; + + if (!(w->disabled_widgets & (1LL << widgetIndex))) { + if (w->page == page) { + int frame = w->frame_no / window_options_tab_animation_divisor[w->page]; + spriteIndex += (frame % window_options_tab_animation_frames[w->page]); + } + + gfx_draw_sprite(dpi, spriteIndex, w->x + w->widgets[widgetIndex].left, w->y + w->widgets[widgetIndex].top, 0); + } +} + +static void window_options_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w) +{ + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_DISPLAY, 5442); + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_CULTURE, 5229); + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_AUDIO, 5335); + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_INPUT, 5201); + window_options_draw_tab_image(dpi, w, WINDOW_OPTIONS_PAGE_MISC, 5205); +} + +#pragma endregion \ No newline at end of file