diff options
author | Eugenio Favalli <elvenprogrammer@gmail.com> | 2005-09-26 17:24:37 +0000 |
---|---|---|
committer | Eugenio Favalli <elvenprogrammer@gmail.com> | 2005-09-26 17:24:37 +0000 |
commit | a0fd39a05151848bef85e18e25aa0824bc9cef93 (patch) | |
tree | 60f9ed2136268d7570b4716a318e510b2c30d2ce /src | |
parent | 1a7f56901301fb8fe08f26526f3314b0974626ca (diff) | |
download | mana-a0fd39a05151848bef85e18e25aa0824bc9cef93.tar.gz mana-a0fd39a05151848bef85e18e25aa0824bc9cef93.tar.bz2 mana-a0fd39a05151848bef85e18e25aa0824bc9cef93.tar.xz mana-a0fd39a05151848bef85e18e25aa0824bc9cef93.zip |
Added a nicer handling of when you get disconnected from the server.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/game.cpp | 8 | ||||
-rw-r--r-- | src/gui/char_select.cpp | 8 | ||||
-rw-r--r-- | src/gui/char_server.cpp | 8 | ||||
-rw-r--r-- | src/gui/gui.cpp | 2 | ||||
-rw-r--r-- | src/gui/login.cpp | 12 | ||||
-rw-r--r-- | src/gui/updatewindow.cpp | 8 | ||||
-rw-r--r-- | src/main.cpp | 66 | ||||
-rw-r--r-- | src/main.h | 22 | ||||
-rw-r--r-- | src/net/network.cpp | 13 |
10 files changed, 80 insertions, 69 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 48ab6e02..16504926 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,6 +28,8 @@ tmw_SOURCES = graphic/spriteset.cpp \ gui/confirm_dialog.h \ gui/equipmentwindow.cpp \ gui/equipmentwindow.h \ + gui/error.cpp \ + gui/error.h \ gui/focushandler.cpp \ gui/focushandler.h \ gui/gui.cpp \ diff --git a/src/game.cpp b/src/game.cpp index f2c68e24..6897c036 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -151,7 +151,7 @@ class DeathNoticeListener : public gcn::ActionListener { class ExitListener : public gcn::ActionListener { void action(const std::string &eventId) { if (eventId == "yes") { - state = EXIT; + state = EXIT_STATE; } exitConfirm = NULL; } @@ -377,7 +377,7 @@ void game() int gameTime = tick_time; - while (state != EXIT) + while (state == GAME_STATE) { // Handle all necessary game logic while (get_elapsed_time(gameTime) > 0) @@ -522,7 +522,7 @@ void do_input() // Quit by pressing Enter if the exit confirm is there if (exitConfirm) { - state = EXIT; + state = EXIT_STATE; } // Close the Browser if opened else if (helpWindow->isVisible()) @@ -826,7 +826,7 @@ void do_input() // Quit event else if (event.type == SDL_QUIT) { - state = EXIT; + state = EXIT_STATE; } // Push input to GUI when not used diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp index 0c03a6b0..fd0ccdc9 100644 --- a/src/gui/char_select.cpp +++ b/src/gui/char_select.cpp @@ -139,7 +139,7 @@ void CharSelectDialog::action(const std::string& eventId) serverCharSelect(); } else if (eventId == "cancel") { - state = EXIT; + state = EXIT_STATE; } else if (eventId == "new") { if (n_character == 0) { @@ -241,7 +241,7 @@ void CharSelectDialog::serverCharSelect() map_address = msg.readLong(); map_port = msg.readShort(); player_info = char_info[0]; - state = GAME; + state = GAME_STATE; logger->log("CharSelect: Map: %s", map_path.c_str()); logger->log("CharSelect: Server: %s:%d", iptostring(map_address), @@ -278,7 +278,7 @@ void CharSelectDialog::serverCharSelect() break; } close_session(); - state = LOGIN; + state = LOGIN_STATE; } // Todo: add other packets @@ -492,6 +492,6 @@ void charSelectInputHandler(SDL_KeyboardEvent *keyEvent) { if (keyEvent->keysym.sym == SDLK_ESCAPE) { - state = EXIT; + state = EXIT_STATE; } } diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp index 5c371469..a8f99d8f 100644 --- a/src/gui/char_server.cpp +++ b/src/gui/char_server.cpp @@ -107,7 +107,7 @@ void ServerSelectDialog::action(const std::string& eventId) server_char_server(serverList->getSelected()); } else if (eventId == "cancel") { - state = LOGIN; + state = LOGIN_STATE; } } @@ -128,14 +128,14 @@ void charServerInputHandler(SDL_KeyboardEvent *keyEvent) { if (keyEvent->keysym.sym == SDLK_ESCAPE) { - state = LOGIN; + state = LOGIN_STATE; } } void server_char_server(int serverIndex) { int ret; - state = LOGIN; + state = LOGIN_STATE; const char *ipstring = iptostring(server_info[serverIndex]->address); // Connect to char server @@ -217,7 +217,7 @@ void server_char_server(int serverIndex) msg.readByte(); // unknown } - state = CHAR_SELECT; + state = CHAR_SELECT_STATE; logger->log("CharServer: Player: %s (Packet ID: %x, Length: %d)", char_info[0]->name.c_str(), msg.getId(), msg.getLength()); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 6edcd1a4..afe2019d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -230,7 +230,7 @@ void Gui::mousePress(int mx, int my, int button) int tilex = mx / 32 + camera_x; int tiley = my / 32 + camera_y; - if (state == GAME && tiledMap->getWalk(tilex, tiley)) { + if (state == GAME_STATE && tiledMap->getWalk(tilex, tiley)) { walk(tilex, tiley, 0); player_node->setDestination(tilex, tiley); diff --git a/src/gui/login.cpp b/src/gui/login.cpp index f5dc4f1e..83a20f8b 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -240,7 +240,7 @@ void LoginDialog::action(const std::string& eventId) } else if (eventId == "cancel") { - state = EXIT; + state = EXIT_STATE; } else if (eventId == "register") { @@ -315,7 +315,7 @@ void loginInputHandler(SDL_KeyboardEvent *keyEvent) { if (keyEvent->keysym.sym == SDLK_ESCAPE) { - state = EXIT; + state = EXIT_STATE; } } @@ -329,7 +329,7 @@ int attemptLogin(const std::string& user, const std::string& pass) (short)config.getValue("port", 0)); if (ret == -1) { - state = LOGIN; + state = LOGIN_STATE; wrongLoginNotice = new OkDialog("Error", "Unable to connect to login server"); return LOGIN_NO_CONNECTION; @@ -378,7 +378,7 @@ int attemptLogin(const std::string& user, const std::string& pass) server_info[i]->port); } - state = CHAR_SERVER; + state = CHAR_SERVER_STATE; skip(msg.getLength()); ret = LOGIN_OK; @@ -409,11 +409,11 @@ int attemptLogin(const std::string& user, const std::string& pass) break; } skip(msg.getLength()); - state = LOGIN; + state = LOGIN_STATE; } else { skip(msg.getLength()); - state = LOGIN; + state = LOGIN_STATE; ret = LOGIN_UNKNOWN_ERROR; } // Todo: add other packets, also encrypted diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index 5007e5f1..9e6a1b7b 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -138,14 +138,14 @@ void UpdaterWindow::action(const std::string& eventId) // Skip the updating process if (mDownloadStatus == UPDATE_COMPLETE) { - state = EXIT; + state = EXIT_STATE; } else { mDownloadStatus = UPDATE_ERROR; } } else if (eventId == "play") { - state = LOGIN; + state = LOGIN_STATE; } } @@ -201,7 +201,7 @@ int UpdaterWindow::updateProgress(void *ptr, uw->setLabel(progressString.str().c_str()); uw->setProgress(progress); - if (state != UPDATE || uw->mDownloadStatus == UPDATE_ERROR) { + if (state != UPDATE_STATE || uw->mDownloadStatus == UPDATE_ERROR) { // If the action was canceled return an error code to stop the mThread return -1; } @@ -311,7 +311,7 @@ void updateInputHandler(SDL_KeyboardEvent *keyEvent) { if (keyEvent->keysym.sym == SDLK_ESCAPE) { - state = EXIT; + state = EXIT_STATE; } } diff --git a/src/main.cpp b/src/main.cpp index 69158784..ec33a595 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,6 +56,7 @@ #include "gui/login.h" #include "gui/ok_dialog.h" #include "gui/updatewindow.h" +#include "gui/error.h" #include "net/protocol.h" @@ -101,7 +102,7 @@ Uint32 nextFrame(Uint32 interval, void *param) class MapStartErrorListener : public gcn::ActionListener { void action(const std::string &eventId) { if (eventId == "ok") { - state = LOGIN; + state = LOGIN_STATE; } } } mapStartErrorListener; @@ -112,7 +113,7 @@ class MapStartErrorListener : public gcn::ActionListener { class InitWarningListener : public gcn::ActionListener { void action(const std::string &eventId) { if (eventId == "ok") { - state = LOGIN; + state = LOGIN_STATE; } } } initWarningListener; @@ -270,7 +271,7 @@ void init_engine() hairset = new Spriteset(hairImg, 40, 40); gui = new Gui(graphics); - state = UPDATE; /**< Initial game state */ + state = UPDATE_STATE; /**< Initial game state */ // Initialize sound engine try { @@ -384,7 +385,8 @@ int main(int argc, char *argv[]) parseOptions(argc, argv, options); - if (options.printHelp) { + if (options.printHelp) + { printHelp(); return 0; } @@ -405,27 +407,24 @@ int main(int argc, char *argv[]) SDL_Event event; - if (options.skipUpdate && state != ERROR) { - state = LOGIN; + if (options.skipUpdate && state != ERROR) + { + state = LOGIN_STATE; } unsigned int oldstate = !state; // We start with a status change. Window *currentDialog = NULL; void (*inputHandler)(SDL_KeyboardEvent*) = NULL; - Image *login_wallpaper = ResourceManager::getInstance()-> - getImage("graphics/images/login_wallpaper.png"); - if (!login_wallpaper) { - logger->error("Couldn't load login_wallpaper.png"); - } + Image *login_wallpaper = NULL; - while (state != EXIT) + while (state != EXIT_STATE) { // Handle SDL events while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: - state = EXIT; + state = EXIT_STATE; break; case SDL_KEYDOWN: @@ -437,18 +436,29 @@ int main(int argc, char *argv[]) guiInput->pushInput(event); } - + gui->logic(); + + if (!login_wallpaper) + { + login_wallpaper = ResourceManager::getInstance()-> + getImage("graphics/images/login_wallpaper.png"); + if (!login_wallpaper) + { + logger->error("Couldn't load login_wallpaper.png"); + } + } graphics->drawImage(login_wallpaper, 0, 0); gui->draw(); graphics->updateScreen(); if (state != oldstate) { - if (oldstate == UPDATE) { + if (oldstate == UPDATE_STATE) { ResourceManager::getInstance()-> searchAndAddArchives("/updates", ".zip", 0); } + oldstate = state; if (currentDialog) { @@ -456,22 +466,22 @@ int main(int argc, char *argv[]) } switch (state) { - case LOGIN: + case LOGIN_STATE: logger->log("State: LOGIN"); currentDialog = new LoginDialog(); inputHandler = loginInputHandler; break; - case CHAR_SERVER: + case CHAR_SERVER_STATE: logger->log("State: CHAR_SERVER"); currentDialog = new ServerSelectDialog(); inputHandler = charServerInputHandler; break; - case CHAR_SELECT: + case CHAR_SELECT_STATE: logger->log("State: CHAR_SELECT"); currentDialog = new CharSelectDialog(); inputHandler = charSelectInputHandler; break; - case GAME: + case GAME_STATE: sound.fadeOutMusic(1000); currentDialog = NULL; @@ -489,22 +499,28 @@ int main(int argc, char *argv[]) new OkDialog("Error", err, &mapStartErrorListener); } break; - case UPDATE: + case UPDATE_STATE: + logger->log("State: UPDATE"); sound.playMusic(TMW_DATADIR "data/music/Magick - Real.ogg"); currentDialog = new UpdaterWindow(); inputHandler = updateInputHandler; break; - case ERROR: - // Hmm, does this look like an endless loop? + case ERROR_STATE: + logger->log("State: ERROR"); + currentDialog = new ErrorDialog("You got disconnected from the server"); + inputHandler = errorInputHandler; break; default: - state = EXIT; + state = EXIT_STATE; break; } } } - - fclose(nullFile); + + if (nullFile) + { + fclose(nullFile); + } logger->log("State: EXIT"); exit_engine(); PHYSFS_deinit(); @@ -31,20 +31,16 @@ class Sound; #define TMW_DATADIR "" #endif -#ifdef ERROR -#undef ERROR -#endif - enum { - EXIT, - LOGIN, - CHAR_SERVER, - CHAR_SELECT, - CHAR_NEW, - CHAR_DEL, - GAME, - ERROR, - UPDATE + EXIT_STATE, + LOGIN_STATE, + CHAR_SERVER_STATE, + CHAR_SELECT_STATE, + CHAR_NEW_STATE, + CHAR_DEL_STATE, + GAME_STATE, + ERROR_STATE, + UPDATE_STATE }; /* length definitions for several char[]s in order diff --git a/src/net/network.cpp b/src/net/network.cpp index d5a6579b..2d48fc8c 100644 --- a/src/net/network.cpp +++ b/src/net/network.cpp @@ -30,6 +30,7 @@ #include "messagein.h" #include "../log.h" +#include "../main.h" /** Warning: buffers and other variables are shared, so there can be only one connection active at a time */ @@ -215,10 +216,8 @@ void flush() int ret = SDLNet_TCP_Recv(sock, in + in_size, buffer_size - in_size); if (ret <= 0) { - logger->log("Warning: unknown error when receiving data"); - logger->log("SDLNet_GetError(): %s", SDLNet_GetError()); - // The client disconnected, notify it somewhere - logger->error("Disconnected from server"); + logger->log("Error in SDLNet_TCP_Recv(): %s", SDLNet_GetError()); + state = ERROR_STATE; return; } else { @@ -232,10 +231,8 @@ void flush() int ret = SDLNet_TCP_Send(sock, (char*)out, out_size); if (ret < (int)out_size) { - // It is likely that the server disconnected - std::stringstream ss; - ss << "Error in SDLNet_TCP_Send(): " << SDLNet_GetError(); - logger->error(ss.str()); + logger->log("Error in SDLNet_TCP_Send(): %s", SDLNet_GetError()); + state = ERROR_STATE; return; } out_size -= ret; |