[Scummvm-git-logs] scummvm master -> 642baf7d4cb11bbd5cabe30d1c703742015f5581

elasota noreply at scummvm.org
Tue Aug 23 00:58:49 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:
642baf7d4c MTROPOLIS: Finish subtitle handling for Obsidian.


Commit: 642baf7d4cb11bbd5cabe30d1c703742015f5581
    https://github.com/scummvm/scummvm/commit/642baf7d4cb11bbd5cabe30d1c703742015f5581
Author: elasota (ejlasota at gmail.com)
Date: 2022-08-22T20:58:27-04:00

Commit Message:
MTROPOLIS: Finish subtitle handling for Obsidian.

Changed paths:
    engines/mtropolis/boot.cpp
    engines/mtropolis/mtropolis.cpp
    engines/mtropolis/plugin/standard.cpp
    engines/mtropolis/plugin/standard.h
    engines/mtropolis/runtime.cpp
    engines/mtropolis/runtime.h
    engines/mtropolis/subtitles.cpp
    engines/mtropolis/subtitles.h


diff --git a/engines/mtropolis/boot.cpp b/engines/mtropolis/boot.cpp
index 6774bb6ac89..e92cf526049 100644
--- a/engines/mtropolis/boot.cpp
+++ b/engines/mtropolis/boot.cpp
@@ -553,14 +553,10 @@ Common::SharedPtr<ProjectDescription> bootProject(const MTropolisGameDescription
 		if ((gameDesc.desc.flags & ADGF_DEMO) == 0 && gameDesc.desc.language == Common::EN_ANY) {
 			linesTablePath = "subtitles_lines_obsidian_en.csv";
 			speakerTablePath = "subtitles_speakers_obsidian_en.csv";
+			assetMappingTablePath = "subtitles_asset_mapping_obsidian_en.csv";
 
-			if (gameDesc.desc.platform == Common::kPlatformWindows) {
-				assetMappingTablePath = "subtitles_asset_mapping_obsidian_win_en.csv";
-				modifierMappingTablePath = "subtitles_modifier_mapping_obsidian_win_en.csv";
-			} else if (gameDesc.desc.platform == Common::kPlatformMacintosh) {
-				assetMappingTablePath = "subtitles_asset_mapping_obsidian_mac_en.csv";
-				modifierMappingTablePath = "subtitles_modifier_mapping_obsidian_mac_en.csv";
-			}
+			// Currently, modifier mapping is the same for both Mac and Win retail, since the MIDI GUIDs are all identical.
+			modifierMappingTablePath = "subtitles_modifier_mapping_obsidian_en.csv";
 		}
 		break;
 	default:
diff --git a/engines/mtropolis/mtropolis.cpp b/engines/mtropolis/mtropolis.cpp
index 8f3bdeec26e..12042fdce41 100644
--- a/engines/mtropolis/mtropolis.cpp
+++ b/engines/mtropolis/mtropolis.cpp
@@ -109,7 +109,14 @@ Common::Error MTropolisEngine::run() {
 	ColorDepthMode preferredColorDepthMode = kColorDepthMode8Bit;
 	ColorDepthMode enhancedColorDepthMode = kColorDepthMode8Bit;
 
-	_runtime.reset(new Runtime(_system, _mixer, this, this));
+	Common::SharedPtr<SubtitleRenderer> subRenderer;
+
+	if (ConfMan.getBool("subtitles"))
+		subRenderer.reset(new SubtitleRenderer(ConfMan.getBool("mtropolis_mod_sound_gameplay_subtitles")));
+
+	_runtime.reset(new Runtime(_system, _mixer, this, this, subRenderer));
+
+	subRenderer.reset();
 
 	Common::SharedPtr<ProjectDescription> projectDesc = bootProject(*_gameDescription);
 
diff --git a/engines/mtropolis/plugin/standard.cpp b/engines/mtropolis/plugin/standard.cpp
index d4cffa20591..8a57a6dbf59 100644
--- a/engines/mtropolis/plugin/standard.cpp
+++ b/engines/mtropolis/plugin/standard.cpp
@@ -2386,6 +2386,16 @@ bool MidiModifier::respondsToEvent(const Event &evt) const {
 
 VThreadState MidiModifier::consumeMessage(Runtime *runtime, const Common::SharedPtr<MessageProperties> &msg) {
 	if (_executeWhen.respondsTo(msg->getEvent())) {
+		const SubtitleTables &subtitleTables = runtime->getProject()->getSubtitles();
+		if (subtitleTables.modifierMapping) {
+			const Common::String *subSetIDPtr = subtitleTables.modifierMapping->findSubtitleSetForModifierGUID(getStaticGUID());
+			if (subSetIDPtr) {
+				// Don't currently support anything except play-on-start subs for MIDI
+				SubtitlePlayer subtitlePlayer(runtime, *subSetIDPtr, subtitleTables);
+				subtitlePlayer.update(0, 1);
+			}
+		}
+
 		if (_mode == kModeFile) {
 			if (_embeddedFile) {
 				debug(2, "MIDI (%x '%s'): Playing embedded file", getStaticGUID(), getName().c_str());
diff --git a/engines/mtropolis/plugin/standard.h b/engines/mtropolis/plugin/standard.h
index ebbaf1cd061..2cbe4e7bba3 100644
--- a/engines/mtropolis/plugin/standard.h
+++ b/engines/mtropolis/plugin/standard.h
@@ -310,14 +310,10 @@ private:
 	Common::SharedPtr<Data::Standard::MidiModifier::EmbeddedFile> _embeddedFile;
 
 	uint16 _mutedTracks;
-	//uint8 _singleNoteChannel;
-	//uint8 _singleNoteNote;
 
 	StandardPlugIn *_plugIn;
 	MidiFilePlayer *_filePlayer;
 	MidiNotePlayer *_notePlayer;
-
-	//Runtime *_runtime;
 };
 
 class ListVariableModifier : public VariableModifier {
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index f6b88fe2566..da32e8794c0 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -3851,7 +3851,7 @@ void SceneTransitionHooks::onSceneTransitionSetup(Runtime *runtime, const Common
 void SceneTransitionHooks::onSceneTransitionEnded(Runtime *runtime, const Common::WeakPtr<Structural> &newScene) {
 }
 
-Runtime::Runtime(OSystem *system, Audio::Mixer *mixer, ISaveUIProvider *saveProvider, ILoadUIProvider *loadProvider)
+Runtime::Runtime(OSystem *system, Audio::Mixer *mixer, ISaveUIProvider *saveProvider, ILoadUIProvider *loadProvider, const Common::SharedPtr<SubtitleRenderer> &subRenderer)
 	: _system(system), _mixer(mixer), _saveProvider(saveProvider), _loadProvider(loadProvider),
 	  _nextRuntimeGUID(1), _realDisplayMode(kColorDepthModeInvalid), _fakeDisplayMode(kColorDepthModeInvalid),
 	  _displayWidth(1024), _displayHeight(768), _realTime(0), _realTimeBase(0), _playTime(0), _playTimeBase(0), _sceneTransitionState(kSceneTransitionStateNotTransitioning),
@@ -3859,11 +3859,10 @@ Runtime::Runtime(OSystem *system, Audio::Mixer *mixer, ISaveUIProvider *saveProv
 	  _cachedMousePosition(Common::Point(0, 0)), _realMousePosition(Common::Point(0, 0)), _trackedMouseOutside(false),
 	  _forceCursorRefreshOnce(true), _autoResetCursor(false), _haveModifierOverrideCursor(false), _sceneGraphChanged(false), _isQuitting(false),
 	  _collisionCheckTime(0), _defaultVolumeState(true), _activeSceneTransitionEffect(nullptr), _sceneTransitionStartTime(0), _sceneTransitionEndTime(0),
-	  _modifierOverrideCursorID(0) {
+	  _modifierOverrideCursorID(0), _subtitleRenderer(subRenderer) {
 	_random.reset(new Common::RandomSource("mtropolis"));
 
 	_vthread.reset(new VThread());
-	_subtitleRenderer.reset(new SubtitleRenderer());
 
 	for (int i = 0; i < kColorDepthModeCount; i++) {
 		_displayModeSupported[i] = false;
@@ -4211,7 +4210,7 @@ void Runtime::drawFrame() {
 	_system->fillScreen(Render::resolveRGB(0, 0, 0, getRenderPixelFormat()));
 
 	bool needToRenderSubtitles = false;
-	if (_subtitleRenderer->update(_playTime))
+	if (_subtitleRenderer && _subtitleRenderer->update(_playTime))
 		setSceneGraphDirty();
 
 	{
@@ -4228,7 +4227,7 @@ void Runtime::drawFrame() {
 				needToRenderSubtitles = !skipped;
 			}
 
-			if (needToRenderSubtitles)
+			if (needToRenderSubtitles && _subtitleRenderer)
 				_subtitleRenderer->composite(*mainWindow);
 		}
 	}
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 3686da31101..bde7be1ef61 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -1487,7 +1487,7 @@ public:
 
 class Runtime {
 public:
-	explicit Runtime(OSystem *system, Audio::Mixer *mixer, ISaveUIProvider *saveProvider, ILoadUIProvider *loadProvider);
+	explicit Runtime(OSystem *system, Audio::Mixer *mixer, ISaveUIProvider *saveProvider, ILoadUIProvider *loadProvider, const Common::SharedPtr<SubtitleRenderer> &subRenderer);
 	~Runtime();
 
 	bool runFrame();
diff --git a/engines/mtropolis/subtitles.cpp b/engines/mtropolis/subtitles.cpp
index f1c4e657ea2..6b99f20cae9 100644
--- a/engines/mtropolis/subtitles.cpp
+++ b/engines/mtropolis/subtitles.cpp
@@ -229,10 +229,20 @@ Common::ErrorCode SubtitleModifierMappingTable::load(const Common::String &fileP
 			return Common::kReadingFailed;
 
 		uint modifierGUID = 0;
-		if (sscanf(strs[1].c_str(), "%u", &modifierGUID) == 1 && modifierGUID != 0)
-			_guidToSubtitleSet[modifierGUID] = strs[0];
-		else
-			return Common::kReadingFailed;
+		for (char c : strs[1]) {
+			modifierGUID *= 0x10;
+			if (c >= '0' && c <= '9') {
+				modifierGUID += (c - '0');
+			} else if (c >= 'a' && c <= 'f') {
+				modifierGUID += (c - 'a' + 0xa);
+			} else if (c >= 'A' && c <= 'F') {
+				modifierGUID += (c - 'A' + 0xa);
+			} else {
+				return Common::kReadingFailed;
+			}
+		}
+
+		_guidToSubtitleSet[modifierGUID] = strs[0];
 	}
 
 	return Common::kNoError;
@@ -405,7 +415,8 @@ double SubtitleDisplayItem::getPosition() const {
 	return _position;
 }
 
-SubtitleRenderer::SubtitleRenderer() : _nonImmediateDisappearTime(3500), _isDirty(true), _lastTime(0), _fontHeight(0) {
+SubtitleRenderer::SubtitleRenderer(bool enableGameplaySubtitles)
+	: _nonImmediateDisappearTime(3500), _isDirty(true), _lastTime(0), _fontHeight(0), _enableGameplaySubtitles(enableGameplaySubtitles) {
 #ifdef USE_FREETYPE2
 	Common::File fontFile;
 	const char *fontPath = "LiberationSans-Bold.ttf";
@@ -506,6 +517,11 @@ bool SubtitleRenderer::isDirty() const {
 	return _isDirty;
 }
 
+bool SubtitleRenderer::isGameplaySubtitlesEnabled() const {
+	return _enableGameplaySubtitles;
+}
+
+
 void SubtitleRenderer::render() {
 	if (!_font)
 		return;
@@ -719,6 +735,9 @@ void SubtitlePlayer::stop() {
 void SubtitlePlayer::triggerSubtitleLine(const SubtitleLineTable::LineData &line) {
 	SubtitleRenderer *renderer = _runtime->getSubtitleRenderer().get();
 	if (renderer) {
+		if (line.lineClass == SubtitleLineTable::kLineClassGameplay && !renderer->isGameplaySubtitlesEnabled())
+			return;
+
 		Common::SharedPtr<SubtitleDisplayItem> dispItem(new SubtitleDisplayItem(line.textUTF8, _speakers->getSpeakers()[line.speakerID], line.slot, line.position));
 		for (uint i = 0; i < _items.size(); i++) {
 			if (_items[i]->getSlot() == line.slot) {
diff --git a/engines/mtropolis/subtitles.h b/engines/mtropolis/subtitles.h
index e84391e154b..a2545e68f07 100644
--- a/engines/mtropolis/subtitles.h
+++ b/engines/mtropolis/subtitles.h
@@ -145,7 +145,7 @@ private:
 
 class SubtitleRenderer {
 public:
-	SubtitleRenderer();
+	explicit SubtitleRenderer(bool enableGameplaySubtitles);
 
 	void addDisplayItem(const Common::SharedPtr<SubtitleDisplayItem> &item, uint duration);
 	void removeDisplayItem(const SubtitleDisplayItem *item, bool immediately);
@@ -155,6 +155,8 @@ public:
 	void composite(Window &window) const;
 	bool isDirty() const;
 
+	bool isGameplaySubtitlesEnabled() const;
+
 private:
 	struct DisplayItem {
 		DisplayItem();
@@ -174,6 +176,7 @@ private:
 	uint _nonImmediateDisappearTime;
 	int _fontHeight;
 	bool _isDirty;
+	bool _enableGameplaySubtitles;
 };
 
 class SubtitlePlayer {




More information about the Scummvm-git-logs mailing list