[Scummvm-git-logs] scummvm master -> 20294094a481a4350c83fff8920f2320cad8f440

sev- noreply at scummvm.org
Tue Aug 26 21:54:56 UTC 2025


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

Summary:
6420461ad9 DIRECTOR: Correctly read Score header in D6+
20294094a4 DIRECTOR: Correct VWSC header reading for D6+


Commit: 6420461ad94c812bd448034c6140257829dae272
    https://github.com/scummvm/scummvm/commit/6420461ad94c812bd448034c6140257829dae272
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-26T23:52:09+02:00

Commit Message:
DIRECTOR: Correctly read Score header in D6+

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


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 902acf65e48..fa14c4b6ff4 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1752,29 +1752,6 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		_numChannelsDisplayed = 30;
 
 		_firstFramePosition = _framesStream->pos();
-	} else if (version >= kFileVer400 && version < kFileVer600) {
-		_framesStreamSize = _framesStream->readUint32();
-		_frame1Offset = _framesStream->readUint32();
-		_numOfFrames = _framesStream->readUint32();
-		_framesVersion = _framesStream->readUint16();
-		_spriteRecordSize = _framesStream->readUint16();
-		_numChannels = _framesStream->readUint16();
-
-		if (_framesVersion > 13) {
-			_numChannelsDisplayed = _framesStream->readUint16(); // Up to 500
-		} else {
-			if (_framesVersion <= 7)    // Director5
-				_numChannelsDisplayed = 48;
-			else
-				_numChannelsDisplayed = 120;    // D6
-
-			_framesStream->readUint16(); // Skip
-		}
-
-		_firstFramePosition = _framesStream->pos();
-
-		debugC(1, kDebugLoading, "Score::loadFrames(): size: %d, frame1Offset: %d, numOfFrames: %d, version: %d, spriteRecordSize: %d, numChannels: %d, numChannelsDisplayed: %d",
-			_framesStreamSize, _frame1Offset, _numOfFrames, _framesVersion, _spriteRecordSize, _numChannels, _numChannelsDisplayed);
 	} else if (version >= kFileVer600 && version < kFileVer1100) {
 		_framesStreamSize = _framesStream->readUint32();
 		int32 ver = (int32)_framesStream->readUint32();
@@ -1791,10 +1768,9 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		debugC(1, kDebugLoading, "Score::loadFrames(): numEntries: %d, maxVar: %d, maxDataLen: 0x%x",
 			numEntries, listSize, maxDataLen);
 
-		_frame1Offset = listStart + 6 * 3 + listSize * 4;
-		_indexStart = listStart + 6 + 3;
-
-		_firstFramePosition = _frame1Offset;
+		// 3 * 4 = 3 int32 from above
+		_indexStart = listStart + 3 * 4;
+		_frameDataOffset = _indexStart + listSize * 4;
 
 		int prevOff = 0;
 		for (int i = 0; i < numEntries; i++) {
@@ -1805,7 +1781,39 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 			}
 			prevOff = off;
 		}
-	} else {
+
+		// now seek to the header, which is position 0 in the list
+		_framesStream->seek(_indexStart, SEEK_SET);
+		uint32 off = _framesStream->readUint32();
+		_framesStream->seek(_frameDataOffset + off, SEEK_SET);
+	}
+
+	if (version >= kFileVer400 && version < kFileVer1100) {
+		_framesStreamSize = _framesStream->readUint32();
+		_frame1Offset = _framesStream->readUint32();
+		_numOfFrames = _framesStream->readUint32();
+		_framesVersion = _framesStream->readUint16();
+		_spriteRecordSize = _framesStream->readUint16();
+		_numChannels = _framesStream->readUint16();
+
+		if (_framesVersion > 13) {
+			_numChannelsDisplayed = _framesStream->readUint16(); // Up to 500
+		} else {
+			if (_framesVersion <= 7)    // Director5
+				_numChannelsDisplayed = 48;
+			else
+				_numChannelsDisplayed = 120;    // D6
+
+			_framesStream->readUint16(); // Skip
+		}
+
+		_firstFramePosition = _framesStream->pos();
+
+		debugC(1, kDebugLoading, "Score::loadFrames(): size: %d, frame1Offset: %d, numOfFrames: %d, version: %d, spriteRecordSize: %d, numChannels: %d, numChannelsDisplayed: %d",
+			_framesStreamSize, _frame1Offset, _numOfFrames, _framesVersion, _spriteRecordSize, _numChannels, _numChannelsDisplayed);
+	}
+
+	if (version >= kFileVer1100) {
 		error("STUB: Score::loadFrames(): score not yet supported for version v%d (%d)", humanVersion(version), version);
 	}
 
