[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