diff options
Diffstat (limited to 'engines/parallaction/parser_br.cpp')
-rw-r--r-- | engines/parallaction/parser_br.cpp | 888 |
1 files changed, 541 insertions, 347 deletions
diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index 2544267382..51da7eb396 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -104,18 +104,217 @@ namespace Parallaction { #define INST_ENDIF 30 #define INST_STOP 31 -#define DECLARE_ZONE_PARSER(sig) void Parallaction_br::locZoneParse_##sig() -#define DECLARE_ANIM_PARSER(sig) void Parallaction_br::locAnimParse_##sig() -#define DECLARE_COMMAND_PARSER(sig) void Parallaction_br::cmdParse_##sig() -#define DECLARE_INSTRUCTION_PARSER(sig) void Parallaction_br::instParse_##sig() -#define DECLARE_LOCATION_PARSER(sig) void Parallaction_br::locParse_##sig() +const char *_zoneTypeNamesRes_br[] = { + "examine", + "door", + "get", + "merge", + "taste", + "hear", + "feel", + "speak", + "none", + "trap", + "you", + "command", + "path", + "box" +}; + +const char *_zoneFlagNamesRes_br[] = { + "closed", + "active", + "remove", + "acting", + "locked", + "fixed", + "noname", + "nomasked", + "looping", + "added", + "character", + "nowalk", + "yourself", + "scaled", + "selfuse" +}; + +const char *_commandsNamesRes_br[] = { + "set", + "clear", + "start", + "speak", + "get", + "location", + "open", + "close", + "on", + "off", + "call", + "toggle", + "drop", + "quit", + "move", + "stop", + "character", + "followme", + "onmouse", + "offmouse", + "add", + "leave", + "inc", + "dec", + "test", + "dummy", + "dummy", + "let", + "music", + "fix", + "unfix", + "zeta", + "scroll", + "swap", + "give", + "text", + "part", + "dummy", + "return", + "onsave", + "offsave", + "endcommands", + "ifchar", + "endif" +}; + + +const char *_audioCommandsNamesRes_br[] = { + "play", + "stop", + "pause", + "channel_level", + "fadein", + "fadeout", + "volume", + " ", + "faderate", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "loop" +}; + +const char *_locationStmtRes_br[] = { + "character", + "endlocation", + "ifchar", + "endif", + "location", + "mask", + "path", + "disk", + "localflags", + "commands", + "escape", + "acommands", + "flags", + "comment", + "endcomment", + "zone", + "animation", + "zeta", + "music", + "sound" +}; + +const char *_locationZoneStmtRes_br[] = { + "endzone", + "limits", + "moveto", + "type", + "commands", + "label", + "flags" +}; + +const char *_locationAnimStmtRes_br[] = { + "endanimation", + "endzone", + "script", + "commands", + "type", + "label", + "flags", + "file", + "position", + "moveto" +}; + +const char *_instructionNamesRes_br[] = { + "on", + "off", + "x", + "y", + "z", + "f", + "loop", + "endloop", + "show", + "inc", + "dec", + "set", + "put", + "call", + "wait", + "start", + "process", + "move", + "color", + "sound", + "mask", + "print", + "text", + "mul", + "div", + "if", + "dummy", + "dummy", + "endif", + "stop", + "endscript" +}; + + +#define SetOpcodeTable(x) table = &x; + +typedef Common::Functor0Mem<void, ProgramParser_br> OpcodeV1; +#define INSTRUCTION_PARSER(sig) table->push_back(new OpcodeV1(this, &ProgramParser_br::instParse_##sig)) + +typedef Common::Functor0Mem<void, LocationParser_br> OpcodeV2; +#define ZONE_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locZoneParse_##sig)) +#define ANIM_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locAnimParse_##sig)) +#define LOCATION_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locParse_##sig)) +#define COMMAND_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::cmdParse_##sig)) + +#define WARNING_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::warning_##sig)) + + +#define DECLARE_ZONE_PARSER(sig) void LocationParser_br::locZoneParse_##sig() +#define DECLARE_ANIM_PARSER(sig) void LocationParser_br::locAnimParse_##sig() +#define DECLARE_COMMAND_PARSER(sig) void LocationParser_br::cmdParse_##sig() +#define DECLARE_LOCATION_PARSER(sig) void LocationParser_br::locParse_##sig() + +#define DECLARE_INSTRUCTION_PARSER(sig) void ProgramParser_br::instParse_##sig() DECLARE_LOCATION_PARSER(location) { debugC(7, kDebugParser, "LOCATION_PARSER(location) "); - strcpy(_location._name, _tokens[1]); - _locParseCtxt.bgName = strdup(_tokens[1]); + strcpy(_vm->_location._name, _tokens[1]); + ctxt.bgName = strdup(_tokens[1]); bool flip = false; int nextToken; @@ -130,14 +329,14 @@ DECLARE_LOCATION_PARSER(location) { // TODO: handle background horizontal flip (via a context parameter) if (_tokens[nextToken][0] != '\0') { - _char._ani->_left = atoi(_tokens[nextToken]); + _vm->_char._ani->_left = atoi(_tokens[nextToken]); nextToken++; - _char._ani->_top = atoi(_tokens[nextToken]); + _vm->_char._ani->_top = atoi(_tokens[nextToken]); nextToken++; } if (_tokens[nextToken][0] != '\0') { - _char._ani->_frame = atoi(_tokens[nextToken]); + _vm->_char._ani->_frame = atoi(_tokens[nextToken]); } } @@ -146,14 +345,14 @@ DECLARE_LOCATION_PARSER(location) { DECLARE_LOCATION_PARSER(zone) { debugC(7, kDebugParser, "LOCATION_PARSER(zone) "); - parseZone(*_locParseCtxt.script, _location._zones, _tokens[1]); + parseZone(_vm->_location._zones, _tokens[1]); - _locParseCtxt.z->_index = _locParseCtxt.numZones++; + ctxt.z->_index = ctxt.numZones++; - if (getLocationFlags() & kFlagsVisited) { - _locParseCtxt.z->_flags = _zoneFlags[_currentLocationIndex][_locParseCtxt.z->_index]; + if (_vm->getLocationFlags() & kFlagsVisited) { + ctxt.z->_flags = _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.z->_index]; } else { - _zoneFlags[_currentLocationIndex][_locParseCtxt.z->_index] = _locParseCtxt.z->_flags; + _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.z->_index] = ctxt.z->_flags; } } @@ -162,14 +361,14 @@ DECLARE_LOCATION_PARSER(zone) { DECLARE_LOCATION_PARSER(animation) { debugC(7, kDebugParser, "LOCATION_PARSER(animation) "); - parseAnimation(*_locParseCtxt.script, _location._animations, _tokens[1]); + parseAnimation(_vm->_location._animations, _tokens[1]); - _locParseCtxt.a->_index = _locParseCtxt.numZones++; + ctxt.a->_index = ctxt.numZones++; - if (getLocationFlags() & kFlagsVisited) { - _locParseCtxt.a->_flags = _zoneFlags[_currentLocationIndex][_locParseCtxt.a->_index]; + if (_vm->getLocationFlags() & kFlagsVisited) { + ctxt.a->_flags = _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.a->_index]; } else { - _zoneFlags[_currentLocationIndex][_locParseCtxt.a->_index] = _locParseCtxt.a->_flags; + _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.a->_index] = ctxt.a->_flags; } } @@ -180,7 +379,7 @@ DECLARE_LOCATION_PARSER(localflags) { int _si = 1; while (_tokens[_si][0] != '\0') { - _localFlagNames->addData(_tokens[_si]); + _vm->_localFlagNames->addData(_tokens[_si]); _si++; } } @@ -189,14 +388,14 @@ DECLARE_LOCATION_PARSER(localflags) { DECLARE_LOCATION_PARSER(flags) { debugC(7, kDebugParser, "LOCATION_PARSER(flags) "); - if ((getLocationFlags() & kFlagsVisited) == 0) { + if ((_vm->getLocationFlags() & kFlagsVisited) == 0) { // only for 1st visit - clearLocationFlags(kFlagsAll); + _vm->clearLocationFlags(kFlagsAll); int _si = 1; do { - byte _al = _localFlagNames->lookup(_tokens[_si]); - setLocationFlags(1 << (_al - 1)); + byte _al = _vm->_localFlagNames->lookup(_tokens[_si]); + _vm->setLocationFlags(1 << (_al - 1)); _si++; if (scumm_stricmp(_tokens[_si], "|")) break; @@ -209,14 +408,14 @@ DECLARE_LOCATION_PARSER(flags) { DECLARE_LOCATION_PARSER(comment) { debugC(7, kDebugParser, "LOCATION_PARSER(comment) "); - _location._comment = parseComment(*_locParseCtxt.script); + _vm->_location._comment = parseComment(); } DECLARE_LOCATION_PARSER(endcomment) { debugC(7, kDebugParser, "LOCATION_PARSER(endcomment) "); - _location._endComment = parseComment(*_locParseCtxt.script); + _vm->_location._endComment = parseComment(); } @@ -236,21 +435,21 @@ DECLARE_LOCATION_PARSER(music) { DECLARE_LOCATION_PARSER(redundant) { debugC(7, kDebugParser, "LOCATION_PARSER(redundant) "); - warning("redundant '%s' line found in script '%s'", _tokens[0], _locParseCtxt.filename); + warning("redundant '%s' line found in script '%s'", _tokens[0], ctxt.filename); } DECLARE_LOCATION_PARSER(character) { debugC(7, kDebugParser, "LOCATION_PARSER(character) "); -// changeCharacter(character); + ctxt.characterName = strdup(_tokens[0]); } DECLARE_LOCATION_PARSER(ifchar) { debugC(7, kDebugParser, "LOCATION_PARSER(ifchar) "); - _locParseCtxt.script->skip("ENDIF"); + _script->skip("ENDIF"); } @@ -264,45 +463,45 @@ DECLARE_LOCATION_PARSER(null) { DECLARE_LOCATION_PARSER(mask) { debugC(7, kDebugParser, "LOCATION_PARSER(mask) "); - _locParseCtxt.maskName = strdup(_tokens[1]); - _gfx->_backgroundInfo.layers[0] = atoi(_tokens[2]); - _gfx->_backgroundInfo.layers[1] = atoi(_tokens[3]); - _gfx->_backgroundInfo.layers[2] = atoi(_tokens[4]); + ctxt.maskName = strdup(_tokens[1]); + _vm->_gfx->_backgroundInfo.layers[0] = atoi(_tokens[2]); + _vm->_gfx->_backgroundInfo.layers[1] = atoi(_tokens[3]); + _vm->_gfx->_backgroundInfo.layers[2] = atoi(_tokens[4]); } DECLARE_LOCATION_PARSER(path) { debugC(7, kDebugParser, "LOCATION_PARSER(path) "); - _locParseCtxt.pathName = strdup(_tokens[1]); + ctxt.pathName = strdup(_tokens[1]); } DECLARE_LOCATION_PARSER(escape) { debugC(7, kDebugParser, "LOCATION_PARSER(escape) "); - parseCommands(*_locParseCtxt.script, _location._escapeCommands); + parseCommands(_vm->_location._escapeCommands); } DECLARE_LOCATION_PARSER(zeta) { debugC(7, kDebugParser, "LOCATION_PARSER(zeta) "); - _location._zeta0 = atoi(_tokens[1]); - _location._zeta1 = atoi(_tokens[2]); + _vm->_location._zeta0 = atoi(_tokens[1]); + _vm->_location._zeta1 = atoi(_tokens[2]); if (_tokens[3][0] != '\0') { - _location._zeta2 = atoi(_tokens[1]); + _vm->_location._zeta2 = atoi(_tokens[1]); } else { - _location._zeta2 = 50; + _vm->_location._zeta2 = 50; } } DECLARE_COMMAND_PARSER(ifchar) { debugC(7, kDebugParser, "COMMAND_PARSER(ifchar) "); - if (!scumm_stricmp(_char.getName(), _tokens[1])) - _locParseCtxt.script->skip("endif"); + if (!scumm_stricmp(_vm->_char.getName(), _tokens[1])) + _script->skip("endif"); } @@ -316,24 +515,24 @@ DECLARE_COMMAND_PARSER(endif) { DECLARE_COMMAND_PARSER(location) { debugC(7, kDebugParser, "COMMAND_PARSER(location) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._string = strdup(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._string = strdup(_tokens[1]); + ctxt.nextToken++; - if (_tokens[_locParseCtxt.nextToken][0] != '\0') { - if (isdigit(_tokens[_locParseCtxt.nextToken][0]) || _tokens[_locParseCtxt.nextToken][0] == '-') { - _locParseCtxt.cmd->u._startPos.x = atoi(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; - _locParseCtxt.cmd->u._startPos.y = atoi(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; + if (_tokens[ctxt.nextToken][0] != '\0') { + if (isdigit(_tokens[ctxt.nextToken][0]) || _tokens[ctxt.nextToken][0] == '-') { + ctxt.cmd->u._startPos.x = atoi(_tokens[ctxt.nextToken]); + ctxt.nextToken++; + ctxt.cmd->u._startPos.y = atoi(_tokens[ctxt.nextToken]); + ctxt.nextToken++; } - if (isdigit(_tokens[_locParseCtxt.nextToken][0]) || _tokens[_locParseCtxt.nextToken][0] == '-') { - _locParseCtxt.cmd->u._startPos2.x = atoi(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; - _locParseCtxt.cmd->u._startPos2.y = atoi(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; + if (isdigit(_tokens[ctxt.nextToken][0]) || _tokens[ctxt.nextToken][0] == '-') { + ctxt.cmd->u._startPos2.x = atoi(_tokens[ctxt.nextToken]); + ctxt.nextToken++; + ctxt.cmd->u._startPos2.y = atoi(_tokens[ctxt.nextToken]); + ctxt.nextToken++; } } @@ -345,10 +544,10 @@ DECLARE_COMMAND_PARSER(location) { DECLARE_COMMAND_PARSER(string) { debugC(7, kDebugParser, "COMMAND_PARSER(string) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._string = strdup(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._string = strdup(_tokens[1]); + ctxt.nextToken++; parseCommandFlags(); addCommand(); @@ -357,12 +556,12 @@ DECLARE_COMMAND_PARSER(string) { DECLARE_COMMAND_PARSER(math) { debugC(7, kDebugParser, "COMMAND_PARSER(math) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._lvalue = _countersNames->lookup(_tokens[1]); - _locParseCtxt.nextToken++; - _locParseCtxt.cmd->u._rvalue = atoi(_tokens[2]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._lvalue = _vm->_countersNames->lookup(_tokens[1]); + ctxt.nextToken++; + ctxt.cmd->u._rvalue = atoi(_tokens[2]); + ctxt.nextToken++; parseCommandFlags(); addCommand(); @@ -372,29 +571,29 @@ DECLARE_COMMAND_PARSER(math) { DECLARE_COMMAND_PARSER(test) { debugC(7, kDebugParser, "COMMAND_PARSER(test) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - uint counter = _countersNames->lookup(_tokens[1]); - _locParseCtxt.nextToken++; + uint counter = _vm->_countersNames->lookup(_tokens[1]); + ctxt.nextToken++; if (counter == Table::notFound) { if (!scumm_stricmp("SFX", _tokens[1])) { - _locParseCtxt.cmd->_id = CMD_TEST_SFX; + ctxt.cmd->_id = CMD_TEST_SFX; } else { error("unknown counter '%s' in test opcode", _tokens[1]); } } else { - _locParseCtxt.cmd->u._lvalue = counter; - _locParseCtxt.cmd->u._rvalue = atoi(_tokens[3]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._lvalue = counter; + ctxt.cmd->u._rvalue = atoi(_tokens[3]); + ctxt.nextToken++; if (_tokens[2][0] == '>') { - _locParseCtxt.cmd->_id = CMD_TEST_GT; + ctxt.cmd->_id = CMD_TEST_GT; } else if (_tokens[2][0] == '<') { - _locParseCtxt.cmd->_id = CMD_TEST_LT; + ctxt.cmd->_id = CMD_TEST_LT; } - _locParseCtxt.nextToken++; + ctxt.nextToken++; } parseCommandFlags(); @@ -405,14 +604,14 @@ DECLARE_COMMAND_PARSER(test) { DECLARE_COMMAND_PARSER(music) { debugC(7, kDebugParser, "COMMAND_PARSER(music) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._musicCommand = _audioCommandsNames->lookup(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._musicCommand = _audioCommandsNames->lookup(_tokens[1]); + ctxt.nextToken++; if (_tokens[2][0] != '\0' && scumm_stricmp("flags", _tokens[2]) && scumm_stricmp("gflags", _tokens[2])) { - _locParseCtxt.cmd->u._musicParm = atoi(_tokens[2]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._musicParm = atoi(_tokens[2]); + ctxt.nextToken++; } parseCommandFlags(); @@ -423,18 +622,18 @@ DECLARE_COMMAND_PARSER(music) { DECLARE_COMMAND_PARSER(zeta) { debugC(7, kDebugParser, "COMMAND_PARSER(zeta) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._zeta0 = atoi(_tokens[1]); - _locParseCtxt.nextToken++; - _locParseCtxt.cmd->u._zeta1 = atoi(_tokens[2]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._zeta0 = atoi(_tokens[1]); + ctxt.nextToken++; + ctxt.cmd->u._zeta1 = atoi(_tokens[2]); + ctxt.nextToken++; if (_tokens[3][0] != '\0') { - _locParseCtxt.cmd->u._zeta2 = atoi(_tokens[3]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._zeta2 = atoi(_tokens[3]); + ctxt.nextToken++; } else { - _locParseCtxt.cmd->u._zeta2 = 50; + ctxt.cmd->u._zeta2 = 50; } parseCommandFlags(); @@ -445,23 +644,23 @@ DECLARE_COMMAND_PARSER(zeta) { DECLARE_COMMAND_PARSER(give) { debugC(7, kDebugParser, "COMMAND_PARSER(give) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._object = 4 + atoi(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._object = 4 + atoi(_tokens[1]); + ctxt.nextToken++; if (!scumm_stricmp("dino", _tokens[2])) { - _locParseCtxt.cmd->u._characterId = 1; + ctxt.cmd->u._characterId = 1; } else if (!scumm_stricmp("doug", _tokens[2])) { - _locParseCtxt.cmd->u._characterId = 2; + ctxt.cmd->u._characterId = 2; } else if (!scumm_stricmp("donna", _tokens[2])) { - _locParseCtxt.cmd->u._characterId = 3; + ctxt.cmd->u._characterId = 3; } else error("unknown recipient '%s' in give command", _tokens[2]); - _locParseCtxt.nextToken++; + ctxt.nextToken++; parseCommandFlags(); addCommand(); @@ -471,21 +670,21 @@ DECLARE_COMMAND_PARSER(give) { DECLARE_COMMAND_PARSER(text) { debugC(7, kDebugParser, "COMMAND_PARSER(text) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); if (isdigit(_tokens[1][1])) { - _locParseCtxt.cmd->u._zeta0 = atoi(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._zeta0 = atoi(_tokens[1]); + ctxt.nextToken++; } else { - _locParseCtxt.cmd->u._zeta0 = -1; + ctxt.cmd->u._zeta0 = -1; } - _locParseCtxt.cmd->u._string = strdup(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._string = strdup(_tokens[ctxt.nextToken]); + ctxt.nextToken++; - if (_tokens[_locParseCtxt.nextToken][0] != '\0' && scumm_stricmp("flags", _tokens[_locParseCtxt.nextToken])) { - _locParseCtxt.cmd->u._string2 = strdup(_tokens[_locParseCtxt.nextToken]); - _locParseCtxt.nextToken++; + if (_tokens[ctxt.nextToken][0] != '\0' && scumm_stricmp("flags", _tokens[ctxt.nextToken])) { + ctxt.cmd->u._string2 = strdup(_tokens[ctxt.nextToken]); + ctxt.nextToken++; } @@ -497,10 +696,10 @@ DECLARE_COMMAND_PARSER(text) { DECLARE_COMMAND_PARSER(unary) { debugC(7, kDebugParser, "COMMAND_PARSER(unary) "); - createCommand(_locationParser->_lookup); + createCommand(_parser->_lookup); - _locParseCtxt.cmd->u._rvalue = atoi(_tokens[1]); - _locParseCtxt.nextToken++; + ctxt.cmd->u._rvalue = atoi(_tokens[1]); + ctxt.nextToken++; parseCommandFlags(); addCommand(); @@ -511,14 +710,14 @@ DECLARE_ZONE_PARSER(limits) { debugC(7, kDebugParser, "ZONE_PARSER(limits) "); if (isalpha(_tokens[1][1])) { - _locParseCtxt.z->_flags |= kFlagsAnimLinked; - _locParseCtxt.z->_linkedAnim = findAnimation(_tokens[1]); - _locParseCtxt.z->_linkedName = strdup(_tokens[1]); + ctxt.z->_flags |= kFlagsAnimLinked; + ctxt.z->_linkedAnim = _vm->findAnimation(_tokens[1]); + ctxt.z->_linkedName = strdup(_tokens[1]); } else { - _locParseCtxt.z->_left = atoi(_tokens[1]); - _locParseCtxt.z->_top = atoi(_tokens[2]); - _locParseCtxt.z->_right = atoi(_tokens[3]); - _locParseCtxt.z->_bottom = atoi(_tokens[4]); + ctxt.z->_left = atoi(_tokens[1]); + ctxt.z->_top = atoi(_tokens[2]); + ctxt.z->_right = atoi(_tokens[3]); + ctxt.z->_bottom = atoi(_tokens[4]); } } @@ -526,9 +725,9 @@ DECLARE_ZONE_PARSER(limits) { DECLARE_ZONE_PARSER(moveto) { debugC(7, kDebugParser, "ZONE_PARSER(moveto) "); - _locParseCtxt.z->_moveTo.x = atoi(_tokens[1]); - _locParseCtxt.z->_moveTo.y = atoi(_tokens[2]); -// _locParseCtxt.z->_moveTo.z = atoi(_tokens[3]); + ctxt.z->_moveTo.x = atoi(_tokens[1]); + ctxt.z->_moveTo.y = atoi(_tokens[2]); +// ctxt.z->_moveTo.z = atoi(_tokens[3]); } @@ -536,45 +735,45 @@ DECLARE_ZONE_PARSER(type) { debugC(7, kDebugParser, "ZONE_PARSER(type) "); if (_tokens[2][0] != '\0') { - _locParseCtxt.z->_type = (4 + _objectsNames->lookup(_tokens[2])) << 16; + ctxt.z->_type = (4 + _vm->_objectsNames->lookup(_tokens[2])) << 16; } int16 _si = _zoneTypeNames->lookup(_tokens[1]); if (_si != Table::notFound) { - _locParseCtxt.z->_type |= 1 << (_si - 1); - parseZoneTypeBlock(*_locParseCtxt.script, _locParseCtxt.z); + ctxt.z->_type |= 1 << (_si - 1); + parseZoneTypeBlock(ctxt.z); -// if (_locParseCtxt.z->_type & kZoneHear) { +// if (ctxt.z->_type & kZoneHear) { // _soundMan->sfxCommand(START...); // } } - _locationParser->popTables(); + _parser->popTables(); } DECLARE_ANIM_PARSER(file) { debugC(7, kDebugParser, "ANIM_PARSER(file) "); - _locParseCtxt.a->gfxobj = _gfx->loadAnim(_tokens[1]); + ctxt.a->gfxobj = _vm->_gfx->loadAnim(_tokens[1]); } DECLARE_ANIM_PARSER(position) { debugC(7, kDebugParser, "ANIM_PARSER(position) "); - _locParseCtxt.a->_left = atoi(_tokens[1]); - _locParseCtxt.a->_top = atoi(_tokens[2]); - _locParseCtxt.a->_z = atoi(_tokens[3]); - _locParseCtxt.a->_frame = atoi(_tokens[4]); + ctxt.a->_left = atoi(_tokens[1]); + ctxt.a->_top = atoi(_tokens[2]); + ctxt.a->_z = atoi(_tokens[3]); + ctxt.a->_frame = atoi(_tokens[4]); } DECLARE_ANIM_PARSER(moveto) { debugC(7, kDebugParser, "ANIM_PARSER(moveto) "); - _locParseCtxt.a->_moveTo.x = atoi(_tokens[1]); - _locParseCtxt.a->_moveTo.y = atoi(_tokens[2]); -// _locParseCtxt.a->_moveTo.z = atoi(_tokens[3]); + ctxt.a->_moveTo.x = atoi(_tokens[1]); + ctxt.a->_moveTo.y = atoi(_tokens[2]); +// ctxt.a->_moveTo.z = atoi(_tokens[3]); } @@ -582,17 +781,17 @@ DECLARE_ANIM_PARSER(endanimation) { debugC(7, kDebugParser, "ANIM_PARSER(endanimation) "); - if (_locParseCtxt.a->gfxobj) { - _locParseCtxt.a->_right = _locParseCtxt.a->width(); - _locParseCtxt.a->_bottom = _locParseCtxt.a->height(); + if (ctxt.a->gfxobj) { + ctxt.a->_right = ctxt.a->width(); + ctxt.a->_bottom = ctxt.a->height(); } - _locParseCtxt.a->_oldPos.x = -1000; - _locParseCtxt.a->_oldPos.y = -1000; + ctxt.a->_oldPos.x = -1000; + ctxt.a->_oldPos.y = -1000; - _locParseCtxt.a->_flags |= 0x1000000; + ctxt.a->_flags |= 0x1000000; - _locationParser->popTables(); + _parser->popTables(); } @@ -607,7 +806,8 @@ DECLARE_ANIM_PARSER(endanimation) { DECLARE_INSTRUCTION_PARSER(zone) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(zone) "); - _instParseCtxt.inst->_z = findZone(_tokens[1]); + ctxt.inst->_z = _vm->findZone(_tokens[1]); + ctxt.inst->_index = _parser->_lookup; } @@ -616,11 +816,12 @@ DECLARE_INSTRUCTION_PARSER(color) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(color) "); - parseRValue(_instParseCtxt.inst->_opB, _tokens[1]); + parseRValue(ctxt.inst->_opB, _tokens[1]); - _instParseCtxt.inst->_colors[0] = atoi(_tokens[2]); - _instParseCtxt.inst->_colors[1] = atoi(_tokens[3]); - _instParseCtxt.inst->_colors[2] = atoi(_tokens[4]); + ctxt.inst->_colors[0] = atoi(_tokens[2]); + ctxt.inst->_colors[1] = atoi(_tokens[3]); + ctxt.inst->_colors[2] = atoi(_tokens[4]); + ctxt.inst->_index = _parser->_lookup; } @@ -629,9 +830,10 @@ DECLARE_INSTRUCTION_PARSER(mask) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(mask) "); - parseRValue(_instParseCtxt.inst->_opA, _tokens[1]); - parseRValue(_instParseCtxt.inst->_opB, _tokens[2]); - parseRValue(_instParseCtxt.inst->_opC, _tokens[3]); + parseRValue(ctxt.inst->_opA, _tokens[1]); + parseRValue(ctxt.inst->_opB, _tokens[2]); + parseRValue(ctxt.inst->_opC, _tokens[3]); + ctxt.inst->_index = _parser->_lookup; } @@ -639,7 +841,8 @@ DECLARE_INSTRUCTION_PARSER(mask) { DECLARE_INSTRUCTION_PARSER(print) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(print) "); - parseRValue(_instParseCtxt.inst->_opB, _tokens[1]); + parseRValue(ctxt.inst->_opB, _tokens[1]); + ctxt.inst->_index = _parser->_lookup; } @@ -650,18 +853,19 @@ DECLARE_INSTRUCTION_PARSER(text) { int _si = 1; if (isdigit(_tokens[1][1])) { - _instParseCtxt.inst->_y = atoi(_tokens[1]); + ctxt.inst->_y = atoi(_tokens[1]); _si = 2; } else { - _instParseCtxt.inst->_y = -1; + ctxt.inst->_y = -1; } - _instParseCtxt.inst->_text = strdup(_tokens[_si]); + ctxt.inst->_text = strdup(_tokens[_si]); _si++; if (_tokens[_si][0] != '\0' && scumm_stricmp("flags", _tokens[_si])) { - _instParseCtxt.inst->_text2 = strdup(_tokens[_si]); + ctxt.inst->_text2 = strdup(_tokens[_si]); } + ctxt.inst->_index = _parser->_lookup; } @@ -670,24 +874,24 @@ DECLARE_INSTRUCTION_PARSER(if_op) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(if_op) "); - if (_instParseCtxt.openIf) + if (ctxt.openIf) error("cannot nest 'if' blocks"); - parseLValue(_instParseCtxt.inst->_opA, _tokens[1]); - parseRValue(_instParseCtxt.inst->_opB, _tokens[3]); + parseLValue(ctxt.inst->_opA, _tokens[1]); + parseRValue(ctxt.inst->_opB, _tokens[3]); if (_tokens[2][0] == '=') { - _instParseCtxt.inst->_index = INST_IFEQ; + ctxt.inst->_index = INST_IFEQ; } else if (_tokens[2][0] == '>') { - _instParseCtxt.inst->_index = INST_IFGT; + ctxt.inst->_index = INST_IFGT; } else if (_tokens[2][0] == '<') { - _instParseCtxt.inst->_index = INST_IFLT; + ctxt.inst->_index = INST_IFLT; } else error("unknown test operator '%s' in if-clause", _tokens[2]); - _instParseCtxt.openIf = _instParseCtxt.inst; + ctxt.openIf = ctxt.inst; } @@ -695,35 +899,36 @@ DECLARE_INSTRUCTION_PARSER(if_op) { DECLARE_INSTRUCTION_PARSER(endif) { debugC(7, kDebugParser, "INSTRUCTION_PARSER(endif) "); - if (!_instParseCtxt.openIf) + if (!ctxt.openIf) error("unexpected 'endif'"); -// _instParseCtxt.openIf->_endif = _instParseCtxt.inst; - _instParseCtxt.openIf = nullInstructionPtr; +// ctxt.openIf->_endif = ctxt.inst; + ctxt.openIf = nullInstructionPtr; + ctxt.inst->_index = _parser->_lookup; } -void Parallaction_br::parseRValue(ScriptVar &v, const char *str) { +void ProgramParser_br::parseRValue(ScriptVar &v, const char *str) { if (isdigit(str[0]) || str[0] == '-') { v.setImmediate(atoi(str)); return; } - int index = _instParseCtxt.program->findLocal(str); + int index = _program->findLocal(str); if (index != -1) { - v.setLocal(&_instParseCtxt.locals[index]); + v.setLocal(&ctxt.locals[index]); return; } AnimationPtr a; if (str[1] == '.') { - a = findAnimation(&str[2]); + a = _vm->findAnimation(&str[2]); if (!a) { error("unknown animation '%s' in script", &str[2]); } } else - a = AnimationPtr(_instParseCtxt.a); + a = AnimationPtr(ctxt.a); if (str[0] == 'X') { v.setField(&a->_left); @@ -744,197 +949,186 @@ void Parallaction_br::parseRValue(ScriptVar &v, const char *str) { v.setRandom(atoi(&str[1])); } else if (str[0] == 'L') { - v.setField(&_lipSyncVal); + v.setField(&_vm->_lipSyncVal); } } -typedef OpcodeImpl<Parallaction_br> OpcodeV2; -#define INSTRUCTION_PARSER(sig) OpcodeV2(this, &Parallaction_br::instParse_##sig) -#define ZONE_PARSER(sig) OpcodeV2(this, &Parallaction_br::locZoneParse_##sig) -#define ANIM_PARSER(sig) OpcodeV2(this, &Parallaction_br::locAnimParse_##sig) -#define LOCATION_PARSER(sig) OpcodeV2(this, &Parallaction_br::locParse_##sig) -#define COMMAND_PARSER(sig) OpcodeV2(this, &Parallaction_br::cmdParse_##sig) - -#define WARNING_PARSER(sig) OpcodeV2(this, &Parallaction_br::warning_##sig) - -void Parallaction_br::initParsers() { - - _locationParser = new Parser; - - static const OpcodeV2 op0[] = { - INSTRUCTION_PARSER(defLocal), // invalid opcode -> local definition - INSTRUCTION_PARSER(zone), // on - INSTRUCTION_PARSER(zone), // off - INSTRUCTION_PARSER(x), - INSTRUCTION_PARSER(y), - INSTRUCTION_PARSER(z), - INSTRUCTION_PARSER(f), - INSTRUCTION_PARSER(loop), - INSTRUCTION_PARSER(null), // endloop - INSTRUCTION_PARSER(null), // show - INSTRUCTION_PARSER(inc), - INSTRUCTION_PARSER(inc), // dec - INSTRUCTION_PARSER(set), - INSTRUCTION_PARSER(put), - INSTRUCTION_PARSER(call), - INSTRUCTION_PARSER(null), // wait - INSTRUCTION_PARSER(zone), // start - INSTRUCTION_PARSER(zone), // process - INSTRUCTION_PARSER(move), - INSTRUCTION_PARSER(color), - INSTRUCTION_PARSER(zone), // sound - INSTRUCTION_PARSER(mask), - INSTRUCTION_PARSER(print), - INSTRUCTION_PARSER(text), - INSTRUCTION_PARSER(inc), // mul - INSTRUCTION_PARSER(inc), // div - INSTRUCTION_PARSER(if_op), - INSTRUCTION_PARSER(null), - INSTRUCTION_PARSER(null), - INSTRUCTION_PARSER(endif), - INSTRUCTION_PARSER(zone), // stop - INSTRUCTION_PARSER(endscript) - }; - - uint i; - for (i = 0; i < ARRAYSIZE(op0); i++) - _instructionParsers.push_back(&op0[i]); - - - static const OpcodeV2 op2[] = { - WARNING_PARSER(unexpected), - COMMAND_PARSER(flags), // set - COMMAND_PARSER(flags), // clear - COMMAND_PARSER(zone), // start - COMMAND_PARSER(zone), // speak - COMMAND_PARSER(zone), // get - COMMAND_PARSER(location), - COMMAND_PARSER(zone), // open - COMMAND_PARSER(zone), // close - COMMAND_PARSER(zone), // on - COMMAND_PARSER(zone), // off - COMMAND_PARSER(call), - COMMAND_PARSER(flags), // toggle - COMMAND_PARSER(drop), - COMMAND_PARSER(simple), // quit - COMMAND_PARSER(move), - COMMAND_PARSER(zone), // stop - COMMAND_PARSER(string), // character - COMMAND_PARSER(string), // followme - COMMAND_PARSER(simple), // onmouse - COMMAND_PARSER(simple), // offmouse - COMMAND_PARSER(drop), // add - COMMAND_PARSER(zone), // leave - COMMAND_PARSER(math), // inc - COMMAND_PARSER(math), // dec - COMMAND_PARSER(test), // test - WARNING_PARSER(unexpected), - WARNING_PARSER(unexpected), - COMMAND_PARSER(math), // let - COMMAND_PARSER(music), - COMMAND_PARSER(zone), // fix - COMMAND_PARSER(zone), // unfix - COMMAND_PARSER(zeta), - COMMAND_PARSER(unary), // scroll - COMMAND_PARSER(string), // swap - COMMAND_PARSER(give), - COMMAND_PARSER(text), - COMMAND_PARSER(unary), // part - WARNING_PARSER(unexpected), - COMMAND_PARSER(simple), // return - COMMAND_PARSER(simple), // onsave - COMMAND_PARSER(simple), // offsave - COMMAND_PARSER(endcommands), // endcommands - COMMAND_PARSER(ifchar), - COMMAND_PARSER(endif) - }; - - for (i = 0; i < ARRAYSIZE(op2); i++) - _commandParsers.push_back(&op2[i]); - - static const OpcodeV2 op4[] = { - WARNING_PARSER(unexpected), - LOCATION_PARSER(character), - LOCATION_PARSER(endlocation), - LOCATION_PARSER(ifchar), - LOCATION_PARSER(null), // endif - LOCATION_PARSER(location), - LOCATION_PARSER(mask), - LOCATION_PARSER(path), - LOCATION_PARSER(null), // disk - LOCATION_PARSER(localflags), - LOCATION_PARSER(commands), - LOCATION_PARSER(escape), - LOCATION_PARSER(acommands), - LOCATION_PARSER(flags), - LOCATION_PARSER(comment), - LOCATION_PARSER(endcomment), - LOCATION_PARSER(zone), - LOCATION_PARSER(animation), - LOCATION_PARSER(zeta), - LOCATION_PARSER(music), - LOCATION_PARSER(sound) - }; - - for (i = 0; i < ARRAYSIZE(op4); i++) - _locationParsers.push_back(&op4[i]); - - static const OpcodeV2 op5[] = { - WARNING_PARSER(unexpected), - ZONE_PARSER(endzone), - ZONE_PARSER(limits), - ZONE_PARSER(moveto), - ZONE_PARSER(type), - ZONE_PARSER(commands), - ZONE_PARSER(label), - ZONE_PARSER(flags) - }; - - for (i = 0; i < ARRAYSIZE(op5); i++) - _locationZoneParsers.push_back(&op5[i]); - - static const OpcodeV2 op6[] = { - WARNING_PARSER(unexpected), - ANIM_PARSER(endanimation), - ANIM_PARSER(endanimation), // endzone - ANIM_PARSER(script), - ANIM_PARSER(commands), - ANIM_PARSER(type), - ANIM_PARSER(label), - ANIM_PARSER(flags), - ANIM_PARSER(file), - ANIM_PARSER(position), - ANIM_PARSER(moveto) - }; - - for (i = 0; i < ARRAYSIZE(op6); i++) - _locationAnimParsers.push_back(&op6[i]); -} - -void Parallaction_br::parseLocation(const char* filename) { - - _locParseCtxt.numZones = 0; - _locParseCtxt.bgName = 0; - _locParseCtxt.maskName = 0; - _locParseCtxt.pathName = 0; - - Super::parseLocation(filename); - - _gfx->setBackground(kBackgroundLocation, _locParseCtxt.bgName, _locParseCtxt.maskName, _locParseCtxt.pathName); - _pathBuffer = &_gfx->_backgroundInfo.path; - - free(_locParseCtxt.bgName); - free(_locParseCtxt.maskName); - free(_locParseCtxt.pathName); - -// drawZones(); - - return; + +void LocationParser_br::init() { + + _parser = new Parser; + + _zoneFlagNames = new Table(ARRAYSIZE(_zoneFlagNamesRes_br), _zoneFlagNamesRes_br); + _zoneTypeNames = new Table(ARRAYSIZE(_zoneTypeNamesRes_br), _zoneTypeNamesRes_br); + _commandsNames = new Table(ARRAYSIZE(_commandsNamesRes_br), _commandsNamesRes_br); + _audioCommandsNames = new Table(ARRAYSIZE(_audioCommandsNamesRes_br), _audioCommandsNamesRes_br); + _locationStmt = new Table(ARRAYSIZE(_locationStmtRes_br), _locationStmtRes_br); + _locationZoneStmt = new Table(ARRAYSIZE(_locationZoneStmtRes_br), _locationZoneStmtRes_br); + _locationAnimStmt = new Table(ARRAYSIZE(_locationAnimStmtRes_br), _locationAnimStmtRes_br); + + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_commandParsers); + WARNING_PARSER(unexpected); + COMMAND_PARSER(flags); // set + COMMAND_PARSER(flags); // clear + COMMAND_PARSER(zone); // start + COMMAND_PARSER(zone); // speak + COMMAND_PARSER(zone); // get + COMMAND_PARSER(location); + COMMAND_PARSER(zone); // open + COMMAND_PARSER(zone); // close + COMMAND_PARSER(zone); // on + COMMAND_PARSER(zone); // off + COMMAND_PARSER(call); + COMMAND_PARSER(flags); // toggle + COMMAND_PARSER(drop); + COMMAND_PARSER(simple); // quit + COMMAND_PARSER(move); + COMMAND_PARSER(zone); // stop + COMMAND_PARSER(string); // character + COMMAND_PARSER(string); // followme + COMMAND_PARSER(simple); // onmouse + COMMAND_PARSER(simple); // offmouse + COMMAND_PARSER(drop); // add + COMMAND_PARSER(zone); // leave + COMMAND_PARSER(math); // inc + COMMAND_PARSER(math); // dec + COMMAND_PARSER(test); // test + WARNING_PARSER(unexpected); + WARNING_PARSER(unexpected); + COMMAND_PARSER(math); // let + COMMAND_PARSER(music); + COMMAND_PARSER(zone); // fix + COMMAND_PARSER(zone); // unfix + COMMAND_PARSER(zeta); + COMMAND_PARSER(unary); // scroll + COMMAND_PARSER(string); // swap + COMMAND_PARSER(give); + COMMAND_PARSER(text); + COMMAND_PARSER(unary); // part + WARNING_PARSER(unexpected); + COMMAND_PARSER(simple); // return + COMMAND_PARSER(simple); // onsave + COMMAND_PARSER(simple); // offsave + COMMAND_PARSER(endcommands); // endcommands + COMMAND_PARSER(ifchar); + COMMAND_PARSER(endif); + + SetOpcodeTable(_locationParsers); + WARNING_PARSER(unexpected); + LOCATION_PARSER(character); + LOCATION_PARSER(endlocation); + LOCATION_PARSER(ifchar); + LOCATION_PARSER(null); // endif + LOCATION_PARSER(location); + LOCATION_PARSER(mask); + LOCATION_PARSER(path); + LOCATION_PARSER(null); // disk + LOCATION_PARSER(localflags); + LOCATION_PARSER(commands); + LOCATION_PARSER(escape); + LOCATION_PARSER(acommands); + LOCATION_PARSER(flags); + LOCATION_PARSER(comment); + LOCATION_PARSER(endcomment); + LOCATION_PARSER(zone); + LOCATION_PARSER(animation); + LOCATION_PARSER(zeta); + LOCATION_PARSER(music); + LOCATION_PARSER(sound); + + SetOpcodeTable(_locationZoneParsers); + WARNING_PARSER(unexpected); + ZONE_PARSER(endzone); + ZONE_PARSER(limits); + ZONE_PARSER(moveto); + ZONE_PARSER(type); + ZONE_PARSER(commands); + ZONE_PARSER(label); + ZONE_PARSER(flags); + + + SetOpcodeTable(_locationAnimParsers); + WARNING_PARSER(unexpected); + ANIM_PARSER(endanimation); + ANIM_PARSER(endanimation); // endzone + ANIM_PARSER(script); + ANIM_PARSER(commands); + ANIM_PARSER(type); + ANIM_PARSER(label); + ANIM_PARSER(flags); + ANIM_PARSER(file); + ANIM_PARSER(position); + ANIM_PARSER(moveto); +} + +void ProgramParser_br::init() { + + _parser = new Parser; + + _instructionNames = new Table(ARRAYSIZE(_instructionNamesRes_br), _instructionNamesRes_br); + + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_instructionParsers); + INSTRUCTION_PARSER(defLocal); // invalid opcode -> local definition + INSTRUCTION_PARSER(zone); // on + INSTRUCTION_PARSER(zone); // off + INSTRUCTION_PARSER(x); + INSTRUCTION_PARSER(y); + INSTRUCTION_PARSER(z); + INSTRUCTION_PARSER(f); + INSTRUCTION_PARSER(loop); + INSTRUCTION_PARSER(null); // endloop + INSTRUCTION_PARSER(null); // show + INSTRUCTION_PARSER(inc); + INSTRUCTION_PARSER(inc); // dec + INSTRUCTION_PARSER(set); + INSTRUCTION_PARSER(put); + INSTRUCTION_PARSER(call); + INSTRUCTION_PARSER(null); // wait + INSTRUCTION_PARSER(zone); // start + INSTRUCTION_PARSER(zone); // process + INSTRUCTION_PARSER(move); + INSTRUCTION_PARSER(color); + INSTRUCTION_PARSER(zone); // sound + INSTRUCTION_PARSER(mask); + INSTRUCTION_PARSER(print); + INSTRUCTION_PARSER(text); + INSTRUCTION_PARSER(inc); // mul + INSTRUCTION_PARSER(inc); // div + INSTRUCTION_PARSER(if_op); + INSTRUCTION_PARSER(null); + INSTRUCTION_PARSER(null); + INSTRUCTION_PARSER(endif); + INSTRUCTION_PARSER(zone); // stop + INSTRUCTION_PARSER(endscript); } +void LocationParser_br::parse(Script *script) { + + ctxt.numZones = 0; + ctxt.bgName = 0; + ctxt.maskName = 0; + ctxt.pathName = 0; + ctxt.characterName = 0; + LocationParser_ns::parse(script); + _vm->_gfx->setBackground(kBackgroundLocation, ctxt.bgName, ctxt.maskName, ctxt.pathName); + _vm->_pathBuffer = &_vm->_gfx->_backgroundInfo.path; + if (ctxt.characterName) { + _vm->changeCharacter(ctxt.characterName); + } + + free(ctxt.bgName); + free(ctxt.maskName); + free(ctxt.pathName); + free(ctxt.characterName); + +} } // namespace Parallaction |