[Scummvm-git-logs] scummvm master -> c54ccf480b73b416c96c3985b37c20173efcdb06

djsrv noreply at scummvm.org
Mon Jun 27 03:53:12 UTC 2022


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:
f638e61a04 DIRECTOR: LINGO: Implement map builtin STUB
42dfdd9f35 DIRECTOR: LINGO: Implement constraint in Channel::getBbox(), Fix getActive() to return true for movable sprites
c54ccf480b DIRECTOR: LINGO: Add type checks and support for POINT, RECT and ARRAY DatumTypes in b_map


Commit: f638e61a04588d2783fc3056266f020f297420dc
    https://github.com/scummvm/scummvm/commit/f638e61a04588d2783fc3056266f020f297420dc
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-06-26T22:53:08-05:00

Commit Message:
DIRECTOR: LINGO: Implement map builtin STUB

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 a17d7d85781..485376e8474 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2576,11 +2576,22 @@ void LB::b_inside(int nargs) {
 }
 
 void LB::b_map(int nargs) {
-	g_lingo->printSTUBWithArglist("b_map", nargs);
+	Datum toRect = g_lingo->pop();
+	Datum fromRect = g_lingo->pop();
+	Datum srcPnt = g_lingo->pop();
 
-	g_lingo->dropStack(nargs);
+	int toWidth = toRect.u.farr->arr[2].u.i - toRect.u.farr->arr[0].u.i;
+	int toHeight = toRect.u.farr->arr[3].u.i - toRect.u.farr->arr[1].u.i;
+	int fromWidth = fromRect.u.farr->arr[2].u.i - fromRect.u.farr->arr[0].u.i;
+	int fromHeight = fromRect.u.farr->arr[3].u.i - fromRect.u.farr->arr[1].u.i;
 
-	g_lingo->push(Datum(0));
+	Datum d;
+	d.type = POINT;
+	d.u.farr = new FArray();
+	d.u.farr->arr.push_back(-((fromRect.u.farr->arr[2].u.i - srcPnt.u.farr->arr[0].u.i) * (toWidth / fromWidth)) + (fromRect.u.farr->arr[0].u.i) + toRect.u.farr->arr[0].u.i);
+	d.u.farr->arr.push_back(-((fromRect.u.farr->arr[3].u.i - srcPnt.u.farr->arr[1].u.i) * (toHeight / fromHeight)) + (fromRect.u.farr->arr[3].u.i));
+
+	g_lingo->push(d);
 }
 
 void LB::b_offsetRect(int nargs) {


Commit: 42dfdd9f35564d2e084b7b0be45be2ef692a2c8e
    https://github.com/scummvm/scummvm/commit/42dfdd9f35564d2e084b7b0be45be2ef692a2c8e
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-06-26T22:53:08-05:00

Commit Message:
DIRECTOR: LINGO: Implement constraint in Channel::getBbox(), Fix getActive() to return true for movable sprites

Changed paths:
    engines/director/channel.cpp
    engines/director/sprite.cpp


diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index c95516cde7a..83d5817fc7e 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -334,7 +334,20 @@ bool Channel::isVideoDirectToStage() {
 
 Common::Rect Channel::getBbox(bool unstretched) {
 	Common::Rect result(unstretched ? _sprite->_width : _width,
-											unstretched ? _sprite->_height : _height);
+						unstretched ? _sprite->_height : _height);
+	result.moveTo(getPosition());
+
+	if (_constraint) {
+		Common::Rect constraintBbox = g_director->getCurrentMovie()->getScore()->_channels[_constraint]->getBbox();
+		if (result.top < constraintBbox.top)
+			_currentPoint.y = constraintBbox.top;
+		if (result.left < constraintBbox.left)
+			_currentPoint.x = constraintBbox.left;
+		if (result.top > constraintBbox.bottom)
+			_currentPoint.y = constraintBbox.bottom;
+		if (result.left > constraintBbox.right)
+			_currentPoint.x = constraintBbox.right;
+	}
 	result.moveTo(getPosition());
 
 	return result;
@@ -663,14 +676,14 @@ void Channel::addDelta(Common::Point pos) {
 		if (!constraintBbox.contains(currentBbox)) {
 			if (currentBbox.top < constraintBbox.top) {
 				pos.y += constraintBbox.top - currentBbox.top;
-			} else if (currentBbox.bottom > constraintBbox.bottom) {
-				pos.y += constraintBbox.bottom - currentBbox.bottom;
+			} else if (currentBbox.top > constraintBbox.bottom) {
+				pos.y += constraintBbox.bottom;
 			}
 
 			if (currentBbox.left < constraintBbox.left) {
 				pos.x += constraintBbox.left - currentBbox.left;
-			} else if (currentBbox.right > constraintBbox.right) {
-				pos.x += constraintBbox.right - currentBbox.right;
+			} else if (currentBbox.left > constraintBbox.right) {
+				pos.x += constraintBbox.right;
 			}
 		}
 	}
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 0cfa44851ed..b4830509b33 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -350,6 +350,9 @@ bool Sprite::respondsToMouse() {
 }
 
 bool Sprite::isActive() {
+	if (_moveable)
+		return true;
+
 	if (_cast && _cast->_type == kCastButton)
 		return true;
 


Commit: c54ccf480b73b416c96c3985b37c20173efcdb06
    https://github.com/scummvm/scummvm/commit/c54ccf480b73b416c96c3985b37c20173efcdb06
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-06-26T22:53:08-05:00

Commit Message:
DIRECTOR: LINGO: Add type checks and support for POINT, RECT and ARRAY DatumTypes in b_map

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 485376e8474..810767f56a6 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2578,18 +2578,38 @@ void LB::b_inside(int nargs) {
 void LB::b_map(int nargs) {
 	Datum toRect = g_lingo->pop();
 	Datum fromRect = g_lingo->pop();
-	Datum srcPnt = g_lingo->pop();
+	Datum srcArr = g_lingo->pop();
+
+	if (!(toRect.type == RECT || (toRect.type == ARRAY && toRect.u.farr->arr.size() == 4)) ||
+		!(fromRect.type == RECT || (fromRect.type == ARRAY && fromRect.u.farr->arr.size() == 4))) {
+		warning("LB::b_map(): Invalid Datum Type of source and destination Rects");
+		return;
+	}
 
 	int toWidth = toRect.u.farr->arr[2].u.i - toRect.u.farr->arr[0].u.i;
 	int toHeight = toRect.u.farr->arr[3].u.i - toRect.u.farr->arr[1].u.i;
 	int fromWidth = fromRect.u.farr->arr[2].u.i - fromRect.u.farr->arr[0].u.i;
 	int fromHeight = fromRect.u.farr->arr[3].u.i - fromRect.u.farr->arr[1].u.i;
 
+	if (!(srcArr.type == POINT ||
+		srcArr.type == RECT ||
+		(srcArr.type == ARRAY && (srcArr.u.farr->arr.size() == 2 || srcArr.u.farr->arr.size() == 4)))) {
+		warning("LB::b_map(): Invalid Datum type of input Point / Rect");
+		return;
+	}
+
 	Datum d;
 	d.type = POINT;
 	d.u.farr = new FArray();
-	d.u.farr->arr.push_back(-((fromRect.u.farr->arr[2].u.i - srcPnt.u.farr->arr[0].u.i) * (toWidth / fromWidth)) + (fromRect.u.farr->arr[0].u.i) + toRect.u.farr->arr[0].u.i);
-	d.u.farr->arr.push_back(-((fromRect.u.farr->arr[3].u.i - srcPnt.u.farr->arr[1].u.i) * (toHeight / fromHeight)) + (fromRect.u.farr->arr[3].u.i));
+	d.u.farr->arr.push_back((srcArr.u.farr->arr[0].u.i - fromRect.u.farr->arr[0].u.i) * (toWidth / fromWidth) + toRect.u.farr->arr[0].u.i);
+	d.u.farr->arr.push_back((srcArr.u.farr->arr[1].u.i - fromRect.u.farr->arr[1].u.i) * (toHeight / fromHeight) + toRect.u.farr->arr[1].u.i);
+
+	if (srcArr.type == RECT ||
+		(srcArr.type == ARRAY && srcArr.u.farr->arr.size() == 4)) {
+		d.type = RECT;
+		d.u.farr->arr.push_back((srcArr.u.farr->arr[2].u.i - srcArr.u.farr->arr[0].u.i) * (toWidth / fromWidth) + d.u.farr->arr[0].u.i);
+		d.u.farr->arr.push_back((srcArr.u.farr->arr[3].u.i - srcArr.u.farr->arr[1].u.i) * (toWidth / fromWidth) + d.u.farr->arr[1].u.i);
+	}
 
 	g_lingo->push(d);
 }




More information about the Scummvm-git-logs mailing list