[Scummvm-git-logs] scummvm master -> 2fa87f010f464949441ce53b3cc708ed7f483363

djsrv dservilla at gmail.com
Fri Aug 14 02:39:11 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:
dec5bcce04 DIRECTOR: Mark overriden obj functions as override
07889d9f10 DIRECTOR: LINGO: Add AbstractObject::hasField
2fa87f010f DIRECTOR: LINGO: Turn CastMember into an object


Commit: dec5bcce04346576536c4321bd7c6176981de19d
    https://github.com/scummvm/scummvm/commit/dec5bcce04346576536c4321bd7c6176981de19d
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-13T22:33:17-04:00

Commit Message:
DIRECTOR: Mark overriden obj functions as override

Changed paths:
    engines/director/lingo/lingo-object.h
    engines/director/lingo/xlibs/fileio.h
    engines/director/window.h


diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index c9557d0c70..9e0dbfc8c5 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -110,24 +110,24 @@ public:
 		delete _refCount;
 	};
 
-	virtual Common::String getName() const { return _name; };
-	virtual ObjectType getObjType() const { return _objType; };
-	virtual bool isDisposed() const { return _disposed; };
-	virtual int *getRefCount() const { return _refCount; };
-	virtual int getInheritanceLevel() const { return _inheritanceLevel; };
+	Common::String getName() const override { return _name; };
+	ObjectType getObjType() const override { return _objType; };
+	bool isDisposed() const override { return _disposed; };
+	int *getRefCount() const override { return _refCount; };
+	int getInheritanceLevel() const override { return _inheritanceLevel; };
 
-	virtual void setName(const Common::String &name) { _name = name; };
-	virtual void dispose() { _disposed = true; };
+	void setName(const Common::String &name) override { _name = name; };
+	void dispose() override { _disposed = true; };
 
