From 5496db64fb4e2dcbd426b36c2cd85a72ef9f2aed Mon Sep 17 00:00:00 2001 From: "Pragyansh Chaturvedi (r41k0u)" Date: Sat, 26 Mar 2022 16:57:11 +0530 Subject: [PATCH] DIRECTOR: Add duplicate lingo command --- engines/director/cast.cpp | 5 ++++- engines/director/lingo/lingo-builtins.cpp | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp index 201f6a6c932..08390078ab9 100644 --- a/engines/director/cast.cpp +++ b/engines/director/cast.cpp @@ -99,7 +99,10 @@ Cast::~Cast() { if (_loadedCast) for (Common::HashMap::iterator it = _loadedCast->begin(); it != _loadedCast->end(); ++it) - delete it->_value; + if (it->_value) { + it->_value = nullptr; + delete it->_value; + } for (Common::HashMap::iterator it = _castsInfo.begin(); it != _castsInfo.end(); ++it) delete it->_value; diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp index 6d5d841ceeb..b49e9dd386e 100644 --- a/engines/director/lingo/lingo-builtins.cpp +++ b/engines/director/lingo/lingo-builtins.cpp @@ -1738,9 +1738,27 @@ void LB::b_copyToClipBoard(int nargs) { } void LB::b_duplicate(int nargs) { - g_lingo->printSTUBWithArglist("b_duplicate", nargs); + Datum to = g_lingo->pop(); + Datum from = g_lingo->pop(); - g_lingo->dropStack(nargs); + Frame *currentFrame = g_director->getCurrentMovie()->getScore()->_frames[g_director->getCurrentMovie()->getScore()->getCurrentFrame()]; + CastMember *castMember = g_director->getCurrentMovie()->getCastMember(from.asMemberID()); + auto channels = g_director->getCurrentMovie()->getScore()->_channels; + + castMember->setModified(true); + g_director->getCurrentMovie()->getCast()->_loadedCast->setVal(to.u.i, castMember); + + for (uint16 i = 0; i < currentFrame->_sprites.size(); i++) { + if (currentFrame->_sprites[i]->_castId == to.asMemberID()) + currentFrame->_sprites[i]->setCast(to.asMemberID()); + } + + for (uint i = 0; i < channels.size(); i++) { + if (channels[i]->_sprite->_castId == to.asMemberID()) { + channels[i]->_sprite->setCast(to.asMemberID()); + channels[i]->_dirty = true; + } + } } void LB::b_editableText(int nargs) {