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

sev- noreply at scummvm.org
Sat Aug 30 23:07:18 UTC 2025


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

Summary:
a183c9b6c9 DIRECTOR: Relaxed stream complexity on Movie::writeRect()
8b25cebd40 DIRECTOR: Refactor writing EditInfo
19dc761ffb DIRECTOR: Normalized castinfo reading
cbce7eeb32 DIRECTOR: Slight cleanup


Commit: a183c9b6c96b926e0aaf62101eba8bb9d7513aa6
    https://github.com/scummvm/scummvm/commit/a183c9b6c96b926e0aaf62101eba8bb9d7513aa6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-30T21:40:07+02:00

Commit Message:
DIRECTOR: Relaxed stream complexity on Movie::writeRect()

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


diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 007eac375a2..1adcb5ff20f 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -284,7 +284,7 @@ Common::Rect Movie::readRect(Common::ReadStreamEndian &stream) {
 	return rect;
 }
 
-void Movie::writeRect(Common::SeekableWriteStream *writeStream, Common::Rect rect) {
+void Movie::writeRect(Common::WriteStream *writeStream, Common::Rect rect) {
 	writeStream->writeSint16BE(rect.top);
 	writeStream->writeSint16BE(rect.left);
 	writeStream->writeSint16BE(rect.bottom);
diff --git a/engines/director/movie.h b/engines/director/movie.h
index a1378c6abd4..9cf1ae144e1 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -94,7 +94,7 @@ public:
 	static InfoEntries loadInfoEntries(Common::SeekableReadStreamEndian &stream, uint16 version);
 	static void saveInfoEntries(Common::SeekableWriteStream *writeStream, InfoEntries info);
 
-	static void writeRect(Common::SeekableWriteStream *writeStream, Common::Rect rect);
+	static void writeRect(Common::WriteStream *writeStream, Common::Rect rect);
 
 	void loadCastLibMapping(Common::SeekableReadStreamEndian &stream);
 	bool loadArchive();


Commit: 8b25cebd4050e08bab92df584a173fbe3f7866ff
    https://github.com/scummvm/scummvm/commit/8b25cebd4050e08bab92df584a173fbe3f7866ff
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-30T21:40:13+02:00

Commit Message:
DIRECTOR: Refactor writing EditInfo

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 2fcc3186bec..27624ba5f90 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -983,12 +983,7 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 			{
 				castInfo.strings[5].data = (byte *)malloc(castInfo.strings[5].len);
 				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[5].data, castInfo.strings[5].len);
-
-				Movie::writeRect(stream, ci->scriptEditInfo.rect);
-				stream->writeUint32BE(ci->scriptEditInfo.selStart);
-				stream->writeUint32BE(ci->scriptEditInfo.selEnd);
-				stream->writeByte(ci->scriptEditInfo.version);
-				stream->writeByte(ci->scriptEditInfo.rulerFlag);
+				ci->scriptEditInfo.write(stream);
 				delete stream;
 			}
 			break;
@@ -1000,7 +995,6 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[6].data, castInfo.strings[6].len);
 				stream->writeUint16BE(1);			// FIXME: For CastMembers, the count is 1, observed value, need to validate
 				ci->scriptStyle.write(stream);
-
 				delete stream;
 			}
 			break;
@@ -1010,12 +1004,7 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 				castInfo.strings[7].data = (byte *)malloc(castInfo.strings[7].len);
 
 				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[7].data, castInfo.strings[7].len);
-				Movie::writeRect(stream, ci->textEditInfo.rect);
-				stream->writeUint32BE(ci->textEditInfo.selStart);
-				stream->writeUint32BE(ci->textEditInfo.selEnd);
-				stream->writeByte(ci->textEditInfo.version);
-				stream->writeByte(ci->textEditInfo.rulerFlag);
-
+				ci->textEditInfo.write(stream);
 				delete stream;
 			}
 			break;
