summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp163
1 files changed, 22 insertions, 141 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 45e6b761..56978dca 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -23,6 +23,7 @@
#include "beingmanager.h"
#include "channelmanager.h"
+#include "client.h"
#include "commandhandler.h"
#include "configuration.h"
#include "effectmanager.h"
@@ -34,7 +35,6 @@
#include "keyboardconfig.h"
#include "localplayer.h"
#include "log.h"
-#include "main.h"
#include "map.h"
#include "npc.h"
#include "particle.h"
@@ -96,9 +96,6 @@
std::string map_path;
-volatile int tick_time;
-volatile int fps = 0, frame = 0;
-
Joystick *joystick = NULL;
OkDialog *weightNotice = NULL;
@@ -133,55 +130,6 @@ Viewport *viewport = NULL; /**< Viewport on the map. */
ChatTab *localChatTab = NULL;
-std::string screenshotDir = "";
-
-/**
- * Tells the max tick value,
- * setting it back to zero (and start again).
- */
-const int MAX_TICK_VALUE = 10000;
-/**
- * Set the milliseconds value of a tick time.
- */
-const int MILLISECONDS_IN_A_TICK = 10;
-
-/**
- * Advances game logic counter.
- * Called every 10 milliseconds by SDL_AddTimer()
- * @see MILLISECONDS_IN_A_TICK value
- */
-Uint32 nextTick(Uint32 interval, void *param)
-{
- tick_time++;
- if (tick_time == MAX_TICK_VALUE) tick_time = 0;
- return interval;
-}
-
-/**
- * Updates fps.
- * Called every seconds by SDL_AddTimer()
- */
-Uint32 nextSecond(Uint32 interval, void *param)
-{
- fps = frame;
- frame = 0;
-
- return interval;
-}
-
-/**
- * @return the elapsed time in milliseconds
- * between two tick values.
- */
-int get_elapsed_time(int start_time)
-{
- if (start_time <= tick_time)
- return (tick_time - start_time) * MILLISECONDS_IN_A_TICK;
- else
- return (tick_time + (MAX_TICK_VALUE - start_time))
- * MILLISECONDS_IN_A_TICK;
-}
-
/**
* Initialize every game sub-engines in the right order
*/
@@ -266,8 +214,6 @@ Game *Game::mInstance = 0;
Game::Game():
mLastTarget(Being::UNKNOWN),
- mLogicCounterId(0), mSecondsCounterId(0),
- mLimitFps(false),
mCurrentMap(0), mMapName("")
{
assert(!mInstance);
@@ -276,7 +222,7 @@ Game::Game():
disconnectedDialog = NULL;
// Create the viewport
- viewport = new Viewport();
+ viewport = new Viewport;
viewport->setDimension(gcn::Rectangle(0, 0, graphics->getWidth(),
graphics->getHeight()));
@@ -291,11 +237,6 @@ Game::Game():
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 Manaserv, the map is obtained
// with the GPMSG_PLAYER_MAP_CHANGE flag.
@@ -317,11 +258,6 @@ Game::Game():
*/
Net::getGameHandler()->ping(tick_time);
- // Initialize frame limiting
- SDL_initFramerate(&mFpsManager);
- config.addListener("fpslimit", this);
- optionChanged("fpslimit");
-
Joystick::init();
// TODO: The user should be able to choose which one to use
// Open the first device
@@ -356,26 +292,9 @@ Game::~Game()
floorItemManager = NULL;
joystick = NULL;
- SDL_RemoveTimer(mLogicCounterId);
- SDL_RemoveTimer(mSecondsCounterId);
-
mInstance = 0;
}
-void setScreenshotDir(const std::string &dir)
-{
- if (dir.empty())
- {
- screenshotDir = std::string(PHYSFS_getUserDir()) + "Desktop";
- // If ~/Desktop does not exist, we save screenshots in the user's home.
- struct stat statbuf;
- if (stat(screenshotDir.c_str(), &statbuf))
- screenshotDir = std::string(PHYSFS_getUserDir());
- }
- else
- screenshotDir = dir;
-}
-
static bool saveScreenshot()
{
static unsigned int screenshotCount = 0;
@@ -392,7 +311,7 @@ static bool saveScreenshot()
screenshotCount++;
filenameSuffix.str("");
filename.str("");
- filename << screenshotDir << "/";
+ filename << Client::getScreenshotDirectory() << "/";
filenameSuffix << "Mana_Screenshot_" << screenshotCount << ".png";
filename << filenameSuffix.str();
testExists.open(filename.str().c_str(), std::ios::in);
@@ -420,74 +339,36 @@ static bool saveScreenshot()
return success;
}
-void Game::optionChanged(const std::string &name)
+void Game::logic()
{
- const int fpsLimit = (int) config.getValue("fpslimit", 60);
- mLimitFps = fpsLimit > 0;
- if (mLimitFps)
- SDL_setFramerate(&mFpsManager, fpsLimit);
-}
+ handleInput();
-void Game::exec()
-{
- int gameTime = tick_time;
+ // Handle all necessary game logic
+ beingManager->logic();
+ particleEngine->update();
+ if (mCurrentMap)
+ mCurrentMap->update();
- while (state == STATE_GAME)
+ // Handle network stuff
+ if (!Net::getGameHandler()->isConnected())
{
- if (mCurrentMap)
- mCurrentMap->update(get_elapsed_time(gameTime));
-
- handleInput();
-
- // Handle all necessary game logic
- while (get_elapsed_time(gameTime) > 0)
+ if (Client::getState() != STATE_ERROR)
{
- beingManager->logic();
- particleEngine->update();
- gui->logic();
-
- gameTime++;
+ errorMessage = _("The connection to the server was lost.");
}
- // This is done because at some point tick_time will wrap.
- gameTime = tick_time;
-
- // Update the screen when application is active, delay otherwise.
- if (SDL_GetAppState() & SDL_APPACTIVE)
+ if (!disconnectedDialog)
{
- frame++;
- gui->draw();
- graphics->updateScreen();
- }
- else
- {
- SDL_Delay(10);
- }
-
- if (mLimitFps)
- SDL_framerateDelay(&mFpsManager);
-
- // Handle network stuff
- Net::getGeneralHandler()->flushNetwork();
- if (!Net::getGameHandler()->isConnected())
- {
- if (state != STATE_ERROR)
- {
- errorMessage = _("The connection to the server was lost.");
- }
-
- if (!disconnectedDialog)
- {
- disconnectedDialog = new OkDialog(_("Network Error"), errorMessage);
- disconnectedDialog->addActionListener(&errorListener);
- disconnectedDialog->requestMoveToTop();
- }
+ disconnectedDialog = new OkDialog(_("Network Error"),
+ errorMessage);
+ disconnectedDialog->addActionListener(&errorListener);
+ disconnectedDialog->requestMoveToTop();
}
}
}
/**
- * The MONSTER input handling method.
+ * The huge input handling method.
*/
void Game::handleInput()
{
@@ -849,7 +730,7 @@ void Game::handleInput()
// Quit event
else if (event.type == SDL_QUIT)
{
- state = STATE_EXIT;
+ Client::setState(STATE_EXIT);
}
// Push input to GUI when not used
@@ -861,7 +742,7 @@ void Game::handleInput()
}
catch (gcn::Exception e)
{
- const char* err = e.getMessage().c_str();
+ const char *err = e.getMessage().c_str();
logger->log("Warning: guichan input exception: %s", err);
}
}