[Scummvm-git-logs] scummvm master -> 2a11565e164b0df0f5dd0e62a07a5bed110bef85

sev- noreply at scummvm.org
Mon Sep 15 22:38:55 UTC 2025


This automated email contains information about 7 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
b6a4a2d3b5 DIRECTOR: Read Sprite name right away from the Score
5158c6a6c7 DIRECTOR: Added debug output on SpriteInfo loading
084bbd87da DIRECTOR: Normalized MainChannels init and copy constructor
2775ef03a1 DIRECTOR: Fix Frame copy constructor
b901e0600e DIRECTOR: Improve debug output on loading SpriteInfo
76f3648fa7 DIRECTOR: Improved debug output for SpriteInfo loading
2a11565e16 DIRECTOR: Fix regression in D6+ Score loading


Commit: b6a4a2d3b5ae865c64d1c704568e3fde93633c25
    https://github.com/scummvm/scummvm/commit/b6a4a2d3b5ae865c64d1c704568e3fde93633c25
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Read Sprite name right away from the Score

Changed paths:
    engines/director/score.cpp
    engines/director/score.h
    engines/director/spriteinfo.h


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 8e339932155..982658769e4 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1877,6 +1877,24 @@ BehaviorElement Score::loadSpriteBehavior(Common::MemoryReadStreamEndian *stream
 	return behavior;
 }
 
+SpriteInfo Score::loadSpriteInfo(int spriteId) {
+	SpriteInfo info;
+
+	Common::MemoryReadStreamEndian *stream = getSpriteDetailsStream(spriteId);
+	if (stream) {
+		info.read(*stream);
+		delete stream;
+	}
+
+	stream = getSpriteDetailsStream(spriteId + 2);
+	if (stream) {
+		info.name = stream->readString();
+		delete stream;
+	}
+
+	return info;
+}
+
 void Score::loadFrameSpriteDetails() {
 	Common::MemoryReadStreamEndian *stream = nullptr;
 	for (int i = 0; i < _currentFrame->_sprites.size(); i++) {
@@ -1892,11 +1910,7 @@ void Score::loadFrameSpriteDetails() {
 				delete stream;
 			}
 
-			stream = getSpriteDetailsStream(sprite->_spriteListIdx);
-			if (stream) {
-				sprite->_spriteInfo.read(*stream);
-				delete stream;
-			}
+			sprite->_spriteInfo = loadSpriteInfo(sprite->_spriteListIdx);
 		}
 	}
 
@@ -1908,57 +1922,29 @@ void Score::loadFrameSpriteDetails() {
 			delete stream;
 		}
 
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.scriptSpriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.scriptSpriteInfo.read(*stream);
-			delete stream;
-		}
+		if (_currentFrame->_mainChannels.scriptSpriteListIdx)
+			_currentFrame->_mainChannels.scriptSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.scriptSpriteListIdx);
 	}
 
 	// Tempo channel
-	if (_currentFrame->_mainChannels.tempoSpriteListIdx) {
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.tempoSpriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.tempoSpriteInfo.read(*stream);
-			delete stream;
-		}
-	}
+	if (_currentFrame->_mainChannels.tempoSpriteListIdx)
+		_currentFrame->_mainChannels.tempoSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.tempoSpriteListIdx);
 
 	// Transition channel
-	if (_currentFrame->_mainChannels.transSpriteListIdx) {
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.transSpriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.transSpriteInfo.read(*stream);
-			delete stream;
-		}
-	}
+	if (_currentFrame->_mainChannels.transSpriteListIdx)
+		_currentFrame->_mainChannels.transSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.transSpriteListIdx);
 
 	// Sound2 channel
-	if (_currentFrame->_mainChannels.sound2SpriteListIdx) {
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.sound2SpriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.sound2SpriteInfo.read(*stream);
-			delete stream;
-		}
-	}
+	if (_currentFrame->_mainChannels.sound2SpriteListIdx)
+		_currentFrame->_mainChannels.sound2SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound2SpriteListIdx);
 
 	// Sound1 channel