diff --git a/engines/director/castmember/castmember.cpp b/engines/director/castmember/castmember.cpp
index 17fac718680..c10f285c7e8 100644
--- a/engines/director/castmember/castmember.cpp
+++ b/engines/director/castmember/castmember.cpp
@@ -30,6 +30,14 @@
 
 namespace Director {
 
+void EditInfo::write(Common::WriteStream *stream) {
+	Movie::writeRect(stream, rect);
+	stream->writeUint32BE(selStart);
+	stream->writeUint32BE(selEnd);
+	stream->writeByte(version);
+	stream->writeByte(rulerFlag);
+}
+
 CastMember::CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream) : Object<CastMember>("CastMember") {
 	_type = kCastTypeNull;
 	_cast = cast;
diff --git a/engines/director/castmember/castmember.h b/engines/director/castmember/castmember.h
index 8123fdb91ee..9f0af2e9f6b 100644
--- a/engines/director/castmember/castmember.h
+++ b/engines/director/castmember/castmember.h
@@ -150,6 +150,7 @@ struct EditInfo {
 	bool valid;
 
 	EditInfo(): valid(false) {}
+	void write(Common::WriteStream *stream);
 };
 
 struct CastMemberInfo {


Commit: 19dc761ffb784fc53f976e55fca7a1c37192b4e6
    https://github.com/scummvm/scummvm/commit/19dc761ffb784fc53f976e55fca7a1c37192b4e6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-30T21:40:13+02:00

Commit Message:
DIRECTOR: Normalized castinfo reading

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 27624ba5f90..32b9992d7c6 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -945,12 +945,12 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 	castInfo.scriptId = ci->scriptId;
 	castInfo.strings.resize(ci->count);
 
-	for (int i = 1; i <= ci->count; i++) {
-		castInfo.strings[i - 1].len = getCastInfoStringLength(i, ci);
+	for (int i = 0; i < ci->count; i++) {
+		castInfo.strings[i].len = getCastInfoStringLength(i, ci);
 	}
 
-	for (int i = 1; i <= ci->count; i++) {
-		if (!castInfo.strings[i - 1].len) {
+	for (int i = 0; i < ci->count; i++) {
+		if (!castInfo.strings[i].len) {
 			continue;
 		}
 
@@ -959,27 +959,30 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 			debug("Cast::writeCastInfo()::extra strings found, ignoring");
 			break;
 
-		case 1:
+		case 0:
 			castInfo.strings[0].writeString(ci->script, false);
 			break;
 
-		case 2:
+		case 1:
 			castInfo.strings[1].writeString(ci->name);
 			break;
 
-		case 3:
+		case 2:
 			castInfo.strings[2].writeString(ci->directory);
 			break;
 
-		case 4:
+		case 3:
 			castInfo.strings[3].writeString(ci->fileName);
 			break;
 
-		case 5:
-			castInfo.strings[4].writeString(ci->type);
+		case 4:
+			if (_version < kFileVer500)
+				castInfo.strings[4].writeString(ci->fileType);
+			else
+				castInfo.strings[4].writeString(ci->propInit);
 			break;
 
-		case 6:
+		case 5:
 			{
 				castInfo.strings[5].data = (byte *)malloc(castInfo.strings[5].len);
 				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[5].data, castInfo.strings[5].len);
@@ -988,7 +991,7 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 			}
 			break;
 
-		case 7:
+		case 6:
 			{
 				castInfo.strings[6].data = (byte *)malloc(castInfo.strings[6].len);
 
@@ -999,7 +1002,7 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 			}
 			break;
 
-		case 8:
+		case 7:
 			{
 				castInfo.strings[7].data = (byte *)malloc(castInfo.strings[7].len);
 
@@ -1009,40 +1012,82 @@ void Cast::writeCastInfo(Common::SeekableWriteStream *writeStream, uint32 castId
 			}
 			break;
 
+		case 8:
+			{
+				castInfo.strings[8].data = (byte *)malloc(castInfo.strings[8].len);
+				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[8].data, castInfo.strings[8].len);
+				ci->rteEditInfo.write(stream);
+				delete stream;
+			}
+			break;
+
 		case 9:
-			castInfo.strings[8].data = (byte *)malloc(castInfo.strings[8].len);
-			memcpy(castInfo.strings[8].data, ci->unknown1.data(), castInfo.strings[8].len);
+			castInfo.strings[9].data = (byte *)malloc(castInfo.strings[9].len);
+			memcpy(castInfo.strings[9].data, ci->xtraGuid, castInfo.strings[9].len);
 			break;
 
 		case 10:
-			castInfo.strings[9].data = (byte *)malloc(castInfo.strings[9].len);
-			memcpy(castInfo.strings[9].data, ci->unknown2.data(), castInfo.strings[9].len);
+			castInfo.strings[10].writeString(ci->xtraDisplayName, false);
 			break;
 
 		case 11:
-			castInfo.strings[10].data = (byte *)malloc(castInfo.strings[10].len);
-			memcpy(castInfo.strings[10].data, ci->unknown3.data(), castInfo.strings[10].len);
+			castInfo.strings[11].data = (byte *)malloc(castInfo.strings[11].len);
+			memcpy(castInfo.strings[11].data, ci->bpTable.data(), castInfo.strings[11].len);
 			break;
 
 		case 12:
-			castInfo.strings[11].data = (byte *)malloc(castInfo.strings[11].len);
-			memcpy(castInfo.strings[11].data, ci->unknown4.data(), castInfo.strings[11].len);
+			castInfo.strings[12].data = (byte *)malloc(castInfo.strings[12].len);
+			memcpy(castInfo.strings[12].data, ci->xtraRect.data(), castInfo.strings[12].len);
 			break;
 
 		case 13:
-			castInfo.strings[12].data = (byte *)malloc(castInfo.strings[12].len);
-			memcpy(castInfo.strings[12].data, ci->unknown5.data(), castInfo.strings[12].len);
+			{
+				castInfo.strings[13].data = (byte *)malloc(castInfo.strings[13].len);
+				Common::MemoryWriteStream *stream = new Common::MemoryWriteStream(castInfo.strings[13].data, castInfo.strings[13].len);
+				Movie::writeRect(stream, ci->scriptRect);
+				delete stream;
+			}
 			break;
 
 		case 14:
-			castInfo.strings[13].data = (byte *)malloc(castInfo.strings[13].len);
-			memcpy(castInfo.strings[13].data, ci->unknown6.data(), castInfo.strings[13].len);
+			castInfo.strings[14].data = (byte *)malloc(castInfo.strings[14].len);
+			memcpy(castInfo.strings[14].data, ci->dvWindowInfo.data(), castInfo.strings[14].len);
 			break;
 
 		case 15:
-			castInfo.strings[14].data = (byte *)malloc(castInfo.strings[14].len);
-			memcpy(castInfo.strings[14].data, ci->unknown7.data(), castInfo.strings[14].len);
+			castInfo.strings[15].data = (byte *)malloc(castInfo.strings[15].len);
+			memcpy(castInfo.strings[15].data, ci->guid, castInfo.strings[15].len);
+			break;
+
+		case 16:
+			castInfo.strings[16].writeString(ci->mediaFormatName);
+			break;
+
+		case 17:
+			castInfo.strings[17].data = (byte *)malloc(castInfo.strings[17].len);
+			WRITE_BE_INT32(castInfo.strings[17].data, ci->creationTime);
+			break;
+
+		case 18:
+			castInfo.strings[18].data = (byte *)malloc(castInfo.strings[18].len);
+			WRITE_BE_INT32(castInfo.strings[18].data, ci->modifiedTime);
+			break;
+
+		case 19:
+			castInfo.strings[19].data = (byte *)malloc(castInfo.strings[19].len);
+			castInfo.strings[19].writeString(ci->modifiedBy);
+			break;
+
+		case 20:
+			castInfo.strings[20].data = (byte *)malloc(castInfo.strings[20].len);
+			castInfo.strings[20].writeString(ci->comments);
 			break;
+
+		case 21:
+			castInfo.strings[21].data = (byte *)malloc(castInfo.strings[21].len);
+			WRITE_BE_INT32(castInfo.strings[21].data, ci->imageQuality);
+			break;
+
 		}
 	}
 
@@ -1061,7 +1106,7 @@ uint32 Cast::getCastInfoSize(uint32 castId) {
 	}
 
 	uint32 length = 0;
-	for (int i = 1; i <= ci->count; i++) {
+	for (int i = 0; i < ci->count; i++) {
 		length += getCastInfoStringLength(i, ci);
 	}
 
@@ -1129,62 +1174,91 @@ uint32 Cast::getCastInfoStringLength(uint32 stringIndex, CastMemberInfo *ci) {
 		debug("writeCastMemberInfo:: extra string index out of bound");
 		return 0;
 
-	case 1:
+	case 0:
 		return ci->script.size();		// not pascal string
 
-	case 2:
+	case 1:
 		return ci->name.size() ? ci->name.size() + 1 : 0;		// pascal string
 
-	case 3:
+	case 2:
 		return ci->directory.size() ? ci->directory.size() + 1 : 0;		// pascal string
 
-	case 4:
+	case 3:
 		return ci->fileName.size() ? ci->fileName.size() + 1 : 0;		// pascal string
 
-	case 5:
-		return ci->type.size() ? ci->type.size() + 1 : 0;			// pascal string
+	case 4:
+		if (_version < kFileVer500)
+			return ci->fileType.size() ? ci->fileType.size() + 1 : 0;			// pascal string
+		else
+			return ci->propInit.size() ? ci->propInit.size() + 1 : 0;			// pascal string
 
-	case 6:
+	case 5:
 		// Need a better check to see if the script edit info is valid
 		if (ci->scriptEditInfo.valid) {
 			return 18;		// The length of an edit info
 		}
 		return 0;
 
-	case 7:
+	case 6:
 		// Need a better check to see if scriptStyle is valid
 		if (ci->scriptStyle.fontId) {
 			return 22;		// The length of FontStyle
 		}
 		return 0;
 
-	case 8:
+	case 7:
 		// Need a better check to see if text edit info is valid
 		if (ci->textEditInfo.valid) {
 			return 18;		// The length of an edit info
 		}
 		return 0;
 
+	case 8:
+		// Need a better check to see if text edit info is valid
+		if (ci->rteEditInfo.valid) {
+			return 18;		// The length of an edit info
+		}
+		return 0;
+
 	case 9:
-		return ci->unknown1.size();
+		return sizeof(ci->xtraGuid);
 
 	case 10:
-		return ci->unknown2.size();
+		return ci->xtraDisplayName.size();
 
 	case 11:
-		return ci->unknown3.size();
+		return ci->bpTable.size();
 
 	case 12:
-		return ci->unknown4.size();
+		return ci->xtraRect.size();
 
 	case 13:
-		return ci->unknown5.size();
+		return 8;
 
 	case 14:
-		return ci->unknown6.size();
+		return ci->dvWindowInfo.size();
 
 	case 15:
-		return ci->unknown7.size();
+		return sizeof(ci->guid);
+
+	case 16:
+		return ci->mediaFormatName.size();
+
+	case 17:
+		return 4;
+
+	case 18:
+		return 4;
+
+	case 19:
+		return ci->modifiedBy.size();
+
+	case 20:
+		return ci->comments.size();
+
+	case 21:
+		return sizeof(ci->imageQuality);
+
 	}
 }
 
@@ -1815,69 +1889,135 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	// If possible, we won't store flags
 	ci->flags = castInfo.flags;
 
+	Common::String dumpS;
+
 	// We have here variable number of strings. Thus, instead of
 	// adding tons of ifs, we use this switch()
-	switch (castInfo.strings.size()) {
+	switch ((int)castInfo.strings.size() - 1) {
 	default:
 		warning("Cast::loadCastInfo(): BUILDBOT: extra %d strings for castid %d", castInfo.strings.size() - 15, id);
 		// fallthrough
+	case 21:
+		if (castInfo.strings[21].len != 4) {
+			warning("Cast::loadCastInfo(): BUILDBOT: INCORRECT imageQuality for castid %d", id);
+			Common::hexdump(castInfo.strings[21].data, castInfo.strings[21].len);
+		} else {
+			ci->imageQuality = READ_BE_INT32(castInfo.strings[21].data);
+
+			dumpS = Common::String::format("imageQuality: %d (0x%08X) ", ci->imageQuality, ci->imageQuality) + dumpS;
+		}
+		// fallthrough
+	case 20:
+		ci->comments = castInfo.strings[20].readString();
+		dumpS = Common::String::format("comments: '%s' ", ci->comments.c_str()) + dumpS;
+		// fallthrough
+	case 19:
+		ci->modifiedBy = castInfo.strings[19].readString();
+		dumpS = Common::String::format("modifiedBy: '%s' ", ci->modifiedBy.c_str()) + dumpS;
+		// fallthrough
+	case 18:
+		if (castInfo.strings[18].len != 4) {
+			warning("Cast::loadCastInfo(): BUILDBOT: INCORRECT modifiedTime for castid %d", id);
+			Common::hexdump(castInfo.strings[18].data, castInfo.strings[18].len);
+		} else {
+			ci->modifiedTime = READ_BE_INT32(castInfo.strings[18].data);
+			dumpS = Common::String::format("modifiedTime: %d (0x%08X) ", ci->modifiedTime, ci->modifiedTime) + dumpS;
+		}
+		// fallthrough
+	case 17:
+		if (castInfo.strings[17].len != 4) {
+			warning("Cast::loadCastInfo(): BUILDBOT: INCORRECT creationTime for castid %d", id);
+			Common::hexdump(castInfo.strings[17].data, castInfo.strings[17].len);
+		} else {
+			ci->creationTime = READ_BE_INT32(castInfo.strings[17].data);
+			dumpS = Common::String::format("creationTime: %d (0x%08X) ", ci->creationTime, ci->creationTime) + dumpS;
+		}
+		// fallthrough
+	case 16:
+		ci->mediaFormatName = castInfo.strings[2].readString();
+		dumpS = Common::String::format("mediaFormatName: '%s' ", ci->mediaFormatName.c_str()) + dumpS;
+		// fallthrough
 	case 15:
+		if (castInfo.strings[15].len) {
+			if (castInfo.strings[15].len != 16) {
+				warning("Cast::loadCastInfo(): BUILDBOT: INCORRECT GUID for castid %d", id);
+				Common::hexdump(castInfo.strings[15].data, castInfo.strings[15].len);
+			} else {
+				memcpy(ci->guid, castInfo.strings[15].data, 16);
+				dumpS = "guid: <data> " + dumpS;
+			}
+		}
+		// fallthrough
+	case 14:
 		if (castInfo.strings[14].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 14, id);
+			warning("Cast::loadCastInfo(): BUILDBOT: dvWindowInfo for castid %d", id);
 			Common::hexdump(castInfo.strings[14].data, castInfo.strings[14].len);
-			ci->unknown7 = Common::Array<byte>(castInfo.strings[14].data, castInfo.strings[14].len);
+			ci->dvWindowInfo = Common::Array<byte>(castInfo.strings[14].data, castInfo.strings[14].len);
+
+			dumpS = "dvWindowInfo: <data> " + dumpS;
 		}
 		// fallthrough
-	case 14:
+	case 13:
 		if (castInfo.strings[13].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 13, id);
-			Common::hexdump(castInfo.strings[13].data, castInfo.strings[13].len);
-			ci->unknown6 = Common::Array<byte>(castInfo.strings[13].data, castInfo.strings[13].len);
+			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[13].data, castInfo.strings[13].len, stream.isBE());
+			ci->scriptRect = Movie::readRect(*entryStream);
+			delete entryStream;
+
+			dumpS = Common::String::format("scriptRect: [%d,%d,%d,%d] ", ci->scriptRect.left, ci->scriptRect.top, ci->scriptRect.right, ci->scriptRect.bottom) + dumpS;
 		}
 		// fallthrough
-	case 13:
+	case 12:
 		if (castInfo.strings[12].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 12, id);
+			warning("Cast::loadCastInfo(): BUILDBOT: xtraRect for castid %d", id);
 			Common::hexdump(castInfo.strings[12].data, castInfo.strings[12].len);
-			ci->unknown5 = Common::Array<byte>(castInfo.strings[12].data, castInfo.strings[12].len);
+			ci->xtraRect = Common::Array<byte>(castInfo.strings[12].data, castInfo.strings[12].len);
+
+			dumpS = "xtraRect: <data> " + dumpS;
 		}
 		// fallthrough
-	case 12:
+	case 11:
 		if (castInfo.strings[11].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 11, id);
+			warning("Cast::loadCastInfo(): BUILDBOT: bptable for castid %d", id);
 			Common::hexdump(castInfo.strings[11].data, castInfo.strings[11].len);
-			ci->unknown4 = Common::Array<byte>(castInfo.strings[11].data, castInfo.strings[11].len);
+			ci->bpTable = Common::Array<byte>(castInfo.strings[11].data, castInfo.strings[11].len);
+			dumpS = "bpTable: <data> " + dumpS;
 		}
 		// fallthrough
