diff options
-rw-r--r-- | engines/parallaction/exec.h | 6 | ||||
-rw-r--r-- | engines/parallaction/exec_br.cpp | 19 | ||||
-rw-r--r-- | engines/parallaction/exec_ns.cpp | 74 |
3 files changed, 44 insertions, 55 deletions
diff --git a/engines/parallaction/exec.h b/engines/parallaction/exec.h index 03526617c6..22e75744f1 100644 --- a/engines/parallaction/exec.h +++ b/engines/parallaction/exec.h @@ -165,6 +165,7 @@ protected: AnimationPtr anim; ProgramPtr program; InstructionList::iterator inst; + InstructionList::iterator ip; uint16 modCounter; bool suspend; } _ctxt; @@ -174,6 +175,7 @@ protected: OpcodeSet _opcodes; uint16 _modCounter; + void runScript(ProgramPtr script, AnimationPtr a); public: virtual void init() = 0; @@ -197,7 +199,7 @@ protected: DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(off); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(loop); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(endloop); - DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(null); + DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(show); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(call); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(inc); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(set); @@ -222,7 +224,6 @@ class ProgramExec_br : public ProgramExec_ns { protected: DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(on); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(off); - DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(loop); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(inc); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(dec); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(set); @@ -242,7 +243,6 @@ protected: DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(ifgt); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(endif); DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(stop); - DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(endscript); public: void init(); diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index a2efe8b90c..0b7400f0f7 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -374,13 +374,6 @@ DECLARE_INSTRUCTION_OPCODE(set) { } -DECLARE_INSTRUCTION_OPCODE(loop) { - InstructionPtr inst = *_ctxt.inst; - - _ctxt.program->_loopCounter = inst->_opB.getRValue(); - _ctxt.program->_loopStart = _ctxt.inst; -} - DECLARE_INSTRUCTION_OPCODE(inc) { InstructionPtr inst = *_ctxt.inst; @@ -504,16 +497,6 @@ DECLARE_INSTRUCTION_OPCODE(stop) { warning("Parallaction_br::instOp_stop not yet implemented"); } -DECLARE_INSTRUCTION_OPCODE(endscript) { - if ((_ctxt.anim->_flags & kFlagsLooping) == 0) { - _ctxt.anim->_flags &= ~kFlagsActing; - _vm->_cmdExec->run(_ctxt.anim->_commands, _ctxt.anim); - _ctxt.program->_status = kProgramDone; - } - _ctxt.program->_ip = _ctxt.program->_instructions.begin(); - - _ctxt.suspend = true; -} void CommandExec_br::init() { Common::Array<const Opcode*> *table = 0; @@ -585,7 +568,7 @@ void ProgramExec_br::init() { INSTRUCTION_OPCODE(set); // f INSTRUCTION_OPCODE(loop); INSTRUCTION_OPCODE(endloop); - INSTRUCTION_OPCODE(null); // show + INSTRUCTION_OPCODE(show); // show INSTRUCTION_OPCODE(inc); INSTRUCTION_OPCODE(inc); // dec INSTRUCTION_OPCODE(set); diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index 32dafef92b..3e3ee19a03 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -81,13 +81,13 @@ DECLARE_INSTRUCTION_OPCODE(loop) { InstructionPtr inst = *_ctxt.inst; _ctxt.program->_loopCounter = inst->_opB.getRValue(); - _ctxt.program->_loopStart = _ctxt.inst; + _ctxt.program->_loopStart = _ctxt.ip; } DECLARE_INSTRUCTION_OPCODE(endloop) { if (--_ctxt.program->_loopCounter > 0) { - _ctxt.inst = _ctxt.program->_loopStart; + _ctxt.ip = _ctxt.program->_loopStart; } } @@ -97,7 +97,7 @@ DECLARE_INSTRUCTION_OPCODE(inc) { if (inst->_flags & kInstMod) { // mod int16 _bx = (_si > 0 ? _si : -_si); - if (_modCounter % _bx != 0) return; + if (_ctxt.modCounter % _bx != 0) return; _si = (_si > 0 ? 1 : -1); } @@ -142,8 +142,8 @@ DECLARE_INSTRUCTION_OPCODE(put) { _vm->_gfx->patchBackground(v18, x, y, mask); } -DECLARE_INSTRUCTION_OPCODE(null) { - +DECLARE_INSTRUCTION_OPCODE(show) { + _ctxt.suspend = true; } DECLARE_INSTRUCTION_OPCODE(invalid) { @@ -156,8 +156,10 @@ DECLARE_INSTRUCTION_OPCODE(call) { DECLARE_INSTRUCTION_OPCODE(wait) { - if (_engineFlags & kEngineWalking) + if (_engineFlags & kEngineWalking) { + _ctxt.ip--; _ctxt.suspend = true; + } } @@ -186,8 +188,8 @@ DECLARE_INSTRUCTION_OPCODE(endscript) { _vm->_cmdExec->run(_ctxt.anim->_commands, _ctxt.anim); _ctxt.program->_status = kProgramDone; } - _ctxt.program->_ip = _ctxt.program->_instructions.begin(); + _ctxt.ip = _ctxt.program->_instructions.begin(); _ctxt.suspend = true; } @@ -376,14 +378,41 @@ void Parallaction_ns::drawAnimations() { return; } +void ProgramExec::runScript(ProgramPtr script, AnimationPtr a) { + debugC(9, kDebugExec, "runScript(Animation = %s)", a->_name); + + _ctxt.ip = script->_ip; + _ctxt.anim = a; + _ctxt.program = script; + _ctxt.suspend = false; + _ctxt.modCounter = _modCounter; + + InstructionList::iterator inst; + for ( ; (a->_flags & kFlagsActing) ; ) { + + inst = _ctxt.ip; + _ctxt.inst = inst; + _ctxt.ip++; + + debugC(9, kDebugExec, "inst [%02i] %s\n", (*inst)->_index, _instructionNames[(*inst)->_index - 1]); + + script->_status = kProgramRunning; + + (*_opcodes[(*inst)->_index])(); + + if (_ctxt.suspend) + break; + + } + script->_ip = _ctxt.ip; + +} void ProgramExec::runScripts(ProgramList::iterator first, ProgramList::iterator last) { if (_engineFlags & kEnginePauseJobs) { return; } - debugC(9, kDebugExec, "runScripts"); - for (ProgramList::iterator it = first; it != last; it++) { AnimationPtr a = (*it)->_anim; @@ -394,31 +423,8 @@ void ProgramExec::runScripts(ProgramList::iterator first, ProgramList::iterator if ((a->_flags & kFlagsActing) == 0) continue; - InstructionList::iterator inst = (*it)->_ip; - while (((*inst)->_index != INST_SHOW) && (a->_flags & kFlagsActing)) { - - (*it)->_status = kProgramRunning; - - debugC(9, kDebugExec, "anim: %s, inst[%02i]: %s", a->_name, (*inst)->_index, _instructionNames[(*inst)->_index - 1]); - - _ctxt.inst = inst; - _ctxt.anim = AnimationPtr(a); - _ctxt.program = *it; - _ctxt.suspend = false; - - (*_opcodes[(*inst)->_index])(); - - inst = _ctxt.inst; // handles endloop correctly - - if (_ctxt.suspend) - goto label1; - - inst++; - } - - (*it)->_ip = ++inst; + runScript(*it, a); -label1: if (a->_flags & kFlagsCharacter) a->_z = a->_top + a->height(); } @@ -796,7 +802,7 @@ void ProgramExec_ns::init() { INSTRUCTION_OPCODE(set); // f INSTRUCTION_OPCODE(loop); INSTRUCTION_OPCODE(endloop); - INSTRUCTION_OPCODE(null); + INSTRUCTION_OPCODE(show); INSTRUCTION_OPCODE(inc); INSTRUCTION_OPCODE(inc); // dec INSTRUCTION_OPCODE(set); |