diff options
author | Nicola Mettifogo | 2009-03-29 12:41:00 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2009-03-29 12:41:00 +0000 |
commit | 011b73a09ba1e3d51a403ed65cedcd9394d6bfb0 (patch) | |
tree | 08918f98b49d00fa5714582be4623a85ba52869d /engines/parallaction | |
parent | d883cb209eab63268338b3f86843ce32c1027fdb (diff) | |
download | scummvm-rg350-011b73a09ba1e3d51a403ed65cedcd9394d6bfb0.tar.gz scummvm-rg350-011b73a09ba1e3d51a403ed65cedcd9394d6bfb0.tar.bz2 scummvm-rg350-011b73a09ba1e3d51a403ed65cedcd9394d6bfb0.zip |
Commands now evaluate their reference Zone at runtime, thus handling of forward references in the parser is no more needed.
svn-id: r39738
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/exec.cpp | 10 | ||||
-rw-r--r-- | engines/parallaction/objects.cpp | 1 | ||||
-rw-r--r-- | engines/parallaction/objects.h | 2 | ||||
-rw-r--r-- | engines/parallaction/parser.h | 8 | ||||
-rw-r--r-- | engines/parallaction/parser_ns.cpp | 28 |
5 files changed, 15 insertions, 34 deletions
diff --git a/engines/parallaction/exec.cpp b/engines/parallaction/exec.cpp index 0d5215cd9a..24579286e6 100644 --- a/engines/parallaction/exec.cpp +++ b/engines/parallaction/exec.cpp @@ -102,6 +102,16 @@ void CommandExec::runList(CommandList::iterator first, CommandList::iterator las CommandPtr cmd = *first; + if (cmd->_valid && !cmd->_zone && !cmd->_zoneName.empty()) { + // try binding the command to a zone + cmd->_zone = _vm->_location.findZone(cmd->_zoneName.c_str()); + cmd->_valid = cmd->_zone != 0; + } + + if (!cmd->_valid) { + continue; + } + if (cmd->_flagsOn & kFlagsGlobal) { useFlags = _globalFlags | kFlagsGlobal; useLocalFlags = false; diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index a417efaecc..f1309c6919 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -34,6 +34,7 @@ Command::Command() { _id = 0; _flagsOn = 0; _flagsOff = 0; + _valid = false; _flags = 0; _string = 0; diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index 52f3d62a59..4c02d94334 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -112,6 +112,7 @@ struct Command { uint16 _id; uint32 _flagsOn; uint32 _flagsOff; + bool _valid; Command(); ~Command(); @@ -119,6 +120,7 @@ struct Command { // Common fields uint32 _flags; ZonePtr _zone; + Common::String _zoneName; char* _string; uint16 _callable; uint16 _object; diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h index 4eb8e3f419..79da55d6b4 100644 --- a/engines/parallaction/parser.h +++ b/engines/parallaction/parser.h @@ -204,17 +204,9 @@ protected: void parseCommands(CommandList&); void parseCommandFlags(); void parseCommandFlag(CommandPtr cmd, const char *flag, Table *table); - void saveCommandForward(const char *name, CommandPtr cmd); - void resolveCommandForwards(); void createCommand(uint id); void addCommand(); - struct CommandForwardReference { - char name[20]; - CommandPtr cmd; - } _forwardedCommands[MAX_FORWARDS]; - uint _numForwardedCommands; - void clearSet(OpcodeSet &opcodes) { for (Common::Array<const Opcode*>::iterator i = opcodes.begin(); i != opcodes.end(); ++i) delete *i; diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index 10405f1244..118b7ad959 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -631,10 +631,7 @@ DECLARE_COMMAND_PARSER(zone) { createCommand(_parser->_lookup); - ctxt.cmd->_zone = _vm->_location.findZone(_tokens[ctxt.nextToken]); - if (!ctxt.cmd->_zone) { - saveCommandForward(_tokens[ctxt.nextToken], ctxt.cmd); - } + ctxt.cmd->_zoneName = _tokens[ctxt.nextToken]; ctxt.nextToken++; parseCommandFlags(); @@ -776,28 +773,10 @@ void LocationParser_ns::createCommand(uint id) { ctxt.nextToken = 1; ctxt.cmd = CommandPtr(new Command); ctxt.cmd->_id = id; + ctxt.cmd->_valid = true; } -void LocationParser_ns::saveCommandForward(const char *name, CommandPtr cmd) { - assert(_numForwardedCommands < MAX_FORWARDS); - - strcpy(_forwardedCommands[_numForwardedCommands].name, name); - _forwardedCommands[_numForwardedCommands].cmd = cmd; - - _numForwardedCommands++; -} - -void LocationParser_ns::resolveCommandForwards() { - for (uint i = 0; i < _numForwardedCommands; i++) { - _forwardedCommands[i].cmd->_zone = _vm->_location.findZone(_forwardedCommands[i].name); - if (_forwardedCommands[i].cmd->_zone == 0) { - warning("Cannot find zone '%s' into current location script. This may be a bug in the original scripts.\n", _forwardedCommands[i].name); - } - } - _numForwardedCommands = 0; -} - void LocationParser_ns::parseCommands(CommandList& list) { debugC(5, kDebugParser, "parseCommands()"); @@ -1058,7 +1037,6 @@ DECLARE_LOCATION_PARSER(music) { void LocationParser_ns::parse(Script *script) { _zoneProg = 0; - _numForwardedCommands = 0; ctxt.end = false; _script = script; @@ -1071,8 +1049,6 @@ void LocationParser_ns::parse(Script *script) { _parser->parseStatement(); } while (!ctxt.end); _parser->popTables(); - - resolveCommandForwards(); } void LocationParser_ns::parsePointList(PointList &list) { |