In most (if not all) versions of Loom before the Talkie v4 release, one
of the shepherds should trigger a "We are the masters of stealth" line
if Bobbin tries to use the stealth draft on them, but no proper value for
the actor number is ever given. In the original interpreters, the invalid
line would be skipped. The Talkie release changes the lines a bit and
makes the third shepherd (act. 4) say something similar, instead.
Until now, ScummVM would work around this by forcing the leftmost (act. 2)
shepherd to say this line. But, looking at the original script, it seems
that the original intent may have been to let any of the four shepherds
say this line, since script 232 expects a parameter which could be given
by any of the associated 422--425 (act. 2--5) actor objects.
So, moving this check from actorTalk() to o5_startScript() lets us
implement a more comprehensive workaround (with a bit more safety checks,
since there are so many Loom versions), but it also exposes another bug
in some EGA versions and derivatives (e.g. the French EGA version has it,
but the English EGA 1.1 version doesn't): if Bobbin uses the stealth draft
on the second shepherd (act. 3), then some line(s) will be completely
missing, potentially because this actor has been removed from the scene
in the earliest versions, although he's still in use.
Having zero reaction from the shepherds when you try their draft upon
them can be extremely confusing, so we need to work around this, too.
Forcing this actor to "stay" doesn't fix the issue for now (and the
symptoms are a bit different between ScummVM and the original
interpreters), so at the moment we force this workaround even if
`_enableEnhancements` is not enabled, when we detect this strange
actor behavior.
There was no copy protection on NES, since it was on a cartridge.
One just needs to open the security door like a regular door, with its
dramatic sound effect.
This also lets one close the door again, like in the original game.
The mainRoutine() function returns a byte, not a bool. This caused text
to be partly erased when drugging the piranha poodles in MI1. Probably
other things as well.
Prior to this, create_project always set USE_TEXT_CONSOLE_FOR_DEBUGGER on Xcode.
This was hard-coded behavior that I should have removed when I added configuring
this feature on the command line in 8c32927f393dddcbe3dfa1b19b38cd332283b6bd
Now it's disabled by default and can be enabled by --enable-text-console, just
like the other projects.
Apparently in some builds the gScummVMVersion still contains the revision number (contrary to the comment in base/version.h, actually). I normally don't notice that, since it doesn't happen in my own builds. The long strings will break text fields that can't have strings of that length.
I'll now just generate my own version from gScummVMVersion, so I do get the desired (short) layout.
This is similar to what we recently fixed for the saving. It does concern only the loading from the SCI menu and from the SCI death dialog (that's how it got my attention).
I have written a long comment in SciMusic::resetGlobalPauseCounter() which explains it.
I have decided to make this very obvious (you could say: more ugly), so it won't cause confusion in the future. Of course, it could be just hidden somewhere deep in SciMusic::saveLoadWithSerializer() and noone would ever notice. But the "ugly" way seemed the safer thing to do...
The lab cutscene where Purple Tentacle is bullying Sandy would hang
when Dr Fred is done talking, in the official French version.
This appears to be related to this VAR_CHARCOUNT check in script no. 155:
[0085] (14) print(9,"{{Dr Fred's reaction line, shorter in French}}");
[00DA] (80) breakHere();
[00DB] (44) unless (VAR_CHARCOUNT > 90) goto 00DA;
Usually, French sentences are a bit longer than English sentences, but
in this case, it's shorter, but yet the script didn't adjust the 90
value, so it would indefinitely loop, causing the scene to hang (until
the player presses the Esc key) and Sandy's reaction to be lost.
So we just pad this string with extra spaces if its length looks too
short for the default VAR_CHARCOUNT check. This should also remain
harmless if the string *is* long enough, or if a translation did fix
the VAR_CHARCOUNT check.
Still, we only restrict this workaround to the French version for now,
since we're not aware of a similar problem with other translations.