-	case 11:
+	case 10:
 		if (castInfo.strings[10].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 11, id);
 			Common::hexdump(castInfo.strings[10].data, castInfo.strings[10].len);
-			ci->unknown3 =Common::Array<byte>(castInfo.strings[10].data, castInfo.strings[10].len);
+			ci->xtraDisplayName = castInfo.strings[10].readString(false); // C string
+			dumpS = Common::String::format("xtraDisplayName: '%s' ", ci->xtraDisplayName.c_str()) + dumpS;
 		}
 		// fallthrough
-	case 10:
+	case 9:
 		if (castInfo.strings[9].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 10, id);
-			Common::hexdump(castInfo.strings[9].data, castInfo.strings[9].len);
-			ci->unknown2 = Common::Array<byte>(castInfo.strings[9].data, castInfo.strings[9].len);
+			if (castInfo.strings[9].len != 16) {
+				warning("Cast::loadCastInfo(): BUILDBOT: INCORRECT xtraGUID for castid %d", id);
+				Common::hexdump(castInfo.strings[9].data, castInfo.strings[9].len);
+			} else {
+				memcpy(ci->xtraGuid, castInfo.strings[9].data, 16);
+				dumpS = "xtraGUID: <data> " + dumpS;
+			}
 		}
 		// fallthrough
