summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
authorBertram <bertram@cegetel.net>2009-10-22 02:31:21 +0200
committerBertram <bertram@cegetel.net>2009-10-22 02:31:21 +0200
commit3c6d873fe5584c41a0038758e52ecca843c1e182 (patch)
tree198cef1684e7a198c4017dbd8732629fb1270bca /src/game.cpp
parent4720134d58cd5fe0846ed911b360ed75641cb874 (diff)
downloadmana-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.cpp115
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()