diff options
Diffstat (limited to 'src/client.cpp')
-rw-r--r-- | src/client.cpp | 950 |
1 files changed, 485 insertions, 465 deletions
diff --git a/src/client.cpp b/src/client.cpp index f0254d50..7c8763a1 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -29,6 +29,7 @@ #include "game.h" #include "itemshortcut.h" #include "keyboardconfig.h" +#include "log.h" #include "playerrelations.h" #include "sound.h" @@ -87,6 +88,8 @@ #include <sys/stat.h> #include <cassert> +#include <guichan/exception.hpp> + // TODO: Get rid of these globals std::string errorMessage; LoginData loginData; @@ -94,7 +97,6 @@ LoginData loginData; Config config; /**< Global settings (config.xml) */ Configuration branding; /**< XML branding information reader */ Configuration paths; /**< XML default paths information reader */ -Logger *logger; /**< Log object */ ChatLogger *chatLogger; /**< Chat log object */ KeyboardConfig keyboard; @@ -113,7 +115,7 @@ volatile int frame_count = 0; /**< Counts the frames during one second */ * Updates fps. * Called every seconds by SDL_AddTimer() */ -Uint32 nextSecond(Uint32 interval, void *param) +static Uint32 nextSecond(Uint32 interval, void *param) { fps = frame_count; frame_count = 0; @@ -174,8 +176,6 @@ Client::Client(const Options &options): assert(!mInstance); mInstance = this; - logger = new Logger; - // Set default values for configuration files branding.setDefaultValues(getBrandingDefaults()); paths.setDefaultValues(getPathsDefaults()); @@ -190,19 +190,18 @@ Client::Client(const Options &options): initHomeDir(); initConfiguration(); + // Configure logger + Log::init(); + Log::setLogFile(mLocalDataDir + "/mana.log"); + Log::setLogToStandardOut(config.logToStandardOut); + Log::info("%s", FULL_VERSION); + chatLogger = new ChatLogger; if (options.chatLogDir.empty()) chatLogger->setLogDir(mLocalDataDir + "/logs/"); else chatLogger->setLogDir(options.chatLogDir); - // Configure logger - logger->setLogFile(mLocalDataDir + "/mana.log"); - logger->setLogToStandardOut(config.logToStandardOut); - - // Log the mana version - logger->log("%s", FULL_VERSION); - initScreenshotDir(); #if SDL_VERSION_ATLEAST(2, 24, 0) @@ -210,10 +209,10 @@ Client::Client(const Options &options): #endif // Initialize SDL - logger->log("Initializing SDL..."); + Log::info("Initializing SDL..."); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { - logger->error(strprintf("Could not initialize SDL: %s", + Log::critical(strprintf("Could not initialize SDL: %s", SDL_GetError())); } atexit(SDL_Quit); @@ -222,7 +221,7 @@ Client::Client(const Options &options): if (!FS::setWriteDir(mLocalDataDir)) { - logger->error(strprintf("%s couldn't be set as write directory! " + Log::critical(strprintf("%s couldn't be set as write directory! " "Exiting.", mLocalDataDir.c_str())); } @@ -285,7 +284,7 @@ Client::Client(const Options &options): iconFile += ".png"; #endif iconFile = ResourceManager::getPath(iconFile); - logger->log("Loading icon from file: %s", iconFile.c_str()); + Log::info("Loading icon from file: %s", iconFile.c_str()); #ifdef _WIN32 static SDL_SysWMinfo pInfo; SDL_GetWindowWMInfo(mVideo.window(), &pInfo); @@ -327,7 +326,7 @@ Client::Client(const Options &options): { mState = STATE_ERROR; errorMessage = err; - logger->log("Warning: %s", err); + Log::warn("%s", err); } // Initialize keyboard @@ -423,15 +422,13 @@ Client::~Client() SDL_FreeSurface(mIcon); - logger->log("Quitting"); + Log::info("Quitting"); delete userPalette; XML::Writer writer(mConfigDir + "/config.xml"); if (writer.isValid()) serialize(writer, config); - delete logger; - mInstance = nullptr; } @@ -441,506 +438,533 @@ int Client::exec() while (mState != STATE_EXIT) { - Time::beginFrame(); - - if (mGame) + // Handle SDL events + SDL_Event event; + while (SDL_PollEvent(&event)) { - // Let the game handle the events while it is active - mGame->handleInput(); - } - else - { - // Handle SDL events - SDL_Event event; - while (SDL_PollEvent(&event)) + switch (event.type) { - switch (event.type) - { - case SDL_QUIT: - mState = STATE_EXIT; - break; - - case SDL_WINDOWEVENT: - switch (event.window.event) { - case SDL_WINDOWEVENT_SIZE_CHANGED: - handleWindowSizeChanged(event.window.data1, - event.window.data2); - break; - } + case SDL_QUIT: + mState = STATE_EXIT; + break; + + case SDL_WINDOWEVENT: + switch (event.window.event) { + case SDL_WINDOWEVENT_SIZE_CHANGED: + handleWindowSizeChanged(event.window.data1, + event.window.data2); break; + } + break; - case SDL_KEYDOWN: - if (keyboard.isEnabled()) + case SDL_KEYDOWN: + if (keyboard.isEnabled()) + { + const int tKey = keyboard.getKeyIndex(event.key.keysym.sym); + if (tKey == KeyboardConfig::KEY_WINDOW_SETUP) { - const int tKey = keyboard.getKeyIndex(event.key.keysym.sym); - if (tKey == KeyboardConfig::KEY_WINDOW_SETUP) - { - setupWindow->setVisible(!setupWindow->isVisible()); - if (setupWindow->isVisible()) - setupWindow->requestMoveToTop(); - continue; - } + setupWindow->setVisible(!setupWindow->isVisible()); + if (setupWindow->isVisible()) + setupWindow->requestMoveToTop(); + continue; } - break; } - guiInput->pushInput(event); - } - } - - if (Net::getGeneralHandler()) - Net::getGeneralHandler()->flushNetwork(); - - gui->logic(); - if (mGame) - mGame->logic(); - - sound.logic(); - - // Update the screen when application is active, delay otherwise. - if (isActive()) - { - frame_count++; - gui->draw(); - graphics->updateScreen(); - mFpsManager.limitFps(config.fpsLimit); - } - else - { - mFpsManager.limitFps(10); - } - - // TODO: Add connect timeouts - if (mState == STATE_CONNECT_GAME && - Net::getGameHandler()->isConnected()) - { - Net::getLoginHandler()->disconnect(); - } - else if (mState == STATE_CONNECT_SERVER && - mOldState == STATE_CONNECT_SERVER && - Net::getLoginHandler()->isConnected()) - { - mState = STATE_LOGIN; - } - else if (mState == STATE_WORLD_SELECT && mOldState == STATE_UPDATE) - { - if (Net::getLoginHandler()->getWorlds().size() < 2) - { - mState = STATE_LOGIN; - } - } - else if (mOldState == STATE_START || - (mOldState == STATE_GAME && mState != STATE_GAME)) - { - auto *top = static_cast<gcn::Container*>(gui->getTop()); - - mDesktop = new Desktop; - top->add(mDesktop); - mSetupButton = new Button("", "Setup", this); - mSetupButton->setButtonPopupText(_("Setup")); - mSetupButton->setButtonIcon("button-icon-setup.png"); - mSetupButton->setPosition(top->getWidth() - mSetupButton->getWidth() - - 3, 3); - top->add(mSetupButton); - - mDesktop->setSize(graphics->getWidth(), graphics->getHeight()); - } + if (setupWindow->isVisible() && + keyboard.getNewKeyIndex() > KeyboardConfig::KEY_NO_VALUE) + { + keyboard.setNewKey(event.key.keysym.sym); + keyboard.callbackNewKey(); + keyboard.setNewKeyIndex(KeyboardConfig::KEY_NO_VALUE); + continue; + } - if (mState == STATE_SWITCH_LOGIN && mOldState == STATE_GAME) - { - Net::getGameHandler()->disconnect(); - } + // Check whether the game will handle the event + if (mGame && mGame->keyDownEvent(event.key)) + continue; - if (mState != mOldState) - { - { - Event event(Event::StateChange); - event.setInt("oldState", mOldState); - event.setInt("newState", mState); - event.trigger(Event::ClientChannel); + break; } - if (mOldState == STATE_GAME) + // Push input to GUI when not used + try { - delete mGame; - mGame = nullptr; + guiInput->pushInput(event); } - - mOldState = mState; - - // Get rid of the dialog of the previous state - if (mCurrentDialog) + catch (gcn::Exception e) { - delete mCurrentDialog; - mCurrentDialog = nullptr; + const char *err = e.getMessage().c_str(); + Log::warn("Guichan input exception: %s", err); } - // State has changed, while the quitDialog was active, it might - // not be correct anymore - if (mQuitDialog) - mQuitDialog->scheduleDelete(); + } - switch (mState) - { - case STATE_CHOOSE_SERVER: - logger->log("State: CHOOSE SERVER"); + update(); + } - // Don't allow an alpha opacity - // lower than the default value - gui->getTheme()->setMinimumOpacity(0.8f); + Net::unload(); - mCurrentDialog = new ServerDialog(&mCurrentServer, - mConfigDir); - break; + return 0; +} - case STATE_CONNECT_SERVER: - logger->log("State: CONNECT SERVER"); +void Client::update() +{ + Time::beginFrame(); - Net::connectToServer(mCurrentServer); + mVideo.updateWindowSize(); + checkGraphicsSize(); - mCurrentDialog = new ConnectionDialog( - _("Connecting to server"), STATE_SWITCH_SERVER); - break; + // Let the game handle continuous input while it is active + if (mGame) + mGame->handleInput(); - case STATE_LOGIN: - logger->log("State: LOGIN"); - // Don't allow an alpha opacity - // lower than the default value - gui->getTheme()->setMinimumOpacity(0.8f); + if (Net::getGeneralHandler()) + Net::getGeneralHandler()->flushNetwork(); - if (mOptions.username.empty() || mOptions.password.empty()) - { - mCurrentDialog = new LoginDialog(&loginData); - } - else - { - mState = STATE_LOGIN_ATTEMPT; - // Clear the password so that when login fails, the - // dialog will show up next time. - mOptions.password.clear(); - } - break; + gui->logic(); + if (mGame) + mGame->logic(); - case STATE_LOGIN_ATTEMPT: - logger->log("State: LOGIN ATTEMPT"); - accountLogin(&loginData); - mCurrentDialog = new ConnectionDialog( - _("Logging in"), STATE_SWITCH_SERVER); - break; + sound.logic(); - case STATE_WORLD_SELECT: - logger->log("State: WORLD SELECT"); - { - Worlds worlds = Net::getLoginHandler()->getWorlds(); - - if (worlds.empty()) - { - // Trust that the netcode knows what it's doing - mState = STATE_UPDATE; - } - else if (worlds.size() == 1 || mOptions.chooseDefault) - { - Net::getLoginHandler()->chooseServer(0); - mState = STATE_UPDATE; - } - else - { - mCurrentDialog = new WorldSelectDialog(std::move(worlds)); - } - } - break; + // Update the screen when application is active, delay otherwise. + if (isActive()) + { + frame_count++; + gui->draw(); + graphics->updateScreen(); + mFpsManager.limitFps(config.fpsLimit); + } + else + { + mFpsManager.limitFps(10); + } - case STATE_WORLD_SELECT_ATTEMPT: - logger->log("State: WORLD SELECT ATTEMPT"); - mCurrentDialog = new ConnectionDialog( - _("Entering game world"), STATE_WORLD_SELECT); - break; + // TODO: Add connect timeouts + if (mState == STATE_CONNECT_GAME && + Net::getGameHandler()->isConnected()) + { + Net::getLoginHandler()->disconnect(); + } + else if (mState == STATE_CONNECT_SERVER && + mOldState == STATE_CONNECT_SERVER && + Net::getLoginHandler()->isConnected()) + { + mState = STATE_LOGIN; + } + else if (mState == STATE_WORLD_SELECT && mOldState == STATE_UPDATE) + { + if (Net::getLoginHandler()->getWorlds().size() < 2) + { + mState = STATE_LOGIN; + } + } + else if (mOldState == STATE_START || + (mOldState == STATE_GAME && mState != STATE_GAME)) + { + auto *top = static_cast<gcn::Container*>(gui->getTop()); + + mDesktop = new Desktop; + top->add(mDesktop); + mSetupButton = new Button("", "Setup", this); + mSetupButton->setButtonPopupText(_("Setup")); + mSetupButton->setButtonIcon("button-icon-setup.png"); + mSetupButton->setPosition(top->getWidth() - mSetupButton->getWidth() + - 3, 3); + top->add(mSetupButton); + + mDesktop->setSize(graphics->getWidth(), graphics->getHeight()); + } - case STATE_UPDATE: - logger->log("State: UPDATE"); + if (mState == STATE_SWITCH_LOGIN && mOldState == STATE_GAME) + { + Net::getGameHandler()->disconnect(); + } - if (mOptions.skipUpdate) - { - mState = STATE_LOAD_DATA; - } - else if (initUpdatesDir()) - { - mCurrentDialog = new UpdaterWindow(mUpdateHost, - mLocalDataDir + "/" + mUpdatesDir, - mOptions.dataPath.empty()); - } - break; + if (mState != mOldState) + { + { + Event event(Event::StateChange); + event.setInt("oldState", mOldState); + event.setInt("newState", mState); + event.trigger(Event::ClientChannel); + } - case STATE_LOAD_DATA: - logger->log("State: LOAD DATA"); + if (mOldState == STATE_GAME) + { + delete mGame; + mGame = nullptr; + } - // If another data path has been set, - // we don't load any other files... - if (mOptions.dataPath.empty()) - { - // Add customdata directory - ResourceManager::searchAndAddArchives( - "customdata/", - "zip", - false); - } + mOldState = mState; - // TODO remove this as soon as inventoryhandler stops using this event - Event::trigger(Event::ClientChannel, Event::LoadingDatabases); + // Get rid of the dialog of the previous state + if (mCurrentDialog) + { + delete mCurrentDialog; + mCurrentDialog = nullptr; + } + // State has changed, while the quitDialog was active, it might + // not be correct anymore + if (mQuitDialog) + mQuitDialog->scheduleDelete(); - // Load XML databases - CharDB::load(); + switch (mState) + { + case STATE_CHOOSE_SERVER: + Log::info("State: CHOOSE SERVER"); - delete itemDb; + // Don't allow an alpha opacity + // lower than the default value + gui->getTheme()->setMinimumOpacity(0.8f); - switch (Net::getNetworkType()) - { - case ServerType::TmwAthena: - itemDb = new TmwAthena::TaItemDB; - break; - case ServerType::ManaServ: - itemDb = new ManaServ::ManaServItemDB; - break; - default: - // Nothing - itemDb = nullptr; - break; - } - assert(itemDb); + mCurrentDialog = new ServerDialog(&mCurrentServer, + mConfigDir); + break; - // load settings.xml - SettingsManager::load(); + case STATE_CONNECT_SERVER: + Log::info("State: CONNECT SERVER"); - ActorSprite::load(); + Net::connectToServer(mCurrentServer); - mDesktop->reloadWallpaper(); + mCurrentDialog = new ConnectionDialog( + _("Connecting to server"), STATE_SWITCH_SERVER); + break; - mState = STATE_GET_CHARACTERS; - break; + case STATE_LOGIN: + Log::info("State: LOGIN"); + // Don't allow an alpha opacity + // lower than the default value + gui->getTheme()->setMinimumOpacity(0.8f); - case STATE_GET_CHARACTERS: - logger->log("State: GET CHARACTERS"); - Net::getCharHandler()->requestCharacters(); - mCurrentDialog = new ConnectionDialog( - _("Requesting characters"), - STATE_SWITCH_SERVER); - break; + if (mOptions.username.empty() || mOptions.password.empty()) + { + mCurrentDialog = new LoginDialog(&loginData); + } + else + { + mState = STATE_LOGIN_ATTEMPT; + // Clear the password so that when login fails, the + // dialog will show up next time. + mOptions.password.clear(); + } + break; - case STATE_CHAR_SELECT: - logger->log("State: CHAR SELECT"); - // Don't allow an alpha opacity - // lower than the default value - gui->getTheme()->setMinimumOpacity(0.8f); + case STATE_LOGIN_ATTEMPT: + Log::info("State: LOGIN ATTEMPT"); + accountLogin(&loginData); + mCurrentDialog = new ConnectionDialog( + _("Logging in"), STATE_SWITCH_SERVER); + break; - mCurrentDialog = new CharSelectDialog(&loginData); + case STATE_WORLD_SELECT: + Log::info("State: WORLD SELECT"); + { + Worlds worlds = Net::getLoginHandler()->getWorlds(); - if (!((CharSelectDialog*) mCurrentDialog)->selectByName( - mOptions.character, CharSelectDialog::Choose)) + if (worlds.empty()) { - ((CharSelectDialog*) mCurrentDialog)->selectByName( - config.lastCharacter, - mOptions.chooseDefault ? - CharSelectDialog::Choose : - CharSelectDialog::Focus); + // Trust that the netcode knows what it's doing + mState = STATE_UPDATE; } + else if (worlds.size() == 1 || mOptions.chooseDefault) + { + Net::getLoginHandler()->chooseServer(0); + mState = STATE_UPDATE; + } + else + { + mCurrentDialog = new WorldSelectDialog(std::move(worlds)); + } + } + break; - // Choosing character on the command line should work only - // once, clear it so that 'switch character' works. - mOptions.character.clear(); - mOptions.chooseDefault = false; - - break; - - case STATE_CONNECT_GAME: - logger->log("State: CONNECT GAME"); - - Net::getGameHandler()->connect(); - mCurrentDialog = new ConnectionDialog( - _("Connecting to the game server"), - Net::getNetworkType() == ServerType::TmwAthena ? - STATE_CHOOSE_SERVER : STATE_SWITCH_CHARACTER); - break; - - case STATE_CHANGE_MAP: - logger->log("State: CHANGE_MAP"); - - Net::getGameHandler()->connect(); - mCurrentDialog = new ConnectionDialog( - _("Changing game servers"), - STATE_SWITCH_CHARACTER); - break; - - case STATE_GAME: - logger->log("Memorizing selected character %s", - local_player->getName().c_str()); - config.lastCharacter = local_player->getName(); - - // Fade out logon-music here too to give the desired effect - // of "flowing" into the game. - sound.fadeOutMusic(1000); - - // Allow any alpha opacity - gui->getTheme()->setMinimumOpacity(0.0f); - - delete mSetupButton; - delete mDesktop; - mSetupButton = nullptr; - mDesktop = nullptr; - - mCurrentDialog = nullptr; - - logger->log("State: GAME"); - mGame = new Game; - break; - - case STATE_LOGIN_ERROR: - logger->log("State: LOGIN ERROR"); - showErrorDialog(errorMessage, STATE_LOGIN); - break; - - case STATE_ACCOUNTCHANGE_ERROR: - logger->log("State: ACCOUNT CHANGE ERROR"); - showErrorDialog(errorMessage, STATE_CHAR_SELECT); - break; + case STATE_WORLD_SELECT_ATTEMPT: + Log::info("State: WORLD SELECT ATTEMPT"); + mCurrentDialog = new ConnectionDialog( + _("Entering game world"), STATE_WORLD_SELECT); + break; - case STATE_REGISTER_PREP: - logger->log("State: REGISTER_PREP"); - Net::getLoginHandler()->getRegistrationDetails(); - mCurrentDialog = new ConnectionDialog( - _("Requesting registration details"), STATE_LOGIN); - break; + case STATE_UPDATE: + Log::info("State: UPDATE"); - case STATE_REGISTER: - logger->log("State: REGISTER"); - mCurrentDialog = new RegisterDialog(&loginData); - break; + if (mOptions.skipUpdate) + { + mState = STATE_LOAD_DATA; + } + else if (initUpdatesDir()) + { + mCurrentDialog = new UpdaterWindow(mUpdateHost, + mLocalDataDir + "/" + mUpdatesDir, + mOptions.dataPath.empty()); + } + break; - case STATE_REGISTER_ATTEMPT: - logger->log("Username is %s", loginData.username.c_str()); - Net::getLoginHandler()->registerAccount(&loginData); - loginData.password.clear(); - break; + case STATE_LOAD_DATA: + Log::info("State: LOAD DATA"); - case STATE_CHANGEPASSWORD: - logger->log("State: CHANGE PASSWORD"); - mCurrentDialog = new ChangePasswordDialog(&loginData); - break; + // If another data path has been set, + // we don't load any other files... + if (mOptions.dataPath.empty()) + { + // Add customdata directory + ResourceManager::searchAndAddArchives( + "customdata/", + "zip", + false); + } - case STATE_CHANGEPASSWORD_ATTEMPT: - logger->log("State: CHANGE PASSWORD ATTEMPT"); - Net::getLoginHandler()->changePassword(loginData.username, - loginData.password, - loginData.newPassword); - break; + // TODO remove this as soon as inventoryhandler stops using this event + Event::trigger(Event::ClientChannel, Event::LoadingDatabases); - case STATE_CHANGEPASSWORD_SUCCESS: - logger->log("State: CHANGE PASSWORD SUCCESS"); - showOkDialog(_("Password Change"), - _("Password changed successfully!"), - STATE_CHAR_SELECT); - loginData.password.clear(); - loginData.newPassword.clear(); - break; + // Load XML databases + CharDB::load(); - case STATE_CHANGEEMAIL: - logger->log("State: CHANGE EMAIL"); - mCurrentDialog = new ChangeEmailDialog(&loginData); - break; + delete itemDb; - case STATE_CHANGEEMAIL_ATTEMPT: - logger->log("State: CHANGE EMAIL ATTEMPT"); - Net::getLoginHandler()->changeEmail(loginData.email); - break; + switch (Net::getNetworkType()) + { + case ServerType::TmwAthena: + itemDb = new TmwAthena::TaItemDB; + break; + case ServerType::ManaServ: + itemDb = new ManaServ::ManaServItemDB; + break; + default: + // Nothing + itemDb = nullptr; + break; + } + assert(itemDb); - case STATE_CHANGEEMAIL_SUCCESS: - logger->log("State: CHANGE EMAIL SUCCESS"); - showOkDialog(_("Email Change"), - _("Email changed successfully!"), - STATE_CHAR_SELECT); - break; + // load settings.xml + SettingsManager::load(); - case STATE_UNREGISTER: - logger->log("State: UNREGISTER"); - mCurrentDialog = new UnRegisterDialog(&loginData); - break; + ActorSprite::load(); - case STATE_UNREGISTER_ATTEMPT: - logger->log("State: UNREGISTER ATTEMPT"); - Net::getLoginHandler()->unregisterAccount( - loginData.username, loginData.password); - break; + mDesktop->reloadWallpaper(); - case STATE_UNREGISTER_SUCCESS: - logger->log("State: UNREGISTER SUCCESS"); - Net::getLoginHandler()->disconnect(); + mState = STATE_GET_CHARACTERS; + break; - showOkDialog(_("Unregister Successful"), - _("Farewell, come back any time..."), - STATE_CHOOSE_SERVER); - loginData.clear(); - break; + case STATE_GET_CHARACTERS: + Log::info("State: GET CHARACTERS"); + Net::getCharHandler()->requestCharacters(); + mCurrentDialog = new ConnectionDialog( + _("Requesting characters"), + STATE_SWITCH_SERVER); + break; - case STATE_SWITCH_SERVER: - logger->log("State: SWITCH SERVER"); + case STATE_CHAR_SELECT: + Log::info("State: CHAR SELECT"); + // Don't allow an alpha opacity + // lower than the default value + gui->getTheme()->setMinimumOpacity(0.8f); - Net::getLoginHandler()->disconnect(); - Net::getGameHandler()->disconnect(); + mCurrentDialog = new CharSelectDialog(&loginData); - mCurrentServer.hostname.clear(); - mState = STATE_CHOOSE_SERVER; - break; + if (!((CharSelectDialog*) mCurrentDialog)->selectByName( + mOptions.character, CharSelectDialog::Choose)) + { + ((CharSelectDialog*) mCurrentDialog)->selectByName( + config.lastCharacter, + mOptions.chooseDefault ? + CharSelectDialog::Choose : + CharSelectDialog::Focus); + } - case STATE_SWITCH_LOGIN: - logger->log("State: SWITCH LOGIN"); + // Choosing character on the command line should work only + // once, clear it so that 'switch character' works. + mOptions.character.clear(); + mOptions.chooseDefault = false; - Net::getLoginHandler()->disconnect(); + break; - mState = STATE_CONNECT_SERVER; - break; + case STATE_CONNECT_GAME: + Log::info("State: CONNECT GAME"); - case STATE_SWITCH_CHARACTER: - logger->log("State: SWITCH CHARACTER"); + Net::getGameHandler()->connect(); + mCurrentDialog = new ConnectionDialog( + _("Connecting to the game server"), + Net::getNetworkType() == ServerType::TmwAthena ? + STATE_CHOOSE_SERVER : STATE_SWITCH_CHARACTER); + break; - // Done with game - Net::getGameHandler()->disconnect(); + case STATE_CHANGE_MAP: + Log::info("State: CHANGE_MAP"); - mState = STATE_GET_CHARACTERS; - break; + Net::getGameHandler()->connect(); + mCurrentDialog = new ConnectionDialog( + _("Changing game servers"), + STATE_SWITCH_CHARACTER); + break; - case STATE_LOGOUT_ATTEMPT: - logger->log("State: LOGOUT ATTEMPT"); - // TODO - break; + case STATE_GAME: + Log::info("Memorizing selected character %s", + local_player->getName().c_str()); + config.lastCharacter = local_player->getName(); - case STATE_WAIT: - logger->log("State: WAIT"); - break; + // Fade out logon-music here too to give the desired effect + // of "flowing" into the game. + sound.fadeOutMusic(1000); - case STATE_EXIT: - logger->log("State: EXIT"); - break; + // Allow any alpha opacity + gui->getTheme()->setMinimumOpacity(0.0f); - case STATE_FORCE_QUIT: - logger->log("State: FORCE QUIT"); - mState = STATE_EXIT; - break; + delete mSetupButton; + delete mDesktop; + mSetupButton = nullptr; + mDesktop = nullptr; - case STATE_ERROR: - logger->log("State: ERROR"); - logger->log("Error: %s", errorMessage.c_str()); - showErrorDialog(errorMessage, STATE_CHOOSE_SERVER); - Net::getGameHandler()->disconnect(); - break; + mCurrentDialog = nullptr; - default: - mState = STATE_FORCE_QUIT; - break; - } + Log::info("State: GAME"); + mGame = new Game; + break; + + case STATE_LOGIN_ERROR: + Log::info("State: LOGIN ERROR"); + showErrorDialog(errorMessage, STATE_LOGIN); + break; + + case STATE_ACCOUNTCHANGE_ERROR: + Log::info("State: ACCOUNT CHANGE ERROR"); + showErrorDialog(errorMessage, STATE_CHAR_SELECT); + break; + + case STATE_REGISTER_PREP: + Log::info("State: REGISTER_PREP"); + Net::getLoginHandler()->getRegistrationDetails(); + mCurrentDialog = new ConnectionDialog( + _("Requesting registration details"), STATE_LOGIN); + break; + + case STATE_REGISTER: + Log::info("State: REGISTER"); + mCurrentDialog = new RegisterDialog(&loginData); + break; + + case STATE_REGISTER_ATTEMPT: + Log::info("Username is %s", loginData.username.c_str()); + Net::getLoginHandler()->registerAccount(&loginData); + loginData.password.clear(); + break; + + case STATE_CHANGEPASSWORD: + Log::info("State: CHANGE PASSWORD"); + mCurrentDialog = new ChangePasswordDialog(&loginData); + break; + + case STATE_CHANGEPASSWORD_ATTEMPT: + Log::info("State: CHANGE PASSWORD ATTEMPT"); + Net::getLoginHandler()->changePassword(loginData.username, + loginData.password, + loginData.newPassword); + break; + + case STATE_CHANGEPASSWORD_SUCCESS: + Log::info("State: CHANGE PASSWORD SUCCESS"); + showOkDialog(_("Password Change"), + _("Password changed successfully!"), + STATE_CHAR_SELECT); + loginData.password.clear(); + loginData.newPassword.clear(); + break; + + case STATE_CHANGEEMAIL: + Log::info("State: CHANGE EMAIL"); + mCurrentDialog = new ChangeEmailDialog(&loginData); + break; + + case STATE_CHANGEEMAIL_ATTEMPT: + Log::info("State: CHANGE EMAIL ATTEMPT"); + Net::getLoginHandler()->changeEmail(loginData.email); + break; + + case STATE_CHANGEEMAIL_SUCCESS: + Log::info("State: CHANGE EMAIL SUCCESS"); + showOkDialog(_("Email Change"), + _("Email changed successfully!"), + STATE_CHAR_SELECT); + break; + + case STATE_UNREGISTER: + Log::info("State: UNREGISTER"); + mCurrentDialog = new UnRegisterDialog(&loginData); + break; + + case STATE_UNREGISTER_ATTEMPT: + Log::info("State: UNREGISTER ATTEMPT"); + Net::getLoginHandler()->unregisterAccount( + loginData.username, loginData.password); + break; + + case STATE_UNREGISTER_SUCCESS: + Log::info("State: UNREGISTER SUCCESS"); + Net::getLoginHandler()->disconnect(); + + showOkDialog(_("Unregister Successful"), + _("Farewell, come back any time..."), + STATE_CHOOSE_SERVER); + loginData.clear(); + break; + + case STATE_SWITCH_SERVER: + Log::info("State: SWITCH SERVER"); + + Net::getLoginHandler()->disconnect(); + Net::getGameHandler()->disconnect(); + + mCurrentServer.hostname.clear(); + mState = STATE_CHOOSE_SERVER; + break; + + case STATE_SWITCH_LOGIN: + Log::info("State: SWITCH LOGIN"); + + Net::getLoginHandler()->disconnect(); + + mState = STATE_CONNECT_SERVER; + break; + + case STATE_SWITCH_CHARACTER: + Log::info("State: SWITCH CHARACTER"); + + // Done with game + Net::getGameHandler()->disconnect(); + + mState = STATE_GET_CHARACTERS; + break; + + case STATE_LOGOUT_ATTEMPT: + Log::info("State: LOGOUT ATTEMPT"); + // TODO + break; + + case STATE_WAIT: + Log::info("State: WAIT"); + break; + + case STATE_EXIT: + Log::info("State: EXIT"); + break; + + case STATE_FORCE_QUIT: + Log::info("State: FORCE QUIT"); + mState = STATE_EXIT; + break; + + case STATE_ERROR: + Log::info("State: ERROR"); + Log::error("%s", errorMessage.c_str()); + showErrorDialog(errorMessage, STATE_CHOOSE_SERVER); + Net::getGameHandler()->disconnect(); + break; + + default: + mState = STATE_FORCE_QUIT; + break; } } - - Net::unload(); - - return 0; } void Client::showOkDialog(const std::string &title, @@ -989,7 +1013,7 @@ void Client::initRootDir() Configuration portable; portable.init(portableName); - logger->log("Portable file: %s", portableName.c_str()); + Log::info("Portable file: %s", portableName.c_str()); if (mOptions.localDataDir.empty()) { @@ -997,8 +1021,8 @@ void Client::initRootDir() if (!dir.empty()) { mOptions.localDataDir = mRootDir + dir; - logger->log("Portable data dir: %s", - mOptions.localDataDir.c_str()); + Log::info("Portable data dir: %s", + mOptions.localDataDir.c_str()); } } @@ -1008,8 +1032,8 @@ void Client::initRootDir() if (!dir.empty()) { mOptions.configDir = mRootDir + dir; - logger->log("Portable config dir: %s", - mOptions.configDir.c_str()); + Log::info("Portable config dir: %s", + mOptions.configDir.c_str()); } } @@ -1019,8 +1043,8 @@ void Client::initRootDir() if (!dir.empty()) { mOptions.screenshotDir = mRootDir + dir; - logger->log("Portable screenshot dir: %s", - mOptions.screenshotDir.c_str()); + Log::info("Portable screenshot dir: %s", + mOptions.screenshotDir.c_str()); } } } @@ -1052,7 +1076,7 @@ void Client::initHomeDir() if (mkdir_r(mLocalDataDir.c_str())) { - logger->error(strprintf(_("%s doesn't exist and can't be created! " + Log::critical(strprintf(_("%s doesn't exist and can't be created! " "Exiting."), mLocalDataDir.c_str())); } @@ -1075,7 +1099,7 @@ void Client::initHomeDir() if (mkdir_r(mConfigDir.c_str())) { - logger->error(strprintf(_("%s doesn't exist and can't be created! " + Log::critical(strprintf(_("%s doesn't exist and can't be created! " "Exiting."), mConfigDir.c_str())); } } @@ -1094,7 +1118,7 @@ void Client::initConfiguration() if (doc.rootNode() && doc.rootNode().name() == "configuration") deserialize(doc.rootNode(), config); else - logger->log("Couldn't read configuration file: %s", configPath.c_str()); + Log::info("Couldn't read configuration file: %s", configPath.c_str()); } /** @@ -1117,7 +1141,7 @@ bool Client::initUpdatesDir() if (mUpdateHost.empty()) { - logger->log("No update host provided"); + Log::info("No update host provided"); mUpdatesDir.clear(); mState = STATE_LOAD_DATA; return false; @@ -1125,8 +1149,8 @@ bool Client::initUpdatesDir() mUpdatesDir = "updates/" + getDirectoryFromURL(mUpdateHost); - logger->log("Update host: %s", mUpdateHost.c_str()); - logger->log("Updates dir: %s", mUpdatesDir.c_str()); + Log::info("Update host: %s", mUpdateHost.c_str()); + Log::info("Updates dir: %s", mUpdatesDir.c_str()); // Verify that the updates directory exists. Create if necessary. if (!FS::isDirectory(mUpdatesDir)) @@ -1146,16 +1170,16 @@ bool Client::initUpdatesDir() if (!CreateDirectory(newDir.c_str(), 0) && GetLastError() != ERROR_ALREADY_EXISTS) { - logger->log("Error: %s can't be made, but doesn't exist!", - newDir.c_str()); + Log::error("%s can't be made, but doesn't exist!", + newDir.c_str()); errorMessage = strprintf(_("Error creating updates directory!\n(%s)"), newDir.c_str()); mState = STATE_ERROR; } #else - logger->log("Error: %s/%s can't be made, but doesn't exist!", - mLocalDataDir.c_str(), mUpdatesDir.c_str()); + Log::error("%s/%s can't be made, but doesn't exist!", + mLocalDataDir.c_str(), mUpdatesDir.c_str()); errorMessage = strprintf(_("Error creating updates directory!\n(%s/%s)"), mLocalDataDir.c_str(), mUpdatesDir.c_str()); @@ -1201,7 +1225,7 @@ void Client::initScreenshotDir() void Client::accountLogin(LoginData *loginData) { - logger->log("Username is %s", loginData->username.c_str()); + Log::info("Username is %s", loginData->username.c_str()); // Send login infos if (loginData->registerLogin) @@ -1224,10 +1248,6 @@ void Client::handleWindowSizeChanged(int width, int height) // Store the new size in the configuration. config.screenWidth = width; config.screenHeight = height; - - mVideo.windowSizeChanged(width, height); - - checkGraphicsSize(); } void Client::checkGraphicsSize() |