Commit Graph
4807 Commits
Author SHA1 Message Date
sluicebox 51f1d4dc73 SCI: Fix LB2 reporter message 2023-01-10 14:50:51 -08:00
sluicebox 6eea9e517b SCI: Detect SCI16 unthrottled inner loops
This restores kGetEvent throttling (10ms delay) during inner loops that
don't throttle themselves. For example, the event processing loop in
Dialog:doit doesn't include a kWait(1) call in some games.
In these games, dialogs max out CPU, and if they run animations then
they run too fast. This happens in the CD version of JONES, bug #14020.

I had considered doing something like this earlier, but it wasn't clear
how to best detect these loops. What I didn't realize is that the SCI32
code already does this by counting kGetEvent calls in between kFrameout.
Now that technique is adapted for SCI16. Combined with the existing
"fast cast" detection, this throttles event-polling inner loops while
keeping the kGetEvent and kGameIsRestarting throttling separate so that
they don't overlap and conflict.

See: e09010f7d8
2023-01-10 14:50:51 -08:00
sluicebox 046356c85a SCI: Convert LSL1 polygon workaround to script patch 2023-01-08 17:01:01 -08:00
sluicebox 47fbb31c08 SCI: Disable LSL1 speed test
This was missing from: ea48986006

Fixes bug #14004
2023-01-02 01:16:06 -08:00
sluicebox d10fd9f124 SCI: Revert disabling LB2 control panel in tunnel
These rooms disabled the control panel to prevent the player from
accessing the game's speed setting. Ego is set to a fixed speed and
the timing of the room scripts depend on that speed.

See: 11ca903f60
2022-12-21 12:26:52 -08:00
sluicebox 76044dc51a SCI: Fix CNICK_LONGBOW uninit read workaround
This uninitialized variable read wasn't being detected until the
variable layout was fixed in: 30fad94e9a
2022-12-21 12:26:51 -08:00
sluicebox 2c01722f9b SCI: Fix QFG1VGA Sierra logo animation speed
The previous commit fixed inconsistent animation speed in
this room due to our throttling.

This patch fixes slow animation due to Sierra's throttling.
2022-12-21 12:26:51 -08:00
sluicebox ae5db52c2e SCI: Remove speed test detector
This heuristic was originally how all SCI16 speed tests were handled.
It has been gradually replaced with script patches, until all games
were patched in: ea48986006

At the time, I left this in because it had the benefit of speeding up
the SCI11 test variants so that they didn't produce a startup delay.
Now we know that this heuristic has been identifying regular rooms as
speed tests and unthrottling them too, causing unintended effects.
Some of this behavior was masked by fast-cast throttling occurring
everywhere, until: e09010f7d8

For example, the QFG1VGA Sierra logo animation changes speed and runs
very fast as soon as the sparkle is finished. The Longbow map rooms
were also detected as speed test rooms and animated too fast. Cast-less
rooms like LB2's title screen run unthrottled and consume CPU.

There are only a few SCI11 speed test rooms, so now they're explicitly
unthrottled in kGameIsRestarting with the other throttling exceptions.
2022-12-21 12:26:51 -08:00
sluicebox e46767b8f8 SCI: Fix LONGBOW map animation speed
Speed throttling was disabled on LONGBOW maps because they were treated
as speed tests by the heuristic in GfxAnimate::throttleSpeed. This bug
was masked by fast-cast throttling being applied everywhere, but that
was changed in e09010f7d8

Now the map rooms trigger throttling so that they don't run too fast.
But the game scripts also attempt to throttle the animations based on
speed test results, causing them to run too slow, so that's patched out.

Fixes bug #13966
2022-12-14 05:00:42 -08:00
sluicebox 032afca6cb SCI: Fix LB2 CD hands-off cursor 2022-12-09 23:31:17 -08:00
sluicebox 11ca903f60 SCI: Fix LB2 disabled control panel icon
Now that we allow arbitrary saving via the Global Main Menu,
we can remove the buggy restrictions that prevented saving
and restoring
2022-12-09 23:31:16 -08:00
sluicebox f3f90556d4 SCI: Remove SCI32 code from SCI16 kDoAudio 2022-12-09 23:31:16 -08:00
sluicebox 2e7c3e4f7d SCI: Update LB2 Act 5 script patch for wired door
Fixes the remaining edge cases with this buggy door
2022-12-07 16:26:09 -08:00
sluicebox e2d216013d SCI: Fix LB2 Act 5 transom bugs 2022-12-07 16:26:08 -08:00
sluicebox 334191f636 SCI: Add PATCH_GETORIGINALBYTES to script patcher
Script patches often involve moving entire sequences of existing
instructions. Now that can be done with a smaller patch definition.
2022-12-07 16:26:07 -08:00
sluicebox 903498b6dc SCI: Fix LB2 Act 5 broken timers 2022-12-07 16:26:07 -08:00
sluicebox 9641a3608b SCI Fix LB2 Act 5 trigger 2022-12-02 16:11:34 -08:00
sluicebox 60f04d4e7c SCI: Fix LB2 Act 5 timer crash 2022-12-02 16:11:34 -08:00
sluicebox 1c64c0c4c4 SCI: Fix LB2 CD mummy coffin animation glitch 2022-12-02 16:11:33 -08:00
sluicebox b9df07b465 SCI: Fix LB2 Act 5 mummy coffin lockup 2022-12-02 16:11:33 -08:00
sluicebox 4d6c2f474e SCI: Fix LB2 CD museum actors facing wrong direction 2022-12-02 16:11:32 -08:00
sluicebox 2d73220c13 SCI: Add media type to resource patch definitions 2022-12-02 16:11:32 -08:00
sluicebox bf47637280 SCI: Remove KQ6 black widow script patch
The VM discrepancy that caused these buggy scripts to behave
differently has been fixed, so this patch is no longer needed
2022-11-30 23:13:00 +02:00
sluicebox 30fad94e9a SCI: Track correct location and size of temp variables
The VM has been treating the entire area between the frame pointer and
the stack pointer as temp variables for the current function. There are
two problems with this:

