diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index d2fdb6d9c2..a6886387b4 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -98,7 +98,8 @@ - + + diff --git a/src/interface/window.h b/src/interface/window.h index 7eae6f277b..080c6c201a 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -448,6 +448,7 @@ enum { WC_TITLE_COMMAND_EDITOR = 123, WC_CHAT_HOST = 124, WC_PLAYER_LIST = 125, + WC_NETWORK_STATUS = 126, // Only used for colour schemes WC_STAFF = 220, @@ -613,6 +614,7 @@ void window_sign_open(rct_windownumber number); void window_sign_small_open(rct_windownumber number); void window_cheats_open(); void window_player_list_open(); +void window_network_status_open(const char* text); void window_research_open(); void window_research_development_page_paint(rct_window *w, rct_drawpixelinfo *dpi, int baseWidgetIndex); diff --git a/src/network/network.cpp b/src/network/network.cpp index b9ecde35e1..259b6fae90 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -28,6 +28,7 @@ extern "C" { #include "../addresses.h" #include "../game.h" #include "../interface/chat.h" +#include "../interface/window.h" #include "../localisation/date.h" #include "../localisation/localisation.h" #include "../scenario.h" @@ -742,15 +743,18 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac if (offset + chunksize > chunk_buffer.size()) { chunk_buffer.resize(offset + chunksize); } + char status[256]; + sprintf(status, "Downloading map ... (%d / %d)", (offset + chunksize) / 1000, size / 1000); + window_network_status_open(status); memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); if (offset + chunksize == size) { - printf("Loading new map from network...\n"); SDL_RWops* rw = SDL_RWFromMem(&chunk_buffer[0], size); if (game_load_sv6(rw)) { game_load_init(); if (RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint8) & 1) pause_toggle(); game_command_queue.clear(); + window_network_status_open("Loaded new map from network"); } SDL_RWclose(rw); } diff --git a/src/windows/network_status.c b/src/windows/network_status.c new file mode 100644 index 0000000000..441d93ebce --- /dev/null +++ b/src/windows/network_status.c @@ -0,0 +1,144 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../interface/themes.h" +#include "../interface/widget.h" +#include "../interface/window.h" +#include "../localisation/localisation.h" +#include "../network/network.h" + +enum WINDOW_NETWORK_STATUS_WIDGET_IDX { + WIDX_BACKGROUND, + WIDX_TITLE, + WIDX_CLOSE, +}; + +static rct_widget window_network_status_widgets[] = { + { WWT_FRAME, 0, 0, 340, 0, 90, 0x0FFFFFFFF, STR_NONE }, // panel / background + { WWT_CAPTION, 0, 1, 338, 1, 14, STR_NONE, STR_WINDOW_TITLE_TIP }, // title bar + { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button + { WIDGETS_END }, +}; + +static char window_network_status_text[1024]; + +static void window_network_status_mouseup(rct_window *w, int widgetIndex); +static void window_network_status_update(rct_window *w); +static void window_network_status_invalidate(rct_window *w); +static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi); + +static rct_window_event_list window_network_status_events = { + NULL, + window_network_status_mouseup, + NULL, + NULL, + NULL, + NULL, + window_network_status_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_network_status_invalidate, + window_network_status_paint, + NULL +}; + +void window_network_status_open(const char* text) +{ + rct_window* window; + + // Check if window is already open + window = window_bring_to_front_by_class(WC_NETWORK_STATUS); + if (window != NULL) + return; + + window = window_create_centred(320, 90, &window_network_status_events, WC_NETWORK_STATUS, WF_10 | WF_TRANSPARENT); + + strncpy(window_network_status_text, text, sizeof(window_network_status_text)); + + window->widgets = window_network_status_widgets; + window->enabled_widgets = 1 << WIDX_CLOSE; + window_init_scroll_widgets(window); + window->no_list_items = 0; + window->selected_list_item = -1; + window->frame_no = 0; + window->min_width = 320; + window->min_height = 90; + window->max_width = window->min_width; + window->max_height = window->min_height; + + window->page = 0; + window->list_information_type = 0; + window->colours[0] = 7; + window->colours[1] = 7; + window->colours[2] = 7; +} + +static void window_network_status_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + } +} + +static void window_network_status_update(rct_window *w) +{ + widget_invalidate(w, WIDX_BACKGROUND); +} + +static void window_network_status_invalidate(rct_window *w) +{ + window_network_status_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_network_status_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + window_network_status_widgets[WIDX_TITLE].right = w->width - 2; + window_network_status_widgets[WIDX_CLOSE].left = w->width - 2 - 0x0B; + window_network_status_widgets[WIDX_CLOSE].right = w->width - 2 - 0x0B + 0x0A; +} + +static void window_network_status_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_FONT_SPRITE_BASE, uint16) = 224; + char buffer[sizeof(window_network_status_text) + 1]; + buffer[0] = FORMAT_BLACK; + strcpy(&buffer[1], window_network_status_text); + gfx_clip_string(buffer, 230); + int x = w->x + (w->width / 2); + int y = w->y + (w->height / 2); + x -= gfx_get_string_width(buffer) / 2; + gfx_draw_string(dpi, buffer, 0, x, y); +} diff --git a/src/windows/network.c b/src/windows/player_list.c similarity index 99% rename from src/windows/network.c rename to src/windows/player_list.c index f40367c248..f095e3df58 100644 --- a/src/windows/network.c +++ b/src/windows/player_list.c @@ -262,4 +262,4 @@ static void window_player_list_refresh_list(rct_window *w) w->selected_list_item = -1; window_invalidate(w); -} \ No newline at end of file +}