aboutsummaryrefslogtreecommitdiff
path: root/engines/agos/animation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agos/animation.cpp')
-rw-r--r--engines/agos/animation.cpp77
1 files changed, 50 insertions, 27 deletions
diff --git a/engines/agos/animation.cpp b/engines/agos/animation.cpp
index 1e1eaaf7e9..8748cff54e 100644
--- a/engines/agos/animation.cpp
+++ b/engines/agos/animation.cpp
@@ -30,6 +30,7 @@
#include "common/system.h"
#include "graphics/cursorman.h"
+#include "graphics/surface.h"
#include "agos/animation.h"
#include "agos/intern.h"
@@ -44,6 +45,8 @@ MoviePlayer::MoviePlayer(AGOSEngine *vm, Audio::Mixer *mixer)
: DXAPlayer(), _vm(vm), _mixer(mixer) {
_omniTV = false;
+ _omniTVFile = 0;
+
_leftButtonDown = false;
_rightButtonDown = false;
@@ -103,25 +106,31 @@ bool MoviePlayer::load(const char *filename) {
void MoviePlayer::playOmniTV() {
// Load OmniTV video
- if (!_fd.isOpen()) {
- _vm->_variableArray[254] = 6747;
- return;
- } else {
+ if (_fd) {
_vm->setBitFlag(42, false);
_omniTV = true;
startSound();
- return;
+ } else {
+ if (_omniTVFile) {
+ // Restore state
+ _fd = _omniTVFile;
+ _mixer->pauseHandle(_omniTVSound, false);
+
+ _vm->setBitFlag(42, false);
+ _omniTV = true;
+ } else {
+ _vm->_variableArray[254] = 6747;
+ }
}
}
void MoviePlayer::play() {
- // The OmniTV videos were not included with Amiga and Macintosh versions.
- if (_vm->getPlatform() == Common::kPlatformWindows && _vm->getBitFlag(40)) {
+ if (_vm->getBitFlag(40)) {
playOmniTV();
return;
}
- if (!_fd.isOpen()) {
+ if (!_fd) {
return;
}
@@ -132,7 +141,7 @@ void MoviePlayer::play() {
// Resolution is smaller in Amiga verison so always clear screen
if (_width == 384 && _height == 280) {
- memset(_vm->_frontBuf, 0, _vm->_screenHeight * _vm->_screenWidth);
+ _vm->clearSurfaces();
}
_ticks = _vm->_system->getMillis();
@@ -147,14 +156,15 @@ void MoviePlayer::play() {
_vm->o_killAnimate();
if (_vm->getBitFlag(41)) {
- memcpy(_vm->_backBuf, _vm->_frontBuf, _frameSize);
+ _vm->fillBackFromFront();
} else {
uint8 palette[1024];
memset(palette, 0, sizeof(palette));
- _vm->clearSurfaces(480);
+ _vm->clearSurfaces();
_vm->_system->setPalette(palette, 0, 256);
}
+ _vm->fillBackGroundFromBack();
_vm->_fastFadeOutFlag = true;
}
@@ -162,14 +172,14 @@ void MoviePlayer::startSound() {
byte *buffer;
uint32 offset, size, tag;
- tag = _fd.readUint32BE();
+ tag = _fd->readUint32BE();
if (tag == MKID_BE('WAVE')) {
- size = _fd.readUint32BE();
+ size = _fd->readUint32BE();
if (_sequenceNum) {
Common::File in;
- _fd.seek(size, SEEK_CUR);
+ _fd->seek(size, SEEK_CUR);
in.open((const char *)"audio.wav");
if (!in.isOpen()) {
@@ -186,7 +196,7 @@ void MoviePlayer::startSound() {
in.close();
} else {
buffer = (byte *)malloc(size);
- _fd.read(buffer, size);
+ _fd->read(buffer, size);
}
Common::MemoryReadStream stream(buffer, size);
@@ -197,8 +207,13 @@ void MoviePlayer::startSound() {
}
if (_bgSoundStream != NULL) {
- _mixer->stopHandle(_bgSound);
- _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream);
+ if (_omniTV) {
+ _mixer->stopHandle(_omniTVSound);
+ _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_omniTVSound, _bgSoundStream);
+ } else {
+ _mixer->stopHandle(_bgSound);
+ _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream);
+ }
}
}
@@ -207,8 +222,12 @@ void MoviePlayer::nextFrame() {
return;
if (_vm->getBitFlag(42)) {
+ // Save state
+ _omniTVFile = _fd;
+ _mixer->pauseHandle(_omniTVSound, true);
+
+ _fd = 0;
_omniTV = false;
- closeFile();
return;
}
@@ -223,6 +242,7 @@ void MoviePlayer::nextFrame() {
_frameNum++;
} else {
_omniTV = false;
+ _omniTVFile = 0;
closeFile();
_vm->_variableArray[254] = 6747;
}
@@ -230,9 +250,8 @@ void MoviePlayer::nextFrame() {
void MoviePlayer::handleNextFrame() {
decodeNextFrame();
- processFrame();
-
- _vm->_system->updateScreen();
+ if (processFrame())
+ _vm->_system->updateScreen();
_frameNum++;
Common::Event event;
@@ -285,9 +304,10 @@ void MoviePlayer::setPalette(byte *pal) {
_vm->_system->setPalette(palette, 0, 256);
}
-void MoviePlayer::processFrame() {
- copyFrameToBuffer(_vm->getFrontBuf(), (_vm->_screenWidth - _width) / 2, (_vm->_screenHeight - _height) / 2, _vm->_screenWidth);
- _vm->_system->copyRectToScreen(_vm->getFrontBuf(), _vm->_screenWidth, 0, 0, _vm->_screenWidth, _vm->_screenHeight);
+bool MoviePlayer::processFrame() {
+ Graphics::Surface *screen = _vm->_system->lockScreen();
+ copyFrameToBuffer((byte *)screen->pixels, (_vm->_screenWidth - _width) / 2, (_vm->_screenHeight - _height) / 2, _vm->_screenWidth);
+ _vm->_system->unlockScreen();
if ((_bgSoundStream == NULL) || ((int)(_mixer->getSoundElapsedTime(_bgSound) * _framesPerSec) / 1000 < _frameNum + 1) ||
_frameSkipped > _framesPerSec) {
@@ -309,10 +329,13 @@ void MoviePlayer::processFrame() {
while (_vm->_system->getMillis() < _ticks)
_vm->_system->delayMillis(10);
}
- } else {
- warning("dropped frame %i", _frameNum);
- _frameSkipped++;
+
+ return true;
}
+
+ warning("dropped frame %i", _frameNum);
+ _frameSkipped++;
+ return false;
}
const char * MoviePlayer::_sequenceList[90] = {