diff options
Diffstat (limited to 'engines/sword2')
-rw-r--r-- | engines/sword2/animation.cpp | 39 | ||||
-rw-r--r-- | engines/sword2/animation.h | 2 | ||||
-rw-r--r-- | engines/sword2/resman.cpp | 6 | ||||
-rw-r--r-- | engines/sword2/startup.cpp | 4 | ||||
-rw-r--r-- | engines/sword2/sword2.cpp | 3 |
5 files changed, 39 insertions, 15 deletions
diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 21ab645bfe..4a235315b6 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -116,7 +116,7 @@ void MoviePlayer::play(MovieText *movieTexts, uint32 numMovieTexts, uint32 leadI terminated = !playVideo(stopEvents); - closeTextObject(_currentMovieText); + closeTextObject(_currentMovieText, NULL); if (terminated) { _snd->stopHandle(*_bgSoundHandle); @@ -171,7 +171,7 @@ void MoviePlayer::openTextObject(uint32 index) { } } -void MoviePlayer::closeTextObject(uint32 index) { +void MoviePlayer::closeTextObject(uint32 index, byte *screen) { if (index < _numMovieTexts) { MovieText *text = &_movieTexts[index]; @@ -179,6 +179,32 @@ void MoviePlayer::closeTextObject(uint32 index) { text->_textMem = NULL; if (_textSurface) { + if (screen) { + // If the frame doesn't cover the entire + // screen, we have to erase the subtitles + // manually. + + int frameWidth = _decoder->getWidth(); + int frameHeight = _decoder->getHeight(); + int frameX = (_system->getWidth() - frameWidth) / 2; + int frameY = (_system->getHeight() - frameHeight) / 2; + + byte *dst = screen + _textY * _system->getWidth(); + + for (int y = 0; y < text->_textSprite.h; y++) { + if (_textY + y < frameY || _textY + y >= frameY + frameHeight) { + memset(dst + _textX, _decoder->getBlack(), text->_textSprite.w); + } else { + if (frameX > _textX) + memset(dst + _textX, _decoder->getBlack(), frameX - _textX); + if (frameX + frameWidth < _textX + text->_textSprite.w) + memset(dst + frameX + frameWidth, _decoder->getBlack(), _textX + text->_textSprite.w - (frameX + frameWidth)); + } + + dst += _system->getWidth(); + } + } + _vm->_screen->deleteSurface(_textSurface); _textSurface = NULL; } @@ -204,7 +230,7 @@ void MoviePlayer::drawTextObject(uint32 index, byte *screen) { src = buffer; } - byte *dst = screen + _textY * _decoder->getWidth() + _textX; + byte *dst = screen + _textY * RENDERWIDE + _textX; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { @@ -214,15 +240,11 @@ void MoviePlayer::drawTextObject(uint32 index, byte *screen) { dst[x] = white; } src += width; - dst += _decoder->getWidth(); + dst += RENDERWIDE; } } } -// FIXME: This assumes that the subtitles always fit within the frame of the -// movie. In Broken Sword 2, that's a fairly safe assumption, but not -// necessarily in all other games. - void MoviePlayer::performPostProcessing(byte *screen) { MovieText *text; int frame = _decoder->getCurFrame(); @@ -247,6 +269,7 @@ void MoviePlayer::performPostProcessing(byte *screen) { if (frame <= text->_endFrame) { drawTextObject(_currentMovieText, screen); } else { + closeTextObject(_currentMovieText, screen); _currentMovieText++; } } diff --git a/engines/sword2/animation.h b/engines/sword2/animation.h index 032350d2d6..f2b44baaa0 100644 --- a/engines/sword2/animation.h +++ b/engines/sword2/animation.h @@ -98,7 +98,7 @@ protected: void performPostProcessing(byte *screen); void openTextObject(uint32 index); - void closeTextObject(uint32 index); + void closeTextObject(uint32 index, byte *screen); void drawTextObject(uint32 index, byte *screen); }; diff --git a/engines/sword2/resman.cpp b/engines/sword2/resman.cpp index 6741be33f1..c49fb8e786 100644 --- a/engines/sword2/resman.cpp +++ b/engines/sword2/resman.cpp @@ -151,7 +151,7 @@ bool ResourceManager::init() { for (i = 0; i < size / 2; i++) _resConvTable[i] = file.readUint16LE(); - if (file.ioFailed()) { + if (file.eos() || file.err()) { file.close(); GUIErrorMessage("Broken Sword 2: Cannot read resource.tab"); return false; @@ -178,7 +178,7 @@ bool ResourceManager::init() { cdInf[i].cd = file.readByte(); - if (file.ioFailed()) { + if (file.eos() || file.err()) { delete cdInf; file.close(); GUIErrorMessage("Broken Sword 2: Cannot read cd.inf"); @@ -477,7 +477,7 @@ void ResourceManager::readCluIndex(uint16 fileNum, Common::File *file) { _resFiles[fileNum].entryTab = (uint32*)malloc(tableSize); _resFiles[fileNum].numEntries = tableSize / 8; file->read(_resFiles[fileNum].entryTab, tableSize); - if (file->ioFailed()) + if (file->eos() || file->err()) error("unable to read index table from file %s", _resFiles[fileNum].fileName); #ifdef SCUMM_BIG_ENDIAN diff --git a/engines/sword2/startup.cpp b/engines/sword2/startup.cpp index 09bf65bf75..e4572d3c1a 100644 --- a/engines/sword2/startup.cpp +++ b/engines/sword2/startup.cpp @@ -66,7 +66,7 @@ bool Sword2Engine::initStartMenu() { int start_ids[MAX_starts]; int lineno = 0; - while (!fp.eos() && !fp.ioFailed()) { + while (!fp.eos() && !fp.err()) { Common::String line = fp.readLine(); // Skip empty lines or, more likely, the end of the stream. @@ -103,7 +103,7 @@ bool Sword2Engine::initStartMenu() { } // An I/O error before EOS? That's bad, but this is not a vital file. - if (fp.ioFailed() && !fp.eos()) + if (fp.err() && !fp.eos()) warning("I/O error while reading startup.inf"); fp.close(); diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index cf44b4c99c..e368f257a2 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -33,6 +33,7 @@ #include "common/file.h" #include "common/fs.h" #include "common/events.h" +#include "common/EventRecorder.h" #include "common/savefile.h" #include "common/system.h" @@ -305,7 +306,7 @@ Sword2Engine::Sword2Engine(OSystem *syst) : Engine(syst) { _gmmLoadSlot = -1; // Used to manage GMM Loading - syst->getEventManager()->registerRandomSource(_rnd, "sword2"); + g_eventRec.registerRandomSource(_rnd, "sword2"); } Sword2Engine::~Sword2Engine() { |