[Scummvm-git-logs] scummvm master -> 5d45afb18be2eee06587663b92ea9b0654aff2d9

rvanlaar roland at rolandvanlaar.nl
Thu Aug 26 10:24:26 UTC 2021


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

Summary:
5d45afb18b DIRECTOR: Convert cursor setting into Datum


Commit: 5d45afb18be2eee06587663b92ea9b0654aff2d9
    https://github.com/scummvm/scummvm/commit/5d45afb18be2eee06587663b92ea9b0654aff2d9
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2021-08-26T12:23:07+02:00

Commit Message:
DIRECTOR: Convert cursor setting into Datum

This fixes two bugs in one go:
- setting a cursor to 0 wasn't possible when a cast+mask cursor was used
- querying a sprite for cast+mask cursor returned 0 instead of the cast
  ids.

Cursors can be set in two ways:
    1) set cursor of sprite X to INT
    2) set cursor of sprite X to [INT, INT]

A `cursor of sprite X` should return the same values that as were used
when setting the cursor.

Changed paths:
    engines/director/cursor.cpp
    engines/director/cursor.h
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-funcs.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/cursor.cpp b/engines/director/cursor.cpp
index 193cb414eb..0086b4ea17 100644
--- a/engines/director/cursor.cpp
+++ b/engines/director/cursor.cpp
@@ -33,12 +33,9 @@ namespace Director {
 Cursor::Cursor() {
 	_keyColor = 0xff;
 
-	_cursorResId = 0;
+	_cursorResId = Datum(0);
 	_cursorType = Graphics::kMacCursorArrow;
 
-	_cursorCastId = CastMemberID(0, 0);
-	_cursorMaskId = CastMemberID(0, 0);
-
 	_usePalette = false;
 }
 
@@ -46,29 +43,30 @@ CursorRef Cursor::getRef() {
 	CursorRef res;
 	res._cursorType = _cursorType;
 	res._cursorResId = _cursorResId;
-	res._cursorCastId = _cursorCastId;
-	res._cursorMaskId = _cursorMaskId;
 	return res;
 }
 
 bool Cursor::operator==(const Cursor &c) {
 	return _cursorType == c._cursorType &&
-		_cursorResId == c._cursorResId &&
-		_cursorCastId == c._cursorCastId &&
-		_cursorMaskId == c._cursorMaskId;
+		c._cursorResId.equalTo(_cursorResId);
 }
 
 bool Cursor::operator==(const CursorRef &c) {
 	return _cursorType == c._cursorType &&
-		_cursorResId == c._cursorResId &&
-		_cursorCastId == c._cursorCastId &&
-		_cursorMaskId == c._cursorMaskId;
+			c._cursorResId.equalTo(_cursorResId);
 }
 
-void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
-	if (cursorId == _cursorCastId && maskId == _cursorMaskId)
+void Cursor::readFromCast(Datum cursorCasts) {
+	if (cursorCasts.type != ARRAY && cursorCasts.u.farr->arr.size() != 2 ) {
+		warning("Cursor::readFromCast: Needs array");
+		return;
+	}
+	if (_cursorResId.equalTo(cursorCasts))
 		return;
 
+	CastMemberID cursorId = cursorCasts.u.farr->arr[0].asMemberID();
+	CastMemberID maskId = cursorCasts.u.farr->arr[1].asMemberID();
+
 	CastMember *cursorCast = g_director->getCurrentMovie()->getCastMember(cursorId);
 	CastMember *maskCast = g_director->getCurrentMovie()->getCastMember(maskId);
 
@@ -83,7 +81,7 @@ void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
 	_usePalette = false;
 	_keyColor = 3;
 
-	resetCursor(Graphics::kMacCursorCustom, true, 0, cursorId, maskId);
+	resetCursor(Graphics::kMacCursorCustom, true, cursorCasts);
 
 	BitmapCastMember *cursorBitmap = (BitmapCastMember *)cursorCast;
 	BitmapCastMember *maskBitmap = (BitmapCastMember *)maskCast;
@@ -122,11 +120,16 @@ void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
 	_hotspotY = bc->_regY - bc->_initialRect.top;
 }
 
-void Cursor::readBuiltinType(int resourceId) {
-	if (resourceId == _cursorResId)
+void Cursor::readBuiltinType(Datum resourceId) {
+	if (resourceId.equalTo(_cursorResId))
 		return;
 
-	switch(resourceId) {
+	if (resourceId.type != INT) {
+		warning("readBuiltinType: failed to read cursor. It's not type int");
+	}
+
+
+	switch(resourceId.asInt()) {
 	case -1:
 	case 0:
 		resetCursor(Graphics::kMacCursorArrow, true, resourceId);
@@ -147,16 +150,20 @@ void Cursor::readBuiltinType(int resourceId) {
 		resetCursor(Graphics::kMacCursorOff, true, resourceId);
 		break;
 	default:
-		warning("Cursor::readBuiltinType failed to read cursor %d", resourceId);
+		warning("Cursor::readBuiltinType failed to read cursor %d", resourceId.asInt());
 		break;
 	}
 }
 
-void Cursor::readFromResource(int resourceId) {
-	if (resourceId == _cursorResId)
+void Cursor::readFromResource(Datum resourceId) {
+	if (resourceId.equalTo(_cursorResId))
 		return;
 
-	switch(resourceId) {
+	if (resourceId.type != INT) {
+		warning("Cursor:readFromResource is not of type INT");
+		return;
+	}
+	switch(resourceId.asInt()) {
 	case -1:
 	case 0:
 	case 1:
@@ -172,9 +179,9 @@ void Cursor::readFromResource(int resourceId) {
 		for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
 			Common::SeekableReadStreamEndian *cursorStream;
 
-			cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'U', 'R', 'S'), resourceId);
+			cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'U', 'R', 'S'), resourceId.asInt());
 			if (!cursorStream)
-				cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'R', 'S', 'R'), resourceId);
+				cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'R', 'S', 'R'), resourceId.asInt());
 
 			if (cursorStream && readFromStream(*((Common::SeekableReadStream *)cursorStream), false, 0)) {
 				_usePalette = true;
@@ -196,11 +203,11 @@ void Cursor::readFromResource(int resourceId) {
 		// for win platform, try the cursor from exe
 		if (!readSuccessful && g_director->getPlatform() == Common::kPlatformWindows) {
 			// i'm not sure, in jman we have cursor id 2, 3, 4. and custom cursor id 128 129 130
-			uint id = (resourceId & 0x7f) + 2;
+			uint id = (resourceId.asInt() & 0x7f) + 2;
 			for (uint i = 0; i < g_director->_winCursor.size(); i++) {
 				for (uint j = 0; j < g_director->_winCursor[i]->cursors.size(); j++) {
 					if (id == g_director->_winCursor[i]->cursors[j].id.getID()) {
-						resetCursor(Graphics::kMacCursorCustom, false, id);
+						resetCursor(Graphics::kMacCursorCustom, false, Datum((int)id));
 						readSuccessful = true;
 					}
 				}
@@ -209,11 +216,11 @@ void Cursor::readFromResource(int resourceId) {
 
 		// fallback method. try to use builtin cursor by regarding resourceId as a single byte.
 		if (!readSuccessful)
-			readBuiltinType(resourceId & 0x7f);
+			readBuiltinType(resourceId.asInt() & 0x7f);
 	}
 }
 
-void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, int resId, CastMemberID castId, CastMemberID maskId) {
+void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, Datum resId) {
 	if (shouldClear)
 		clear();
 
@@ -223,32 +230,23 @@ void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, int res
 
 	_cursorResId = resId;
 
-	_cursorCastId = castId;
-	_cursorMaskId = maskId;
-
 	_hotspotX = 0;
 	_hotspotY = 0;
 }
 
 CursorRef::CursorRef() {
 	_cursorType = Graphics::kMacCursorArrow;
-	_cursorResId = 0;
-	_cursorCastId = CastMemberID(0, 0);
-	_cursorMaskId = CastMemberID(0, 0);
+	_cursorResId = Datum(0);
 }
 
 bool CursorRef::operator==(const Cursor &c) {
 	return _cursorType == c._cursorType &&
-		_cursorResId == c._cursorResId &&
-		_cursorCastId == c._cursorCastId &&
-		_cursorMaskId == c._cursorMaskId;
+		c._cursorResId.equalTo(_cursorResId);
 }
 
 bool CursorRef::operator==(const CursorRef &c) {
 	return _cursorType == c._cursorType &&
-		_cursorResId == c._cursorResId &&
-		_cursorCastId == c._cursorCastId &&
-		_cursorMaskId == c._cursorMaskId;
+		c._cursorResId.equalTo(_cursorResId);
 }
 
 } // End of namespace Director
diff --git a/engines/director/cursor.h b/engines/director/cursor.h
index 2faeed923b..5b0a38281b 100644
--- a/engines/director/cursor.h
+++ b/engines/director/cursor.h
@@ -26,6 +26,8 @@
 
 #include "graphics/macgui/macwindowmanager.h"
 
+#include "engines/director/lingo/lingo.h"
+
 namespace Graphics {
 class ManagedSurface;
 class MacCursor;
@@ -41,11 +43,11 @@ class Cursor : public Graphics::MacCursor {
 
 	CursorRef getRef();
 
-	void readFromCast(CastMemberID cursorId, CastMemberID maskId);
-	void readFromResource(int resourceId);
-	void readBuiltinType(int resourceId);
+	void readFromCast(Datum casts);
+	void readFromResource(Datum resourceId);
+	void readBuiltinType(Datum resourceId);
 
-	bool isEmpty() { return _cursorResId == 0 && _cursorCastId.member == 0; }
+	bool isEmpty() {return Datum(0).equalTo(_cursorResId);}
 	bool operator==(const Cursor &c);
 	bool operator==(const CursorRef &c);
 
@@ -54,13 +56,10 @@ class Cursor : public Graphics::MacCursor {
 
  public:
 	Graphics::MacCursorType _cursorType;
-	int _cursorResId;
-
-	CastMemberID _cursorCastId;
-	CastMemberID _cursorMaskId;
+	Datum _cursorResId;
 
 private:
-	void resetCursor(Graphics::MacCursorType type, bool shouldClear = false, int resId = 0, CastMemberID castId = CastMemberID(0, 0), CastMemberID maskId = CastMemberID(0, 0));
+	void resetCursor(Graphics::MacCursorType type, bool shouldClear = false, Datum resId = Datum(0));
 
 private:
 	bool _usePalette;
@@ -75,9 +74,7 @@ struct CursorRef {
 	bool operator==(const CursorRef &c);
 
 	Graphics::MacCursorType _cursorType;
-	int _cursorResId;
-	CastMemberID _cursorCastId;
-	CastMemberID _cursorMaskId;
+	Datum _cursorResId;
 };
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 303ad1e2f2..4f4de8496a 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1615,15 +1615,7 @@ void LB::b_clearGlobals(int nargs) {
 
 void LB::b_cursor(int nargs) {
 	Datum d = g_lingo->pop();
-
-	if (d.type == ARRAY) {
-		Datum sprite = d.u.farr->arr[0];
-		Datum mask = d.u.farr->arr[1];
-
-		g_lingo->func_cursor(sprite.asMemberID(), mask.asMemberID());
-	} else {
-		g_lingo->func_cursor(d.asInt());
-	}
+	g_lingo->func_cursor(d);
 }
 
 void LB::b_put(int nargs) {
diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index 5ab97d941b..293c589b05 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -313,15 +313,13 @@ void Lingo::func_play(Datum &frame, Datum &movie) {
 	func_goto(frame, movie);
 }
 
-void Lingo::func_cursor(CastMemberID cursorId, CastMemberID maskId) {
+void Lingo::func_cursor(Datum cursorDatum) {
 	Score *score = _vm->getCurrentMovie()->getScore();
-	score->_defaultCursor.readFromCast(cursorId, maskId);
-	score->_cursorDirty = true;
-}
-
-void Lingo::func_cursor(int cursorId) {
-	Score *score = _vm->getCurrentMovie()->getScore();
-	score->_defaultCursor.readFromResource(cursorId);
+	if (cursorDatum.type == ARRAY){
+		score->_defaultCursor.readFromCast(cursorDatum);
+	} else {
+		score->_defaultCursor.readFromResource(cursorDatum);
+	}
 	score->_cursorDirty = true;
 }
 
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 08fbc5bfd2..f2ba681ccf 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1280,16 +1280,7 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
 		d.u.i = channel->_constraint;
 		break;
 	case kTheCursor:
-		if (channel->_cursor._cursorResId) {
-			d.u.i = channel->_cursor._cursorResId;
-		} else {
-			d.type = ARRAY;
-			d.u.farr = new FArray(2);
-
-			// TODO: How is this handled with multiple casts in D5?
-			d.u.farr->arr[0] = (int)channel->_cursor._cursorCastId.member;
-			d.u.farr->arr[1] = (int)channel->_cursor._cursorMaskId.member;
-		}
+		d = channel->_cursor._cursorResId;
 		break;
 	case kTheEditableText:
 		d.u.i = sprite->_editable;
@@ -1486,20 +1477,12 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		}
 		break;
 	case kTheCursor:
-		if (d.type == INT && channel->_cursor._cursorResId != d.asInt()) {
-			channel->_cursor.readFromResource(d.asInt());
-			score->_cursorDirty = true;
-		} else if (d.type == ARRAY && d.u.farr->arr.size() == 2) {
-			CastMemberID cursorId =	d.u.farr->arr[0].asMemberID();
-			CastMemberID maskId = d.u.farr->arr[1].asMemberID();
-
-			if (cursorId == channel->_cursor._cursorCastId &&
-					maskId == channel->_cursor._cursorMaskId)
-				break;
-
-			channel->_cursor.readFromCast(cursorId, maskId);
-			score->_cursorDirty = true;
+		if (d.type == INT) {
+			channel->_cursor.readFromResource(d);
+		} else {
+			channel->_cursor.readFromCast(d);
 		}
+		score->_cursorDirty = true;
 		break;
 	case kTheEditableText:
 		channel->_sprite->_editable = d.asInt();
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 62c18b6bb0..92fdf97bd3 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -358,8 +358,7 @@ public:
 	void func_gotoprevious();
 	void func_play(Datum &frame, Datum &movie);
 	void func_playdone();
-	void func_cursor(CastMemberID cursorId, CastMemberID maskId);
-	void func_cursor(int cursorId);
+	void func_cursor(Datum cursorDatum);
 	int func_marker(int m);
 	uint16 func_label(Datum &label);
 




More information about the Scummvm-git-logs mailing list