[Scummvm-git-logs] scummvm master -> 05b6bb2021afd4f655124fe450a17d8ee91af264

djsrv dservilla at gmail.com
Thu Jul 2 15:41:39 UTC 2020


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

Summary:
64fdff14eb DIRECTOR: Initialize cast members w/ cast and ID
4977b640e6 DIRECTOR: Remove old ShapeCastMember constructor
05b6bb2021 DIRECTOR: Add Cast convenience methods


Commit: 64fdff14ebc9613f503e8bcc1805791d9738a478
    https://github.com/scummvm/scummvm/commit/64fdff14ebc9613f503e8bcc1805791d9738a478
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-02T11:40:22-04:00

Commit Message:
DIRECTOR: Initialize cast members w/ cast and ID

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 5763d9d71d..0cae5fb724 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -31,16 +31,18 @@
 
 namespace Director {
 
-CastMember::CastMember() {
+CastMember::CastMember(Cast* cast, uint16 castId) {
 	_type = kCastTypeNull;
-	_cast = nullptr;
+	_cast = cast;
+	_castId = castId;
 	_widget = nullptr;
 	_hilite = false;
 
 	_modified = true;
 }
 
-BitmapCastMember::BitmapCastMember(Common::ReadStreamEndian &stream, uint32 castTag, uint16 version) {
+BitmapCastMember::BitmapCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint32 castTag, uint16 version)
+		: CastMember(cast, castId) {
 	_type = kCastBitmap;
 	_img = nullptr;
 	_bytes = 0;
@@ -133,7 +135,8 @@ void BitmapCastMember::createWidget() {
 	_widget->getSurface()->blitFrom(*_img->getSurface());
 }
 
-DigitalVideoCastMember::DigitalVideoCastMember(Common::ReadStreamEndian &stream, uint16 version) {
+DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
+		: CastMember(cast, castId) {
 	_type = kCastDigitalVideo;
 
 	if (version < 4) {
@@ -177,7 +180,8 @@ DigitalVideoCastMember::DigitalVideoCastMember(Common::ReadStreamEndian &stream,
 	}
 }
 
-SoundCastMember::SoundCastMember(Common::ReadStreamEndian &stream, uint16 version) {
+SoundCastMember::SoundCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
+		: CastMember(cast, castId) {
 	_type = kCastSound;
 	_audio = nullptr;
 	_looping = 0;
@@ -190,7 +194,8 @@ SoundCastMember::SoundCastMember(Common::ReadStreamEndian &stream, uint16 versio
 	}
 }
 
-TextCastMember::TextCastMember(Common::ReadStreamEndian &stream, uint16 version, bool asButton) {
+TextCastMember::TextCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version, bool asButton)
+		: CastMember(cast, castId) {
 	_type = kCastText;
 
 	_borderSize = kSizeNone;
@@ -465,7 +470,8 @@ bool TextCastMember::setEditable(bool editable) {
 	return true;
 }
 
-ShapeCastMember::ShapeCastMember(Common::ReadStreamEndian &stream, uint16 version) {
+ShapeCastMember::ShapeCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
+		: CastMember(cast, castId) {
 	_type = kCastShape;
 
 	byte flags, unk1;
@@ -520,7 +526,7 @@ ShapeCastMember::ShapeCastMember(Common::ReadStreamEndian &stream, uint16 versio
 		_initialRect.debugPrint(0, "ShapeCastMember: rect:");
 }
 
-ShapeCastMember::ShapeCastMember() {
+ShapeCastMember::ShapeCastMember(Cast *cast, uint16 castId) : CastMember(cast, castId) {
 	_shapeType = kShapeRectangle;
 	_pattern = 0;
 	_fgCol = 0;
@@ -531,7 +537,8 @@ ShapeCastMember::ShapeCastMember() {
 	_ink = kInkTypeCopy;
 }
 
-ScriptCastMember::ScriptCastMember(Common::ReadStreamEndian &stream, uint16 version) {
+ScriptCastMember::ScriptCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
+		: CastMember(cast, castId) {
 	_type = kCastLingoScript;
 	_scriptType = kNoneScript;
 
@@ -577,7 +584,8 @@ ScriptCastMember::ScriptCastMember(Common::ReadStreamEndian &stream, uint16 vers
 	}
 }
 
-RTECastMember::RTECastMember(Common::ReadStreamEndian &stream, uint16 version) : TextCastMember(stream, version) {
+RTECastMember::RTECastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
+		: TextCastMember(cast, castId, stream, version) {
 
 	_type = kCastRTE;
 }
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 6abf607135..39ab2e5029 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -52,8 +52,12 @@ struct Resource;
 
 class CastMember {
 public:
-	CastMember();
+	CastMember(Cast *cast, uint16 castId);
 	virtual ~CastMember() {};
+
+	Cast *getCast() { return _cast; }
+	uint16 getID() { return _castId; }
+
 	virtual bool isEditable() { return false; }
 	virtual bool setEditable(bool editable) { return false; }
 	virtual bool isModified() { return _modified; }
@@ -63,7 +67,6 @@ public:
 	virtual void getColors(int *fgcolor, int *bgcolor) { return; }
 
 	CastType _type;
-	Cast *_cast;
 	Common::Rect _initialRect;
 	Common::Rect _boundingRect;
 	Common::Array<Resource> _children;
@@ -72,11 +75,15 @@ public:
 	bool _hilite;
 
 	Graphics::MacWidget *_widget;
+
+private:
+	Cast *_cast;
+	uint16 _castId;
 };
 
 class BitmapCastMember : public CastMember {
 public:
-	BitmapCastMember(Common::ReadStreamEndian &stream, uint32 castTag, uint16 version);
+	BitmapCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint32 castTag, uint16 version);
 	~BitmapCastMember();
 	virtual void createWidget() override;
 	// virtual void setColors(int *fgcolor, int *bgcolor) override;
@@ -97,7 +104,7 @@ public:
 
 class DigitalVideoCastMember : public CastMember {
 public:
-	DigitalVideoCastMember(Common::ReadStreamEndian &stream, uint16 version);
+	DigitalVideoCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
 
 	bool _looping;
 	bool _pauseAtStart;
@@ -114,7 +121,7 @@ public:
 
 class SoundCastMember : public CastMember {
 public:
-	SoundCastMember(Common::ReadStreamEndian &stream, uint16 version);
+	SoundCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
 
 	bool _looping;
 	AudioDecoder *_audio;
@@ -122,8 +129,8 @@ public:
 
 class ShapeCastMember : public CastMember {
 public:
-	ShapeCastMember(Common::ReadStreamEndian &stream, uint16 version);
-	ShapeCastMember();
+	ShapeCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
+	ShapeCastMember(Cast *cast, uint16 castId);
 
 	ShapeType _shapeType;
 	uint16 _pattern;
@@ -137,7 +144,7 @@ public:
 
 class TextCastMember : public CastMember {
 public:
-	TextCastMember(Common::ReadStreamEndian &stream, uint16 version, bool asButton = false);
+	TextCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version, bool asButton = false);
 	virtual void setColors(int *fgcolor, int *bgcolor) override;
 	virtual void getColors(int *fgcolor, int *bgcolor) override;
 
@@ -182,7 +189,7 @@ private:
 
 class ScriptCastMember : public CastMember {
 public:
-	ScriptCastMember(Common::ReadStreamEndian &stream, uint16 version);
+	ScriptCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
 
 	uint32 _id;
 	ScriptType _scriptType;
@@ -190,7 +197,7 @@ public:
 
 class RTECastMember : public TextCastMember {
 public:
-	RTECastMember(Common::ReadStreamEndian &stream, uint16 version);
+	RTECastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
 
 	void loadChunks();
 };
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 182a4b45db..30710f812f 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -889,7 +889,7 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 		if (member->_type == kCastLingoScript)
 			scriptType = ((ScriptCastMember *)member)->_scriptType;
 
-		CastMemberInfo *info = member->_cast->_castsInfo[castId];
+		CastMemberInfo *info = member->getCast()->_castsInfo[castId];
 		if (info)
 			castName = info->name;
 	}
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 7c5f40e346..8435ca950d 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1121,7 +1121,7 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 			warning("Lingo::setTheCast(): The cast %d not found. type: %d", id, castType);
 			return;
 		}
-		member->_cast->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, id);
+		member->getCast()->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, id);
 		castInfo->script = d.asString();
 		break;
 	case kTheText:


Commit: 4977b640e6739e44ed11c77bf61e4416b432409c
    https://github.com/scummvm/scummvm/commit/4977b640e6739e44ed11c77bf61e4416b432409c
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-02T11:40:22-04:00

Commit Message:
DIRECTOR: Remove old ShapeCastMember constructor

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


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 0cae5fb724..2cad3f16ed 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -526,17 +526,6 @@ ShapeCastMember::ShapeCastMember(Cast *cast, uint16 castId, Common::ReadStreamEn
 		_initialRect.debugPrint(0, "ShapeCastMember: rect:");
 }
 
-ShapeCastMember::ShapeCastMember(Cast *cast, uint16 castId) : CastMember(cast, castId) {
-	_shapeType = kShapeRectangle;
-	_pattern = 0;
-	_fgCol = 0;
-	_bgCol = 0;
-	_fillType = 0;
-	_lineThickness = 0;
-	_lineDirection = 0;
-	_ink = kInkTypeCopy;
-}
-
 ScriptCastMember::ScriptCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version)
 		: CastMember(cast, castId) {
 	_type = kCastLingoScript;
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 39ab2e5029..88b9c04d3a 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -130,7 +130,6 @@ public:
 class ShapeCastMember : public CastMember {
 public:
 	ShapeCastMember(Cast *cast, uint16 castId, Common::ReadStreamEndian &stream, uint16 version);
-	ShapeCastMember(Cast *cast, uint16 castId);
 
 	ShapeType _shapeType;
 	uint16 _pattern;


Commit: 05b6bb2021afd4f655124fe450a17d8ee91af264
    https://github.com/scummvm/scummvm/commit/05b6bb2021afd4f655124fe450a17d8ee91af264
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-02T11:40:22-04:00

Commit Message:
DIRECTOR: Add Cast convenience methods

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.cpp
    engines/director/movie.cpp
    engines/director/movie.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 83f62fb07e..ea5d187ea7 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -118,6 +118,24 @@ CastMember *Cast::getCastMember(int castId) {
 	return result;
 }
 
+CastMember *Cast::getCastMemberByName(const Common::String &name) {
+	CastMember *result = nullptr;
+
+	if (_castsNames.contains(name)) {
+		result = _loadedCast->getVal(_castsNames[name]);
+	}
+	return result;
+}
+
+CastMemberInfo *Cast::getCastMemberInfo(int castId) {
+	CastMemberInfo *result = nullptr;
+
+	if (_castsInfo.contains(castId)) {
+		result = _castsInfo[castId];
+	}
+	return result;
+}
+
 const Stxt *Cast::getStxt(int castId) {
 	const Stxt *result = nullptr;
 
@@ -628,27 +646,27 @@ void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 			else
 				error("Cast::loadCastDataVWCR(): non-existent reference to BitmapCastMember");
 
-			_loadedCast->setVal(id, new BitmapCastMember(stream, tag, _vm->getVersion()));
+			_loadedCast->setVal(id, new BitmapCastMember(this, id, stream, tag, _vm->getVersion()));
 			break;
 		case kCastText:
 			debugC(3, kDebugLoading, "Cast::loadCastDataVWCR(): CastTypes id: %d(%s) TextCastMember", id, numToCastNum(id));
-			_loadedCast->setVal(id, new TextCastMember(stream, _vm->getVersion()));
+			_loadedCast->setVal(id, new TextCastMember(this, id, stream, _vm->getVersion()));
 			break;
 		case kCastShape:
 			debugC(3, kDebugLoading, "Cast::loadCastDataVWCR(): CastTypes id: %d(%s) ShapeCastMember", id, numToCastNum(id));
-			_loadedCast->setVal(id, new ShapeCastMember(stream, _vm->getVersion()));
+			_loadedCast->setVal(id, new ShapeCastMember(this, id, stream, _vm->getVersion()));
 			break;
 		case kCastButton:
 			debugC(3, kDebugLoading, "Cast::loadCastDataVWCR(): CastTypes id: %d(%s) ButtonCast", id, numToCastNum(id));
-			_loadedCast->setVal(id, new TextCastMember(stream, _vm->getVersion(), true));
+			_loadedCast->setVal(id, new TextCastMember(this, id, stream, _vm->getVersion(), true));
 			break;
 		case kCastSound:
 			debugC(3, kDebugLoading, "Cast::loadCastDataVWCR(): CastTypes id: %d(%s) SoundCastMember", id, numToCastNum(id));
-			_loadedCast->setVal(id, new SoundCastMember(stream, _vm->getVersion()));
+			_loadedCast->setVal(id, new SoundCastMember(this, id, stream, _vm->getVersion()));
 			break;
 		case kCastDigitalVideo:
 			debugC(3, kDebugLoading, "Cast::loadCastDataVWCR(): CastTypes id: %d(%s) DigitalVideoCastMember", id, numToCastNum(id));
-			_loadedCast->setVal(id, new DigitalVideoCastMember(stream, _vm->getVersion()));
+			_loadedCast->setVal(id, new DigitalVideoCastMember(this, id, stream, _vm->getVersion()));
 			break;
 		default:
 			warning("Cast::loadCastDataVWCR(): Unhandled cast id: %d(%s), type: %d, %d bytes", id, numToCastNum(id), castType, size);
@@ -656,7 +674,6 @@ void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
 			continue;
 		}
 		stream.seek(returnPos);
-		_loadedCast->getVal(id)->_cast = this;
 	}
 }
 
@@ -726,35 +743,35 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 	switch (castType) {
 	case kCastBitmap:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastBitmap (%d children)", res->children.size());
-		_loadedCast->setVal(id, new BitmapCastMember(castStream, res->tag, _vm->getVersion()));
+		_loadedCast->setVal(id, new BitmapCastMember(this, id, castStream, res->tag, _vm->getVersion()));
 		break;
 	case kCastSound:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastSound (%d children)", res->children.size());
-		_loadedCast->setVal(id, new SoundCastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new SoundCastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastText:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastText (%d children)", res->children.size());
-		_loadedCast->setVal(id, new TextCastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new TextCastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastShape:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastShape (%d children)", res->children.size());
-		_loadedCast->setVal(id, new ShapeCastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new ShapeCastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastButton:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastButton (%d children)", res->children.size());
-		_loadedCast->setVal(id, new TextCastMember(castStream, _vm->getVersion(), true));
+		_loadedCast->setVal(id, new TextCastMember(this, id, castStream, _vm->getVersion(), true));
 		break;
 	case kCastLingoScript:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastLingoScript");
-		_loadedCast->setVal(id, new ScriptCastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new ScriptCastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastRTE:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastRTE (%d children)", res->children.size());
-		_loadedCast->setVal(id, new RTECastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new RTECastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastDigitalVideo:
 		debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastDigitalVideo (%d children)", res->children.size());
-		_loadedCast->setVal(id, new DigitalVideoCastMember(castStream, _vm->getVersion()));
+		_loadedCast->setVal(id, new DigitalVideoCastMember(this, id, castStream, _vm->getVersion()));
 		break;
 	case kCastFilmLoop:
 		warning("STUB: Cast::loadCastData(): kCastFilmLoop (%d children)", res->children.size());
@@ -780,8 +797,6 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
 	}
 
 	if (_loadedCast->contains(id)) { // Skip unhandled casts
-		_loadedCast->getVal(id)->_cast = this;
-
 		debugCN(3, kDebugLoading, "Children: ");
 		for (uint child = 0; child < res->children.size(); child++) {
 			debugCN(3, kDebugLoading, "%d ", res->children[child].index);
diff --git a/engines/director/cast.h b/engines/director/cast.h
index f416397ec3..fcb2f24b24 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -70,6 +70,8 @@ public:
 	Common::Rect getCastMemberInitialRect(int castId);
 	void setCastMemberModified(int castId);
 	CastMember *getCastMember(int castId);
+	CastMember *getCastMemberByName(const Common::String &name);
+	CastMemberInfo *getCastMemberInfo(int castId);
 	const Stxt *getStxt(int castId);
 
 	void dumpScript(const char *script, ScriptType type, uint16 id);
@@ -82,8 +84,6 @@ private:
 
 public:
 	Archive *_castArchive;
-	Common::HashMap<uint16, CastMemberInfo *> _castsInfo;
-	Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _castsNames;
 	Common::HashMap<uint16, Common::String> _fontMap;
 
 	Common::HashMap<int, CastMember *> *_loadedCast;
@@ -101,6 +101,9 @@ private:
 	Movie *_movie;
 
 	Common::String _macName;
+
+	Common::HashMap<uint16, CastMemberInfo *> _castsInfo;
+	Common::HashMap<Common::String, int, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _castsNames;
 };
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 30710f812f..0147410ca2 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -889,7 +889,7 @@ ScriptContext *Lingo::compileLingoV4(Common::SeekableSubReadStreamEndian &stream
 		if (member->_type == kCastLingoScript)
 			scriptType = ((ScriptCastMember *)member)->_scriptType;
 
-		CastMemberInfo *info = member->getCast()->_castsInfo[castId];
+		CastMemberInfo *info = g_director->getCurrentMovie()->getCastMemberInfo(castId);
 		if (info)
 			castName = info->name;
 	}
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 8435ca950d..d9c1e6610d 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -955,8 +955,6 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		return d;
 	}
 
-	Cast *cast = movie->getCast();
-
 	CastMember *member = _vm->getCurrentMovie()->getCastMember(id);
 	if (!member) {
 		if (field == kTheLoaded) {
@@ -966,6 +964,7 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		}
 		return d;
 	}
+	Cast *cast = member->getCast();
 
 	if (field == kTheHilite) {
 		d.u.i = member->_hilite;
@@ -973,17 +972,10 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 	}
 
 	CastType castType = member->_type;
-	CastMemberInfo *castInfo = nullptr;
-	if (cast->_castsInfo.contains(id)) {
-		castInfo = cast->_castsInfo.getVal(id);
-	} else {
-		Cast *shared = movie->getSharedCast();
-		if (shared && shared->_castsInfo.contains(id)) {
-			castInfo = shared->_castsInfo.getVal(id);
-		} else {
-			warning("Lingo::getTheCast(): CastMember info for %d not found", id);
-			return d;
-		}
+	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
+	if (!castInfo) {
+		warning("Lingo::getTheCast(): CastMember info for %d not found", id);
+		return d;
 	}
 
 	switch (field) {
@@ -1043,12 +1035,6 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 
 void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 	int id = 0;
-	Cast *cast = _vm->getCurrentMovie()->getCast();
-
-	if (!cast) {
-		warning("Lingo::setTheCast(): The cast %d field \"%s\" setting over non-active cast", id, field2str(field));
-		return;
-	}
 
 	if (id1.type == INT) {
 		id = id1.u.i;
@@ -1064,10 +1050,9 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 		warning("Lingo::setTheCast(): CastMember id %d doesn't exist", id);
 		return;
 	}
+	Cast *cast = member->getCast();
 	CastType castType = member->_type;
-	CastMemberInfo *castInfo = cast->_castsInfo[id];
-
-	// FIXME: Properly handle shared cast
+	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
 
 	switch (field) {
 	case kTheBackColor: {
@@ -1121,7 +1106,7 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 			warning("Lingo::setTheCast(): The cast %d not found. type: %d", id, castType);
 			return;
 		}
-		member->getCast()->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, id);
+		cast->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, id);
 		castInfo->script = d.asString();
 		break;
 	case kTheText:
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 91ca1a03e5..43b2a6623f 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1167,12 +1167,11 @@ int Lingo::castIdFetch(Datum &var) {
 		return 0;
 	}
 
-	Cast *cast = movie->getCast();
-
 	int id = 0;
 	if (var.type == STRING) {
-		if (cast->_castsNames.contains(*var.u.s))
-			id = cast->_castsNames[*var.u.s];
+		CastMember *member = movie->getCastMemberByName(var.asString());
+		if (member)
+			id = member->getID();
 		else
 			warning("castIdFetch: reference to non-existent cast member: %s", var.u.s->c_str());
 	} else if (var.type == INT || var.type == FLOAT) {
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 145cd93b49..5ce41b9a21 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -237,6 +237,22 @@ CastMember *Movie::getCastMember(int castId) {
 	return result;
 }
 
+CastMember *Movie::getCastMemberByName(const Common::String &name) {
+	CastMember *result = _cast->getCastMemberByName(name);
+	if (result == nullptr && _sharedCast) {
+		result = _sharedCast->getCastMemberByName(name);
+	}
+	return result;
+}
+
+CastMemberInfo *Movie::getCastMemberInfo(int castId) {
+	CastMemberInfo *result = _cast->getCastMemberInfo(castId);
+	if (result == nullptr && _sharedCast) {
+		result = _sharedCast->getCastMemberInfo(castId);
+	}
+	return result;
+}
+
 const Stxt *Movie::getStxt(int castId) {
 	const Stxt *result = _cast->getStxt(castId);
 	if (result == nullptr && _sharedCast) {
diff --git a/engines/director/movie.h b/engines/director/movie.h
index be09d3bf5e..f2b68126b8 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -60,6 +60,8 @@ public:
 	void loadSharedCastsFrom(Common::String filename);
 
 	CastMember *getCastMember(int castId);
+	CastMember *getCastMemberByName(const Common::String &name);
+	CastMemberInfo *getCastMemberInfo(int castId);
 	const Stxt *getStxt(int castId);
 
 	LingoArchive *getMainLingoArch();




More information about the Scummvm-git-logs mailing list