summaryrefslogtreecommitdiff
path: root/src/client.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.h')
-rw-r--r--src/client.h317
1 files changed, 317 insertions, 0 deletions
diff --git a/src/client.h b/src/client.h
new file mode 100644
index 000000000..c853411d3
--- /dev/null
+++ b/src/client.h
@@ -0,0 +1,317 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ *
+ * This file is part of The Mana Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CLIENT_H
+#define CLIENT_H
+
+#include "configlistener.h"
+
+#include "net/serverinfo.h"
+
+#include <guichan/actionlistener.hpp>
+
+#include <SDL.h>
+#include <SDL_framerate.h>
+
+#include <string>
+
+#ifdef __GNUC__
+#define _UNUSED_ __attribute__ ((unused))
+#else
+#define _UNUSED_
+#endif
+
+class Button;
+class Desktop;
+class LoginData;
+class Window;
+class QuitDialog;
+
+/**
+ * Set the milliseconds value of a tick time.
+ */
+static const int MILLISECONDS_IN_A_TICK = 10;
+
+//manaserv uses 9601
+//static const short DEFAULT_PORT = 9601;
+static const short DEFAULT_PORT = 6901;
+
+extern volatile int fps;
+extern volatile int tick_time;
+extern volatile int cur_time;
+extern bool isSafeMode;
+
+class ErrorListener : public gcn::ActionListener
+{
+ public:
+ void action(const gcn::ActionEvent &event);
+};
+
+extern std::string errorMessage;
+extern ErrorListener errorListener;
+extern LoginData loginData;
+
+/**
+ * Returns elapsed time. (Warning: supposes the delay is always < 100 seconds)
+ */
+int get_elapsed_time(int start_time);
+
+/**
+ * All client states.
+ */
+enum State
+{
+ STATE_ERROR = -1,
+ STATE_START = 0,
+ STATE_CHOOSE_SERVER,
+ STATE_CONNECT_SERVER,
+ STATE_LOGIN,
+ STATE_LOGIN_ATTEMPT,
+ STATE_WORLD_SELECT, // 5
+ STATE_WORLD_SELECT_ATTEMPT,
+ STATE_UPDATE,
+ STATE_LOAD_DATA,
+ STATE_GET_CHARACTERS,
+ STATE_CHAR_SELECT, // 10
+ STATE_CONNECT_GAME,
+ STATE_GAME,
+ STATE_CHANGE_MAP, // Switch map-server/gameserver
+ STATE_LOGIN_ERROR,
+ STATE_ACCOUNTCHANGE_ERROR, // 15
+ STATE_REGISTER_PREP,
+ STATE_REGISTER,
+ STATE_REGISTER_ATTEMPT,
+ STATE_CHANGEPASSWORD,
+ STATE_CHANGEPASSWORD_ATTEMPT, // 20
+ STATE_CHANGEPASSWORD_SUCCESS,
+ STATE_CHANGEEMAIL,
+ STATE_CHANGEEMAIL_ATTEMPT,
+ STATE_CHANGEEMAIL_SUCCESS,
+ STATE_UNREGISTER, // 25
+ STATE_UNREGISTER_ATTEMPT,
+ STATE_UNREGISTER_SUCCESS,
+ STATE_SWITCH_SERVER,
+ STATE_SWITCH_LOGIN,
+ STATE_SWITCH_CHARACTER, // 30
+ STATE_LOGOUT_ATTEMPT,
+ STATE_WAIT,
+ STATE_EXIT,
+ STATE_FORCE_QUIT,
+ STATE_AUTORECONNECT_SERVER = 1000
+};
+
+enum PacketTypes
+{
+ PACKET_CHAT = 0,
+ PACKET_PICKUP = 1,
+ PACKET_DROP = 2,
+ PACKET_NPC_NEXT = 3,
+ PACKET_NPC_TALK = 4,
+ PACKET_NPC_INPUT = 5,
+ PACKET_EMOTE = 6,
+ PACKET_SIT = 7,
+ PACKET_DIRECTION = 8,
+ PACKET_ATTACK = 9,
+ PACKET_SIZE
+};
+
+struct PacketLimit
+{
+ int lastTime;
+ int timeLimit;
+ int cnt;
+ int cntLimit;
+};
+
+/**
+ * The core part of the client. This class initializes all subsystems, runs
+ * the event loop, and shuts everything down again.
+ */
+class Client : public ConfigListener, public gcn::ActionListener
+{
+public:
+ /**
+ * A structure holding the values of various options that can be passed
+ * from the command line.
+ */
+ struct Options
+ {
+ Options():
+ printHelp(false),
+ printVersion(false),
+ skipUpdate(false),
+ chooseDefault(false),
+ noOpenGL(false),
+ safeMode(false),
+ serverPort(0)
+ {}
+
+ bool printHelp;
+ bool printVersion;
+ bool skipUpdate;
+ bool chooseDefault;
+ bool noOpenGL;
+ std::string username;
+ std::string password;
+ std::string character;
+ std::string brandingPath;
+ std::string updateHost;
+ std::string dataPath;
+ std::string homeDir;
+ std::string logFileName;
+ std::string chatLogDir;
+ std::string configDir;
+ std::string localDataDir;
+ std::string screenshotDir;
+ bool safeMode;
+
+ std::string serverName;
+ short serverPort;
+ };
+
+ Client(const Options &options);
+ ~Client();
+
+ /**
+ * Provides access to the client instance.
+ */
+ static Client *instance()
+ { return mInstance; }
+
+ int exec();
+
+ static void setState(State state)
+ { instance()->mState = state; }
+
+ static State getState()
+ { return instance()->mState; }
+
+ static const std::string &getPackageDirectory()
+ { return instance()->mPackageDir; }
+
+ static const std::string &getConfigDirectory()
+ { return instance()->mConfigDir; }
+
+ static const std::string &getLocalDataDirectory()
+ { return instance()->mLocalDataDir; }
+
+ static const std::string &getScreenshotDirectory()
+ { return instance()->mScreenshotDir; }
+
+ static const std::string getServerConfigDirectory();
+
+ static bool getIsMinimized()
+ { return instance()->mIsMinimized; }
+
+ static void setIsMinimized(bool n)
+ { instance()->mIsMinimized = n; }
+
+ static bool getInputFocused()
+ { return instance()->mInputFocused; }
+
+ static void setInputFocused(bool n)
+ { instance()->mInputFocused = n; }
+
+ static bool getMouseFocused()
+ { return instance()->mMouseFocused; }
+
+ static void setMouseFocused(bool n)
+ { instance()->mMouseFocused = n; }
+
+ static std::string getUpdatesDir()
+ { return instance()->mUpdatesDir; }
+
+ static std::string getServerName()
+ { return instance()->mServerName; }
+
+ static void setGuiAlpha(float n);
+
+ static float getGuiAlpha();
+
+ static void setFramerate(int fpsLimit);
+ void optionChanged(const std::string &name);
+ void action(const gcn::ActionEvent &event);
+ void initTradeFilter();
+
+ void initPacketLimiter();
+
+ void writePacketLimits(std::string packetLimitsName);
+
+ static bool limitPackets(int type);
+
+ static bool checkPackets(int type);
+
+ PacketLimit mPacketLimits[PACKET_SIZE + 1];
+
+private:
+ void initRootDir();
+ void initHomeDir();
+ void initConfiguration();
+ void initUpdatesDir();
+ void initScreenshotDir();
+ void initServerConfig(std::string serverName);
+
+ bool copyFile(std::string &configPath, std::string &oldConfigPath);
+ bool createConfig(std::string &configPath);
+
+ void accountLogin(LoginData *loginData);
+
+ void storeSafeParameters();
+
+ static Client *mInstance;
+
+ Options mOptions;
+
+ std::string mPackageDir;
+ std::string mConfigDir;
+ std::string mLocalDataDir;
+ std::string mUpdateHost;
+ std::string mUpdatesDir;
+ std::string mScreenshotDir;
+ std::string mServerConfigDir;
+ std::string mRootDir;
+ std::string mServerName;
+
+ ServerInfo mCurrentServer;
+
+ Window *mCurrentDialog;
+ QuitDialog *mQuitDialog;
+ Desktop *mDesktop;
+ Button *mSetupButton;
+
+ State mState;
+ State mOldState;
+
+ SDL_Surface *mIcon;
+
+ SDL_TimerID mLogicCounterId;
+ SDL_TimerID mSecondsCounterId;
+
+ bool mLimitFps;
+ bool mConfigAutoSaved;
+ bool mIsMinimized;
+ bool mInputFocused;
+ bool mMouseFocused;
+ float mGuiAlpha;
+ FPSmanager mFpsManager;
+};
+
+#endif // CLIENT_H