From 666f0720ab801e8e9df4a8e65f452044b110f7b2 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sun, 29 Mar 2009 13:56:16 +0000 Subject: (Re)link bounding animations after location has been completely parsed. This avoids problems due to forward references. svn-id: r39740 --- engines/parallaction/exec_br.cpp | 5 +---- engines/parallaction/objects.cpp | 4 ---- engines/parallaction/objects.h | 2 +- engines/parallaction/parallaction.cpp | 4 +++- engines/parallaction/parallaction_br.cpp | 8 +++++++- engines/parallaction/parser_br.cpp | 3 +-- 6 files changed, 13 insertions(+), 13 deletions(-) (limited to 'engines/parallaction') diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 8821db4e3c..c333a284da 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -115,14 +115,11 @@ void Parallaction_br::clearSubtitles() { DECLARE_COMMAND_OPCODE(location) { - warning("Parallaction_br::cmdOp_location command not yet implemented"); - _vm->_location._startPosition = ctxt._cmd->_startPos; - _vm->_location._startFrame = 0; // TODO: verify this against the disassembly!f + _vm->_location._startFrame = 0; _vm->_location._followerStartPosition = ctxt._cmd->_startPos2; _vm->_location._followerStartFrame = 0; - // TODO: handle startPos and startPos2 _vm->scheduleLocationSwitch(ctxt._cmd->_string); } diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index f1309c6919..85e0215956 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -201,13 +201,9 @@ Zone::Zone() { // BRA specific _index = INVALID_ZONE_INDEX; _locationIndex = INVALID_LOCATION_INDEX; - _linkedName = 0; } Zone::~Zone() { -// printf("~Zone(%s)\n", _name); - - free(_linkedName); } void Zone::translate(int16 x, int16 y) { diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index 4c02d94334..c6ebeb7850 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -281,7 +281,7 @@ public: // BRA specific uint _index; uint _locationIndex; - char *_linkedName; + Common::String _linkedName; AnimationPtr _linkedAnim; Zone(); diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index ffb336f40f..be33bfdaa9 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -728,7 +728,9 @@ bool Parallaction::checkLinkedAnimBox(ZonePtr z, uint32 type, uint x, uint y) { if (z->_flags & kFlagsRemove) return false; - if ((z->_flags & kFlagsAnimLinked) == 0) + // flag kFlagsAnimLinked may be on, but the animation may not be loaded, so + // we must use the animation reference to check here + if (!z->_linkedAnim) return false; debugC(5, kDebugExec, "checkLinkedAnimBox for %s (type = %x, x = %i, y = %i)", z->_name, type, x, y); diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 73ab2c0bb6..7d641b530f 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -360,8 +360,14 @@ void Parallaction_br::parseLocation(const char *filename) { ZoneList::iterator zit = _vm->_location._zones.begin(); for ( ; zit != _vm->_location._zones.end(); ++zit) { + ZonePtr z = *zit; // restore the flags if the location has already been visited - restoreOrSaveZoneFlags(*zit, visited); + restoreOrSaveZoneFlags(z, visited); + + // (re)link the bounding animation if needed + if (z->_flags & kFlagsAnimLinked) { + z->_linkedAnim = _location.findAnimation(z->_linkedName.c_str()); + } } debugC(1, kDebugParser, "parseLocation('%s') done", filename); diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index 618bba254e..8bb034986b 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -717,8 +717,7 @@ DECLARE_ZONE_PARSER(limits) { if (isalpha(_tokens[1][1])) { ctxt.z->_flags |= kFlagsAnimLinked; - ctxt.z->_linkedAnim = _vm->_location.findAnimation(_tokens[1]); - ctxt.z->_linkedName = strdup(_tokens[1]); + ctxt.z->_linkedName = _tokens[1]; } else { ctxt.z->setRect(atoi(_tokens[1]), atoi(_tokens[2]), atoi(_tokens[3]), atoi(_tokens[4])); } -- cgit v1.2.3