mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 13:50:13 +00:00
* 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
@ -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<const Opcode*>::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i)
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user