diff --git a/src/config.c b/src/config.c index 152cfb0cdc..20f6ae2b7b 100644 --- a/src/config.c +++ b/src/config.c @@ -238,6 +238,7 @@ config_property_definition _twitchDefinitions[] = { config_property_definition _networkDefinitions[] = { { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, NETWORK_DEFAULT_PORT, NULL }, + { offsetof(network_configuration, stay_connected), "stay_connected", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_section_definition _sectionDefinitions[] = { diff --git a/src/config.h b/src/config.h index 87ea0e48ba..660902b46f 100644 --- a/src/config.h +++ b/src/config.h @@ -212,6 +212,7 @@ typedef struct { typedef struct { utf8string player_name; uint32 default_port; + uint8 stay_connected; } network_configuration; typedef struct theme_window { diff --git a/src/network/network.cpp b/src/network/network.cpp index 47532eb651..304e286999 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -298,6 +298,8 @@ void Network::Close() WSACleanup(); wsa_initialized = false; } + + gfx_invalidate_screen(); } bool Network::BeginClient(const char* host, unsigned short port) @@ -467,9 +469,14 @@ void Network::UpdateClient() Close(); } ProcessGameCommandQueue(); - if (!CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + + // Check synchronisation + if (!_desynchronised && !CheckSRAND(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32), RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_SRAND_0, uint32))) { + _desynchronised = true; window_network_status_open("Network desync detected"); - Close(); + if (!gConfigNetwork.stay_connected) { + Close(); + } } } @@ -834,6 +841,7 @@ int Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pac server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); server_srand0_tick = 0; // window_network_status_open("Loaded new map from network"); + _desynchronised = false; } SDL_RWclose(rw); } diff --git a/src/network/network.h b/src/network/network.h index c7dcdeca50..a5de8b6f99 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -194,6 +194,7 @@ private: std::multiset game_command_queue; std::vector chunk_buffer; char password[33]; + bool _desynchronised; void UpdateServer(); void UpdateClient();