mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-16 11:33:03 +01:00
fix #1144
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user