-	case 9:
+	case 8:
 		if (castInfo.strings[8].len) {
-			warning("Cast::loadCastInfo(): BUILDBOT: string #%d for castid %d", 9, id);
-			Common::hexdump(castInfo.strings[8].data, castInfo.strings[8].len);
-			ci->unknown1 = Common::Array<byte>(castInfo.strings[8].data, castInfo.strings[8].len);
+			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[8].data, castInfo.strings[8].len, stream.isBE());
+			readEditInfo(&ci->rteEditInfo, entryStream);
+			delete entryStream;
+			dumpS = Common::String::format("rteEditInfo: { %s } ", ci->rteEditInfo.toString().c_str()) + dumpS;
 		}
 		// fallthrough
-	case 8:
+	case 7:
 		if (castInfo.strings[7].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[7].data, castInfo.strings[7].len, stream.isBE());
 			readEditInfo(&ci->textEditInfo, entryStream);
 			delete entryStream;
+			dumpS = Common::String::format("textEditInfo: { %s } ", ci->textEditInfo.toString().c_str()) + dumpS;
 		}
 		// fallthrough
-	case 7:
+	case 6:
 		if (castInfo.strings[6].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[6].data, castInfo.strings[6].len, stream.isBE());
 
@@ -1886,35 +2026,57 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 			for (int16 i = 0; i < count; i++)
 				ci->scriptStyle.read(*entryStream, this);
 			delete entryStream;
