Only cursors drawn from scripts must be copied in _cursorSprites, not the ones loaded from executable.
This simplifies a lot of globals from the Draw object, that were needed only in the cursor-from-exec case.
Note: other GOB games are not impacted even if shared code from draw_v2.cpp, inter_v1.cpp is modified (_cursorHotspotsX and _doCursorPalettes are non-null only in Adibou 2).
When cursors are drawn by scripts (_isCursorFromExe == false), do not reset cursorSprite when a cursor change is detected in animateCursor() (it may already contain the wanted cursor) and ensure palette is set to non-external for all cursor indexes.
Try to mimic more closely what is done in the executable.
Fixes black squares sometimes blinking around the cursor (just after selecting the character, when hoovering seeds bags in the vegetable garden...), and fix a temporarily disappearing "waiting" cursor in some "change CD" screens.
In some cases, e.g. Adibou walking from his house, the animation is drawn using video object and _mult->animate() calls, but outside any "evaluate hotspots" loop. The loop is done directly from the scripts and has no synchronization with frame rate, so the animation goes too fast.
We add a timing correction in the animate() loop, by not incrementing the video frame number in video object if we are in advance, and continuing the loop, to keep the UI responsive.
The script relies on "var_off_212" (current frame) becoming "-1" when the video ends, but its update was disabled for sound-only videos, by a hack for "Bamboo" game to deal with multiple live videos.
We disable this hack (i.e. re-enable var_off_212 update) when there is only one "live" video.
waitSoundEnd call finishSound(), an then updateLive(), which will load new frames while being in "finished" state.
The !props.noBlock check on call site was not enough, as sometimes the close order on a live video does not have "live" flags.
Besides startFrame == -2, it seems that a video must also go to the background (i.e. be non-blocking) if start_frame == end_frame == 0 *and* if it is not to be drawn into a specific sprite.
But more conditions may apply - they are very difficult to follow in the ASM.
This fixes interrupted sound issues in Adibou2 "Playtoons" minigame help descriptions.
It seems that this bug is harmless in the original game because it requires a certain combination of files to be present in the CD, which is not the case in practice in Adibou2 CDs ; but it exists for us because our fake "CD" search includes all files in game directory and sub-directories.