[Scummvm-git-logs] scummvm master -> 3610df85c63794eebd77b2a1e1b69052741b5506

sev- noreply at scummvm.org
Sat Mar 26 21:59:00 UTC 2022


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:
3610df85c6 DIRECTOR: Implement erase lingo command


Commit: 3610df85c63794eebd77b2a1e1b69052741b5506
    https://github.com/scummvm/scummvm/commit/3610df85c63794eebd77b2a1e1b69052741b5506
Author: Pragyansh Chaturvedi (r41k0u) (pragyanshchaturvedi18 at gmail.com)
Date: 2022-03-26T22:58:55+01:00

Commit Message:
DIRECTOR: Implement erase lingo command

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    engines/director/channel.cpp
    engines/director/lingo/lingo-builtins.cpp
    engines/director/score.cpp
    engines/director/sprite.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 8a802e53163..bc7b8479287 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -52,6 +52,7 @@ CastMember::CastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndi
 	_objType = kCastMemberObj;
 
 	_widget = nullptr;
+	_erase = false;
 }
 
 CastMemberInfo *CastMember::getInfo() {
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 4b11389a039..27ee98750b2 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -99,6 +99,7 @@ public:
 	Common::Array<Resource> _children;
 
 	bool _hilite;
+	bool _erase;
 	int _purgePriority;
 	uint32 _size;
 	uint8 _flags1;
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index cb15531055c..a5ddb1fd875 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -61,7 +61,8 @@ Channel::Channel(Sprite *sp, int priority) {
 	_visible = true;
 	_dirty = true;
 
-	_sprite->updateEditable();
+	if (_sprite)
+		_sprite->updateEditable();
 }
 
 Channel::Channel(const Channel &channel) {
@@ -200,7 +201,7 @@ bool Channel::isDirty(Sprite *nextSprite) {
 		_delta != Common::Point(0, 0) ||
 		(_sprite->_cast && _sprite->_cast->isModified());
 
-	if (!_sprite->_puppet) {
+	if (_sprite && !_sprite->_puppet) {
 		// When puppet is set, the overall dirty flag should be set when sprite is
 		// modified.
 		isDirtyFlag |= _sprite->_castId != nextSprite->_castId ||
@@ -313,14 +314,15 @@ bool Channel::isMatteWithin(Channel *channel) {
 }
 
 bool Channel::isActiveVideo() {
-	if (!_sprite->_cast || _sprite->_cast->_type != kCastDigitalVideo)
+	if (_sprite && (!_sprite->_cast || _sprite->_cast->_type != kCastDigitalVideo))
 		return false;
 
 	return true;
 }
 
 void Channel::updateVideoTime() {
-	_movieTime = ((DigitalVideoCastMember *)_sprite->_cast)->getMovieCurrentTime();
+	if (_sprite)
+		_movieTime = ((DigitalVideoCastMember *)_sprite->_cast)->getMovieCurrentTime();
 }
 
 bool Channel::isVideoDirectToStage() {
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 5892e6226fb..6d5d841ceeb 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1776,9 +1776,19 @@ void LB::b_editableText(int nargs) {
 }
 
 void LB::b_erase(int nargs) {
-	g_lingo->printSTUBWithArglist("b_erase", nargs);
+	Datum d = g_lingo->pop();
+	CastMember *eraseCast = g_director->getCurrentMovie()->getCastMember(d.asMemberID());
 
-	g_lingo->dropStack(nargs);
+	if (eraseCast) {
+		eraseCast->_erase = true;
+		Common::Array<Channel *> channels = g_director->getCurrentMovie()->getScore()->_channels;
+
+		for (uint i = 0; i < channels.size(); i++) {
+			if (channels[i]->_sprite->_castId == d.asMemberID()) {
+				channels[i]->_dirty = true;
+			}
+		}
+	}
 }
 
 void LB::b_findEmpty(int nargs) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index f48cbbb3283..079d8f09b1e 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -556,9 +556,23 @@ void Score::renderSprites(uint16 frameId, RenderMode mode) {
 		}
 
 		if (channel->isDirty(nextSprite) || widgetRedrawn || mode == kRenderForceUpdate) {
-			if (!currentSprite->_trails)
+			if (currentSprite && !currentSprite->_trails)
 				_window->addDirtyRect(channel->getBbox());
 
+			if (currentSprite->_cast && currentSprite->_cast->_erase) {
+				auto cast = currentSprite->_cast->getCast()->_loadedCast;
+				for (auto it = cast->begin(); it != cast->end(); ++it) {
+					if (it->_value == currentSprite->_cast) {
+						cast->erase(it);
+						currentSprite->_cast->_erase = false;
+						break;
+					}
+				}
+
+				currentSprite->setCast(currentSprite->_castId);
+				nextSprite->setCast(nextSprite->_castId);
+			}
+
 			channel->setClean(nextSprite, i);
 			// Check again to see if a video has just been started by setClean.
 			if (channel->isActiveVideo())
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index 156d6644cc9..36241f934cb 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -292,7 +292,6 @@ Common::Point Sprite::getRegistrationOffset() {
 		{
 			BitmapCastMember *bc = (BitmapCastMember *)(_cast);
 
-			Common::Point point(0, 0);
 			// stretch the offset
 			if (!_stretch && (_width != bc->_initialRect.width() || _height != bc->_initialRect.height())) {
 				result.x = (bc->_initialRect.left - bc->_regX) * _width / bc->_initialRect.width();




More information about the Scummvm-git-logs mailing list