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
+}