mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-04 17:29:11 +00:00
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:
parent
c83699ba50
commit
41cea48a9e
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -63,6 +63,8 @@ public:
|
||||
Frame *getFrame() const { return _frame; }
|
||||
Score *getScore() const { return _score; }
|
||||
|
||||
void reset();
|
||||
|
||||
void updateEditable();
|
||||
|
||||
bool respondsToMouse();
|
||||
|
Loading…
x
Reference in New Issue
Block a user