[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