Skip to content

Commit

Permalink
WINTERMUTE: Split the timers from BaseGame into a separate class.
Browse files Browse the repository at this point in the history
  • Loading branch information
somaen committed Apr 18, 2013
1 parent 7ee7573 commit 8f25b65
Show file tree
Hide file tree
Showing 23 changed files with 196 additions and 62 deletions.
2 changes: 1 addition & 1 deletion engines/wintermute/ad/ad_actor.cpp
Expand Up @@ -752,7 +752,7 @@ bool AdActor::update() {
_tempSprite2 = _sentence->_currentSprite;
}

bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime);
bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->getTimer()->getTime() - _sentence->_startTime);
if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) {
if (timeIsUp) {
_sentence->finish();
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/ad/ad_entity.cpp
Expand Up @@ -627,7 +627,7 @@ bool AdEntity::update() {
_tempSprite2 = _sentence->_currentSprite;
}

bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime);
bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->getTimer()->getTime() - _sentence->_startTime);
if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) {
if (timeIsUp) {
_sentence->finish();
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/ad/ad_item.cpp
Expand Up @@ -378,7 +378,7 @@ bool AdItem::update() {
_tempSprite2 = _sentence->_currentSprite;
}

bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->_timer - _sentence->_startTime);
bool timeIsUp = (_sentence->_sound && _sentence->_soundStarted && (!_sentence->_sound->isPlaying() && !_sentence->_sound->isPaused())) || (!_sentence->_sound && _sentence->_duration <= _gameRef->getTimer()->getTime() - _sentence->_startTime);
if (_tempSprite2 == nullptr || _tempSprite2->isFinished() || (/*_tempSprite2->_looping &&*/ timeIsUp)) {
if (timeIsUp) {
_sentence->finish();
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/ad/ad_object.cpp
Expand Up @@ -904,7 +904,7 @@ void AdObject::talk(const char *text, const char *sound, uint32 duration, const
_sentence->setStances(stances);
_sentence->_duration = duration;
_sentence->_align = Align;
_sentence->_startTime = _gameRef->_timer;
_sentence->_startTime = _gameRef->getTimer()->getTime();
_sentence->_currentStance = -1;
_sentence->_font = _font == nullptr ? _gameRef->getSystemFont() : _font;
_sentence->_freezable = _freezable;
Expand Down
12 changes: 6 additions & 6 deletions engines/wintermute/ad/ad_scene.cpp
Expand Up @@ -931,13 +931,13 @@ bool AdScene::traverseNodes(bool doUpdate) {

if (_autoScroll) {
// adjust horizontal scroll
if (_gameRef->_timer - _lastTimeH >= _scrollTimeH) {
int timesMissed = (_gameRef->_timer - _lastTimeH) / _scrollTimeH;
if (_gameRef->getTimer()->getTime() - _lastTimeH >= _scrollTimeH) {
int timesMissed = (_gameRef->getTimer()->getTime() - _lastTimeH) / _scrollTimeH;
// Cap the amount of catch-up to avoid jittery characters.
if (timesMissed > 2) {
timesMissed = 2;
}
_lastTimeH = _gameRef->_timer;
_lastTimeH = _gameRef->getTimer()->getTime();
if (_offsetLeft < _targetOffsetLeft) {
_offsetLeft += _scrollPixelsH * timesMissed;
_offsetLeft = MIN(_offsetLeft, _targetOffsetLeft);
Expand All @@ -948,13 +948,13 @@ bool AdScene::traverseNodes(bool doUpdate) {
}

// adjust vertical scroll
if (_gameRef->_timer - _lastTimeV >= _scrollTimeV) {
int timesMissed = (_gameRef->_timer - _lastTimeV) / _scrollTimeV;
if (_gameRef->getTimer()->getTime() - _lastTimeV >= _scrollTimeV) {
int timesMissed = (_gameRef->getTimer()->getTime() - _lastTimeV) / _scrollTimeV;
// Cap the amount of catch-up to avoid jittery characters.
if (timesMissed > 2) {
timesMissed = 2;
}
_lastTimeV = _gameRef->_timer;
_lastTimeV = _gameRef->getTimer()->getTime();
if (_offsetTop < _targetOffsetTop) {
_offsetTop += _scrollPixelsV * timesMissed;
_offsetTop = MIN(_offsetTop, _targetOffsetTop);
Expand Down
6 changes: 3 additions & 3 deletions engines/wintermute/ad/ad_sentence.cpp
Expand Up @@ -314,9 +314,9 @@ bool AdSentence::update(TDirection dir) {

/*
if (_sound) CurrentTime = _sound->GetPositionTime();
else CurrentTime = _gameRef->_timer - _startTime;
else CurrentTime = _gameRef->getTimer()->getTime() - _startTime;
*/
currentTime = _gameRef->_timer - _startTime;
currentTime = _gameRef->getTimer()->getTime() - _startTime;

bool talkNodeFound = false;
for (uint32 i = 0; i < _talkDef->_nodes.size(); i++) {
Expand Down Expand Up @@ -355,7 +355,7 @@ bool AdSentence::update(TDirection dir) {
//////////////////////////////////////////////////////////////////////////
bool AdSentence::canSkip() {
// prevent accidental sentence skipping (TODO make configurable)
return (_gameRef->_timer - _startTime) > 300;
return (_gameRef->getTimer()->getTime() - _startTime) > 300;
}

} // end of namespace Wintermute
16 changes: 16 additions & 0 deletions engines/wintermute/base/base_engine.cpp
Expand Up @@ -106,4 +106,20 @@ BaseRenderer *BaseEngine::getRenderer() {
}
}

const Timer *BaseEngine::getTimer() {
if (instance()._gameRef) {
return instance()._gameRef->getTimer();
} else {
return nullptr;
}
}

const Timer *BaseEngine::getLiveTimer() {
if (instance()._gameRef) {
return instance()._gameRef->getLiveTimer();
} else {
return nullptr;
}
}

} // end of namespace Wintermute
3 changes: 3 additions & 0 deletions engines/wintermute/base/base_engine.h
Expand Up @@ -42,6 +42,7 @@ class BaseGame;
class BaseSoundMgr;
class BaseRenderer;
class SystemClassRegistry;
class Timer;
class BaseEngine : public Common::Singleton<Wintermute::BaseEngine> {
void init(Common::Language lang);
BaseFileManager *_fileManager;
Expand All @@ -64,6 +65,8 @@ class BaseEngine : public Common::Singleton<Wintermute::BaseEngine> {
BaseFileManager *getFileManager() { return _fileManager; }
BaseSoundMgr *getSoundMgr();
BaseRenderer *getRenderer();
static const Timer *getTimer();
static const Timer *getLiveTimer();
static void LOG(bool res, const char *fmt, ...);
const char *getGameId() { return _gameId.c_str(); }
};
Expand Down
6 changes: 3 additions & 3 deletions engines/wintermute/base/base_fader.cpp
Expand Up @@ -71,7 +71,7 @@ bool BaseFader::update() {
if (_system) {
time = g_system->getMillis() - _startTime;
} else {
time = _gameRef->_timer - _startTime;
time = _gameRef->getTimer()->getTime() - _startTime;
}

if (time >= _duration) {
Expand Down Expand Up @@ -129,7 +129,7 @@ bool BaseFader::fadeIn(uint32 sourceColor, uint32 duration, bool system) {
if (_system) {
_startTime = g_system->getMillis();
} else {
_startTime = _gameRef->_timer;
_startTime = _gameRef->getTimer()->getTime();
}

return STATUS_OK;
Expand All @@ -155,7 +155,7 @@ bool BaseFader::fadeOut(uint32 targetColor, uint32 duration, bool system) {
if (_system) {
_startTime = g_system->getMillis();
} else {
_startTime = _gameRef->_timer;
_startTime = _gameRef->getTimer()->getTime();
}


Expand Down
33 changes: 8 additions & 25 deletions engines/wintermute/base/base_game.cpp
Expand Up @@ -81,7 +81,7 @@ IMPLEMENT_PERSISTENT(BaseGame, true)


//////////////////////////////////////////////////////////////////////
BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gameId) {
BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gameId), _timerNormal(), _timerLive() {
_shuttingDown = false;

_state = GAME_RUNNING;
Expand Down Expand Up @@ -122,14 +122,6 @@ BaseGame::BaseGame(const Common::String &gameId) : BaseObject(this), _gameId(gam
_subtitles = true;
_videoSubtitles = true;

_timer = 0;
_timerDelta = 0;
_timerLast = 0;

_liveTimer = 0;
_liveTimerDelta = 0;
_liveTimerLast = 0;

_sequence = 0;

_mousePos.x = _mousePos.y = 0;
Expand Down Expand Up @@ -561,16 +553,12 @@ bool BaseGame::initLoop() {
_lastTime = _currentTime;
_fpsTime += _deltaTime;

_liveTimerDelta = _liveTimer - _liveTimerLast;
_liveTimerLast = _liveTimer;
_liveTimer += MIN((uint32)1000, _deltaTime);
_timerLive.updateTime(_deltaTime, 1000);

if (_state != GAME_FROZEN) {
_timerDelta = _timer - _timerLast;
_timerLast = _timer;
_timer += MIN((uint32)1000, _deltaTime);
_timerNormal.updateTime(_deltaTime, 1000);
} else {
_timerDelta = 0;
_timerNormal.setTimeDelta(0);
}

_framesRendered++;
Expand Down Expand Up @@ -1985,7 +1973,7 @@ ScValue *BaseGame::scGetProperty(const Common::String &name) {
// CurrentTime (RO)
//////////////////////////////////////////////////////////////////////////
else if (name == "CurrentTime") {
_scValue->setInt((int)_timer);
_scValue->setInt((int)getTimer()->getTime());
return _scValue;
}

Expand Down Expand Up @@ -3104,13 +3092,8 @@ bool BaseGame::persist(BasePersistenceManager *persistMgr) {
persistMgr->transfer(TMEMBER(_videoFont));
persistMgr->transfer(TMEMBER(_videoSubtitles));

persistMgr->transfer(TMEMBER(_timer));
persistMgr->transfer(TMEMBER(_timerDelta));
persistMgr->transfer(TMEMBER(_timerLast));

persistMgr->transfer(TMEMBER(_liveTimer));
persistMgr->transfer(TMEMBER(_liveTimerDelta));
persistMgr->transfer(TMEMBER(_liveTimerLast));
_timerNormal.persist(persistMgr);
_timerLive.persist(persistMgr);

_renderer->persistSaveLoadImages(persistMgr);

Expand Down Expand Up @@ -3777,7 +3760,7 @@ bool BaseGame::displayDebugInfo() {
_systemFont->drawText((byte *)str, 0, 70, _renderer->getWidth(), TAL_RIGHT);


sprintf(str, "Timer: %d", _timer);
sprintf(str, "Timer: %d", getTimer()->getTime());
_gameRef->_systemFont->drawText((byte *)str, 0, 130, _renderer->getWidth(), TAL_RIGHT);

if (_activeObject != nullptr) {
Expand Down
14 changes: 7 additions & 7 deletions engines/wintermute/base/base_game.h
Expand Up @@ -30,6 +30,7 @@
#define WINTERMUTE_BASE_GAME_H

#include "engines/wintermute/base/base_object.h"
#include "engines/wintermute/base/timer.h"
#include "engines/wintermute/persistent.h"
#include "engines/wintermute/coll_templ.h"
#include "engines/wintermute/math/rect32.h"
Expand Down Expand Up @@ -214,14 +215,13 @@ class BaseGame: public BaseObject {
TGameState _state;
TGameState _origState;
bool _origInteractive;
uint32 _timer;
uint32 _timerDelta;
uint32 _timerLast;

uint32 _liveTimer;
uint32 _liveTimerDelta;
uint32 _liveTimerLast;

const Timer *getTimer() const { return &_timerNormal; }
const Timer *getLiveTimer() const { return &_timerLive; }
private:
Timer _timerNormal;
Timer _timerLive;
public:
BaseObject *_capturedObject;
Point32 _mousePos;
bool validObject(BaseObject *object);
Expand Down
4 changes: 2 additions & 2 deletions engines/wintermute/base/base_game_music.cpp
Expand Up @@ -177,7 +177,7 @@ bool BaseGameMusic::updateMusicCrossfade() {
_music[_musicCrossfadeChannel2]->play();
}

uint32 currentTime = _gameRef->_liveTimer - _musicCrossfadeStartTime;
uint32 currentTime = _gameRef->getLiveTimer()->getTime() - _musicCrossfadeStartTime;

if (currentTime >= _musicCrossfadeLength) {
_musicCrossfadeRunning = false;
Expand Down Expand Up @@ -469,7 +469,7 @@ bool BaseGameMusic::scCallMethod(ScScript *script, ScStack *stack, ScStack *this
return STATUS_OK;
}

_musicCrossfadeStartTime = _gameRef->_liveTimer;
_musicCrossfadeStartTime = _gameRef->getLiveTimer()->getTime();
_musicCrossfadeChannel1 = channel1;
_musicCrossfadeChannel2 = channel2;
_musicCrossfadeLength = fadeLength;
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/base/base_parser.cpp
Expand Up @@ -27,8 +27,8 @@
*/

#include "engines/wintermute/base/base_parser.h"
#include "engines/wintermute/base/base_game.h"
#include "engines/wintermute/base/base_engine.h"
#include "engines/wintermute/base/base_game.h"
#include "engines/wintermute/platform_osystem.h"
#include "common/str.h"
#include "common/util.h"
Expand Down
4 changes: 2 additions & 2 deletions engines/wintermute/base/base_sprite.cpp
Expand Up @@ -365,9 +365,9 @@ bool BaseSprite::getCurrentFrame(float zoomX, float zoomY) {

uint32 timer;
if (_owner && _owner->_freezable) {
timer = _gameRef->_timer;
timer = _gameRef->getTimer()->getTime();
} else {
timer = _gameRef->_liveTimer;
timer = _gameRef->getLiveTimer()->getTime();
}

int lastFrame = _currentFrame;
Expand Down
6 changes: 3 additions & 3 deletions engines/wintermute/base/base_surface_storage.cpp
Expand Up @@ -66,15 +66,15 @@ bool BaseSurfaceStorage::cleanup(bool warn) {

//////////////////////////////////////////////////////////////////////////
bool BaseSurfaceStorage::initLoop() {
if (_gameRef->_smartCache && _gameRef->_liveTimer - _lastCleanupTime >= _gameRef->_surfaceGCCycleTime) {
_lastCleanupTime = _gameRef->_liveTimer;
if (_gameRef->_smartCache && _gameRef->getLiveTimer()->getTime() - _lastCleanupTime >= _gameRef->_surfaceGCCycleTime) {
_lastCleanupTime = _gameRef->getLiveTimer()->getTime();
sortSurfaces();
for (uint32 i = 0; i < _surfaces.size(); i++) {
if (_surfaces[i]->_lifeTime <= 0) {
break;
}

if (_surfaces[i]->_lifeTime > 0 && _surfaces[i]->_valid && (int)(_gameRef->_liveTimer - _surfaces[i]->_lastUsedTime) >= _surfaces[i]->_lifeTime) {
if (_surfaces[i]->_lifeTime > 0 && _surfaces[i]->_valid && (int)(_gameRef->getLiveTimer()->getTime() - _surfaces[i]->_lastUsedTime) >= _surfaces[i]->_lifeTime) {
//_gameRef->QuickMessageForm("Invalidating: %s", _surfaces[i]->_filename);
_surfaces[i]->invalidate();
}
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/base/gfx/base_surface.cpp
Expand Up @@ -129,7 +129,7 @@ bool BaseSurface::invalidate() {

//////////////////////////////////////////////////////////////////////////
bool BaseSurface::prepareToDraw() {
_lastUsedTime = _gameRef->_liveTimer;
_lastUsedTime = _gameRef->getLiveTimer()->getTime();

if (!_valid) {
//_gameRef->LOG(0, "Reviving: %s", _filename);
Expand Down
4 changes: 2 additions & 2 deletions engines/wintermute/base/particles/part_emitter.cpp
Expand Up @@ -252,7 +252,7 @@ bool PartEmitter::update() {
if (!_running) {
return STATUS_OK;
} else {
return updateInternal(_gameRef->_timer, _gameRef->_timerDelta);
return updateInternal(_gameRef->getTimer()->getTime(), _gameRef->getTimer()->getTimeDelta());
}
}

Expand Down Expand Up @@ -353,7 +353,7 @@ bool PartEmitter::start() {
if (_overheadTime > 0) {
uint32 delta = 500;
int steps = _overheadTime / delta;
uint32 currentTime = _gameRef->_timer - _overheadTime;
uint32 currentTime = _gameRef->getTimer()->getTime() - _overheadTime;

for (int i = 0; i < steps; i++) {
updateInternal(currentTime, delta);
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/base/scriptables/script.cpp
Expand Up @@ -1194,7 +1194,7 @@ bool ScScript::sleep(uint32 duration) {
_waitTime = g_system->getMillis() + duration;
_waitFrozen = true;
} else {
_waitTime = _gameRef->_timer + duration;
_waitTime = _gameRef->getTimer()->getTime() + duration;
_waitFrozen = false;
}
return STATUS_OK;
Expand Down
2 changes: 1 addition & 1 deletion engines/wintermute/base/scriptables/script_engine.cpp
Expand Up @@ -285,7 +285,7 @@ bool ScEngine::tick() {
_scripts[i]->run();
}
} else {
if (_scripts[i]->_waitTime <= _gameRef->_timer) {
if (_scripts[i]->_waitTime <= _gameRef->getTimer()->getTime()) {
_scripts[i]->run();
}
}
Expand Down

0 comments on commit 8f25b65

Please sign in to comment.