+
+			dumpS = "scriptStyle: <data> " + dumpS;
 		}
 		// fallthrough
-	case 6:
+	case 5:
 		if (castInfo.strings[5].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[5].data, castInfo.strings[5].len, stream.isBE());
 			readEditInfo(&ci->scriptEditInfo, entryStream);
 			delete entryStream;
+			dumpS = Common::String::format("scriptEditInfo: { %s } ", ci->scriptEditInfo.toString().c_str()) + dumpS;
 		}
 		// fallthrough
-	case 5:
-		ci->type = castInfo.strings[4].readString();
-		// fallthrough
 	case 4:
-		ci->fileName = castInfo.strings[3].readString();
+		// The field changed its meaning in D5
+		if (_version < kFileVer500) {
+			ci->fileType = castInfo.strings[4].readString();
+
+			dumpS = Common::String::format("fileType: '%s' ", ci->fileType.c_str()) + dumpS;
+
+		} else {
+			ci->propInit = castInfo.strings[4].readString();
+
+			dumpS = Common::String::format("propInit: '%s' ", ci->propInit.c_str()) + dumpS;
+		}
 		// fallthrough
 	case 3:
-		ci->directory = castInfo.strings[2].readString();
+		ci->fileName = castInfo.strings[3].readString();
+		dumpS = Common::String::format("fileName: '%s' ", ci->fileName.c_str()) + dumpS;
 		// fallthrough
 	case 2:
