[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