From 3c6d873fe5584c41a0038758e52ecca843c1e182 Mon Sep 17 00:00:00 2001 From: Bertram Date: Thu, 22 Oct 2009 02:31:21 +0200 Subject: 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... --- src/game.cpp | 115 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 54 deletions(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index aea478b5..0d09be01 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -211,6 +211,23 @@ int get_elapsed_time(int start_time) * MILLISECONDS_IN_A_TICK; } +/** + * 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 */ @@ -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() -- cgit v1.2.3-70-g09d2