-		ci->name = castInfo.strings[1].readString();
+		ci->directory = castInfo.strings[2].readString();
+		dumpS = Common::String::format("directory: '%s' ", ci->directory.c_str()) + dumpS;
 		// fallthrough
 	case 1:
-		ci->script = castInfo.strings[0].readString(false);
+		ci->name = castInfo.strings[1].readString();
+		dumpS = Common::String::format("name: '%s' ", ci->name.c_str()) + dumpS;
 		// fallthrough
 	case 0:
+		ci->script = castInfo.strings[0].readString(false);
+		if (!ci->script.empty()) {
+			dumpS = Common::String::format("script: %d bytes ", ci->script.size()) + dumpS;
+		}
+		// fallthrough
+	case -1:
 		break;
 	}
-	debugC(4, kDebugLoading, "Cast::loadCastInfo(): castId: %d, size: %d, script: %s, name: %s, directory: %s, fileName: %s, type: %s",
-			id, castInfo.strings.size(), ci->script.c_str(), ci->name.c_str(), ci->directory.c_str(), ci->fileName.c_str(), ci->type.c_str());
+
+	if (castInfo.strings.size() > 0)
+		debugC(4, kDebugLoading, "Cast::loadCastInfo(): castId: %d, size: %d, %s", id, castInfo.strings.size(), dumpS.c_str());
+	else
+		debugC(4, kDebugLoading, "Cast::loadCastInfo(): castId: %d, no castinfo", id);
 
 	// For D4+ we may force Lingo scripts
 	if (_version < kFileVer400 || debugChannelSet(-1, kDebugNoBytecode)) {
diff --git a/engines/director/castmember/castmember.h b/engines/director/castmember/castmember.h
index 9f0af2e9f6b..df9cc9772f8 100644
--- a/engines/director/castmember/castmember.h
+++ b/engines/director/castmember/castmember.h
@@ -151,37 +151,54 @@ struct EditInfo {
 
 	EditInfo(): valid(false) {}
 	void write(Common::WriteStream *stream);
+
+	Common::String toString() {
+		return Common::String::format("rect: [%d,%d,%d,%d] selStart: %d selEnd: %d version: %d rulerFlag: %d valid: %d",
+			rect.left, rect.top, rect.right, rect.bottom, selStart, selEnd, version, rulerFlag, valid);
+	}
 };
 
 struct CastMemberInfo {
+	// Header
 	uint32 unk1;
 	uint32 unk2;
 	uint32 flags;
 	uint16 count;
 	bool autoHilite;
 	uint32 scriptId;
-	Common::String script;
+
+	// List items
+	Common::String script;     // 0       (removed on protecting)
 	Common::String name;
 	Common::String directory;
 	Common::String fileName;
-	Common::String type;
-	EditInfo scriptEditInfo;
-	FontStyle scriptStyle;
-	EditInfo textEditInfo;
-	Common::String modifiedBy;
-	Common::String comments;
-
-	// There just has to be a better solution
-	// It is not rare to find these strings in the CastMemberInfo
-	Common::Array<byte> unknown1;
-	Common::Array<byte> unknown2;
-	Common::Array<byte> unknown3;
-	Common::Array<byte> unknown4;
-	Common::Array<byte> unknown5;
-	Common::Array<byte> unknown6;
-	Common::Array<byte> unknown7;
-
-	CastMemberInfo() : autoHilite(false), scriptId(0) {}
+	Common::String fileType;	// 4     pre-D5
+	Common::String propInit;	// 4     post-D5
+	EditInfo scriptEditInfo;	// 5      (removed on protecting)
+	FontStyle scriptStyle;		//        (removed on protecting)
+	EditInfo textEditInfo;		//        (removed on protecting)
+	EditInfo rteEditInfo;		//        (removed on protecting)
+	byte xtraGuid[16];			// 9
+	Common::String xtraDisplayName;
+	Common::Array<byte> bpTable; //       (removed on protecting)
+	Common::Array<byte> xtraRect;		// Rect32
+	Common::Rect scriptRect;	//        (removed on protecting)
+	Common::Array<byte> dvWindowInfo; //  (removed on protecting)
+	byte guid[16];				// 15   Seems to be a GUID
+	Common::String mediaFormatName; // 16 Used by DV cast members to store the media format name
+	uint32 creationTime;		//        (removed on protecting)
+	uint32 modifiedTime;		//        (removed on protecting)
+	Common::String modifiedBy;	//        (removed on protecting)
+	Common::String comments;	// 20     (removed on protecting, but could be retained)
+	uint32 imageQuality;		// 21
+
+	CastMemberInfo() : autoHilite(false), scriptId(0) {
+		memset(xtraGuid, 0, 16);
+		memset(guid, 0, 16);
+		creationTime = 0;
+		modifiedTime = 0;
+		imageQuality = 0;
+	}
 };
 
 } // End of namespace Director


