[Scummvm-cvs-logs] scummvm master -> 20bcb0545e72e784b0369d005314fef39432818c

bluegr md5 at scummvm.org
Sat Jan 14 13:24:07 CET 2012


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

Summary:
20bcb0545e SCI: When deleting a plane, also delete the items in it


Commit: 20bcb0545e72e784b0369d005314fef39432818c
    https://github.com/scummvm/scummvm/commit/20bcb0545e72e784b0369d005314fef39432818c
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2012-01-14T04:22:54-08:00

Commit Message:
SCI: When deleting a plane, also delete the items in it

This fixes a crash in GK1 day 2, after using the thermostat outside
Mosely's office

Changed paths:
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 9f150ae..1402dc9 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -101,7 +101,7 @@ void GfxFrameout::kernelAddPlane(reg_t object) {
 }
 
 void GfxFrameout::kernelUpdatePlane(reg_t object) {
-	for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) {
+	for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) {
 		if (it->object == object) {
 			// Read some information
 			it->priority = readSelectorValue(_segMan, object, SELECTOR(priority));
@@ -178,8 +178,10 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) {
 }
 
 void GfxFrameout::kernelDeletePlane(reg_t object) {
+	deletePlaneItems(object);
 	deletePlanePictures(object);
-	for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); it++) {
+
+	for (PlaneList::iterator it = _planes.begin(); it != _planes.end(); ++it) {
 		if (it->object == object) {
 			_planes.erase(it);
 			Common::Rect planeRect;
@@ -276,6 +278,18 @@ void GfxFrameout::kernelDeleteScreenItem(reg_t object) {
 	_screenItems.remove(itemEntry);
 }
 
+void GfxFrameout::deletePlaneItems(reg_t planeObject) {
+	FrameoutList::iterator listIterator = _screenItems.begin();
+
+	while (listIterator != _screenItems.end()) {
+		reg_t itemPlane = readSelector(_segMan, (*listIterator)->object, SELECTOR(plane));
+		if (planeObject == itemPlane)
+			listIterator = _screenItems.erase(listIterator);
+		else
+			++listIterator;
+	}
+}
+
 FrameoutEntry *GfxFrameout::findScreenItem(reg_t object) {
 	for (FrameoutList::iterator listIterator = _screenItems.begin(); listIterator != _screenItems.end(); listIterator++) {
 		FrameoutEntry *itemEntry = *listIterator;
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index a4a0a85..8c3cc26 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -94,6 +94,7 @@ public:
 	void kernelAddScreenItem(reg_t object);
 	void kernelUpdateScreenItem(reg_t object);
 	void kernelDeleteScreenItem(reg_t object);
+	void deletePlaneItems(reg_t planeObject);
 	FrameoutEntry *findScreenItem(reg_t object);
 	int16 kernelGetHighPlanePri();
 	void kernelAddPicAt(reg_t planeObj, GuiResourceId pictureId, int16 pictureX, int16 pictureY);






More information about the Scummvm-git-logs mailing list