[Scummvm-git-logs] scummvm master -> 8d251696059e28a51fd4941e973f07fb3566c2c8

npjg nathanael.gentrydb8 at gmail.com
Thu Jun 18 22:12:39 UTC 2020


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

Summary:
4fdba316fc DIRECTOR: LINGO: Fetch cast IDs in b_cast
8d25169605 DIRECTOR: Implement rudimentary constraint of sprite


Commit: 4fdba316fc6214ae92267fad1b2ef432831e76e6
    https://github.com/scummvm/scummvm/commit/4fdba316fc6214ae92267fad1b2ef432831e76e6
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-06-18T18:12:32-04:00

Commit Message:
DIRECTOR: LINGO: Fetch cast IDs in b_cast

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 5dd44ab790..666d93a651 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2142,9 +2142,7 @@ void LB::b_version(int nargs) {
 void LB::b_cast(int nargs) {
 	Datum d = g_lingo->pop();
 
-	warning("STUB: b_cast");
-
-	Datum res(0);
+	Datum res(g_lingo->castIdFetch(d));
 	res.type = REFERENCE;
 	g_lingo->push(res);
 }


Commit: 8d251696059e28a51fd4941e973f07fb3566c2c8
    https://github.com/scummvm/scummvm/commit/8d251696059e28a51fd4941e973f07fb3566c2c8
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-06-18T18:12:32-04:00

Commit Message:
DIRECTOR: Implement rudimentary constraint of sprite

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/score.cpp
    engines/director/score.h
    engines/director/sprite.cpp
    engines/director/sprite.h


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 5f05bf8c30..74139f4e58 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -712,7 +712,7 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
 		d.u.i = sprite->_castId;
 		break;
 	case kTheConstraint:
-		d.u.i = sprite->_constraint;
+		d.u.i = channel->_constraint;
 		break;
 	case kTheEditableText:
 		d.u.i = sprite->_cast ? sprite->_cast->isEditable() : 0;
@@ -831,7 +831,15 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		sprite->setCast(d.asInt());
 		break;
 	case kTheConstraint:
-		sprite->_constraint = d.asInt();
+		if (d.type == REFERENCE) {
+			// Reference: Cast ID
+			// Find the first channel that uses this cast.
+			for (uint i = 0; i < score->_channels.size(); i++)
+				if (score->_channels[i]->_sprite->_castId == d.u.i)
+					d.u.i = i;
+		}
+
+		channel->_constraint = d.u.i;
 		break;
 	case kTheEditableText:
 		sprite->_cast ? sprite->_cast->setEditable(d.asInt()) : false;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 808ea0361a..b843c4b314 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -65,7 +65,16 @@ void Channel::updateLocation() {
 }
 
 void Channel::addDelta(Common::Point pos) {
-	// This method is for easily implementing constraint of sprite
+	if (_sprite->_moveable && _constraint > 0) {
+		Common::Rect constraintBbox = g_director->getCurrentScore()->_channels[_constraint]->getBbox();
+
+		Common::Rect currentBbox = getBbox();
+		currentBbox.translate(pos.x, pos.y);
+
+		// TODO: Snap to the nearest point on the rectangle.
+		if (constraintBbox.findIntersectingRect(currentBbox) != currentBbox)
+			return;
+	}
 
 	_delta += pos;
 }
diff --git a/engines/director/score.h b/engines/director/score.h
index 0c3c5258e4..3c950cf545 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -90,6 +90,7 @@ struct Channel {
 	Sprite *_sprite;
 
 	bool _visible;
+	uint _constraint;
 	Common::Point _currentPoint;
 	Common::Point _delta;
 
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index a06d225b9e..c7b1211ab9 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -53,7 +53,6 @@ Sprite::Sprite() {
 	_dirty = false;
 	_width = 0;
 	_height = 0;
-	_constraint = 0;
 	_moveable = false;
 	_editable = false;
 	_puppet = false;
diff --git a/engines/director/sprite.h b/engines/director/sprite.h
index e49fd67420..f6b9373f6c 100644
--- a/engines/director/sprite.h
+++ b/engines/director/sprite.h
@@ -95,9 +95,6 @@ public:
 	Common::Point _startPoint;
 	int16 _width;
 	int16 _height;
-	// TODO: default constraint = 0, if turned on, sprite is constrainted to the bounding rect
-	// As i know, constrainted != 0 only if sprite moveable
-	byte _constraint;
 	bool _moveable;
 	bool _editable;
 	bool _puppet;




More information about the Scummvm-git-logs mailing list