[Scummvm-git-logs] scummvm master -> 197a2bf087d0ec0efb079622b36463a6d8372998
sev-
noreply at scummvm.org
Sat Jul 25 11:20:00 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
197a2bf087 DIRECTOR: Release auto-puppet latches when the score reasserts a sprite
Commit: 197a2bf087d0ec0efb079622b36463a6d8372998
https://github.com/scummvm/scummvm/commit/197a2bf087d0ec0efb079622b36463a6d8372998
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-25T13:19:57+02:00
Commit Message:
DIRECTOR: Release auto-puppet latches when the score reasserts a sprite
Release each latch where the score's own delta record carries the
matching property, using the same predicates as Sprite::replaceFrom().
Fixes the previous scene's sprites staying drawn over the new one in
Physicus (XGame/xSLand.dxr)
Changed paths:
engines/director/score.cpp
engines/director/sprite.cpp
engines/director/sprite.h
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 9bf147e9727..0ac0c6d7f40 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -504,6 +504,9 @@ void Score::updateCurrentFrame() {
// This copies in the frame data and updates _curFrameNumber.
loadFrame(nextFrameNumberToLoad, true);
+ for (uint ch = 0; ch < _channels.size(); ch++)
+ _channels[ch]->_sprite->releaseAutoPuppet(_currentFrame->_sprites[ch]->_copyBackMask);
+
// Finally, update the channels and buffer any dirty rectangles.
// This will ignore any channel data that is overridden with the puppet flag.
updateSprites(kRenderModeNormal, true);
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 9b45795afe9..ba7ce20a3cc 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -458,6 +458,24 @@ bool Sprite::getAutoPuppet(AutoPuppetProperty property) {
return (_autoPuppet & (1 << property)) != 0;
}
+// Predicates mirror the auto-puppet checks in replaceFrom().
+void Sprite::releaseAutoPuppet(uint32 copyBackMask) {
+ static const struct { AutoPuppetProperty property; uint32 mask; } releases[] = {
+ { kAPInk, kSCBInk },
+ { kAPForeColor, kSCBForeColor },
+ { kAPBackColor, kSCBBackColor },
+ { kAPCast, kSCBCastId },
+ { kAPLoc, kSCBStartPoint },
+ { kAPHeight, kSCBCastId | kSCBHeight },
+ { kAPWidth, kSCBCastId | kSCBWidth },
+ { kAPMoveable, kSCBMoveable }
+ };
+
+ for (auto &release : releases)
+ if (copyBackMask & release.mask)
+ setAutoPuppet(release.property, false);
+}
+
void Sprite::setWidth(int w) {
_width = MAX<int>(w, 0);
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index 4155955e7b3..ab13f38f82b 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -129,6 +129,7 @@ public:
uint32 getBackColor();
void setAutoPuppet(AutoPuppetProperty property, bool value);
bool getAutoPuppet(AutoPuppetProperty property);
+ void releaseAutoPuppet(uint32 copyBackMask);
inline int getWidth() { return _width; }
void setWidth(int w);
More information about the Scummvm-git-logs
mailing list