@@ -53,7 +53,7 @@ Engine::Engine() :
5353Engine::~Engine ()
5454{
5555    m_clones.clear ();
56-     m_executableTargets .clear ();
56+     m_sortedDrawables .clear ();
5757}
5858
5959void  Engine::clear ()
@@ -73,7 +73,7 @@ void Engine::clear()
7373    m_monitors.clear ();
7474    m_extensions.clear ();
7575    m_broadcastMap.clear ();
76-     m_executableTargets .clear ();
76+     m_sortedDrawables .clear ();
7777    m_threads.clear ();
7878    m_threadsToStop.clear ();
7979    m_scripts.clear ();
@@ -440,15 +440,15 @@ void Engine::initClone(std::shared_ptr<Sprite> clone)
440440    startHats (HatType::CloneInit, {}, clone.get ());
441441
442442    assert (std::find (m_clones.begin (), m_clones.end (), clone) == m_clones.end ());
443-     assert (std::find (m_executableTargets .begin (), m_executableTargets .end (), clone.get ()) == m_executableTargets .end ());
443+     assert (std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), clone.get ()) == m_sortedDrawables .end ());
444444    m_clones.insert (clone);
445-     m_executableTargets .push_back (clone.get ()); //  execution order needs to be updated after this
445+     m_sortedDrawables .push_back (clone.get ()); //  execution order needs to be updated after this
446446}
447447
448448void  Engine::deinitClone (std::shared_ptr<Sprite> clone)
449449{
450450    m_clones.erase (clone);
451-     m_executableTargets .erase (std::remove (m_executableTargets .begin (), m_executableTargets .end (), clone.get ()), m_executableTargets .end ());
451+     m_sortedDrawables .erase (std::remove (m_sortedDrawables .begin (), m_sortedDrawables .end (), clone.get ()), m_sortedDrawables .end ());
452452}
453453
454454void  Engine::stopSounds ()
@@ -1144,10 +1144,10 @@ const std::vector<std::shared_ptr<Target>> &Engine::targets() const
11441144void  Engine::setTargets (const  std::vector<std::shared_ptr<Target>> &newTargets)
11451145{
11461146    m_targets = newTargets;
1147-     m_executableTargets .clear ();
1147+     m_sortedDrawables .clear ();
11481148
11491149    for  (auto  target : m_targets) {
1150-         m_executableTargets .push_back (target.get ());
1150+         m_sortedDrawables .push_back (target.get ());
11511151
11521152        //  Set engine in the target
11531153        target->setEngine (this );
@@ -1160,8 +1160,8 @@ void Engine::setTargets(const std::vector<std::shared_ptr<Target>> &newTargets)
11601160        }
11611161    }
11621162
1163-     //  Sort the executable targets  by layer order
1164-     std::sort (m_executableTargets .begin (), m_executableTargets .end (), [](Target *t1, Target *t2 ) { return  t1 ->layerOrder () < t2 ->layerOrder (); });
1163+     //  Sort the drawables  by layer order
1164+     std::sort (m_sortedDrawables .begin (), m_sortedDrawables .end (), [](Drawable *d1, Drawable *d2 ) { return  d1 ->layerOrder () < d2 ->layerOrder (); });
11651165}
11661166
11671167Target *Engine::targetAt (int  index) const 
@@ -1213,27 +1213,27 @@ int Engine::findTarget(const std::string &targetName) const
12131213
12141214void  Engine::moveSpriteToFront (Sprite *sprite)
12151215{
1216-     if  (!sprite || m_executableTargets .size () <= 2 )
1216+     if  (!sprite || m_sortedDrawables .size () <= 2 )
12171217        return ;
12181218
1219-     auto  it = std::find (m_executableTargets .begin (), m_executableTargets .end (), sprite);
1219+     auto  it = std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), sprite);
12201220
1221-     if  (it != m_executableTargets .end ()) {
1222-         std::rotate (it, it + 1 , m_executableTargets .end ());
1223-         updateSpriteLayerOrder ();
1221+     if  (it != m_sortedDrawables .end ()) {
1222+         std::rotate (it, it + 1 , m_sortedDrawables .end ());
1223+         updateDrawableLayerOrder ();
12241224    }
12251225}
12261226
12271227void  Engine::moveSpriteToBack (Sprite *sprite)
12281228{
1229-     if  (!sprite || m_executableTargets .size () <= 2 )
1229+     if  (!sprite || m_sortedDrawables .size () <= 2 )
12301230        return ;
12311231
1232-     auto  it = std::find (m_executableTargets .begin (), m_executableTargets .end (), sprite);
1232+     auto  it = std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), sprite);
12331233
1234-     if  (it != m_executableTargets .end ()) {
1235-         std::rotate (m_executableTargets .begin () + 1 , it, it + 1 ); //  stage is always the first
1236-         updateSpriteLayerOrder ();
1234+     if  (it != m_sortedDrawables .end ()) {
1235+         std::rotate (m_sortedDrawables .begin () + 1 , it, it + 1 ); //  stage is always the first
1236+         updateDrawableLayerOrder ();
12371237    }
12381238}
12391239
@@ -1242,19 +1242,19 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12421242    if  (!sprite || layers == 0 )
12431243        return ;
12441244
1245-     auto  it = std::find (m_executableTargets .begin (), m_executableTargets .end (), sprite);
1245+     auto  it = std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), sprite);
12461246
1247-     if  (it == m_executableTargets .end ())
1247+     if  (it == m_sortedDrawables .end ())
12481248        return ;
12491249
12501250    auto  target = it + layers;
12511251
1252-     if  (target <= m_executableTargets .begin ()) {
1252+     if  (target <= m_sortedDrawables .begin ()) {
12531253        moveSpriteToBack (sprite);
12541254        return ;
12551255    }
12561256
1257-     if  (target >= m_executableTargets .end ()) {
1257+     if  (target >= m_sortedDrawables .end ()) {
12581258        moveSpriteToFront (sprite);
12591259        return ;
12601260    }
@@ -1264,7 +1264,7 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12641264    else 
12651265        std::rotate (target, it, it + 1 );
12661266
1267-     updateSpriteLayerOrder ();
1267+     updateDrawableLayerOrder ();
12681268}
12691269
12701270void  Engine::moveSpriteBackwardLayers (Sprite *sprite, int  layers)
@@ -1277,23 +1277,23 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
12771277    if  (sprite == other)
12781278        return ;
12791279
1280-     auto  itSprite = std::find (m_executableTargets .begin (), m_executableTargets .end (), sprite);
1281-     auto  itOther = std::find (m_executableTargets .begin (), m_executableTargets .end (), other);
1280+     auto  itSprite = std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), sprite);
1281+     auto  itOther = std::find (m_sortedDrawables .begin (), m_sortedDrawables .end (), other);
12821282
1283-     if  ((itSprite == m_executableTargets .end ()) || (itOther == m_executableTargets .end ()))
1283+     if  ((itSprite == m_sortedDrawables .end ()) || (itOther == m_sortedDrawables .end ()))
12841284        return ;
12851285
12861286    auto  target = itOther - 1 ; //  behind
12871287
12881288    if  (target < itSprite)
12891289        target++;
12901290
1291-     if  (target <= m_executableTargets .begin ()) {
1291+     if  (target <= m_sortedDrawables .begin ()) {
12921292        moveSpriteToBack (sprite);
12931293        return ;
12941294    }
12951295
1296-     if  (target >= m_executableTargets .end ()) {
1296+     if  (target >= m_sortedDrawables .end ()) {
12971297        moveSpriteToFront (sprite);
12981298        return ;
12991299    }
@@ -1303,7 +1303,7 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
13031303    else 
13041304        std::rotate (target, itSprite, itSprite + 1 );
13051305
1306-     updateSpriteLayerOrder ();
1306+     updateDrawableLayerOrder ();
13071307}
13081308
13091309Stage *Engine::stage () const 
@@ -1666,12 +1666,12 @@ const std::vector<Script *> &Engine::getHats(Target *target, HatType type)
16661666    }
16671667}
16681668
1669- void  Engine::updateSpriteLayerOrder  ()
1669+ void  Engine::updateDrawableLayerOrder  ()
16701670{
1671-     assert (m_executableTargets .empty () || m_executableTargets [0 ]->isStage ());
1671+     assert (m_sortedDrawables .empty () || (m_sortedDrawables [0 ]->isTarget () &&  static_cast <Target *>(m_sortedDrawables[ 0 ])-> isStage () ));
16721672
1673-     for  (size_t  i = 1 ; i < m_executableTargets .size (); i++) //  i = 1 to skip the stage
1674-         m_executableTargets [i]->setLayerOrder (i);
1673+     for  (size_t  i = 1 ; i < m_sortedDrawables .size (); i++) //  i = 1 to skip the stage
1674+         m_sortedDrawables [i]->setLayerOrder (i);
16751675}
16761676
16771677const  std::string &Engine::userAgent () const 
@@ -1914,7 +1914,7 @@ void Engine::removeExecutableClones()
19141914{
19151915    //  Remove clones from the executable targets
19161916    for  (std::shared_ptr<Sprite> clone : m_clones)
1917-         m_executableTargets .erase (std::remove (m_executableTargets .begin (), m_executableTargets .end (), clone.get ()), m_executableTargets .end ());
1917+         m_sortedDrawables .erase (std::remove (m_sortedDrawables .begin (), m_sortedDrawables .end (), clone.get ()), m_sortedDrawables .end ());
19181918}
19191919
19201920void  Engine::addVarOrListMonitor (std::shared_ptr<Monitor> monitor, Target *target)
@@ -2021,23 +2021,27 @@ template<typename F>
20212021void  Engine::allScriptsByOpcodeDo (HatType hatType, F &&f, Target *optTarget)
20222022{
20232023    //  https://github.com/scratchfoundation/scratch-vm/blob/f1aa92fad79af17d9dd1c41eeeadca099339a9f1/src/engine/runtime.js#L1797-L1809
2024-     std::vector<Target  *> *targetsPtr  = &m_executableTargets ;
2024+     std::vector<Drawable  *> *drawablesPtr  = &m_sortedDrawables ;
20252025
20262026    if  (optTarget)
2027-         targetsPtr  = new  std::vector<Target  *>({ optTarget });
2027+         drawablesPtr  = new  std::vector<Drawable  *>({ optTarget });
20282028
2029-     const  std::vector<Target  *> targets  = *targetsPtr ;
2029+     const  std::vector<Drawable  *> &drawables  = *drawablesPtr ;
20302030
2031-     for  (int  t = targets.size () - 1 ; t >= 0 ; t--) {
2032-         Target *target = targets[t];
2033-         const  auto  &scripts = getHats (target, hatType);
2031+     for  (int  t = drawables.size () - 1 ; t >= 0 ; t--) {
2032+         Drawable *drawable = drawables[t];
20342033
2035-         for  (size_t  j = 0 ; j < scripts.size (); j++)
2036-             f (scripts[j], target);
2034+         if  (drawable->isTarget ()) {
2035+             Target *target = static_cast <Target *>(drawable);
2036+             const  auto  &scripts = getHats (target, hatType);
2037+ 
2038+             for  (size_t  j = 0 ; j < scripts.size (); j++)
2039+                 f (scripts[j], target);
2040+         }
20372041    }
20382042
20392043    if  (optTarget)
2040-         delete  targetsPtr ;
2044+         delete  drawablesPtr ;
20412045}
20422046
20432047std::vector<std::shared_ptr<Thread>> Engine::startHats (HatType hatType, const  std::unordered_map<HatField, std::variant<std::string, const  char  *, Entity *>> &optMatchFields, Target *optTarget)
0 commit comments