mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-24 21:21:05 +00:00
BLADERUNNER: Framelimiter simplification
This commit is contained in:
parent
cb88db65cd
commit
89384b9124
@ -169,6 +169,7 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst, const ADGameDescription *des
|
||||
_obstacles = nullptr;
|
||||
_sceneScript = nullptr;
|
||||
_time = nullptr;
|
||||
_framelimiter = nullptr;
|
||||
_gameInfo = nullptr;
|
||||
_waypoints = nullptr;
|
||||
_gameVars = nullptr;
|
||||
@ -217,7 +218,6 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst, const ADGameDescription *des
|
||||
_actors[i] = nullptr;
|
||||
}
|
||||
_debugger = nullptr;
|
||||
_mainLoopFrameLimiter = nullptr;
|
||||
|
||||
walkingReset();
|
||||
|
||||
@ -313,7 +313,6 @@ void BladeRunnerEngine::pauseEngineIntern(bool pause) {
|
||||
}
|
||||
|
||||
Common::Error BladeRunnerEngine::run() {
|
||||
|
||||
Common::Array<Common::String> missingFiles;
|
||||
if (!checkFiles(missingFiles)) {
|
||||
Common::String missingFileStr = "";
|
||||
@ -340,7 +339,6 @@ Common::Error BladeRunnerEngine::run() {
|
||||
return Common::Error(Common::kUnknownError, _("Failed to initialize resources"));
|
||||
}
|
||||
|
||||
|
||||
// improvement: Use a do-while() loop to handle the normal end-game state
|
||||
// so that the game won't exit abruptly after end credits
|
||||
do {
|
||||
@ -486,6 +484,8 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
|
||||
|
||||
_time = new Time(this);
|
||||
|
||||
_framelimiter = new Framelimiter(this);
|
||||
|
||||
// Try to load the SUBTITLES.MIX first, before Startup.MIX
|
||||
// allows overriding any identically named resources (such as the original font files and as a bonus also the TRE files for the UI and dialogue menu)
|
||||
_subtitles = new Subtitles(this);
|
||||
@ -529,8 +529,6 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
|
||||
_cosTable1024 = new Common::CosineTable(1024); // 10-bits = 1024 points for 2*PI;
|
||||
_sinTable1024 = new Common::SineTable(1024);
|
||||
|
||||
_mainLoopFrameLimiter = new Framelimiter(this, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
|
||||
_view = new View();
|
||||
|
||||
_sceneObjects = new SceneObjects(this, _view);
|
||||
@ -898,6 +896,9 @@ void BladeRunnerEngine::shutdown() {
|
||||
_subtitles = nullptr;
|
||||
}
|
||||
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
|
||||
delete _time;
|
||||
_time = nullptr;
|
||||
|
||||
@ -932,11 +933,6 @@ void BladeRunnerEngine::shutdown() {
|
||||
|
||||
delete _screenEffects;
|
||||
_screenEffects = nullptr;
|
||||
|
||||
if (_mainLoopFrameLimiter) {
|
||||
delete _mainLoopFrameLimiter;
|
||||
_mainLoopFrameLimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool BladeRunnerEngine::loadSplash() {
|
||||
@ -965,7 +961,6 @@ bool BladeRunnerEngine::isMouseButtonDown() const {
|
||||
|
||||
void BladeRunnerEngine::gameLoop() {
|
||||
_gameIsRunning = true;
|
||||
_mainLoopFrameLimiter->init();
|
||||
do {
|
||||
if (_playerDead) {
|
||||
playerDied();
|
||||
@ -980,7 +975,6 @@ void BladeRunnerEngine::gameTick() {
|
||||
handleEvents();
|
||||
|
||||
if (!_gameIsRunning || !_windowIsActive) {
|
||||
_mainLoopFrameLimiter->init();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -989,7 +983,6 @@ void BladeRunnerEngine::gameTick() {
|
||||
Common::Error runtimeError = Common::Error(Common::kUnknownError, _("A required game resource was not found"));
|
||||
GUI::MessageDialog dialog(runtimeError.getDesc());
|
||||
dialog.runModal();
|
||||
_mainLoopFrameLimiter->init();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -1124,12 +1117,8 @@ void BladeRunnerEngine::gameTick() {
|
||||
// Without this condition the game may flash back to the game screen
|
||||
// between and ending outtake and the end credits.
|
||||
if (!_gameOver) {
|
||||
if (_mainLoopFrameLimiter->shouldExecuteScreenUpdate()) {
|
||||
blitToScreen(_surfaceFront);
|
||||
_mainLoopFrameLimiter->postScreenUpdate();
|
||||
}
|
||||
blitToScreen(_surfaceFront);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void BladeRunnerEngine::actorsUpdate() {
|
||||
@ -2253,6 +2242,7 @@ void BladeRunnerEngine::ISez(const Common::String &str) {
|
||||
}
|
||||
|
||||
void BladeRunnerEngine::blitToScreen(const Graphics::Surface &src) const {
|
||||
_framelimiter->wait();
|
||||
_system->copyRectToScreen(src.getPixels(), src.pitch, 0, 0, src.w, src.h);
|
||||
_system->updateScreen();
|
||||
}
|
||||
|
@ -166,6 +166,7 @@ public:
|
||||
SuspectsDatabase *_suspectsDatabase;
|
||||
Time *_time;
|
||||
View *_view;
|
||||
Framelimiter *_framelimiter;
|
||||
VK *_vk;
|
||||
Waypoints *_waypoints;
|
||||
int *_gameVars;
|
||||
@ -197,8 +198,6 @@ public:
|
||||
Common::CosineTable *_cosTable1024;
|
||||
Common::SineTable *_sinTable1024;
|
||||
|
||||
Framelimiter *_mainLoopFrameLimiter;
|
||||
|
||||
bool _isWalkingInterruptible;
|
||||
bool _interruptWalking;
|
||||
bool _playerActorIdle;
|
||||
|
@ -24,112 +24,48 @@
|
||||
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/time.h"
|
||||
|
||||
#include "common/debug.h"
|
||||
#include "common/system.h"
|
||||
|
||||
namespace BladeRunner {
|
||||
|
||||
Framelimiter::Framelimiter(BladeRunnerEngine *vm, FramelimiterFpsRate framerateMode, bool useDelayMs) {
|
||||
Framelimiter::Framelimiter(BladeRunnerEngine *vm, uint fps) {
|
||||
_vm = vm;
|
||||
|
||||
// // FUTURE: The frame limiter is disabled when vsync is enabled.
|
||||
// _enabled = !_system->getFeatureState(OSystem::kFeatureVSync);
|
||||
_enabled = true;
|
||||
_useDelayMs = useDelayMs;
|
||||
reset();
|
||||
|
||||
_speedLimitMs = 0u;
|
||||
uint32 framerate = 1u; // dummy init
|
||||
switch (framerateMode) {
|
||||
case kFramelimiter15fps:
|
||||
framerate = 15u;
|
||||
break;
|
||||
case kFramelimiter25fps:
|
||||
framerate = 25u;
|
||||
break;
|
||||
case kFramelimiter30fps:
|
||||
framerate = 30u;
|
||||
break;
|
||||
case kFramelimiter60fps:
|
||||
framerate = 60u;
|
||||
break;
|
||||
case kFramelimiter120fps:
|
||||
framerate = 120u;
|
||||
break;
|
||||
case kFramelimiterDisabled:
|
||||
// fall through
|
||||
default:
|
||||
if (fps > 0) {
|
||||
_enabled = true;
|
||||
_speedLimitMs = 1000 / fps;
|
||||
} else {
|
||||
_enabled = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (_enabled) {
|
||||
_speedLimitMs = 1000 / CLIP<uint32>(framerate, 1, 120);
|
||||
_timeFrameStart = _vm->_time->currentSystem();
|
||||
}
|
||||
|
||||
void Framelimiter::wait() {
|
||||
// TODO: when vsync will be supported, use it
|
||||
|
||||
if (!_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
reset();
|
||||
}
|
||||
|
||||
Framelimiter::~Framelimiter() { }
|
||||
|
||||
void Framelimiter::init(bool forceScreenUpdate) {
|
||||
reset();
|
||||
_timeOfLastPass = _vm->_time->currentSystem();
|
||||
_forceScreenUpdate = forceScreenUpdate;
|
||||
}
|
||||
|
||||
uint32 Framelimiter::getLastFrameDuration() const {
|
||||
return _lastFrameDurationMs;
|
||||
}
|
||||
|
||||
uint32 Framelimiter::getTimeOfCurrentPass() const {
|
||||
return _timeOfCurrentPass;
|
||||
}
|
||||
|
||||
uint32 Framelimiter::getTimeOfLastPass() const {
|
||||
return _timeOfLastPass;
|
||||
}
|
||||
|
||||
bool Framelimiter::shouldExecuteScreenUpdate() {
|
||||
bool shouldUpdateScreen = true;
|
||||
_timeOfCurrentPass = _vm->_time->currentSystem();
|
||||
if (_enabled) {
|
||||
if (_useDelayMs) {
|
||||
// _timeOfCurrentPass is used to calculate the duration that the current frame is on screen so far
|
||||
uint32 frameDuration = _timeOfCurrentPass - _startFrameTime;
|
||||
if (frameDuration < _speedLimitMs) {
|
||||
_vm->_system->delayMillis(_speedLimitMs - frameDuration);
|
||||
// cheaper than calling _vm->_time->currentSystem() again
|
||||
_timeOfCurrentPass += (_speedLimitMs - frameDuration);
|
||||
}
|
||||
}
|
||||
|
||||
shouldUpdateScreen = ((_timeOfCurrentPass - _timeOfLastPass) >= _speedLimitMs) || _forceScreenUpdate || _useDelayMs;
|
||||
|
||||
if (shouldUpdateScreen) {
|
||||
if (_forceScreenUpdate) {
|
||||
_forceScreenUpdate = false;
|
||||
}
|
||||
_lastFrameDurationMs = _timeOfCurrentPass - _startFrameTime;
|
||||
_startFrameTime = _timeOfCurrentPass;
|
||||
}
|
||||
uint32 timeNow = _vm->_time->currentSystem();
|
||||
uint32 frameDuration = timeNow - _timeFrameStart;
|
||||
if (frameDuration < _speedLimitMs) {
|
||||
uint32 wait = _speedLimitMs - frameDuration;
|
||||
_vm->_system->delayMillis(wait);
|
||||
timeNow += wait;
|
||||
}
|
||||
return shouldUpdateScreen;
|
||||
}
|
||||
|
||||
void Framelimiter::postScreenUpdate() {
|
||||
_timeOfLastPass = _timeOfCurrentPass;
|
||||
// if (_enabled) {
|
||||
// // for debug purposes, this calculates the time between deciding to draw the frame, and the time after drawing the update to the screen
|
||||
// uint32 endFrameTime = _vm->_time->currentSystem();
|
||||
// uint32 frameDuration = endFrameTime - _startFrameTime;
|
||||
// }
|
||||
// debug("frametime %i ms", timeNow - _timeFrameStart);
|
||||
// using _vm->_time->currentSystem() here is slower and causes some shutters
|
||||
_timeFrameStart = timeNow;
|
||||
}
|
||||
|
||||
void Framelimiter::reset() {
|
||||
_forceScreenUpdate = false;
|
||||
_timeOfLastPass = 0u;
|
||||
_timeOfCurrentPass = 0u;
|
||||
_startFrameTime = 0u;
|
||||
_lastFrameDurationMs = _speedLimitMs;
|
||||
_timeFrameStart = 0u;
|
||||
}
|
||||
|
||||
} // End of namespace BladeRunner
|
||||
|
@ -27,56 +27,23 @@
|
||||
|
||||
namespace BladeRunner {
|
||||
|
||||
enum FramelimiterFpsRate {
|
||||
kFramelimiterDisabled = 0,
|
||||
kFramelimiter15fps = 1,
|
||||
kFramelimiter25fps = 2,
|
||||
kFramelimiter30fps = 3,
|
||||
kFramelimiter60fps = 4,
|
||||
kFramelimiter120fps = 5
|
||||
};
|
||||
|
||||
class BladeRunnerEngine;
|
||||
|
||||
class Framelimiter {
|
||||
friend class Debugger;
|
||||
|
||||
public:
|
||||
static const FramelimiterFpsRate kDefaultFpsRate = kFramelimiter60fps;
|
||||
static const bool kDefaultUseDelayMillis = true;
|
||||
|
||||
private:
|
||||
BladeRunnerEngine *_vm;
|
||||
|
||||
bool _forceScreenUpdate;
|
||||
bool _enabled;
|
||||
uint32 _speedLimitMs;
|
||||
|
||||
// A pass is when a tick or while loop that contains a potential screen update is repeated
|
||||
// it's essentially when the check is made for a screen update
|
||||
// Not every pass will necessarily result in a screen update (because that's the purpose of the frame limiter)
|
||||
// So the "_startFrameTime" is not always equal to "_timeOfCurrentPass"
|
||||
uint32 _timeOfLastPass;
|
||||
uint32 _timeOfCurrentPass;
|
||||
|
||||
uint32 _startFrameTime; // is updated and valid, only if the current pass will result in a screen update (see method: shouldExecuteScreenUpdate())
|
||||
uint32 _lastFrameDurationMs; // can be used for average FPS calculation and display purposes when frame limiter is enabled
|
||||
|
||||
bool _enabled;
|
||||
bool _useDelayMs; // true: will use calls to delayMillis(), false: will use non-blocking software timer instead
|
||||
uint32 _timeFrameStart;
|
||||
|
||||
public:
|
||||
Framelimiter(BladeRunnerEngine *vm, FramelimiterFpsRate framerateMode, bool useDelayMs);
|
||||
~Framelimiter();
|
||||
Framelimiter(BladeRunnerEngine *vm, uint fps = 60);
|
||||
|
||||
// void pause(bool pause);
|
||||
|
||||
void init(bool forceScreenUpdate = true);
|
||||
uint32 getLastFrameDuration() const;
|
||||
uint32 getTimeOfCurrentPass() const;
|
||||
uint32 getTimeOfLastPass() const;
|
||||
|
||||
bool shouldExecuteScreenUpdate();
|
||||
void postScreenUpdate();
|
||||
void wait();
|
||||
|
||||
private:
|
||||
void reset();
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/chapters.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/subtitles.h"
|
||||
#include "bladerunner/vqa_player.h"
|
||||
#include "bladerunner/time.h"
|
||||
@ -38,16 +37,10 @@ namespace BladeRunner {
|
||||
OuttakePlayer::OuttakePlayer(BladeRunnerEngine *vm) {
|
||||
_vm = vm;
|
||||
_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, _vm->_surfaceBack.format);
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
OuttakePlayer::~OuttakePlayer() {
|
||||
_surfaceVideo.free();
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void OuttakePlayer::play(const Common::String &name, bool noLocalization, int container) {
|
||||
@ -77,17 +70,10 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co
|
||||
_vm->_vqaIsPlaying = true;
|
||||
_vm->_vqaStopIsRequested = false;
|
||||
|
||||
_framelimiter->init();
|
||||
|
||||
while (!_vm->_vqaStopIsRequested && !_vm->shouldQuit()) {
|
||||
_vm->handleEvents();
|
||||
|
||||
if (!_vm->_windowIsActive) {
|
||||
_framelimiter->init();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -102,7 +88,6 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co
|
||||
_vm->_subtitles->tickOuttakes(_vm->_surfaceFront);
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
}
|
||||
_framelimiter->postScreenUpdate();
|
||||
}
|
||||
|
||||
_vm->_vqaIsPlaying = false;
|
||||
|
@ -30,11 +30,9 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
|
||||
class OuttakePlayer {
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
|
||||
Graphics::Surface _surfaceVideo;
|
||||
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include "bladerunner/actor.h"
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/audio_player.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/game_info.h"
|
||||
#include "bladerunner/mouse.h"
|
||||
#include "bladerunner/shape.h"
|
||||
@ -45,17 +44,11 @@ Elevator::Elevator(BladeRunnerEngine *vm) {
|
||||
_vm = vm;
|
||||
reset();
|
||||
_imagePicker = new UIImagePicker(vm, 8);
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
Elevator::~Elevator() {
|
||||
delete _imagePicker;
|
||||
_imagePicker = nullptr;
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
int Elevator::activate(int elevatorId) {
|
||||
@ -194,7 +187,6 @@ int Elevator::activate(int elevatorId) {
|
||||
void Elevator::open() {
|
||||
resetDescription();
|
||||
_isOpen = true;
|
||||
_framelimiter->init();
|
||||
}
|
||||
|
||||
bool Elevator::isOpen() const {
|
||||
@ -213,35 +205,32 @@ int Elevator::handleMouseDown(int x, int y) {
|
||||
|
||||
void Elevator::tick() {
|
||||
if (!_vm->_windowIsActive) {
|
||||
_framelimiter->init();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
int frame = _vqaPlayer->update();
|
||||
assert(frame >= -1);
|
||||
int frame = _vqaPlayer->update();
|
||||
assert(frame >= -1);
|
||||
|
||||
// vqaPlayer renders to _surfaceBack
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
// vqaPlayer renders to _surfaceBack
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
|
||||
Common::Point p = _vm->getMousePos();
|
||||
Common::Point p = _vm->getMousePos();
|
||||
|
||||
// TODO(madmoose): BLADE.EXE has hasHoveredImage before handleMouseAction?
|
||||
_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
|
||||
if (_imagePicker->hasHoveredImage()) {
|
||||
_vm->_mouse->setCursor(1);
|
||||
} else {
|
||||
_vm->_mouse->setCursor(0);
|
||||
}
|
||||
|
||||
_imagePicker->draw(_vm->_surfaceFront);
|
||||
_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
|
||||
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
_framelimiter->postScreenUpdate();
|
||||
// TODO(madmoose): BLADE.EXE has hasHoveredImage before handleMouseAction?
|
||||
_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
|
||||
if (_imagePicker->hasHoveredImage()) {
|
||||
_vm->_mouse->setCursor(1);
|
||||
} else {
|
||||
_vm->_mouse->setCursor(0);
|
||||
}
|
||||
|
||||
_imagePicker->draw(_vm->_surfaceFront);
|
||||
_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
|
||||
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
tickDescription();
|
||||
}
|
||||
|
||||
|
@ -28,14 +28,12 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
class Shape;
|
||||
class VQAPlayer;
|
||||
class UIImagePicker;
|
||||
|
||||
class Elevator {
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
bool _isOpen;
|
||||
VQAPlayer *_vqaPlayer;
|
||||
int _buttonClicked;
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include "bladerunner/game_constants.h"
|
||||
#include "bladerunner/ambient_sounds.h"
|
||||
#include "bladerunner/audio_speech.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/font.h"
|
||||
#include "bladerunner/game_info.h"
|
||||
#include "bladerunner/mouse.h"
|
||||
@ -42,14 +41,9 @@ namespace BladeRunner {
|
||||
|
||||
EndCredits::EndCredits(BladeRunnerEngine *vm) {
|
||||
_vm = vm;
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
EndCredits::~EndCredits() {
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void EndCredits::show() {
|
||||
@ -98,7 +92,7 @@ void EndCredits::show() {
|
||||
_vm->_vqaStopIsRequested = false;
|
||||
|
||||
double position = 0.0;
|
||||
_framelimiter->init();
|
||||
uint32 timeLast = _vm->_time->currentSystem();
|
||||
|
||||
while (!_vm->_vqaStopIsRequested && !_vm->shouldQuit()) {
|
||||
if (position >= textPositions[textCount - 1]) {
|
||||
@ -109,15 +103,13 @@ void EndCredits::show() {
|
||||
_vm->handleEvents();
|
||||
|
||||
if (!_vm->_windowIsActive) {
|
||||
_framelimiter->init();
|
||||
timeLast = _vm->_time->currentSystem();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
position += (double)(_framelimiter->getTimeOfCurrentPass() - _framelimiter->getTimeOfLastPass()) * 0.05f; // unsigned difference is intentional
|
||||
uint32 timeNow = _vm->_time->currentSystem();
|
||||
position += (double)(timeNow - timeLast) * 0.05f; // unsigned difference is intentional
|
||||
timeLast = timeNow;
|
||||
|
||||
_vm->_surfaceFront.fillRect(Common::Rect(640, 480), 0);
|
||||
|
||||
@ -154,7 +146,6 @@ void EndCredits::show() {
|
||||
_vm->_surfaceFront.fillRect(Common::Rect(0, 452, 640, 480), 0);
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
_framelimiter->postScreenUpdate();
|
||||
}
|
||||
|
||||
_vm->_vqaIsPlaying = false;
|
||||
|
@ -26,11 +26,9 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
|
||||
class EndCredits {
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
|
||||
public:
|
||||
EndCredits(BladeRunnerEngine *vm);
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/debugger.h"
|
||||
#include "bladerunner/decompress_lcw.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/font.h"
|
||||
#include "bladerunner/game_info.h"
|
||||
#include "bladerunner/mouse.h"
|
||||
@ -67,17 +66,11 @@ ESPER::ESPER(BladeRunnerEngine *vm) {
|
||||
reset();
|
||||
|
||||
_buttons = new UIImagePicker(vm, kPhotoCount + 4);
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
ESPER::~ESPER() {
|
||||
delete _buttons;
|
||||
reset();
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void ESPER::open(Graphics::Surface *surface) {
|
||||
@ -122,8 +115,6 @@ void ESPER::open(Graphics::Surface *surface) {
|
||||
_vqaPlayerMain->setLoop(2, -1, kLoopSetModeJustStart, nullptr, nullptr);
|
||||
|
||||
_isOpen = true;
|
||||
_framelimiter->init();
|
||||
|
||||
_flash = false;
|
||||
|
||||
_script = new ESPERScript(_vm);
|
||||
@ -216,36 +207,31 @@ void ESPER::handleMouseDown(int x, int y, bool mainButton) {
|
||||
|
||||
void ESPER::tick() {
|
||||
if (!_vm->_windowIsActive) {
|
||||
_framelimiter->init();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
tickSound();
|
||||
tickSound();
|
||||
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
|
||||
int mouseX, mouseY;
|
||||
_vm->_mouse->getXY(&mouseX, &mouseY);
|
||||
if (!_vm->_mouse->isDisabled()) {
|
||||
_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
|
||||
}
|
||||
|
||||
if (!_isOpen) {
|
||||
return;
|
||||
}
|
||||
|
||||
draw(_vm->_surfaceFront);
|
||||
_buttons->draw(_vm->_surfaceFront);
|
||||
drawMouse(_vm->_surfaceFront);
|
||||
|
||||
tickSound();
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
_framelimiter->postScreenUpdate();
|
||||
int mouseX, mouseY;
|
||||
_vm->_mouse->getXY(&mouseX, &mouseY);
|
||||
if (!_vm->_mouse->isDisabled()) {
|
||||
_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
|
||||
}
|
||||
|
||||
if (!_isOpen) {
|
||||
return;
|
||||
}
|
||||
|
||||
draw(_vm->_surfaceFront);
|
||||
_buttons->draw(_vm->_surfaceFront);
|
||||
drawMouse(_vm->_surfaceFront);
|
||||
|
||||
tickSound();
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
if (_statePhoto == kEsperPhotoStateVideoShow) {
|
||||
if (_regionSelectedAck) {
|
||||
_regionSelectedAck = false;
|
||||
|
@ -31,7 +31,6 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
class Font;
|
||||
class Shape;
|
||||
class VQAPlayer;
|
||||
@ -88,7 +87,6 @@ class ESPER {
|
||||
};
|
||||
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
ESPERScript *_script;
|
||||
|
||||
bool _isWaiting;
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include "bladerunner/audio_player.h"
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/combat.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/font.h"
|
||||
#include "bladerunner/game_constants.h"
|
||||
#include "bladerunner/game_flags.h"
|
||||
@ -81,6 +80,7 @@ KIA::KIA(BladeRunnerEngine *vm) {
|
||||
_playerPhotograph = nullptr;
|
||||
_playerSliceModelId = -1;
|
||||
_playerSliceModelAngle = 0.0f;
|
||||
_timeLast = _vm->_time->currentSystem();
|
||||
_playerActorDialogueQueuePosition = 0;
|
||||
_playerActorDialogueQueueSize = 0;
|
||||
_playerActorDialogueState = 0;
|
||||
@ -110,9 +110,6 @@ KIA::KIA(BladeRunnerEngine *vm) {
|
||||
_playerActorDialogueQueue[i].actorId = -1;
|
||||
_playerActorDialogueQueue[i].sentenceId = -1;
|
||||
}
|
||||
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
_framelimiter->init();
|
||||
}
|
||||
|
||||
KIA::~KIA() {
|
||||
@ -136,11 +133,6 @@ KIA::~KIA() {
|
||||
delete _shapes;
|
||||
delete _log;
|
||||
delete _script;
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void KIA::reset() {
|
||||
@ -238,13 +230,9 @@ void KIA::tick() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 timeNow = _framelimiter->getTimeOfCurrentPass();
|
||||
uint32 timeNow = _vm->_time->currentSystem();
|
||||
// unsigned difference is intentional
|
||||
uint32 timeDiff = timeNow - _framelimiter->getTimeOfLastPass();
|
||||
uint32 timeDiff = timeNow - _timeLast;
|
||||
|
||||
if (_playerActorDialogueQueueSize == _playerActorDialogueQueuePosition) {
|
||||
_playerActorDialogueState = 0;
|
||||
@ -396,7 +384,7 @@ void KIA::tick() {
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
_framelimiter->postScreenUpdate();
|
||||
_timeLast = timeNow;
|
||||
}
|
||||
|
||||
void KIA::resume() {
|
||||
@ -691,8 +679,7 @@ void KIA::init() {
|
||||
playerReset();
|
||||
_playerVqaFrame = 0;
|
||||
_playerVqaTimeLast = _vm->_time->currentSystem();
|
||||
|
||||
_framelimiter->init();
|
||||
_timeLast = _vm->_time->currentSystem();
|
||||
|
||||
if (_vm->_gameFlags->query(kFlagKIAPrivacyAddon) && !_vm->_gameFlags->query(kFlagKIAPrivacyAddonIntro)) {
|
||||
_vm->_gameFlags->set(kFlagKIAPrivacyAddonIntro);
|
||||
|
@ -34,7 +34,6 @@ struct KeyState;
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
class KIALog;
|
||||
class KIAScript;
|
||||
class KIASectionBase;
|
||||
@ -76,7 +75,6 @@ class KIA {
|
||||
};
|
||||
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
|
||||
int _transitionId;
|
||||
|
||||
@ -89,7 +87,7 @@ class KIA {
|
||||
int _playerSliceModelId;
|
||||
float _playerSliceModelAngle;
|
||||
Graphics::Surface _playerImage;
|
||||
// uint32 _timeLast;
|
||||
uint32 _timeLast;
|
||||
|
||||
ActorDialogueQueueEntry _playerActorDialogueQueue[kPlayerActorDialogueQueueCapacity];
|
||||
int _playerActorDialogueQueuePosition;
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "bladerunner/ambient_sounds.h"
|
||||
#include "bladerunner/game_info.h"
|
||||
#include "bladerunner/subtitles.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/game_constants.h"
|
||||
#include "bladerunner/mouse.h"
|
||||
#include "bladerunner/savefile.h"
|
||||
@ -49,7 +48,6 @@ Spinner::Spinner(BladeRunnerEngine *vm) {
|
||||
reset();
|
||||
_imagePicker = new UIImagePicker(vm, kSpinnerDestinations);
|
||||
_vqaPlayer = nullptr;
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
Spinner::~Spinner() {
|
||||
@ -61,11 +59,6 @@ Spinner::~Spinner() {
|
||||
_vqaPlayer->close();
|
||||
delete _vqaPlayer;
|
||||
}
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void Spinner::setSelectableDestinationFlag(int destination, bool selectable) {
|
||||
@ -237,7 +230,6 @@ void Spinner::mouseUpCallback(int destinationImage, void *self) {
|
||||
|
||||
void Spinner::open() {
|
||||
_isOpen = true;
|
||||
_framelimiter->init();
|
||||
}
|
||||
|
||||
bool Spinner::isOpen() const {
|
||||
@ -256,35 +248,30 @@ int Spinner::handleMouseDown(int x, int y) {
|
||||
|
||||
void Spinner::tick() {
|
||||
if (!_vm->_windowIsActive) {
|
||||
_framelimiter->init();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
int frame = _vqaPlayer->update();
|
||||
assert(frame >= -1);
|
||||
int frame = _vqaPlayer->update();
|
||||
assert(frame >= -1);
|
||||
|
||||
// vqaPlayer renders to _surfaceBack
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
|
||||
Common::Point p = _vm->getMousePos();
|
||||
_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
|
||||
if (_imagePicker->hasHoveredImage()) {
|
||||
_vm->_mouse->setCursor(1);
|
||||
} else {
|
||||
_vm->_mouse->setCursor(0);
|
||||
}
|
||||
_imagePicker->draw(_vm->_surfaceFront);
|
||||
_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
|
||||
_imagePicker->drawTooltip(_vm->_surfaceFront, p.x, p.y);
|
||||
|
||||
if (_vm->_cutContent) {
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
}
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
_framelimiter->postScreenUpdate();
|
||||
// vqaPlayer renders to _surfaceBack
|
||||
blit(_vm->_surfaceBack, _vm->_surfaceFront);
|
||||
|
||||
Common::Point p = _vm->getMousePos();
|
||||
_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
|
||||
if (_imagePicker->hasHoveredImage()) {
|
||||
_vm->_mouse->setCursor(1);
|
||||
} else {
|
||||
_vm->_mouse->setCursor(0);
|
||||
}
|
||||
_imagePicker->draw(_vm->_surfaceFront);
|
||||
_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
|
||||
_imagePicker->drawTooltip(_vm->_surfaceFront, p.x, p.y);
|
||||
|
||||
if (_vm->_cutContent) {
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
}
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
if (_vm->_cutContent) {
|
||||
tickDescription();
|
||||
|
@ -29,7 +29,6 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
class SaveFileReadStream;
|
||||
class SaveFileWriteStream;
|
||||
class Shape;
|
||||
@ -45,7 +44,6 @@ class Spinner {
|
||||
};
|
||||
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
bool _isDestinationSelectable[kSpinnerDestinations];
|
||||
bool _isOpen;
|
||||
VQAPlayer *_vqaPlayer;
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include "bladerunner/audio_player.h"
|
||||
#include "bladerunner/bladerunner.h"
|
||||
#include "bladerunner/combat.h"
|
||||
#include "bladerunner/framelimiter.h"
|
||||
#include "bladerunner/font.h"
|
||||
#include "bladerunner/game_constants.h"
|
||||
#include "bladerunner/game_flags.h"
|
||||
@ -54,16 +53,10 @@ VK::VK(BladeRunnerEngine *vm) {
|
||||
_vm = vm;
|
||||
|
||||
reset();
|
||||
_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
|
||||
}
|
||||
|
||||
VK::~VK() {
|
||||
reset();
|
||||
|
||||
if (_framelimiter) {
|
||||
delete _framelimiter;
|
||||
_framelimiter = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void VK::open(int actorId, int calibrationRatio) {
|
||||
@ -133,7 +126,6 @@ void VK::open(int actorId, int calibrationRatio) {
|
||||
}
|
||||
|
||||
_isOpen = true;
|
||||
_framelimiter->init();
|
||||
|
||||
_script = new VKScript(_vm);
|
||||
|
||||
@ -198,32 +190,28 @@ void VK::close() {
|
||||
}
|
||||
|
||||
void VK::tick() {
|
||||
|
||||
if (_framelimiter->shouldExecuteScreenUpdate()) {
|
||||
int mouseX, mouseY;
|
||||
_vm->_mouse->getXY(&mouseX, &mouseY);
|
||||
if (!_vm->_mouse->isDisabled()) {
|
||||
_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
|
||||
}
|
||||
|
||||
draw();
|
||||
|
||||
if ( _vm->_debugger->_showStatsVk
|
||||
&& !_vm->_actors[_actorId]->isSpeeching()
|
||||
&& !_vm->_actors[kActorMcCoy]->isSpeeching()
|
||||
&& !_vm->_actors[kActorAnsweringMachine]->isSpeeching()
|
||||
&& !_isClosing
|
||||
) {
|
||||
_vm->_subtitles->setGameSubsText(Common::String::format("Calibration: %02d Ratio: %02d Anxiety: %02d%%\nReplicant: %02d%% Human: %02d%%", _calibration, _calibrationRatio, _anxiety, _replicantProbability, _humanProbability), true);
|
||||
_vm->_subtitles->show();
|
||||
}
|
||||
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
_framelimiter->postScreenUpdate();
|
||||
int mouseX, mouseY;
|
||||
_vm->_mouse->getXY(&mouseX, &mouseY);
|
||||
if (!_vm->_mouse->isDisabled()) {
|
||||
_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
|
||||
}
|
||||
|
||||
draw();
|
||||
|
||||
if ( _vm->_debugger->_showStatsVk
|
||||
&& !_vm->_actors[_actorId]->isSpeeching()
|
||||
&& !_vm->_actors[kActorMcCoy]->isSpeeching()
|
||||
&& !_vm->_actors[kActorAnsweringMachine]->isSpeeching()
|
||||
&& !_isClosing
|
||||
) {
|
||||
_vm->_subtitles->setGameSubsText(Common::String::format("Calibration: %02d Ratio: %02d Anxiety: %02d%%\nReplicant: %02d%% Human: %02d%%", _calibration, _calibrationRatio, _anxiety, _replicantProbability, _humanProbability), true);
|
||||
_vm->_subtitles->show();
|
||||
}
|
||||
|
||||
_vm->_subtitles->tick(_vm->_surfaceFront);
|
||||
|
||||
_vm->blitToScreen(_vm->_surfaceFront);
|
||||
|
||||
// unsigned difference is intentional
|
||||
if (_isClosing && (_vm->_time->current() - _timeCloseStart >= 3000u) && !_script->isInsideScript()) {
|
||||
close();
|
||||
|
@ -31,7 +31,6 @@
|
||||
namespace BladeRunner {
|
||||
|
||||
class BladeRunnerEngine;
|
||||
class Framelimiter;
|
||||
class VKScript;
|
||||
class Shape;
|
||||
class UIImagePicker;
|
||||
@ -48,7 +47,6 @@ class VK {
|
||||
};
|
||||
|
||||
BladeRunnerEngine *_vm;
|
||||
Framelimiter *_framelimiter;
|
||||
|
||||
VKScript *_script;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user