Confirmed to work with:
- darkeye (race condition when viewing cutscenes or switching scenes in
the menu)
- gadget (race condition after climbing the stairs in GA28)
- the7colors (intro cutscene timed with b_delay)
- wallobee (hotspot select gated with b_delay)
It is unclear what problem it was intended to solve, but it no longer
works now that 04cd1dccf9 has fixed the
frame loader to not reload if the frame hasn't changed.
Fixes movie playback in The Dark Eye.
When `Score::loadFrame(frameNum)` is called with frameNum <=
_curFrameNumber it will start by resetting frame state, then loading
previous n-l frames and then updating `_curFrameNumber to` `frameNum`.
This is by design, to allow abribtrary script-based frame jumping and debug console commands.
Previous to this change `Score::update()` incrementing `_curFrameNumber` directly before
calling `Score::loadFrame(_curFrameNumber)`. In effect, this meant that
every time the playhead moved forward one frame, all previous frames
would first be loaded from the stream first. Any state built
up by previous scripting is lost and perhaps impacts performance at
suitably high frame counts and debug levels.
In this change, `Score::update()` instead makes changes to a local
variable and passes the result to `Score::loadFrame()`.
Editable text boxes don't seem to abide by the channel rendering order;
you can have a bitmap in a higher channel that entirely obscures a text
entry widget, and the widget will still be visible.
Fixes the visibility of the name entry text box in Cosmology of Kyoto.
Loading the frame data wipes out e.g. sprites that have been changed
while playback has been paused.
Fixes the buttons on the opening menu screen of Cosmology of Kyoto.
Freezing changed pretty significantly in D4, so it figures that the
conditions for a frame update would change with it.
Fixes regression where loading save games in The Dark Eye would result
in a white screen.
It is possible for the following to happen:
- kEventEnterFrame/kEventStepMovie invokes a script
- script calls func_goto() to change the frame
- Lingo state gets frozen
- Lingo state gets defrosted
- script calls func_goto() to go to marker(0)
The last step -should- be a no-op, however it will only work if the
state gets defrosted -after- we change the frame. As such, if there's any
frozen Lingo states after coming back from processing
kEventEnterFrame/kEventStepMovie, we should force the engine to run
through another Score::update() cycle to update the frame.
Fixes exiting the stair climbing digital video in GA28 of GADGET: Invention,
Travel and Adventure.
This patch completely removes framesOffset and rebuildChannelData()
The framesOffset was used to store the number of frames and their
starting position in frame stream, however this information is not
needed as when in frames jumping, all the channels needed to be built
from frame 1, thus only position of first frame is needed.
This patch refactors the code that builds the framesOffsets table,
initially each frame of movie was being parsed and sprite casts loaded
then was being discarded, this was not very efficient. Refactored code
to load cast only when they are required, thus reducing the time to load
a movie.
Fixed slow loading of large movies in `totaldistortion-win`
--start-movie="ATD/HD/ADTDVSVF/TDVIDDB1.DIR" totaldistortion-win
In the original engine, the enterFrame handler can only be called
recursively upto second depth, and the third call will be ignored.
This was formerly implemented by counting number of frozen lingo
states, however there are cases where the lingo state is frozen,
while enterFrame handler not called, so the count is not accurate.
This patch improves the logic by counting the number of enterFrame
in frozen lingo states as well, so it can be identified that these
previous frames are indeed of `enterFrame` handler.
Fixes bug where the elevator when jumping to next floor (yellow one)
broke dimensional movement in `totaldistortion-win`.
Games can load movies without a score; e.g. with a MovieScript
which performs a check then bounces to a different movie.
In these cases, we can reuse the frame loader code and inject
a Score with one empty frame.
Fixes the EXE movie in Maniac Sports.
Initially, the frames data were only being reset and rebuild when
jumps were made to frame that is different than current one, ie
this in case when `_nextFrame != _curFrameNumber`, this however
had problems with `majestic-mac` not opening and stuck on loading
screen.
Fixed problem where `majestic-mac` would constantly jump to main-menu
screen (ie same frame) and would not load the game.
This removes the scoreCachedTempo from main channel struct, it was
observed that with advent of on demand frame loading, the tempo is
automatically being overwritten when found in score, this renders
previous logic to cache tempo and carry to forward useless.
`More Puppets` of 'theapartment-4` is now working.
Without this the lingo modified non puppet sprites properties were not
being reflected in the frame. Now what happens is if you modify a non
puppet property then lingo will temporarily override the score (ie that
property is remain the same until an update from score is encountered)
This closely resembles the behaviour of the original engine.
When frame jumping instructions like `go to frame` is used, it should pause
lingo execution before changing frames and then executing remaining lingo code,
This fixes the problem where lingo was executed before the frame was updated.
`ATD\HD\bdDREAMA.DXR` of 'totaldistortion' uses this to set puppetSprite after
calling go to frame.
Total number of frames were being read from VWSC resource
(version > kFileVer400), however it has been found that for some movies
there is mismatch between version and total frames. Therefore now changed
the code to load all frames initially to read total number of frames.
`ATD\HD\ABPOPUP1.DXR` of `totaldistortion` is one such example.