[Scummvm-git-logs] scummvm master -> be583aaa8bc6219a208f0e9ed895e7b03ffcc5e8

antoniou79 noreply at scummvm.org
Wed Jul 6 14:22:46 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
be583aaa8b BLADERUNNER: Early subtitles queuing system


Commit: be583aaa8bc6219a208f0e9ed895e7b03ffcc5e8
    https://github.com/scummvm/scummvm/commit/be583aaa8bc6219a208f0e9ed895e7b03ffcc5e8
Author: antoniou79 (a.antoniou79 at gmail.com)
Date: 2022-07-06T17:19:59+03:00

Commit Message:
BLADERUNNER: Early subtitles queuing system

To be used for secondary subtitles, for displaying developer commentary

Changed paths:
    engines/bladerunner/script/script.cpp
    engines/bladerunner/script/script.h
    engines/bladerunner/subtitles.cpp
    engines/bladerunner/subtitles.h


diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp
index f8314e880da..9dd4775c859 100644
--- a/engines/bladerunner/script/script.cpp
+++ b/engines/bladerunner/script/script.cpp
@@ -1725,6 +1725,19 @@ void ScriptBase::Autosave_Game(int textId) {
 void ScriptBase::I_Sez(const char *str) {
 	debugC(kDebugScript, "I_Sez(%s)", str);
 	_vm->ISez(str);
+//	Add_Subtitle_To_Queue(str, 2000);
+}
+
+void ScriptBase::Add_Subtitle_To_Queue(Common::String dbgQuote, uint32 duration) {
+	debugC(kDebugScript, "Add_Subtitle_To_Queue(%s, %u)", dbgQuote.c_str(), duration);
+	if (!dbgQuote.empty()) {
+		_vm->_subtitles->addGameSubsTextToQueue(dbgQuote, duration);
+	}
+}
+
+void ScriptBase::Clear_Subtitle_Queue() {
+	debugC(kDebugScript, "Clear_Subtitle_Queue()");
+	_vm->_subtitles->clearQueue();
 }
 
 void ScriptBase::AI_Countdown_Timer_Start(int actorId, signed int timer, int32 seconds) {
diff --git a/engines/bladerunner/script/script.h b/engines/bladerunner/script/script.h
index d8626284293..52ca6d640e9 100644
--- a/engines/bladerunner/script/script.h
+++ b/engines/bladerunner/script/script.h
@@ -274,6 +274,8 @@ protected:
 	bool Game_Over();
 	void Autosave_Game(int textId);
 	void I_Sez(const char *str);
+	void Add_Subtitle_To_Queue(Common::String dbgQuote, uint32 duration);
+	void Clear_Subtitle_Queue();
 
 	void AI_Countdown_Timer_Start(int actorId, signed int timer, int32 seconds);
 	void AI_Countdown_Timer_Reset(int actorId, int timer);
diff --git a/engines/bladerunner/subtitles.cpp b/engines/bladerunner/subtitles.cpp
index a9810784f5a..41cecd5370e 100644
--- a/engines/bladerunner/subtitles.cpp
+++ b/engines/bladerunner/subtitles.cpp
@@ -156,6 +156,7 @@ Subtitles::Subtitles(BladeRunnerEngine *vm) {
 Subtitles::~Subtitles() {
 	reset();
 	_subtitlesDataActive.clear();
+	clearQueue();
 	_subtitlesEXC.clear();
 }
 
@@ -429,6 +430,20 @@ void Subtitles::setGameSubsText(int subsRole, Common::String dbgQuote, bool forc
 	_subtitlesDataActive[subsRole].forceShowWhenNoSpeech = forceShowWhenNoSpeech; // overrides not showing subtitles when no one is speaking
 }
 
+
+void Subtitles::addGameSubsTextToQueue(Common::String dbgQuote, uint32 duration) {
+	SubtitlesQueueEntry tmpItem;
+	if (duration > kMinDuration) {
+		tmpItem.duration = duration;
+	}
+	tmpItem.quote = dbgQuote;
+	_subtitlesDataQueue.insert_at(0, tmpItem);
+}
+
+void Subtitles::clearQueue() {
+	_subtitlesDataQueue.clear();
+}
+
 /**
  * Sets the _isVisible member var to true if it's not already set
  * @return true if the member was set now, false if the member was already set
@@ -499,6 +514,22 @@ void Subtitles::tickOuttakes(Graphics::Surface &s) {
 void Subtitles::tick(Graphics::Surface &s) {
 	bool proceedToDraw = false;
 	if (_isSystemActive && _vm->isSubtitlesEnabled()) {
+		// Check and handle queue first
+		if (!_subtitlesDataQueue.empty()) {
+			if (!_subtitlesDataQueue.back().started) {
+				_subtitlesDataQueue.back().started = true;
+				_subtitlesDataQueue.back().timeStarted = _vm->_time->currentSystem();
+				setGameSubsText(kSubtitlesSecondary, _subtitlesDataQueue.back().quote, true);
+				show(kSubtitlesSecondary);
+			} else {
+				if (_vm->_time->currentSystem() - _subtitlesDataQueue.back().timeStarted >= _subtitlesDataQueue.back().duration) {
+					setGameSubsText(kSubtitlesSecondary, "", false);
+					hide(kSubtitlesSecondary);
+					_subtitlesDataQueue.pop_back();
+				}
+			}
+		}
+
 		if (_subtitlesDataActive[kSubtitlesPrimary].isVisible
 		    && !_subtitlesDataActive[kSubtitlesPrimary].forceShowWhenNoSpeech
 		    && !_vm->_audioSpeech->isPlaying()) {
diff --git a/engines/bladerunner/subtitles.h b/engines/bladerunner/subtitles.h
index fe21663b302..c97e3a9f81d 100644
--- a/engines/bladerunner/subtitles.h
+++ b/engines/bladerunner/subtitles.h
@@ -49,6 +49,7 @@ class Subtitles {
 	static const int  kTextMaxWidth            = 610;    // In pixels
 	static const int  kMaxTextResourceEntries  = 27;     // Support in-game subs (1) and all possible VQAs (26) with spoken dialogue or translatable text
 	static const int  kMaxLanguageSelectionNum = 1024;   // Max allowed number of languages to select from (should be available in the MIX file)
+	static const uint32  kMinDuration          = 1000;    // Min allowed duration for a queued subtitle
 
 	static const char *SUBTITLES_FILENAME_PREFIXES[kMaxTextResourceEntries];
 	static const char *SUBTITLES_FONT_FILENAME_EXTERNAL;
@@ -108,6 +109,16 @@ class Subtitles {
 		SubtitlesData() : isVisible(false), forceShowWhenNoSpeech(false) { };
 	};
 
+	struct SubtitlesQueueEntry {
+		Common::String quote;
+		uint32 timeStarted;
+		uint32 duration;
+		//uint8 subsRole; // only support secondary subtitles to be queued
+		bool  started;
+
+		SubtitlesQueueEntry() : timeStarted(0), duration(kMinDuration), started(false) { };
+	};
+
 	SubtitlesInfo  _subtitlesInfo;
 	TextResource  *_vqaSubsTextResourceEntries[kMaxTextResourceEntries];
 
@@ -116,6 +127,7 @@ class Subtitles {
 	bool            _useHDC;
 	Common::Array<Common::String>       _subtitlesEXC;
 	Common::Array<SubtitlesData>        _subtitlesDataActive;
+	Common::Array<SubtitlesQueueEntry>  _subtitlesDataQueue;
 	Common::String                      _loadAvgStr;
 	Common::String                      _excTitlStr;
 	Common::String                      _goVib;
@@ -135,6 +147,8 @@ public:
 	void loadOuttakeSubsText(const Common::String &outtakesName, int frame); // get the text for this frame if any
 
 	void setGameSubsText(int subsRole, Common::String dbgQuote, bool force); // for debugging - explicit set subs text
+	void addGameSubsTextToQueue(Common::String dbgQuote, uint32 duration);
+	void clearQueue();
 
 	bool show(int subsRole);
 	bool hide(int subsRole);




More information about the Scummvm-git-logs mailing list