[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