Commit: cbce7eeb32c0ddb759fba2395b1bd6ff8b41442a
    https://github.com/scummvm/scummvm/commit/cbce7eeb32c0ddb759fba2395b1bd6ff8b41442a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-08-31T01:07:00+02:00

Commit Message:
DIRECTOR: Slight cleanup

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


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 32b9992d7c6..06dd7cd665b 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1459,20 +1459,6 @@ void Cast::loadExternalSound(Common::SeekableReadStreamEndian &stream) {
 	g_director->openArchive(resPath);
 }
 
-static void readEditInfo(EditInfo *info, Common::ReadStreamEndian *stream) {
-	info->rect = Movie::readRect(*stream);
-	info->selStart = stream->readUint32();
-	info->selEnd = stream->readUint32();
-	info->version = stream->readByte();
-	info->rulerFlag = stream->readByte();
-	// We're ignoring 2 bytes here
-	info->valid = true;
-	if (debugChannelSet(3, kDebugLoading)) {
-		info->rect.debugPrint(0, "EditInfo: ");
-		debug("selStart: %d  selEnd: %d  version: %d  rulerFlag: %d", info->selStart,info->selEnd, info->version, info->rulerFlag);
-	}
-}
-
 void Cast::loadCastData(Common::SeekableReadStreamEndian &stream, uint16 id, Resource *res) {
 	// IDs are stored as relative to the start of the cast array.
 	id += _castArrayStart;
@@ -2004,7 +1990,7 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	case 8:
 		if (castInfo.strings[8].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[8].data, castInfo.strings[8].len, stream.isBE());
-			readEditInfo(&ci->rteEditInfo, entryStream);
+			ci->rteEditInfo.read(entryStream);
 			delete entryStream;
 			dumpS = Common::String::format("rteEditInfo: { %s } ", ci->rteEditInfo.toString().c_str()) + dumpS;
 		}
