[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