From 0ede3208ddc30e31e752f6ba48e69ff2310cf448 Mon Sep 17 00:00:00 2001
From: Alyssa Milburn <fuzzie@fuzzie.org>
Date: Fri, 21 May 2010 18:21:10 +0200
Subject: [PATCH] add support for BRA's part command

---
 engines/parallaction/exec_br.cpp         |    2 +-
 engines/parallaction/parallaction.cpp    |    1 +
 engines/parallaction/parallaction.h      |    1 +
 engines/parallaction/parallaction_br.cpp |   21 +++++++++++++++++----
 4 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp
index 45e4827..aaad180 100644
--- a/engines/parallaction/exec_br.cpp
+++ b/engines/parallaction/exec_br.cpp
@@ -293,7 +293,7 @@ DECLARE_COMMAND_OPCODE(text) {
 
 
 DECLARE_COMMAND_OPCODE(part) {
-	warning("Parallaction_br::cmdOp_part not yet implemented");
+	_vm->_nextPart = ctxt._cmd->_counterValue;
 }
 
 
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index ce75253..964880e 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -116,6 +116,7 @@ Common::Error Parallaction::init() {
 	_location._followerStartPosition.y = -1000;
 	_location._followerStartFrame = 0;
 	_objects = 0;
+	_nextPart = -1;
 
 	_screenSize = _screenWidth * _screenHeight;
 
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 151bfd9..b5cc84d 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -323,6 +323,7 @@ public:
 	ZonePtr			_zoneTrap;
 	ZonePtr			_commentZone;
 	Common::String  _newLocationName;
+	int			_nextPart;
 
 protected:
 	void	runGame();
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index e0fd89c..a0a90dc 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -260,6 +260,8 @@ void Parallaction_br::cleanupGame() {
 	_globalFlagsNames = 0;
 	_objectsNames = 0;
 	_countersNames = 0;
+
+	memset(_zoneFlags, 0, sizeof(_zoneFlags));
 }
 
 
@@ -272,13 +274,23 @@ void Parallaction_br::changeLocation() {
 	strcpy(location, _newLocationName.c_str());
 
 	char *partStr = strrchr(location, '.');
-	if (partStr) {
+	if (partStr || _nextPart != -1) {
 		cleanupGame();
 
-		int n = partStr - location;
-		location[n] = '\0';
+		// more cleanup needed for part changes (see also saveload)
+		_globalFlags = 0;
+		cleanInventory(true);
+		strcpy(_characterName1, "null");
+
+		if (partStr) {
+			int n = partStr - location;
+			location[n] = '\0';
+
+			_part = atoi(++partStr);
+		} else {
+			_part = _nextPart;
+		}
 
-		_part = atoi(++partStr);
 		if (getFeatures() & GF_DEMO) {
 			assert(_part == 1);
 		} else {
@@ -358,6 +370,7 @@ void Parallaction_br::changeLocation() {
 
 	_engineFlags &= ~kEngineChangeLocation;
 	_newLocationName.clear();
+	_nextPart = -1;
 }
 
 // FIXME: Parallaction_br::parseLocation() is now a verbatim copy of the same routine from Parallaction_ns.
-- 
1.6.3.3

