[Scummvm-tracker] [ScummVM :: Bugs] #13378: SCUMM: SAMNMAX: Timing Problems in German CD Intro
ScummVM :: Bugs
trac at scummvm.org
Thu Mar 31 13:14:52 UTC 2022
#13378: SCUMM: SAMNMAX: Timing Problems in German CD Intro
-------------------------+----------------------------
Reporter: GermanTribun | Owner: (none)
Type: defect | Status: new
Priority: normal | Component: Engine: SCUMM
Version: | Resolution:
Keywords: | Game: Sam and Max
-------------------------+----------------------------
Comment (by eriktorbjorn):
So it ''is'' possible to adjust the timing of the intro further, though
working out the exact details is a slow and tedious process. Which is why
I only have it for the German intro so far. I think this is about as good
as that one will ever get. It works by:
- Ignoring when the script sets the main timer to be unnecessary fast.
- Hard-coding talk delays for broken up sentences, when the calculated
ones aren't good enough.
- Slowing down Sam's mouth animation while Max is beating up the
scientist.
I need to clean things up, e.g. to make it more obvious exactly which
sentences are being adjusted. But I probably won't have any more time for
this today.
{{{
diff --git a/engines/scumm/script.cpp b/engines/scumm/script.cpp
index f763b967056..f07218786e9 100644
--- a/engines/scumm/script.cpp
+++ b/engines/scumm/script.cpp
@@ -648,6 +648,27 @@ void ScummEngine::writeVar(uint var, int value) {
}
}
+ // WORKAROUND bug #13378: For whatever reason, the German
and
+ // Italian talkie versions (I can't check the floppy
versions)
+ // set the game to run much too fast in some parts of the
intro.
+ // Some differences are natural because of the different
lengths
+ // of the spoken lines, but 1 or 2 is too fast.
+ //
+ // Any modifications here depend on knowing if the script
will
+ // set the timer value back to something sensible
afterwards.
+
+ if (_game.id == GID_SAMNMAX &&
vm.slot[_currentScript].number == 65 && var == VAR_TIMER_NEXT &&
_enableEnhancements) {
+ // "Wirst Du brutzeln, wie eine grobe Bratwurst!"
+ if (value == 1 && _language == Common::DE_DEU)
+ value = 4;
+
+ // Max beats up the scientist. This was probably
to
+ // match the subtitles to the speech better, but
it
+ // makes the animation look strange.
+ if (value == 2 && _language == Common::IT_ITA)
+ return;
+ }
+
_scummVars[var] = value;
// Unlike the PC version, the Macintosh version of Loom
appears
diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp
index 84c98944ba1..9ee00a92c7c 100644
--- a/engines/scumm/string.cpp
+++ b/engines/scumm/string.cpp
@@ -72,6 +72,24 @@ void ScummEngine::printString(int m, const byte *msg) {
return;
}
+ // WORKAROUND bug #13378: Sam's reactions during the intro
run
+ // much too quick for the subtitles in some localizations.
We
+ // get around this by slowing down that entire animation,
while
+ // leaving the reset of the animations unchanged.
+ //
+ // The animation speed is not very fine grained, though.
+ if (_game.id == GID_SAMNMAX &&
vm.slot[_currentScript].number == 65 && _enableEnhancements) {
+ if (_language == Common::DE_DEU) {
+ if (memcmp(msg + 16, "Ohh!", 4) == 0) {
+ Actor *a = derefActorSafe(2,
"printString");
+ if (a)
+ a->setAnimSpeed(3);
+ }
+ }
+ }
+
+
+
actorTalk(msg);
break;
case 1:
@@ -354,6 +372,44 @@ bool ScummEngine::handleNextCharsetCode(Actor *a, int
*code) {
_keepText = false;
_msgCount = 0;
endLoop = true;
+
+ // WORKAROUND bug #13378: Some of the speech is
badly
+ // synced to the subtitles, particularly in the
+ // localized versions. This happens because a
single
+ // speech line is used for a text that's broken up
by
+ // one or more embedded "wait" codes. Rather than
+ // relying on the calculated talk delay, hard-code
+ // better ones.
+ if (_game.id == GID_SAMNMAX && _enableEnhancements
&& isScriptRunning(65)) {
+ if (_language == Common::DE_DEU) {
+ if (memcmp(buffer - 10,
"gegeben!", 8) == 0) {
+ _talkDelay = 110;
+ } else if (memcmp(buffer - 12,
"nicht mag^", 10) == 0) {
+ _talkDelay = 120;
+ } else if (memcmp(buffer - 6,
"Ohh!", 4) == 0) {
+ _talkDelay = 130;
+ } else if (memcmp(buffer - 6,
"Hey.", 4) == 0) {
+ _talkDelay = 150;
+ } else if (memcmp(buffer - 9,
"Schlag!", 7) == 0) {
+ _talkDelay = 185;
+
+ Actor *a =
derefActorSafe(2, "handleNextCharsetCode");
+ if (a)
+
a->setAnimSpeed(2);
+ } else if (memcmp(buffer - 7,
"Uiii!", 5) == 0) {
+ _talkDelay = 150;
+ } else if (memcmp(buffer - 6,
"Sam!", 4) == 0) {
+ _talkDelay = 110;
+ } else if (memcmp(buffer - 11,
"behalten?", 9) == 0) {
+ _talkDelay = 120;
+ } else if (memcmp(buffer - 6,
"Sam.", 4) == 0) {
+ _talkDelay = 90;
+ } else if (memcmp(buffer - 9,
"laufen.", 7) == 0) {
+ _talkDelay = 240;
+ }
+ }
+ }
+
break;
case 8:
// Ignore this code here. Occurs e.g. in MI2 when
you
}}}
--
Ticket URL: <https://bugs.scummvm.org/ticket/13378#comment:12>
ScummVM :: Bugs <https://bugs.scummvm.org>
ScummVM
More information about the Scummvm-tracker
mailing list