[Scummvm-cvs-logs] scummvm master -> f2194d595dd50c9ee58a4543264392ff2208d7f7

wjp wjp at usecode.org
Thu Dec 24 20:32:00 CET 2015


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b614ccc2e8 LAB: Avoid manual memory management in Action lists
cd3ebf687c LAB: Avoid manual memory management of RuleList
1a1525a155 LAB: Avoid manual memory management of ViewData
0d97d1af82 LAB: Avoid manual memory management of CloseData
ad182f1f69 LAB: Make readAction consistent with the other read functions
f42d896d99 LAB: Fill mouse position field for keypresses
da2074146f LAB: Make tab behave more logically
f2194d595d Merge branch 'master' of github.com:scummvm/scummvm


Commit: b614ccc2e8eca8e8159c9772669ee45909abdd81
    https://github.com/scummvm/scummvm/commit/b614ccc2e8eca8e8159c9772669ee45909abdd81
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T17:42:40+01:00

Commit Message:
LAB: Avoid manual memory management in Action lists

Changed paths:
    engines/lab/console.cpp
    engines/lab/lab.h
    engines/lab/processroom.cpp
    engines/lab/processroom.h
    engines/lab/resource.cpp
    engines/lab/resource.h



diff --git a/engines/lab/console.cpp b/engines/lab/console.cpp
index 0a61679..936f91f 100644
--- a/engines/lab/console.cpp
+++ b/engines/lab/console.cpp
@@ -86,10 +86,9 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
 			debugPrintf(" (from %s to %s)", directions[rule->_param1], directions[rule->_param2]);
 		debugPrintf("\n");
 
-		while (rule->_actionList) {
-			Action *action = rule->_actionList;
+		Common::List<Action>::iterator action;
+		for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
 			debugPrintf("  - %s ('%s', %d, %d, %d)\n", actionTypes[action->_actionType], action->_messages[0].c_str(), action->_param1, action->_param2, action->_param3);
-			rule->_actionList = rule->_actionList->_nextAction;
 		}
 	}
 