-	if (_currentFrame->_mainChannels.sound1SpriteListIdx) {
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.sound1SpriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.sound1SpriteInfo.read(*stream);
-			delete stream;
-		}
-	}
+	if (_currentFrame->_mainChannels.sound1SpriteListIdx)
+		_currentFrame->_mainChannels.sound1SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound1SpriteListIdx);
 
 	// Palette channel
-	if (_currentFrame->_mainChannels.palette.spriteListIdx) {
-		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.palette.spriteListIdx);
-		if (stream) {
-			_currentFrame->_mainChannels.palette.spriteInfo.read(*stream);
-			delete stream;
-		}
-	}
+	if (_currentFrame->_mainChannels.palette.spriteListIdx)
+		_currentFrame->_mainChannels.palette.spriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.palette.spriteListIdx);
 }
 
 
diff --git a/engines/director/score.h b/engines/director/score.h
index 771727c7fee..0ceff724db3 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -54,6 +54,7 @@ class Sprite;
 class CastMember;
 class AudioDecoder;
 struct BehaviorElement;
+struct SpriteInfo;
 
 struct Label {
 	Common::String comment;
@@ -165,6 +166,7 @@ private:
 	void loadFrameSpriteDetails();
 
 	BehaviorElement loadSpriteBehavior(Common::MemoryReadStreamEndian *stream);
+	SpriteInfo loadSpriteInfo(int spriteId);
 
 public:
 	Common::Array<Channel *> _channels;
diff --git a/engines/director/spriteinfo.h b/engines/director/spriteinfo.h
index dfbc940f1ac..609f6f3ba2d 100644
--- a/engines/director/spriteinfo.h
+++ b/engines/director/spriteinfo.h
@@ -50,6 +50,8 @@ struct SpriteInfo {
 
     Common::Array<int32> keyFrames;
 
+	Common::String name; // Sits in a separate item
+
 	void read(Common::ReadStreamEndian &stream) {
 		startFrame = (int32)stream.readUint32();
 		endFrame = (int32)stream.readUint32();
@@ -73,6 +75,7 @@ struct SpriteInfo {
 			startFrame, endFrame, xtraInfo, flags, channelNum);
 		s += Common::String::format("  tweenInfo: curvature: %d, flags: 0x%x, easeIn: %d, easeOut: %d\n",
 			tweenInfo.curvature, tweenInfo.flags, tweenInfo.easeIn, tweenInfo.easeOut);
+		s += Common::String::format("  name: '%s'\n", name.c_str());
 		s += "  keyFrames: ";
 		for (size_t i = 0; i < keyFrames.size(); i++) {
 			s += Common::String::format("%d ", keyFrames[i]);
@@ -91,6 +94,13 @@ struct BehaviorElement {
 		memberID.member = (int16)stream.readUint16();
 		initializerIndex = (int32)stream.readUint32();
 	}
+
+	Common::String toString() const {
+		Common::String s;
+		s += Common::String::format("memberID: %s, initializerIndex: %d, initializerParams: '%s'\n",
+			memberID.asString().c_str(), initializerIndex, initializerParams.c_str());
+		return s;
+	}
 };
 
 } // End of namespace Director


Commit: 5158c6a6c7efe45aa1b63a7e3d145b3537b01f0c
    https://github.com/scummvm/scummvm/commit/5158c6a6c7efe45aa1b63a7e3d145b3537b01f0c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Added debug output on SpriteInfo loading

Changed paths:
    engines/director/score.cpp
    engines/director/spriteinfo.h


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 982658769e4..2140a9cffc5 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1874,6 +1874,7 @@ BehaviorElement Score::loadSpriteBehavior(Common::MemoryReadStreamEndian *stream
 		}
 	}
 
+	debugC(2, kDebugLoading, "    Behavior: %s", behavior.toString().c_str());
 	return behavior;
 }
 
@@ -1892,6 +1893,8 @@ SpriteInfo Score::loadSpriteInfo(int spriteId) {
 		delete stream;
 	}
 
