@@ -588,8 +588,10 @@ bool Engine::broadcastByPtrRunning(Broadcast *broadcast, VirtualMachine *sourceS
588588 assert (it != m_scripts.end ());
589589 auto topBlock = it->first ;
590590
591- // TODO: Add a map for "when backdrop switches to" hats
592- if ((topBlock->opcode () == " event_whenbackdropswitchesto" ) && (topBlock->findFieldById (EventBlocks::BACKDROP)->value ().toString () == broadcast->name ()))
591+ const auto &scripts = m_backdropChangeHats[script->target ()];
592+ auto scriptIt = std::find (scripts.begin (), scripts.end (), script);
593+
594+ if ((scriptIt != scripts.end ()) && (topBlock->findFieldById (EventBlocks::BACKDROP)->value ().toString () == broadcast->name ()))
593595 return true ;
594596 }
595597 }
@@ -760,6 +762,11 @@ void Engine::addBroadcastScript(std::shared_ptr<Block> whenReceivedBlock, Broadc
760762 addHatToMap (m_broadcastHats, script);
761763}
762764
765+ void Engine::addBackdropChangeScript (std::shared_ptr<Block> hatBlock)
766+ {
767+ addHatToMap (m_backdropChangeHats, m_scripts[hatBlock].get ());
768+ }
769+
763770void Engine::addCloneInitScript (std::shared_ptr<Block> hatBlock)
764771{
765772 addHatToMap (m_cloneInitHats, m_scripts[hatBlock].get ());
@@ -1078,7 +1085,7 @@ void Engine::addHatToMap(std::unordered_map<Target *, std::vector<Script *>> &ma
10781085 map[target] = { script };
10791086}
10801087
1081- std::vector<Script *> Engine::getHats (Target *target, HatType type)
1088+ const std::vector<Script *> & Engine::getHats (Target *target, HatType type)
10821089{
10831090 assert (target);
10841091
@@ -1098,30 +1105,19 @@ std::vector<Script *> Engine::getHats(Target *target, HatType type)
10981105 case HatType::BroadcastReceived:
10991106 return m_broadcastHats[target];
11001107
1101- case HatType::BackdropChanged: {
1102- // TODO: Add a map for "when backdrop switches to" hats and return reference
1103- std::vector<Script *> out;
1104- const auto &blocks = target->blocks ();
1105-
1106- for (auto block : blocks) {
1107- if (block->opcode () == " event_whenbackdropswitchesto" ) {
1108- assert (block->topLevel ());
1109- assert (m_scripts.find (block) != m_scripts.cend ());
1110- out.push_back (m_scripts[block].get ());
1111- }
1112- }
1113-
1114- return out;
1115- }
1108+ case HatType::BackdropChanged:
1109+ return m_backdropChangeHats[target];
11161110
11171111 case HatType::CloneInit:
11181112 return m_cloneInitHats[target];
11191113
11201114 case HatType::KeyPressed:
11211115 return m_whenKeyPressedHats[target];
11221116
1123- default :
1124- return {};
1117+ default : {
1118+ static const std::vector<Script *> empty = {};
1119+ return empty;
1120+ }
11251121 }
11261122}
11271123
0 commit comments