@@ -1838,20 +1846,39 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 	debugC(1, kDebugLoading, "Score::loadFrames(): Number of frames: %d, framesStreamSize: %d", _numFrames, _framesStreamSize);
 }
 
+void Score::seekToFrameInList(int frameNum) {
+	if (frameNum < 1 || frameNum >= _numOfFrames) {
+		warning("Score::seekToFrameInList(): frameNum %d out of bounds [1, %d)", frameNum, _numOfFrames);
+		return;
+	}
+
+	_framesStream->seek(_indexStart + frameNum * 4, SEEK_SET);
+	uint32 off = _framesStream->readUint32();
+	uint32 size = _framesStream->readUint32() - off;
+
+	debugC(3, kDebugLoading, "    off: 0x%x size: 0x%x", off, size);
+
+	_framesStream->seek(_frameDataOffset + off, SEEK_SET);
+}
+
 bool Score::loadFrame(int frameNum, bool loadCast) {
-	debugC(7, kDebugLoading, "****** Frame request %d, current pos: %" PRId64 ", current frame number: %d", frameNum, _framesStream->pos(), _curFrameNumber);
+	debugC(7, kDebugLoading, "****** Frame request %d, current pos: 0x%x, current frame number: %d", frameNum, (uint32)_framesStream->pos(), _curFrameNumber);
 
 	int sourceFrame = _curFrameNumber;
 	int targetFrame = frameNum;
 
 	if (frameNum <= (int)_curFrameNumber) {
-		debugC(7, kDebugLoading, "****** Resetting frame %d to start %" PRId64, sourceFrame, _framesStream->pos());
+		debugC(7, kDebugLoading, "****** Resetting frame %d to start 0x%x", sourceFrame, (uint32)_framesStream->pos());
 		// If we are going back, we need to rebuild frames from start
 		_currentFrame->reset();
-		sourceFrame = 0;
 
 		// Reset position to start
-		_framesStream->seek(_firstFramePosition);
+		if (_version < kFileVer600) {
+			_framesStream->seek(_firstFramePosition);
+			sourceFrame = 0;
+		} else {
+			sourceFrame = 1;
+		}
 
 		// Reset sprite contents
 		for (auto &it : _currentFrame->_sprites)
@@ -1860,14 +1887,12 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 
 	debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset 0x%x", sourceFrame, targetFrame, (uint32)_framesStream->pos());
 
-	while (sourceFrame < targetFrame - 1 && readOneFrame()) {
-		if (_version >= kFileVer600 && _version < kFileVer1100) {
-			_framesStream->seek(_indexStart + sourceFrame * 4);
-			uint32 off = _framesStream->readUint32();
-			//uint32 size = _framesStream->readUint32() - off;
+	if (_version >= kFileVer600 && _version < kFileVer1100)
+		seekToFrameInList(sourceFrame);
 
-			_framesStream->seek(_frame1Offset + off);
-		}
+	while (sourceFrame < targetFrame - 1 && readOneFrame()) {
+		if (_version >= kFileVer600 && _version < kFileVer1100)
+			seekToFrameInList(sourceFrame);
 
 		sourceFrame++;
 	}
@@ -1896,7 +1921,7 @@ bool Score::readOneFrame() {
 		return false;
 
 	uint16 frameSize = _framesStream->readUint16();
-	debugC(4, kDebugLoading, "pos: %" PRId64 " frameSize: %d (0x%x) streamSize: %d", _framesStream->pos() - 2, frameSize, frameSize, _framesStreamSize);
+	debugC(4, kDebugLoading, "  pos: 0x%x frameSize: %d (0x%x) streamSize: %d", (uint32)(_framesStream->pos() - 2)	, frameSize, frameSize, _framesStreamSize);
 	assert(frameSize < _framesStreamSize);
 
 	debugC(3, kDebugLoading, "++++++++++ score load frame %d (frameSize %d) saveOffset", _curFrameNumber, frameSize);
diff --git a/engines/director/score.h b/engines/director/score.h
index 02cc2401a29..59e4a496e7a 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -157,6 +157,8 @@ private:
 
 	void writeFrame(Common::SeekableWriteStream *writeStream, Frame frame, uint32 channelSize, uint32 mainChannelSize);
 
+	void seekToFrameInList(int frame);
+
 public:
 	Common::Array<Channel *> _channels;
 	Common::SortedArray<Label *> *_labels;
@@ -185,6 +187,7 @@ public:
 
 	uint _firstFramePosition;
 	uint _indexStart = 0;
+	uint _frameDataOffset = 0;
 	Common::MemoryReadStreamEndian *_framesStream;
 
 	byte _currentFrameRate;


Commit: 20294094a481a4350c83fff8920f2320cad8f440
    https://github.com/scummvm/scummvm/commit/20294094a481a4350c83fff8920f2320cad8f440
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-26T23:54:39+02:00

Commit Message:
DIRECTOR: Correct VWSC header reading for D6+

Now we are ready to read channel data

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


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index fa14c4b6ff4..608e28b2e3f 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1747,6 +1747,8 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		_framesStream->hexdump(_framesStream->size());
 	}
 
+	_frameDataOffset = 0;
+
 	if (version < kFileVer400) {
 		_framesStreamSize = _framesStream->readUint32();
 		_numChannelsDisplayed = 30;
@@ -1776,8 +1778,8 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		for (int i = 0; i < numEntries; i++) {
 			uint32 off = _framesStream->readUint32();
 			if (i > 0) {
-				debugC(2, kDebugLoading, "  Score::loadFrames(): entry %d offset: 0x%x (%d), size: %d",
-					i - 1, prevOff, prevOff, off - prevOff);
+				debugC(2, kDebugLoading, "  Score::loadFrames(): entry %d offset: 0x%x (%d) -> 0x%x, size: %d",
+					i - 1, prevOff, prevOff, _frameDataOffset + prevOff, off - prevOff);
 			}
 			prevOff = off;
 		}
@@ -1846,9 +1848,9 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 	debugC(1, kDebugLoading, "Score::loadFrames(): Number of frames: %d, framesStreamSize: %d", _numFrames, _framesStreamSize);
 }
 
-void Score::seekToFrameInList(int frameNum) {
+void Score::seekToMemberInList(int frameNum) {
 	if (frameNum < 1 || frameNum >= _numOfFrames) {
-		warning("Score::seekToFrameInList(): frameNum %d out of bounds [1, %d)", frameNum, _numOfFrames);
+		warning("Score::seekToMemberInList(): frameNum %d out of bounds [1, %d)", frameNum, _numOfFrames);
 		return;
 	}
 
@@ -1856,7 +1858,7 @@ void Score::seekToFrameInList(int frameNum) {
 	uint32 off = _framesStream->readUint32();
 	uint32 size = _framesStream->readUint32() - off;
 
-	debugC(3, kDebugLoading, "    off: 0x%x size: 0x%x", off, size);
+	debugC(3, kDebugLoading, "    off: 0x%x size: %d", _frameDataOffset + off, size);
 
 	_framesStream->seek(_frameDataOffset + off, SEEK_SET);
 }
@@ -1873,12 +1875,8 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 		_currentFrame->reset();
 
 		// Reset position to start
-		if (_version < kFileVer600) {
-			_framesStream->seek(_firstFramePosition);
-			sourceFrame = 0;
-		} else {
-			sourceFrame = 1;
-		}
+		_framesStream->seek(_firstFramePosition);
+		sourceFrame = 0;
 
 		// Reset sprite contents
 		for (auto &it : _currentFrame->_sprites)
@@ -1887,13 +1885,7 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 
 	debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset 0x%x", sourceFrame, targetFrame, (uint32)_framesStream->pos());
 
-	if (_version >= kFileVer600 && _version < kFileVer1100)
-		seekToFrameInList(sourceFrame);
-
 	while (sourceFrame < targetFrame - 1 && readOneFrame()) {
-		if (_version >= kFileVer600 && _version < kFileVer1100)
-			seekToFrameInList(sourceFrame);
-
 		sourceFrame++;
 	}
 
@@ -1917,7 +1909,7 @@ bool Score::readOneFrame() {
 	uint16 channelSize;
 	uint16 channelOffset;
 
-	if (_framesStream->pos() >= _framesStreamSize || _framesStream->eos())
+	if (_framesStream->pos() - _frameDataOffset >= _framesStreamSize || _framesStream->eos())
 		return false;
 
 	uint16 frameSize = _framesStream->readUint16();
diff --git a/engines/director/score.h b/engines/director/score.h
index 59e4a496e7a..f4b0ba7359e 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -157,7 +157,7 @@ private:
 
 	void writeFrame(Common::SeekableWriteStream *writeStream, Frame frame, uint32 channelSize, uint32 mainChannelSize);
 
-	void seekToFrameInList(int frame);
+	void seekToMemberInList(int frame);
 
 public:
 	Common::Array<Channel *> _channels;




More information about the Scummvm-git-logs mailing list