diff options
author | antoniou79 | 2018-08-01 18:05:28 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2018-12-25 12:35:52 +0100 |
commit | 6f55071c570ee6a5bc4d4f3205972f6d7e7c35d2 (patch) | |
tree | 279a73a8bafd0e46ed494ba2d4db505b8863e084 /engines/bladerunner | |
parent | bf46900c7c48a988abfa7d622f1da2bff7c95544 (diff) | |
download | scummvm-rg350-6f55071c570ee6a5bc4d4f3205972f6d7e7c35d2.tar.gz scummvm-rg350-6f55071c570ee6a5bc4d4f3205972f6d7e7c35d2.tar.bz2 scummvm-rg350-6f55071c570ee6a5bc4d4f3205972f6d7e7c35d2.zip |
BLADERUNNER: SUBTITLES.MIX pack support
Diffstat (limited to 'engines/bladerunner')
-rw-r--r-- | engines/bladerunner/archive.cpp | 2 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.cpp | 8 | ||||
-rw-r--r-- | engines/bladerunner/bladerunner.h | 2 | ||||
-rw-r--r-- | engines/bladerunner/font.cpp | 40 | ||||
-rw-r--r-- | engines/bladerunner/font.h | 3 | ||||
-rw-r--r-- | engines/bladerunner/outtake.cpp | 4 | ||||
-rw-r--r-- | engines/bladerunner/subtitles.cpp | 356 | ||||
-rw-r--r-- | engines/bladerunner/subtitles.h | 29 | ||||
-rw-r--r-- | engines/bladerunner/text_resource.cpp | 42 | ||||
-rw-r--r-- | engines/bladerunner/text_resource.h | 1 |
10 files changed, 98 insertions, 389 deletions
diff --git a/engines/bladerunner/archive.cpp b/engines/bladerunner/archive.cpp index c116eeb94f..1dba3ab410 100644 --- a/engines/bladerunner/archive.cpp +++ b/engines/bladerunner/archive.cpp @@ -56,7 +56,7 @@ bool MIXArchive::open(const Common::String &filename) { _entries[i].length = _fd.readUint32LE(); #if BLADERUNNER_DEBUG_CONSOLE - debug("%08x %-12d %-12d", _entries[i].id, _entries[i].offset, _entries[i].length); + debug("%08x %-12d %-12d", _entries[i].hash, _entries[i].offset, _entries[i].length); #endif // Verify that the entries are sorted by id. Note that id is signed. diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index 94bc2afa28..cb09ddfb1c 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -505,6 +505,11 @@ bool BladeRunnerEngine::startup(bool hasSavegames) { _mainFont->setSpacing(1, 0); _subtitles = new Subtitles(this); + r = openArchive("SUBTITLES.MIX"); + if (!r) { + _subtitles->setSubtitlesSystemInactive(true); // no subtitles support + } + _subtitles->init(); for (int i = 0; i != 43; ++i) { Shape *shape = new Shape(this); @@ -678,6 +683,9 @@ void BladeRunnerEngine::shutdown() { _mainFont = nullptr; } + if(isArchiveOpen("SUBTITLES.MIX")) { + closeArchive("SUBTITLES.MIX"); + } if (_subtitles) { delete _subtitles; _subtitles = nullptr; diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h index 2888a6c109..4943689cf4 100644 --- a/engines/bladerunner/bladerunner.h +++ b/engines/bladerunner/bladerunner.h @@ -106,7 +106,7 @@ public: #if BLADERUNNER_DEBUG_GAME static const int kArchiveCount = 100; #else - static const int kArchiveCount = 10; + static const int kArchiveCount = 11; // +1 to original value (10) to accommodate for SUBTITLES.MIX resource #endif static const int kActorCount = 100; static const int kActorVoiceOver = kActorCount - 1; diff --git a/engines/bladerunner/font.cpp b/engines/bladerunner/font.cpp index 94ec476495..19fad67df6 100644 --- a/engines/bladerunner/font.cpp +++ b/engines/bladerunner/font.cpp @@ -37,46 +37,6 @@ Font::~Font() { close(); } -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT -// for external FON font file / subtitles support -bool Font::openFromStream(Common::ScopedPtr<Common::SeekableReadStream> &stream, int screenWidth, int screenHeight, int spacing1, int spacing2, uint16 color) { - reset(); - - _screenWidth = screenWidth; - _screenHeight = screenHeight; - _spacing1 = spacing1; - _spacing2 = spacing2; - _color = color; - - if (!stream) { - return false; - } - _characterCount = stream->readUint32LE(); - debug("Font's character count: %d", _characterCount); - _maxWidth = stream->readUint32LE(); - _maxHeight = stream->readUint32LE(); - _dataSize = stream->readUint32LE(); - _data = new uint16[_dataSize]; - if (!_data) { - debug("Font::open failed to allocate font buffer"); - return false; - } - - for (int i = 0; i < _characterCount; i++) { - _characters[i].x = stream->readUint32LE(); - _characters[i].y = stream->readUint32LE(); - _characters[i].width = stream->readUint32LE(); - _characters[i].height = stream->readUint32LE(); - _characters[i].dataOffset = stream->readUint32LE(); - debug("char::%d character x: %d, y: %d, w: %d, h:%d, do: %d", i, _characters[i].x, _characters[i].y, _characters[i].width, _characters[i].height, _characters[i].dataOffset); - } - for (int i = 0; i < _dataSize; i++) { - _data[i] = stream->readUint16LE(); - } - return true; -} -#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT - bool Font::open(const Common::String &fileName, int screenWidth, int screenHeight, int spacing1, int spacing2, uint16 color) { reset(); diff --git a/engines/bladerunner/font.h b/engines/bladerunner/font.h index 4f1f1e9788..001a947ca2 100644 --- a/engines/bladerunner/font.h +++ b/engines/bladerunner/font.h @@ -63,9 +63,6 @@ public: Font(BladeRunnerEngine *vm); ~Font(); - #if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - bool openFromStream(Common::ScopedPtr<Common::SeekableReadStream> &s, int screenWidth, int screenHeight, int spacing1, int spacing2, uint16 color); - #endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT bool open(const Common::String &fileName, int screenWidth, int screenHeight, int spacing1, int spacing2, uint16 color); void close(); diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp index 2a4da8f874..cbcc7fc0ec 100644 --- a/engines/bladerunner/outtake.cpp +++ b/engines/bladerunner/outtake.cpp @@ -42,7 +42,7 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co if (!noLocalization) { resName = resName + "_" + _vm->_languageCode; } - + Common::String resNameNoVQASuffix = resName; resName = resName + ".VQA"; VQAPlayer vqa_player(_vm, &_vm->_surfaceBack); // surfaceBack is needed here for subtitles rendering properly, original was _surfaceFront here @@ -62,7 +62,7 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co break; if (frame >= 0) { - _vm->_subtitles->getOuttakeSubsText(resName + ".TRE" , frame); + _vm->_subtitles->getOuttakeSubsText(resNameNoVQASuffix, frame); _vm->_subtitles->tickOuttakes(_vm->_surfaceFront); _vm->blitToScreen(_vm->_surfaceFront); } diff --git a/engines/bladerunner/subtitles.cpp b/engines/bladerunner/subtitles.cpp index 1711425caf..3a760eed45 100644 --- a/engines/bladerunner/subtitles.cpp +++ b/engines/bladerunner/subtitles.cpp @@ -39,10 +39,9 @@ namespace BladeRunner { * * TODO in python script (FON from png glyphs) check if you can have semi-transparent pixels to better outline the fringe points of the glyphs - check what happens when MSB is set (transparency) and the rest of the color value is not all 0s. * TODO Catch error for bad symbol in a quote (one that causes the font to crash) - this could happen with the corrupted internal font (TAHOMA18) -> font crash or bad font display / garbage character - * TODO add a keyboard shortcut key to enable / disable subtitles? * TODO have a debug script to detect/report problematic lines (too long) * - * TODO? put external FON and TRE in a new folder "SUBS" - case insensitive (?) + * TODO? add a keyboard shortcut key to enable / disable subtitles? * TODO? Use another escape sequence to progressively display text in a line (like in SCUMM games) <-- this could be very useful with very long lines - might also need an extra manual time or ticks parameter to determine when during the display of the first segment we should switch to the second. * TODO? A more advanced subtitles system * TODO: subtitles could be independent from sound playing (but should disappear when switching between UI screens) @@ -66,19 +65,18 @@ namespace BladeRunner { */ #if BLADERUNNER_SUBTITLES_EXTERNAL_FONT -const Common::String Subtitles::SUBTITLES_FONT_FILENAME = "SUBTITLES.FON"; +const Common::String Subtitles::SUBTITLES_FONT_FILENAME = "SUBTLS_E.FON"; #else const Common::String Subtitles::SUBTITLES_FONT_FILENAME = "TAHOMA18.FON"; #endif /* * All entries need to have the language code appended (after a '_'). -* The outtakes then need a substring ".VQA" -* And all entries should have the suffix extension ".TRE" +* And all entries should get the suffix extension ".TRE" (or FUTURE: the last letter in extension "TR*" should also be the language code) * If/When adding new TRE resources here --> Update kMaxTextResourceEntries and also update method getIdxForSubsTreName() */ const Common::String Subtitles::SUBTITLES_FILENAME_PREFIXES[kMaxTextResourceEntries] = { - "outQuotes", // 0 // (in-game subtitles, not VQA subtitles) + "INGQUO", // 0 // (in-game subtitles, not VQA subtitles) "WSTLGO", // 1 "BRLOGO", // 2 "INTRO", // 3 @@ -97,14 +95,13 @@ const Common::String Subtitles::SUBTITLES_FILENAME_PREFIXES[kMaxTextResourceEntr "END04B", // 16 "END04C", // 17 "END06", // 18 - "END07", // 19 - "END01A", // 20 - "END01B", // 21 - "END01C", // 22 - "END01D", // 23 - "END01E", // 24 - "END01F", // 25 - "END03" // 26 + "END01A", // 19 + "END01B", // 20 + "END01C", // 21 + "END01D", // 22 + "END01E", // 23 + "END01F", // 24 + "END03" // 25 }; /** @@ -112,56 +109,83 @@ const Common::String Subtitles::SUBTITLES_FILENAME_PREFIXES[kMaxTextResourceEntr */ Subtitles::Subtitles(BladeRunnerEngine *vm) { _vm = vm; + _subtitlesSystemInactive = false; // Initializing and reseting Subtitles for (int i = 0; i < kMaxTextResourceEntries; i++) { - _gameSubsFdEntries[i] = nullptr; _vqaSubsTextResourceEntries[i] = nullptr; } #if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - _gameSubsFontsFd = nullptr; _subsFont = nullptr; #else _subsFont = nullptr; _subsBgFont = nullptr; #endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT reset(); - // Done - Subtitles Reset +} + +/** +* Subtitles Destructor +*/ +Subtitles::~Subtitles() { + // delete any resource entries in the _vqaSubsTextResourceEntries table + // and close any open text resource files + for (int i = 0; i != kMaxTextResourceEntries; ++i) { + if (_vqaSubsTextResourceEntries[i] != nullptr) { + delete _vqaSubsTextResourceEntries[i]; + _vqaSubsTextResourceEntries[i] = nullptr; + } + } + + if (_subsFont != nullptr) { + _subsFont->close(); + delete _subsFont; + _subsFont = nullptr; + } +#if !BLADERUNNER_SUBTITLES_EXTERNAL_FONT + if (_subsBgFont != nullptr) { + _subsBgFont->close(); + delete _subsBgFont; + _subsBgFont = nullptr; + } +#endif // !BLADERUNNER_SUBTITLES_EXTERNAL_FONT +} + +// +// Init is kept separated from constructor to allow not loading up resources if subtitles system is disabled +// +void Subtitles::init(void) { + if (_subtitlesSystemInactive) { + return; + } // // Loading text resources for (int i = 0; i < kMaxTextResourceEntries; i++) { - _gameSubsFdEntries[i] = new Common::File(); _vqaSubsTextResourceEntries[i] = new TextResource(_vm); Common::String tmpConstructedFileName = ""; tmpConstructedFileName = SUBTITLES_FILENAME_PREFIXES[i] + "_" + _vm->_languageCode; - if (i > 0) { - tmpConstructedFileName += ".VQA"; - } - tmpConstructedFileName += ".TRE"; - if (openGameSubs(tmpConstructedFileName) && loadGameSubsText(i)) { - _gameSubsFdEntriesFound[i] = true; + //tmpConstructedFileName += ".TRE"; // = Common::String::format("%s.TR%s", tmpConstructedFileName.c_str(), _vm->_languageCode.c_str()); + if ( _vqaSubsTextResourceEntries[i]->open(tmpConstructedFileName)) { + _gameSubsResourceEntriesFound[i] = true; } } // Done - Loading text resources // // Initializing/Loading Subtitles' Fonts -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - // Open external fonts file (FON file) and load fonts - _gameSubsFontsFd = new Common::File(); - _subsFont = new Font(_vm); - if (openSubsFontFile() && loadSubsFont()) { - _subsFontsLoaded = true; - } -#else _subsFont = new Font(_vm); // Use TAHOMA18.FON (is corrupted in places) // 10PT or TAHOMA24 or KIA6PT have all caps glyphs (and also are too big or too small) so they are not appropriate. if (_subsFont ->open(SUBTITLES_FONT_FILENAME, 640, 480, -1, 0, 0)) { // Color setting does not seem to affect the TAHOMA fonts or does it affect the black outline since we give 0 here? +#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT + _subsFont->setSpacing(-1, 0); +#else _subsFont->setSpacing(1, 0); _subsFont->setWhiteColor(); +#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT _subsFontsLoaded = true; } else { _subsFontsLoaded = false; } +#if !BLADERUNNER_SUBTITLES_EXTERNAL_FONT _subsBgFont = new Font(_vm); if (_subsFontsLoaded && _subsBgFont ->open(SUBTITLES_FONT_FILENAME, 640, 480, -1, 0, 0)) { // TODO dark color? --- color does not seem to affect the TAHOMA fonts or does it affect the black outline since we give 0 here? ?? - we should give the original color here. What is it for TAHOMA? _subsBgFont ->setSpacing(1, 0); @@ -182,51 +206,8 @@ Subtitles::Subtitles(BladeRunnerEngine *vm) { } } -/** -* Subtitles Destructor -*/ -Subtitles::~Subtitles() { - // delete any resource entries in the _vqaSubsTextResourceEntries table - // and close any open text resource files - for (int i = 0; i != kMaxTextResourceEntries; ++i) { - if (_vqaSubsTextResourceEntries[i] != nullptr) { - delete _vqaSubsTextResourceEntries[i]; - _vqaSubsTextResourceEntries[i] = nullptr; - } - if (_gameSubsFdEntries[i] != nullptr) { - - if (isOpenGameSubs(i)) { - closeGameSubs(i); - } - delete _gameSubsFdEntries[i]; - _gameSubsFdEntries[i] = nullptr; - } - } -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - if (_subsFont != nullptr) { - _subsFont->close(); - delete _subsFont; - _subsFont = nullptr; - } - if (_gameSubsFontsFd != nullptr) { - if (isOpenSubsFontFile()) { - closeSubsFontFile(); - } - delete _gameSubsFontsFd; - _gameSubsFontsFd = nullptr; - } -#else - if (_subsFont != nullptr) { - _subsFont->close(); - delete _subsFont; - _subsFont = nullptr; - } - if (_subsBgFont != nullptr) { - _subsBgFont->close(); - delete _subsBgFont; - _subsBgFont = nullptr; - } -#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT +void Subtitles::setSubtitlesSystemInactive(bool flag) { + _subtitlesSystemInactive = flag; } /** @@ -237,10 +218,6 @@ int Subtitles::getIdxForSubsTreName(const Common::String &treName) const { Common::String tmpConstructedFileName = ""; for (int i = 0; i < kMaxTextResourceEntries; ++i) { tmpConstructedFileName = SUBTITLES_FILENAME_PREFIXES[i] + "_" + _vm->_languageCode; - if (i > 0) { - tmpConstructedFileName += ".VQA"; - } - tmpConstructedFileName += ".TRE"; if (tmpConstructedFileName == treName) { return i; } @@ -249,178 +226,18 @@ int Subtitles::getIdxForSubsTreName(const Common::String &treName) const { return -1; } - -/** -* Open an external subtitles File and store its file descriptor -* @return true if successful, false otherwise -*/ -bool Subtitles::openGameSubs(const Common::String &filename) { - uint32 gameSubsEntryCount = 0; - int subTreIdx = getIdxForSubsTreName(filename); - - if (subTreIdx < 0 || _gameSubsFdEntries[subTreIdx] == nullptr) { - debug("Subtitles::open(): Could not open %s", filename.c_str()); - return false; - } -// debug("Now opening subs file: %s", filename.c_str()); - - if (!_gameSubsFdEntries[subTreIdx]->open(filename)) { - debug("Subtitles::open(): Could not open %s", filename.c_str()); - return false; - } - gameSubsEntryCount = _gameSubsFdEntries[subTreIdx]->readUint32LE(); - - if (_gameSubsFdEntries[subTreIdx]->err()) { - error("Subtitles::open(): Error reading entries in %s", filename.c_str()); - _gameSubsFdEntries[subTreIdx]->close(); - return false; - } - debug("Subtitles::open: Opened in-game external subs file %s with %d entries", filename.c_str(), gameSubsEntryCount); - return true; -} - -/** -* Close an open external subtitles File -*/ -void Subtitles::closeGameSubs(int subTreIdx) { - if (subTreIdx < 0 || _gameSubsFdEntries[subTreIdx] == nullptr) { - debug("Subtitles::close(): Could not close file with Idx %d", subTreIdx); - return; - } - return _gameSubsFdEntries[subTreIdx]->close(); -} - -/** -* Check whether an external subtitles File is open -*/ -bool Subtitles::isOpenGameSubs(int subTreIdx) const { - if (subTreIdx < 0 || _gameSubsFdEntries[subTreIdx] == nullptr) { - return false; - } - return _gameSubsFdEntries[subTreIdx]->isOpen(); -} - -/** -* Load the game subs as a TRE resource and store them in a specific entry in _vqaSubsTextResourceEntries table -*/ -bool Subtitles::loadGameSubsText(int subTreIdx) { - bool r = false; - Common::SeekableReadStream *stream = createReadStreamForGameSubs(subTreIdx); - if (stream != nullptr) { - Common::ScopedPtr<Common::SeekableReadStream> s(stream); - r = _vqaSubsTextResourceEntries[subTreIdx]->openFromStream(s); - if (!r) { - error("Failed to load subtitle text"); - } - closeGameSubs(subTreIdx); - } - return r; -} - -/** -* Auxiliary method for loadGameSubsText -* @return nullptr if failure, otherwise return a pointer to a new SafeSeekableSubReadStream -*/ -Common::SeekableReadStream *Subtitles::createReadStreamForGameSubs(int subTreIdx) { - if (subTreIdx < 0 || _gameSubsFdEntries[subTreIdx] == nullptr) { - return nullptr; - } - if (!isOpenGameSubs(subTreIdx)) { - return nullptr; - } - return new Common::SafeSeekableSubReadStream(_gameSubsFdEntries[subTreIdx], 0, _gameSubsFdEntries[subTreIdx]->size(), DisposeAfterUse::YES); // TODO changed to YES from NO is this ok? -} - -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT -// -// EXTERN FONT MANAGEMENT - Font Open/ Create Read Stream / Load / Close methods -// - -/** -* @return true if successfully opened the external fonts (FON) file, false otherwise -*/ -bool Subtitles::openSubsFontFile() { - uint32 subFontsTableEntryCount = 0; -// debug("Now opening subs file: %s", SUBTITLES_FONT_FILENAME.c_str()); - - if (_gameSubsFontsFd == nullptr || !_gameSubsFontsFd->open(SUBTITLES_FONT_FILENAME)) { - debug("Subtitles FONT::open(): Could not open %s", SUBTITLES_FONT_FILENAME.c_str()); - return false; - } - subFontsTableEntryCount = _gameSubsFontsFd->readUint32LE(); // only for debug report purposes - - if (_gameSubsFontsFd->err()) { - error("Subtitles FONT::open(): Error reading entries in %s", SUBTITLES_FONT_FILENAME.c_str()); - _gameSubsFontsFd->close(); - return false; - } - - debug("Subtitles FONT::open: Opened in-game external subs FONT file %s with %d entries", SUBTITLES_FONT_FILENAME.c_str(), subFontsTableEntryCount); - return true; -} - -/** -* Close the external Fonts (FON) file -*/ -void Subtitles::closeSubsFontFile() { - if (_gameSubsFontsFd != nullptr) { - _gameSubsFontsFd->close(); - } -} - -/** -* Checks whether the external fonts (FON) file has been opened -*/ -bool Subtitles::isOpenSubsFontFile() const { - return _gameSubsFontsFd != nullptr && _gameSubsFontsFd->isOpen(); -} - -/** -* Auxiliary function to create a read stream fro the external fonts file -* @return a pointer to the stream if successful, or nullptr otherwise -*/ -Common::SeekableReadStream *Subtitles::createReadStreamForSubFonts() { - if (_gameSubsFontsFd == nullptr || !isOpenSubsFontFile()) { - return nullptr; - } - return new Common::SafeSeekableSubReadStream(_gameSubsFontsFd, 0, _gameSubsFontsFd->size(), DisposeAfterUse::YES); // TODO changed to YES from NO is this ok? -} - -/** -* Loads the font from the external font file -* @return true if successful, or false otherwise -*/ -bool Subtitles::loadSubsFont() { - bool r = false; - Common::SeekableReadStream *stream = createReadStreamForSubFonts(); - if (stream != nullptr) { - Common::ScopedPtr<Common::SeekableReadStream> s(stream); - r = _subsFont->openFromStream(s, 640, 480, -1, 0, 0); - - if (!r) { - error("Failed to load subtitle FONT"); - } else { - _subsFont->setSpacing(-1, 0); - } - //_subsFont->setSpacing(0, 0); - closeSubsFontFile(); - } - return r; -} - -// -// END OF EXTERNAL FONT MANAGEMENT -// -#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT - /** * Get the active subtitle text by searching with actor ID and speech ID * Use this method for in-game dialogue - Not dialogue during a VQA cutscene * Returns the dialogue quote, but also sets the private _currentSubtitleTextFull member */ const char *Subtitles::getInGameSubsText(int actorId, int speech_id) { + if (_subtitlesSystemInactive) { + return ""; + } + int32 id = 10000 * actorId + speech_id; - if (!_gameSubsFdEntriesFound[0]) { + if (!_gameSubsResourceEntriesFound[0]) { if (_currentSubtitleTextFull != "") { _currentSubtitleTextFull = ""; _subtitlesQuoteChanged = true; @@ -439,8 +256,12 @@ const char *Subtitles::getInGameSubsText(int actorId, int speech_id) { * Returns the dialogue quote, but also sets the private _currentSubtitleTextFull member */ const char *Subtitles::getOuttakeSubsText(const Common::String &outtakesName, int frame) { + if (_subtitlesSystemInactive) { + return ""; + } + int fileIdx = getIdxForSubsTreName(outtakesName); - if (fileIdx == -1 || !_gameSubsFdEntriesFound[fileIdx]) { + if (fileIdx == -1 || !_gameSubsResourceEntriesFound[fileIdx]) { if (_currentSubtitleTextFull != "") { _currentSubtitleTextFull = ""; _subtitlesQuoteChanged = true; @@ -476,6 +297,9 @@ void Subtitles::setGameSubsText(Common::String dbgQuote) { * @return true if the member was set now, false if the member was already set */ bool Subtitles::show() { + if (_subtitlesSystemInactive) { + return false; + } if (_isVisible) { return false; @@ -489,6 +313,10 @@ bool Subtitles::show() { * @return true if the member was cleared, false if it was already clear. */ bool Subtitles::hide() { + if (_subtitlesSystemInactive) { + return false; + } + if (!_isVisible) { return false; } @@ -502,7 +330,7 @@ bool Subtitles::hide() { * @return the value of the _isVisible member boolean var */ bool Subtitles::isVisible() const { - return _isVisible; + return _subtitlesSystemInactive || _isVisible; } /** @@ -514,7 +342,7 @@ void Subtitles::tickOuttakes(Graphics::Surface &s) { } else { _vm->_subtitles->show(); } - if (!_vm->isSubtitlesEnabled()) { + if (_subtitlesSystemInactive || !_vm->isSubtitlesEnabled()) { return; } if (!_isVisible) { // keep it as a separate if @@ -530,7 +358,7 @@ void Subtitles::tick(Graphics::Surface &s) { if (!_vm->_audioSpeech->isPlaying()) { _vm->_subtitles->hide(); // TODO might need a better system. Don't call it always. } - if (!_vm->isSubtitlesEnabled()) { + if (_subtitlesSystemInactive || !_vm->isSubtitlesEnabled()) { return; } if (!_isVisible) { // keep it as a separate if @@ -726,37 +554,15 @@ void Subtitles::reset() { delete _vqaSubsTextResourceEntries[i]; _vqaSubsTextResourceEntries[i] = nullptr; } - _gameSubsFdEntriesFound[i] = false; - - if (_gameSubsFdEntries[i] != nullptr) { - if (isOpenGameSubs(i)) { - closeGameSubs(i); - } - delete _gameSubsFdEntries[i]; - _gameSubsFdEntries[i] = nullptr; - } + _gameSubsResourceEntriesFound[i] = false; } -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - if (_subsFont != nullptr) { - _subsFont->close(); - delete _subsFont; - _subsFont = nullptr; - } - - if (_gameSubsFontsFd != nullptr) { - if (isOpenSubsFontFile()) { - closeSubsFontFile(); - } - delete _gameSubsFontsFd; - _gameSubsFontsFd = nullptr; - } -#else - if (_subsFont != nullptr) { + if (_subsFont != nullptr) { _subsFont->close(); delete _subsFont; _subsFont = nullptr; } +#if !BLADERUNNER_SUBTITLES_EXTERNAL_FONT if (_subsBgFont != nullptr) { _subsBgFont->close(); delete _subsBgFont; diff --git a/engines/bladerunner/subtitles.h b/engines/bladerunner/subtitles.h index 8392b7ab39..1f2465f3ee 100644 --- a/engines/bladerunner/subtitles.h +++ b/engines/bladerunner/subtitles.h @@ -48,7 +48,7 @@ class Subtitles { // TODO Or just support the current _vm->_languageCode ? [current implementation] static const int kMaxNumOfSubtitlesLines = 3; static const int kMaxWidthPerLineToAutoSplitThresholdPx = 610; - static const int kMaxTextResourceEntries = 1 + 26; // Support in-game subs (1) and all possible VQAs (26) with spoken dialogue! + static const int kMaxTextResourceEntries = 1 + 25; // Support in-game subs (1) and all possible VQAs (26) with spoken dialogue! static const Common::String SUBTITLES_FILENAME_PREFIXES[kMaxTextResourceEntries]; static const Common::String SUBTITLES_FONT_FILENAME; @@ -70,17 +70,16 @@ class Subtitles { int _currentSubtitleLines; bool _subtitlesQuoteChanged; - Common::File *_gameSubsFdEntries[kMaxTextResourceEntries]; // an array of pointers to TRE FILEs - bool _gameSubsFdEntriesFound[kMaxTextResourceEntries]; // false if a TRE file did not open successfully + bool _gameSubsResourceEntriesFound[kMaxTextResourceEntries]; // false if a TRE file did not open successfully bool _subsFontsLoaded; // false if external fonts did not load, or internal fonts (fore and background) did not load -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - Common::File *_gameSubsFontsFd; // the file for the external FONT for subtitles -#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT + bool _subtitlesSystemInactive; // true if the whole subtitles subsystem should be disabled (due to missing required resources) public: Subtitles(BladeRunnerEngine *vm); ~Subtitles(); + void init(); + void setSubtitlesSystemInactive(bool flag); // disable subtitles system (possibly due to missing important resources like SUBTITLES.MIX file) const char *getInGameSubsText(int actorId, int speech_id) ; // get the text for actorId, quoteId (in-game subs) const char *getOuttakeSubsText(const Common::String &outtakesName, int frame); // get the text for this frame if any @@ -92,24 +91,6 @@ public: void tickOuttakes(Graphics::Surface &s); private: - Common::SeekableReadStream *createReadStreamForGameSubs(int subTreIdx); - - bool openGameSubs(const Common::String &filename); - void closeGameSubs(int subTreIdx); - bool isOpenGameSubs(int subTreIdx) const; - - bool loadGameSubsText(int subTreIdx); // populate a GAME SUBS TextResource with subtitles - // - // -#if BLADERUNNER_SUBTITLES_EXTERNAL_FONT - Common::SeekableReadStream *createReadStreamForSubFonts(); - bool openSubsFontFile(); - void closeSubsFontFile(); - bool isOpenSubsFontFile() const; // - bool loadSubsFont(); // create a the font object from a FON file (external) -#endif // BLADERUNNER_SUBTITLES_EXTERNAL_FONT - - void draw(Graphics::Surface &s); // bool showAt(int x, int y); // TODO maybe future use (?) void calculatePosition(); diff --git a/engines/bladerunner/text_resource.cpp b/engines/bladerunner/text_resource.cpp index 1c77baf6f4..b583bc609a 100644 --- a/engines/bladerunner/text_resource.cpp +++ b/engines/bladerunner/text_resource.cpp @@ -43,48 +43,6 @@ TextResource::~TextResource() { delete[] _strings; } -// for TRE subtitles support -bool TextResource::openFromStream(Common::ScopedPtr<Common::SeekableReadStream> &s) { - - if (!s) { - return false; - } - - _count = s->readUint32LE(); - - _ids = new uint32[_count]; - _offsets = new uint32[_count + 1]; - - for (uint32 i = 0; i != _count; ++i) { - _ids[i] = s->readUint32LE(); - } - - for (uint32 i = 0; i != _count + 1; ++i) { - _offsets[i] = s->readUint32LE(); - } - - uint32 stringsStart = s->pos() - 4; - - for (uint32 i = 0; i != _count + 1; ++i) { - _offsets[i] -= stringsStart; - } - - uint32 remain = s->size() - s->pos(); - _strings = new char[remain]; - - assert(remain >= _offsets[_count]); - - s->read(_strings, remain); -#if BLADERUNNER_DEBUG_CONSOLE -// debug("\nRESOURCE:: from Stream\n----------------"); -// for (uint32 i = 0; i != (uint32)_count; ++i) { -// debug("%3d: %s", _ids[i], getText(_ids[i])); -// } -#endif - - return true; -} - bool TextResource::open(const Common::String &name) { assert(name.size() <= 8); diff --git a/engines/bladerunner/text_resource.h b/engines/bladerunner/text_resource.h index 33a8f98de8..2143d9937e 100644 --- a/engines/bladerunner/text_resource.h +++ b/engines/bladerunner/text_resource.h @@ -45,7 +45,6 @@ public: ~TextResource(); bool open(const Common::String &name); - bool openFromStream(Common::ScopedPtr<Common::SeekableReadStream> &s); const char *getText(uint32 id) const; const char *getOuttakeTextByFrame(uint32 frame) const; |