summaryrefslogtreecommitdiff
path: root/src/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.cpp')
-rw-r--r--src/client.cpp950
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()