MYST3: Implement opcodes 173 and 174
This commit is contained in:
parent
6d770c21e5
commit
d4e482bc8e
3 changed files with 51 additions and 8 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue