From f46ee2b70c3722b59e8a95e89e9cba649d87d58b Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Tue, 29 Jul 2008 12:59:55 +0000 Subject: * Implemented pause/resume of command execution * Implemented command opcode MOVE (not the script instruction). svn-id: r33408 --- engines/parallaction/exec.h | 16 ++++++++ engines/parallaction/exec_br.cpp | 3 +- engines/parallaction/exec_ns.cpp | 68 ++++++++++++++++++++++++++------ engines/parallaction/parallaction_br.cpp | 2 + 4 files changed, 76 insertions(+), 13 deletions(-) (limited to 'engines') diff --git a/engines/parallaction/exec.h b/engines/parallaction/exec.h index 9ac343dc62..03526617c6 100644 --- a/engines/parallaction/exec.h +++ b/engines/parallaction/exec.h @@ -47,14 +47,30 @@ protected: struct ParallactionStruct1 { CommandPtr cmd; ZonePtr z; + bool suspend; } _ctxt; OpcodeSet _opcodes; + struct SuspendedContext { + bool valid; + CommandList::iterator first; + CommandList::iterator last; + ZonePtr zone; + } _suspendedCtxt; + + ZonePtr _execZone; + void runList(CommandList::iterator first, CommandList::iterator last); + void createSuspendList(CommandList::iterator first, CommandList::iterator last); + void cleanSuspendedList(); + public: virtual void init() = 0; virtual void run(CommandList &list, ZonePtr z = nullZonePtr); + void runSuspended(); + CommandExec() { + _suspendedCtxt.valid = false; } virtual ~CommandExec() { for (Common::Array::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i) diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 69d963dafd..a2efe8b90c 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -178,7 +178,8 @@ DECLARE_COMMAND_OPCODE(drop) { DECLARE_COMMAND_OPCODE(move) { - warning("Parallaction_br::cmdOp_move not yet implemented"); + _vm->_char.scheduleWalk(_ctxt.cmd->u._move.x, _ctxt.cmd->u._move.y); + _ctxt.suspend = true; } DECLARE_COMMAND_OPCODE(start) { diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index 60cc2b13f1..32dafef92b 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -428,23 +428,18 @@ label1: return; } -void CommandExec::run(CommandList& list, ZonePtr z) { - if (list.size() == 0) { - debugC(3, kDebugExec, "runCommands: nothing to do"); - return; - } - - debugC(3, kDebugExec, "runCommands starting"); +void CommandExec::runList(CommandList::iterator first, CommandList::iterator last) { uint32 useFlags = 0; bool useLocalFlags; - CommandList::iterator it = list.begin(); - for ( ; it != list.end(); it++) { + _ctxt.suspend = false; + + for ( ; first != last; first++) { if (_engineFlags & kEngineQuit) break; - CommandPtr cmd = *it; + CommandPtr cmd = *first; if (cmd->_flagsOn & kFlagsGlobal) { useFlags = _commandFlags | kFlagsGlobal; @@ -462,16 +457,65 @@ void CommandExec::run(CommandList& list, ZonePtr z) { if (!onMatch || !offMatch) continue; - _ctxt.z = z; + _ctxt.z = _execZone; _ctxt.cmd = cmd; (*_opcodes[cmd->_id])(); + + if (_ctxt.suspend) { + createSuspendList(++first, last); + return; + } + } + +} + +void CommandExec::run(CommandList& list, ZonePtr z) { + if (list.size() == 0) { + debugC(3, kDebugExec, "runCommands: nothing to do"); + return; } + _execZone = z; + + debugC(3, kDebugExec, "runCommands starting"); + runList(list.begin(), list.end()); debugC(3, kDebugExec, "runCommands completed"); +} - return; +void CommandExec::createSuspendList(CommandList::iterator first, CommandList::iterator last) { + if (first == last) { + return; + } + + debugC(3, kDebugExec, "CommandExec::createSuspendList()"); + + _suspendedCtxt.valid = true; + _suspendedCtxt.first = first; + _suspendedCtxt.last = last; + _suspendedCtxt.zone = _execZone; +} +void CommandExec::cleanSuspendedList() { + debugC(3, kDebugExec, "CommandExec::cleanSuspended()"); + + _suspendedCtxt.valid = false; + _suspendedCtxt.first = _suspendedCtxt.last; + _suspendedCtxt.zone = nullZonePtr; +} + +void CommandExec::runSuspended() { + if (_engineFlags & kEngineWalking) { + return; + } + + if (_suspendedCtxt.valid) { + debugC(3, kDebugExec, "CommandExec::runSuspended()"); + + _execZone = _suspendedCtxt.zone; + runList(_suspendedCtxt.first, _suspendedCtxt.last); + cleanSuspendedList(); + } } CommandExec_ns::CommandExec_ns(Parallaction_ns* vm) : _vm(vm) { diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index b5fb2fa3bb..761c8d1b74 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -237,6 +237,8 @@ void Parallaction_br::startPart(uint part) { void Parallaction_br::runPendingZones() { ZonePtr z; + _cmdExec->runSuspended(); + if (_activeZone) { z = _activeZone; // speak Zone or sound _activeZone = nullZonePtr; -- cgit v1.2.3