From 45bfdad4e3b0beeaee20cd2c5f61f703d49fb718 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 2 Nov 2015 20:43:55 +0000 Subject: [PATCH] fix #1144 --- src/interface/window.h | 10 +++++++++- src/windows/loadsave.c | 25 +++++++++++++++++++++++++ src/windows/save_prompt.c | 14 +++++++++----- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/interface/window.h b/src/interface/window.h index 3df13ba0a4..e37b9244c6 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -485,8 +485,16 @@ enum { LOADSAVETYPE_NETWORK = 1 << 4, }; -extern bool gLoadSaveTitleSequenceSave; +enum { + MODAL_RESULT_FAIL = -1, + MODAL_RESULT_CANCEL, + MODAL_RESULT_OK +}; +typedef void (*modal_callback)(int result); + +extern bool gLoadSaveTitleSequenceSave; +extern modal_callback gLoadSaveCallback; // rct2: 0x01420078 extern rct_window* g_window_list; diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index cf57c1442a..41d8e81932 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -124,6 +124,8 @@ typedef struct { uint8 type; } loadsave_list_item; +modal_callback gLoadSaveCallback; + int _listItemsCount = 0; loadsave_list_item *_listItems = NULL; char _directory[MAX_PATH]; @@ -145,6 +147,7 @@ static rct_window *window_overwrite_prompt_open(const char *name, const char *pa rct_window *window_loadsave_open(int type, char *defaultName) { + gLoadSaveCallback = NULL; gLoadSaveTitleSequenceSave = false; char path[MAX_PATH], *ch; int includeNewItem; @@ -731,6 +734,13 @@ static void window_loadsave_populate_list(int includeNewItem, bool browsable, co window_loadsave_sort_list(sortStartIndex, _listItemsCount - 1); } +static void window_loadsave_invoke_callback(int result) +{ + if (gLoadSaveCallback != NULL) { + gLoadSaveCallback(result); + } +} + static void window_loadsave_select(rct_window *w, const char *path) { SDL_RWops* rw; @@ -750,6 +760,7 @@ static void window_loadsave_select(rct_window *w, const char *path) title_sequence_add_save(gCurrentTitleSequence, path, newName); window_close(w); } + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else if (game_load_save(path)) { if (_loadsaveType & LOADSAVETYPE_NETWORK) { @@ -762,11 +773,13 @@ static void window_loadsave_select(rct_window *w, const char *path) window_close(w); gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); rct2_endupdate(); } else { // 1050, not the best message... window_error_open(STR_LOAD_GAME, 1050); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : @@ -783,22 +796,28 @@ static void window_loadsave_select(rct_window *w, const char *path) window_close_by_class(WC_LOADSAVE); game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); + + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_GAME, 1047); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_GAME, 1047); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) : editor_load_landscape(path); if (1) { gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); rct2_endupdate(); } else { // 1050, not the best message... window_error_open(STR_LOAD_LANDSCAPE, 1050); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : @@ -810,11 +829,14 @@ static void window_loadsave_select(rct_window *w, const char *path) if (success) { window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); + window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : @@ -834,16 +856,19 @@ static void window_loadsave_select(rct_window *w, const char *path) if (success) { window_close_by_class(WC_LOADSAVE); + window_loadsave_invoke_callback(MODAL_RESULT_OK); title_load(); } else { window_error_open(STR_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; + window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; } case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : window_install_track_open(path); window_close_by_class(WC_LOADSAVE); + window_loadsave_invoke_callback(MODAL_RESULT_OK); break; } } diff --git a/src/windows/save_prompt.c b/src/windows/save_prompt.c index 020630df44..0321e20a66 100644 --- a/src/windows/save_prompt.c +++ b/src/windows/save_prompt.c @@ -72,6 +72,7 @@ static void window_save_prompt_close(rct_window *w); static void window_save_prompt_mouseup(rct_window *w, int widgetIndex); static void window_save_prompt_invalidate(rct_window *w); static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi); +static void window_save_prompt_callback(int result); static rct_window_event_list window_save_prompt_events = { window_save_prompt_close, @@ -237,6 +238,7 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) case WIDX_SAVE: save_game_as(); window_close(w); + gLoadSaveCallback = window_save_prompt_callback; break; case WIDX_DONT_SAVE: game_load_or_quit_no_save_prompt(); @@ -259,11 +261,6 @@ static void window_save_prompt_mouseup(rct_window *w, int widgetIndex) return; } } - - if (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_AGE, uint16) < 3840) { - game_load_or_quit_no_save_prompt(); - return; - } } static void window_save_prompt_invalidate(rct_window *w) @@ -274,4 +271,11 @@ static void window_save_prompt_invalidate(rct_window *w) static void window_save_prompt_paint(rct_window *w, rct_drawpixelinfo *dpi) { window_draw_widgets(w, dpi); +} + +static void window_save_prompt_callback(int result) +{ + if (result == MODAL_RESULT_OK) { + game_load_or_quit_no_save_prompt(); + } } \ No newline at end of file