diff options
author | Travis Howell | 2006-04-24 10:24:56 +0000 |
---|---|---|
committer | Travis Howell | 2006-04-24 10:24:56 +0000 |
commit | 8632282db31ace6d7be32f5c733a08974e33b2ad (patch) | |
tree | ce1b4edc84261492d6ddaf876c73ba6d15de8b11 /engines/simon | |
parent | 9743de2acf3c8824e5fe5c53c0c47ea14aedb20a (diff) | |
download | scummvm-rg350-8632282db31ace6d7be32f5c733a08974e33b2ad.tar.gz scummvm-rg350-8632282db31ace6d7be32f5c733a08974e33b2ad.tar.bz2 scummvm-rg350-8632282db31ace6d7be32f5c733a08974e33b2ad.zip |
Add support for OmniTV
svn-id: r22136
Diffstat (limited to 'engines/simon')
-rw-r--r-- | engines/simon/animation.cpp | 185 | ||||
-rw-r--r-- | engines/simon/animation.h | 6 | ||||
-rw-r--r-- | engines/simon/simon.cpp | 39 |
3 files changed, 153 insertions, 77 deletions
diff --git a/engines/simon/animation.cpp b/engines/simon/animation.cpp index e723d76282..bc056cb51e 100644 --- a/engines/simon/animation.cpp +++ b/engines/simon/animation.cpp @@ -41,10 +41,9 @@ namespace Simon { MoviePlayer::MoviePlayer(SimonEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) { - _frameNum = 0; - _frameSkipped = 0; - + _omniTV = false; _playing = false; + _leftButtonDown = false; _rightButtonDown = false; @@ -97,6 +96,7 @@ bool MoviePlayer::load(const char *filename) { _width = _fd.readUint16BE(); _height = _fd.readUint16BE(); debug(0, "frames_count %d width %d height %d rate %d ticks %d", _framesCount, _width, _height, _frameRate, _frameTicks); + _frameSize = _width * _height; _frameBuffer1 = (uint8 *)malloc(_frameSize); _frameBuffer2 = (uint8 *)malloc(_frameSize); @@ -110,69 +110,45 @@ bool MoviePlayer::load(const char *filename) { return true; } -void MoviePlayer::play() { +void MoviePlayer::playOmniTV() { + // Load OmniTV video if (_fd.isOpen() == false) { - // Load OmniTV video - if (_vm->getBitFlag(40)) { - _vm->_variableArray[254] = 6747; - return; - } else { - debug(0, "MoviePlayer::play: No file loaded"); - return; - } + _vm->_variableArray[254] = 6747; + return; + } else { + _vm->setBitFlag(42, false); + _omniTV = true; + startSound(); + return; } +} - _mixer->stopAll(); +void MoviePlayer::play() { + if (_vm->getBitFlag(40)) { + playOmniTV(); + return; + } + + if (_fd.isOpen() == false) { + debug(0, "MoviePlayer::play: No file loaded"); + return; + } _leftButtonDown = false; _rightButtonDown = false; - _ticks = _vm->_system->getMillis(); - - uint32 tag = _fd.readUint32BE(); - if (tag == MKID_BE('WAVE')) { - uint32 size = _fd.readUint32BE(); - byte *buffer = (byte *)malloc(size); - _fd.read(buffer, size); - - Common::MemoryReadStream stream(buffer, size); - _bgSoundStream = makeWAVStream(stream); - _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream); - free(buffer); - } + _mixer->stopAll(); // Resolution is smaller in Amiga verison so always clear screen if (_width == 384 && _height == 280) _vm->dx_clear_surfaces(480); - while (_frameNum < _framesCount) { - decodeFrame(); - processFrame(); - _vm->_system->updateScreen(); - _frameNum++; + _ticks = _vm->_system->getMillis(); - OSystem::Event event; - while (_vm->_system->pollEvent(event)) { - switch (event.type) { - case OSystem::EVENT_LBUTTONDOWN: - _leftButtonDown = true; - break; - case OSystem::EVENT_RBUTTONDOWN: - _rightButtonDown = true; - break; - case OSystem::EVENT_LBUTTONUP: - _leftButtonDown = false; - break; - case OSystem::EVENT_RBUTTONUP: - _rightButtonDown = false; - break; - case OSystem::EVENT_QUIT: - _vm->_system->quit(); - break; - default: - break; - } - } + startSound(); + + while (_frameNum < _framesCount) { + handleNextFrame(); if (_leftButtonDown && _rightButtonDown && !_vm->getBitFlag(41)) { _frameNum = _framesCount; @@ -190,12 +166,102 @@ void MoviePlayer::play() { } } +void MoviePlayer::startSound() { + uint32 tag = _fd.readUint32BE(); + if (tag == MKID_BE('WAVE')) { + uint32 size = _fd.readUint32BE(); + byte *buffer = (byte *)malloc(size); + _fd.read(buffer, size); + + Common::MemoryReadStream stream(buffer, size); + _bgSoundStream = makeWAVStream(stream); + _mixer->stopHandle(_bgSound); + _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_bgSound, _bgSoundStream); + free(buffer); + } +} + void MoviePlayer::close() { _fd.close(); free(_frameBuffer1); free(_frameBuffer2); } +void MoviePlayer::nextFrame() { + if (!_omniTV) + return; + + // FIXME: Never triggered! + if (_vm->getBitFlag(42)) { + _omniTV = false; + return; + } + + if (_mixer->isSoundHandleActive(_bgSound) && (_mixer->getSoundElapsedTime(_bgSound) * _frameRate) / 1000 < _frameNum) { + copyFrame(_vm->getBackBuf(), 465, 222); + return; + } + + if (_frameNum < _framesCount) { + decodeFrame(); + copyFrame(_vm->getBackBuf(), 465, 222); + _frameNum++; + } else { + _omniTV = false; + close(); + _vm->_variableArray[254] = 6747; + } +} + +void MoviePlayer::handleNextFrame() { + decodeFrame(); + processFrame(); + + _vm->_system->updateScreen(); + _frameNum++; + + OSystem::Event event; + while (_vm->_system->pollEvent(event)) { + switch (event.type) { + case OSystem::EVENT_LBUTTONDOWN: + _leftButtonDown = true; + break; + case OSystem::EVENT_RBUTTONDOWN: + _rightButtonDown = true; + break; + case OSystem::EVENT_LBUTTONUP: + _leftButtonDown = false; + break; + case OSystem::EVENT_RBUTTONUP: + _rightButtonDown = false; + break; + case OSystem::EVENT_QUIT: + _vm->_system->quit(); + break; + default: + break; + } + } + + if (_leftButtonDown && _rightButtonDown && !_vm->getBitFlag(41)) { + _frameNum = _framesCount; + } +} + +void MoviePlayer::copyFrame(byte *dst, uint x, uint y) { + uint h = _height; + uint w = _width; + + dst += y * _vm->_screenWidth + x; + byte *src = _frameBuffer1; + + do { + memcpy(dst, src, w); + dst += _vm->_screenWidth; + src += _width; + } while (--h); +} + void MoviePlayer::decodeZlib(uint8 *data, int size, int totalSize) { #ifdef USE_ZLIB uint8 *temp = (uint8 *)malloc(size); @@ -219,7 +285,9 @@ void MoviePlayer::decodeZlib(uint8 *data, int size, int totalSize) { } void MoviePlayer::decodeFrame() { - uint32 tag = _fd.readUint32BE(); + uint32 tag; + + tag = _fd.readUint32BE(); if (tag == MKID_BE('CMAP')) { uint8 rgb[768]; byte palette[1024]; @@ -240,7 +308,9 @@ void MoviePlayer::decodeFrame() { uint8 type = _fd.readByte(); uint32 size = _fd.readUint32BE(); debug(0, "frame %d type %d size %d", _frameNum, type, size); + _fd.read(_frameBuffer2, size); + switch (type) { case 2: case 3: @@ -263,11 +333,8 @@ void MoviePlayer::decodeFrame() { } void MoviePlayer::processFrame() { - uint x = (_vm->_screenWidth - _width) / 2; - uint y = (_vm->_screenHeight - _height) / 2; - - memcpy(_vm->_frontBuf, _frameBuffer1, _frameSize); - _vm->_system->copyRectToScreen(_vm->_frontBuf, _width, x, y, _width, _height); + copyFrame(_vm->getFrontBuf(), (_vm->_screenWidth - _width) / 2, (_vm->_screenHeight - _height) / 2); + _vm->_system->copyRectToScreen(_vm->getFrontBuf(), _vm->_screenWidth, 0, 0, _vm->_screenWidth, _vm->_screenHeight); if ((_bgSoundStream == NULL) || ((int)(_mixer->getSoundElapsedTime(_bgSound) * _frameRate) / 1000 < _frameNum + 1) || _frameSkipped > _frameRate) { diff --git a/engines/simon/animation.h b/engines/simon/animation.h index 530c95eaf6..6d3b04e25d 100644 --- a/engines/simon/animation.h +++ b/engines/simon/animation.h @@ -40,6 +40,7 @@ class MoviePlayer { Audio::SoundHandle _bgSound; AudioStream *_bgSoundStream; + bool _omniTV; bool _playing; bool _leftButtonDown; bool _rightButtonDown; @@ -62,11 +63,16 @@ public: bool load(const char *filename); void play(); + void nextFrame(); private: + void playOmniTV(); void close(); + void copyFrame(byte *dst, uint x, uint y); void decodeFrame(); + void handleNextFrame(); void processFrame(); + void startSound(); void decodeZlib(uint8 *data, int size, int totalSize); }; diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp index 552b828736..781915ccb5 100644 --- a/engines/simon/simon.cpp +++ b/engines/simon/simon.cpp @@ -2168,24 +2168,6 @@ void SimonEngine::checkRunningAnims(byte *end) { } } -void SimonEngine::checkZonePtrs(byte *end) { - uint count = ARRAYSIZE(_vgaBufferPointers); - VgaPointersEntry *vpe = _vgaBufferPointers; - do { - if (vpe->vgaFile1 < end && vpe->vgaFile1End > _vgaBufFreeStart || - vpe->vgaFile2 < end && vpe->vgaFile2End > _vgaBufFreeStart || - vpe->sfxFile < end && vpe->sfxFileEnd > _vgaBufFreeStart) { - vpe->vgaFile1 = NULL; - vpe->vgaFile1End = NULL; - vpe->vgaFile2 = NULL; - vpe->vgaFile2End = NULL; - vpe->sfxFile = NULL; - vpe->sfxFileEnd = NULL; - } - - } while (++vpe, --count); -} - void SimonEngine::checkAnims(uint a, byte *end) { VgaPointersEntry *vpe; @@ -2205,6 +2187,24 @@ void SimonEngine::checkAnims(uint a, byte *end) { } } +void SimonEngine::checkZonePtrs(byte *end) { + uint count = ARRAYSIZE(_vgaBufferPointers); + VgaPointersEntry *vpe = _vgaBufferPointers; + do { + if (vpe->vgaFile1 < end && vpe->vgaFile1End > _vgaBufFreeStart || + vpe->vgaFile2 < end && vpe->vgaFile2End > _vgaBufFreeStart || + vpe->sfxFile < end && vpe->sfxFileEnd > _vgaBufFreeStart) { + vpe->vgaFile1 = NULL; + vpe->vgaFile1End = NULL; + vpe->vgaFile2 = NULL; + vpe->vgaFile2End = NULL; + vpe->sfxFile = NULL; + vpe->sfxFileEnd = NULL; + } + + } while (++vpe, --count); +} + void SimonEngine::set_video_mode_internal(uint16 mode, uint16 vga_res_id) { uint num, num_lines; VgaPointersEntry *vpe; @@ -2812,6 +2812,9 @@ void SimonEngine::timer_proc1() { } } + if (getGameType() == GType_FF) + _moviePlay->nextFrame(); + animateSprites(); if (_drawImagesDebug) animateSpritesDebug(); |