[Scummvm-git-logs] scummvm master -> 15ce41c4da692f12356f34758ede90524924ba27

sluicebox 22204938+sluicebox at users.noreply.github.com
Sun Feb 2 04:02:37 UTC 2020


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:
15ce41c4da SCI32: Delete planes when restoring Mac games


Commit: 15ce41c4da692f12356f34758ede90524924ba27
    https://github.com/scummvm/scummvm/commit/15ce41c4da692f12356f34758ede90524924ba27
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2020-02-01T20:00:20-08:00

Commit Message:
SCI32: Delete planes when restoring Mac games

Changed paths:
    engines/sci/engine/savegame.cpp
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/plane32.h


diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 3423a01..5f209ce 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -421,6 +421,12 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) {
 	if (getSciVersion() >= SCI_VERSION_2) {
 		g_sci->_video32->beforeSaveLoadWithSerializer(s);
 	}
+
+	if (getSciVersion() >= SCI_VERSION_2 &&
+		s.isLoading() &&
+		g_sci->getPlatform() == Common::kPlatformMacintosh) {
+		g_sci->_gfxFrameout->deletePlanesForMacRestore();
+	}
 #endif
 
 	_segMan->saveLoadWithSerializer(s);
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 4036130..0c7f0de 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -345,6 +345,48 @@ void GfxFrameout::deletePlane(Plane &planeToFind) {
 	}
 }
 
+void GfxFrameout::deletePlanesForMacRestore() {
+	// SCI32 PC games delete planes and screen items from
+	//  their Game:restore script before calling kRestore.
+	//  In Mac this work was moved into the interpreter.
+	for (PlaneList::size_type i = 0; i < _planes.size(); ) {
+		Plane *plane = _planes[i];
+
+		// don't delete the default plane
+		if (plane->isDefaultPlane()) {
+			i++;
+			continue;
+		}
+
+		// delete all inserted screen items from the plane
+		for (ScreenItemList::size_type j = 0; j < plane->_screenItemList.size(); ++j) {
+			ScreenItem *screenItem = plane->_screenItemList[j];
+			if (screenItem != nullptr &&
+				!screenItem->_object.isNumber() &&
+				_segMan->getObject(screenItem->_object)->isInserted()) {
+
+				// delete the screen item
+				if (screenItem->_created) {
+					plane->_screenItemList.erase_at(j);
+				} else {
+					screenItem->_updated = 0;
+					screenItem->_deleted = getScreenCount();
+				}
+			}
+		}
+		plane->_screenItemList.pack();
+
+		// delete the plane
+		if (plane->_created) {
+			_planes.erase(plane);
+		} else {
+			plane->_moved = 0;
+			plane->_deleted = getScreenCount();
+			i++;
+		}
+	}
+}
+
 void GfxFrameout::kernelMovePlaneItems(const reg_t object, const int16 deltaX, const int16 deltaY, const bool scrollPics) {
 	Plane *plane = _planes.findByObject(object);
 	if (plane == nullptr) {
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index f67d531..f151295 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -157,6 +157,11 @@ public:
 	 */
 	void deletePlane(Plane &plane);
 
+	/**
+	 * Deletes planes when restoring a Mac game.
+	 */
+	void deletePlanesForMacRestore();
+
 	const PlaneList &getPlanes() const {
 		return _planes;
 	}
diff --git a/engines/sci/graphics/plane32.h b/engines/sci/graphics/plane32.h
index 406c3f8..f9cda35 100644
--- a/engines/sci/graphics/plane32.h
+++ b/engines/sci/graphics/plane32.h
@@ -25,6 +25,7 @@
 
 #include "common/array.h"
 #include "common/rect.h"
+#include "sci/engine/features.h"
 #include "sci/engine/vm_types.h"
 #include "sci/graphics/helpers.h"
 #include "sci/graphics/lists32.h"
@@ -309,6 +310,13 @@ public:
 	 */
 	void scrollScreenItems(const int16 deltaX, const int16 deltaY, const bool scrollPics);
 
+	/**
+	 * The default plane is the first plane generated inside the graphics engine.
+	 */
+	inline bool isDefaultPlane() {
+		return _object.isNumber() && _object.getOffset() == (uint32)g_sci->_features->detectPlaneIdBase();
+	}
+
 #pragma mark -
 #pragma mark Plane - Pic
 private:




More information about the Scummvm-git-logs mailing list