@@ -2012,7 +1998,7 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	case 7:
 		if (castInfo.strings[7].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[7].data, castInfo.strings[7].len, stream.isBE());
-			readEditInfo(&ci->textEditInfo, entryStream);
+			ci->textEditInfo.read(entryStream);
 			delete entryStream;
 			dumpS = Common::String::format("textEditInfo: { %s } ", ci->textEditInfo.toString().c_str()) + dumpS;
 		}
@@ -2033,7 +2019,7 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 	case 5:
 		if (castInfo.strings[5].len) {
 			entryStream = new Common::MemoryReadStreamEndian(castInfo.strings[5].data, castInfo.strings[5].len, stream.isBE());
-			readEditInfo(&ci->scriptEditInfo, entryStream);
+			ci->scriptEditInfo.read(entryStream);
 			delete entryStream;
 			dumpS = Common::String::format("scriptEditInfo: { %s } ", ci->scriptEditInfo.toString().c_str()) + dumpS;
 		}
diff --git a/engines/director/castmember/castmember.cpp b/engines/director/castmember/castmember.cpp
index c10f285c7e8..f1c8b12907c 100644
--- a/engines/director/castmember/castmember.cpp
+++ b/engines/director/castmember/castmember.cpp
@@ -30,6 +30,20 @@
 
 namespace Director {
 
+void EditInfo::read(Common::ReadStreamEndian *stream) {
+	rect = Movie::readRect(*stream);
+	selStart = stream->readUint32();
+	selEnd = stream->readUint32();
+	version = stream->readByte();
+	rulerFlag = stream->readByte();
+	// We're ignoring 2 bytes here
+	valid = true;
+	if (debugChannelSet(3, kDebugLoading)) {
+		rect.debugPrint(0, "EditInfo: ");
+		debug("selStart: %d  selEnd: %d  version: %d  rulerFlag: %d", selStart, selEnd, version, rulerFlag);
+	}
+}
+
 void EditInfo::write(Common::WriteStream *stream) {
 	Movie::writeRect(stream, rect);
 	stream->writeUint32BE(selStart);
diff --git a/engines/director/castmember/castmember.h b/engines/director/castmember/castmember.h
index df9cc9772f8..0d332741539 100644
--- a/engines/director/castmember/castmember.h
+++ b/engines/director/castmember/castmember.h
@@ -150,6 +150,7 @@ struct EditInfo {
 	bool valid;
 
 	EditInfo(): valid(false) {}
+	void read(Common::ReadStreamEndian *stream);
 	void write(Common::WriteStream *stream);
 
 	Common::String toString() {




More information about the Scummvm-git-logs mailing list