diff --git a/engines/myst3/movie.cpp b/engines/myst3/movie.cpp index 1436fac5c7e..afc95b49434 100644 --- a/engines/myst3/movie.cpp +++ b/engines/myst3/movie.cpp @@ -42,6 +42,9 @@ Movie::Movie(Myst3Engine *vm, uint16 id) : if (!binkDesc) binkDesc = _vm->getFileDescription(0, id, 0, DirectorySubEntry::kMultitrackMovie); + if (!binkDesc) + binkDesc = _vm->getFileDescription(0, id, 0, DirectorySubEntry::kDialogMovie); + if (!binkDesc) error("Movie %d does not exist", id); diff --git a/engines/myst3/myst3.cpp b/engines/myst3/myst3.cpp index 6578472b1a3..91d25d84dde 100644 --- a/engines/myst3/myst3.cpp +++ b/engines/myst3/myst3.cpp @@ -345,16 +345,6 @@ void Myst3Engine::drawFrame() { } void Myst3Engine::goToNode(uint16 nodeID, uint transition) { - if (_node) { - for (uint i = 0; i < _movies.size(); i++) { - delete _movies[i]; - } - _movies.clear(); - - delete _node; - _node = 0; - } - uint16 node = _state->getLocationNextNode(); if (node == 0) node = nodeID; @@ -370,6 +360,16 @@ void Myst3Engine::goToNode(uint16 nodeID, uint transition) { } void Myst3Engine::loadNode(uint16 nodeID, uint32 roomID, uint32 ageID) { + if (_node) { + for (uint i = 0; i < _movies.size(); i++) { + delete _movies[i]; + } + _movies.clear(); + + delete _node; + _node = 0; + } + _scriptEngine->run(&_db->getNodeInitScript()); if (nodeID) diff --git a/engines/myst3/script.cpp b/engines/myst3/script.cpp index a6d7de3c9c5..ae66e308d7e 100644 --- a/engines/myst3/script.cpp +++ b/engines/myst3/script.cpp @@ -152,6 +152,9 @@ Script::Script(Myst3Engine *vm): OP_2(141, zipToRoomNode, kValue, kValue ); OP_1(147, moviePlay, kEvalValue ); OP_1(148, moviePlaySynchronized, kEvalValue ); + OP_1(164, changeNode, kValue ); + OP_2(165, changeNodeRoom, kValue, kValue ); + OP_3(166, changeNodeRoomAge, kValue, kValue, kValue ); OP_2(174, runScriptWhileCond, kCondition, kValue ); OP_3(175, runScriptWhileCondEachXFrames,kCondition, kValue, kValue ); OP_4(176, runScriptForVar, kVar, kValue, kValue, kValue ); @@ -1357,6 +1360,24 @@ void Script::moviePlaySynchronized(Context &c, const Opcode &cmd) { _vm->playSimpleMovie(_vm->_state->valueOrVarValue(cmd.args[0])); } +void Script::changeNode(Context &c, const Opcode &cmd) { + debugC(kDebugScript, "Opcode %d: Go to node %d", cmd.op, cmd.args[0]); + + _vm->loadNode(cmd.args[0]); +} + +void Script::changeNodeRoom(Context &c, const Opcode &cmd) { + debugC(kDebugScript, "Opcode %d: Go to node %d room %d", cmd.op, cmd.args[0], cmd.args[1]); + + _vm->loadNode(cmd.args[1], cmd.args[0]); +} + +void Script::changeNodeRoomAge(Context &c, const Opcode &cmd) { + debugC(kDebugScript, "Opcode %d: Go to node %d room %d age %d", cmd.op, cmd.args[2], cmd.args[1], cmd.args[0]); + + _vm->loadNode(cmd.args[2], cmd.args[1], cmd.args[0]); +} + void Script::runScriptWhileCond(Context &c, const Opcode &cmd) { debugC(kDebugScript, "Opcode %d: While condition %d, run script %d", cmd.op, cmd.args[0], cmd.args[1]); diff --git a/engines/myst3/script.h b/engines/myst3/script.h index 55d2fed2f95..76f8986e9f8 100644 --- a/engines/myst3/script.h +++ b/engines/myst3/script.h @@ -205,6 +205,9 @@ private: DECLARE_OPCODE(zipToRoomNode); DECLARE_OPCODE(moviePlay); DECLARE_OPCODE(moviePlaySynchronized); + DECLARE_OPCODE(changeNode); + DECLARE_OPCODE(changeNodeRoom); + DECLARE_OPCODE(changeNodeRoomAge); DECLARE_OPCODE(runScriptWhileCond); DECLARE_OPCODE(runScriptWhileCondEachXFrames); DECLARE_OPCODE(runScriptForVar);