[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