MYST3: Implement opcodes 149 and 150 - Play fullframe movie

This commit is contained in:
Bastien Bouclet 2012-01-25 15:04:56 +01:00
parent 59eb3dd66f
commit dd4b8abaa5
4 changed files with 41 additions and 2 deletions

View file

@ -915,9 +915,10 @@ void Myst3Engine::playMovieGoToNode(uint16 movie, uint16 node) {
_state->setCameraSkipAnimation(0); _state->setCameraSkipAnimation(0);
} }
playSimpleMovie(movie, true);
loadNode(node, room, age); loadNode(node, room, age);
playSimpleMovie(movie, true);
_state->setLocationNextNode(0); _state->setLocationNextNode(0);
_state->setLocationNextRoom(0); _state->setLocationNextRoom(0);
_state->setLocationNextAge(0); _state->setLocationNextAge(0);
@ -929,4 +930,21 @@ void Myst3Engine::playMovieGoToNode(uint16 movie, uint16 node) {
} }
} }
void Myst3Engine::playMovieFullFrame(uint16 movie) {
if (_state->getViewType() == kCube && !_state->getCameraSkipAnimation()) {
float startPitch, startHeading;
getMovieLookAt(movie, true, startPitch, startHeading);
animateDirectionChange(startPitch, startHeading, 0);
_state->setCameraSkipAnimation(0);
}
playSimpleMovie(movie, true);
if (_state->getViewType() == kCube) {
float endPitch, endHeading;
getMovieLookAt(movie, false, endPitch, endHeading);
_state->lookAt(endPitch, endHeading);
}
}
} // end of namespace Myst3 } // end of namespace Myst3

View file

@ -106,6 +106,7 @@ public:
void loadMovie(uint16 id, uint16 condition, bool resetCond, bool loop); void loadMovie(uint16 id, uint16 condition, bool resetCond, bool loop);
void playMovieGoToNode(uint16 movie, uint16 node); void playMovieGoToNode(uint16 movie, uint16 node);
void playMovieFullFrame(uint16 movie);
void playSimpleMovie(uint16 id, bool fullframe = false); void playSimpleMovie(uint16 id, bool fullframe = false);
void removeMovie(uint16 id); void removeMovie(uint16 id);
void setMovieLooping(uint16 id, bool loop); void setMovieLooping(uint16 id, bool loop);

View file

@ -174,6 +174,8 @@ Script::Script(Myst3Engine *vm):
OP_2(141, zipToRoomNode, kValue, kValue ); OP_2(141, zipToRoomNode, kValue, kValue );
OP_1(147, moviePlay, kEvalValue ); OP_1(147, moviePlay, kEvalValue );
OP_1(148, moviePlaySynchronized, kEvalValue ); OP_1(148, moviePlaySynchronized, kEvalValue );
OP_1(149, moviePlayFullFrame, kEvalValue );
OP_1(150, moviePlayFullFrameTrans, kEvalValue );
OP_2(151, moviePlayChangeNode, kEvalValue, kEvalValue ); OP_2(151, moviePlayChangeNode, kEvalValue, kEvalValue );
OP_2(152, moviePlayChangeNodeTrans, kEvalValue, kEvalValue ); OP_2(152, moviePlayChangeNodeTrans, kEvalValue, kEvalValue );
OP_2(153, lootAt, kValue, kValue ); OP_2(153, lootAt, kValue, kValue );
@ -1893,6 +1895,22 @@ void Script::runScriptWhileCondEachXFrames(Context &c, const Opcode &cmd) {
_vm->drawFrame(); _vm->drawFrame();
} }
void Script::moviePlayFullFrame(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Play movie %d", cmd.op, cmd.args[0]);
uint16 movieId = _vm->_state->valueOrVarValue(cmd.args[0]);
_vm->playMovieFullFrame(movieId);
}
void Script::moviePlayFullFrameTrans(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Play movie %d with transition", cmd.op, cmd.args[0]);
uint16 movieId = _vm->_state->valueOrVarValue(cmd.args[0]);
_vm->playMovieFullFrame(movieId);
// TODO: Transition
}
void Script::moviePlayChangeNode(Context &c, const Opcode &cmd) { void Script::moviePlayChangeNode(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Play movie %d, go to node %d", cmd.op, cmd.args[1], cmd.args[0]); debugC(kDebugScript, "Opcode %d: Play movie %d, go to node %d", cmd.op, cmd.args[1], cmd.args[0]);

View file

@ -224,6 +224,8 @@ private:
DECLARE_OPCODE(zipToRoomNode); DECLARE_OPCODE(zipToRoomNode);
DECLARE_OPCODE(moviePlay); DECLARE_OPCODE(moviePlay);
DECLARE_OPCODE(moviePlaySynchronized); DECLARE_OPCODE(moviePlaySynchronized);
DECLARE_OPCODE(moviePlayFullFrame);
DECLARE_OPCODE(moviePlayFullFrameTrans);
DECLARE_OPCODE(moviePlayChangeNode); DECLARE_OPCODE(moviePlayChangeNode);
DECLARE_OPCODE(moviePlayChangeNodeTrans); DECLARE_OPCODE(moviePlayChangeNodeTrans);
DECLARE_OPCODE(lootAt); DECLARE_OPCODE(lootAt);