MYST3: Implement opcodes 27 and 28 - remove movie

This commit is contained in:
Bastien Bouclet 2012-01-16 12:26:07 +01:00
parent 044fe33b1d
commit aa1b799904
4 changed files with 39 additions and 4 deletions

View file

@ -360,10 +360,8 @@ 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 all movies
removeMovie(0);
delete _node;
_node = 0;
@ -599,6 +597,23 @@ void Myst3Engine::playSimpleMovie(uint16 id) {
_drawables.pop_back();
}
void Myst3Engine::removeMovie(uint16 id) {
if (id == 0) {
for (uint i = 0; i < _movies.size(); i++)
delete _movies[i];
_movies.clear();
return;
} else {
for (uint i = 0; i < _movies.size(); i++)
if (_movies[i]->getId() == id) {
delete _movies[i];
_movies.remove_at(i);
break;
}
}
}
void Myst3Engine::setMovieLooping(uint16 id, bool loop) {
for (uint i = 0; i < _movies.size(); i++) {
if (_movies[i]->getId() == id) {

View file

@ -97,6 +97,7 @@ public:
void loadMovie(uint16 id, uint16 condition, bool resetCond, bool loop);
void playSimpleMovie(uint16 id);
void removeMovie(uint16 id);
void setMovieLooping(uint16 id, bool loop);
void addSpotItem(uint16 id, uint16 condition, bool fade);

View file

@ -66,6 +66,8 @@ Script::Script(Myst3Engine *vm):
OP_2( 24, movieInitFrameVarPreload, kEvalValue, kVar );
OP_4( 25, movieInitOverrridePosition, kEvalValue, kCondition, kValue, kValue );
OP_3( 26, movieInitScriptedPosition, kEvalValue, kVar, kVar );
OP_1( 27, movieRemove, kEvalValue );
OP_0( 28, movieRemoveAll );
OP_1( 29, movieSetLooping, kValue );
OP_1( 30, movieSetNotLooping, kValue );
OP_2( 35, sunspotAdd, kValue, kValue );
@ -513,6 +515,21 @@ void Script::movieInitScriptedPosition(Context &c, const Opcode &cmd) {
_vm->loadMovie(movieid, 1, false, true);
}
void Script::movieRemove(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Remove movie %d ",
cmd.op, cmd.args[0]);
uint16 movieid = _vm->_state->valueOrVarValue(cmd.args[0]);
_vm->removeMovie(movieid);
}
void Script::movieRemoveAll(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Remove all movies",
cmd.op);
_vm->removeMovie(0);
}
void Script::movieSetLooping(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Set movie % to loop",
cmd.op, cmd.args[0]);

View file

@ -117,6 +117,8 @@ private:
DECLARE_OPCODE(movieInitFrameVarPreload);
DECLARE_OPCODE(movieInitOverrridePosition);
DECLARE_OPCODE(movieInitScriptedPosition);
DECLARE_OPCODE(movieRemove);
DECLARE_OPCODE(movieRemoveAll);
DECLARE_OPCODE(movieSetLooping);
DECLARE_OPCODE(movieSetNotLooping);
DECLARE_OPCODE(sunspotAdd);