aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/overlays.cpp
diff options
context:
space:
mode:
authorThanasis Antoniou2019-03-31 12:23:01 +0300
committerThanasis Antoniou2019-03-31 12:24:23 +0300
commit20d77710c98ace3a018244586c08ab82bb9b5c41 (patch)
tree95fdbb9493a9be97376085ad01f7fc7b7e36cfeb /engines/bladerunner/overlays.cpp
parentfa50678125ed51ccdbf9362762b520ecfa6be423 (diff)
downloadscummvm-rg350-20d77710c98ace3a018244586c08ab82bb9b5c41.tar.gz
scummvm-rg350-20d77710c98ace3a018244586c08ab82bb9b5c41.tar.bz2
scummvm-rg350-20d77710c98ace3a018244586c08ab82bb9b5c41.zip
BLADERUNNER: Release non-repeated and support queued overlays
Diffstat (limited to 'engines/bladerunner/overlays.cpp')
-rw-r--r--engines/bladerunner/overlays.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/engines/bladerunner/overlays.cpp b/engines/bladerunner/overlays.cpp
index 5bbac87c36..20e93b22e3 100644
--- a/engines/bladerunner/overlays.cpp
+++ b/engines/bladerunner/overlays.cpp
@@ -23,6 +23,7 @@
#include "bladerunner/overlays.h"
#include "bladerunner/bladerunner.h"
+#include "bladerunner/game_constants.h"
#include "bladerunner/archive.h"
#include "bladerunner/savefile.h"
@@ -58,6 +59,10 @@ Overlays::~Overlays() {
int Overlays::play(const Common::String &name, int loopId, bool loopForever, bool startNow, int a6) {
assert(name.size() <= 12);
+ if (loopId < 0) {
+ warning("Overlays::play - loop id can't be a negative number!");
+ return -1;
+ }
int32 hash = MIXArchive::getHash(name);
int index = findByHash(hash);
@@ -70,20 +75,38 @@ int Overlays::play(const Common::String &name, int loopId, bool loopForever, boo
_videos[index].name = name;
_videos[index].hash = hash;
_videos[index].loopId = loopId;
+ _videos[index].enqueuedLoopId = -1;
_videos[index].loopForever = loopForever;
_videos[index].vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceFront, Common::String::format("%s.VQA", name.c_str()));
+ if (!_videos[index].vqaPlayer) {
+ resetSingle(index);
+ return -1;
+ }
+ // TODO? Removed as redundant
// repeat forever
- _videos[index].vqaPlayer->setBeginAndEndFrame(0, 0, -1, kLoopSetModeJustStart, nullptr, nullptr);
+ //_videos[index].vqaPlayer->setBeginAndEndFrame(0, 0, -1, kLoopSetModeJustStart, nullptr, nullptr);
}
- _videos[index].vqaPlayer->open();
- _videos[index].vqaPlayer->setLoop(
- loopId,
- loopForever ? -1 : 0,
- startNow ? kLoopSetModeImmediate : kLoopSetModeEnqueue,
- nullptr, nullptr);
+ bool skipNewVQAPlayerOpen = false;
+ if (_videos[index].vqaPlayer
+ && !startNow
+ && _videos[index].vqaPlayer->getFrameCount() > 0
+ ) {
+ skipNewVQAPlayerOpen = true;
+ _videos[index].enqueuedLoopId = loopId;
+ }
+ if (skipNewVQAPlayerOpen || _videos[index].vqaPlayer->open()) {
+ _videos[index].vqaPlayer->setLoop(
+ loopId,
+ loopForever ? -1 : 0,
+ startNow ? kLoopSetModeImmediate : kLoopSetModeEnqueue,
+ nullptr, nullptr);
+ } else {
+ resetSingle(index);
+ return -1;
+ }
return index;
}
@@ -179,7 +202,12 @@ void Overlays::save(SaveFileWriteStream &f) {
f.writeInt(0); // vqaPlayer pointer
f.writeStringSz(ov.name, 13);
f.writeSint32LE(ov.hash);
- f.writeInt(ov.loopId);
+ if (ov.enqueuedLoopId != -1) {
+ // When there is an enqueued video, save that loop Id instead
+ f.writeInt(ov.enqueuedLoopId);
+ } else {
+ f.writeInt(ov.loopId);
+ }
f.writeBool(ov.loopForever);
f.writeInt(ov.frame);
}