[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