1. The VM hasn't been updating the frame pointer correctly when multiple
   methods are called within the same send/self/super instruction.
2. The VM has been recalculating the number of temp variables on every
   instruction as the difference between the two pointers.
   This is incorrect, as this changes with almost every instruction in
   ways have nothing to do with the number of temp variables allocated
   by the link instruction. Meanwhile, the VM has not been recording
   the number of variables allocated by the link instruction.

The first discrepancy caused scripts to behave differently than in SSCI
when reading parameters out of bounds in certain situations.
It also prevented our uninitialized variable detection from detecting
certain reads. The second made the temp-count used for out of bounds
detection too large, made debugger output such as `stack` incorrect,
and made stepping through the link instruction in the debugger appear
to do nothing until stepping through the following instruction.

When multiple methods are called by a send/self/super instruction, each
method's link instruction increases the stack pointer further.
Method B's variables appear after method A's. The VM has been setting
the stack pointer correctly but it kept using the previous frame
pointer, so method B would re-use method A's stack area instead of the
area the VM had just allocated for B. If a script correctly initializes
variables before using them and doesn't use out of bounds parameters or
temp variables then this discrepancy doesn't make a difference.
But a lot of scripts do these bad things and accidentally rely on the
undefined values they read.

Now we update the frame pointer correctly when "carrying over" to
subsequent method calls from the same send/self/super instruction.
This matches SSCI behavior. We also now record the number of temp
variables that have been allocated by the link instruction and use
that instead of incorrectly recalculating on every instruction.

Fixes the KQ6 black widow lockup, and other KQ6 music bugs, where
scripts call Sound:fade without the required fourth parameter.
Sound:fade expects a fourth parameter, so reads it out of bounds,
and passes it as the stop-after-completion boolean to kDoSoundFade.
Scripts that called Sound:fade as the only method in a send got the same
results as in SSCI, but scripts that called Sound:play first didn't.

Fixes bugs #5625 #5653 #6120 #6210 #6252 #13944
2022-11-30 23:13:00 +02:00
sluicebox ea86295e3e SCI: Update QFG3 Woo dialog script patch
Simplifies the patch and updates the description
2022-11-29 18:35:45 -08:00
Donovan Watteau 25842987ef SCI: Fix MSVC C4309 enum sign warning 2022-11-29 01:37:55 +01:00
sluicebox 33c6fe1131 SCI: Fix KQ6 black widow lockup with script patch
Recent fixes to the sound fading code have exposed this bug again.
It was first fixed 12 years ago, and then again 10 years ago.

Both times, the bug was fixed by changing kDoSoundFade behavior.
But those changes added behavior that was different from SSCI, and
those differences caused problems in LB2. kDoSoundFade is now
accurate, and so the bug has returned, but it was never a sound bug.

The black widow lockup is due to a script bug that accidentally relies
on undefined values from non-existent parameters. ScummVM produces
different undefined values than SSCI in certain situations, and this
is one of them. The undefined values are then passed to kDoSoundFade
as real values in a correct kernel call.

Now this is fixed with a script patch that removes all five broken
Sound:fade calls. They were redundant because they attempted to fade in
to the same volume they had just set.

Perhaps we can replicate SSCI's undefined behavior someday, but in
the meantime this bug is fixed.

Fixes bugs #5625 #5653 #6120 #6210 #6252 #13944
2022-11-25 16:36:19 -08:00
sluicebox 2fbeecab23 SCI: Prevent script lockers from overflowing
Script::_locker is supposed to track the number of classes and objects
that use a script in order to determine when it can be safely unloaded.
But for system script 999, _locker rapidly increases throughout the game
and eventually overflows. This causes script 999 to unload and crash.
Other scripts may also be affected.

We have been provided QFG1 SCI0 saves where this occurred over the
course of hours within only three days. Logging shows this value
skyrocketing in many games even when they are just polling input or
animating the screen. Alarmingly, this suggests that many SCI games
become unplayable in ScummVM after an achievable amount of game time.

