aboutsummaryrefslogtreecommitdiff
path: root/engines/sword2
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword2')
-rw-r--r--engines/sword2/animation.cpp39
-rw-r--r--engines/sword2/animation.h2
-rw-r--r--engines/sword2/resman.cpp6
-rw-r--r--engines/sword2/startup.cpp4
-rw-r--r--engines/sword2/sword2.cpp3
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() {