[Scummvm-git-logs] scummvm master -> 3d86b386b649fd6dec68626d87685233d0015dc0

sev- noreply at scummvm.org
Fri Jul 10 05:57:58 UTC 2026


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

Summary:
0b6b4e912b DIRECTOR: Add detection for Italian Physikus (Físicus, l'Espresso)
033f303ff2 DIRECTOR: LINGO: Fix D7 Lscr code store span and Lnam size check
de5e5b3974 DIRECTOR: Fix transformColor out-of-bounds for packed RGB colors
9049523710 DIRECTOR: Fix D7 multi-castLib MCsL parse corrupting libs after external cast
f2b63cfd6c DIRECTOR: Support D7 sound cast members
b4611f6387 DIRECTOR: Fix D7 MCsL libResourceId truncated to uint16
f60369a0fa DIRECTOR: Parse D7 (v700) VWCF config and sound cast info
3d86b386b6 DIRECTOR: Adopt MCsL resource id for the pre-created internal cast


Commit: 0b6b4e912b184e183a96f757bdd62dc89dc5a9f6
    https://github.com/scummvm/scummvm/commit/0b6b4e912b184e183a96f757bdd62dc89dc5a9f6
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Add detection for Italian Physikus (Físicus, l'Espresso)

Changed paths:
    engines/director/detection_tables.h


diff --git a/engines/director/detection_tables.h b/engines/director/detection_tables.h
index c8e197a33be..274e738b5d2 100644
--- a/engines/director/detection_tables.h
+++ b/engines/director/detection_tables.h
@@ -9757,6 +9757,8 @@ static const DirectorGameDescription gameDescriptions[] = {
 	MACGAME1_l("physicus", "", "Physikus", "5d3f89e052320f8ce140451c730e232b", 114645, Common::FR_FRA, 702),
 	WINGAME1("physicus", "",   "Physicus.exe", "t:d2a772b412a278bda68bd64a00af9b04", 2298279, 702),
 	WINGAME1_l("physicus", "", "Physikus.exe", "t:89be052460986358d7e4724ebc940af6", 1816828, Common::DE_DEU, 702),
+	// Italian edition "Físicus", published by l'Espresso
+	WINGAME1_l("physicus", "", "Physikus.exe", "t:026868d136e559a3eca5445221d123f1", 1816876, Common::IT_ITA, 702),
 
 	WINDEMO2("planetstrass", "Demo", "Planet.exe", "t:a053c117847a545ef72aecb425fed9e7", 15434606,
 									 "strass.jpg", "d:d76c7387399626e7a3daef54cbcd6451",	39135, 702),


Commit: 033f303ff2c42babd0ec2bcb1f53c4df23d1573b
    https://github.com/scummvm/scummvm/commit/033f303ff2c42babd0ec2bcb1f53c4df23d1573b
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: LINGO: Fix D7 Lscr code store span and Lnam size check

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


diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 037b58415cf..b00735e0c63 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -1307,7 +1307,14 @@ ScriptContext *LingoCompiler::compileLingoV4(Common::SeekableReadStreamEndian &s
 		return nullptr;
 	}
 
-	uint32 codeStoreSize = functionsOffset - codeStoreOffset;
+	if (codeStoreOffset > (uint32)stream.size()) {
+		warning("Lscr code store offset 0x%x is out of bounds (size 0x%x)", codeStoreOffset, (uint32)stream.size());
+		return nullptr;
+	}
+
+	// D7+ may place the function table before the bytecode, so the code store
+	// must span the whole chunk, not [codeStoreOffset, functionsOffset)
+	uint32 codeStoreSize = (uint32)stream.size() - codeStoreOffset;
 	stream.seek(codeStoreOffset);
 	byte *codeStore = (byte *)malloc(codeStoreSize);
 	stream.read(codeStore, codeStoreSize);
@@ -1746,8 +1753,12 @@ void LingoArchive::addNamesV4(Common::SeekableReadStreamEndian &stream) {
 	uint16 offset = stream.readUint16();
 	uint16 count = stream.readUint16();
 
-	if ((uint32)stream.size() != size) {
-		warning("Lnam content missing");
+	// D7+ `size` may not match the stream length; validate offsets instead of bailing
+	if ((uint32)stream.size() != size)
+		debugC(1, kDebugCompile, "addNamesV4: Lnam size %u != stream size %u, proceeding", size, (uint32)stream.size());
+
+	if (offset > stream.size()) {
+		warning("Lnam names offset 0x%x out of bounds (size 0x%x)", offset, (uint32)stream.size());
 		return;
 	}
 
@@ -1756,6 +1767,10 @@ void LingoArchive::addNamesV4(Common::SeekableReadStreamEndian &stream) {
 	names.clear();
 
 	for (uint16 i = 0; i < count; i++) {
+		if (stream.eos() || (uint32)stream.pos() >= (uint32)stream.size()) {
+			warning("addNamesV4: ran out of data after %d of %d names", i, count);
+			break;
+		}
 		Common::String name = stream.readPascalString();
 
 		names.push_back(name);


Commit: de5e5b3974c41d2e2dbd644498c210270bd928f0
    https://github.com/scummvm/scummvm/commit/de5e5b3974c41d2e2dbd644498c210270bd928f0
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Fix transformColor out-of-bounds for packed RGB colors

Changed paths:
    engines/director/graphics.cpp


diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 21d6d1b468c..a22212b98be 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -44,6 +44,11 @@ uint32 DirectorEngine::transformColor(uint32 color) {
 	if (_pixelformat.bytesPerPixel == 1)
 		return color;
 
+	// A palette index can never exceed 0xff (max 256 colors); a larger value
+	// must be a packed RGB int from a Lingo color assignment (e.g. rgb()).
+	if (color > 0xff)
+		return _wm->findBestColor((color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+
 	return _wm->findBestColor(_currentPalette[color * 3], _currentPalette[color * 3 + 1], _currentPalette[color * 3 + 2]);
 }
 


Commit: 9049523710397e331993194cbbfa2aeac1c181d0
    https://github.com/scummvm/scummvm/commit/9049523710397e331993194cbbfa2aeac1c181d0
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Fix D7 multi-castLib MCsL parse corrupting libs after external cast

Changed paths:
    engines/director/movie.cpp


diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index bdf964fcc45..14df9557580 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -170,8 +170,19 @@ void Movie::loadCastLibMapping(Common::SeekableReadStreamEndian &stream) {
 		int pathSize = stream.readByte();
 		Common::String path = stream.readString('\0', pathSize);
 		stream.readByte(); // null
-		if (pathSize > 1)
-			stream.readUint16();
+		if (pathSize > 1) {
+			// Separator after an external cast path: 1 byte in D7, uint16 in D5/D6.
+			// Not verified for D8+; falls back to the D7 (1-byte) guess with a warning.
+			uint16 ver = g_director->getVersion();
+			if (ver >= 700 && ver < 800) {
+				stream.readByte();
+			} else if (ver >= 800) {
+				warning("STUB: Movie::loadCastLibMapping(): cast-lib path separator width not verified for version v%d", ver);
+				stream.readByte();
+			} else {
+				stream.readUint16();
+			}
+		}
 		uint16 minMember = stream.readUint16();
 		uint16 maxMember = stream.readUint16();
 		stream.readUint16();


Commit: f2b63cfd6ccd76a61190a708fc68ccc1017c135b
    https://github.com/scummvm/scummvm/commit/f2b63cfd6ccd76a61190a708fc68ccc1017c135b
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Support D7 sound cast members

Changed paths:
    engines/director/castmember/sound.cpp


diff --git a/engines/director/castmember/sound.cpp b/engines/director/castmember/sound.cpp
index 1c8db8cf9b7..0858c9eea47 100644
--- a/engines/director/castmember/sound.cpp
+++ b/engines/director/castmember/sound.cpp
@@ -88,7 +88,7 @@ void SoundCastMember::load() {
 			tag = MKTAG('S', 'N', 'D', ' ');
 			sndId = (uint16)(_castId + _cast->_castIDoffset);
 		}
-	} else if (_cast->_version >= kFileVer600 && _cast->_version < kFileVer700) {
+	} else if (_cast->_version >= kFileVer600 && _cast->_version < kFileVer800) {
 		for (auto &it : _children) {
 			if (it.tag == MKTAG('s', 'n', 'd', ' ')) {
 				sndId = it.index;
@@ -143,7 +143,7 @@ void SoundCastMember::load() {
 		}
 
 	} else {
-		warning("STUB: SoundCastMember::SoundCastMember(): Sounds not yet supported for version v%d (%d)", humanVersion(_cast->_version), _cast->_version);
+		warning("STUB: SoundCastMember::load(): Sounds not yet supported for version v%d (%d)", humanVersion(_cast->_version), _cast->_version);
 	}
 
 


Commit: b4611f63873e457c5cd70d3cae8629590e8f9343
    https://github.com/scummvm/scummvm/commit/b4611f63873e457c5cd70d3cae8629590e8f9343
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Fix D7 MCsL libResourceId truncated to uint16

Changed paths:
    engines/director/archive.cpp
    engines/director/archive.h
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/movie.cpp
    engines/director/movie.h


diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index c50bc441e6c..6b476de0013 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -143,7 +143,7 @@ Common::SeekableReadStreamEndian *Archive::getFirstResource(uint32 tag) {
 	return getResource(tag, getResourceIDList(tag)[0]);
 }
 
-Common::SeekableReadStreamEndian *Archive::getFirstResource(uint32 tag, uint16 parentId) {
+Common::SeekableReadStreamEndian *Archive::getFirstResource(uint32 tag, uint32 parentId) {
 	return getResource(tag, getResourceIDList(tag)[0]);
 }
 
@@ -1022,7 +1022,7 @@ bool RIFXArchive::readAfterburnerMap(Common::SeekableReadStreamEndian &stream, u
 	return true;
 }
 
-void RIFXArchive::readCast(Common::SeekableReadStreamEndian &casStream, uint16 libResourceId) {
+void RIFXArchive::readCast(Common::SeekableReadStreamEndian &casStream, uint32 libResourceId) {
 	int castTag = MKTAG('C', 'A', 'S', 't');
 
 	uint casSize = casStream.size() / 4;
@@ -1100,7 +1100,7 @@ Common::SeekableReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag, bool
 	return getResource(tag, getResourceIDList(tag)[0], fileEndianness);
 }
 
-Common::SeekableReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag, uint16 parentId) {
+Common::SeekableReadStreamEndian *RIFXArchive::getFirstResource(uint32 tag, uint32 parentId) {
 	if (!_keyData.contains(tag))
 		return nullptr;
 	if (!_keyData[tag].contains(parentId))
diff --git a/engines/director/archive.h b/engines/director/archive.h
index e7c6c177528..aaa91867588 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -101,7 +101,7 @@ public:
 	bool hasResource(uint32 tag, const Common::String &resName) const;
 	virtual Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id);
 	virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag);
-	virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, uint16 parentId);
+	virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, uint32 parentId);
 	virtual Resource getResourceDetail(uint32 tag, uint16 id);
 	uint32 getOffset(uint32 tag, uint16 id) const;
 	uint getResourceSize(uint32 tag, uint16 id) const;
@@ -170,7 +170,7 @@ public:
 
 	Common::SeekableReadStreamEndian *getFirstResource(uint32 tag) override;
 	virtual Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, bool fileEndianness);
-	Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, uint16 parentId) override;
+	Common::SeekableReadStreamEndian *getFirstResource(uint32 tag, uint32 parentId) override;
 	Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id) override;
 	virtual Common::SeekableReadStreamEndian *getResource(uint32 tag, uint16 id, bool fileEndianness);
 	Resource getResourceDetail(uint32 tag, uint16 id) override;
@@ -193,7 +193,7 @@ private:
 
 	bool readMemoryMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset, Common::SeekableMemoryWriteStream *dumpStream, uint32 movieStartOffset);
 	bool readAfterburnerMap(Common::SeekableReadStreamEndian &stream, uint32 moreOffset);
-	void readCast(Common::SeekableReadStreamEndian &casStream, uint16 libResourceId);
+	void readCast(Common::SeekableReadStreamEndian &casStream, uint32 libResourceId);
 	void readKeyTable(Common::SeekableReadStreamEndian &keyStream);
 
 	uint32 findParentIndex(uint32 tag, uint16 index);
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index ce7debe6704..1d404368f18 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -64,7 +64,7 @@
 
 namespace Director {
 
-Cast::Cast(Movie *movie, uint16 castLibID, bool isShared, bool isExternal, uint16 libResourceId) {
+Cast::Cast(Movie *movie, uint16 castLibID, bool isShared, bool isExternal, uint32 libResourceId) {
 	_movie = movie;
 	_vm = _movie->getVM();
 	_lingo = _vm->getLingo();
@@ -812,7 +812,7 @@ void Cast::loadCast() {
 
 	// External casts only have one library ID, so instead
 	// we use the movie's mapping.
-	uint16 libResourceId = _isExternal ? 1024 : _libResourceId;
+	uint32 libResourceId = _isExternal ? 1024 : _libResourceId;
 
 	if (cast.size() > 0) {
 		debugC(2, kDebugLoading, "****** Loading CASt resources for libId %d (%s), resourceId %d", _castLibID, _castName.c_str(), libResourceId);
diff --git a/engines/director/cast.h b/engines/director/cast.h
index f8028aa21f6..4ea8e8cfd28 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -87,7 +87,7 @@ struct TilePatternEntry {
 
 class Cast {
 public:
-	Cast(Movie *movie, uint16 castLibID, bool isShared = false, bool isExternal = false, uint16 libResourceId = 1024);
+	Cast(Movie *movie, uint16 castLibID, bool isShared = false, bool isExternal = false, uint32 libResourceId = 1024);
 	~Cast();
 
 	void loadArchive();
@@ -168,7 +168,7 @@ public:
 	Common::SharedPtr<Archive> _castArchive;
 	Common::Platform _platform;
 	uint16 _castLibID;
-	uint16 _libResourceId;
+	uint32 _libResourceId;
 	bool _isExternal;
 
 	CharMap _macCharsToWin;
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 14df9557580..f8b5dc6de54 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -185,8 +185,15 @@ void Movie::loadCastLibMapping(Common::SeekableReadStreamEndian &stream) {
 		}
 		uint16 minMember = stream.readUint16();
 		uint16 maxMember = stream.readUint16();
-		stream.readUint16();
-		uint16 libResourceId = stream.readUint16();
+		uint32 libResourceId;
+		if (g_director->getVersion() >= 700) {
+			// D7+: single 32-bit resource id; verified against a D7 specimen
+			// (0x00010402) that a 16-bit read would truncate.
+			libResourceId = stream.readUint32();
+		} else {
+			stream.readUint16(); // unknown/reserved; 0 in tested D5/D6 movies
+			libResourceId = stream.readUint16();
+		}
 		uint16 libId = i + 1;
 		debugC(5, kDebugLoading, "Movie::loadCastLibMapping: name: %s, path: %s, minMember: %d, maxMember: %d, libResourceId: %d, libId: %d", utf8ToPrintable(name).c_str(), utf8ToPrintable(path).c_str(), minMember, maxMember, libResourceId, libId);
 		Common::SharedPtr<Archive> castArchive = _movieArchive;
@@ -497,7 +504,7 @@ bool Movie::loadCastLibFrom(uint16 libId, Common::Path &filename) {
 		return false;
 	}
 
-	uint16 libResourceId = 1024;
+	uint32 libResourceId = 1024;
 	Common::String name;
 	if (_casts.contains(libId)) {
 		Cast *cast = _casts[libId];
@@ -545,7 +552,7 @@ Cast *Movie::getCast(CastMemberID memberID) {
 	return nullptr;
 }
 
-Cast *Movie::getCastByLibResourceID(int libresourceID) {
+Cast *Movie::getCastByLibResourceID(uint32 libresourceID) {
 	for (auto it : _casts) {
 		if (it._value->_libResourceId == libresourceID) {
 			debugC(3, kDebugSaving, "Movie::getCastByLibResourceID: Found cast with libresourceID: %d", libresourceID);
diff --git a/engines/director/movie.h b/engines/director/movie.h
index b60b5e2dee5..846879ef051 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -105,7 +105,7 @@ public:
 	DirectorEngine *getVM() const { return _vm; }
 	Cast *getCast() const { return _casts.getValOrDefault(DEFAULT_CAST_LIB, nullptr); }
 	Cast *getCast(CastMemberID memberID);
-	Cast *getCastByLibResourceID(int libresourceID);
+	Cast *getCastByLibResourceID(uint32 libresourceID);
 	Cast *getSharedCast() const { return _sharedCast; }
 	const Common::HashMap<int, Cast *> *getCasts() const { return &_casts; }
 	Score *getScore() const { return _score; }


Commit: f60369a0fafc5d981974a9b9041e99e75443de91
    https://github.com/scummvm/scummvm/commit/f60369a0fafc5d981974a9b9041e99e75443de91
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Parse D7 (v700) VWCF config and sound cast info

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 1d404368f18..31bfcad92aa 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -454,18 +454,36 @@ bool Cast::loadConfig() {
 
 	_unk1 = stream->readSint16();
 
-	// Warning for post-D7 movies (unk1 is stageColorG and stageColorB post-D7)
-	if (humanVer >= 700)
-		warning("STUB: Cast::loadConfig: 16 bit unk1 read instead of two 8 bit stageColorG and stageColorB. Read value: %04x", _unk1);
+	// D7+: stageColorG is file byte 18, stageColorB is byte 19 (fixed
+	// offsets, so the split depends on the stream endianness); the raw
+	// 16-bit value is kept for checksum/save
+	if (humanVer >= 700) {
+		if (stream->isBE()) {
+			_D7stageColorG = (_unk1 >> 8) & 0xFF;
+			_D7stageColorB = _unk1 & 0xFF;
+		} else {
+			_D7stageColorG = _unk1 & 0xFF;
+			_D7stageColorB = (_unk1 >> 8) & 0xFF;
+		}
+	}
 
 	_commentFont = stream->readUint16();
 	_commentSize = stream->readUint16();
 	_commentStyle = stream->readUint16();
 	_stageColor = stream->readUint16();
 
-	// Warning for post-D7 movies (stageColor is isStageColorRGB and stageColorR post-D7)
-	if (humanVer >= 700)
-		warning("STUB: Cast::loadConfig: 16 bit stageColor read instead of two 8 bit isStageColorRGB and stageColorR. Read value: %04x", _stageColor);
+	// D7+: stageColorIsRGB is file byte 26, stageColorR is byte 27
+	if (humanVer >= 700) {
+		if (stream->isBE()) {
+			_D7stageColorIsRGB = (_stageColor >> 8) & 0xFF;
+			_D7stageColorR = _stageColor & 0xFF;
+		} else {
+			_D7stageColorIsRGB = _stageColor & 0xFF;
+			_D7stageColorR = (_stageColor >> 8) & 0xFF;
+		}
+		debugC(1, kDebugLoading, "Cast::loadConfig(): D7 stage color: isRGB %d, R %d, G %d, B %d",
+			_D7stageColorIsRGB, _D7stageColorR, _D7stageColorG, _D7stageColorB);
+	}
 
 	_bitdepth = stream->readUint16();
 
@@ -605,6 +623,7 @@ bool Cast::loadConfig() {
 	}
 
 	if (_movieDepth != _vm->_colorDepth) {
+		// TODO: switch Director and WindowManager to the requested color depth
 		warning("STUB: loadConfig(): Movie bit depth is %d, but set to %d", _movieDepth, _vm->_colorDepth);
 	}
 
@@ -1182,10 +1201,16 @@ uint32 Cast::computeChecksum() {
 	check -= (int8)_readRate + 9;
 	check -= _lightswitch + 10;
 
-	if (humanVer < 700)
-		check += _unk1 + 11;
-	else
-		warning("STUB: skipped using stageColorG, stageColorB for post-D7 movie in checksum calulation");
+	int32 operand11;
+	if (humanVer < 700) {
+		operand11 = _unk1;
+	} else {
+		// Reconstructs the int16 Director summed here pre-D7 (ProjectorRays)
+		operand11 = _castArchive->_isBigEndian
+			? (int16)((_D7stageColorG << 8) | _D7stageColorB)
+			: (int16)((_D7stageColorB << 8) | _D7stageColorG);
+	}
+	check += operand11 + 11;
 
 	check *= _commentFont + 12;
 	check += _commentSize + 13;
@@ -1195,10 +1220,8 @@ uint32 Cast::computeChecksum() {
 	else
 		check *= _commentStyle + 14;
 
-	if (humanVer < 700)
-		check += _stageColor + 15;
-	else
-		check += (uint8)(_stageColor & 0xFF) + 15;	// Taking lower 8 bits to take into account stageColorR
+	int32 operand15 = (humanVer < 700) ? _stageColor : _D7stageColorR;
+	check += operand15 + 15;
 
 
 	check += _bitdepth + 16;
@@ -2141,10 +2164,10 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 		}
 	}
 
-	// For SoundCastMember, read the flags in the CastInfo
-	if (_version >= kFileVer400 && _version < kFileVer700 && member->_type == kCastSound) {
+	// Looping = play-once bit (flags & 16) cleared; verified on D7 only
+	if (_version >= kFileVer400 && _version < kFileVer800 && member->_type == kCastSound) {
 		((SoundCastMember *)member)->_looping = castInfo.flags & 16 ? 0 : 1;
-	} else if (_version >= kFileVer700 && member->_type == kCastSound) {
+	} else if (_version >= kFileVer800 && member->_type == kCastSound) {
 		warning("STUB: Cast::loadCastInfo(): Sound cast member info not yet supported for version v%d (%d)", humanVersion(_version), _version);
 	}
 
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 4ea8e8cfd28..1ab81f0ffe5 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -208,10 +208,10 @@ public:
 	// Director 6 and below
 		/* 18 */ int16 _unk1;	// Mentioned in ProjectorRays as preD7field11
 
-	// Director 7 and above
-	// Currently not supporting Director 7
-		// /* 18 */ int8 D7stageColorG;
-		// /* 19 */ int8 D7stageColorB;
+	// Director 7 and above: stageColorG at byte 18, stageColorB at byte 19;
+	// _unk1 keeps the raw 16-bit value for the VWCF checksum and save.
+		/* 18 */ uint8 _D7stageColorG;
+		/* 19 */ uint8 _D7stageColorB;
 
 	/* 20 */ uint16 _commentFont;
 	/* 22 */ uint16 _commentSize;
@@ -219,10 +219,10 @@ public:
 
 	// Director 6 and below
 		/* 26 */ uint16 _stageColor;
-	// Director 7 and above
-	// Currently not supporting Director 7
-		// /* 26 */ uint8 D7stageColorIsRGB;
-		// /* 27 */ uint8 D7stageColorR;
+	// Director 7 and above: stageColorIsRGB at byte 26, stageColorR at
+	// byte 27; _stageColor keeps the raw 16-bit value for checksum and save.
+		/* 26 */ uint8 _D7stageColorIsRGB;
+		/* 27 */ uint8 _D7stageColorR;
 
 	/* 28 */ uint16 _bitdepth;
 	/* 30 */ uint8 _field17;


Commit: 3d86b386b649fd6dec68626d87685233d0015dc0
    https://github.com/scummvm/scummvm/commit/3d86b386b649fd6dec68626d87685233d0015dc0
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-10T07:57:50+02:00

Commit Message:
DIRECTOR: Adopt MCsL resource id for the pre-created internal cast

Changed paths:
    engines/director/movie.cpp


diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index f8b5dc6de54..17473427d3b 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -209,6 +209,12 @@ void Movie::loadCastLibMapping(Common::SeekableReadStreamEndian &stream) {
 		Cast *cast = nullptr;
 		if (_casts.contains(libId)) {
 			cast = _casts.getVal(libId);
+			// The default internal cast is created before the MCsL is parsed;
+			// adopt the authored resource id and name
+			if (!isExternal) {
+				cast->_libResourceId = libResourceId;
+				cast->setCastName(name);
+			}
 		} else {
 			cast = new Cast(this, libId, false, isExternal, libResourceId);
 			cast->setCastName(name);




More information about the Scummvm-git-logs mailing list