+	debugC(2, kDebugLoading, "  SpriteInfo: %s", info.toString().c_str());
+
 	return info;
 }
 
@@ -1900,6 +1903,10 @@ void Score::loadFrameSpriteDetails() {
 	for (int i = 0; i < _currentFrame->_sprites.size(); i++) {
 		Sprite *sprite = _currentFrame->_sprites[i];
 		if (sprite->_spriteListIdx) {
+			debugC(2, kDebugLoading, "Sprite %d", i);
+
+			sprite->_spriteInfo = loadSpriteInfo(sprite->_spriteListIdx);
+
 			stream = getSpriteDetailsStream(sprite->_spriteListIdx + 1);
 			if (stream) {
 				while (stream->pos() < stream->size()) {
@@ -1909,42 +1916,51 @@ void Score::loadFrameSpriteDetails() {
 				}
 				delete stream;
 			}
-
-			sprite->_spriteInfo = loadSpriteInfo(sprite->_spriteListIdx);
 		}
 	}
 
 	// Script channel
 	if (_currentFrame->_mainChannels.scriptSpriteListIdx) {
+		debugC(2, kDebugLoading, "Script channel");
+
+		_currentFrame->_mainChannels.scriptSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.scriptSpriteListIdx);
+
 		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.scriptSpriteListIdx + 1);
 		if (stream) {
 			_currentFrame->_mainChannels.behavior = loadSpriteBehavior(stream);
 			delete stream;
 		}
-
-		if (_currentFrame->_mainChannels.scriptSpriteListIdx)
-			_currentFrame->_mainChannels.scriptSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.scriptSpriteListIdx);
 	}
 
 	// Tempo channel
-	if (_currentFrame->_mainChannels.tempoSpriteListIdx)
+	if (_currentFrame->_mainChannels.tempoSpriteListIdx) {
+		debugC(2, kDebugLoading, "Tempo channel");
 		_currentFrame->_mainChannels.tempoSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.tempoSpriteListIdx);
+	}
 
 	// Transition channel
-	if (_currentFrame->_mainChannels.transSpriteListIdx)
+	if (_currentFrame->_mainChannels.transSpriteListIdx) {
+		debugC(2, kDebugLoading, "Transition channel");
 		_currentFrame->_mainChannels.transSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.transSpriteListIdx);
+	}
 
 	// Sound2 channel
-	if (_currentFrame->_mainChannels.sound2SpriteListIdx)
+	if (_currentFrame->_mainChannels.sound2SpriteListIdx) {
+		debugC(2, kDebugLoading, "Sound2 channel");
 		_currentFrame->_mainChannels.sound2SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound2SpriteListIdx);
+	}
 
 	// Sound1 channel
-	if (_currentFrame->_mainChannels.sound1SpriteListIdx)
+	if (_currentFrame->_mainChannels.sound1SpriteListIdx) {
+		debugC(2, kDebugLoading, "Sound1 channel");
 		_currentFrame->_mainChannels.sound1SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound1SpriteListIdx);
+	}
 
 	// Palette channel
-	if (_currentFrame->_mainChannels.palette.spriteListIdx)
+	if (_currentFrame->_mainChannels.palette.spriteListIdx) {
+		debugC(2, kDebugLoading, "Palette channel");
 		_currentFrame->_mainChannels.palette.spriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.palette.spriteListIdx);
+	}
 }
 
 
