In the NES version of Maniac Mansion, each kid has their own CD player
playing a different background music by default.
Each CD player script does something like this when you turn it off:
(2F) if (!getState04(46)) {
(D8) printEgo("It's already off.");
(18) } else {
(67) clearState04(46);
(1A) Var[224] = 0; # <==
(3C) stopSound(71);
(**) }
but Wendy's CD player script is missing the `Var[224] = 0` line, so
although her music was stopped, the game scripts weren't properly aware
of this, and so her music could suddenly resume, such as when entering
and leaving room 3 with her character.
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.
When switching back to Zak after using the blue crystal on the bird in
Lima, the bird disappears, comes back, and disappears again. This is a
very strange visual behavior that only happens in the FM-TOWNS version.
(This has been confirmed, back in 2006, to be an original bug that also
occurs under the Unz emulator.)
This V3 port added an unconditional putActor(6,136,0) call at the start
of the 201 script which controls this, negating the getActorX() and
getActorY() checks which happen a few lines later. Ignoring this
putActor() call appears to restore the original V2 behavior, i.e. the
bird flies back to the pedestal.
Some versions of Loom will always show the close-up of sleeping Rusty
where he's wearing his own clothes. Later versions (e.g. FM Towns and
VGA) will show different close-ups depending on if you've used the
Reflection draft on him. So this adds that check to the older versions
as well.
The original fixed versions will look at a variable to determine if
you've used the Reflection draft on Rusty. Unfortunately, it's not the
same variable across all versions - there are even different EGA
versions with different variables! - so instead we check if the Bobbin
actor has a different costume. That seems to work across all versions so
far.
I didn't create this workaround, but I think it makes sense to make it
(ensuring that the window is broken and the coat is there even if you
skip the intro) optional.
The object that the click registers on doesn't has an empty object
script, so it won't move you back into the caves. Redirect to the
appropriate object's script instead. I've verified with the built-in
debug mode that the original seems to have the same problem.
In the EGA version, and others I've tried, the problematic object is
later in the object list, so the cave object takes precedence.
There was no WaitForMessage() after "Oooh, that's nice." when you give
the wimpy idol to the cannibals, so we simulate one. The other missing
lines, that were mysteriously dropped from the VGA CD version, were
probably never recorded so we make no attempt to reinstate them for this
version.
Unfortunately that means I had to add the enhancements checkbox to the
EGA Loom settings widget, because I can't see any way to automatically
combine the static and dynamic settings widget. Oh well.
Don't let the "send Rusty's ghost to guard the rift" script start as
long as the "make Rusty's ghost appear" script is running, because once
he reaches the rift he will then instantly teleport back to his body.
This bug happens in the original as well, though at least in ScummVM it
behaves a little bit differently in the FM Towns version than in any of
the other I tried. The fix still works for all of them, though.
The VGA talkie version is not affected, because there Rusty's ghost
appears in the rift, and the dialog makes sense regardless of whether
Bobbin or Rusty speaks first.
This was a script bug in the EGA DOS, Amiga and Atari ST versions, where
the open door object was left clickable after the door closed. Later
versions fixed it in two different ways: Either by making sure it wasn't
clickable, or by checking that the door really was open in the object
script.
We use the first fix, even though it becomes a bit inconsistent when the
object is later made unclickable. The second fix is only used by the FM
Towns and TurboGrafx-16 versions, as far as I can tell.
You're both still outside, so it doesn't make sense for the background
sound to suddenly stop. I guess the makers of the Special Edition agree,
because there the sound doesn't stop either.
* SCUMM: Fix Invalid phrase with GIVE crashes Monkey Island EGA Demo
* SCUMM: Suggested changes on Pull #3731
* SCUMM: specify game id in Pull #3731
* SCUMM: seperated AMIGA monkey VGA and VGA Demo variants. Assigned GF_DEMO flags
The first and second animation when Mandible uses the distaff were so
close that they looked like one, and it looked like the second one was
missing. This patch adjusts the timing of the second one.
The more I looked at it, the less I liked my old solution. Intercepting
getVar() meant that jumpRelative() would still be called, which made it
sensitive to what getVar() returned when the workaround was active. And
I have no idea how it didn't mess up _scriptPointer somewhere along the
way. So now it's in o5_equalZero() instead, where it can completely
replace the original instruction with o5_breakHere().
When examining the dragon's pile of gold a second time, the "Wow!"
message was not visible. This appears to be a scripting bug particular
to this version (it works in the EGA version), and we work around it by
simulating a WaitForMessage() instruction after the message is printed.
I noticed that the "I am Choas" typo in VGA Loom was no longer patched,
and I'm guessing the other workarounds may have been broken too. This
was a regression from when the missing Lemonhead lines in Monkey Island
1 were reinstated.
Now Bobbin's palette is changed when entering/leaving the darkened tent.
It's odd that this effect looks so different from all other versions of
the game that I've tried (VGA, EGA and FM Towns), but it seems to match
the original behavior based on YouTube videos I've watched.
The credits script asks for white shadowed text, but the original (at
least when running in Basilisk II) uses light gray shadowed text. I have
no idea why, and the only workaround I can think of is to force the text
color this way.
It's possible for scripts to remap colors, of course, but that's not
what seems to be going on here.
I don't have this version of the game myself, so it's based on a YouTube
playthrough and walking through the process of extracting the necessary
data with timofonic. It has not been properly tested, though the
messages do look correct if I insert them into the English version.
WORKAROUND bug #12420 (also occurs in original) Broken window and coat missing
This happens when you skip the cutscenes in the beginning, in particular
the one where Indy enters the office for the first time. If object 23 (National
Archeology) is in possession of Indy (owner == 1) then it's safe the force the
coat (object 24) and broken window (object 25) into the room to compensate for
the skipped code.
Also occurs in original.
In script 204 room 25 (Cannibal Village) a crash can occur when you are
expected to give something to the cannibals, but instead look at certain
items like the compass or kidnap note. Those inventory items contain little
cutscenes and are abrubtly stopped by the cutscene in script 204 at 0x0060.
This workaround changes the result of isScriptRunning(164) to also wait for
any inventory scripts that are in a cutscene state, preventing the crash.
Script #204
[0000] (1A) Bit[354] = 1;
[0005] (1A) Var[249] = 0;
[000A] (5D) setClass(303,[32]);
[0011] (DD) setClass(VAR_EGO,[5]);
[0018] (2E) delay(1200);
[001C] (80) breakHere();
[001D] (68) VAR_RESULT = isScriptRunning(164);
[0021] (A8) if (VAR_RESULT) {
[0026] (18) goto 001C;
[0029] (**) }
[0029] (58) endOverride();
[002B] (91) animateCostume(VAR_EGO,3);
[002F] (5D) setClass(303,[160]);
[0036] (40) cutscene([]);
[0038] (AE) WaitForMessage();
[003A] (14) print(5,[Text("Obviously you have nothing for us.")]);
[0060] (C0) endCutscene();
[0061] (2A) startScript(105,[],F);
[0064] (A0) stopObjectCode();
END
In the floppy VGA version (and presumably the EGA version as well), the
clock tower only gets a new description ("e.g. "Hmm. Still ten
o'clock.") if you leave the room after examining it. In the CD version,
someone has "fixed" the behavior so that the description changes
immediately when the clock tower is examined.
Since it also changes on exiting the room after examining the clock
tower, that means you're much less likely to ever see the second
description. (There are only three, with a random variation on the
last one.) It doesn't completely ruin the joke, but...
To restore the original behavior, we don't allow the clock tower script
to increment the variable that changes its description.
We recently enabled the smoke animation that was present in the EGA and
VGA floppy versions of MI1, but removed in the CD version. However, for
a couple of reasons the colors were not correct.
For one thing, the animation doesn't use the same color indexes as in
the floppy version. But it still tries to remap the floppy version's
color indexes to other colors.
For another, one of the colors it tries to remap to gets overwritten,
probably to ensure that the GUI uses consistent colors. If that's the
only reason, we can safely ignore that for this room since it has no
visible GUI.
The voodoo lady's smoke is still using different colors than the floppy
version. I have no good ideas for how to fix that. Those colors will get
overwritten, and this time there is a visible GUI. But perhaps that
shouldn't be fixed since the special edition, for better or for worse,
pretty much made those colors canonical.
There's enough space to just change the first message and insert the
WaitForMessage(). No need to mess with the second message, since that
one's already correct.
Apparently these were lost when the game was converted from floppy to CD
version. Not just in the English version, but that's all I have. We
should come up with a way to make it easy to add other languages,
though.
In the EGA and VGA floppy versions, the close-up of captain Smirk has
animated cigar smoke. I don't have the EGA version, but in the VGA
version it apparently depends on whether you're running the game from
floppy or hard disk. If you run it from floppy, there is no smoke,
probably to cut down on disk access.
This is implemented in the entry script for room 76, where it either
sets costume 76 or 0 on actor 12.
In the VGA CD version, it always sets costume 0. Setting it to 76
restores the smoke, but the position is a bit off. Using the positions
from the floppy verion's script 57 fixes that. I have no idea why they
were changed in the CD version when they seem to use the same animation.
Only the colors are a bit different.
The "Ultimate Talkie" version already fixes this, but this fix should
not interfer with that. It uses slightly different positions for the
smoke, but the difference is never more than a single pixel so I'm not
touching those.
In Macintosh b/w mode, there really is no such thing as palette
manipulation. Any color changes have to be handled by the renderer.
Instead of marking the palette as dirty, changes to the shadow palette
trigger a full redraw of the screen.
At the time of writing, I'm only aware of two things that use this: The
lightning flashes at Castle Brunwald in Indiana Jones and the Last
Crusade, and the scene where the dragon finds Rusty in Loom. I have
verified that both of these seem to work correctly.
While testing the Mac version of MI2, I noticed that the game would
resume the Woodtick music while Largo's theme was still playing after
the scene with the bartender. We already have a workaround for a similar
problem when he's talking to Mad Marty, and the cause seems to be the
same both times: Optimistic scripting. So delay that music transition as
well.
I've excluded the Amiga version from this workaround, because that one
cuts much of the music so it shouldn't be needed there. But if I'm
wrong, please let me know.
If you offered an object to someone, e.g. one of the guards at Castle
Brunwald, then clicked "Never mind" instead, the next time you tried you
would only see one inventory object. This seems to be because unlike the
DOS version (at least the 256-color version), script 12 only enables
verb 101, not the whole inventory.
Perhaps the Mac version treated the inventory as a single verb?