127 lines
3.3 KiB
C++
127 lines
3.3 KiB
C++
/*
|
||
* 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();
|
||
}
|
||
|
||
|