[Scummvm-git-logs] scummvm master -> 27e6b811d5105907ae8e75d4356e68408672773a
AndywinXp
noreply at scummvm.org
Fri Aug 9 14:12:54 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
27e6b811d5 SCUMM: DIG: Fix #15047
Commit: 27e6b811d5105907ae8e75d4356e68408672773a
https://github.com/scummvm/scummvm/commit/27e6b811d5105907ae8e75d4356e68408672773a
Author: AndywinXp (andywinxp at gmail.com)
Date: 2024-08-09T16:12:47+02:00
Commit Message:
SCUMM: DIG: Fix #15047
This fixes and closes #15047:
"SCUMM: DIG: "Holding an object"-state gets cancelled by cutscene override"
Once again this is one of those cases in which v7-v8 shuffled
elements around the main loop.
Fixing this also forced me to remove an hack for v7 which attempted
to fix timing for e.g. the screen shake + breakHere() combination.
This is also properly fixed now.
Changed paths:
engines/scumm/scumm.cpp
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 4f5e418a0c3..c40b44a11b4 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -2666,19 +2666,20 @@ void ScummEngine::scummLoop(int delta) {
if (_game.version <= 3)
displayDialog();
- processInput();
+ // In v7 we have to run processInput() at the end of the loop,
+ // to allow one frame time to pass between checkExecVerbs() and runAllScripts().
+ // Several time-based effects (e.g. shaking) depend on this...
+ if (_game.version != 7) {
+ processInput();
- if (_game.version == 8) {
- // In v7-8 this function is executed at the end of processInput().
- // Currently there are no known cases for v7 in which not calling this here,
- // causes issues. Because of the way things are positioned in our implementation
- // of the SCUMM loop, as of now enabling this for v7 breaks the screen shake
- // effect. For v8 we really need to call this here, so let's do that...
- checkExecVerbs();
+ // Additionally, v8 runs checkExecVerbs() at the end of processInput()...
+ if (_game.version == 8) {
+ checkExecVerbs();
- // Saving is performed here in v8; this is important when saving the thumbnail,
- // which would otherwise miss blastObjects/Texts on the bitmap.
- scummLoop_handleSaveLoad();
+ // Also, saving is performed here in v8; this is important when saving
+ // the thumbnail, which would otherwise miss blastObjects/Texts on the bitmap.
+ scummLoop_handleSaveLoad();
+ }
}
// BlastObjects/Texts are completely removed in this moment of the codepath, in v7.
@@ -2736,15 +2737,29 @@ load_game:
((SoundHE *)_sound)->handleSoundFrame();
}
- if (_game.version < 8) {
+ if (_game.version < 7) {
runAllScripts();
+ checkExecVerbs();
}
- // SCUMM v7-8 executes checkExecVerbs inside the function
- // which processes keyboard inputs, so we handle it above
- // in that case. Again, we make an exception for v7, for now.
- if (_game.version < 8)
- checkExecVerbs();
+ // It's verified from FT and DIG disasms that this is where
+ // runAllScripts() should be called; this will delay the
+ // scripts executions between checkExecVerbs() and runAllScripts()
+ // by exactly one frame, and this is what allows sequences of:
+ // - Set screen shake on
+ // - breakHere() for a certain number of times
+ // - Set screen shake off
+ //
+ // to work and to be timed correctly.
+ //
+ // Again, from the disasms, we call runAllScripts() on a loop,
+ // while the _saveLoadFlag is active.
+ if (_game.version == 7) {
+ do {
+ runAllScripts();
+ scummLoop_handleSaveLoad();
+ } while (_saveLoadFlag != 0);
+ }
checkAndRunSentenceScript();
@@ -2806,6 +2821,15 @@ load_game:
playActorSounds();
}
+ // It's verified from FT and DIG disasms that this is where
+ // these two functions should be called; this will delay the
+ // scripts executions between checkExecVerbs() and runAllScripts()
+ // by exactly one frame.
+ if (_game.version == 7) {
+ processInput();
+ checkExecVerbs();
+ }
+
scummLoop_handleSound();
camera._last = camera._cur;
More information about the Scummvm-git-logs
mailing list