diff options
-rw-r--r-- | engines/director/director.cpp | 41 | ||||
-rw-r--r-- | engines/director/director.h | 4 | ||||
-rw-r--r-- | engines/director/lingo/lingo-funcs.cpp | 23 | ||||
-rw-r--r-- | engines/director/lingo/lingo.h | 4 |
4 files changed, 59 insertions, 13 deletions
diff --git a/engines/director/director.cpp b/engines/director/director.cpp index 6456da164f..ab45e921cf 100644 --- a/engines/director/director.cpp +++ b/engines/director/director.cpp @@ -76,6 +76,8 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam _movies = nullptr; + _nextMovieFrameI = -1; + _wm = nullptr; const Common::FSNode gameDataDir(ConfMan.get("path")); @@ -146,8 +148,43 @@ Common::Error DirectorEngine::run() { _currentScore = new Score(this, _mainArchive); debug(0, "Score name %s", _currentScore->getMacName().c_str()); - _currentScore->loadArchive(); - _currentScore->startLoop(); + bool loop = true; + + while (loop) { + loop = false; + + _currentScore->loadArchive(); + + // If we came in a loop, then skip as requested + if (!_nextMovieFrameS.empty()) + _currentScore->setStartToLabel(_nextMovieFrameS); + + if (_nextMovieFrameI != -1) + _currentScore->setCurrentFrame(_nextMovieFrameI); + + _currentScore->startLoop(); + + // If a loop was requested, do it + if (!_nextMovie.empty()) { + _lingo->restartLingo(); + + delete _currentScore; + + Archive *mov = openMainArchive(_nextMovie); + + if (!mov) { + warning("nextMovie: No score is loaded"); + + return Common::kNoError; + } + + _currentScore = new Score(this, mov); + debug(0, "Score name %s", _currentScore->getMacName().c_str()); + + _nextMovie.clear(); + loop = true; + } + } return Common::kNoError; } diff --git a/engines/director/director.h b/engines/director/director.h index fee36da43c..882eb14495 100644 --- a/engines/director/director.h +++ b/engines/director/director.h @@ -110,6 +110,10 @@ public: int _machineType; bool _playbackPaused; + Common::String _nextMovie; + Common::String _nextMovieFrameS; + int _nextMovieFrameI; + protected: virtual Common::Error run(); diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp index ef19293d92..5ae58a9207 100644 --- a/engines/director/lingo/lingo-funcs.cpp +++ b/engines/director/lingo/lingo-funcs.cpp @@ -181,19 +181,24 @@ void Lingo::func_goto(Datum &frame, Datum &movie) { return; } - restartLingo(); + _vm->_nextMovie = *movie.u.s; + _vm->_currentScore->_stopPlay = true; - delete _vm->_currentScore; + _vm->_nextMovieFrameS.clear(); + _vm->_nextMovieFrameI = -1; - Archive *mov = _vm->openMainArchive(*movie.u.s); + if (frame.type == VOID) + return; - _vm->_currentScore = new Score(_vm, mov); - debug(0, "Score name %s", _vm->_currentScore->getMacName().c_str()); - _vm->_currentScore->loadArchive(); - } + if (frame.type == STRING) { + _vm->_nextMovieFrameS = *frame.u.s; + return; + } + + frame.toInt(); + + _vm->_nextMovieFrameI = frame.u.i; - if (!_vm->_currentScore) { - warning("func_goto: No score is loaded"); return; } diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h index 618d658b16..afadef7a90 100644 --- a/engines/director/lingo/lingo.h +++ b/engines/director/lingo/lingo.h @@ -174,6 +174,8 @@ public: Lingo(DirectorEngine *vm); ~Lingo(); + void restartLingo(); + void addCode(const char *code, ScriptType type, uint16 id); void executeScript(ScriptType type, uint16 id); void printStack(const char *s); @@ -534,8 +536,6 @@ private: void push(Datum d); Datum pop(void); - void restartLingo(); - Common::HashMap<uint32, const char *> _eventHandlerTypes; Common::HashMap<Common::String, uint32> _eventHandlerTypeIds; Common::HashMap<Common::String, Audio::AudioStream *> _audioAliases; |