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

npjg nathanael.gentrydb8 at gmail.com
Mon Jul 13 21:36:54 UTC 2020


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

Summary:
0d84a57dd4 DIRECTOR: Retrieve cast hilite in the right place
d6af252e09 DIRECTOR: Only test for castInfo on fields that need it
0f5cc7cca8 DIRECTOR: Don't look only for focusable sprites
d5539a66e1 DIRECTOR: Don't run setClean on empty channels


Commit: 0d84a57dd4c8cccce4e16e2ad55f7e2c399aab44
    https://github.com/scummvm/scummvm/commit/0d84a57dd4c8cccce4e16e2ad55f7e2c399aab44
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-13T17:32:54-04:00

Commit Message:
DIRECTOR: Retrieve cast hilite in the right place

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


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 52cab47dbc..d8f446af63 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1334,11 +1334,6 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 	}
 	Cast *cast = member->getCast();
 
-	if (field == kTheHilite) {
-		d.u.i = member->_hilite;
-		return d;
-	}
-
 	CastType castType = member->_type;
 	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
 	if (!castInfo) {
@@ -1404,7 +1399,7 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		d.u.i = cast->getCastMemberInitialRect(id).height();
 		break;
 	case kTheHilite:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
+		d.u.i = member->_hilite;
 		break;
 	case kTheLoaded:
 		d.u.i = 1; //Not loaded handled above


Commit: d6af252e093a46fb9cc4ec656275684b790c5cfc
    https://github.com/scummvm/scummvm/commit/d6af252e093a46fb9cc4ec656275684b790c5cfc
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-13T17:32:54-04:00

Commit Message:
DIRECTOR: Only test for castInfo on fields that need it

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


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index d8f446af63..aea7f27050 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1336,10 +1336,8 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 
 	CastType castType = member->_type;
 	CastMemberInfo *castInfo = cast->getCastMemberInfo(id);
-	if (!castInfo) {
+	if (!castInfo)
 		warning("Lingo::getTheCast(): CastMember info for %d not found", id);
-		return d;
-	}
 
 	switch (field) {
 	case kTheBackColor:
@@ -1383,7 +1381,8 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
 		break;
 	case kTheFileName:
-		d = Datum(castInfo->fileName);
+		if (castInfo)
+			d = Datum(castInfo->fileName);
 		break;
 	case kTheForeColor:
 		d.u.i = member->getForeColor();
@@ -1415,7 +1414,8 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
 		break;
 	case kTheName:
-		d = Datum(castInfo->name);
+		if (castInfo)
+			d = Datum(castInfo->name);
 		break;
 	case kTheNumber:
 		d.u.i = id;
@@ -1450,7 +1450,8 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
 		break;
 	case kTheScriptText:
-		d = Datum(castInfo->script);
+		if (castInfo)
+			d = Datum(castInfo->script);
 		break;
 	case kTheSize:
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);


Commit: 0f5cc7cca80325362ca797971860aa7e9de7f698
    https://github.com/scummvm/scummvm/commit/0f5cc7cca80325362ca797971860aa7e9de7f698
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-13T17:32:54-04:00

Commit Message:
DIRECTOR: Don't look only for focusable sprites

Instead, there is an option to return the topmost non-focusable sprite, too.
Some scripts don't have buttons on them; they are just there for the hilite.

Changed paths:
    engines/director/score.cpp
    engines/director/score.h
    engines/director/sprite.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index cc4d8a9f76..7894194182 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -442,12 +442,18 @@ void Score::screenShot() {
 	newSurface->free();
 }
 
-uint16 Score::getSpriteIDFromPos(Common::Point pos, bool onlyActive) {
+uint16 Score::getSpriteIDFromPos(Common::Point pos, bool firstActive) {
+	int unfocusableSprite = 0;
+
 	for (int i = _channels.size() - 1; i >= 0; i--)
-		if (_channels[i]->getBbox().contains(pos) && (!onlyActive || _channels[i]->_sprite->isFocusable()))
-			return i;
+		if (_channels[i]->getBbox().contains(pos)) {
+			if (!firstActive || _channels[i]->_sprite->isFocusable())
+				return i;
+			else if (unfocusableSprite == 0)
+				unfocusableSprite = i;
+		}
 
-	return 0;
+	return unfocusableSprite;
 }
 
 bool Score::checkSpriteIntersection(uint16 spriteId, Common::Point pos) {
diff --git a/engines/director/score.h b/engines/director/score.h
index ba73d13c6f..b8d872e94b 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -87,7 +87,7 @@ public:
 	int getCurrentLabelNumber();
 	int getNextLabelNumber(int referenceFrame);
 
-	uint16 getSpriteIDFromPos(Common::Point pos, bool onlyActive = false);
+	uint16 getSpriteIDFromPos(Common::Point pos, bool firstActive = false);
 	bool checkSpriteIntersection(uint16 spriteId, Common::Point pos);
 	Common::List<Channel *> getSpriteIntersections(const Common::Rect &r);
 
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 1527625428..ad97c56d19 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -99,7 +99,7 @@ bool Sprite::isFocusable() {
 }
 
 bool Sprite::shouldHilite() {
-	if ((_cast && _cast->_autoHilite) || (isQDShape() && _ink == kInkTypeMatte))
+	if (isFocusable() && ((_cast && _cast->_autoHilite) || (isQDShape() && _ink == kInkTypeMatte)))
 		if (g_director->getVersion() < 4 && !_moveable)
 			if (g_director->getCurrentMovie()->getScriptContext(kScoreScript, _scriptId) ||
 					g_director->getCurrentMovie()->getScriptContext(kCastScript, _castId))


Commit: d5539a66e18c03268bc3b91fce55511377f62ca3
    https://github.com/scummvm/scummvm/commit/d5539a66e18c03268bc3b91fce55511377f62ca3
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-13T17:32:54-04:00

Commit Message:
DIRECTOR: Don't run setClean on empty channels

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 7894194182..6d600280d8 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -409,15 +409,16 @@ void Score::renderSprites(uint16 frameId, RenderMode mode) {
 		Sprite *currentSprite = channel->_sprite;
 		Sprite *nextSprite = _frames[frameId]->_sprites[i];
 
-		bool needsUpdate = channel->isDirty(nextSprite) || mode == kRenderForceUpdate;
+		if (channel->isDirty(nextSprite) || mode == kRenderForceUpdate) {
+			if (!currentSprite->_trails)
+				_stage->addDirtyRect(channel->getBbox());
 
-		if (needsUpdate && !currentSprite->_trails)
-			_stage->addDirtyRect(channel->getBbox());
-
-		channel->setClean(nextSprite, i);
-
-		if (needsUpdate)
+			channel->setClean(nextSprite, i);
 			_stage->addDirtyRect(channel->getBbox());
+		} else if (!channel->_sprite->_puppet) {
+			// Updating scripts, etc. does not require a full re-render
+			channel->_sprite->_scriptId = nextSprite->_scriptId;
+		}
 	}
 }
 




More information about the Scummvm-git-logs mailing list