[Scummvm-git-logs] scummvm master -> 60390b5cdf3048ebabe78697b547f93e40874a6f
sev-
sev at scummvm.org
Tue Jul 14 22:19:56 UTC 2020
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
114aa89b71 DIRECTOR: Switch String arrays to data arrays
a4c796bd00 DIRECTOR: Added debug output to VWFI loading
7fbe5f6a2e DIRECTOR: Process edge cases in loadDataEntries
60390b5cdf DIRECTOR: Load edit info
Commit: 114aa89b71534e34f1170debbcc3c6b07f51c079
https://github.com/scummvm/scummvm/commit/114aa89b71534e34f1170debbcc3c6b07f51c079
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-07-15T00:19:36+02:00
Commit Message:
DIRECTOR: Switch String arrays to data arrays
Changed paths:
engines/director/cast.cpp
engines/director/movie.cpp
engines/director/movie.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index b8d2c80906..884bf62dd2 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -798,13 +798,12 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
free(data);
if (size2 && _vm->getVersion() < 5) {
- uint32 entryType = 0;
- Common::Array<Common::String> castStrings = Movie::loadStrings(stream, entryType, false);
+ Common::Array<DataEntry> castStrings = Movie::loadDataEntries(stream, false);
debugCN(4, kDebugLoading, "Cast::loadCastData(): str(%d): '", castStrings.size());
for (uint i = 0; i < castStrings.size(); i++) {
- debugCN(4, kDebugLoading, "%s'", castStrings[i].c_str());
+ debugCN(4, kDebugLoading, "%s'", castStrings[i].readString().c_str());
if (i != castStrings.size() - 1)
debugCN(4, kDebugLoading, ", '");
}
@@ -819,29 +818,29 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
warning("Cast::loadCastData(): extra %d strings", castStrings.size() - 5);
// fallthrough
case 7:
- ci->comments = castStrings[6];
+ ci->comments = castStrings[6].readString();
// fallthrough
case 6:
- ci->modifiedBy = castStrings[5];
+ ci->modifiedBy = castStrings[5].readString();
// fallthrough
case 5:
- ci->type = castStrings[4];
+ ci->type = castStrings[4].readString();
// fallthrough
case 4:
- ci->fileName = castStrings[3];
+ ci->fileName = castStrings[3].readString();
// fallthrough
case 3:
- ci->directory = castStrings[2];
+ ci->directory = castStrings[2].readString();
// fallthrough
case 2:
- ci->name = castStrings[1];
+ ci->name = castStrings[1].readString();
if (!ci->name.empty()) {
_castsNames[ci->name] = id;
}
// fallthrough
case 1:
- ci->script = castStrings[0];
+ ci->script = castStrings[0].readString();
// fallthrough
case 0:
break;
@@ -973,7 +972,7 @@ void Cast::loadLingoContext(Common::SeekableSubReadStreamEndian &stream) {
script->_id = it->_key;
}
}
-
+
// actually define scripts
for (ScriptContextHash::iterator it = _lingoArchive->lctxContexts.begin(); it != _lingoArchive->lctxContexts.end(); ++it) {
ScriptContext *script = it->_value;
@@ -1037,11 +1036,10 @@ void Cast::dumpScript(const char *script, ScriptType type, uint16 id) {
}
void Cast::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id) {
- uint32 entryType = 0;
- Common::Array<Common::String> castStrings = Movie::loadStrings(stream, entryType);
+ Common::Array<DataEntry> castStrings = Movie::loadDataEntries(stream);
CastMemberInfo *ci = new CastMemberInfo();
- ci->script = castStrings[0];
+ ci->script = castStrings[0].readString();
if (!ci->script.empty() && ConfMan.getBool("dump_scripts"))
dumpScript(ci->script.c_str(), kCastScript, id);
@@ -1049,10 +1047,10 @@ void Cast::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
if (!ci->script.empty())
_lingoArchive->addCode(ci->script.c_str(), kCastScript, id, ci->name.c_str());
- ci->name = getString(castStrings[1]);
- ci->directory = getString(castStrings[2]);
- ci->fileName = getString(castStrings[3]);
- ci->type = castStrings[4];
+ ci->name = castStrings[1].readString();
+ ci->directory = castStrings[2].readString();
+ ci->fileName = castStrings[3].readString();
+ ci->type = castStrings[4].readString();
castStrings.clear();
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 7455b5b94a..91ab466fe3 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -146,47 +146,37 @@ Common::Rect Movie::readRect(Common::ReadStreamEndian &stream) {
return rect;
}
-Common::Array<Common::String> Movie::loadStrings(Common::SeekableSubReadStreamEndian &stream, uint32 &entryType, bool hasHeader) {
- Common::Array<Common::String> strings;
+Common::Array<DataEntry> Movie::loadDataEntries(Common::SeekableSubReadStreamEndian &stream, bool hasHeader) {
+ Common::Array<DataEntry> strings;
uint32 offset = 0;
if (hasHeader) {
offset = stream.readUint32();
/*uint32 unk1 = */ stream.readUint32();
/*uint32 unk2 = */ stream.readUint32();
- entryType = stream.readUint32();
+ /*entryType = */ stream.readUint32();
stream.seek(offset);
}
uint16 count = stream.readUint16() + 1;
- debugC(3, kDebugLoading, "Movie::loadStrings(): Strings: %d entries", count);
+ debugC(3, kDebugLoading, "Movie::loadDataEntry(): DataEntry: %d entries", count);
uint32 *entries = (uint32 *)calloc(count, sizeof(uint32));
for (uint i = 0; i < count; i++)
entries[i] = stream.readUint32();
- byte *data = (byte *)malloc(entries[count - 1]);
- stream.read(data, entries[count - 1]);
+ strings.resize(count);
for (uint16 i = 0; i < count - 1; i++) {
- Common::String entryString;
+ strings[i].len = entries[i + 1] - entries[i];
+ strings[i].data = (byte *)malloc(strings[i].len);
+ stream.read(strings[i].data, strings[i].len);
- uint start = i == 1 ? entries[i] + 1 : entries[i]; // Skip first byte which is string length
-
- for (uint j = start; j < entries[i + 1]; j++)
- if (data[j] == '\r')
- entryString += '\n';
- else if (data[j] >= 0x20)
- entryString += data[j];
-
- strings.push_back(entryString);
-
- debugC(6, kDebugLoading, "String %d:\n%s\n", i, Common::toPrintable(entryString).c_str());
+ debugC(6, kDebugLoading, "DataEntry %d: %d bytes", i, strings[i].len);
}
- free(data);
free(entries);
return strings;
@@ -195,8 +185,8 @@ Common::Array<Common::String> Movie::loadStrings(Common::SeekableSubReadStreamEn
void Movie::loadFileInfo(Common::SeekableSubReadStreamEndian &stream) {
debugC(2, kDebugLoading, "****** Loading FileInfo VWFI");
- Common::Array<Common::String> fileInfoStrings = Movie::loadStrings(stream, _flags);
- _script = fileInfoStrings[0];
+ Common::Array<DataEntry> fileInfoStrings = Movie::loadDataEntries(stream);
+ _script = fileInfoStrings[0].readString();
if (!_script.empty() && ConfMan.getBool("dump_scripts"))
_cast->dumpScript(_script.c_str(), kMovieScript, _cast->_movieScriptCount);
@@ -205,9 +195,9 @@ void Movie::loadFileInfo(Common::SeekableSubReadStreamEndian &stream) {
_cast->_lingoArchive->addCode(_script.c_str(), kMovieScript, _cast->_movieScriptCount);
_cast->_movieScriptCount++;
- _changedBy = fileInfoStrings[1];
- _createdBy = fileInfoStrings[2];
- _directory = fileInfoStrings[3];
+ _changedBy = fileInfoStrings[1].readString();
+ _createdBy = fileInfoStrings[2].readString();
+ _directory = fileInfoStrings[3].readString();
}
void Movie::clearSharedCast() {
diff --git a/engines/director/movie.h b/engines/director/movie.h
index e5ff8b7685..8335cc561e 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -41,13 +41,36 @@ class ScriptContext;
class Stage;
struct Symbol;
+struct DataEntry {
+ uint32 len;
+ byte *data;
+
+ DataEntry() { len = 0; data = nullptr; }
+
+ ~DataEntry() {
+ free(data);
+ }
+
+ Common::String readString() {
+ Common::String res;
+
+ for (uint i = 1; i < len; i++)
+ if (data[i] == '\r')
+ res += '\n';
+ else if (data[i] >= 0x20)
+ res += data[i];
+
+ return res;
+ }
+};
+
class Movie {
public:
Movie(Stage *stage);
~Movie();
static Common::Rect readRect(Common::ReadStreamEndian &stream);
- static Common::Array<Common::String> loadStrings(Common::SeekableSubReadStreamEndian &stream, uint32 &entryType, bool hasHeader = true);
+ static Common::Array<DataEntry> loadDataEntries(Common::SeekableSubReadStreamEndian &stream, bool hasHeader = true);
bool loadArchive();
void setArchive(Archive *archive);
Commit: a4c796bd009fac9ecef2b3fdb87f73c5b4856d25
https://github.com/scummvm/scummvm/commit/a4c796bd009fac9ecef2b3fdb87f73c5b4856d25
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-07-15T00:19:36+02:00
Commit Message:
DIRECTOR: Added debug output to VWFI loading
Changed paths:
engines/director/movie.cpp
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 91ab466fe3..0e456d37b7 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -186,7 +186,7 @@ void Movie::loadFileInfo(Common::SeekableSubReadStreamEndian &stream) {
debugC(2, kDebugLoading, "****** Loading FileInfo VWFI");
Common::Array<DataEntry> fileInfoStrings = Movie::loadDataEntries(stream);
- _script = fileInfoStrings[0].readString();
+ _script = Common::String((const char *)fileInfoStrings[0].data, fileInfoStrings[0].len);
if (!_script.empty() && ConfMan.getBool("dump_scripts"))
_cast->dumpScript(_script.c_str(), kMovieScript, _cast->_movieScriptCount);
@@ -197,7 +197,25 @@ void Movie::loadFileInfo(Common::SeekableSubReadStreamEndian &stream) {
_cast->_movieScriptCount++;
_changedBy = fileInfoStrings[1].readString();
_createdBy = fileInfoStrings[2].readString();
- _directory = fileInfoStrings[3].readString();
+ _createdBy = fileInfoStrings[3].readString();
+ uint16 preload;
+ if (stream.isBE())
+ preload = READ_BE_INT16(fileInfoStrings[4].data);
+ else
+ preload = READ_LE_INT16(fileInfoStrings[4].data);
+
+ if (debugChannelSet(3, kDebugLoading)) {
+ debug("VWFI: script: '%s'", _script.c_str());
+ debug("VWFI: changed by: '%s'", _changedBy.c_str());
+ debug("VWFI: created by: '%s'", _createdBy.c_str());
+ debug("VWFI: directory: '%s'", _createdBy.c_str());
+ debug("VWFI: preload: %d (0x%x)", preload, preload);
+
+ for (uint i = 5; i < fileInfoStrings.size(); i++) {
+ debug("VWFI: entry %d (%d bytes)", i, fileInfoStrings[i].len);
+ Common::hexdump(fileInfoStrings[i].data, fileInfoStrings[i].len);
+ }
+ }
}
void Movie::clearSharedCast() {
Commit: 7fbe5f6a2e3e6b7debfa98f06a139068821fd44b
https://github.com/scummvm/scummvm/commit/7fbe5f6a2e3e6b7debfa98f06a139068821fd44b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-07-15T00:19:36+02:00
Commit Message:
DIRECTOR: Process edge cases in loadDataEntries
Changed paths:
engines/director/movie.cpp
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 0e456d37b7..bea106c128 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -160,14 +160,17 @@ Common::Array<DataEntry> Movie::loadDataEntries(Common::SeekableSubReadStreamEnd
uint16 count = stream.readUint16() + 1;
- debugC(3, kDebugLoading, "Movie::loadDataEntry(): DataEntry: %d entries", count);
+ debugC(3, kDebugLoading, "Movie::loadDataEntries(): DataEntry: %d entries", count - 1);
+
+ if (count == 1)
+ return strings;
uint32 *entries = (uint32 *)calloc(count, sizeof(uint32));
for (uint i = 0; i < count; i++)
entries[i] = stream.readUint32();
- strings.resize(count);
+ strings.resize(count - 1);
for (uint16 i = 0; i < count - 1; i++) {
strings[i].len = entries[i + 1] - entries[i];
Commit: 60390b5cdf3048ebabe78697b547f93e40874a6f
https://github.com/scummvm/scummvm/commit/60390b5cdf3048ebabe78697b547f93e40874a6f
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-07-15T00:19:36+02:00
Commit Message:
DIRECTOR: Load edit info
Changed paths:
engines/director/cast.cpp
engines/director/castmember.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 884bf62dd2..bdf3e6e553 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -667,6 +667,19 @@ void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
}
}
+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();
+
+ 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::SeekableSubReadStreamEndian &stream, uint16 id, Resource *res) {
// IDs are stored as relative to the start of the cast array.
id += _castArrayStart;
@@ -810,18 +823,33 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
debugC(4, kDebugLoading, "'");
CastMemberInfo *ci = new CastMemberInfo();
+ Common::MemoryReadStreamEndian *entryStream;
// We have here variable number of strings. Thus, instead of
// adding tons of ifs, we use this switch()
switch (castStrings.size()) {
default:
- warning("Cast::loadCastData(): extra %d strings", castStrings.size() - 5);
+ warning("Cast::loadCastData(): extra %d strings", castStrings.size() - 8);
+ // fallthrough
+ case 8:
+ if (castStrings[7].len) {
+ entryStream = new Common::MemoryReadStreamEndian(castStrings[7].data, castStrings[7].len, stream.isBE());
+ readEditInfo(&ci->textEditInfo, entryStream);
+ delete entryStream;
+ }
// fallthrough
case 7:
- ci->comments = castStrings[6].readString();
+ if (castStrings[6].len) {
+ warning("Cast::loadCastData(): STUB: scriptStyle (%d bytes)", castStrings[6].len);
+ Common::hexdump(castStrings[6].data, castStrings[6].len);
+ }
// fallthrough
case 6:
- ci->modifiedBy = castStrings[5].readString();
+ if (castStrings[5].len) {
+ entryStream = new Common::MemoryReadStreamEndian(castStrings[5].data, castStrings[5].len, stream.isBE());
+ readEditInfo(&ci->scriptEditInfo, entryStream);
+ delete entryStream;
+ }
// fallthrough
case 5:
ci->type = castStrings[4].readString();
@@ -840,7 +868,7 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
}
// fallthrough
case 1:
- ci->script = castStrings[0].readString();
+ ci->script = Common::String((const char *)castStrings[0].data, castStrings[0].len);
// fallthrough
case 0:
break;
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index d96ef1e3b7..eb1a687493 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -213,12 +213,23 @@ public:
void loadChunks();
};
+struct EditInfo {
+ Common::Rect rect;
+ int32 selStart;
+ int32 selEnd;
+ byte version;
+ byte rulerFlag;
+};
+
struct CastMemberInfo {
Common::String script;
Common::String name;
Common::String directory;
Common::String fileName;
Common::String type;
+ EditInfo scriptEditInfo;
+ // scriptStyle
+ EditInfo textEditInfo;
Common::String modifiedBy;
Common::String comments;
};
More information about the Scummvm-git-logs
mailing list