diff options
author | Bertram <bertram@cegetel.net> | 2009-10-22 02:31:21 +0200 |
---|---|---|
committer | Bertram <bertram@cegetel.net> | 2009-10-22 02:31:21 +0200 |
commit | 3c6d873fe5584c41a0038758e52ecca843c1e182 (patch) | |
tree | 198cef1684e7a198c4017dbd8732629fb1270bca /src/game.cpp | |
parent | 4720134d58cd5fe0846ed911b360ed75641cb874 (diff) | |
download | mana-3c6d873fe5584c41a0038758e52ecca843c1e182.tar.gz mana-3c6d873fe5584c41a0038758e52ecca843c1e182.tar.bz2 mana-3c6d873fe5584c41a0038758e52ecca843c1e182.tar.xz mana-3c6d873fe5584c41a0038758e52ecca843c1e182.zip |
Optimized game startup sequence for eAthena in order to cope a bit better with network errors.
Unfortunately, it isn't enough: The bug seems to be elsewhere...
Diffstat (limited to 'src/game.cpp')
-rw-r--r-- | src/game.cpp | 115 |
1 files changed, 61 insertions, 54 deletions
diff --git a/src/game.cpp b/src/game.cpp index aea478b5..0d09be01 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -212,6 +212,23 @@ int get_elapsed_time(int start_time) } /** + * Initialize every game sub-engines in the right order + */ +static void initEngines() +{ + engine = new Engine; + + beingManager = new BeingManager; + commandHandler = new CommandHandler; + floorItemManager = new FloorItemManager; + channelManager = new ChannelManager; + effectManager = new EffectManager; + + particleEngine = new Particle(NULL); + particleEngine->setupEngine(); +} + +/** * Create all the various globally accessible gui windows */ static void createGuiWindows() @@ -301,60 +318,50 @@ Game::Game(): { done = false; - createGuiWindows(); - - mWindowMenu = new WindowMenu; - windowContainer->add(mWindowMenu); - - engine = new Engine; - - beingManager = new BeingManager; - commandHandler = new CommandHandler; - floorItemManager = new FloorItemManager; - channelManager = new ChannelManager; - effectManager = new EffectManager; - - particleEngine = new Particle(NULL); - particleEngine->setupEngine(); - - // Initialize logic and seconds counters - tick_time = 0; - mLogicCounterId = SDL_AddTimer(MILLISECONDS_IN_A_TICK, nextTick, NULL); - mSecondsCounterId = SDL_AddTimer(1000, nextSecond, NULL); - - // Initialize frame limiting - config.addListener("fpslimit", this); - optionChanged("fpslimit"); - - // Initialize beings - beingManager->setPlayer(player_node); - - Joystick::init(); - // TODO: The user should be able to choose which one to use - // Open the first device - if (Joystick::getNumberOfJoysticks() > 0) - joystick = new Joystick(0); - - // fade out logon-music here too to give the desired effect of "flowing" - // into the game. - sound.fadeOutMusic(1000); - map_path = map_path.substr(0, map_path.rfind(".")); - - if (!map_path.empty()) - engine->changeMap(map_path); - - setupWindow->setInGame(true); - - /* - * To prevent the server from sending data before the client - * has initialized, I've modified it to wait for a "ping" - * from the client to complete its initialization - * - * Note: This only affects the latest eAthena version. This - * packet is handled by the older version, but its response - * is ignored by the client - */ - Net::getGameHandler()->ping(tick_time); + createGuiWindows(); + + mWindowMenu = new WindowMenu; + windowContainer->add(mWindowMenu); + + initEngines(); + + // Initialize logic and seconds counters + tick_time = 0; + mLogicCounterId = SDL_AddTimer(MILLISECONDS_IN_A_TICK, nextTick, NULL); + mSecondsCounterId = SDL_AddTimer(1000, nextSecond, NULL); + + // This part is eAthena specific + // For TMWserv, the map is obtained + // with the GPMSG_PLAYER_MAP_CHANGE flag. + map_path = map_path.substr(0, map_path.rfind(".")); + if (!map_path.empty()) + engine->changeMap(map_path); + + // Initialize beings + beingManager->setPlayer(player_node); + + /* + * To prevent the server from sending data before the client + * has initialized, I've modified it to wait for a "ping" + * from the client to complete its initialization + * + * Note: This only affects the latest eAthena version. This + * packet is handled by the older version, but its response + * is ignored by the client + */ + Net::getGameHandler()->ping(tick_time); + + // Initialize frame limiting + config.addListener("fpslimit", this); + optionChanged("fpslimit"); + + Joystick::init(); + // TODO: The user should be able to choose which one to use + // Open the first device + if (Joystick::getNumberOfJoysticks() > 0) + joystick = new Joystick(0); + + setupWindow->setInGame(true); } Game::~Game() |