aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorEugene Sandulenko2017-02-07 20:57:32 +0100
committerEugene Sandulenko2017-02-07 20:57:32 +0100
commita09d15e89266fb0f9f655dab8083484fc11ac232 (patch)
treee8125a907ba9cebb8ce2a13270be306b65a54de1 /engines
parent355435e9a7bbcfcc0e4dc23e45dfce3b5337a1cd (diff)
downloadscummvm-rg350-a09d15e89266fb0f9f655dab8083484fc11ac232.tar.gz
scummvm-rg350-a09d15e89266fb0f9f655dab8083484fc11ac232.tar.bz2
scummvm-rg350-a09d15e89266fb0f9f655dab8083484fc11ac232.zip
DIRECTOR: Fixed Lingo's 'go to movie' Red/Blue works
Diffstat (limited to 'engines')
-rw-r--r--engines/director/director.cpp41
-rw-r--r--engines/director/director.h4
-rw-r--r--engines/director/lingo/lingo-funcs.cpp23
-rw-r--r--engines/director/lingo/lingo.h4
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;