aboutsummaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp74
1 files changed, 40 insertions, 34 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 616d05865..1c5b065ba 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -709,7 +709,7 @@ void the_game(
server->start(port);
}
- { // Client scope
+ do{ // Client scope (breakable do-while(0))
/*
Create client
@@ -738,10 +738,9 @@ void the_game(
catch(ResolveError &e)
{
errorstream<<"Couldn't resolve address"<<std::endl;
- //return 0;
error_message = L"Couldn't resolve address";
- //gui_loadingtext->remove();
- return;
+ // Break out of client scope
+ break;
}
/*
@@ -757,11 +756,12 @@ void the_game(
Wait for server to accept connection
*/
bool could_connect = false;
+ bool connect_aborted = false;
try{
float frametime = 0.033;
- const float timeout = 10.0;
float time_counter = 0.0;
- for(;;)
+ input->clear();
+ while(device->run())
{
// Update client and server
client.step(frametime);
@@ -774,16 +774,21 @@ void the_game(
break;
}
// Break conditions
- if(client.accessDenied())
+ if(client.accessDenied()){
+ error_message = L"Access denied. Reason: "
+ +client.accessDeniedReason();
break;
- if(time_counter >= timeout)
+ }
+ if(input->wasKeyDown(EscapeKey)){
+ connect_aborted = true;
break;
+ }
// Display status
std::wostringstream ss;
- ss<<L"Connecting to server... (timeout in ";
- ss<<(int)(timeout - time_counter + 1.0);
- ss<<L" seconds)";
+ ss<<L"Connecting to server... (press Escape to cancel)\n";
+ std::wstring animation = L"/-\\|";
+ ss<<animation[(int)(time_counter/0.2)%4];
draw_load_screen(ss.str(), driver, font);
// Delay a bit
@@ -797,32 +802,23 @@ void the_game(
/*
Handle failure to connect
*/
- if(could_connect == false)
- {
- if(client.accessDenied())
- {
- error_message = L"Access denied. Reason: "
- +client.accessDeniedReason();
- errorstream<<wide_to_narrow(error_message)<<std::endl;
- }
- else
- {
- error_message = L"Connection timed out.";
- errorstream<<"Timed out."<<std::endl;
- }
- //gui_loadingtext->remove();
- return;
+ if(!could_connect){
+ if(error_message == L"" && !connect_aborted)
+ error_message = L"Connection failed";
+ // Break out of client scope
+ break;
}
/*
Wait until content has been received
*/
bool got_content = false;
+ bool content_aborted = false;
{
float frametime = 0.033;
- const float timeout = 30.0;
float time_counter = 0.0;
- for(;;)
+ input->clear();
+ while(device->run())
{
// Update client and server
client.step(frametime);
@@ -837,16 +833,18 @@ void the_game(
break;
}
// Break conditions
- if(!client.connectedAndInitialized())
+ if(!client.connectedAndInitialized()){
+ error_message = L"Client disconnected";
break;
- if(time_counter >= timeout)
+ }
+ if(input->wasKeyDown(EscapeKey)){
+ content_aborted = true;
break;
+ }
// Display status
std::wostringstream ss;
- ss<<L"Waiting content... (continuing anyway in ";
- ss<<(int)(timeout - time_counter + 1.0);
- ss<<L" seconds)\n";
+ ss<<L"Waiting content... (press Escape to cancel)\n";
ss<<(client.itemdefReceived()?L"[X]":L"[ ]");
ss<<L" Item definitions\n";
@@ -864,6 +862,13 @@ void the_game(
}
}
+ if(!got_content){
+ if(error_message == L"" && !content_aborted)
+ error_message = L"Something failed";
+ // Break out of client scope
+ break;
+ }
+
/*
After all content has been received:
Update cached textures, meshes and materials
@@ -2585,7 +2590,8 @@ void the_game(
chat_backend.addMessage(L"", L"# Disconnected.");
chat_backend.addMessage(L"", L"");
- } // Client scope (must be destructed before destructing *def and tsrc
+ // Client scope (client is destructed before destructing *def and tsrc)
+ }while(0);
delete tsrc;
delete nodedef;