Files
commandergenius/project/jni/application/enigma/src/game.cpp
2010-10-13 17:30:44 +03:00

127 lines
3.3 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (C) 2002,2003,2004 Daniel Heck
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "game.hh"
#include "errors.hh"
#include "main.hh"
#include "options.hh"
#include "video.hh"
#include "client.hh"
#include "server.hh"
#include "world.hh"
#include "sound.hh"
#include "lev/PersistentIndex.hh"
#include "ecl_sdl.hh"
#include <cassert>
using namespace enigma;
using namespace std;
/* -------------------- Global variables -------------------- */
namespace
{
Uint32 last_tick_time;
}
/* -------------------- Level previews -------------------- */
bool game::DrawLevelPreview (ecl::GC &gc, lev::Proxy *levelProxy)
{
bool success = false;
sound::TempDisableSound();
try {
server::Msg_LoadLevel (levelProxy, true);
display::DrawAll(gc);
success = true;
}
catch (XLevelLoading &err) {
// log the message as we cannot display it on the screen
Log << "DrawLevelPreview load error:\n" << err.what();
success = false;
}
sound::TempReEnableSound();
return success;
}
/* -------------------- Functions -------------------- */
void game::StartGame ()
{
lev::Index *ind = lev::Index::getCurrentIndex();
server::InitNewGame();
video::HideMouse();
sdl::TempInputGrab grab(enigma::Nograb ? SDL_GRAB_OFF : SDL_GRAB_ON);
server::Msg_LoadLevel(ind->getCurrent(), false);
double dtime = 0;
last_tick_time=SDL_GetTicks();
while (!client::AbortGameP()) {
try {
client::Tick (dtime);
server::Tick (dtime);
}
catch (XLevelRuntime& err) {
client::Msg_Error (string("Server Error: level runtime error:\n")
+ err.what());
server::Msg_Panic(true);
}
int sleeptime = 10 - (SDL_GetTicks()-last_tick_time);
if (sleeptime >= 3) // only sleep if relatively idle
SDL_Delay(sleeptime);
Uint32 current_tick_time = SDL_GetTicks();
dtime = (current_tick_time - last_tick_time)/1000.0;
if (abs(1-dtime/0.01) < 0.2) {
// less than 20% deviation from desired frame time?
dtime = 0.01;
last_tick_time += 10;
} else {
last_tick_time = current_tick_time;
}
if (dtime > 500.0) /* Time has done something strange, perhaps
run backwards */
dtime = 0.0;
// else if (dtime > 0.5)
// dtime = 0.5;
}
// add last played level
lev::PersistentIndex::addCurrentToHistory();
video::ShowMouse();
}
void game::ResetGameTimer()
{
last_tick_time=SDL_GetTicks();
}