DIRECTOR: Reset sprite contents when loading frames from start

Fixes _blendAmount state leak in w_tonnel of Eastern Mind (activate the
magatama dragon, then look at the creature embedded in the wall).
This commit is contained in:
Scott Percival 2024-05-24 16:24:53 +08:00 committed by Eugene Sandulenko
parent c83699ba50
commit 41cea48a9e
4 changed files with 19 additions and 6 deletions

View File

@ -267,7 +267,7 @@ void Frame::readSpriteD2(Common::MemoryReadStreamEndian &stream, uint16 offset,
uint16 fieldPosition = offset - spriteStart;
debugC(3, kDebugLoading, "Frame::readSpriteD2(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
debugC(5, kDebugLoading, "Frame::readSpriteD2(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
if (debugChannelSet(8, kDebugLoading)) {
stream.hexdump(size);
}
@ -575,7 +575,7 @@ void Frame::readSpriteD4(Common::MemoryReadStreamEndian &stream, uint16 offset,
uint16 fieldPosition = offset - spriteStart;
debugC(3, kDebugLoading, "Frame::readSpriteD4(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
debugC(5, kDebugLoading, "Frame::readSpriteD4(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
if (debugChannelSet(8, kDebugLoading)) {
stream.hexdump(size);
}
@ -877,7 +877,7 @@ void Frame::readSpriteD5(Common::MemoryReadStreamEndian &stream, uint16 offset,
uint16 fieldPosition = offset - spriteStart;
debugC(3, kDebugLoading, "Frame::readSpriteD5(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
debugC(5, kDebugLoading, "Frame::readSpriteD5(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
if (debugChannelSet(8, kDebugLoading)) {
stream.hexdump(size);
}
@ -1075,7 +1075,7 @@ void Frame::readSpriteD6(Common::MemoryReadStreamEndian &stream, uint16 offset,
uint16 fieldPosition = offset - spriteStart;
debugC(3, kDebugLoading, "Frame::readSpriteD6(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
debugC(5, kDebugLoading, "Frame::readSpriteD6(): sprite: %d offset: %d size: %d, field: %d", spritePosition, offset, size, fieldPosition);
if (debugChannelSet(8, kDebugLoading)) {
stream.hexdump(size);
}

View File

@ -1632,6 +1632,10 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
// Reset position to start
_framesStream->seek(_firstFramePosition);
// Reset sprite contents
for (auto &it : _currentFrame->_sprites)
it->reset();
}
debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset %ld", sourceFrame, targetFrame, _framesStream->pos());

View File

@ -36,6 +36,13 @@ Sprite::Sprite(Frame *frame) {
_score = _frame ? _frame->getScore() : nullptr;
_movie = _score ? _score->getMovie() : nullptr;
_matte = nullptr;
_puppet = false;
_autoPuppet = kAPNone; // Based on Director in a Nutshell, page 15
reset();
}
void Sprite::reset() {
_scriptId = CastMemberID(0, 0);
_colorcode = 0;
_blendAmount = 0;
@ -50,6 +57,8 @@ Sprite::Sprite(Frame *frame) {
_ink = kInkTypeCopy;
_trails = false;
if (_matte)
delete _matte;
_matte = nullptr;
_cast = nullptr;
@ -58,8 +67,6 @@ Sprite::Sprite(Frame *frame) {
_height = 0;
_moveable = false;
_editable = false;
_puppet = false;
_autoPuppet = kAPNone; // Based on Director in a Nutshell, page 15
_immediate = false;
_backColor = g_director->_wm->_colorWhite;
_foreColor = g_director->_wm->_colorWhite;

View File

@ -63,6 +63,8 @@ public:
Frame *getFrame() const { return _frame; }
Score *getScore() const { return _score; }
void reset();
void updateEditable();
bool respondsToMouse();