From 88a0359cf643017b3db9dc31e6038dc8f7ed7adb Mon Sep 17 00:00:00 2001 From: anyc Date: Sat, 24 May 2014 01:00:58 +0200 Subject: [PATCH] added quit_prompt to save_prompt; proper case handling except save operation --- src/osinterface.c | 3 +- src/rct2.c | 5 + src/rct2.h | 1 + src/window.h | 6 ++ src/window_save_prompt.c | 217 +++++++++++++++++++++++++++------------ src/window_title_exit.c | 2 +- 6 files changed, 165 insertions(+), 69 deletions(-) diff --git a/src/osinterface.c b/src/osinterface.c index 5e2c2c5538..8117a31198 100644 --- a/src/osinterface.c +++ b/src/osinterface.c @@ -234,7 +234,8 @@ void osinterface_process_messages() while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_QUIT: - rct2_finish(); +// rct2_finish(); + rct2_quit(); break; case SDL_WINDOWEVENT: if (e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) diff --git a/src/rct2.c b/src/rct2.c index 6bd29dc5c3..543d60b44e 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -132,6 +132,11 @@ void rct2_finish() _finished = 1; } +void rct2_quit() { + RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) = PM_QUIT; + window_save_prompt_open(); +} + void rct2_init() { RCT2_GLOBAL(0x00F663AC, int) = 0; diff --git a/src/rct2.h b/src/rct2.h index 1e81ac4d4b..de15afa96f 100644 --- a/src/rct2.h +++ b/src/rct2.h @@ -170,5 +170,6 @@ void get_local_time(); void *rct2_malloc(size_t numBytes); void *rct2_realloc(void *block, size_t numBytes); void rct2_free(void *block); +void rct2_quit(); #endif diff --git a/src/window.h b/src/window.h index 6bff42546b..25e3478852 100644 --- a/src/window.h +++ b/src/window.h @@ -285,6 +285,12 @@ enum { WC_CHEATS = 110, } WINDOW_CLASS; +enum PROMPT_MODE { + PM_SAVE_BEFORE_LOAD, + PM_SAVE_BEFORE_QUIT, + PM_SAVE_BEFORE_QUIT2, + PM_QUIT +}; void window_dispatch_update_all(); void window_update_all(); diff --git a/src/window_save_prompt.c b/src/window_save_prompt.c index 544088244a..0501ae53c2 100644 --- a/src/window_save_prompt.c +++ b/src/window_save_prompt.c @@ -39,9 +39,9 @@ enum WINDOW_SAVE_PROMPT_WIDGET_IDX { }; static rct_widget window_save_prompt_widgets[] = { - { WWT_FRAME, 0, 0, 259, 0, 49, -1, STR_NONE }, // panel / background + { WWT_FRAME, 0, 0, 259, 0, 49, STR_NONE, STR_NONE }, // panel / background { WWT_CAPTION, 0, 1, 258, 1, 14, 0, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 247, 257, 2, 13, 824, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_CLOSEBOX, 0, 247, 257, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button { WWT_12, 0, 2, 257, 19, 30, 0, STR_NONE }, // question/label { WWT_DROPDOWN_BUTTON, 0, 8, 85, 35, 46, STR_SAVE_PROMPT_SAVE, STR_NONE }, // save { WWT_DROPDOWN_BUTTON, 0, 91, 168, 35, 46, STR_SAVE_PROMPT_DONT_SAVE, STR_NONE }, // don't save @@ -49,6 +49,23 @@ static rct_widget window_save_prompt_widgets[] = { { WIDGETS_END }, }; +enum WINDOW_QUIT_PROMPT_WIDGET_IDX { + WQIDX_BACKGROUND, + WQIDX_TITLE, + WQIDX_CLOSE, + WQIDX_OK, + WQIDX_CANCEL +}; + +static rct_widget window_quit_prompt_widgets[] = { + { WWT_FRAME, 0, 0, 176, 0, 33, STR_NONE, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 175, 1, 14, STR_QUIT_GAME, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 164, 174, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WWT_DROPDOWN_BUTTON, 0, 8, 85, 19, 30, STR_OK, STR_NONE }, // ok + { WWT_DROPDOWN_BUTTON, 0, 91, 168, 19, 30, STR_CANCEL, STR_NONE }, // cancel + { WIDGETS_END }, +}; + static void window_save_prompt_emptysub() { } static void window_save_prompt_close(); static void window_save_prompt_mouseup(); @@ -91,28 +108,48 @@ static void* window_save_prompt_events[] = { */ void window_save_prompt_open() { - int stringId; + int stringId, x, y; rct_window* window; + unsigned short prompt_mode; + rct_widget *widgets; + uint64 enabled_widgets; + + prompt_mode = RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16); // Check if window is already open window = window_bring_to_front_by_id(WC_SAVE_PROMPT, 0); if (window == NULL) { + if (prompt_mode == PM_QUIT) { + widgets = window_quit_prompt_widgets; + enabled_widgets = + (1 << WQIDX_CLOSE) | + (1 << WQIDX_OK) | + (1 << WQIDX_CANCEL); + x = 177; + y = 34; + } else { + widgets = window_save_prompt_widgets; + enabled_widgets = + (1 << WIDX_CLOSE) | + (1 << WIDX_SAVE) | + (1 << WIDX_DONT_SAVE) | + (1 << WIDX_CANCEL); + x = 260; + y = 50; + } + window = window_create( - (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2) - 130, - max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - 25), - 260, - 50, + (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2) - x/2, + max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - y/2), + x, + y, (uint32*)window_save_prompt_events, WC_SAVE_PROMPT, 0 ); - window->widgets = window_save_prompt_widgets; - window->enabled_widgets = - (1 << WIDX_CLOSE) | - (1 << WIDX_SAVE) | - (1 << WIDX_DONT_SAVE) | - (1 << WIDX_CANCEL); + window->widgets = widgets; + window->enabled_widgets = enabled_widgets; window_init_scroll_widgets(window); window->colours[0] = 154; window->flags |= WF_TRANSPARENT; @@ -123,14 +160,111 @@ void window_save_prompt_open() window_invalidate_by_id(0x80 | WC_TOP_TOOLBAR, 0); } - stringId = RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) + STR_LOAD_GAME; + stringId = prompt_mode + STR_LOAD_GAME; if (stringId == STR_LOAD_GAME && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) stringId = STR_LOAD_LANDSCAPE; if (stringId == STR_QUIT_GAME && RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) stringId = STR_QUIT_SCENARIO_EDITOR; window_save_prompt_widgets[WIDX_TITLE].image = stringId; - window_save_prompt_widgets[WIDX_LABEL].image = - RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16) + STR_SAVE_BEFORE_LOADING; + window_save_prompt_widgets[WIDX_LABEL].image = prompt_mode + STR_SAVE_BEFORE_LOADING; + + /* the following doesn't make sense here, + * game_load_or_quit_no_save_prompt() will close the window immediately + * => moved to mouseup() + */ +// if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0D) { +// game_load_or_quit_no_save_prompt(); +// return; +// } +// +// if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) != 0) { +// if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) != 1) { +// RCT2_CALLPROC_EBPSAFE(0x0066EE54); +// game_load_or_quit_no_save_prompt(); +// return; +// } else { +// tutorial_stop(); +// game_load_or_quit_no_save_prompt(); +// return; +// } +// } +// +// if (RCT2_GLOBAL(0x009DEA66, uint16) < 3840) { +// game_load_or_quit_no_save_prompt(); +// return; +// } +} + +/** + * + * rct2: 0x0066DF17 + */ +static void window_save_prompt_close() +{ + // Unpause the game + RCT2_GLOBAL(0x009DEA6E, uint8) &= ~2; + unpause_sounds(); + window_invalidate_by_id(0x80 | WC_TOP_TOOLBAR, 0); +} + +/** + * + * rct2: 0x0066DDF2 + */ +static void window_save_prompt_mouseup() +{ + short widgetIndex; + rct_window *w; + short prompt_mode; + + #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 + + prompt_mode = RCT2_GLOBAL(RCT2_ADDRESS_SAVE_PROMPT_MODE, uint16); + + if (prompt_mode == PM_QUIT) { + switch (widgetIndex) { + case WQIDX_CLOSE: + window_close(w); + window_save_prompt_close(); + break; + case WQIDX_OK: + rct2_finish(); + break; + case WQIDX_CANCEL: + window_close(w); + window_save_prompt_close(); + break; + } + return; + } else { + switch (widgetIndex) { + case WIDX_SAVE: + // TODO to avoid data loss, treat SAVE as CANCEL + RCT2_ERROR("%s", "TODO\n"); + window_close(w); + window_save_prompt_close(); + return; + break; + case WIDX_DONT_SAVE: + break; + case WIDX_CLOSE: + case WIDX_CANCEL: + window_close(w); + window_save_prompt_close(); + return; + } + } + if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0D) { game_load_or_quit_no_save_prompt(); @@ -155,57 +289,6 @@ void window_save_prompt_open() } } -/** - * - * rct2: 0x0066DF17 - */ -static void window_save_prompt_close() -{ - // Unpause the game - RCT2_GLOBAL(0x009DEA6E, uint8) &= ~2; - unpause_sounds(); - window_invalidate_by_id(0x80 | WC_TOP_TOOLBAR, 0); -} - -/** - * - * rct2: 0x0066DDF2 - */ -static void window_save_prompt_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 - - - // TODO - switch (widgetIndex) { - case WIDX_CLOSE: - window_close(w); - window_save_prompt_close(); - break; - case WIDX_SAVE: - break; - case WIDX_DONT_SAVE: - break; - case WIDX_CANCEL: - window_close(w); - window_save_prompt_close(); - break; - } -} - static void window_save_prompt_paint() { rct_window *w; diff --git a/src/window_title_exit.c b/src/window_title_exit.c index 6b3db2be55..15b9137fa1 100644 --- a/src/window_title_exit.c +++ b/src/window_title_exit.c @@ -114,7 +114,7 @@ static void window_title_exit_mouseup() return; if (widgetIndex == 0) - game_do_command(0, 1, 0, 0, 5, 2, 0); + game_do_command(0, 1, 0, 0, 5, 3, 0); } /**