[Scummvm-git-logs] scummvm master -> 77dc1a81ddbebedaaf9605410dfb4c4a4f8cdc09

sev- noreply at scummvm.org
Tue Aug 26 17:11:25 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:
bbf4800514 DIRECTOR: Tidy up VWSC resource header reading
77dc1a81dd DIRECTOR: Initial code for D6 VWSC reading


Commit: bbf4800514ff5e7eda038c3fb8560a8ff34605f7
    https://github.com/scummvm/scummvm/commit/bbf4800514ff5e7eda038c3fb8560a8ff34605f7
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-26T11:10:39+02:00

Commit Message:
DIRECTOR: Tidy up VWSC resource header reading

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


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 5f9716598ff..d844f2736f6 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1751,9 +1751,9 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 
 	if (version < kFileVer400) {
 		_numChannelsDisplayed = 30;
-	} else if (version >= kFileVer400 && version < kFileVer600) {
-		uint32 frame1Offset = _framesStream->readUint32();
-		/* uint32 numOfFrames = */ _framesStream->readUint32();
+	} else if (version >= kFileVer400 && version < kFileVer1100) {
+		_frame1Offset = _framesStream->readUint32();
+		_numOfFrames = _framesStream->readUint32();
 		_framesVersion = _framesStream->readUint16();
 		_spriteRecordSize = _framesStream->readUint16();
 		_numChannels = _framesStream->readUint16();
@@ -1769,8 +1769,8 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 			_framesStream->readUint16(); // Skip
 		}
 
-		debugC(1, kDebugLoading, "Score::loadFrames(): frame1Offset: 0x%x, version: %d, spriteRecordSize: 0x%x, numChannels: %d, numChannelsDisplayed: %d",
-			frame1Offset, _framesVersion, _spriteRecordSize, _numChannels, _numChannelsDisplayed);
+		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);
 		// Unknown, some bytes - constant (refer to contuinity).
 	} else {
 		error("STUB: Score::loadFrames(): score not yet supported for version v%d (%d)", humanVersion(version), version);
@@ -1788,8 +1788,8 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 	_firstFramePosition = _framesStream->pos();
 
 	// Pre-computing number of frames, as sometimes the frameNumber in stream mismatches
-	debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames! First frame pos: %d, framesstreamsizeL %d",
-			_firstFramePosition, _framesStreamSize);
+	debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames! First frame pos: %d",
+			_firstFramePosition);
 
 	// Calculate number of frames and their positions
 	// numOfFrames in the header is often incorrect
diff --git a/engines/director/score.h b/engines/director/score.h
index 12a0796e666..1b05aeaa47a 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -170,13 +170,20 @@ public:
 	Frame *_currentFrame;
 	uint32 _curFrameNumber;
 	uint32 _numFrames;
-	uint32 _framesVersion;
-	uint32 _numChannels;
 	uint8 _currentTempo;
 	CastMemberID _currentPaletteId;
 
+	// header D4+
+	uint32 _framesStreamSize;
+	int32 _frame1Offset;
+	int32 _numOfFrames;
+	uint16 _framesVersion;
+	uint16 _spriteRecordSize;
+	uint16 _numChannels;
+	int16 _numChannelsDisplayed;  // D7+, no-op in earlier versions
+	//  20 bytes in total
+
 	uint _firstFramePosition;
-	uint _framesStreamSize;
 	Common::MemoryReadStreamEndian *_framesStream;
 
 	byte _currentFrameRate;
@@ -202,11 +209,6 @@ public:
 	CursorRef _currentCursor;
 	bool _skipTransition;
 
-	int _numChannelsDisplayed;
-
-	/* Data to be saved */
-	uint16 _spriteRecordSize;
-
 private:
 	DirectorEngine *_vm;
 	Lingo *_lingo;


Commit: 77dc1a81ddbebedaaf9605410dfb4c4a4f8cdc09
    https://github.com/scummvm/scummvm/commit/77dc1a81ddbebedaaf9605410dfb4c4a4f8cdc09
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-26T18:35:40+02:00

Commit Message:
DIRECTOR: Initial code for D6 VWSC reading

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


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index d844f2736f6..902acf65e48 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -1747,11 +1747,13 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 		_framesStream->hexdump(_framesStream->size());
 	}
 
-	_framesStreamSize = _framesStream->readUint32();
-
 	if (version < kFileVer400) {
+		_framesStreamSize = _framesStream->readUint32();
 		_numChannelsDisplayed = 30;
-	} else if (version >= kFileVer400 && version < kFileVer1100) {
+
+		_firstFramePosition = _framesStream->pos();
+	} else if (version >= kFileVer400 && version < kFileVer600) {
+		_framesStreamSize = _framesStream->readUint32();
 		_frame1Offset = _framesStream->readUint32();
 		_numOfFrames = _framesStream->readUint32();
 		_framesVersion = _framesStream->readUint16();
@@ -1769,9 +1771,40 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 			_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);
-		// Unknown, some bytes - constant (refer to contuinity).
+	} else if (version >= kFileVer600 && version < kFileVer1100) {
+		_framesStreamSize = _framesStream->readUint32();
+		int32 ver = (int32)_framesStream->readUint32();
+		uint32 listStart = _framesStream->readUint32();
+
+		debugC(1, kDebugLoading, "Score::loadFrames(): len: %d, version: %d, listStart: 0x%x",
+			_framesStreamSize, ver, listStart);
+
+		_framesStream->seek(listStart);
+		int32 numEntries = (int32)_framesStream->readUint32();
+		int32 listSize = (int32)_framesStream->readUint32();
+		int32 maxDataLen = (int32)_framesStream->readUint32();
+
+		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;
+
+		int prevOff = 0;
+		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);
+			}
+			prevOff = off;
+		}
 	} else {
 		error("STUB: Score::loadFrames(): score not yet supported for version v%d (%d)", humanVersion(version), version);
 	}
@@ -1785,10 +1818,9 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 
 	// Prepare frameOffsets
 	_version = version;
-	_firstFramePosition = _framesStream->pos();
 
 	// Pre-computing number of frames, as sometimes the frameNumber in stream mismatches
-	debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames! First frame pos: %d",
+	debugC(1, kDebugLoading, "Score::loadFrames(): Precomputing total number of frames! First frame pos: 0x%x",
 			_firstFramePosition);
 
 	// Calculate number of frames and their positions
@@ -1826,9 +1858,17 @@ bool Score::loadFrame(int frameNum, bool loadCast) {
 			it->reset();
 	}
 
-	debugC(7, kDebugLoading, "****** Source frame %d to Destination frame %d, current offset %" PRId64, sourceFrame, targetFrame, _framesStream->pos());
+	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;
+
+			_framesStream->seek(_frame1Offset + off);
+		}
+
 		sourceFrame++;
 	}
 
diff --git a/engines/director/score.h b/engines/director/score.h
index 1b05aeaa47a..02cc2401a29 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -184,6 +184,7 @@ public:
 	//  20 bytes in total
 
 	uint _firstFramePosition;
+	uint _indexStart = 0;
 	Common::MemoryReadStreamEndian *_framesStream;
 
 	byte _currentFrameRate;




More information about the Scummvm-git-logs mailing list