[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