MYST3: Implement opcodes 173 and 174

This commit is contained in:
Bastien Bouclet 2011-12-29 21:14:05 +01:00
parent 6d770c21e5
commit d4e482bc8e
3 changed files with 51 additions and 8 deletions

View file

@ -129,6 +129,8 @@ Script::Script(Myst3Engine *vm):
OP_2(139, goToRoomNode, kValue, kValue );
OP_1(147, moviePlay, kEvalValue );
OP_1(148, moviePlaySynchronized, kEvalValue );
OP_2(174, runScriptWhileCond, kCondition, kValue );
OP_3(175, runScriptWhileCondEachXFrames,kCondition, kValue, kValue );
OP_4(176, runScriptForVar, kVar, kValue, kValue, kValue );
OP_5(177, runScriptForVarEachXFrames, kVar, kValue, kValue, kValue, kValue );
OP_4(178, runScriptForVarStartVar, kVar, kVar, kValue, kValue );
@ -558,13 +560,13 @@ void Script::varCopy(Context &c, const Opcode &cmd) {
}
void Script::varSetBitsFromVar(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: Set bits from var %d on var %d", cmd.op, cmd.args[1], cmd.args[0]);
debugC(kDebugScript, "Opcode %d: Set bits from var %d on var %d", cmd.op, cmd.args[0], cmd.args[1]);
uint32 value = _vm->_vars->get(cmd.args[0]);
uint32 value = _vm->_vars->get(cmd.args[1]);
value |= _vm->_vars->get(cmd.args[1]);
value |= _vm->_vars->get(cmd.args[0]);
_vm->_vars->set(cmd.args[0], value);
_vm->_vars->set(cmd.args[1], value);
}
void Script::varSetBits(Context &c, const Opcode &cmd) {
@ -1138,6 +1140,46 @@ void Script::moviePlaySynchronized(Context &c, const Opcode &cmd) {
_vm->playSimpleMovie(_vm->_vars->valueOrVarValue(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]);
while (_vm->_vars->evaluate(cmd.args[0])) {
_vm->runScriptsFromNode(cmd.args[1]);
_vm->processInput(true);
_vm->drawFrame();
}
_vm->processInput(true);
_vm->drawFrame();
}
void Script::runScriptWhileCondEachXFrames(Context &c, const Opcode &cmd) {
debugC(kDebugScript, "Opcode %d: While condition %d, run script %d each %d frames", cmd.op, cmd.args[0], cmd.args[1], cmd.args[2]);
uint step = cmd.args[2] % 100;
uint firstStep = cmd.args[2];
if (firstStep > 100)
firstStep /= 100;
uint nextScript = _vm->getFrameCount() + firstStep;
while (_vm->_vars->evaluate(cmd.args[0])) {
if (_vm->getFrameCount() >= nextScript) {
nextScript = _vm->getFrameCount() + step;
_vm->runScriptsFromNode(cmd.args[1]);
}
_vm->processInput(true);
_vm->drawFrame();
}
_vm->processInput(true);
_vm->drawFrame();
}
void Script::runScriptForVarDrawFramesHelper(uint16 var, int32 startValue, int32 endValue, uint16 script, int32 numFrames) {
if (numFrames < 0) {
numFrames = -numFrames;

View file

@ -184,6 +184,8 @@ private:
DECLARE_OPCODE(goToRoomNode);
DECLARE_OPCODE(moviePlay);
DECLARE_OPCODE(moviePlaySynchronized);
DECLARE_OPCODE(runScriptWhileCond);
DECLARE_OPCODE(runScriptWhileCondEachXFrames);
DECLARE_OPCODE(runScriptForVar);
DECLARE_OPCODE(runScriptForVarEachXFrames);
DECLARE_OPCODE(runScriptForVarStartVar);

View file

@ -155,11 +155,10 @@ const Common::String Variables::describeCondition(int16 condition) {
uint16 var = unsignedCond & 2047;
int16 value = (unsignedCond >> 11) - 1;
if (value < 0)
value = 1;
return Common::String::format("c[%s %s %d]",
describeVar(var).c_str(), condition > 0 ? "==" : "!=", value);
describeVar(var).c_str(),
(condition >= 0 && value >= 0) || (condition < 0 && value < 0) ? "==" : "!=",
value >= 0 ? value : 0);
}
void Variables::inventoryReset() {