-	virtual Common::String asString() {
+	Common::String asString() override {
 		return Common::String::format("object: #%s %d %p", _name.c_str(), _inheritanceLevel, (void *)this);
 	};
 
-	virtual AbstractObject *clone() {
+	AbstractObject *clone() override {
 		return new Derived(static_cast<Derived const &>(*this));
 	};
 
-	virtual Symbol getMethod(const Common::String &methodName) {
+	Symbol getMethod(const Common::String &methodName) override {
 		if (_disposed) {
 			error("Method '%s' called on disposed object <%s>", methodName.c_str(), asString().c_str());
 		}
@@ -155,19 +155,19 @@ public:
 		return sym;
 	};
 
-	virtual bool hasProp(const Common::String &propName) {
+	bool hasProp(const Common::String &propName) override {
 		return false;
 	};
-	virtual Datum getProp(const Common::String &propName) {
+	Datum getProp(const Common::String &propName) override {
 		return Datum();
 	};
-	virtual bool setProp(const Common::String &propName, const Datum &value) {
+	bool setProp(const Common::String &propName, const Datum &value) override {
 		return false;
 	};
-	virtual Datum getField(int field) {
+	Datum getField(int field) override {
 		return Datum();
 	};
-	virtual bool setField(int field, const Datum &value) {
+	bool setField(int field, const Datum &value) override {
 		return false;
 	};
 
@@ -197,16 +197,16 @@ public:
 public:
 	ScriptContext(Common::String name, LingoArchive *archive = nullptr, ScriptType type = kNoneScript, int id = 0);
 	ScriptContext(const ScriptContext &sc);
-	virtual ~ScriptContext();
+	~ScriptContext() override;
 
 	bool isFactory() const { return _objType == kFactoryObj; };
 	void setFactory(bool flag) { _objType = flag ? kFactoryObj : kScriptObj; }
 
-	virtual Common::String asString();
-	virtual Symbol getMethod(const Common::String &methodName);
-	virtual bool hasProp(const Common::String &propName);
-	virtual Datum getProp(const Common::String &propName);
-	virtual bool setProp(const Common::String &propName, const Datum &value);
+	Common::String asString() override;
+	Symbol getMethod(const Common::String &methodName) override;
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+	bool setProp(const Common::String &propName, const Datum &value) override;
 
 	Symbol define(Common::String &name, int nargs, ScriptData *code, Common::Array<Common::String> *argNames, Common::Array<Common::String> *varNames);
 };
diff --git a/engines/director/lingo/xlibs/fileio.h b/engines/director/lingo/xlibs/fileio.h
index 5be0af4fb2..d3b8d469a2 100644
--- a/engines/director/lingo/xlibs/fileio.h
+++ b/engines/director/lingo/xlibs/fileio.h
@@ -61,10 +61,10 @@ public:
 public:
 	FileObject(ObjectType objType);
 	FileObject(const FileObject &obj);
-	virtual ~FileObject();
+	~FileObject() override;
 
 	void clear();
-	virtual void dispose();
+	void dispose() override;
 };
 
 namespace FileIO {
diff --git a/engines/director/window.h b/engines/director/window.h
index d80e080b07..9b6475c9e2 100644
--- a/engines/director/window.h
+++ b/engines/director/window.h
@@ -153,12 +153,12 @@ class Window : public Graphics::MacWindow, public Object<Window> {
 	void loadMac(const Common::String movie);
 
 	// lingo/lingo-object.cpp
-	virtual Common::String asString();
-	virtual bool hasProp(const Common::String &propName);
-	virtual Datum getProp(const Common::String &propName);
-	virtual bool setProp(const Common::String &propName, const Datum &value);
-	virtual Datum getField(int field);
-	virtual bool setField(int field, const Datum &value);
+	Common::String asString() override;
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+	bool setProp(const Common::String &propName, const Datum &value) override;
+	Datum getField(int field) override;
+	bool setField(int field, const Datum &value) override;
 
 public:
 	Common::List<Channel *> _dirtyChannels;


Commit: 07889d9f1085e7fa9125ef1a4c32cff40cc736e8
    https://github.com/scummvm/scummvm/commit/07889d9f1085e7fa9125ef1a4c32cff40cc736e8
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-13T22:33:17-04:00

Commit Message:
DIRECTOR: LINGO: Add AbstractObject::hasField

Changed paths:
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-object.h
    engines/director/window.h


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 1d97d4e032..437b60da38 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -357,7 +357,7 @@ Common::String Window::asString() {
 
 bool Window::hasProp(const Common::String &propName) {
 	Common::String fieldName = Common::String::format("%d%s", kTheWindow, propName.c_str());
-	return g_lingo->_theEntityFields.contains(fieldName);
+	return g_lingo->_theEntityFields.contains(fieldName) && hasField(g_lingo->_theEntityFields[fieldName]->field);
 }
 
 Datum Window::getProp(const Common::String &propName) {
@@ -380,6 +380,23 @@ bool Window::setProp(const Common::String &propName, const Datum &value) {
 	return false;
 }
 
+bool Window::hasField(int field) {
+	switch (field) {
+	case kTheDrawRect:
+	case kTheFileName:
+	case kTheModal:
+	case kTheSourceRect:
+	case kTheTitle:
+	case kTheTitleVisible:
+	case kTheVisible:
+	case kTheWindowType:
+		return true;
+	default:
+		break;
+	}
+	return false;
+}
+
 Datum Window::getField(int field) {
 	switch (field) {
 	case kTheTitle:
diff --git a/engines/director/lingo/lingo-object.h b/engines/director/lingo/lingo-object.h
index 9e0dbfc8c5..2e3cdbc08b 100644
--- a/engines/director/lingo/lingo-object.h
+++ b/engines/director/lingo/lingo-object.h
@@ -56,6 +56,7 @@ public:
 	virtual bool hasProp(const Common::String &propName) = 0;
 	virtual Datum getProp(const Common::String &propName) = 0;
 	virtual bool setProp(const Common::String &propName, const Datum &value) = 0;
+	virtual bool hasField(int field) = 0;
 	virtual Datum getField(int field) = 0;
 	virtual bool setField(int field, const Datum &value) = 0;
 };
@@ -164,6 +165,9 @@ public:
 	bool setProp(const Common::String &propName, const Datum &value) override {
 		return false;
 	};
+	bool hasField(int field) override {
+		return false;
+	};
 	Datum getField(int field) override {
 		return Datum();
 	};
diff --git a/engines/director/window.h b/engines/director/window.h
index 9b6475c9e2..4a0ea97fa8 100644
--- a/engines/director/window.h
+++ b/engines/director/window.h
@@ -157,6 +157,7 @@ class Window : public Graphics::MacWindow, public Object<Window> {
 	bool hasProp(const Common::String &propName) override;
 	Datum getProp(const Common::String &propName) override;
 	bool setProp(const Common::String &propName, const Datum &value) override;
+	bool hasField(int field) override;
 	Datum getField(int field) override;
 	bool setField(int field, const Datum &value) override;
 


Commit: 2fa87f010f464949441ce53b3cc708ed7f483363
    https://github.com/scummvm/scummvm/commit/2fa87f010f464949441ce53b3cc708ed7f483363
Author: djsrv (dservilla at gmail.com)
Date: 2020-08-13T22:36:05-04:00

Commit Message:
DIRECTOR: LINGO: Turn CastMember into an object

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


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 439da4c3f5..587db32a68 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -34,7 +34,7 @@
 
 namespace Director {
 
-CastMember::CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream) {
+CastMember::CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream) : Object<CastMember>("CastMember") {
 	_type = kCastTypeNull;
 	_cast = cast;
 	_castId = castId;
@@ -45,6 +45,8 @@ CastMember::CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndi
 	_flags1 = 0;
 
 	_modified = true;
+
+	_objType = kCastMemberObj;
 }
 
 
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index a179659a2d..ecece55150 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -28,6 +28,8 @@
 #include "director/archive.h"
 #include "director/stxt.h"
 
+#include "director/lingo/lingo-object.h"
+
 namespace Graphics {
 struct Surface;
 class FloodFill;
@@ -57,7 +59,7 @@ class Channel;
 struct Resource;
 class Stxt;
 
-class CastMember {
+class CastMember : public Object<CastMember> {
 public:
 	CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream);
 	virtual ~CastMember() {}
@@ -76,6 +78,13 @@ public:
 	virtual uint getForeColor() { return 0; }
 	virtual uint getBackColor() { return 0; }
 
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+	bool setProp(const Common::String &propName, const Datum &value) override;
+	bool hasField(int field) override;
+	Datum getField(int field) override;
+	bool setField(int field, const Datum &value) override;
+
 	CastType _type;
 	Common::Rect _initialRect;
 	Common::Rect _boundingRect;
@@ -88,7 +97,7 @@ public:
 	uint32 _size;
 	uint8 _flags1;
 
-private:
+protected:
 	Cast *_cast;
 	uint16 _castId;
 };
@@ -102,6 +111,10 @@ public:
 	void createMatte();
 	Graphics::Surface *getMatte();
 
+	bool hasField(int field) override;
+	Datum getField(int field) override;
+	bool setField(int field, const Datum &value) override;
+
 	Image::ImageDecoder *_img;
 	Graphics::FloodFill *_matte;
 
@@ -132,6 +145,10 @@ public:
 	void setMovieRate(int rate);
 	void setFrameRate(int rate);
 
+	bool hasField(int field) override;
+	Datum getField(int field) override;
+	bool setField(int field, const Datum &value) override;
+
 	uint32 _vflags;
 	bool _looping;
 	bool _pausedAtStart;
@@ -195,6 +212,10 @@ public:
 	virtual uint getBackColor() override { return _bgcolor; }
 	virtual uint getForeColor() override { return _fgcolor; }
 
+	bool hasField(int field) override;
+	Datum getField(int field) override;
+	bool setField(int field, const Datum &value) override;
+
 	SizeType _borderSize;
 	SizeType _gutterSize;
 	SizeType _boxShadow;
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 437b60da38..710146c739 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -23,6 +23,8 @@
 #include "common/endian.h"
 
 #include "director/director.h"
+#include "director/cast.h"
+#include "director/castmember.h"
 #include "director/window.h"
 #include "director/util.h"
 #include "director/lingo/lingo.h"
@@ -481,4 +483,462 @@ void LM::m_moveToFront(int nargs) {
 	g_lingo->dropStack(nargs);
 }
 
+// CastMember
+
+bool CastMember::hasProp(const Common::String &propName) {
+	Common::String fieldName = Common::String::format("%d%s", kTheCast, propName.c_str());
+	return g_lingo->_theEntityFields.contains(fieldName) && hasField(g_lingo->_theEntityFields[fieldName]->field);
+}
+
+Datum CastMember::getProp(const Common::String &propName) {
+	Common::String fieldName = Common::String::format("%d%s", kTheCast, propName.c_str());
+	if (g_lingo->_theEntityFields.contains(fieldName)) {
+		return getField(g_lingo->_theEntityFields[fieldName]->field);
+	}
+
+	warning("CastMember::getProp: unknown property '%s'", propName.c_str());
+	return Datum();
+}
+
+bool CastMember::setProp(const Common::String &propName, const Datum &value) {
+	Common::String fieldName = Common::String::format("%d%s", kTheCast, propName.c_str());
+	if (g_lingo->_theEntityFields.contains(fieldName)) {
+		return setField(g_lingo->_theEntityFields[fieldName]->field, value);
+	}
+
+	warning("CastMember::setProp: unknown property '%s'", propName.c_str());
+	return false;
+}
+
+bool CastMember::hasField(int field) {
+	switch (field) {
+	case kTheBackColor:
+	case kTheCastType:
+	case kTheFileName:
+	case kTheForeColor:
+	case kTheHeight:
+	case kTheLoaded:
+	case kTheModified:
+	case kTheName:
+	case kTheNumber:
+	case kTheRect:
+	case kThePurgePriority:
+	case kTheScriptText:
+	case kTheSize:
+	case kTheWidth:
+		return true;
+	default:
+		break;
+	}
+	return false;
+}
+
+Datum CastMember::getField(int field) {
+	Datum d;
+
+	CastMemberInfo *castInfo = _cast->getCastMemberInfo(_castId);
+	if (!castInfo)
+		warning("CastMember::getField(): CastMember info for %d not found", _castId);
+
+	switch (field) {
+	case kTheBackColor:
+		d = (int)getBackColor();
+		break;
+	case kTheCastType:
+		d = _type;
+		break;
+	case kTheFileName:
+		if (castInfo)
+			d = Datum(castInfo->fileName);
+		break;
+	case kTheForeColor:
+		d = (int)getForeColor();
+		break;
+	case kTheHeight:
+		d = _cast->getCastMemberInitialRect(_castId).height();
+		break;
+	case kTheLoaded:
+		d = 1; // Not loaded handled in Lingo::getTheCast
+		break;
+	case kTheModified:
+		warning("STUB: CastMember::getField():: Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheName:
+		if (castInfo)
+			d = Datum(castInfo->name);
+		break;
+	case kTheNumber:
+		d = _castId;
+		break;
+	case kTheRect:
+		warning("STUB: CastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	case kThePurgePriority:
+		d = _purgePriority;
+		break;
+	case kTheScriptText:
+		if (castInfo)
+			d = Datum(castInfo->script);
+		break;
+	case kTheSize:
+		d = (int)_size;
+		break;
+	case kTheWidth:
+		d = _cast->getCastMemberInitialRect(_castId).width();
+		break;
+	default:
+		warning("CastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+	//TODO find out about String fields
+	}
+
+	return d;
+}
+
+bool CastMember::setField(int field, const Datum &d) {
+	CastMemberInfo *castInfo = _cast->getCastMemberInfo(_castId);
+
+	switch (field) {
+	case kTheBackColor:
+		warning("STUB: CastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheCastType:
+		warning("Lingo::setTheCast(): Attempt to set read-only field %s of cast %d", g_lingo->entity2str(field), _castId);
+		return false;
+	case kTheFileName:
+		if (!castInfo) {
+			warning("CastMember::setField(): CastMember info for %d not found", _castId);
+			return false;
+		}
+		castInfo->fileName = d.asString();
+		return true;
+	case kTheForeColor:
+		warning("STUB: CastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheHeight:
+		warning("CastMember::setField(): Attempt to set read-only field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheName:
+		if (!castInfo) {
+			warning("CastMember::setField(): CastMember info for %d not found", _castId);
+			return false;
+		}
+		castInfo->name = d.asString();
+		return true;
+	case kTheRect:
+		warning("STUB: CastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kThePurgePriority:
+		_purgePriority = CLIP<int>(d.asInt(), 0, 3);
+		return true;
+	case kTheScriptText:
+		if (!castInfo) {
+			warning("CastMember::setField(): CastMember info for %d not found", _castId);
+			return false;
+		}
+		_cast->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, _castId);
+		castInfo->script = d.asString();
+		return true;
+	case kTheWidth:
+		warning("CastMember::setField(): Attempt to set read-only field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	default:
+		warning("CastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+	}
+
+	return false;
+}
+
+bool DigitalVideoCastMember::hasField(int field) {
+	switch (field) {
+	case kTheCenter:
+	case kTheController:
+	case kTheCrop:
+	case kTheDirectToStage:
+	case kTheDuration:
+	case kTheFrameRate:
+	case kTheLoop:
+	case kTheMovieRate:
+	case kTheMovieTime:
+	case kThePausedAtStart:
+	case kThePreLoad:
+	case kTheSound:
+	case kTheVideo:
+	case kTheVolume:
+		return true;
+	default:
+		break;
+	}
+	return CastMember::hasField(field);
+}
+
+Datum DigitalVideoCastMember::getField(int field) {
+	Datum d;
+
+	switch (field) {
+	case kTheCenter:
+		d = _center;
+		break;
+	case kTheController:
+		d = _showControls;
+		break;
+	case kTheCrop:
+		d = _crop;
+		break;
+	case kTheDirectToStage:
+		d = _directToStage;
+		break;
+	case kTheDuration:
+		warning("STUB: DigitalVideoCastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheFrameRate:
+		d = _frameRate;
+		break;
+	case kTheLoop:
+		d = _looping;
+		break;
+	case kThePausedAtStart:
+		d = _pausedAtStart;
+		break;
+	case kThePreLoad:
+		d = _preload;
+		break;
+	case kTheSound:
+		d = _enableSound;
+		break;
+	case kTheVideo:
+		d = _enableVideo;
+		break;
+	default:
+		d = CastMember::getField(field);
+	}
+
+	return d;
+}
+
+bool DigitalVideoCastMember::setField(int field, const Datum &d) {
+	switch (field) {
+	case kTheCenter:
+		_center = (bool)d.asInt();
+		return true;
+	case kTheController:
+		_showControls = (bool)d.asInt();
+		return true;
+	case kTheCrop:
+		_crop = (bool)d.asInt();
+		return true;
+	case kTheDirectToStage:
+		_directToStage = (bool)d.asInt();
+		return true;
+	case kTheDuration:
+		warning("STUB: DigitalVideoCastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheFrameRate:
+		_frameRate = d.asInt();
+		setFrameRate(d.asInt());
+		return true;
+	case kTheLoop:
+		_looping = (bool)d.asInt();
+		return true;
+	case kThePausedAtStart:
+		_pausedAtStart = (bool)d.asInt();
+		return true;
+	case kThePreLoad:
+		_preload = (bool)d.asInt();
+		return true;
+	case kTheSound:
+		_enableSound = (bool)d.asInt();
+		return true;
+	case kTheVideo:
+		_enableVideo = (bool)d.asInt();
+		return true;
+	default:
+		break;
+	}
+
+	return CastMember::setField(field, d);
+}
+
+bool BitmapCastMember::hasField(int field) {
+	switch (field) {
+	case kTheDepth:
+	case kTheRegPoint:
+	case kThePalette:
+	case kThePicture:
+		return true;
+	default:
+		break;
+	}
+	return CastMember::hasField(field);
+}
+
+Datum BitmapCastMember::getField(int field) {
+	Datum d;
+
+	switch (field) {
+	case kTheDepth:
+		warning("STUB: BitmapCastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheRegPoint:
+		warning("STUB: BitmapCastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	case kThePalette:
+		d = _clut;
+		break;
+	case kThePicture:
+		warning("STUB: BitmapCastMember::getField(): Unprocessed getting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		break;
+	default:
+		d = CastMember::getField(field);
+	}
+
+	return d;
+}
+
+bool BitmapCastMember::setField(int field, const Datum &d) {
+	switch (field) {
+	case kTheDepth:
+		warning("STUB: BitmapCastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheRegPoint:
+		warning("STUB: BitmapCastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kThePalette:
+		_clut = d.asInt();
+		return true;
+	case kThePicture:
+		warning("STUB: BitmapCastMember::setField(): Unprocessed setting field \"%s\" of cast %d", g_lingo->field2str(field), _castId);
+		return false;
+	default:
+		break;
+	}
+
+	return CastMember::setField(field, d);
+}
+
+bool TextCastMember::hasField(int field) {
+	switch (field) {
+	case kTheHilite:
+	case kTheText:
+	case kTheTextAlign:
+	case kTheTextFont:
+	case kTheTextHeight:
+	case kTheTextSize:
+	case kTheTextStyle:
+		return true;
+	default:
+		break;
+	}
+	return CastMember::hasField(field);
+}
+
+Datum TextCastMember::getField(int field) {
+	Datum d;
+
+	switch (field) {
+	case kTheHilite:
+		d = _hilite;
+		break;
+	case kTheText:
+		d = getText();
+		break;
+	case kTheTextAlign:
+		d.type = STRING;
+		switch (_textAlign) {
+		case kTextAlignLeft:
+			d.u.s = new Common::String("left");
+			break;
+		case kTextAlignCenter:
+			d.u.s = new Common::String("center");
+			break;
+		case kTextAlignRight:
+			d.u.s = new Common::String("right");
+			break;
+		default:
+			warning("TextCastMember::getField(): Invalid text align spec");
+			break;
+		}
+		break;
+	case kTheTextFont:
+		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheTextHeight:
+		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheTextSize:
+		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		break;
+	case kTheTextStyle:
+		warning("TextCastMember::getField(): Unprocessed getting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		break;
+	default:
+		d = CastMember::getField(field);
+	}
+
+	return d;
+}
+
+bool TextCastMember::setField(int field, const Datum &d) {
+	switch (field) {
+	case kTheBackColor:
+		{
+			int color = g_director->transformColor(d.asInt());
+			setColors(nullptr, &color);
+		}
+		return true;
+	case kTheForeColor:
+		{
+			int color = g_director->transformColor(d.asInt());
+			setColors(&color, nullptr);
+		}
+		return true;
+	case kTheHilite:
+		// TODO: Understand how texts can be selected programmatically as well.
+		if (_type == kCastButton) {
+			_hilite = (bool)d.asInt();
+			return true;
+		}
+		break;
+	case kTheText:
+		setText(d.asString().c_str());
+		return true;
+	case kTheTextAlign:
+		{
+			Common::String select = d.asString(true);
+			select.toLowercase();
+
+			TextAlignType align;
+			if (select == "\"left\"") {
+				align = kTextAlignLeft;
+			} else if (select == "\"center\"") {
+				align = kTextAlignCenter;
+			} else if (select == "\"right\"") {
+				align = kTextAlignRight;
+			} else {
+				warning("TextCastMember::setField(): Unknown text align spec: %s", d.asString(true).c_str());
+				break;
+			}
+
+			_textAlign = align;
+			_modified = true;
+		}
+		return true;
+	case kTheTextFont:
+		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheTextHeight:
+		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheTextSize:
+		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		return false;
+	case kTheTextStyle:
+		warning("TextCastMember::setField(): Unprocessed setting field \"%s\" of field %d", g_lingo->field2str(field), _castId);
+		return false;
+	default:
+		break;
+	}
+
+	return CastMember::setField(field, d);
+}
+
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index b80514ded6..a3a64ca227 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1433,491 +1433,119 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 
 Datum Lingo::getTheCast(Datum &id1, int field) {
 	Datum d;
-	int id = g_lingo->castIdFetch(id1);
 
 	Movie *movie = _vm->getCurrentMovie();
-	// Setting default type
-	d.type = INT;
-
 	if (!movie) {
 		warning("Lingo::getTheCast(): No movie loaded");
 		return d;
 	}
 
-	CastMember *member = _vm->getCurrentMovie()->getCastMember(id);
+	int id = g_lingo->castIdFetch(id1);
+
+	CastMember *member = movie->getCastMember(id);
 	if (!member) {
 		if (field == kTheLoaded) {
-			d.u.i = 0;
+			d = 0;
 		} else {
-			warning("Lingo::getTheCast(): CastMember %d not found", id);
+			warning("Lingo::getTheCast(): CastMember %s not found", id1.asString().c_str());
 		}
 		return d;
 	}
-	Cast *cast = member->getCast();
-
-	CastType castType = member->_type;
-	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
-	if (!castInfo)
-		warning("Lingo::getTheCast(): CastMember info for %d not found", id);
 
-	switch (field) {
-	case kTheBackColor:
-		d.u.i = member->getBackColor();
-		break;
-	case kTheCastType:
-		d.u.i = castType;
-		break;
-	case kTheCenter:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_center ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheController:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_showControls ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheCrop:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_crop ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheDepth:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheDirectToStage:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_directToStage ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheDuration:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheFileName:
-		if (castInfo)
-			d = Datum(castInfo->fileName);
-		break;
-	case kTheForeColor:
-		d.u.i = member->getForeColor();
-		break;
-	case kTheFrameRate:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_frameRate;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheHeight:
-		d.u.i = cast->getCastMemberInitialRect(id).height();
-		break;
-	case kTheHilite:
-		d.u.i = member->_hilite;
-		break;
-	case kTheLoaded:
-		d.u.i = 1; //Not loaded handled above
-		break;
-	case kTheLoop:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_looping ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheModified:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheName:
-		if (castInfo)
-			d = Datum(castInfo->name);
-		break;
-	case kTheNumber:
-		d.u.i = id;
-		break;
-	case kThePausedAtStart:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_pausedAtStart ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kThePreLoad:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_preload ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheRect:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheRegPoint:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kThePalette:
-		if (member->_type == kCastBitmap)
-			d.u.i = ((BitmapCastMember *)member)->_clut;
-		break;
-	case kThePicture:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kThePurgePriority:
-		d.u.i = member->_purgePriority;
-		break;
-	case kTheScriptText:
-		if (castInfo)
-			d = Datum(castInfo->script);
-		break;
-	case kTheSize:
-		d.u.i = member->_size;
-		break;
-	case kTheSound:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_enableSound ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheText:
-		{
-			Common::String text;
-			if (castType == kCastText) {
-				if (member && member->_type == kCastText) {
-					text = ((TextCastMember *)member)->getText();
-				} else {
-					warning("Lingo::getTheCast(): Unknown STXT cast id %d", id);
-				}
-			} else {
-				warning("Lingo::getTheCast(): Unprocessed getting text of cast %d type %d", id, castType);
-			}
-			d = Datum(text);
-		}
-		break;
-	case kTheVideo:
-		if (castType == kCastDigitalVideo) {
-			d.u.i = ((DigitalVideoCastMember *)member)->_enableVideo ? 1 : 0;
-		} else {
-			warning("Lingo::getTheCast(): Unsupported getting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheWidth:
-		d.u.i = cast->getCastMemberInitialRect(id).width();
-		break;
-	default:
-		warning("Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
-		d.type = VOID;
-	//TODO find out about String fields
+	if (!member->hasField(field)) {
+		warning("Lingo::getTheCast(): CastMember %d has no property '%s'", id, field2str(field));
+		return d;
 	}
 
+	d = member->getField(field);
+
 	return d;
 }
 
 void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
-	int id = 0;
-
-	if (id1.type == INT) {
-		id = id1.u.i;
-	} else if (id1.type == STRING) {
-		id = g_lingo->castIdFetch(id1);
-	} else {
-		warning("Lingo::setTheCast(): Unknown the cast id type: %s", id1.type2str());
+	Movie *movie = _vm->getCurrentMovie();
+	if (!movie) {
+		warning("Lingo::setTheCast(): No movie loaded");
 		return;
 	}
 
-	CastMember *member = _vm->getCurrentMovie()->getCastMember(id);
+	int id = g_lingo->castIdFetch(id1);
+
+	CastMember *member = movie->getCastMember(id);
 	if (!member) {
-		warning("Lingo::setTheCast(): CastMember id %d doesn't exist", id);
+		warning("Lingo::setTheCast(): CastMember %d not found", id);
 		return;
 	}
-	Cast *cast = member->getCast();
-	CastType castType = member->_type;
-	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
 
-	switch (field) {
-	case kTheBackColor:
-		if (castType == kCastText) {
-			int color = _vm->transformColor(d.asInt());
-			member->setColors(nullptr, &color);
-		}
-		break;
-	case kTheCastType:
-		warning("Lingo::setTheCast(): Attempt to set read-only field %s of cast %d", entity2str(field), id);
-		break;
-	case kTheCenter:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_center = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheController:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_showControls = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheCrop:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_crop = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheDepth:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheDirectToStage:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_directToStage = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheDuration:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheFileName:
-		if (!castInfo) {
-			warning("Lingo::setTheCast(): The cast %d not found. type: %d", id, castType);
-			return;
-		}
-		castInfo->fileName = d.asString();
-		break;
-	case kTheForeColor:
-		if (castType == kCastText) {
-			int color = _vm->transformColor(d.asInt());
-			member->setColors(&color, nullptr);
-		}
-		break;
-	case kTheFrameRate:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_frameRate = d.asInt();
-			((DigitalVideoCastMember *)member)->setFrameRate(d.asInt());
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheHeight:
-		warning("Lingo::setTheCast(): Attempt to set read-only field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheHilite:
-		// TODO: Understand how texts can be selected programmatically as well.
-		if (member->_type == kCastButton) {
-			TextCastMember *button = (TextCastMember *)member;
-			if ((bool)d.asInt() !=  member->_hilite) {
-				button->_hilite = !!d.asInt();
-			}
-		} else {
-			warning("Lingo::setTheCast: Attempted to set hilite of unsupported cast type");
-		}
-		break;
-	case kTheLoop:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_looping = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheName:
-		if (!castInfo) {
-			warning("Lingo::setTheCast(): The cast %d not found. type: %d", id, castType);
-			return;
-		}
-		castInfo->name = d.asString();
-		break;
-	case kThePausedAtStart:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_pausedAtStart = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kThePreLoad:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_preload = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheRect:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kTheRegPoint:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kThePalette:
-		if (member->_type == kCastBitmap)
-			((BitmapCastMember *)member)->_clut = d.asInt();
-		break;
-	case kThePicture:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
-		break;
-	case kThePurgePriority:
-		member->_purgePriority = CLIP<int>(d.asInt(), 0, 3);
-		break;
-	case kTheScriptText:
-		if (!castInfo) {
-			warning("Lingo::setTheCast(): The cast %d not found. type: %d", id, castType);
-			return;
-		}
-		cast->_lingoArchive->addCode(d.u.s->c_str(), kCastScript, id);
-		castInfo->script = d.asString();
-		break;
-	case kTheSound:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_enableSound = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheText:
-		if (castType == kCastText) {
-			if (member->_type == kCastText) {
-				((TextCastMember *)member)->setText(d.asString().c_str());
-			} else {
-				warning("Lingo::setTheCast(): Unknown STXT cast id %d", id);
-				return;
-			}
-		} else {
-			warning("Lingo::setTheCast(): Unprocessed setting text of cast %d type %d", id, castType);
-		}
-		break;
-	case kTheVideo:
-		if (castType == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)member)->_enableVideo = (bool)d.asInt();
-		} else {
-			warning("Lingo::setTheCast(): Unsupported setting kCastDigitalVideo field \"%s\" of cast %d", field2str(field), id);
-		}
-		break;
-	case kTheWidth:
-		warning("Lingo::setTheCast(): Attempt to set read-only field \"%s\" of cast %d", field2str(field), id);
-		break;
-	default:
-		warning("Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
+	if (!member->hasField(field)) {
+		warning("Lingo::setTheCast(): CastMember %d has no property '%s'", id, field2str(field));
+		return;
 	}
+
+	member->setField(field, d);
 }
 
 Datum Lingo::getTheField(Datum &id1, int field) {
 	Datum d;
+
+	Movie *movie = _vm->getCurrentMovie();
+	if (!movie) {
+		warning("Lingo::getTheField(): No movie loaded");
+		return d;
+	}
+
 	int id = g_lingo->castIdFetch(id1);
 
-	CastMember *member = _vm->getCurrentMovie()->getCastMember(id);
+	CastMember *member = movie->getCastMember(id);
 	if (!member) {
-		warning("Lingo::getTheField(): CastMember id %d doesn't exist", id);
+		if (field == kTheLoaded) {
+			d = 0;
+		} else {
+			warning("Lingo::getTheField(): CastMember %d not found", id);
+		}
 		return d;
-	} else if (member->_type != kCastText) {
-		warning("Lingo::getTheField(): CastMember id %d is not a field", id);
+	}
+	if (member->_type != kCastText) {
+		warning("Lingo::getTheField(): CastMember %d is not a field", id);
 		return d;
 	}
 
-	switch (field) {
-	case kTheText:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextAlign:
-		d.type = STRING;
-		switch (((TextCastMember *)member)->_textAlign) {
-		case kTextAlignLeft:
-			d.u.s = new Common::String("left");
-			break;
-		case kTextAlignCenter:
-			d.u.s = new Common::String("center");
-			break;
-		case kTextAlignRight:
-			d.u.s = new Common::String("right");
-			break;
-		default:
-			warning("Lingo::getTheField: Invalid text align spec");
-			break;
-		}
-		break;
-	case kTheTextFont:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextHeight:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextSize:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextStyle:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
-		break;
-	default:
-		warning("Lingo::getTheField(): Unprocessed getting field \"%s\" of field %d", field2str(field), id);
+
+	if (!member->hasField(field)) {
+		warning("Lingo::getTheField(): CastMember %d has no property '%s'", id, field2str(field));
+		return d;
 	}
 
+	d = member->getField(field);
+
 	return d;
 }
 
 void Lingo::setTheField(Datum &id1, int field, Datum &d) {
-	int id = 0;
-
-	if (id1.type == INT) {
-		id = id1.u.i;
-	} else if (id1.type == STRING) {
-		id = g_lingo->castIdFetch(id1);
-	} else {
-		warning("Lingo::setTheField(): Unknown the cast id type: %s", id1.type2str());
+	Movie *movie = _vm->getCurrentMovie();
+	if (!movie) {
+		warning("Lingo::setTheField(): No movie loaded");
 		return;
 	}
 
-	CastMember *member = _vm->getCurrentMovie()->getCastMember(id);
+	int id = g_lingo->castIdFetch(id1);
+
+	CastMember *member = movie->getCastMember(id);
 	if (!member) {
-		warning("Lingo::setTheField(): CastMember id %d doesn't exist", id);
+		warning("Lingo::setTheField(): CastMember %d not found", id);
+		return;
+	}
+	if (member->_type != kCastText) {
+		warning("Lingo::setTheField(): CastMember %d is not a field", id);
 		return;
-	} else if (member->_type != kCastText) {
-		warning("Lingo::setTheField(): CastMember id %d is not a field", id);
 	}
 
-	switch (field) {
-	case kTheText:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextAlign:
-		{
-			Common::String select = d.asString(true);
-			select.toLowercase();
-
-			TextAlignType align;
-			if (select == "\"left\"") {
-				align = kTextAlignLeft;
-			} else if (select == "\"center\"") {
-				align = kTextAlignCenter;
-			} else if (select == "\"right\"") {
-				align = kTextAlignRight;
-			} else {
-				warning("Lingo::setTheField: Unknown text align spec: %s", d.asString(true).c_str());
-				break;
-			}
-
-			((TextCastMember *)member)->_textAlign = align;
-			member->_modified = true;
-			break;
-		}
-	case kTheTextFont:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextHeight:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextSize:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
-		break;
-	case kTheTextStyle:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
-		break;
-	default:
-		warning("Lingo::setTheField(): Unprocessed setting field \"%s\" of field %d", field2str(field), id);
+	if (!member->hasField(field)) {
+		warning("Lingo::setTheField(): CastMember %d has no property '%s'", id, field2str(field));
+		return;
 	}
+
+	member->setField(field, d);
 }
 
 Datum Lingo::getObjectProp(Datum &obj, Common::String &propName) {
diff --git a/engines/director/types.h b/engines/director/types.h
index 03db154c73..fcdcbd598a 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -80,7 +80,8 @@ enum ObjectType {
 	kScriptObj = 1 << 2,
 	kXtraObj = 1 << 3,
 	kAllObj = kFactoryObj | kXObj | kScriptObj | kXtraObj,
-	kWindowObj = 1 << 4
+	kWindowObj = 1 << 4,
+	kCastMemberObj = 1 << 5
 };
 
 enum ShapeType {




More information about the Scummvm-git-logs mailing list