-// A small helper class
-class TimeGetter
-{
-public:
- virtual u32 getTime(TimePrecision prec) = 0;
-};
-
-// A precise irrlicht one
-class IrrlichtTimeGetter: public TimeGetter
-{
-public:
- IrrlichtTimeGetter(IrrlichtDevice *device):
- m_device(device)
- {}
- u32 getTime(TimePrecision prec)
- {
- if (prec == PRECISION_MILLI) {
- if (m_device == NULL)
- return 0;
- return m_device->getTimer()->getRealTime();
- } else {
- return porting::getTime(prec);
- }
- }
-private:
- IrrlichtDevice *m_device;
-};
-// Not so precise one which works without irrlicht
-class SimpleTimeGetter: public TimeGetter
-{
-public:
- u32 getTime(TimePrecision prec)
- {
- return porting::getTime(prec);
- }
-};
-
-// A pointer to a global instance of the time getter
-// TODO: why?
-TimeGetter *g_timegetter = NULL;
-
-u32 getTimeMs()
-{
- if (g_timegetter == NULL)
- return 0;
- return g_timegetter->getTime(PRECISION_MILLI);
-}
-
-u32 getTime(TimePrecision prec) {
- if (g_timegetter == NULL)
- return 0;
- return g_timegetter->getTime(prec);
-}
-#endif
-
-class StderrLogOutput: public ILogOutput
-{
-public:
- /* line: Full line with timestamp, level and thread */
- void printLog(const std::string &line)
- {
- std::cerr << line << std::endl;
- }
-} main_stderr_log_out;
-
-class DstreamNoStderrLogOutput: public ILogOutput
-{
-public:
- /* line: Full line with timestamp, level and thread */
- void printLog(const std::string &line)
- {
- dstream_no_stderr << line << std::endl;
- }
-} main_dstream_no_stderr_log_out;
-
-#ifndef SERVER
-
-/*
- Event handler for Irrlicht
-
- NOTE: Everything possible should be moved out from here,
- probably to InputHandler and the_game
-*/
-
-class MyEventReceiver : public IEventReceiver
-{
-public:
- // This is the one method that we have to implement
- virtual bool OnEvent(const SEvent& event)
- {
- /*
- React to nothing here if a menu is active
- */
- if (noMenuActive() == false) {
-#ifdef HAVE_TOUCHSCREENGUI
- if (m_touchscreengui != 0) {
- m_touchscreengui->Toggle(false);
- }
-#endif
- return g_menumgr.preprocessEvent(event);
- }
-
- // Remember whether each key is down or up
- if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
- if (event.KeyInput.PressedDown) {
- keyIsDown.set(event.KeyInput);
- keyWasDown.set(event.KeyInput);
- } else {
- keyIsDown.unset(event.KeyInput);
- }
- }
-
-#ifdef HAVE_TOUCHSCREENGUI
- // case of touchscreengui we have to handle different events
- if ((m_touchscreengui != 0) &&
- (event.EventType == irr::EET_TOUCH_INPUT_EVENT)) {
- m_touchscreengui->translateEvent(event);
- return true;
- }
-#endif
- // handle mouse events
- if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
- if (noMenuActive() == false) {
- left_active = false;
- middle_active = false;
- right_active = false;
- } else {
- left_active = event.MouseInput.isLeftPressed();
- middle_active = event.MouseInput.isMiddlePressed();
- right_active = event.MouseInput.isRightPressed();
-
- if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
- leftclicked = true;
- }
- if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
- rightclicked = true;
- }
- if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
- leftreleased = true;
- }
- if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
- rightreleased = true;
- }
- if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
- mouse_wheel += event.MouseInput.Wheel;
- }
- }
- }
- if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
- dstream << std::string("Irrlicht log: ") + std::string(event.LogEvent.Text)
- << std::endl;
- return true;
- }
- /* always return false in order to continue processing events */
- return false;
- }
-
- bool IsKeyDown(const KeyPress &keyCode) const
- {
- return keyIsDown[keyCode];
- }
-
- // Checks whether a key was down and resets the state
- bool WasKeyDown(const KeyPress &keyCode)
- {
- bool b = keyWasDown[keyCode];
- if (b)
- keyWasDown.unset(keyCode);
- return b;
- }
-
- s32 getMouseWheel()
- {
- s32 a = mouse_wheel;
- mouse_wheel = 0;
- return a;
- }
-
- void clearInput()
- {
- keyIsDown.clear();
- keyWasDown.clear();
-
- leftclicked = false;
- rightclicked = false;
- leftreleased = false;
- rightreleased = false;
-
- left_active = false;
- middle_active = false;
- right_active = false;
-
- mouse_wheel = 0;
- }
-
- MyEventReceiver()
- {
- clearInput();
-#ifdef HAVE_TOUCHSCREENGUI
- m_touchscreengui = NULL;
-#endif
- }
-
- bool leftclicked;
- bool rightclicked;
- bool leftreleased;
- bool rightreleased;
-
- bool left_active;
- bool middle_active;
- bool right_active;
-
- s32 mouse_wheel;
-
-#ifdef HAVE_TOUCHSCREENGUI
- TouchScreenGUI* m_touchscreengui;
-#endif
-
-private:
- // The current state of keys
- KeyList keyIsDown;
- // Whether a key has been pressed or not
- KeyList keyWasDown;
-};
-
-/*
- Separated input handler
-*/
-
-class RealInputHandler : public InputHandler
-{
-public:
- RealInputHandler(IrrlichtDevice *device, MyEventReceiver *receiver):
- m_device(device),
- m_receiver(receiver),
- m_mousepos(0,0)
- {
- }
- virtual bool isKeyDown(const KeyPress &keyCode)
- {
- return m_receiver->IsKeyDown(keyCode);
- }
- virtual bool wasKeyDown(const KeyPress &keyCode)
- {
- return m_receiver->WasKeyDown(keyCode);
- }
- virtual v2s32 getMousePos()
- {
- if (m_device->getCursorControl()) {
- return m_device->getCursorControl()->getPosition();
- }
- else {
- return m_mousepos;
- }
- }
- virtual void setMousePos(s32 x, s32 y)
- {
- if (m_device->getCursorControl()) {
- m_device->getCursorControl()->setPosition(x, y);
- }
- else {
- m_mousepos = v2s32(x,y);
- }
- }
-
- virtual bool getLeftState()
- {
- return m_receiver->left_active;
- }
- virtual bool getRightState()
- {
- return m_receiver->right_active;
- }
-
- virtual bool getLeftClicked()
- {
- return m_receiver->leftclicked;
- }
- virtual bool getRightClicked()
- {
- return m_receiver->rightclicked;
- }
- virtual void resetLeftClicked()
- {
- m_receiver->leftclicked = false;
- }
- virtual void resetRightClicked()
- {
- m_receiver->rightclicked = false;
- }
-
- virtual bool getLeftReleased()
- {
- return m_receiver->leftreleased;
- }
- virtual bool getRightReleased()
- {
- return m_receiver->rightreleased;
- }
- virtual void resetLeftReleased()
- {
- m_receiver->leftreleased = false;
- }
- virtual void resetRightReleased()
- {
- m_receiver->rightreleased = false;
- }
-
- virtual s32 getMouseWheel()
- {
- return m_receiver->getMouseWheel();
- }
-
- void clear()
- {
- m_receiver->clearInput();
- }
-private:
- IrrlichtDevice *m_device;
- MyEventReceiver *m_receiver;
- v2s32 m_mousepos;
-};
-
-class RandomInputHandler : public InputHandler
-{
-public:
- RandomInputHandler()
- {
- leftdown = false;
- rightdown = false;
- leftclicked = false;
- rightclicked = false;
- leftreleased = false;
- rightreleased = false;
- keydown.clear();
- }
- virtual bool isKeyDown(const KeyPress &keyCode)
- {
- return keydown[keyCode];
- }
- virtual bool wasKeyDown(const KeyPress &keyCode)
- {
- return false;
- }
- virtual v2s32 getMousePos()
- {
- return mousepos;
- }
- virtual void setMousePos(s32 x, s32 y)
- {
- mousepos = v2s32(x, y);
- }
-
- virtual bool getLeftState()
- {
- return leftdown;
- }
- virtual bool getRightState()
- {
- return rightdown;
- }
-
- virtual bool getLeftClicked()
- {
- return leftclicked;
- }
- virtual bool getRightClicked()
- {
- return rightclicked;
- }
- virtual void resetLeftClicked()
- {
- leftclicked = false;
- }
- virtual void resetRightClicked()
- {
- rightclicked = false;
- }
-
- virtual bool getLeftReleased()
- {
- return leftreleased;
- }
- virtual bool getRightReleased()
- {
- return rightreleased;
- }
- virtual void resetLeftReleased()
- {
- leftreleased = false;
- }
- virtual void resetRightReleased()
- {
- rightreleased = false;
- }
-
- virtual s32 getMouseWheel()
- {
- return 0;
- }
-
- virtual void step(float dtime)
- {
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 40);
- keydown.toggle(getKeySetting("keymap_jump"));
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 40);
- keydown.toggle(getKeySetting("keymap_special1"));
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 40);
- keydown.toggle(getKeySetting("keymap_forward"));
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 40);
- keydown.toggle(getKeySetting("keymap_left"));
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 20);
- mousespeed = v2s32(Rand(-20, 20), Rand(-15, 20));
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 30);
- leftdown = !leftdown;
- if (leftdown)
- leftclicked = true;
- if (!leftdown)
- leftreleased = true;
- }
- }
- {
- static float counter1 = 0;
- counter1 -= dtime;
- if (counter1 < 0.0) {
- counter1 = 0.1 * Rand(1, 15);
- rightdown = !rightdown;
- if (rightdown)
- rightclicked = true;
- if (!rightdown)
- rightreleased = true;
- }
- }
- mousepos += mousespeed;
- }
-
- s32 Rand(s32 min, s32 max)
- {
- return (myrand()%(max-min+1))+min;
- }
-private:
- KeyList keydown;
- v2s32 mousepos;
- v2s32 mousespeed;
- bool leftdown;
- bool rightdown;
- bool leftclicked;
- bool rightclicked;
- bool leftreleased;
- bool rightreleased;
-};
-
-
-class ClientLauncher
-{
-public:
- ClientLauncher() :
- list_video_modes(false),
- skip_main_menu(false),
- use_freetype(false),
- random_input(false),
- address(""),
- playername(""),
- password(""),
- device(NULL),
- input(NULL),
- receiver(NULL),
- skin(NULL),
- font(NULL),
- simple_singleplayer_mode(false),
- current_playername("inv£lid"),
- current_password(""),
- current_address("does-not-exist"),
- current_port(0)
- {}
-
- ~ClientLauncher();
-
- bool run(GameParams &game_params, const Settings &cmd_args);
-
-protected:
- void init_args(GameParams &game_params, const Settings &cmd_args);
- bool init_engine(int log_level);
-
- bool launch_game(std::wstring *error_message, GameParams &game_params,
- const Settings &cmd_args);
-
- void main_menu(MainMenuData *menudata);
- bool create_engine_device(int log_level);
-
- bool list_video_modes;
- bool skip_main_menu;
- bool use_freetype;
- bool random_input;
- std::string address;
- std::string playername;
- std::string password;
- IrrlichtDevice *device;
- InputHandler *input;
- MyEventReceiver *receiver;
- gui::IGUISkin *skin;
- gui::IGUIFont *font;
- scene::ISceneManager *smgr;
- SubgameSpec gamespec;
- WorldSpec worldspec;
- bool simple_singleplayer_mode;
-
- // These are set up based on the menu and other things
- // TODO: Are these required since there's already playername, password, etc
- std::string current_playername;
- std::string current_password;
- std::string current_address;
- int current_port;
-};
-
-#endif // !SERVER