diff options
author | Nicola Mettifogo | 2009-03-02 08:36:42 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2009-03-02 08:36:42 +0000 |
commit | 33a8fe7a7e596b13b05e091c52a0f1a2d5296394 (patch) | |
tree | 3b8353a62a615b0a931f1a58965e3747b84332a2 /engines/parallaction/parser_br.cpp | |
parent | da6315bb4c0b93cfd60dbb0ad2117caa530116e7 (diff) | |
download | scummvm-rg350-33a8fe7a7e596b13b05e091c52a0f1a2d5296394.tar.gz scummvm-rg350-33a8fe7a7e596b13b05e091c52a0f1a2d5296394.tar.bz2 scummvm-rg350-33a8fe7a7e596b13b05e091c52a0f1a2d5296394.zip |
Initialize and save zones flags and follower position when a location switch occurs.
svn-id: r39064
Diffstat (limited to 'engines/parallaction/parser_br.cpp')
-rw-r--r-- | engines/parallaction/parser_br.cpp | 75 |
1 files changed, 61 insertions, 14 deletions
diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index 529d87b953..37084833a8 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -343,37 +343,35 @@ DECLARE_LOCATION_PARSER(location) { _vm->_disk->loadScenery(*ctxt.info, _tokens[1], 0, 0); } - - DECLARE_LOCATION_PARSER(zone) { debugC(7, kDebugParser, "LOCATION_PARSER(zone) "); + ctxt.z.reset(); parseZone(_vm->_location._zones, _tokens[1]); + if (!ctxt.z) { + return; + } ctxt.z->_index = ctxt.numZones++; + ctxt.z->_locationIndex = _vm->_currentLocationIndex; - if (_vm->getLocationFlags() & kFlagsVisited) { - ctxt.z->_flags = _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.z->_index]; - } else { - _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.z->_index] = ctxt.z->_flags; - } - + _vm->restoreOrSaveZoneFlags(ctxt.z, _vm->getLocationFlags() & kFlagsVisited); } DECLARE_LOCATION_PARSER(animation) { debugC(7, kDebugParser, "LOCATION_PARSER(animation) "); + ctxt.a.reset(); parseAnimation(_vm->_location._animations, _tokens[1]); + if (!ctxt.a) { + return; + } ctxt.a->_index = ctxt.numZones++; + ctxt.a->_locationIndex = _vm->_currentLocationIndex; - if (_vm->getLocationFlags() & kFlagsVisited) { - ctxt.a->_flags = _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.a->_index]; - } else { - _vm->_zoneFlags[_vm->_currentLocationIndex][ctxt.a->_index] = ctxt.a->_flags; - } - + _vm->restoreOrSaveZoneFlags(ctxt.a, _vm->getLocationFlags() & kFlagsVisited); } @@ -808,6 +806,55 @@ void LocationParser_br::parseGetData(ZonePtr z) { z->u.get = data; } +void LocationParser_br::parseDoorData(ZonePtr z) { + + DoorData *data = new DoorData; + + do { + + if (!scumm_stricmp(_tokens[0], "slidetext")) { + strcpy(_vm->_location._slideText[0], _tokens[1]); +// printf("%s\t", _slideText[0]); + strcpy(_vm->_location._slideText[1], _tokens[2]); + } + + if (!scumm_stricmp(_tokens[0], "location")) { + data->_location = strdup(_tokens[1]); + } + + if (!scumm_stricmp(_tokens[0], "file")) { +// printf("file: '%s'", _tokens[0]); + + uint16 frame = (z->_flags & kFlagsClosed ? 0 : 1); + + GfxObj *obj = _vm->_gfx->loadDoor(_tokens[1]); + obj->frame = frame; + obj->x = z->getX(); + obj->y = z->getY(); + _vm->_gfx->showGfxObj(obj, true); + + data->gfxobj = obj; + } + + if (!scumm_stricmp(_tokens[0], "startpos")) { + data->_startPos.x = atoi(_tokens[1]); + data->_startPos.y = atoi(_tokens[2]); + data->_startFrame = atoi(_tokens[3]); + } + + if (!scumm_stricmp(_tokens[0], "startpos2")) { + data->_startPos2.x = atoi(_tokens[1]); + data->_startPos2.y = atoi(_tokens[2]); + data->_startFrame2 = atoi(_tokens[3]); + } + + _script->readLineToken(true); + } while (scumm_stricmp(_tokens[0], "endzone") && scumm_stricmp(_tokens[0], "endanimation")); + + z->u.door = data; + +} + void LocationParser_br::parseZoneTypeBlock(ZonePtr z) { debugC(7, kDebugParser, "parseZoneTypeBlock(name: %s, type: %x)", z->_name, z->_type); |