[Scummvm-git-logs] scummvm master -> bc118d9d7ec19e6a3cc237c26b2cb4c4385ef2df

sev- noreply at scummvm.org
Thu Jun 18 21:00:57 UTC 2026


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

Summary:
66e4f17dce DIRECTOR: Sync cast member save code with loading for D6+
4c09d65ca3 DIRECTOR: Cover D6+ in cast member getCastDataSize() for save round-trip
bc118d9d7e DIRECTOR: Only resolve the frame script-channel behavior if it actually has	a handler for this event.


Commit: 66e4f17dcead467d37d6a3c2b2038914c851e1d0
    https://github.com/scummvm/scummvm/commit/66e4f17dcead467d37d6a3c2b2038914c851e1d0
Author: Lariaa (30549703+Lariaa at users.noreply.github.com)
Date: 2026-06-18T23:00:51+02:00

Commit Message:
DIRECTOR: Sync cast member save code with loading for D6+
Tested with TKKG2

Changed paths:
    engines/director/archive-save.cpp
    engines/director/castmember/castmember.cpp
    engines/director/castmember/script.cpp
    engines/director/score.cpp


diff --git a/engines/director/archive-save.cpp b/engines/director/archive-save.cpp
index 1e2fbd43db9..185482cfd4e 100644
--- a/engines/director/archive-save.cpp
+++ b/engines/director/archive-save.cpp
@@ -64,7 +64,8 @@ bool RIFXArchive::writeToFile(Common::String filename, Movie *movie) {
 	_size = getArchiveSize(builtResources);
 	saveFile->writeUint32LE(_metaTag); // The _metaTag is "RIFX" or "XFIR"
 
-	saveFile->writeUint32LE(getResourceSize(_metaTag, 0) - 8); // The size of the RIFX archive, except header and size
+	// We need to recompute the chunk size here, to accommodate any resournce changes
+	saveFile->writeUint32LE(getArchiveSize(builtResources) + 4);
 	saveFile->writeUint32LE(_rifxType);	// e.g. "MV93", "MV95"
 
 	switch (_rifxType) {
@@ -155,8 +156,8 @@ bool RIFXArchive::writeToFile(Common::String filename, Movie *movie) {
 			break;
 
 		case MKTAG('S', 'C', 'V', 'W'):
-			{
 
+			{
 				uint32 parentIndex = findParentIndex(it->tag, it->index);
 				Resource parent = castResMap[parentIndex];
 
@@ -278,13 +279,15 @@ bool RIFXArchive::writeAfterBurnerMap(Common::SeekableWriteStream *writeStream)
 bool RIFXArchive::writeKeyTable(Common::SeekableWriteStream *writeStream, uint32 offset) {
 	writeStream->seek(offset);
 
+	uint32 numEntries = (getKeyTableResourceSize() - 12) / 12;
+
 	writeStream->writeUint32LE(MKTAG('K', 'E', 'Y', '*'));
-	writeStream->writeUint32LE(getResourceSize(MKTAG('K', 'E', 'Y', '*'), getResourceIDList(MKTAG('K', 'E', 'Y', '*'))[0]));
+	writeStream->writeUint32LE(getKeyTableResourceSize());
 
 	writeStream->writeUint16LE(_keyTableEntrySize);
 	writeStream->writeUint16LE(_keyTableEntrySize2);
-	writeStream->writeUint32LE(_keyTableEntryCount);
-	writeStream->writeUint32LE(_keyTableUsedCount);
+	writeStream->writeUint32LE(numEntries);
+	writeStream->writeUint32LE(numEntries);
 
 	debugC(3, kDebugSaving, "RIFXArchive::writeKeyTable: writing key table:");
 
@@ -602,7 +605,7 @@ Common::Array<Resource *> RIFXArchive::rebuildResources(Movie *movie) {
 	// Now that all sizes have been updated, we can safely calculate the overall archive size
 	for (auto &it : builtResources) {
 		if (it->tag == MKTAG('R', 'I', 'F', 'X') || it->tag == MKTAG('X', 'F', 'I', 'R')) {
-			it->size = getArchiveSize(builtResources) + 8;
+			it->size = getArchiveSize(builtResources) + 4;
 		}
 	}
 
diff --git a/engines/director/castmember/castmember.cpp b/engines/director/castmember/castmember.cpp
index e1da80eab3e..abfd8e59f17 100644
--- a/engines/director/castmember/castmember.cpp
+++ b/engines/director/castmember/castmember.cpp
@@ -389,7 +389,7 @@ uint32 CastMember::writeCAStResource(Common::SeekableWriteStream *writeStream) {
 		if (castInfoToWrite) {
 			_cast->writeCastInfo(writeStream, _castId);
 		}
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1200) {
 		writeStream->writeUint32BE((uint32)_type);
 		writeStream->writeUint32BE(castInfoToWrite);
 		writeStream->writeUint32BE(castDataToWrite);
@@ -445,8 +445,7 @@ uint32 CastMember::getCastResourceSize() {
 		if (_flags1 != 0xFF) {
 			headerSize += 1;
 		}
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
-		// Header size for director version 5
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1200) {
 		headerSize = 12;		// See Cast::loadCastData() for director version 5
 	}
 
diff --git a/engines/director/castmember/script.cpp b/engines/director/castmember/script.cpp
index 0432b3573cc..4d78f052e7e 100644
--- a/engines/director/castmember/script.cpp
+++ b/engines/director/castmember/script.cpp
@@ -146,17 +146,16 @@ uint32 ScriptCastMember::getCastDataSize() {
 	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		// 2 bytes for type and unk1 + 2 byte for castType and flags ma(see Cast::loadCastData() for Director 4 only
 		return 2 + 2;
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
-		// type and unk1: 2 bytes
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1200) {
 		return 2;
 	} else {
-		warning("ScriptCastMember::writeCastData(): invalid or unhandled Script version: %d", _cast->_version);
+		warning("ScriptCastMember::getCastDataSize(): invalid or unhandled Script version: %d", _cast->_version);
 		return 0;
 	}
 }
 
 void ScriptCastMember::writeCastData(Common::SeekableWriteStream *writeStream) {
-	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer600) {
+	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer1200) {
 		writeStream->writeByte(0);		// unknown
 
 		switch (_scriptType) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 29dc5cd5d14..80c77dcf717 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -2462,8 +2462,14 @@ void Score::writeVWSCResource(Common::SeekableWriteStream *writeStream, uint32 o
 	} else if (_version >= kFileVer500 && _version < kFileVer600) {
 		channelSize = kSprChannelSizeD5;
 		mainChannelSize = kMainChannelSizeD5;
+	} else if (_version >= kFileVer600 && _version < kFileVer700) {
+		channelSize = kSprChannelSizeD6;
+		mainChannelSize = kMainChannelSizeD6;
+	} else if (_version >= kFileVer700 && _version < kFileVer1100) {
+		channelSize = kSprChannelSizeD7;
+		mainChannelSize = kMainChannelSizeD7;
 	} else {
-		warning("FilmLoopCastMember::writeSCVWResource: Writing Director Version 6+ not supported yet");
+		warning("Score::writeVWSCResource: Writing this Director version is not supported yet");
 		return;
 	}
 
@@ -2523,6 +2529,10 @@ void Score::writeFrame(Common::SeekableWriteStream *writeStream, Frame frame, ui
 			writeSpriteDataD4(writeStream, sprite);
 		} else if (_version >= kFileVer500 && _version < kFileVer600) {
 			writeSpriteDataD5(writeStream, sprite);
+		} else if (_version >= kFileVer600 && _version < kFileVer700) {
+			writeSpriteDataD6(writeStream, sprite);
+		} else if (_version >= kFileVer700 && _version < kFileVer1100) {
+			writeSpriteDataD7(writeStream, sprite);
 		}
 	}
 }
@@ -2533,11 +2543,18 @@ uint32 Score::getVWSCResourceSize() {
 	if (_version >= kFileVer400 && _version < kFileVer500) {
 		channelSize = kSprChannelSizeD4;
 		mainChannelSize = kMainChannelSizeD4;
-	} else if (_version >= kFileVer500) {
+	} else if (_version >= kFileVer500 && _version < kFileVer600) {
 		channelSize = kSprChannelSizeD5;
 		mainChannelSize = kMainChannelSizeD5;
+	} else if (_version >= kFileVer600 && _version < kFileVer700) {
+		// Must match writeVWSCResource()/Frame::readChannel() (D6: main channel 144).
+		channelSize = kSprChannelSizeD6;
+		mainChannelSize = kMainChannelSizeD6;
+	} else if (_version >= kFileVer700 && _version < kFileVer1100) {
+		channelSize = kSprChannelSizeD7;
+		mainChannelSize = kMainChannelSizeD7;
 	} else {
-		warning("FilmLoopCastMember::getSCVWResourceSize: Director version unsupported");
+		warning("Score::getVWSCResourceSize: Director version unsupported");
 	}
 
 	uint32 framesSize = 0;


Commit: 4c09d65ca3fe00eee604c9bdd6ec5682c24f47ff
    https://github.com/scummvm/scummvm/commit/4c09d65ca3fe00eee604c9bdd6ec5682c24f47ff
Author: Lariaa (30549703+Lariaa at users.noreply.github.com)
Date: 2026-06-18T23:00:51+02:00

Commit Message:
DIRECTOR: Cover D6+ in cast member getCastDataSize() for save round-trip

Changed paths:
    engines/director/castmember/digitalvideo.cpp
    engines/director/castmember/filmloop.cpp
    engines/director/castmember/palette.cpp
    engines/director/castmember/shape.cpp
    engines/director/castmember/sound.cpp
    engines/director/castmember/transition.cpp


diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index facd9065913..46ef7911ebe 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -740,7 +740,7 @@ uint32 DigitalVideoCastMember::getCastDataSize() {
 	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		// It has been observed that the DigitalVideoCastMember has _flags set to 0x00
 		return (_flags1 == 0xFF) ? 13 : 14;
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1100) {
 		return 8 + 4;
 	}
 
diff --git a/engines/director/castmember/filmloop.cpp b/engines/director/castmember/filmloop.cpp
index ca01dfd5440..0cff9c8ec7d 100644
--- a/engines/director/castmember/filmloop.cpp
+++ b/engines/director/castmember/filmloop.cpp
@@ -267,7 +267,7 @@ uint32 FilmLoopCastMember::getCastDataSize() {
 	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		// It has been observed that the FilmCastMember has _flags as 0x00
 		return 8 + 4 + 2 + 2;
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer700) {
 		return 8 + 4 + 2;
 	}
 
diff --git a/engines/director/castmember/palette.cpp b/engines/director/castmember/palette.cpp
index 6994cff3edb..7534a8cb4ef 100644
--- a/engines/director/castmember/palette.cpp
+++ b/engines/director/castmember/palette.cpp
@@ -138,8 +138,8 @@ void PaletteCastMember::unload() {
 // PaletteCastMember has no data in the 'CASt' resource or is ignored
 // This is the data in 'CASt' resource
 uint32 PaletteCastMember::getCastDataSize() {
-	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
-		// It has been observed as well that the Data size in PaletteCastMember's CASt resource is 0 for d5
+	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1100) {
+		// D5 onward palette lives in the CLUT resources
 		return 0;
 	} else if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		// (castType (see Cast::loadCastData() for Director 4 only) 1 byte
diff --git a/engines/director/castmember/shape.cpp b/engines/director/castmember/shape.cpp
index c57f355b334..5b443c14dc4 100644
--- a/engines/director/castmember/shape.cpp
+++ b/engines/director/castmember/shape.cpp
@@ -222,10 +222,10 @@ uint32 ShapeCastMember::getCastDataSize() {
 	// For Director 4 : 1 byte extra for casttype (See Cast::loadCastData())
 	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		return 17 + 1;
-	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	} else if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1100) {
 		return 17;
 	} else {
-		warning("ScriptCastMember::writeCastData(): invalid or unhandled Script version: %d", _cast->_version);
+		warning("ShapeCastMember::getCastDataSize(): invalid or unhandled cast version: %d", _cast->_version);
 		return 0;
 	}
 }
diff --git a/engines/director/castmember/sound.cpp b/engines/director/castmember/sound.cpp
index 16bb0f1b475..1c8db8cf9b7 100644
--- a/engines/director/castmember/sound.cpp
+++ b/engines/director/castmember/sound.cpp
@@ -303,7 +303,8 @@ void SoundCastMember::setField(int field, const Datum &d) {
 // Similar to PaletteCastMember, SoundCastMember has no data in the 'CASt' resource or is ignored
 // This is the data in 'CASt' resource
 uint32 SoundCastMember::getCastDataSize() {
-	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer700) {
+		// D5+  sound lives in snd/sndH children
 		return 0;
 	} else if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer500) {
 		// (castType (see Cast::loadCastData() for Director 4 only) 1 byte
diff --git a/engines/director/castmember/transition.cpp b/engines/director/castmember/transition.cpp
index 5fddf31dfd9..67801162134 100644
--- a/engines/director/castmember/transition.cpp
+++ b/engines/director/castmember/transition.cpp
@@ -126,12 +126,12 @@ Common::String TransitionCastMember::formatInfo() {
 }
 
 uint32 TransitionCastMember::getCastDataSize() {
-	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer600) {
+	if (_cast->_version >= kFileVer500 && _cast->_version < kFileVer1100) {
 		// Ignored 1 byte
 		// _chunkSize 1 byte
 		// _transType 1 byte
 		// _flags 1 byte
-		// _durationMiilis 2 bytes
+		// _durationMillis 2 bytes
 		return 6;
 	} else {
 		warning("TransitionCastMember()::getCastDataSize(): CastMember version invalid or not handled");
@@ -140,12 +140,12 @@ uint32 TransitionCastMember::getCastDataSize() {
 }
 
 void TransitionCastMember::writeCastData(Common::SeekableWriteStream *writeStream) {
-	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer600) {
+	if (_cast->_version >= kFileVer400 && _cast->_version < kFileVer1100) {
 		writeStream->writeByte(0);
 		writeStream->writeByte(_chunkSize);
 		writeStream->writeByte((uint8)_transType);
 		writeStream->writeByte(_flags);
-		writeStream->writeUint16LE(_durationMillis);
+		writeStream->writeUint16BE(_durationMillis);
 	} else {
 		warning("TransitionCastMember()::writeCastData(): CastMember version invalid or not handled");
 	}


Commit: bc118d9d7ec19e6a3cc237c26b2cb4c4385ef2df
    https://github.com/scummvm/scummvm/commit/bc118d9d7ec19e6a3cc237c26b2cb4c4385ef2df
Author: Lariaa (30549703+Lariaa at users.noreply.github.com)
Date: 2026-06-18T23:00:51+02:00

Commit Message:
DIRECTOR: Only resolve the frame script-channel behavior if it actually has	a handler for this event.
Otherwise a handler-less frame behavior would be run as a no-op for keyDown/mouseDown yet still consume the pass-through swallowing the subsequent movie-level handler.
Fixes language selection in TKKG3+

Changed paths:
    engines/director/lingo/lingo-events.cpp


diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index d44bc5b28fe..2304a3c8a52 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -350,7 +350,8 @@ void Movie::resolveScriptEvent(LingoEvent &event) {
 				return;
 
 			if (_vm->getVersion() >= 600) {
-				if (_score->_scriptChannelScriptInstance.type == OBJECT) {
+				if (_score->_scriptChannelScriptInstance.type == OBJECT &&
+						_score->_scriptChannelScriptInstance.u.obj->getMethod(_lingo->_eventHandlerTypes[event.event]).type != VOIDSYM) {
 					event.scriptType = kScoreScript;
 					event.scriptId = CastMemberID(); // No ID for the script channel script
 					event.scriptInstance = _score->_scriptChannelScriptInstance.u.obj;




More information about the Scummvm-git-logs mailing list