* Implemented pause/resume of command execution
* Implemented command opcode MOVE (not the script instruction). svn-id: r33408
This commit is contained in:
parent
52700d59fd
commit
f46ee2b70c
4 changed files with 76 additions and 13 deletions
|
@ -47,14 +47,30 @@ protected:
|
||||||
struct ParallactionStruct1 {
|
struct ParallactionStruct1 {
|
||||||
CommandPtr cmd;
|
CommandPtr cmd;
|
||||||
ZonePtr z;
|
ZonePtr z;
|
||||||
|
bool suspend;
|
||||||
} _ctxt;
|
} _ctxt;
|
||||||
|
|
||||||
OpcodeSet _opcodes;
|
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:
|
public:
|
||||||
virtual void init() = 0;
|
virtual void init() = 0;
|
||||||
virtual void run(CommandList &list, ZonePtr z = nullZonePtr);
|
virtual void run(CommandList &list, ZonePtr z = nullZonePtr);
|
||||||
|
void runSuspended();
|
||||||
|
|
||||||
CommandExec() {
|
CommandExec() {
|
||||||
|
_suspendedCtxt.valid = false;
|
||||||
}
|
}
|
||||||
virtual ~CommandExec() {
|
virtual ~CommandExec() {
|
||||||
for (Common::Array<const Opcode*>::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i)
|
for (Common::Array<const Opcode*>::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i)
|
||||||
|
|
|
@ -178,7 +178,8 @@ DECLARE_COMMAND_OPCODE(drop) {
|
||||||
|
|
||||||
|
|
||||||
DECLARE_COMMAND_OPCODE(move) {
|
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) {
|
DECLARE_COMMAND_OPCODE(start) {
|
||||||
|
|
|
@ -428,23 +428,18 @@ label1:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandExec::run(CommandList& list, ZonePtr z) {
|
void CommandExec::runList(CommandList::iterator first, CommandList::iterator last) {
|
||||||
if (list.size() == 0) {
|
|
||||||
debugC(3, kDebugExec, "runCommands: nothing to do");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
debugC(3, kDebugExec, "runCommands starting");
|
|
||||||
|
|
||||||
uint32 useFlags = 0;
|
uint32 useFlags = 0;
|
||||||
bool useLocalFlags;
|
bool useLocalFlags;
|
||||||
|
|
||||||
CommandList::iterator it = list.begin();
|
_ctxt.suspend = false;
|
||||||
for ( ; it != list.end(); it++) {
|
|
||||||
|
for ( ; first != last; first++) {
|
||||||
if (_engineFlags & kEngineQuit)
|
if (_engineFlags & kEngineQuit)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CommandPtr cmd = *it;
|
CommandPtr cmd = *first;
|
||||||
|
|
||||||
if (cmd->_flagsOn & kFlagsGlobal) {
|
if (cmd->_flagsOn & kFlagsGlobal) {
|
||||||
useFlags = _commandFlags | kFlagsGlobal;
|
useFlags = _commandFlags | kFlagsGlobal;
|
||||||
|
@ -462,16 +457,65 @@ void CommandExec::run(CommandList& list, ZonePtr z) {
|
||||||
|
|
||||||
if (!onMatch || !offMatch) continue;
|
if (!onMatch || !offMatch) continue;
|
||||||
|
|
||||||
_ctxt.z = z;
|
_ctxt.z = _execZone;
|
||||||
_ctxt.cmd = cmd;
|
_ctxt.cmd = cmd;
|
||||||
|
|
||||||
(*_opcodes[cmd->_id])();
|
(*_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");
|
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) {
|
CommandExec_ns::CommandExec_ns(Parallaction_ns* vm) : _vm(vm) {
|
||||||
|
|
|
@ -237,6 +237,8 @@ void Parallaction_br::startPart(uint part) {
|
||||||
void Parallaction_br::runPendingZones() {
|
void Parallaction_br::runPendingZones() {
|
||||||
ZonePtr z;
|
ZonePtr z;
|
||||||
|
|
||||||
|
_cmdExec->runSuspended();
|
||||||
|
|
||||||
if (_activeZone) {
|
if (_activeZone) {
|
||||||
z = _activeZone; // speak Zone or sound
|
z = _activeZone; // speak Zone or sound
|
||||||
_activeZone = nullZonePtr;
|
_activeZone = nullZonePtr;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue