[Scummvm-git-logs] scummvm master -> 87e8a7bb7cd4ea9d907c0bf002a8a3c9dd58ae8e

sev- noreply at scummvm.org
Fri Dec 2 23:24:42 UTC 2022


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:
41c69d087f DIRECTOR: LINGO: Generalized resolving palette names
97b7cb60fd DIRECTOR: Added API for referring to the cast members by name and type
21c77c7a65 DIRECTOR: Cache cast members by name and type
87e8a7bb7c DIRECTOR: LINGO: Search sounds by name AND type


Commit: 41c69d087f8b9d6e769027152ec2d483dfa1860a
    https://github.com/scummvm/scummvm/commit/41c69d087f8b9d6e769027152ec2d483dfa1860a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-12-03T00:24:18+01:00

Commit Message:
DIRECTOR: LINGO: Generalized resolving palette names

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 406b90cb7ea..1ebc97c6976 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2263,6 +2263,35 @@ void LB::b_pasteClipBoardInto(int nargs) {
 	}
 }
 
+static const struct PaletteNames {
+	const char *name;
+	PaletteType type;
+} paletteNames[] = {
+	{ "System", kClutSystemMac },
+	{ "System - Mac", kClutSystemMac },
+	{ "Rainbow", kClutRainbow },
+	{ "Grayscale", kClutGrayscale },
+	{ "Pastels", kClutPastels },
+	{ "Vivid", kClutVivid },
+	{ "NTSC", kClutNTSC },
+	{ "Metallic", kClutMetallic },
+	//{ "Web 216", },
+	//{ "VGA", },
+	//{ "System - Win", },
+	{ "SYSTEM - WIN (DIR 4)", kClutSystemWin },
+
+	// Japanese palette names.
+	// TODO: Check encoding. Original is SJIS
+	{ "\x83V\x83X\x83""e\x83\x80 - Mac", kClutSystemMac },				// システム - Mac
+	{ "\x83\x8C>\x83""C\x83\x93\x83{\x81[", kClutRainbow },				// レインボー
+	{ "\x83O\x83>\x8C\x81[\x83X\x83P\x81[\x83\x8B", kClutGrayscale },	// グレースケール
+	{ "\x83p\x83>X\x83""e\x83\x8B", kClutPastels },						// パステル
+	{ "\x83r\x83>r\x83""b\x83h", kClutVivid },							// ビビッド
+	{ "\x83\x81\x83^\x83\x8A\x83""b\x83N", kClutMetallic },				// メタリック
+	// { "\x83V\x83X\x83""e\x83\x80 - Win", },							// システム - Win
+	{ "\x83V\x83X\x83""e\x83\x80 - Win (Dir 4)", kClutSystemWin },		// システム - Win (Dir 4)
+};
+
 void LB::b_puppetPalette(int nargs) {
 	g_lingo->convertVOIDtoString(0, nargs);
 	int numFrames = 0, speed = 0, palette = 0;
@@ -2282,18 +2311,10 @@ void LB::b_puppetPalette(int nargs) {
 		if (d.type == STRING) {
 			// TODO: It seems that there are not strings for Mac and Win system palette
 			Common::String palStr = d.asString();
-			if (palStr.equalsIgnoreCase("Rainbow")) {
-				palette = kClutRainbow;
-			} else if (palStr.equalsIgnoreCase("Grayscale")) {
-				palette = kClutGrayscale;
-			} else if (palStr.equalsIgnoreCase("Pastels")) {
-				palette = kClutPastels;
-			} else if (palStr.equalsIgnoreCase("Vivid")) {
-				palette = kClutVivid;
-			} else if (palStr.equalsIgnoreCase("NTSC")) {
-				palette = kClutNTSC;
-			} else if (palStr.equalsIgnoreCase("Metallic")) {
-				palette = kClutMetallic;
+
+			for (int i = 0; i < ARRAYSIZE(paletteNames); i++) {
+				if (palStr.equalsIgnoreCase(paletteNames[i].name))
+					palette = paletteNames[i].type;
 			}
 		}
 		if (!palette) {


Commit: 97b7cb60fdde9573869bc8ababf05c91865fa01e
    https://github.com/scummvm/scummvm/commit/97b7cb60fdde9573869bc8ababf05c91865fa01e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-12-03T00:24:18+01:00

Commit Message:
DIRECTOR: Added API for referring to the cast members by name and type

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h
    engines/director/movie.cpp
    engines/director/movie.h
    engines/director/types.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 245aee83e44..110d90bb185 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -133,11 +133,18 @@ void Cast::releaseCastMemberWidget() {
 			it->_value->releaseWidget();
 }
 
-CastMember *Cast::getCastMemberByName(const Common::String &name) {
+CastMember *Cast::getCastMemberByNameAndType(const Common::String &name, CastType type) {
 	CastMember *result = nullptr;
 
-	if (_castsNames.contains(name)) {
-		result = _loadedCast->getVal(_castsNames[name]);
+	if (type == kCastTypeAny) {
+		if (_castsNames.contains(name)) {
+			result = _loadedCast->getVal(_castsNames[name]);
+		}
+	} else {
+		Common::String cname = Common::String::format("%s:%d", name.c_str(), type);
+
+		if (_castsNames.contains(cname))
+			result = _loadedCast->getVal(_castsNames[cname]);
 	}
 	return result;
 }
diff --git a/engines/director/cast.h b/engines/director/cast.h
index aec5ab69a9b..abf7bacef63 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -106,7 +106,7 @@ public:
 	CastMember *setCastMember(CastMemberID castId, CastMember *cast);
 	bool eraseCastMember(CastMemberID castId);
 	CastMember *getCastMember(int castId);
-	CastMember *getCastMemberByName(const Common::String &name);
+	CastMember *getCastMemberByNameAndType(const Common::String &name, CastType type);
 	CastMember *getCastMemberByScriptId(int scriptId);
 	CastMemberInfo *getCastMemberInfo(int castId);
 	const Stxt *getStxt(int castId);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 249b7a9b3ac..8152d4c201f 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1114,11 +1114,11 @@ Common::String Datum::asString(bool printonly) const {
 	return s;
 }
 
-CastMemberID Datum::asMemberID() const {
+CastMemberID Datum::asMemberID(CastType castType) const {
 	if (type == CASTREF || type == FIELDREF)
 		return *u.cast;
 
-	return g_lingo->resolveCastMember(*this, 0);
+	return g_lingo->resolveCastMember(*this, 0, castType);
 }
 
 Common::Point Datum::asPoint() const {
@@ -1649,7 +1649,7 @@ Common::U32String Lingo::evalChunkRef(const Datum &var) {
 	return result;
 }
 
-CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLib) {
+CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLib, CastType type) {
 	Movie *movie = g_director->getCurrentMovie();
 	if (!movie) {
 		warning("Lingo::resolveCastMember: No movie");
@@ -1659,7 +1659,7 @@ CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLi
 	switch (memberID.type) {
 	case STRING:
 		{
-			CastMember *member = movie->getCastMemberByName(memberID.asString(), castLib.asInt());
+			CastMember *member = movie->getCastMemberByNameAndType(memberID.asString(), castLib.asInt(), type);
 			if (member)
 				return CastMemberID(member->getID(), castLib.asInt());
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index c7014a54590..e189b016357 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -168,7 +168,7 @@ struct Datum {	/* interpreter stack type */
 	double asFloat() const;
 	int asInt() const;
 	Common::String asString(bool printonly = false) const;
-	CastMemberID asMemberID() const;
+	CastMemberID asMemberID(CastType castType = kCastTypeAny) const;
 	Common::Point asPoint() const;
 
 	bool isRef() const;
@@ -358,7 +358,7 @@ public:
 	Datum varFetch(const Datum &var, bool silent = false);
 	Common::U32String evalChunkRef(const Datum &var);
 	Datum findVarV4(int varType, const Datum &id);
-	CastMemberID resolveCastMember(const Datum &memberID, const Datum &castLib);
+	CastMemberID resolveCastMember(const Datum &memberID, const Datum &castLib, CastType type);
 	void exposeXObject(const char *name, Datum obj);
 
 	int getAlignedType(const Datum &d1, const Datum &d2, bool numsOnly);
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 8e82d17da48..29c7e801f43 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -350,15 +350,15 @@ bool Movie::eraseCastMember(CastMemberID memberID) {
 	return false;
 }
 
-CastMember *Movie::getCastMemberByName(const Common::String &name, int castLib) {
+CastMember *Movie::getCastMemberByNameAndType(const Common::String &name, int castLib, CastType type) {
 	CastMember *result = nullptr;
 	if (_casts.contains(castLib)) {
-		result = _casts.getVal(castLib)->getCastMemberByName(name);
+		result = _casts.getVal(castLib)->getCastMemberByNameAndType(name, type);
 		if (result == nullptr && _sharedCast) {
-			result = _sharedCast->getCastMemberByName(name);
+			result = _sharedCast->getCastMemberByNameAndType(name, type);
 		}
 	} else {
-		warning("Movie::getCastMemberByName: Unknown castLib %d", castLib);
+		warning("Movie::getCastMemberByNameAndType: Unknown castLib %d", castLib);
 	}
 	return result;
 }
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 01efcc0318b..77af1a8dbc1 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -104,7 +104,7 @@ public:
 	CastMember *getCastMember(CastMemberID memberID);
 	CastMember *createOrReplaceCastMember(CastMemberID memberID, CastMember *cast);
 	bool eraseCastMember(CastMemberID memberID);
-	CastMember *getCastMemberByName(const Common::String &name, int castLib);
+	CastMember *getCastMemberByNameAndType(const Common::String &name, int castLib, CastType type);
 	CastMemberInfo *getCastMemberInfo(CastMemberID memberID);
 	const Stxt *getStxt(CastMemberID memberID);
 
diff --git a/engines/director/types.h b/engines/director/types.h
index 718c04bf145..c95bd5fa197 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -31,6 +31,7 @@ enum MovieFlag {
 };
 
 enum CastType {
+	kCastTypeAny = -1,
 	kCastTypeNull = 0,
 	kCastBitmap = 1,
 	kCastFilmLoop = 2,


Commit: 21c77c7a65ccb988b136f44bcc0d88c70514f804
    https://github.com/scummvm/scummvm/commit/21c77c7a65ccb988b136f44bcc0d88c70514f804
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-12-03T00:24:18+01:00

Commit Message:
DIRECTOR: Cache cast members by name and type

Changed paths:
    engines/director/cast.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 110d90bb185..79ce2feb78c 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -1317,6 +1317,7 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 
 	CastMemberInfo *ci = new CastMemberInfo();
 	Common::MemoryReadStreamEndian *entryStream;
+	CastMember *member = _loadedCast->getVal(id);
 
 	// We have here variable number of strings. Thus, instead of
 	// adding tons of ifs, we use this switch()
@@ -1365,8 +1366,14 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 			// Multiple casts can have the same name. In director only the first one is used.
 			if (!_castsNames.contains(ci->name)) {
 				_castsNames[ci->name] = id;
+			}
+
+			// Store name with type
+			Common::String cname = Common::String::format("%s:%d", ci->name.c_str(), member->_type);
+			if (!_castsNames.contains(cname)) {
+				_castsNames[cname] = id;
 			} else {
-				debugC(4, kDebugLoading, "Cast::loadCastInfo(): duplicate cast name: %s for castIDs: %s %s", ci->name.c_str(), numToCastNum(id), numToCastNum(_castsNames[ci->name]));
+				debugC(4, kDebugLoading, "Cast::loadCastInfo(): duplicate cast name: %s for castIDs: %s %s", cname.c_str(), numToCastNum(id), numToCastNum(_castsNames[ci->name]));
 			}
 		}
 		// fallthrough
@@ -1377,7 +1384,6 @@ void Cast::loadCastInfo(Common::SeekableReadStreamEndian &stream, uint16 id) {
 		break;
 	}
 
-	CastMember *member = _loadedCast->getVal(id);
 	// For D4+ we may force Lingo scripts
 	if (_version < kFileVer400 || debugChannelSet(-1, kDebugNoBytecode)) {
 		if (!ci->script.empty()) {


Commit: 87e8a7bb7cd4ea9d907c0bf002a8a3c9dd58ae8e
    https://github.com/scummvm/scummvm/commit/87e8a7bb7cd4ea9d907c0bf002a8a3c9dd58ae8e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-12-03T00:24:18+01:00

Commit Message:
DIRECTOR: LINGO: Search sounds by name AND type

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 1ebc97c6976..9e0543899cc 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2371,7 +2371,7 @@ void LB::b_puppetSound(int nargs) {
 	// So we'll just queue it to be played later.
 
 	if (nargs == 1) {
-		CastMemberID castMember = g_lingo->pop().asMemberID();
+		CastMemberID castMember = g_lingo->pop().asMemberID(kCastSound);
 
 		// in D2 manual p206, puppetSound 0 will turn off the puppet status of sound
 		sound->setPuppetSound(castMember, 1);




More information about the Scummvm-git-logs mailing list