diff options
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 129 |
1 files changed, 78 insertions, 51 deletions
diff --git a/src/main.cpp b/src/main.cpp index 7633df71..408b67b1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,7 +71,6 @@ SERVER_INFO *server_info; PLAYER_INFO *char_info = new PLAYER_INFO; Spriteset *hairset = NULL, *playerset = NULL; -Image *login_wallpaper = NULL; Graphics *graphics; std::string username; @@ -264,14 +263,11 @@ void init_engine() // Initialize for drawing graphics->_beginDraw(); - login_wallpaper = resman->getImage( - "graphics/images/login_wallpaper.png"); Image *playerImg = resman->getImage( "graphics/sprites/player_male_base.png"); Image *hairImg = resman->getImage( "graphics/sprites/player_male_hair.png"); - if (!login_wallpaper) logger->error("Couldn't load login_wallpaper.png"); if (!playerImg) logger->error("Couldn't load player_male_base.png"); if (!hairImg) logger->error("Couldn't load player_male_hair.png"); @@ -393,8 +389,6 @@ int main(int argc, char *argv[]) return 0; } - UpdaterWindow *uw; - // Initialize libxml2 and check for potential ABI mismatches between // compiled version and the shared library actually used. xmlInitParser(); @@ -415,6 +409,16 @@ int main(int argc, char *argv[]) state = LOGIN; } + 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"); + } + while (state != EXIT) { // Handle SDL events @@ -423,60 +427,83 @@ int main(int argc, char *argv[]) case SDL_QUIT: state = EXIT; break; + + case SDL_KEYDOWN: + if (inputHandler) { + inputHandler(&event.key); + } + break; } guiInput->pushInput(event); } - switch (state) { - case LOGIN: - logger->log("State: LOGIN"); - login(); - break; - case CHAR_SERVER: - logger->log("State: CHAR_SERVER"); - char_server(); - break; - case CHAR_SELECT: - logger->log("State: CHAR_SELECT"); - charSelect(); - break; - case GAME: - sound.fadeOutMusic(1000); - - login_wallpaper->decRef(); - login_wallpaper = NULL; - - logger->log("State: GAME"); - try { - map_start(); - game(); - } - catch (const char* err) { - state = ERROR; - new OkDialog("Error", err, &mapStartErrorListener); - } - break; - case ERROR: - // Redraw GUI - graphics->drawImage(login_wallpaper, 0 ,0); - gui->logic(); - gui->draw(); - graphics->updateScreen(); - break; - case UPDATE: - sound.playMusic(TMW_DATADIR "data/music/Magick - Real.ogg"); - uw = new UpdaterWindow(); - uw->updateData(); - delete uw; + gui->logic(); + + graphics->drawImage(login_wallpaper, 0, 0); + gui->draw(); + graphics->updateScreen(); + + if (state != oldstate) { + if (oldstate == UPDATE) { ResourceManager::getInstance()-> searchAndAddArchives("/updates", ".zip", 0); - break; - default: - state = EXIT; - break; + } + oldstate = state; + + if (currentDialog) { + delete currentDialog; + } + + switch (state) { + case LOGIN: + logger->log("State: LOGIN"); + currentDialog = new LoginDialog(); + inputHandler = loginInputHandler; + break; + case CHAR_SERVER: + logger->log("State: CHAR_SERVER"); + currentDialog = new ServerSelectDialog(); + inputHandler = charServerInputHandler; + break; + case CHAR_SELECT: + logger->log("State: CHAR_SELECT"); + currentDialog = new CharSelectDialog(); + inputHandler = charSelectInputHandler; + break; + case GAME: + sound.fadeOutMusic(1000); + + currentDialog = NULL; + inputHandler = NULL; + login_wallpaper->decRef(); + login_wallpaper = NULL; + + logger->log("State: GAME"); + try { + map_start(); + game(); + } + catch (const char* err) { + state = ERROR; + new OkDialog("Error", err, &mapStartErrorListener); + } + break; + case 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? + break; + default: + state = EXIT; + break; + } } } + logger->log("State: EXIT"); exit_engine(); PHYSFS_deinit(); |