@@ -111,15 +110,14 @@ bool Console::Cmd_FindAction(int argc, const char **argv) {
 		_vm->_resource->readViews(i);
 
 		for (RuleList::iterator rule = _vm->_rooms[i]._rules->begin(); rule != _vm->_rooms[i]._rules->end(); ++rule) {
-			while (rule->_actionList) {
-				if (rule->_actionList->_actionType == actionId &&
-					(rule->_actionList->_param1 == param1 || param1 == -1) &&
-					(rule->_actionList->_param2 == param2 || param2 == -1) &&
-					(rule->_actionList->_param3 == param3 || param3 == -1)) {
+			Common::List<Action>::iterator action;
+			for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
+				if (action->_actionType == actionId &&
+					(action->_param1 == param1 || param1 == -1) &&
+					(action->_param2 == param2 || param2 == -1) &&
+					(action->_param3 == param3 || param3 == -1)) {
 						debugPrintf("Found at script %d\n", i);
 				}
-
-				rule->_actionList = rule->_actionList->_nextAction;
 			}
 		}
 	}
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index 3741505..a8f5aa3 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -206,7 +206,7 @@ private:
 	/**
 	 * Checks whether all the conditions in a condition list are met.
 	 */
-	bool checkConditions(int16 *condition);
+	bool checkConditions(const Common::Array<int16> &cond);
 
 	/**
 	 * Decrements the current inventory number.
@@ -216,7 +216,7 @@ private:
 	/**
 	 * Processes the action list.
 	 */
-	void doActions(Action *actionList, CloseDataPtr *closePtrList);
+	void doActions(const Common::List<Action> &actionList, CloseDataPtr *closePtrList);
 
 	/**
 	 * Goes through the rules if an action is taken.
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index 312f153..b9de824 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -44,22 +44,12 @@ namespace Lab {
 
 #define NOFILE         "no file"
 
-bool LabEngine::checkConditions(int16 *condition) {
-	if (!condition)
-		return true;
-
-	if (condition[0] == 0)
-		return true;
-
-	int counter = 1;
-	bool res = _conditions->in(condition[0]);
+bool LabEngine::checkConditions(const Common::Array<int16> &condition) {
+	for (unsigned int i = 0; i < condition.size(); ++i)
+		if (!_conditions->in(condition[i]))
+			return false;
 
-	while (condition[counter] && res) {
-		res = _conditions->in(condition[counter]);
-		counter++;
-	}
-
-	return res;
+	return true;
 }
 
 ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
@@ -233,38 +223,39 @@ bool LabEngine::takeItem(Common::Point pos, CloseDataPtr *closePtrList) {
 	return false;
 }
 
-void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
-	while (actionList) {
+void LabEngine::doActions(const Common::List<Action> &actionList, CloseDataPtr *closePtrList) {
+	Common::List<Action>::const_iterator action;
+	for (action = actionList.begin(); action != actionList.end(); ++action) {
 		updateMusicAndEvents();
 
-		switch (actionList->_actionType) {
+		switch (action->_actionType) {
 		case kActionPlaySound:
 			_music->_loopSoundEffect = false;
-			_music->readMusic(actionList->_messages[0], true);
+			_music->readMusic(action->_messages[0], true);
 			break;
 
 		case kActionPlaySoundNoWait:
 			_music->_loopSoundEffect = false;
-			_music->readMusic(actionList->_messages[0], false);
+			_music->readMusic(action->_messages[0], false);
 			break;
 
 		case kActionPlaySoundLooping:
 			_music->_loopSoundEffect = true;
-			_music->readMusic(actionList->_messages[0], false);
+			_music->readMusic(action->_messages[0], false);
 			break;
 
 		case kActionShowDiff:
-			_graphics->readPict(actionList->_messages[0], true);
+			_graphics->readPict(action->_messages[0], true);
 			break;
 
 		case kActionShowDiffLooping:
-			_graphics->readPict(actionList->_messages[0], false);
+			_graphics->readPict(action->_messages[0], false);
 			break;
 
 		case kActionLoadDiff:
-			if (!actionList->_messages[0].empty())
+			if (!action->_messages[0].empty())
 				// Puts a file into memory
-				_graphics->loadPict(actionList->_messages[0]);
+				_graphics->loadPict(action->_messages[0]);
 
 			break;
 		
@@ -275,7 +266,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			error("Unused opcode kActionShowBitmap has been called");
 
 		case kActionTransition:
-			_graphics->doTransition((TransitionType)actionList->_param1, closePtrList, actionList->_messages[0].c_str());
+			_graphics->doTransition((TransitionType)action->_param1, closePtrList, action->_messages[0].c_str());
 			break;
 
 		case kActionNoUpdate:
@@ -298,48 +289,47 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			break;
 
 		case kActionSetElement:
-			_conditions->inclElement(actionList->_param1);
+			_conditions->inclElement(action->_param1);
 			break;
 
 		case kActionUnsetElement:
-			_conditions->exclElement(actionList->_param1);
+			_conditions->exclElement(action->_param1);
 			break;
 
 		case kActionShowMessage:
 			if (_graphics->_longWinInFront)
-				_graphics->longDrawMessage(actionList->_messages[0], true);
+				_graphics->longDrawMessage(action->_messages[0], true);
 			else
-				_graphics->drawMessage(actionList->_messages[0], true);
+				_graphics->drawMessage(action->_messages[0], true);
 			break;
 
 		case kActionCShowMessage:
 			if (!*closePtrList)
-				_graphics->drawMessage(actionList->_messages[0], true);
+				_graphics->drawMessage(action->_messages[0], true);
 			break;
 
 		case kActionShowMessages:
-			_graphics->drawMessage(actionList->_messages[_utils->getRandom(actionList->_param1)], true);
+			_graphics->drawMessage(action->_messages[_utils->getRandom(action->_param1)], true);
 			break;
 
 		case kActionChangeRoom:
-			if (actionList->_param1 & 0x8000) {
+			if (action->_param1 & 0x8000) {
 				// This is a Wyrmkeep Windows trial version, thus stop at this
 				// point, since we can't check for game payment status
 				_graphics->readPict(getPictName(closePtrList));
-				actionList = nullptr;
 				GUI::MessageDialog trialMessage("This is the end of the trial version. You can play the full game using the original interpreter from Wyrmkeep");
 				trialMessage.runModal();
-				continue;
+				break;
 			}
 
-			_roomNum   = actionList->_param1;
-			_direction = actionList->_param2 - 1;
+			_roomNum   = action->_param1;
+			_direction = action->_param2 - 1;
 			*closePtrList = nullptr;
 			_anim->_doBlack = true;
 			break;
 
 		case kActionSetCloseup: {
-			Common::Point curPos = Common::Point(_utils->scaleX(actionList->_param1), _utils->scaleY(actionList->_param2));
+			Common::Point curPos = Common::Point(_utils->scaleX(action->_param1), _utils->scaleY(action->_param2));
 				CloseDataPtr tmpClosePtr = getObject(curPos, *closePtrList);
 
 				if (tmpClosePtr)
@@ -352,17 +342,17 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			break;
 
 		case kActionSubInv:
-			if (_inventory[actionList->_param1]._quantity)
-				(_inventory[actionList->_param1]._quantity)--;
+			if (_inventory[action->_param1]._quantity)
+				(_inventory[action->_param1]._quantity)--;
 
-			if (_inventory[actionList->_param1]._quantity == 0)
-				_conditions->exclElement(actionList->_param1);
+			if (_inventory[action->_param1]._quantity == 0)
+				_conditions->exclElement(action->_param1);
 
 			break;
 
 		case kActionAddInv:
-			(_inventory[actionList->_param1]._quantity) += actionList->_param2;
-			_conditions->inclElement(actionList->_param1);
+			(_inventory[action->_param1]._quantity) += action->_param2;
+			_conditions->inclElement(action->_param1);
 			break;
 
 		case kActionShowDir:
@@ -370,7 +360,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			break;
 
 		case kActionWaitSecs: {
-				uint32 targetMillis = _system->getMillis() + actionList->_param1 * 1000;
+				uint32 targetMillis = _system->getMillis() + action->_param1 * 1000;
 
 				_graphics->screenUpdate();
 
@@ -390,7 +380,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			break;
 
 		case kActionChangeMusic:
-			_music->changeMusic(actionList->_messages[0]);
+			_music->changeMusic(action->_messages[0]);
 			_music->setMusicReset(false);
 			break;
 
@@ -439,13 +429,13 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 			break;
 
 		case kActionSpecialCmd:
-			if (actionList->_param1 == 0)
+			if (action->_param1 == 0)
 				_anim->_doBlack = true;
-			else if (actionList->_param1 == 1)
+			else if (action->_param1 == 1)
 				_anim->_doBlack = (_closeDataPtr == nullptr);
-			else if (actionList->_param1 == 2)
+			else if (action->_param1 == 2)
 				_anim->_doBlack = (_closeDataPtr != nullptr);
-			else if (actionList->_param1 == 5) {
+			else if (action->_param1 == 5) {
 				// inverse the palette
 				for (int idx = (8 * 3); idx < (255 * 3); idx++)
 					_anim->_diffPalette[idx] = 255 - _anim->_diffPalette[idx];
@@ -454,18 +444,18 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 				_graphics->setPalette(_anim->_diffPalette, 256);
 				waitTOF();
 				waitTOF();
-			} else if (actionList->_param1 == 4) {
+			} else if (action->_param1 == 4) {
 				// white the palette
 				_graphics->whiteScreen();
 				waitTOF();
 				waitTOF();
-			} else if (actionList->_param1 == 6) {
+			} else if (action->_param1 == 6) {
 				// Restore the palette
 				waitTOF();
 				_graphics->setPalette(_anim->_diffPalette, 256);
 				waitTOF();
 				waitTOF();
-			} else if (actionList->_param1 == 7) {
+			} else if (action->_param1 == 7) {
 				// Quick pause
 				waitTOF();
 				waitTOF();
@@ -474,8 +464,6 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
 
 			break;
 		}
-
-		actionList = actionList->_nextAction;
 	}
 
 	if (_music->_loopSoundEffect) {
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index f5201b1..c9f4fa9 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -148,7 +148,7 @@ struct CloseData {
 };
 
 struct ViewData {
-	int16 *_condition;
+	Common::Array<int16> _condition;
 	Common::String _graphicName;
 	ViewData *_nextCondition;
 	CloseDataPtr _closeUps;
@@ -159,16 +159,15 @@ struct Action {
 	int16 _param1;
 	int16 _param2;
 	int16 _param3;
-	Common::String *_messages;
-	Action *_nextAction;
+	Common::Array<Common::String> _messages;
 };
 
 struct Rule {
 	RuleType _ruleType;
 	int16 _param1;
 	int16 _param2;
-	int16 *_condition;
-	Action *_actionList;
+	Common::Array<int16> _condition;
+	Common::List<Action> _actionList;
 };
 
 struct RoomData {
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index d1c915f..a357203 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -162,7 +162,7 @@ void Resource::freeViews(uint16 roomNum) {
 	for (int i = 0; i < 4; i++)
 		freeView(_vm->_rooms[roomNum]._view[i]);
 
-	freeRule(_vm->_rooms[roomNum]._rules);
+	delete _vm->_rooms[roomNum]._rules;
 }
 
 Common::String Resource::translateFileName(const Common::String filename) {
@@ -242,16 +242,18 @@ Common::String Resource::readString(Common::File *file) {
 	return result;
 }
 
-int16 *Resource::readConditions(Common::File *file) {
-	int16 i = 0, cond;
-	int16 *list = new int16[25];
-	memset(list, 0, 25 * sizeof(int16));
+Common::Array<int16> Resource::readConditions(Common::File *file) {
+	int16 cond;
+	Common::Array<int16> list;
 
-	do {
-		cond = file->readUint16LE();
-		if (i < 25)
-			list[i++] = cond;
-	} while (cond);
+	while ((cond = file->readUint16LE()) != 0)
+		list.push_back(cond);
+
+	if (list.size() > 24) {
+		// The original only allocated 24 elements, and silently
+		// dropped remaining parts.
+		warning("More than 24 parts in condition");
+	}
 
 	return list;
 }
@@ -272,59 +274,28 @@ RuleList *Resource::readRule(Common::File *file) {
 	return rules;
 }
 
-void Resource::freeRule(RuleList *ruleList) {
-	if (!ruleList)
-		return;
-
-	for (RuleList::iterator rule = ruleList->begin(); rule != ruleList->end(); ++rule) {
-		freeAction(rule->_actionList);
-		delete[] rule->_condition;
-	}
-
-	delete ruleList;
-	ruleList = nullptr;
-}
-
-Action *Resource::readAction(Common::File *file) {
-	Action *action = nullptr;
-	Action *prev = nullptr;
-	Action *head = nullptr;
+Common::List<Action> Resource::readAction(Common::File *file) {
+	Common::List<Action> list;
 
 	while (file->readByte() == 1) {
-		action = new Action();
-		if (!head)
-			head = action;
-		if (prev)
-			prev->_nextAction = action;
-		action->_actionType = (ActionType)file->readSint16LE();
-		action->_param1 = file->readSint16LE();
-		action->_param2 = file->readSint16LE();
-		action->_param3 = file->readSint16LE();
-
-		if (action->_actionType == kActionShowMessages) {
-			action->_messages = new Common::String[action->_param1];
-
-			for (int i = 0; i < action->_param1; i++)
-				action->_messages[i] = readString(file);
+		list.push_back(Action());
+		Action &action = list.back();
+
+		action._actionType = (ActionType)file->readSint16LE();
+		action._param1 = file->readSint16LE();
+		action._param2 = file->readSint16LE();
+		action._param3 = file->readSint16LE();
+
+		if (action._actionType == kActionShowMessages) {
+			action._messages.reserve(action._param1);
+			for (int i = 0; i < action._param1; i++)
+				action._messages.push_back(readString(file));
 		} else {
-			action->_messages = new Common::String[1];
-			action->_messages[0] = readString(file);
+			action._messages.push_back(readString(file));
 		}
-
-		action->_nextAction = nullptr;
-		prev = action;
 	}
 
-	return head;
-}
-
-void Resource::freeAction(Action *action) {
-	while (action) {
-		Action *nextAction = action->_nextAction;
-		delete[] action->_messages;
-		delete action;
-		action = nextAction;
-	}
+	return list;
 }
 
 CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) {
@@ -387,7 +358,6 @@ ViewData *Resource::readView(Common::File *file) {
 void Resource::freeView(ViewData *view) {
 	while (view) {
 		ViewData *nextView = view->_nextCondition;
-		delete[] view->_condition;
 		freeCloseUps(view->_closeUps);
 		delete view;
 		view = nextView;
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index dcb7491..b869ac1 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -109,10 +109,9 @@ public:
 private:
 	LabEngine *_vm;
 	Common::String readString(Common::File *file);
-	int16 *readConditions(Common::File *file);
+	Common::Array<int16> readConditions(Common::File *file);
 	RuleList *readRule(Common::File *file);
-	void freeRule(RuleList *ruleList);
-	Action *readAction(Common::File *file);
+	Common::List<Action> readAction(Common::File *file);
 	void freeAction(Action *action);
 	CloseData *readCloseUps(uint16 depth, Common::File *file);
 	void freeCloseUps(CloseData *closeUps);


Commit: cd3ebf687c0e783147723095056d72684eddd347
    https://github.com/scummvm/scummvm/commit/cd3ebf687c0e783147723095056d72684eddd347
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Avoid manual memory management of RuleList

Changed paths:
    engines/lab/console.cpp
    engines/lab/processroom.cpp
    engines/lab/processroom.h
    engines/lab/resource.cpp
    engines/lab/resource.h



diff --git a/engines/lab/console.cpp b/engines/lab/console.cpp
index 936f91f..31b52da 100644
--- a/engines/lab/console.cpp
+++ b/engines/lab/console.cpp
@@ -60,7 +60,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
 	int scene = atoi(argv[1]);
 	_vm->_resource->readViews(scene);
 	RoomData *roomData = &_vm->_rooms[scene];
-	RuleList *rules = roomData->_rules;
+	RuleList &rules = roomData->_rules;
 	const char *transitions[] = { "None", "Wipe", "ScrollWipe", "ScrollBlack", "ScrollBounce", "Transporter", "ReadFirstFrame", "ReadNextFrame" };
 	const char *ruleTypes[] = { "None", "Action", "Operate", "Go forward", "Conditions", "Turn", "Go main view", "Turn from to" };
 	const char *directions[] = { "", "North", "South", "East", "West" };
@@ -76,7 +76,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
 
 	debugPrintf("Script:\n");
 
-	for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+	for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
 		debugPrintf("Rule type: %s", ruleTypes[rule->_ruleType]);
 		if (rule->_ruleType == kRuleTypeAction || rule->_ruleType == kRuleTypeOperate)
 			debugPrintf(" (item %d, closeup %d)", rule->_param1, rule->_param2);
@@ -109,7 +109,7 @@ bool Console::Cmd_FindAction(int argc, const char **argv) {
 	for (int i = 1; i <= _vm->_manyRooms; i++) {
 		_vm->_resource->readViews(i);
 
-		for (RuleList::iterator rule = _vm->_rooms[i]._rules->begin(); rule != _vm->_rooms[i]._rules->end(); ++rule) {
+		for (RuleList::iterator rule = _vm->_rooms[i]._rules.begin(); rule != _vm->_rooms[i]._rules.end(); ++rule) {
 			Common::List<Action>::iterator action;
 			for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
 				if (action->_actionType == actionId &&
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index b9de824..e49d2ac 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -482,11 +482,11 @@ bool LabEngine::doActionRuleSub(int16 action, int16 roomNum, CloseDataPtr closeP
 	action++;
 
 	if (closePtr) {
-		RuleList *rules = _rooms[_roomNum]._rules;
+		RuleList *rules = &(_rooms[_roomNum]._rules);
 
 		if (!rules && (roomNum == 0)) {
 			_resource->readViews(roomNum);
-			rules = _rooms[roomNum]._rules;
+			rules = &(_rooms[roomNum]._rules);
 		}
 
 		for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
@@ -530,11 +530,11 @@ bool LabEngine::doActionRule(Common::Point pos, int16 action, int16 roomNum, Clo
 bool LabEngine::doOperateRuleSub(int16 itemNum, int16 roomNum, CloseDataPtr closePtr, CloseDataPtr *setCloseList, bool allowDefaults) {
 	if (closePtr)
 		if (closePtr->_closeUpType > 0) {
-			RuleList *rules = _rooms[roomNum]._rules;
+			RuleList *rules = &(_rooms[roomNum]._rules);
 
 			if (!rules && (roomNum == 0)) {
 				_resource->readViews(roomNum);
-				rules = _rooms[roomNum]._rules;
+				rules = &(_rooms[roomNum]._rules);
 			}
 
 			for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
@@ -581,9 +581,9 @@ bool LabEngine::doOperateRule(Common::Point pos, int16 ItemNum, CloseDataPtr *cl
 }
 
 bool LabEngine::doGoForward(CloseDataPtr *closePtrList) {
-	RuleList *rules = _rooms[_roomNum]._rules;
+	RuleList &rules = _rooms[_roomNum]._rules;
 
-	for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+	for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
 		if ((rule->_ruleType == kRuleTypeGoForward) && (rule->_param1 == (_direction + 1))) {
 			if (checkConditions(rule->_condition)) {
 				doActions(rule->_actionList, closePtrList);
@@ -599,9 +599,9 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
 	from++;
 	to++;
 
-	RuleList *rules = _rooms[_roomNum]._rules;
+	RuleList &rules = _rooms[_roomNum]._rules;
 
-	for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+	for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
 		if ((rule->_ruleType == kRuleTypeTurn) ||
 			  ((rule->_ruleType == kRuleTypeTurnFromTo) &&
 			  (rule->_param1 == from) && (rule->_param2 == to))) {
@@ -616,8 +616,8 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
 }
 
 bool LabEngine::doMainView(CloseDataPtr *closePtrList) {
-	RuleList *rules = _rooms[_roomNum]._rules;
-	for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+	RuleList &rules = _rooms[_roomNum]._rules;
+	for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
 		if (rule->_ruleType == kRuleTypeGoMainView) {
 			if (checkConditions(rule->_condition)) {
 				doActions(rule->_actionList, closePtrList);
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index c9f4fa9..0cfe98f 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -174,7 +174,7 @@ struct RoomData {
 	uint16 _doors[4];
 	byte _transitionType;
 	ViewData *_view[4];
-	RuleList *_rules;
+	RuleList _rules;
 	Common::String _roomMsg;
 };
 
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index a357203..bd86cd3 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -100,7 +100,6 @@ void Resource::readRoomData(const Common::String fileName) {
 	_vm->_manyRooms = dataFile->readUint16LE();
 	_vm->_highestCondition = dataFile->readUint16LE();
 	_vm->_rooms = new RoomData[_vm->_manyRooms + 1];
-	memset(_vm->_rooms, 0, (_vm->_manyRooms + 1) * sizeof(RoomData));
 
 	for (int i = 1; i <= _vm->_manyRooms; i++) {
 		RoomData *curRoom = &_vm->_rooms[i];
@@ -114,8 +113,6 @@ void Resource::readRoomData(const Common::String fileName) {
 		curRoom->_view[kDirectionSouth] = nullptr;
 		curRoom->_view[kDirectionEast] = nullptr;
 		curRoom->_view[kDirectionWest] = nullptr;
-		curRoom->_rules = nullptr;
-		curRoom->_roomMsg = "";
 	}
 
 	delete dataFile;
@@ -149,7 +146,7 @@ void Resource::readViews(uint16 roomNum) {
 	curRoom->_view[kDirectionSouth] = readView(dataFile);
 	curRoom->_view[kDirectionEast] = readView(dataFile);
 	curRoom->_view[kDirectionWest] = readView(dataFile);
-	curRoom->_rules = readRule(dataFile);
+	readRule(dataFile, curRoom->_rules);
 
 	_vm->updateMusicAndEvents();
 	delete dataFile;
@@ -161,8 +158,6 @@ void Resource::freeViews(uint16 roomNum) {
 
 	for (int i = 0; i < 4; i++)
 		freeView(_vm->_rooms[roomNum]._view[i]);
-
-	delete _vm->_rooms[roomNum]._rules;
 }
 
 Common::String Resource::translateFileName(const Common::String filename) {
@@ -258,9 +253,8 @@ Common::Array<int16> Resource::readConditions(Common::File *file) {
 	return list;
 }
 
-RuleList *Resource::readRule(Common::File *file) {
-	RuleList *rules = new RuleList();
-
+void Resource::readRule(Common::File *file, RuleList &rules) {
+	rules.clear();
 	while (file->readByte() == 1) {
 		Rule rule;
 		rule._ruleType = (RuleType)file->readSint16LE();
@@ -268,10 +262,8 @@ RuleList *Resource::readRule(Common::File *file) {
 		rule._param2 = file->readSint16LE();
 		rule._condition = readConditions(file);
 		rule._actionList = readAction(file);
-		rules->push_back(rule);
+		rules.push_back(rule);
 	}
-
-	return rules;
 }
 
 Common::List<Action> Resource::readAction(Common::File *file) {
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index b869ac1..d3ed363 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -110,7 +110,7 @@ private:
 	LabEngine *_vm;
 	Common::String readString(Common::File *file);
 	Common::Array<int16> readConditions(Common::File *file);
-	RuleList *readRule(Common::File *file);
+	void readRule(Common::File *file, RuleList &rules);
 	Common::List<Action> readAction(Common::File *file);
 	void freeAction(Action *action);
 	CloseData *readCloseUps(uint16 depth, Common::File *file);


Commit: 1a1525a15501072da93ec0a7c1ef356886bd13a8
    https://github.com/scummvm/scummvm/commit/1a1525a15501072da93ec0a7c1ef356886bd13a8
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Avoid manual memory management of ViewData

Changed paths:
    engines/lab/processroom.cpp
    engines/lab/processroom.h
    engines/lab/resource.cpp
    engines/lab/resource.h



diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index e49d2ac..daf4f3b 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -56,16 +56,16 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
 	if (_rooms[roomNum]._roomMsg.empty())
 		_resource->readViews(roomNum);
 
-	ViewData *view = _rooms[roomNum]._view[direction];
+	Common::List<ViewData> &views = _rooms[roomNum]._view[direction];
 
-	do {
-		if (checkConditions(view->_condition))
-			break;
+	Common::List<ViewData>::iterator view;
 
-		view = view->_nextCondition;
-	} while (true);
+	for (view = views.begin(); view != views.end(); ++view) {
+		if (checkConditions(view->_condition))
+			return &(*view);
+	}
 
-	return view;
+	error("No view with matching condition found");
 }
 
 CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index 0cfe98f..88dd544 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -150,7 +150,6 @@ struct CloseData {
 struct ViewData {
 	Common::Array<int16> _condition;
 	Common::String _graphicName;
-	ViewData *_nextCondition;
 	CloseDataPtr _closeUps;
 };
 
@@ -173,7 +172,7 @@ struct Rule {
 struct RoomData {
 	uint16 _doors[4];
 	byte _transitionType;
-	ViewData *_view[4];
+	Common::List<ViewData> _view[4];
 	RuleList _rules;
 	Common::String _roomMsg;
 };
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index bd86cd3..5de2df8 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -108,11 +108,6 @@ void Resource::readRoomData(const Common::String fileName) {
 		curRoom->_doors[kDirectionEast] = dataFile->readUint16LE();
 		curRoom->_doors[kDirectionWest] = dataFile->readUint16LE();
 		curRoom->_transitionType = dataFile->readByte();
-
-		curRoom->_view[kDirectionNorth] = nullptr;
-		curRoom->_view[kDirectionSouth] = nullptr;
-		curRoom->_view[kDirectionEast] = nullptr;
-		curRoom->_view[kDirectionWest] = nullptr;
 	}
 
 	delete dataFile;
@@ -142,10 +137,10 @@ void Resource::readViews(uint16 roomNum) {
 	RoomData *curRoom = &_vm->_rooms[roomNum];
 
 	curRoom->_roomMsg = readString(dataFile);
-	curRoom->_view[kDirectionNorth] = readView(dataFile);
-	curRoom->_view[kDirectionSouth] = readView(dataFile);
-	curRoom->_view[kDirectionEast] = readView(dataFile);
-	curRoom->_view[kDirectionWest] = readView(dataFile);
+	readView(dataFile, curRoom->_view[kDirectionNorth]);
+	readView(dataFile, curRoom->_view[kDirectionSouth]);
+	readView(dataFile, curRoom->_view[kDirectionEast]);
+	readView(dataFile, curRoom->_view[kDirectionWest]);
 	readRule(dataFile, curRoom->_rules);
 
 	_vm->updateMusicAndEvents();
@@ -326,34 +321,22 @@ void Resource::freeCloseUps(CloseData *closeUps) {
 	}
 }
 
-ViewData *Resource::readView(Common::File *file) {
-	ViewData *view = nullptr;
-	ViewData *prev = nullptr;
-	ViewData *head = nullptr;
-
+void Resource::readView(Common::File *file, Common::List<ViewData> &list) {
+	list.clear();
 	while (file->readByte() == 1) {
-		view = new ViewData();
-		if (!head)
-			head = view;
-		if (prev)
-			prev->_nextCondition = view;
-		view->_condition = readConditions(file);
-		view->_graphicName = readString(file);
-		view->_closeUps = readCloseUps(0, file);
-		view->_nextCondition = nullptr;
-		prev = view;
-	}
+		list.push_back(ViewData());
+		ViewData &view = list.back();
 
-	return head;
+		view._condition = readConditions(file);
+		view._graphicName = readString(file);
+		view._closeUps = readCloseUps(0, file);
+	}
 }
 
-void Resource::freeView(ViewData *view) {
-	while (view) {
-		ViewData *nextView = view->_nextCondition;
-		freeCloseUps(view->_closeUps);
-		delete view;
-		view = nextView;
-	}
+void Resource::freeView(Common::List<ViewData> &view) {
+	Common::List<ViewData>::iterator i;
+	for (i = view.begin(); i != view.end(); ++i)
+		freeCloseUps(i->_closeUps);
 }
 
 } // End of namespace Lab
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index d3ed363..39672d1 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -115,8 +115,8 @@ private:
 	void freeAction(Action *action);
 	CloseData *readCloseUps(uint16 depth, Common::File *file);
 	void freeCloseUps(CloseData *closeUps);
-	ViewData *readView(Common::File *file);
-	void freeView(ViewData *view);
+	void readView(Common::File *file, Common::List<ViewData> &view);
+	void freeView(Common::List<ViewData> &view);
 	void readStaticText();
 	Common::String translateFileName(const Common::String filename);
 


Commit: 0d97d1af820a55ab62ce259113f9ba1305f76c9f
    https://github.com/scummvm/scummvm/commit/0d97d1af820a55ab62ce259113f9ba1305f76c9f
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Avoid manual memory management of CloseData

Changed paths:
    engines/lab/engine.cpp
    engines/lab/lab.cpp
    engines/lab/lab.h
    engines/lab/processroom.cpp
    engines/lab/processroom.h
    engines/lab/resource.cpp
    engines/lab/resource.h



diff --git a/engines/lab/engine.cpp b/engines/lab/engine.cpp
index 8d859bc..d2333f8 100644
--- a/engines/lab/engine.cpp
+++ b/engines/lab/engine.cpp
@@ -568,7 +568,6 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
 
 	uint16 oldDirection = 0;
 	uint16 lastInv = kItemMap;
-	CloseDataPtr wrkClosePtr = nullptr;
 	bool leftButtonClick = false;
 	bool rightButtonClick = false;
 
@@ -640,29 +639,24 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
 		mayShowCrumbIndicator();
 		_graphics->screenUpdate();
 	} else if (msgClass == kMessageDeltaMove) {
-		ViewData *vptr = getViewData(_roomNum, _direction);
-		CloseDataPtr oldClosePtr = vptr->_closeUps;
 		CloseDataPtr tmpClosePtr = _closeDataPtr;
-		setCurrentClose(curPos, &tmpClosePtr, true);
-
-		if (!tmpClosePtr || (tmpClosePtr == _closeDataPtr)) {
-			if (!_closeDataPtr)
-				wrkClosePtr = oldClosePtr;
-			else
-				wrkClosePtr = _closeDataPtr->_subCloseUps;
-		} else
-			wrkClosePtr = tmpClosePtr->_nextCloseUp;
 
+		// get next close-up in list after the one pointed to by curPos
+		setCurrentClose(curPos, &tmpClosePtr, true, true);
 
-		if (!wrkClosePtr) {
-			if (!_closeDataPtr)
-				wrkClosePtr = oldClosePtr;
-			else
-				wrkClosePtr = _closeDataPtr->_subCloseUps;
+		if (tmpClosePtr == _closeDataPtr) {
+			tmpClosePtr = nullptr;
+			if (!_closeDataPtr) {
+				ViewData *vptr = getViewData(_roomNum, _direction);
+				if (!vptr->_closeUps.empty())
+					tmpClosePtr = &(*vptr->_closeUps.begin());
+			} else {
+				if (!_closeDataPtr->_subCloseUps.empty())
+					tmpClosePtr = &(*_closeDataPtr->_subCloseUps.begin());
+			}
 		}
-
-		if (wrkClosePtr)
-			_event->setMousePos(Common::Point(_utils->scaleX((wrkClosePtr->_x1 + wrkClosePtr->_x2) / 2), _utils->scaleY((wrkClosePtr->_y1 + wrkClosePtr->_y2) / 2)));
+		if (tmpClosePtr)
+			_event->setMousePos(Common::Point(_utils->scaleX((tmpClosePtr->_x1 + tmpClosePtr->_x2) / 2), _utils->scaleY((tmpClosePtr->_y1 + tmpClosePtr->_y2) / 2)));
 	}
 
 	return true;
diff --git a/engines/lab/lab.cpp b/engines/lab/lab.cpp
index d21dc66..e942617 100644
--- a/engines/lab/lab.cpp
+++ b/engines/lab/lab.cpp
@@ -141,8 +141,6 @@ LabEngine::~LabEngine() {
 	DebugMan.clearAllDebugChannels();
 
 	freeMapData();
-	for (int i = 1; i <= _manyRooms; i++)
-		_resource->freeViews(i);
 	delete[] _rooms;
 	delete[] _inventory;
 
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index a8f5aa3..76397b9 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -336,7 +336,7 @@ private:
 	 * some of the closeups have the same hit boxes, then this returns the first
 	 * occurrence of the object with the same hit box.
 	 */
-	CloseDataPtr findClosePtrMatch(CloseDataPtr closePtr, CloseDataPtr closePtrList);
+	CloseDataPtr findClosePtrMatch(CloseDataPtr closePtr, Common::List<CloseData> &list);
 
 	/**
 	 * Checks if a floor has been visited.
@@ -441,7 +441,7 @@ private:
 	/**
 	 * Sets the current close up data.
 	 */
-	void setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords);
+	void setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords, bool next=false);
 
 	/**
 	 * Takes the currently selected item.
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index daf4f3b..ec07add 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -69,39 +69,37 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
 }
 
 CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
-	CloseDataPtr wrkClosePtr;
+	Common::List<CloseData> *list;
 	if (!closePtr)
-		wrkClosePtr = getViewData(_roomNum, _direction)->_closeUps;
+		list = &(getViewData(_roomNum, _direction)->_closeUps);
 	else
-		wrkClosePtr = closePtr->_subCloseUps;
+		list = &(closePtr->_subCloseUps);
 
-	Common::Rect objRect;
-	while (wrkClosePtr) {
+	Common::List<CloseData>::iterator wrkClosePtr;
+	for (wrkClosePtr = list->begin(); wrkClosePtr != list->end(); ++wrkClosePtr) {
+		Common::Rect objRect;
 		objRect = _utils->rectScale(wrkClosePtr->_x1, wrkClosePtr->_y1, wrkClosePtr->_x2, wrkClosePtr->_y2);
 		if (objRect.contains(pos))
-			return wrkClosePtr;
-
-		wrkClosePtr = wrkClosePtr->_nextCloseUp;
+			return &(*wrkClosePtr);
 	}
 
 	return nullptr;
 }
 
-CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, CloseDataPtr closePtrList) {
-	CloseDataPtr resClosePtr;
+CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, Common::List<CloseData> &list) {
+	Common::List<CloseData>::iterator i;
 
-	while (closePtrList) {
-		if ((closePtr->_x1 == closePtrList->_x1) && (closePtr->_x2 == closePtrList->_x2) &&
-			  (closePtr->_y1 == closePtrList->_y1) && (closePtr->_y2 == closePtrList->_y2) &&
-			  (closePtr->_depth == closePtrList->_depth))
-			return closePtrList;
+	for (i = list.begin(); i != list.end(); ++i) {
+		if ((closePtr->_x1 == i->_x1) && (closePtr->_x2 == i->_x2) &&
+			  (closePtr->_y1 == i->_y1) && (closePtr->_y2 == i->_y2) &&
+			  (closePtr->_depth == i->_depth))
+			return &(*i);
 
-		resClosePtr = findClosePtrMatch(closePtr, closePtrList->_subCloseUps);
+		CloseDataPtr resClosePtr;
+		resClosePtr = findClosePtrMatch(closePtr, i->_subCloseUps);
 
 		if (resClosePtr)
 			return resClosePtr;
-		else
-			closePtrList = closePtrList->_nextCloseUp;
 	}
 
 	return nullptr;
@@ -174,50 +172,56 @@ uint16 LabEngine::processArrow(uint16 curDirection, uint16 arrow) {
 	return curDirection;
 }
 
-void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords) {
-	CloseDataPtr closePtr;
+void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords, bool next) {
+
+	Common::List<CloseData> *list;
 
 	if (!*closePtrList)
-		closePtr = getViewData(_roomNum, _direction)->_closeUps;
+		list = &(getViewData(_roomNum, _direction)->_closeUps);
 	else
-		closePtr = (*closePtrList)->_subCloseUps;
+		list = &((*closePtrList)->_subCloseUps);
 
-	Common::Rect target;
-	while (closePtr) {
+	Common::List<CloseData>::iterator closePtr;
+	for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+		Common::Rect target;
 		if (!useAbsoluteCoords)
 			target = Common::Rect(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
 		else
 			target = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
 
 		if (target.contains(pos) && !closePtr->_graphicName.empty()) {
-			*closePtrList = closePtr;
+
+			if (next) {
+				// cycle to the next one
+				++closePtr;
+				if (closePtr == list->end())
+					closePtr = list->begin();
+			}
+			*closePtrList = &(*closePtr);
+
 			return;
 		}
-
-		closePtr = closePtr->_nextCloseUp;
 	}
 }
 
 bool LabEngine::takeItem(Common::Point pos, CloseDataPtr *closePtrList) {
-	CloseDataPtr closePtr;
-
+	Common::List<CloseData> *list;
 	if (!*closePtrList) {
-		closePtr = getViewData(_roomNum, _direction)->_closeUps;
+		list = &(getViewData(_roomNum, _direction)->_closeUps);
 	} else if ((*closePtrList)->_closeUpType < 0) {
 		_conditions->inclElement(abs((*closePtrList)->_closeUpType));
 		return true;
 	} else
-		closePtr = (*closePtrList)->_subCloseUps;
+		list = &((*closePtrList)->_subCloseUps);
 
-	Common::Rect objRect;
-	while (closePtr) {
+	Common::List<CloseData>::iterator closePtr;
+	for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+		Common::Rect objRect;
 		objRect = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
 		if (objRect.contains(pos) && (closePtr->_closeUpType < 0)) {
 			_conditions->inclElement(abs(closePtr->_closeUpType));
 			return true;
 		}
-
-		closePtr = closePtr->_nextCloseUp;
 	}
 
 	return false;
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index 88dd544..5051588 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -143,14 +143,13 @@ struct CloseData {
 	uint16 _depth;               // Level of the closeup.
 	Common::String _graphicName;
 	Common::String _message;
-	CloseData *_nextCloseUp;
-	CloseData *_subCloseUps;
+	Common::List<CloseData> _subCloseUps;
 };
 
 struct ViewData {
 	Common::Array<int16> _condition;
 	Common::String _graphicName;
-	CloseDataPtr _closeUps;
+	Common::List<CloseData> _closeUps;
 };
 
 struct Action {
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index 5de2df8..b2258ba 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -133,7 +133,6 @@ void Resource::readViews(uint16 roomNum) {
 	Common::String fileName = "LAB:Rooms/" + Common::String::format("%d", roomNum);
 	Common::File *dataFile = openDataFile(fileName, MKTAG('R', 'O', 'M', '4'));
 
-	freeViews(roomNum);
 	RoomData *curRoom = &_vm->_rooms[roomNum];
 
 	curRoom->_roomMsg = readString(dataFile);
@@ -147,14 +146,6 @@ void Resource::readViews(uint16 roomNum) {
 	delete dataFile;
 }
 
-void Resource::freeViews(uint16 roomNum) {
-	if (!_vm->_rooms)
-		return;
-
-	for (int i = 0; i < 4; i++)
-		freeView(_vm->_rooms[roomNum]._view[i]);
-}
-
 Common::String Resource::translateFileName(const Common::String filename) {
 	Common::String upperFilename = filename;
 	upperFilename.toUppercase();
@@ -285,39 +276,21 @@ Common::List<Action> Resource::readAction(Common::File *file) {
 	return list;
 }
 
-CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) {
-	CloseData *closeup = nullptr;
-	CloseData *prev = nullptr;
-	CloseData *head = nullptr;
-
+void Resource::readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &list) {
+	list.clear();
 	while (file->readByte() != '\0') {
-		closeup = new CloseData();
-		if (!head)
-			head = closeup;
-		if (prev)
-			prev->_nextCloseUp = closeup;
-		closeup->_x1 = file->readUint16LE();
-		closeup->_y1 = file->readUint16LE();
-		closeup->_x2 = file->readUint16LE();
-		closeup->_y2 = file->readUint16LE();
-		closeup->_closeUpType = file->readSint16LE();
-		closeup->_depth = depth;
-		closeup->_graphicName = readString(file);
-		closeup->_message = readString(file);
-		closeup->_subCloseUps = readCloseUps(depth + 1, file);
-		closeup->_nextCloseUp = nullptr;
-		prev = closeup;
-	}
-
-	return head;
-}
-
-void Resource::freeCloseUps(CloseData *closeUps) {
-	while (closeUps) {
-		CloseData *nextCloseUp = closeUps->_nextCloseUp;
-		freeCloseUps(closeUps->_subCloseUps);
-		delete closeUps;
-		closeUps = nextCloseUp;
+		list.push_back(CloseData());
+		CloseData &closeup = list.back();
+
+		closeup._x1 = file->readUint16LE();
+		closeup._y1 = file->readUint16LE();
+		closeup._x2 = file->readUint16LE();
+		closeup._y2 = file->readUint16LE();
+		closeup._closeUpType = file->readSint16LE();
+		closeup._depth = depth;
+		closeup._graphicName = readString(file);
+		closeup._message = readString(file);
+		readCloseUps(depth + 1, file, closeup._subCloseUps);
 	}
 }
 
@@ -329,14 +302,8 @@ void Resource::readView(Common::File *file, Common::List<ViewData> &list) {
 
 		view._condition = readConditions(file);
 		view._graphicName = readString(file);
-		view._closeUps = readCloseUps(0, file);
+		readCloseUps(0, file, view._closeUps);
 	}
 }
 
-void Resource::freeView(Common::List<ViewData> &view) {
-	Common::List<ViewData>::iterator i;
-	for (i = view.begin(); i != view.end(); ++i)
-		freeCloseUps(i->_closeUps);
-}
-
 } // End of namespace Lab
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index 39672d1..a573258 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -101,7 +101,6 @@ public:
 	void readRoomData(const Common::String fileName);
 	InventoryData *readInventory(const Common::String fileName);
 	void readViews(uint16 roomNum);
-	void freeViews(uint16 roomNum);
 	TextFont *getFont(const Common::String fileName);
 	Common::String getText(const Common::String fileName);
 	Common::String getStaticText(byte index) const { return _staticText[index]; }
@@ -112,11 +111,8 @@ private:
 	Common::Array<int16> readConditions(Common::File *file);
 	void readRule(Common::File *file, RuleList &rules);
 	Common::List<Action> readAction(Common::File *file);
-	void freeAction(Action *action);
-	CloseData *readCloseUps(uint16 depth, Common::File *file);
-	void freeCloseUps(CloseData *closeUps);
+	void readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &close);
 	void readView(Common::File *file, Common::List<ViewData> &view);
-	void freeView(Common::List<ViewData> &view);
 	void readStaticText();
 	Common::String translateFileName(const Common::String filename);
 


Commit: ad182f1f697e185221975479838fad4f8fefba9c
    https://github.com/scummvm/scummvm/commit/ad182f1f697e185221975479838fad4f8fefba9c
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Make readAction consistent with the other read functions

Changed paths:
    engines/lab/resource.cpp
    engines/lab/resource.h



diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index b2258ba..985a71b 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -242,18 +242,19 @@ Common::Array<int16> Resource::readConditions(Common::File *file) {
 void Resource::readRule(Common::File *file, RuleList &rules) {
 	rules.clear();
 	while (file->readByte() == 1) {
-		Rule rule;
+		rules.push_back(Rule());
+		Rule &rule = rules.back();
+
 		rule._ruleType = (RuleType)file->readSint16LE();
 		rule._param1 = file->readSint16LE();
 		rule._param2 = file->readSint16LE();
 		rule._condition = readConditions(file);
-		rule._actionList = readAction(file);
-		rules.push_back(rule);
+		readAction(file, rule._actionList);
 	}
 }
 
-Common::List<Action> Resource::readAction(Common::File *file) {
-	Common::List<Action> list;
+void Resource::readAction(Common::File *file, Common::List<Action>& list) {
+	list.clear();
 
 	while (file->readByte() == 1) {
 		list.push_back(Action());
@@ -272,8 +273,6 @@ Common::List<Action> Resource::readAction(Common::File *file) {
 			action._messages.push_back(readString(file));
 		}
 	}
-
-	return list;
 }
 
 void Resource::readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &list) {
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index a573258..7a7cfb4 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -110,7 +110,7 @@ private:
 	Common::String readString(Common::File *file);
 	Common::Array<int16> readConditions(Common::File *file);
 	void readRule(Common::File *file, RuleList &rules);
-	Common::List<Action> readAction(Common::File *file);
+	void readAction(Common::File *file, Common::List<Action> &action);
 	void readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &close);
 	void readView(Common::File *file, Common::List<ViewData> &view);
 	void readStaticText();


Commit: f42d896d99c81a566d1f6d0c8ceb87f0b4b23855
    https://github.com/scummvm/scummvm/commit/f42d896d99c81a566d1f6d0c8ceb87f0b4b23855
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Fill mouse position field for keypresses

This makes the tab key recognize the current mouse position

Changed paths:
    engines/lab/interface.cpp



diff --git a/engines/lab/interface.cpp b/engines/lab/interface.cpp
index 0d03d21..60b3236 100644
--- a/engines/lab/interface.cpp
+++ b/engines/lab/interface.cpp
@@ -137,6 +137,7 @@ IntuiMessage *EventManager::getMsg() {
 		return &message;
 	} else if (keyPress(&curKey)) {
 		message._code = curKey;
+		message._mouse = _mousePos;
 		Button *curButton = checkNumButtonHit(_screenButtonList, message._code);
 
 		if (curButton) {


Commit: da2074146f8189ae1379b2ac51948de447ed0c05
    https://github.com/scummvm/scummvm/commit/da2074146f8189ae1379b2ac51948de447ed0c05
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00

Commit Message:
LAB: Make tab behave more logically

When skipping to the next closeup, it seems to make little sense to
check the _graphicName of the current one.

Changed paths:
    engines/lab/processroom.cpp



diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index ec07add..c096c75 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -189,7 +189,7 @@ void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, b
 		else
 			target = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
 
-		if (target.contains(pos) && !closePtr->_graphicName.empty()) {
+		if (target.contains(pos) && (next || !closePtr->_graphicName.empty())) {
 
 			if (next) {
 				// cycle to the next one


Commit: f2194d595dd50c9ee58a4543264392ff2208d7f7
    https://github.com/scummvm/scummvm/commit/f2194d595dd50c9ee58a4543264392ff2208d7f7
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:29:58+01:00

Commit Message:
Merge branch 'master' of github.com:scummvm/scummvm

Changed paths:
    engines/lab/dispman.cpp
    engines/lab/dispman.h
    engines/lab/engine.cpp
    engines/lab/eventman.cpp
    engines/lab/eventman.h
    engines/lab/interface.cpp
    engines/lab/intro.cpp
    engines/lab/lab.h
    engines/lab/map.cpp
    engines/lab/special.cpp



diff --cc engines/lab/engine.cpp
index d2333f8,6b06f3b..a01df7e
--- a/engines/lab/engine.cpp
+++ b/engines/lab/engine.cpp
@@@ -638,25 -611,30 +610,25 @@@ bool LabEngine::fromCrumbs(uint32 tmpCl
  
  		mayShowCrumbIndicator();
  		_graphics->screenUpdate();
- 	} else if (msgClass == kMessageDeltaMove) {
+ 	} else if (msgClass == kMessageMoveCursorToCloseup) {
 -		ViewData *vptr = getViewData(_roomNum, _direction);
 -		CloseDataPtr oldClosePtr = vptr->_closeUps;
  		CloseDataPtr tmpClosePtr = _closeDataPtr;
 -		setCurrentClose(curPos, &tmpClosePtr, true);
  
 -		if (!tmpClosePtr || (tmpClosePtr == _closeDataPtr)) {
 -			if (!_closeDataPtr)
 -				wrkClosePtr = oldClosePtr;
 -			else
 -				wrkClosePtr = _closeDataPtr->_subCloseUps;
 -		} else
 -			wrkClosePtr = tmpClosePtr->_nextCloseUp;
 -
 -
 -		if (!wrkClosePtr) {
 -			if (!_closeDataPtr)
 -				wrkClosePtr = oldClosePtr;
 -			else
 -				wrkClosePtr = _closeDataPtr->_subCloseUps;
 +		// get next close-up in list after the one pointed to by curPos
 +		setCurrentClose(curPos, &tmpClosePtr, true, true);
 +
 +		if (tmpClosePtr == _closeDataPtr) {
 +			tmpClosePtr = nullptr;
 +			if (!_closeDataPtr) {
 +				ViewData *vptr = getViewData(_roomNum, _direction);
 +				if (!vptr->_closeUps.empty())
 +					tmpClosePtr = &(*vptr->_closeUps.begin());
 +			} else {
 +				if (!_closeDataPtr->_subCloseUps.empty())
 +					tmpClosePtr = &(*_closeDataPtr->_subCloseUps.begin());
 +			}
  		}
 -
 -		if (wrkClosePtr)
 -			_event->setMousePos(Common::Point(_utils->scaleX((wrkClosePtr->_x1 + wrkClosePtr->_x2) / 2), _utils->scaleY((wrkClosePtr->_y1 + wrkClosePtr->_y2) / 2)));
 +		if (tmpClosePtr)
 +			_event->setMousePos(Common::Point(_utils->scaleX((tmpClosePtr->_x1 + tmpClosePtr->_x2) / 2), _utils->scaleY((tmpClosePtr->_y1 + tmpClosePtr->_y2) / 2)));
  	}
  
  	return true;
diff --cc engines/lab/interface.cpp
index 60b3236,85d5897..507e0b2
--- a/engines/lab/interface.cpp
+++ b/engines/lab/interface.cpp
@@@ -143,10 -141,15 +141,16 @@@ IntuiMessage *EventManager::getMsg() 
  		if (curButton) {
  			message._msgClass = kMessageButtonUp;
  			message._code = curButton->_buttonId;
- 		} else
+ 		} else {
  			message._msgClass = kMessageRawKey;
+ 			message._code = _keyPressed.keycode;
+ 		}
  
  		message._qualifier = _keyPressed.flags;
++		message._mouse = _mousePos;
+ 
+ 		_keyPressed.keycode = Common::KEYCODE_INVALID;
+ 
  		return &message;
  	} else
  		return nullptr;






More information about the Scummvm-git-logs mailing list