This may be a large and complex problem within the script locker system.
For now, we can mitigate this by making Script::_locker unsigned, which
its callers expected it to be, and by logging overflow attempts and
lowering the locker. This fixes existing save games, even if they have
already overflowed the signed maximum.
2022-11-22 12:37:32 -08:00
sluicebox ff9e03c4bd SCI: Convert LSL5 stopGroop workaround to script path 2022-11-17 15:45:17 -08:00
sluicebox aaebd2aa85 SCI: Fix some comments 2022-11-12 19:33:37 -08:00
sluicebox b5b94a03da SCI: Convert LB2 German fix to message workaround 2022-11-08 16:37:18 -08:00
sluicebox ddf7b7da14 SCI: Add KQ6 Mac workaround for long About message 2022-11-08 16:37:18 -08:00
sluicebox 2d98fda2df SCI: Fix KQ6 Mac About dialog lockups
Fixes script bugs in the original that caused buttons such as
"Tips for playing King's Quest VI" to always lock up the game
2022-11-08 16:37:17 -08:00
sluicebox daed465639 SCI: Add option for high resolution Mac fonts
This adds the existing GAMEOPTION_HIGH_RESOLUTION_GRAPHICS option to
Mac games with native fonts. Default is enabled. If disabled, then the
low resolution Mac fonts are used and the game isn't upscaled.
2022-11-06 23:05:20 -08:00
sluicebox 1efdb1cb6c SCI: Add support for Macintosh fonts
High-resolution native Macintosh fonts are now supported in the
following games when the game's executable is present:

- Castle of Dr. Brain
- Freddy Pharkas
- King's Quest 6
- Leisure Suit Larry 1
- Leisure Suit Larry 5
- Space Quest 1

And in these games when classicmacfonts.dat is present:

- Leisure Suit Larry 6 (floppy)
- Quest for Glory 1
2022-11-06 23:05:20 -08:00
sluicebox ff017dc44f SCI: Fix SCI16 Mac QuickTime playback when upscaled
Required for Mac fonts. Previous code implicitly assumed that the first
format in the system's would always be 2 bytes per pixel. This is not
the case when upscaling. Now we explicitly search for the format.
2022-11-06 23:05:20 -08:00
athrxx 47763f7bc1 SCI: (BRAIN) - fix music pause bug
When skipping the intro via 'Esc' and 'Skip' the script
sets up a pause which it won't release later. This brings
our pause counters out of sync and triggers an assert.
This fix should work around this...
2022-11-06 14:13:48 +02:00
Hubert Maier 1158b00dad SCI: Correct spelling mistakes
accomodate -> accommodate
firey -> fiery
2022-11-01 23:46:28 +01:00
Hubert Maier 304598c7da SCI: Correct spelling mistake
accomodate -> accommodate
2022-10-27 15:57:29 +02:00
Hubert Maier 1b65d42429 SCI: Correct spelling mistake
neccessary -> necessary
2022-10-27 15:57:28 +02:00
Le Philousophe f54bdf989a SCI: Don't use unsafe sprintf and vsprintf 2022-10-23 22:46:19 +02:00
Le Philousophe 682c11e801 SCI: Don't use unsafe strcat and strcpy 2022-10-23 22:46:19 +02:00
Le Philousophe 0b918a5352 SCI: Rename strcpy function to prepare for forbidden name
Even though strcpy in SegManager isn't a problem, our forbidden symbols
list being defined at preprocessor level, we won't be able to use this
name anymore.
2022-10-23 22:46:19 +02:00
sluicebox b7dc7f39d1 SCI: Fix typos in script patch comments 2022-10-14 12:40:39 -05:00
sluicebox e50833c400 SCI32: Fix LIGHTHOUSE script patch comment 2022-10-13 19:12:41 -05:00
sluicebox 7f0f63670b SCI32: Fix LIGHTHOUSE animation speed when opening safe
Fixes bug #10226
2022-10-13 19:01:09 -05:00
sluicebox 26d4a53d56 SCI32: Fix LIGHTHOUSE missing birds in tower roost
Fixes bug #10265
2022-10-13 19:01:09 -05:00
sluicebox 73da3458ba SCI32: Fix QFG4 scripts that consume extra projectiles
Fixes bug #13823
2022-09-13 22:17:33 -08:00
Donovan Watteau bf5e489567 JANITORIAL: Fix "to to" and "if if" typos in some comments 2022-09-11 17:45:25 +02:00
sluicebox 9bbdec165c SCI: Fix QFG3 Laibon Teller options
This is a follow-up to the script patches for the dead-end event
bugs in the Laibon's hut: 6e743a97ef

Those patches had the unintended side effect of allowing two dialogue
options during an event where they shouldn't be available. Now their
logic is updated to match the other patches so that they only appear
during their intended event.

Fixes bug #13748
2022-09-01 09:44:05 -08:00