diff --git a/engines/director/spriteinfo.h b/engines/director/spriteinfo.h
index 609f6f3ba2d..0edff45960a 100644
--- a/engines/director/spriteinfo.h
+++ b/engines/director/spriteinfo.h
@@ -73,10 +73,10 @@ struct SpriteInfo {
 		Common::String s;
 		s += Common::String::format("startFrame: %d, endFrame: %d, xtraInfo: %d, flags: 0x%x, channelNum: %d\n",
 			startFrame, endFrame, xtraInfo, flags, channelNum);
-		s += Common::String::format("  tweenInfo: curvature: %d, flags: 0x%x, easeIn: %d, easeOut: %d\n",
+		s += Common::String::format("    tweenInfo: curvature: %d, flags: 0x%x, easeIn: %d, easeOut: %d\n",
 			tweenInfo.curvature, tweenInfo.flags, tweenInfo.easeIn, tweenInfo.easeOut);
-		s += Common::String::format("  name: '%s'\n", name.c_str());
-		s += "  keyFrames: ";
+		s += Common::String::format("    name: '%s'\n", name.c_str());
+		s += "    keyFrames: ";
 		for (size_t i = 0; i < keyFrames.size(); i++) {
 			s += Common::String::format("%d ", keyFrames[i]);
 		}
@@ -97,7 +97,7 @@ struct BehaviorElement {
 
 	Common::String toString() const {
 		Common::String s;
-		s += Common::String::format("memberID: %s, initializerIndex: %d, initializerParams: '%s'\n",
+		s += Common::String::format("memberID: %s, initializerIndex: %d, initializerParams: '%s'",
 			memberID.asString().c_str(), initializerIndex, initializerParams.c_str());
 		return s;
 	}


Commit: 084bbd87daa0568ed146de0a1f3f614b44f72d68
    https://github.com/scummvm/scummvm/commit/084bbd87daa0568ed146de0a1f3f614b44f72d68
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Normalized MainChannels init and copy constructor

Changed paths:
    engines/director/frame.cpp
    engines/director/frame.h


diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 557ac596117..aac9fac79ab 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -57,6 +57,9 @@ Frame::Frame(const Frame &frame) {
 	_vm = frame._vm;
 	_numChannels = frame._numChannels;
 	_mainChannels.actionId = frame._mainChannels.actionId;
+	_mainChannels.scriptSpriteListIdx = frame._mainChannels.scriptSpriteListIdx;
+	_mainChannels.behavior = frame._mainChannels.behavior;
+	_mainChannels.scriptSpriteInfo = frame._mainChannels.scriptSpriteInfo;
 	_mainChannels.transArea = frame._mainChannels.transArea;
 	_mainChannels.transDuration = frame._mainChannels.transDuration;
 	_mainChannels.transType = frame._mainChannels.transType;
diff --git a/engines/director/frame.h b/engines/director/frame.h
index 480ff25434a..a4afe869b29 100644
--- a/engines/director/frame.h
+++ b/engines/director/frame.h
@@ -140,34 +140,34 @@ struct MainChannels {
 	uint8 blend;
 
 	MainChannels() {
+		scriptSpriteListIdx = 0;
+
 		transDuration = 0;
-		transType = kTransNone;
 		transArea = 0;
 		transChunkSize = 0;
+		transType = kTransNone;
+		transSpriteListIdx = 0;
+
 		tempo = 0;
 		tempoSpriteListIdx = 0;
 		tempoD6Flags = 0;
 
 		scoreCachedTempo = 0;
-		scoreCachedPaletteId = CastMemberID(0, 0);
 
-		sound1 = CastMemberID(0, 0);
-		sound2 = CastMemberID(0, 0);
 		soundType1 = 0;
-		soundType2 = 0;
 		sound1SpriteListIdx = 0;
-		sound2SpriteListIdx = 0;
 
-		actionId = CastMemberID(0, 0);
-		scriptSpriteListIdx = 0;
-		skipFrameFlag = 0;
-		blend = 0;
+		soundType2 = 0;
+		sound2SpriteListIdx = 0;
 
 		colorTempo = 0;
 		colorSound1 = 0;
 		colorSound2 = 0;
 		colorScript = 0;
 		colorTrans = 0;
+
+		skipFrameFlag = 0;
+		blend = 0;
 	}
 };
 


Commit: 2775ef03a1691ef9797d8b4c83cfd7edcb3d5946
    https://github.com/scummvm/scummvm/commit/2775ef03a1691ef9797d8b4c83cfd7edcb3d5946
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Fix Frame copy constructor

Changed paths:
    engines/director/frame.cpp


diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index aac9fac79ab..c6065050c1a 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -60,18 +60,32 @@ Frame::Frame(const Frame &frame) {
 	_mainChannels.scriptSpriteListIdx = frame._mainChannels.scriptSpriteListIdx;
 	_mainChannels.behavior = frame._mainChannels.behavior;
 	_mainChannels.scriptSpriteInfo = frame._mainChannels.scriptSpriteInfo;
-	_mainChannels.transArea = frame._mainChannels.transArea;
+
 	_mainChannels.transDuration = frame._mainChannels.transDuration;
-	_mainChannels.transType = frame._mainChannels.transType;
+	_mainChannels.transArea = frame._mainChannels.transArea;
 	_mainChannels.transChunkSize = frame._mainChannels.transChunkSize;
+	_mainChannels.transType = frame._mainChannels.transType;
+	_mainChannels.trans = frame._mainChannels.trans;
+	_mainChannels.transSpriteListIdx = frame._mainChannels.transSpriteListIdx;
+	_mainChannels.transSpriteInfo = frame._mainChannels.transSpriteInfo;
+
+	_mainChannels.palette = frame._mainChannels.palette;
 	_mainChannels.tempo = frame._mainChannels.tempo;
+	_mainChannels.tempoSpriteListIdx = frame._mainChannels.tempoSpriteListIdx;
+	_mainChannels.tempoD6Flags = frame._mainChannels.tempoD6Flags;
+	_mainChannels.tempoSpriteInfo = frame._mainChannels.tempoSpriteInfo;
+
 	_mainChannels.scoreCachedTempo = frame._mainChannels.scoreCachedTempo;
+	_mainChannels.scoreCachedPaletteId = frame._mainChannels.scoreCachedPaletteId;
+
 	_mainChannels.sound1 = frame._mainChannels.sound1;
-	_mainChannels.sound2 = frame._mainChannels.sound2;
 	_mainChannels.soundType1 = frame._mainChannels.soundType1;
+	_mainChannels.sound1SpriteListIdx = frame._mainChannels.sound1SpriteListIdx;
+	_mainChannels.sound1SpriteInfo = frame._mainChannels.sound1SpriteInfo;
+	_mainChannels.sound2 = frame._mainChannels.sound2;
 	_mainChannels.soundType2 = frame._mainChannels.soundType2;
-	_mainChannels.skipFrameFlag = frame._mainChannels.skipFrameFlag;
-	_mainChannels.blend = frame._mainChannels.blend;
+	_mainChannels.sound2SpriteListIdx = frame._mainChannels.sound2SpriteListIdx;
+	_mainChannels.sound2SpriteInfo = frame._mainChannels.sound2SpriteInfo;
 
 	_mainChannels.colorTempo = frame._mainChannels.colorTempo;
 	_mainChannels.colorSound1 = frame._mainChannels.colorSound1;
@@ -79,7 +93,8 @@ Frame::Frame(const Frame &frame) {
 	_mainChannels.colorScript = frame._mainChannels.colorScript;
 	_mainChannels.colorTrans = frame._mainChannels.colorTrans;
 
-	_mainChannels.palette = frame._mainChannels.palette;
+	_mainChannels.skipFrameFlag = frame._mainChannels.skipFrameFlag;
+	_mainChannels.blend = frame._mainChannels.blend;
 
 	_score = frame._score;
 


Commit: b901e0600ea22b7138037c6b1a075f2f0bba86e0
    https://github.com/scummvm/scummvm/commit/b901e0600ea22b7138037c6b1a075f2f0bba86e0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Improve debug output on loading SpriteInfo

Now we gather statistics on unaccessed infos and print them out
and also print out the debug info only at the initial scanning

Changed paths:
    engines/director/score.cpp
    engines/director/score.h


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 2140a9cffc5..22b9cd74094 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1779,11 +1779,13 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		_frameDataOffset = _indexStart + listSize * 4;
 
 		_spriteDetailOffsets.resize(numEntries);
+		_spriteDetailAccessed.resize(numEntries);
 
 		int prevOff = 0;
 		for (int i = 0; i < numEntries; i++) {
 			uint32 off = _framesStream->readUint32();
 			_spriteDetailOffsets[i] = _frameDataOffset + off;
+			_spriteDetailAccessed[i] = false;
 
 			if (i > 0) {
 				debugC(2, kDebugLoading, "  Detail entry %d offset: 0x%x (%d) -> 0x%x, size: %d",
@@ -1854,6 +1856,15 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 
 	debugC(1, kDebugLoading, "Score::loadFrames(): Calculated, total number of frames %d!", _numFrames);
 
+	if (_version >= kFileVer600) {
+		for (int i = 0; i < _spriteDetailAccessed.size() - 1; i++) {
+			int size = _spriteDetailOffsets[i + 1] - _spriteDetailOffsets[i];
+			if (!_spriteDetailAccessed[i] && size > 0) {
+				debugC(2, kDebugLoading, "Sprite detail %d not accessed, size: %d", i, size);
+			}
+		}
+	}
+
 	_currentFrame->reset();
 
 	loadFrame(1, true);
@@ -1861,7 +1872,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 	debugC(1, kDebugLoading, "Score::loadFrames(): Number of frames: %d, framesStreamSize: %d", _numFrames, _framesStreamSize);
 }
 
-BehaviorElement Score::loadSpriteBehavior(Common::MemoryReadStreamEndian *stream) {
+BehaviorElement Score::loadSpriteBehavior(Common::MemoryReadStreamEndian *stream, bool skipLog) {
 	BehaviorElement behavior;
 	behavior.read(*stream);
 
@@ -1874,11 +1885,13 @@ BehaviorElement Score::loadSpriteBehavior(Common::MemoryReadStreamEndian *stream
 		}
 	}
 
-	debugC(2, kDebugLoading, "    Behavior: %s", behavior.toString().c_str());
+	if (!skipLog)
+		debugC(2, kDebugLoading, "    Behavior: %s", behavior.toString().c_str());
+
 	return behavior;
 }
 
-SpriteInfo Score::loadSpriteInfo(int spriteId) {
+SpriteInfo Score::loadSpriteInfo(int spriteId, bool skipLog) {
 	SpriteInfo info;
 
 	Common::MemoryReadStreamEndian *stream = getSpriteDetailsStream(spriteId);
@@ -1893,24 +1906,26 @@ SpriteInfo Score::loadSpriteInfo(int spriteId) {
 		delete stream;
 	}
 
-	debugC(2, kDebugLoading, "  SpriteInfo: %s", info.toString().c_str());
+	if (!skipLog)
+		debugC(2, kDebugLoading, "  SpriteInfo: %s", info.toString().c_str());
 
 	return info;
 }
 
-void Score::loadFrameSpriteDetails() {
+void Score::loadFrameSpriteDetails(bool skipLog) {
 	Common::MemoryReadStreamEndian *stream = nullptr;
 	for (int i = 0; i < _currentFrame->_sprites.size(); i++) {
 		Sprite *sprite = _currentFrame->_sprites[i];
 		if (sprite->_spriteListIdx) {
-			debugC(2, kDebugLoading, "Sprite %d", i);
+			if (!skipLog)
+				debugC(2, kDebugLoading, "Sprite %d", i);
 
-			sprite->_spriteInfo = loadSpriteInfo(sprite->_spriteListIdx);
+			sprite->_spriteInfo = loadSpriteInfo(sprite->_spriteListIdx, skipLog);
 
 			stream = getSpriteDetailsStream(sprite->_spriteListIdx + 1);
 			if (stream) {
 				while (stream->pos() < stream->size()) {
-					BehaviorElement behavior = loadSpriteBehavior(stream);
+					BehaviorElement behavior = loadSpriteBehavior(stream, skipLog);
 
 					sprite->_behaviors.push_back(behavior);
 				}
@@ -1921,45 +1936,51 @@ void Score::loadFrameSpriteDetails() {
 
 	// Script channel
 	if (_currentFrame->_mainChannels.scriptSpriteListIdx) {
-		debugC(2, kDebugLoading, "Script channel");
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Script channel");
 
-		_currentFrame->_mainChannels.scriptSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.scriptSpriteListIdx);
+		_currentFrame->_mainChannels.scriptSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.scriptSpriteListIdx, skipLog);
 
 		stream = getSpriteDetailsStream(_currentFrame->_mainChannels.scriptSpriteListIdx + 1);
 		if (stream) {
-			_currentFrame->_mainChannels.behavior = loadSpriteBehavior(stream);
+			_currentFrame->_mainChannels.behavior = loadSpriteBehavior(stream, skipLog);
 			delete stream;
 		}
 	}
 
 	// Tempo channel
 	if (_currentFrame->_mainChannels.tempoSpriteListIdx) {
-		debugC(2, kDebugLoading, "Tempo channel");
-		_currentFrame->_mainChannels.tempoSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.tempoSpriteListIdx);
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Tempo channel");
+		_currentFrame->_mainChannels.tempoSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.tempoSpriteListIdx, skipLog);
 	}
 
 	// Transition channel
 	if (_currentFrame->_mainChannels.transSpriteListIdx) {
-		debugC(2, kDebugLoading, "Transition channel");
-		_currentFrame->_mainChannels.transSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.transSpriteListIdx);
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Transition channel");
+		_currentFrame->_mainChannels.transSpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.transSpriteListIdx, skipLog);
 	}
 
 	// Sound2 channel
 	if (_currentFrame->_mainChannels.sound2SpriteListIdx) {
-		debugC(2, kDebugLoading, "Sound2 channel");
-		_currentFrame->_mainChannels.sound2SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound2SpriteListIdx);
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Sound2 channel");
+		_currentFrame->_mainChannels.sound2SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound2SpriteListIdx, skipLog);
 	}
 
 	// Sound1 channel
 	if (_currentFrame->_mainChannels.sound1SpriteListIdx) {
-		debugC(2, kDebugLoading, "Sound1 channel");
-		_currentFrame->_mainChannels.sound1SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound1SpriteListIdx);
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Sound1 channel");
+		_currentFrame->_mainChannels.sound1SpriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.sound1SpriteListIdx, skipLog);
 	}
 
 	// Palette channel
 	if (_currentFrame->_mainChannels.palette.spriteListIdx) {
-		debugC(2, kDebugLoading, "Palette channel");
-		_currentFrame->_mainChannels.palette.spriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.palette.spriteListIdx);
+		if (!skipLog)
+			debugC(2, kDebugLoading, "Palette channel");
+		_currentFrame->_mainChannels.palette.spriteInfo = loadSpriteInfo(_currentFrame->_mainChannels.palette.spriteListIdx, skipLog);
 	}
 }
 
@@ -2011,7 +2032,7 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 		return false;
 
 	if (_version >= kFileVer600)
-		loadFrameSpriteDetails();
+		loadFrameSpriteDetails(loadCast);
 
 	// We have read the frame, now update current frame number
 	_curFrameNumber = targetFrame;
@@ -2373,6 +2394,8 @@ Common::MemoryReadStreamEndian *Score::getSpriteDetailsStream(int spriteIdx) {
 	if (spriteIdx >= 0 && spriteIdx < (int)_spriteDetailOffsets.size() - 1) {
 		uint32 size = _spriteDetailOffsets[spriteIdx + 1] - _spriteDetailOffsets[spriteIdx];
 
+		_spriteDetailAccessed[spriteIdx] = true;
+
 		if (!size)
 			return nullptr;
 
diff --git a/engines/director/score.h b/engines/director/score.h
index 0ceff724db3..659e1a0a9ed 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -163,10 +163,10 @@ private:
 
 	void seekToMemberInList(int frame);
 
-	void loadFrameSpriteDetails();
+	void loadFrameSpriteDetails(bool skipLog);
 
-	BehaviorElement loadSpriteBehavior(Common::MemoryReadStreamEndian *stream);
-	SpriteInfo loadSpriteInfo(int spriteId);
+	BehaviorElement loadSpriteBehavior(Common::MemoryReadStreamEndian *stream, bool skipLog);
+	SpriteInfo loadSpriteInfo(int spriteId, bool skipLog);
 
 public:
 	Common::Array<Channel *> _channels;
@@ -225,6 +225,7 @@ public:
 	bool _skipTransition;
 
 	Common::Array<uint32> _spriteDetailOffsets;
+	Common::Array<bool> _spriteDetailAccessed;
 
 private:
 	DirectorEngine *_vm;


Commit: 76f3648fa788f2030df0bae8abd25f20d3ba5e0a
    https://github.com/scummvm/scummvm/commit/76f3648fa788f2030df0bae8abd25f20d3ba5e0a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Improved debug output for SpriteInfo loading

Also, parse the ordered sprite list for the reference

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 22b9cd74094..6a9cb65050f 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1798,6 +1798,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		_framesStream->seek(_indexStart, SEEK_SET);
 		uint32 off = _framesStream->readUint32();
 		_framesStream->seek(_frameDataOffset + off, SEEK_SET);
+		_spriteDetailAccessed[0] = true;
 	}
 
 	if (version >= kFileVer400 && version < kFileVer1100) {
@@ -1843,6 +1844,19 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 	debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames! First frame pos: 0x%x",
 			_firstFramePosition);
 
+	// Index 1 in the list contains the sprite order. We are not using it,
+	if (_version >= kFileVer600) {
+		Common::MemoryReadStreamEndian *stream1 = getSpriteDetailsStream(1);
+		int numSprites = stream1->readUint32();
+		debugCN(2, kDebugLoading, "Sprites order: ");
+		for (int i = 0; i < numSprites; i++) {
+			int spriteId = stream1->readUint32();
+			debugCN(2, kDebugLoading, "%d ", spriteId);
+		}
+		debugC(2, kDebugLoading, "");
+		delete stream1;
+	}
+
 	// Calculate number of frames and their positions
 	// numOfFrames in the header is often incorrect
 	for (_numFrames = 1; loadFrame(_numFrames, false); _numFrames++) {
@@ -1854,13 +1868,21 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		}
 	}
 
-	debugC(1, kDebugLoading, "Score::loadFrames(): Calculated, total number of frames %d!", _numFrames);
+	debugC(1, kDebugLoading, "Score::loadFrames(): Calculated, total number of frames %d", _numFrames);
 
 	if (_version >= kFileVer600) {
 		for (int i = 0; i < _spriteDetailAccessed.size() - 1; i++) {
 			int size = _spriteDetailOffsets[i + 1] - _spriteDetailOffsets[i];
 			if (!_spriteDetailAccessed[i] && size > 0) {
-				debugC(2, kDebugLoading, "Sprite detail %d not accessed, size: %d", i, size);
+				int type = i % 3;
+				const char *purpose = (type == 0) ? "spriteInfo" : (type == 1) ? "behavior" : "name";
+				debugC(2, kDebugLoading, "Sprite detail %d not accessed, size: %d (%s)", i, size, purpose);
+
+				Common::MemoryReadStreamEndian *stream1 = getSpriteDetailsStream(i);
+				if (stream1) {
+					stream1->hexdump(stream1->size());
+					delete stream1;
+				}
 			}
 		}
 	}


Commit: 2a11565e164b0df0f5dd0e62a07a5bed110bef85
    https://github.com/scummvm/scummvm/commit/2a11565e164b0df0f5dd0e62a07a5bed110bef85
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-09-16T00:38:10+02:00

Commit Message:
DIRECTOR: Fix regression in D6+ Score loading

We now make sure that we return back to the end of frame
when loading ScriptInfos

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 6a9cb65050f..f261ef6dac3 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -2053,9 +2053,13 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 	if (!isFrameRead)
 		return false;
 
+	int64 pos = _framesStream->pos();
+
 	if (_version >= kFileVer600)
 		loadFrameSpriteDetails(loadCast);
 
+	_framesStream->seek(pos, SEEK_SET);
+
 	// We have read the frame, now update current frame number
 	_curFrameNumber = targetFrame;
 




More information about the Scummvm-git-logs mailing list