[Scummvm-git-logs] scummvm master -> 1a5603c488c2498c4602f8ea234ecee5f80a1165
sev-
noreply at scummvm.org
Wed Jul 13 16:10:54 UTC 2022
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:
4d9b05e2c1 DIRECTOR: Initialize multiple casts, insert loadedCast and sharedCast
1a5603c488 DIRECTOR: LINGO: Remove all occurences of _loadedCast outside of the Cast namespace
Commit: 4d9b05e2c12d949dcef842732086173bf911719d
https://github.com/scummvm/scummvm/commit/4d9b05e2c12d949dcef842732086173bf911719d
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-07-13T18:10:49+02:00
Commit Message:
DIRECTOR: Initialize multiple casts, insert loadedCast and sharedCast
Changed paths:
engines/director/movie.cpp
engines/director/movie.h
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index c76633bcdf7..3124498176a 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -72,6 +72,7 @@ Movie::Movie(Window *window) {
_movieArchive = nullptr;
_cast = new Cast(this, 0);
+ _casts.setVal(_cast->_castLibID, _cast);
_sharedCast = nullptr;
_score = new Score(this);
@@ -311,8 +312,8 @@ void Movie::loadSharedCastsFrom(Common::String filename) {
CastMember *Movie::getCastMember(CastMemberID memberID) {
CastMember *result = nullptr;
- if (memberID.castLib == 0) {
- result = _cast->getCastMember(memberID.member);
+ if (_casts.contains(memberID.castLib)) {
+ result = _casts.getVal(memberID.castLib)->getCastMember(memberID.member);
if (result == nullptr && _sharedCast) {
result = _sharedCast->getCastMember(memberID.member);
}
@@ -325,10 +326,8 @@ CastMember *Movie::getCastMember(CastMemberID memberID) {
CastMember* Movie::createOrReplaceCastMember(CastMemberID memberID, CastMember* cast) {
CastMember *result = nullptr;
- if (memberID.castLib == 0) {
- result = _cast->setCastMember(memberID, cast);
- } else if (memberID.castLib == 1) {
- result = _sharedCast->setCastMember(memberID, cast);
+ if (_casts.contains(memberID.castLib)) {
+ _casts.getVal(memberID.castLib)->setCastMember(memberID, cast);
}
return result;
@@ -336,8 +335,8 @@ CastMember* Movie::createOrReplaceCastMember(CastMemberID memberID, CastMember*
CastMember *Movie::getCastMemberByName(const Common::String &name, int castLib) {
CastMember *result = nullptr;
- if (castLib == 0) {
- result = _cast->getCastMemberByName(name);
+ if (_casts.contains(castLib)) {
+ result = _casts.getVal(castLib)->getCastMemberByName(name);
if (result == nullptr && _sharedCast) {
result = _sharedCast->getCastMemberByName(name);
}
@@ -349,8 +348,8 @@ CastMember *Movie::getCastMemberByName(const Common::String &name, int castLib)
CastMemberInfo *Movie::getCastMemberInfo(CastMemberID memberID) {
CastMemberInfo *result = nullptr;
- if (memberID.castLib == 0) {
- result = _cast->getCastMemberInfo(memberID.member);
+ if (_casts.contains(memberID.castLib)) {
+ result = _casts.getVal(memberID.castLib)->getCastMemberInfo(memberID.member);
if (result == nullptr && _sharedCast) {
result = _sharedCast->getCastMemberInfo(memberID.member);
}
@@ -362,8 +361,8 @@ CastMemberInfo *Movie::getCastMemberInfo(CastMemberID memberID) {
const Stxt *Movie::getStxt(CastMemberID memberID) {
const Stxt *result = nullptr;
- if (memberID.castLib == 0) {
- result = _cast->getStxt(memberID.member);
+ if (_casts.contains(memberID.castLib)) {
+ result = _casts.getVal(memberID.castLib)->getStxt(memberID.member);
if (result == nullptr && _sharedCast) {
result = _sharedCast->getStxt(memberID.member);
}
@@ -374,7 +373,7 @@ const Stxt *Movie::getStxt(CastMemberID memberID) {
}
LingoArchive *Movie::getMainLingoArch() {
- return _cast->_lingoArchive;
+ return _casts.getVal(0)->_lingoArchive;
}
LingoArchive *Movie::getSharedLingoArch() {
@@ -383,8 +382,8 @@ LingoArchive *Movie::getSharedLingoArch() {
ScriptContext *Movie::getScriptContext(ScriptType type, CastMemberID id) {
ScriptContext *result = nullptr;
- if (id.castLib == 0) {
- result = _cast->_lingoArchive->getScriptContext(type, id.member);
+ if (_casts.contains(id.castLib)) {
+ result = _casts.getVal(id.castLib)->_lingoArchive->getScriptContext(type, id.member);
if (result == nullptr && _sharedCast) {
result = _sharedCast->_lingoArchive->getScriptContext(type, id.member);
}
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 1b98b1bb3cc..fd7ecd6891f 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -176,6 +176,7 @@ private:
DirectorEngine *_vm;
Lingo *_lingo;
Cast *_cast;
+ Common::HashMap<int, Cast *> _casts;
Score *_score;
uint32 _flags;
Commit: 1a5603c488c2498c4602f8ea234ecee5f80a1165
https://github.com/scummvm/scummvm/commit/1a5603c488c2498c4602f8ea234ecee5f80a1165
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-07-13T18:10:49+02:00
Commit Message:
DIRECTOR: LINGO: Remove all occurences of _loadedCast outside of the Cast namespace
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-the.cpp
engines/director/movie.cpp
engines/director/movie.h
engines/director/score.cpp
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 10bd6588d3a..9e799e66857 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -170,6 +170,10 @@ const Stxt *Cast::getStxt(int castId) {
return result;
}
+int Cast::getCastSize() {
+ return _loadedCast->size();
+}
+
Common::Rect Cast::getCastMemberInitialRect(int castId) {
CastMember *cast = _loadedCast->getVal(castId);
@@ -201,6 +205,15 @@ CastMember *Cast::setCastMember(CastMemberID castId, CastMember *cast) {
return cast;
}
+bool Cast::eraseCastMember(CastMemberID castId) {
+ if (_loadedCast->contains(castId.member)) {
+ _loadedCast->erase(castId.member);
+ return true;
+ }
+
+ return false;
+}
+
void Cast::setArchive(Archive *archive) {
_castArchive = archive;
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 1e0b227ba6f..98dbe6a46ec 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -95,9 +95,11 @@ public:
void loadSoundCasts();
void copyCastStxts();
+ int getCastSize();
Common::Rect getCastMemberInitialRect(int castId);
void setCastMemberModified(int castId);
CastMember *setCastMember(CastMemberID castId, CastMember *cast);
+ bool eraseCastMember(CastMemberID castId);
CastMember *getCastMember(int castId);
CastMember *getCastMemberByName(const Common::String &name);
CastMember *getCastMemberByScriptId(int scriptId);
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 2da657aeb15..89ca8216e56 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1789,7 +1789,7 @@ void LB::b_duplicate(int nargs) {
auto channels = g_director->getCurrentMovie()->getScore()->_channels;
castMember->setModified(true);
- g_director->getCurrentMovie()->getCast()->_loadedCast->setVal(to.u.i, castMember);
+ g_director->getCurrentMovie()->createOrReplaceCastMember(to.asMemberID(), castMember);
for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) {
if (currentFrame->_sprites[i]->_castId == to.asMemberID())
@@ -1854,9 +1854,9 @@ void LB::b_erase(int nargs) {
void LB::b_findEmpty(int nargs) {
Datum d = g_lingo->pop();
- uint16 c_start = g_director->getCurrentMovie()->getCast()->_castArrayStart;
- uint16 c_end = g_director->getCurrentMovie()->getCast()->_castArrayEnd;
- Common::HashMap<int, CastMember *> *cast = g_director->getCurrentMovie()->getCast()->_loadedCast;
+ Cast *cast = g_director->getCurrentMovie()->getCast();
+ uint16 c_start = cast->_castArrayStart;
+ uint16 c_end = cast->_castArrayEnd;
if (d.type != CASTREF) {
warning("Incorrect argument type for findEmpty");
@@ -1874,7 +1874,7 @@ void LB::b_findEmpty(int nargs) {
}
for (uint16 i = c_start; i <= c_end; i++) {
- if (!cast->contains((int) i) || cast->getVal((int) i)->_type == kCastTypeNull) {
+ if (!(cast->getCastMember(i) && cast->getCastMember(i)->_type != kCastTypeNull)) {
d.u.i = i;
d.type = INT;
g_lingo->push(d);
@@ -2105,7 +2105,7 @@ void LB::b_move(int nargs) {
return;
}
- if (!g_director->getCurrentMovie()->getCast()->_loadedCast->contains(src.u.cast->member)) {
+ if (!g_director->getCurrentMovie()->getCastMember(*src.u.cast)) {
warning("b_move: Source CastMember doesn't exist");
return;
}
@@ -2114,11 +2114,36 @@ void LB::b_move(int nargs) {
warning("b_move: wrong castLib '%d' in src CastMemberID", src.u.cast->castLib);
}
- CastMember *toMove = g_director->getCurrentMovie()->getCast()->_loadedCast->getVal(src.u.cast->member);
+ g_lingo->push(dest);
+ b_erase(1);
+
+ Movie *movie = g_director->getCurrentMovie();
+ uint16 frame = movie->getScore()->getCurrentFrame();
+ Frame *currentFrame = movie->getScore()->_frames[frame];
+ auto channels = g_director->getCurrentMovie()->getScore()->_channels;
+
+
+ movie->getScore()->renderFrame(frame, kRenderForceUpdate);
+
+ CastMember *toMove = g_director->getCurrentMovie()->getCastMember(src.asMemberID());
CastMember *toReplace = new CastMember(*toMove);
toReplace->_type = kCastTypeNull;
- g_director->getCurrentMovie()->getCast()->_loadedCast->setVal(dest.u.cast->member, toMove);
- g_director->getCurrentMovie()->getCast()->_loadedCast->setVal(src.u.cast->member, toReplace);
+ g_director->getCurrentMovie()->createOrReplaceCastMember(dest.asMemberID(), toMove);
+ g_director->getCurrentMovie()->createOrReplaceCastMember(src.asMemberID(), toReplace);
+
+ for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) {
+ if (currentFrame->_sprites[i]->_castId == dest.asMemberID())
+ currentFrame->_sprites[i]->setCast(dest.asMemberID());
+ }
+
+ for (uint i = 0; i < channels.size(); i++) {
+ if (channels[i]->_sprite->_castId == dest.asMemberID()) {
+ channels[i]->_sprite->setCast(CastMemberID(1, 0));
+ channels[i]->_dirty = true;
+ }
+ }
+
+ movie->getScore()->renderFrame(frame, kRenderForceUpdate);
}
void LB::b_moveableSprite(int nargs) {
@@ -2151,7 +2176,7 @@ void LB::b_pasteClipBoardInto(int nargs) {
auto channels = movie->getScore()->_channels;
castMember->setModified(true);
- movie->getCast()->_loadedCast->setVal(to.u.cast->member, castMember);
+ movie->createOrReplaceCastMember(*to.u.cast, castMember);
for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) {
if (currentFrame->_sprites[i]->_castId == to.asMemberID())
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index f706041c002..75c3a085ede 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -392,7 +392,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
break;
case kTheCastMembers:
d.type = INT;
- d.u.i = movie->getCast()->_loadedCast->size() + (movie->_sharedCast ? movie->_sharedCast->_loadedCast->size() : 0);
+ d.u.i = movie->getCast()->getCastSize() + (movie->_sharedCast ? movie->_sharedCast->getCastSize() : 0);
break;
case kTheCenterStage:
d.type = INT;
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 3124498176a..5f5d36b05da 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -95,7 +95,6 @@ Movie::Movie(Window *window) {
Movie::~Movie() {
// _movieArchive is shared with the cast, so the cast will free it
delete _cast;
-
delete _sharedCast;
delete _score;
}
@@ -333,6 +332,14 @@ CastMember* Movie::createOrReplaceCastMember(CastMemberID memberID, CastMember*
return result;
}
+bool Movie::eraseCastMember(CastMemberID memberID) {
+ if (_casts.contains(memberID.castLib)) {
+ return _casts.getVal(memberID.castLib)->eraseCastMember(memberID);
+ }
+
+ return false;
+}
+
CastMember *Movie::getCastMemberByName(const Common::String &name, int castLib) {
CastMember *result = nullptr;
if (_casts.contains(castLib)) {
diff --git a/engines/director/movie.h b/engines/director/movie.h
index fd7ecd6891f..01efcc0318b 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -94,7 +94,7 @@ public:
Common::String getMacName() const { return _macName; }
Window *getWindow() const { return _window; }
DirectorEngine *getVM() const { return _vm; }
- Cast *getCast() const { return _cast; }
+ Cast *getCast() const { return _casts.getValOrDefault(0, nullptr); }
Cast *getSharedCast() const { return _sharedCast; }
Score *getScore() const { return _score; }
@@ -103,6 +103,7 @@ public:
CastMember *getCastMember(CastMemberID memberID);
CastMember *createOrReplaceCastMember(CastMemberID memberID, CastMember *cast);
+ bool eraseCastMember(CastMemberID memberID);
CastMember *getCastMemberByName(const Common::String &name, int castLib);
CastMemberInfo *getCastMemberInfo(CastMemberID memberID);
const Stxt *getStxt(CastMemberID memberID);
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index ddda2db3858..b68de298a64 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -562,14 +562,8 @@ void Score::renderSprites(uint16 frameId, RenderMode mode) {
_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;
- }
- }
+ _movie->eraseCastMember(currentSprite->_castId);
+ currentSprite->_cast->_erase = false;
currentSprite->setCast(currentSprite->_castId);
nextSprite->setCast(nextSprite->_castId);
More information about the Scummvm-git-logs
mailing list