[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