[Scummvm-tracker] [ScummVM :: Bugs] #15403: SHERLOCK: Mouse clicks may be ignored
ScummVM :: Bugs
trac at scummvm.org
Sun Oct 13 07:04:40 UTC 2024
#15403: SHERLOCK: Mouse clicks may be ignored
-------------------------+-------------------------------------------------
Reporter: antoniou79 | Owner: (none)
Type: defect | Status: new
Priority: normal | Component: Engine: Sherlock
Version: | Keywords: Rose Tattoo, Serrated Scalpel,
Game: | unresponsive, interaction, user interface
-------------------------+-------------------------------------------------
Tested on Windows 10 x64, and Android 12 (smartphone) with ScummVM 2.8.1
(2.8.1.1 on Android) and also ScummVM 2.9.0git from recent master HEAD.
This is an issue with both "The Lost Files of Sherlock Holmes" games: "The
Case of the Serrated Scalpel" and "The Case of the Rose Tattoo". It can
occasionally be observed in the demo we have on the ScummVM website for
the Serrated Scalpel.
This does not happen consistently but it happens frequent enough to be
annoying (I've only tested with early parts of the games, maybe later on
it becomes more of an issue, since these games feature mini games and
various user interface modes).
On Android this tends to happen more frequently (maybe due to the special
way we have in place to differentiate taps from long touches or double
taps etc).
How to reproduce:
Start a new game, reach proper gameplay (after the intro cutscenes) and
start interacting with the interface and the screen hotspots. *Sometimes*
the game will ignore the users clicks even though user has control (ie.
it's not during a cutscene or during a script that disabled user
controls).
From a look through the engine code, I think I've spotted the culprit but
fixing it will require someone very familiar with the engine -- hopefully
not a complete overhaul of the input handling system.
The culprit seems to *mainly* be this method's "Events::delay()"
implementation:
https://github.com/scummvm/scummvm/blob/d0336f568e3101dc480363451a76257dc2d3d4ce/engines/sherlock/events.cpp#L333
The delay method implements a blocking delay. It distinguishes between a
short delay and a longer delay, but in both cases it calls the method
Events::pollEvents(). For the longer delays (10 ms or more), it breaks the
delay in 10ms segments and iterates them while looping for the total
duration with each iteration calling pollEvents().
This method Events::delay() seems to be called in numerous places in the
engine code, either directly or via the "Events::wait(int numFrames)"
method.
The method Events::pollEvents():
- Handles screen updates via checkForNextFrameCounter() (this is also an
issue when attempting to fix the situation)
- Consumes the next pending event
- Updates the mouse position
Calling pollEvents() frequently results in smooth mouse movement (that the
original games *do not have*). But since in this case pollEvents is called
while in a blocking wait, it can consume click events without the engine
ever properly handling them. (The keyboard events are pushed in a special
queue (_pendingKeys) so presumably those are properly handled eventually;
I am only focusing on missing mouse clicks in this report).
During my debugging the repeated calls to pollEvents during executing a
blocking "wait" would consume the mouse down and up events before the
blocking wait would conclude, thus the rest of the code remained
unsuspecting that a click event occured.
Since for the early scenes of the games the events.wait()
ScalpelScene::doBgAnim() and TattooScene::doBgAnim() seemed to be mainly
"eating up" the mouse clicks, I've attempted a partial fix by replacing
those waits with a similar method that would not call pollEvents(). But,
this also required manually placing pollEvents() in other parts of the
engine code because it expected pollEvents() to have been run after a
doBgAnim() call, and doing a checkForNextFrameCounter() during the wait to
maintain how the engine updated the screen. And as an expected side-
effect, the mouse movement also became sluggish. However, this did make
the engine not miss those clicks (tested in Windows and Android).
This would not be a complete fix, since there's other places where wait()
and delay() are used and would need to be fixed. (For example in "Serrated
Scalpel" this would need to be done at least for the Journal, Setup Menu,
maybe the map, darts game(?) and perhaps elsewhere). I suspect that direct
calls for delay() won't need "fixing" because practically the issue comes
from the longer delays that are cause by wait() (since wait has a number
of frames arguments).
--
Ticket URL: <https://bugs.scummvm.org/ticket/15403>
ScummVM :: Bugs <https://bugs.scummvm.org>
ScummVM
More information about the Scummvm-tracker
mailing list