diff --git a/src/interface/window.h b/src/interface/window.h index 1077364831..fb1b613a43 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -498,6 +498,7 @@ enum { }; typedef void (*modal_callback)(int result); +typedef void (*scenarioselect_callback)(const utf8 *path); extern bool gLoadSaveTitleSequenceSave; extern modal_callback gLoadSaveCallback; @@ -585,7 +586,7 @@ void window_title_exit_open(); void window_title_options_open(); void window_title_logo_open(); void window_news_open(); -void window_scenarioselect_open(); +void window_scenarioselect_open(scenarioselect_callback callback); void window_track_list_open(ride_list_item item); void window_clear_scenery_open(); void window_land_open(); diff --git a/src/windows/server_start.c b/src/windows/server_start.c index 483db2280a..63eee8ea44 100644 --- a/src/windows/server_start.c +++ b/src/windows/server_start.c @@ -25,6 +25,7 @@ #include "../localisation/localisation.h" #include "../network/network.h" #include "../sprites.h" +#include "../title.h" #include "../util/util.h" #include "error.h" @@ -43,7 +44,8 @@ enum { WIDX_MAXPLAYERS_INCREASE, WIDX_MAXPLAYERS_DECREASE, WIDX_ADVERTISE_CHECKBOX, - WIDX_START_SERVER + WIDX_START_SERVER, + WIDX_LOAD_SERVER }; #define WW 300 @@ -60,7 +62,8 @@ static rct_widget window_server_start_widgets[] = { { WWT_DROPDOWN_BUTTON, 1, WW-18, WW-8, 68, 72, STR_NUMERIC_UP, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, WW-18, WW-8, 72, 76, STR_NUMERIC_DOWN, STR_NONE }, { WWT_CHECKBOX, 1, 6, WW-8, 85, 91, STR_ADVERTISE, STR_NONE }, // advertise checkbox - { WWT_DROPDOWN_BUTTON, 1, 6, 106, WH-6-11, WH-6, STR_START_SERVER, STR_NONE }, // start server button + { WWT_DROPDOWN_BUTTON, 1, 6, 106, WH-6-11, WH-6, STR_NEW_GAME, STR_NONE }, // start server button + { WWT_DROPDOWN_BUTTON, 1, 112, 212, WH-6-11, WH-6, STR_LOAD_GAME, STR_NONE }, { WIDGETS_END }, }; @@ -123,7 +126,8 @@ void window_server_start_open() (1 << WIDX_MAXPLAYERS_INCREASE) | (1 << WIDX_MAXPLAYERS_DECREASE) | (1 << WIDX_ADVERTISE_CHECKBOX) | - (1 << WIDX_START_SERVER) + (1 << WIDX_START_SERVER) | + (1 << WIDX_LOAD_SERVER) ); window_init_scroll_widgets(window); window->no_list_items = 0; @@ -146,6 +150,16 @@ static void window_server_start_close(rct_window *w) } +static void window_server_start_scenarioselect_callback(const utf8 *path) +{ + network_set_password(_password); + if (scenario_load_and_play_from_path(path)) { + network_begin_server(gConfigNetwork.default_port); + } else { + title_load(); + } +} + static void window_server_start_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { @@ -181,6 +195,9 @@ static void window_server_start_mouseup(rct_window *w, int widgetIndex) window_invalidate(w); break; case WIDX_START_SERVER: + window_scenarioselect_open(window_server_start_scenarioselect_callback); + break; + case WIDX_LOAD_SERVER: network_set_password(_password); window_loadsave_open(LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME | LOADSAVETYPE_NETWORK, NULL); break; diff --git a/src/windows/title_menu.c b/src/windows/title_menu.c index 246128a264..a45316b7c8 100644 --- a/src/windows/title_menu.c +++ b/src/windows/title_menu.c @@ -28,6 +28,7 @@ #include "../interface/window.h" #include "../localisation/localisation.h" #include "../sprites.h" +#include "../title.h" #include "dropdown.h" enum { @@ -131,11 +132,18 @@ void window_title_menu_open() window_init_scroll_widgets(window); } +static void window_title_menu_scenarioselect_callback(const utf8 *path) +{ + if (!scenario_load_and_play_from_path(path)) { + title_load(); + } +} + static void window_title_menu_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { case WIDX_START_NEW_GAME: - window_scenarioselect_open(); + window_scenarioselect_open(window_title_menu_scenarioselect_callback); break; case WIDX_CONTINUE_SAVED_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0); diff --git a/src/windows/title_scenarioselect.c b/src/windows/title_scenarioselect.c index 40b21a6fa4..0bbe014f1c 100644 --- a/src/windows/title_scenarioselect.c +++ b/src/windows/title_scenarioselect.c @@ -135,16 +135,20 @@ static void initialise_list_items(rct_window *w); static bool is_scenario_visible(rct_window *w, scenario_index_entry *scenario); static bool is_locking_enabled(rct_window *w); +static scenarioselect_callback _callback; + /** * * rct2: 0x006781B5 */ -void window_scenarioselect_open() +void window_scenarioselect_open(scenarioselect_callback callback) { rct_window* window; int windowWidth; int windowHeight = 334; + _callback = callback; + if (window_bring_to_front_by_class(WC_SCENARIO_SELECT) != NULL) return; @@ -275,9 +279,7 @@ static void window_scenarioselect_scrollmousedown(rct_window *w, int scrollIndex y -= 24; if (y < 0 && !listItem->scenario.is_locked) { audio_play_sound_panned(SOUND_CLICK_1, w->width / 2 + w->x, 0, 0, 0); - if (!scenario_load_and_play_from_path(listItem->scenario.scenario->path)) { - title_load(); - } + _callback(listItem->scenario.scenario->path); } break; } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 50a93c9a0e..fa4aa5491b 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -19,27 +19,28 @@ *****************************************************************************/ #include "../addresses.h" +#include "../audio/audio.h" #include "../cheats.h" #include "../config.h" #include "../editor.h" #include "../game.h" #include "../input.h" -#include "../sprites.h" -#include "../audio/audio.h" +#include "../interface/console.h" #include "../interface/screenshot.h" +#include "../interface/themes.h" +#include "../interface/viewport.h" #include "../interface/widget.h" #include "../interface/window.h" -#include "../interface/viewport.h" #include "../localisation/localisation.h" #include "../network/network.h" #include "../network/twitch.h" #include "../scenario.h" +#include "../title.h" +#include "../sprites.h" #include "../util/util.h" -#include "../world/scenery.h" #include "../world/banner.h" +#include "../world/scenery.h" #include "dropdown.h" -#include "../interface/themes.h" -#include "../interface/console.h" enum { WIDX_PAUSE, @@ -498,6 +499,13 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg } } +static void window_top_toolbar_scenarioselect_callback(const utf8 *path) +{ + if (!scenario_load_and_play_from_path(path)) { + title_load(); + } +} + /** * * rct2: 0x0066C9EA @@ -521,7 +529,7 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop switch (dropdownIndex) { case DDIDX_NEW_GAME: - window_scenarioselect_open(); + window_scenarioselect_open(window_top_toolbar_scenarioselect_callback); break; case DDIDX_LOAD_GAME: game_do_command(0, 1, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 0, 0);