[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