Remove title editor specific code from loadsave window

This involved removing any logic performed in loadsave for loading saved games and moving them to callback routines for all uses.
This commit is contained in:
Ted John 2016-11-29 18:41:54 +00:00
parent 877080f00c
commit 11a2b98e58
10 changed files with 108 additions and 90 deletions

View File

@ -68,7 +68,7 @@ uint8 * gEditorSelectedObjects[OBJECT_ENTRY_GROUP_COUNT] = {
_editorSelectedStexs,
};
void editor_convert_save_to_scenario_callback(int result);
static void editor_convert_save_to_scenario_callback(int result, const utf8 * path);
static void set_all_land_owned();
static int editor_load_landscape_from_sv4(const char *path);
static int editor_load_landscape_from_sc4(const char *path);
@ -130,12 +130,16 @@ void editor_convert_save_to_scenario()
gLoadSaveCallback = editor_convert_save_to_scenario_callback;
}
void editor_convert_save_to_scenario_callback(int result)
static void editor_convert_save_to_scenario_callback(int result, const utf8 * path)
{
if (result != MODAL_RESULT_OK) {
return;
}
if (!game_load_save_or_scenario(path)) {
return;
}
if (gParkFlags & PARK_FLAGS_NO_MONEY)
gParkFlags |= PARK_FLAGS_NO_MONEY_SCENARIO;
else

View File

@ -1099,6 +1099,27 @@ void rct2_exit()
openrct2_finish();
}
bool game_load_save_or_scenario(const utf8 * path)
{
uint32 extension = get_file_extension_type(path);
switch (extension) {
case FILE_EXTENSION_SV4:
case FILE_EXTENSION_SV6:
return game_load_save(path);
case FILE_EXTENSION_SC4:
case FILE_EXTENSION_SC6:
return scenario_load_and_play_from_path(path);
}
return false;
}
static void game_load_or_quit_no_save_prompt_callback(int result, const utf8 * path)
{
if (result == MODAL_RESULT_OK && game_load_save_or_scenario(path)) {
gFirstTimeSave = 0;
}
}
/**
*
* rct2: 0x0066DB79
@ -1113,6 +1134,7 @@ void game_load_or_quit_no_save_prompt()
load_landscape();
} else {
window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME, NULL);
gLoadSaveCallback = game_load_or_quit_no_save_prompt_callback;
}
break;
case PM_SAVE_BEFORE_QUIT:

View File

@ -186,5 +186,6 @@ void game_autosave();
void game_convert_strings_to_utf8();
void game_convert_strings_to_rct2(rct_s6_data *s6);
void game_fix_save_vars();
bool game_load_save_or_scenario(const utf8 * path);
#endif

View File

@ -45,7 +45,6 @@ char gTextBoxInput[512] = { 0 };
int gMaxTextBoxInputLength = 0;
int gTextBoxFrameNo = 0;
bool gUsingWidgetTextBox = 0;
bool gLoadSaveTitleSequenceSave = 0;
uint16 gWindowUpdateTicks;
uint8 gToolbarDirtyFlags;

View File

@ -526,10 +526,10 @@ enum GUEST_LIST_FILTER_TYPE
};
typedef void (*modal_callback)(int result);
typedef void (*loadsave_callback)(int result, const utf8 * path);
typedef void (*scenarioselect_callback)(const utf8 *path);
extern bool gLoadSaveTitleSequenceSave;
extern modal_callback gLoadSaveCallback;
extern loadsave_callback gLoadSaveCallback;
typedef void (*close_callback)();

View File

@ -122,7 +122,8 @@ void track_design_save_reset_scenery()
gfx_invalidate_screen();
}
static void track_design_save_callback(int result) {
static void track_design_save_callback(int result, const utf8 * path)
{
free(_trackDesign->track_elements);
free(_trackDesign->entrance_elements);
free(_trackDesign->scenery_elements);

View File

@ -123,7 +123,7 @@ typedef struct loadsave_list_item {
uint8 type;
} loadsave_list_item;
modal_callback gLoadSaveCallback;
loadsave_callback gLoadSaveCallback;
int _listItemsCount = 0;
loadsave_list_item *_listItems = NULL;
@ -157,7 +157,6 @@ static int window_loadsave_get_dir(utf8 *last_save, char *path, const char *subd
rct_window *window_loadsave_open(int type, char *defaultName)
{
gLoadSaveCallback = NULL;
gLoadSaveTitleSequenceSave = false;
_type = type;
_defaultName[0] = '\0';
@ -424,21 +423,6 @@ static void window_loadsave_textinput(rct_window *w, int widgetIndex, char *text
window_invalidate(w);
break;
case WIDX_NEW_FILE:
if (gLoadSaveTitleSequenceSave) {
if (filename_valid_characters(text)) {
if (!title_sequence_save_exists(gCurrentTitleSequence, text)) {
title_sequence_add_save(gCurrentTitleSequence, path, text);
}
else {
window_error_open(STR_ERROR_EXISTING_NAME, STR_NONE);
}
}
else {
window_error_open(STR_ERROR_INVALID_CHARACTERS, STR_NONE);
}
return;
}
safe_strcpy(path, _directory, sizeof(path));
safe_strcat_path(path, text, sizeof(path));
path_append_extension(path, _extension, sizeof(path));
@ -697,10 +681,10 @@ static void window_loadsave_populate_list(rct_window *w, int includeNewItem, con
}
}
static void window_loadsave_invoke_callback(int result)
static void window_loadsave_invoke_callback(int result, const utf8 * path)
{
if (gLoadSaveCallback != NULL) {
gLoadSaveCallback(result);
gLoadSaveCallback(result, path);
}
}
@ -736,38 +720,10 @@ static void window_loadsave_select(rct_window *w, const char *path)
switch (_type & 0x0F) {
case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) :
save_path(&gConfigGeneral.last_save_game_directory, path);
uint32 extension = get_file_extension_type(path);
if (gLoadSaveTitleSequenceSave) {
utf8 newName[MAX_PATH];
safe_strcpy(newName, path_get_filename(path), MAX_PATH);
if (extension != FILE_EXTENSION_SV6 && extension != FILE_EXTENSION_SC6)
path_append_extension(newName, ".sv6", sizeof(newName));
if (title_sequence_save_exists(gCurrentTitleSequence, newName)) {
set_format_arg(0, intptr_t, (intptr_t)&_listItems[w->selected_list_item].name);
window_text_input_open(w, WIDX_SCROLL, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uintptr_t)_listItems[w->selected_list_item].name, 52 - 1);
}
else {
title_sequence_add_save(gCurrentTitleSequence, path, newName);
window_close(w);
}
window_loadsave_invoke_callback(MODAL_RESULT_OK);
} else if (
(extension == FILE_EXTENSION_SV6 && game_load_save(path)) ||
(extension == FILE_EXTENSION_SC6 && scenario_load_and_play_from_path(path)) ||
(extension == FILE_EXTENSION_SV4 && game_load_save(path)) ||
(extension == FILE_EXTENSION_SC4 && scenario_load_and_play_from_path(path))
) {
safe_strcpy(gScenarioSavePath, path, MAX_PATH);
gFirstTimeSave = 0;
window_close(w);
gfx_invalidate_screen();
window_loadsave_invoke_callback(MODAL_RESULT_OK);
} else {
// Not the best message...
window_error_open(STR_LOAD_GAME, STR_FAILED_TO_LOAD_FILE_CONTAINS_INVALID_DATA);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
}
safe_strcpy(gScenarioSavePath, path, MAX_PATH);
window_close(w);
gfx_invalidate_screen();
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
break;
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) :
save_path(&gConfigGeneral.last_save_game_directory, path);
@ -782,25 +738,25 @@ static void window_loadsave_select(rct_window *w, const char *path)
window_close_by_class(WC_LOADSAVE);
gfx_invalidate_screen();
window_loadsave_invoke_callback(MODAL_RESULT_OK);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
} else {
window_error_open(STR_SAVE_GAME, STR_GAME_SAVE_FAILED);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
} else {
window_error_open(STR_SAVE_GAME, STR_GAME_SAVE_FAILED);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
break;
case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) :
save_path(&gConfigGeneral.last_save_landscape_directory, path);
if (editor_load_landscape(path)) {
gfx_invalidate_screen();
window_loadsave_invoke_callback(MODAL_RESULT_OK);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
} else {
// Not the best message...
window_error_open(STR_LOAD_LANDSCAPE, STR_FAILED_TO_LOAD_FILE_CONTAINS_INVALID_DATA);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
break;
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) :
@ -813,14 +769,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);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
} else {
window_error_open(STR_SAVE_LANDSCAPE, STR_LANDSCAPE_SAVE_FAILED);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
} else {
window_error_open(STR_SAVE_LANDSCAPE, STR_LANDSCAPE_SAVE_FAILED);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
break;
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) :
@ -840,12 +796,12 @@ 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);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
title_load();
} else {
window_error_open(STR_FILE_DIALOG_TITLE_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED);
gS6Info.editor_step = EDITOR_STEP_OBJECTIVE_SELECTION;
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
break;
}
@ -853,7 +809,7 @@ static void window_loadsave_select(rct_window *w, const char *path)
save_path(&gConfigGeneral.last_save_track_directory, path);
window_install_track_open(path);
window_close_by_class(WC_LOADSAVE);
window_loadsave_invoke_callback(MODAL_RESULT_OK);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
break;
case (LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK) :
{
@ -865,10 +821,10 @@ static void window_loadsave_select(rct_window *w, const char *path)
if (success) {
window_close_by_class(WC_LOADSAVE);
window_ride_measurements_design_cancel();
window_loadsave_invoke_callback(MODAL_RESULT_OK);
window_loadsave_invoke_callback(MODAL_RESULT_OK, path);
} else {
window_error_open(STR_FILE_DIALOG_TITLE_SAVE_TRACK, STR_TRACK_SAVE_FAILED);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL);
window_loadsave_invoke_callback(MODAL_RESULT_FAIL, path);
}
}
}

View File

@ -74,7 +74,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 void window_save_prompt_callback(int result, const utf8 * path);
static rct_window_event_list window_save_prompt_events = {
window_save_prompt_close,
@ -259,7 +259,7 @@ 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)
static void window_save_prompt_callback(int result, const utf8 * path)
{
if (result == MODAL_RESULT_OK) {
game_load_or_quit_no_save_prompt();

View File

@ -159,9 +159,9 @@ static void window_server_start_scenarioselect_callback(const utf8 *path)
}
}
static void window_server_start_loadsave_callback(int result)
static void window_server_start_loadsave_callback(int result, const utf8 * path)
{
if (result == MODAL_RESULT_OK) {
if (result == MODAL_RESULT_OK && game_load_save_or_scenario(path)) {
network_begin_server(gConfigNetwork.default_port);
}
}

View File

@ -65,6 +65,7 @@ static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_wind
static void window_title_editor_load_sequence(size_t index);
static ITitleSequencePlayer * window_title_editor_get_player();
static bool window_title_editor_check_can_edit();
static void window_title_editor_add_park_callback(int result, const utf8 * path);
static rct_window_event_list window_title_editor_events = {
window_title_editor_close,
@ -113,12 +114,12 @@ enum WINDOW_TITLE_EDITOR_WIDGET_IDX {
WIDX_TITLE_EDITOR_NEW_BUTTON,
WIDX_TITLE_EDITOR_DUPLICATE_BUTTON,
WIDX_TITLE_EDITOR_DELETE_BUTTON,
WIDX_TITLE_EDITOR_RENAME_BUTTON,
WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON,
// Saves Tab
WIDX_TITLE_EDITOR_ADD,
WIDX_TITLE_EDITOR_REMOVE,
WIDX_TITLE_EDITOR_RENAME,
WIDX_TITLE_EDITOR_RENAME_SAVE,
WIDX_TITLE_EDITOR_LOAD,
// Script Tab
@ -198,6 +199,8 @@ static TitleSequence * _editingTitleSequence = NULL;
static bool _isSequencePlaying = false;
static const utf8 * _sequenceName;
static utf8 * _renameSavePath = NULL;
static sint16 _window_title_editor_highlighted_index;
static int window_title_editor_tab_animation_loops[] = {
@ -238,11 +241,11 @@ void window_title_editor_open(int tab)
(1 << WIDX_TITLE_EDITOR_NEW_BUTTON) |
(1 << WIDX_TITLE_EDITOR_DUPLICATE_BUTTON) |
(1 << WIDX_TITLE_EDITOR_DELETE_BUTTON) |
(1 << WIDX_TITLE_EDITOR_RENAME_BUTTON) |
(1 << WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON) |
(1 << WIDX_TITLE_EDITOR_ADD) |
(1 << WIDX_TITLE_EDITOR_REMOVE) |
(1 << WIDX_TITLE_EDITOR_RENAME) |
(1 << WIDX_TITLE_EDITOR_RENAME_SAVE) |
(1 << WIDX_TITLE_EDITOR_LOAD) |
(1 << WIDX_TITLE_EDITOR_INSERT) |
@ -282,14 +285,14 @@ static void window_title_editor_close(rct_window *w)
{
// Close the related windows
window_close_by_class(WC_TITLE_COMMAND_EDITOR);
if (gLoadSaveTitleSequenceSave) {
window_close_by_class(WC_LOADSAVE);
}
FreeTitleSequence(_editingTitleSequence);
_editingTitleSequence = NULL;
_isSequencePlaying = false;
_sequenceName = NULL;
free(_renameSavePath);
_renameSavePath = NULL;
}
static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
@ -320,7 +323,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
window_title_editor_load_sequence(0);
}
break;
case WIDX_TITLE_EDITOR_RENAME_BUTTON:
case WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON:
if (window_title_editor_check_can_edit()) {
window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_editingTitleSequence->Name, 64);
}
@ -332,7 +335,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
case WIDX_TITLE_EDITOR_ADD:
if (!_isSequenceReadOnly && !_isSequencePlaying && !commandEditorOpen) {
window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME, NULL);
gLoadSaveTitleSequenceSave = true;
gLoadSaveCallback = window_title_editor_add_park_callback;
}
break;
case WIDX_TITLE_EDITOR_REMOVE:
@ -347,7 +350,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex)
}
}
break;
case WIDX_TITLE_EDITOR_RENAME:
case WIDX_TITLE_EDITOR_RENAME_SAVE:
if (window_title_editor_check_can_edit()) {
if (w->selected_list_item != -1) {
window_text_input_open(w, widgetIndex, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SAVE, STR_STRING, (uintptr_t)_editingTitleSequence->Saves[w->selected_list_item], 52 - 1);
@ -605,7 +608,7 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *
switch (widgetIndex) {
case WIDX_TITLE_EDITOR_NEW_BUTTON:
case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON:
case WIDX_TITLE_EDITOR_RENAME_BUTTON:
case WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON:
if (filename_valid_characters(text)) {
if (title_sequence_manager_get_index_for_name(text) == SIZE_MAX) {
if (widgetIndex == WIDX_TITLE_EDITOR_NEW_BUTTON) {
@ -627,7 +630,7 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char *
window_error_open(STR_ERROR_INVALID_CHARACTERS, STR_NONE);
}
break;
case WIDX_TITLE_EDITOR_RENAME:
case WIDX_TITLE_EDITOR_RENAME_SAVE:
// if (filename_valid_characters(text)) {
// if (!title_sequence_save_exists(_selectedTitleSequence, text)) {
// title_sequence_rename_save(_selectedTitleSequence, w->selected_list_item, text);
@ -664,11 +667,11 @@ static void window_title_editor_invalidate(rct_window *w)
window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_ADD].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_REMOVE].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_LOAD].type = WWT_EMPTY;
window_title_editor_widgets[WIDX_TITLE_EDITOR_INSERT].type = WWT_EMPTY;
@ -690,13 +693,13 @@ static void window_title_editor_invalidate(rct_window *w)
window_title_editor_widgets[WIDX_TITLE_EDITOR_NEW_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_DUPLICATE_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_DELETE_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_BUTTON].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE_BUTTON].type = WWT_DROPDOWN_BUTTON;
break;
case WINDOW_TITLE_EDITOR_TAB_SAVES:
window_title_editor_widgets[WIDX_TITLE_EDITOR_LIST].type = WWT_SCROLL;
window_title_editor_widgets[WIDX_TITLE_EDITOR_ADD].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_REMOVE].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_RENAME_SAVE].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_LOAD].type = WWT_DROPDOWN_BUTTON;
window_title_editor_widgets[WIDX_TITLE_EDITOR_PLAY].type = WWT_IMGBTN;
window_title_editor_widgets[WIDX_TITLE_EDITOR_STOP].type = WWT_IMGBTN;
@ -976,3 +979,35 @@ static bool window_title_editor_check_can_edit()
}
return false;
}
static bool save_filename_exists(const utf8 * filename)
{
TitleSequence * seq = _editingTitleSequence;
for (size_t i = 0; i < seq->NumSaves; i++) {
const utf8 * savePath = seq->Saves[i];
if (_stricmp(savePath, filename) == 0) {
return true;
}
}
return false;
}
static void window_title_editor_add_park_callback(int result, const utf8 * path)
{
uint32 extension = get_file_extension_type(path);
if (extension != FILE_EXTENSION_SV4 && extension != FILE_EXTENSION_SV6) {
return;
}
const utf8 * filename = path_get_filename(path);
if (save_filename_exists(filename)) {
free(_renameSavePath);
_renameSavePath = _strdup(filename);
// set_format_arg(0, intptr_t, (intptr_t)&_renameSavePath);
rct_window * w = window_find_by_class(WC_TITLE_EDITOR);
window_text_input_open(w, WIDX_TITLE_EDITOR_RENAME_SAVE, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_ERROR_EXISTING_NAME, STR_STRING, (uintptr_t)_renameSavePath, 52 - 1);
return;
}
// title_sequence_add_save(gCurrentTitleSequence, path, newName);
}