@@ -202,22 +202,21 @@ void Engine::broadcast(unsigned int index, VirtualMachine *sourceScript, bool wa
202202 const std::vector<Script *> &scripts = m_broadcastMap[index];
203203
204204 for (auto script : scripts) {
205- long scriptIndex = - 1 ;
206- for ( long i = 0 ; i < m_runningScripts. size (); i++) {
207- if ( m_runningScripts[i]-> script () == script ) {
208- scriptIndex = i;
209- break ;
205+ std::vector<VirtualMachine *> runningBroadcastScripts ;
206+
207+ for ( auto vm : m_runningScripts) {
208+ if (vm-> script () == script) {
209+ runningBroadcastScripts. push_back (vm. get ()) ;
210210 }
211211 }
212212
213- if (scriptIndex != -1 ) {
214- // Reset the script if it's already running
215- auto vm = m_runningScripts[scriptIndex];
213+ // Reset running scripts
214+ for (VirtualMachine *vm : runningBroadcastScripts) {
216215 vm->reset ();
217216
218217 // Remove the script from scripts to remove because it's going to run again
219- m_scriptsToRemove.erase (std::remove (m_scriptsToRemove.begin (), m_scriptsToRemove.end (), vm. get () ), m_scriptsToRemove.end ());
220- assert (std::find (m_scriptsToRemove.begin (), m_scriptsToRemove.end (), m_runningScripts[scriptIndex]. get () ) == m_scriptsToRemove.end ());
218+ m_scriptsToRemove.erase (std::remove (m_scriptsToRemove.begin (), m_scriptsToRemove.end (), vm), m_scriptsToRemove.end ());
219+ assert (std::find (m_scriptsToRemove.begin (), m_scriptsToRemove.end (), vm ) == m_scriptsToRemove.end ());
221220
222221 auto &scripts = m_runningBroadcastMap[index];
223222
@@ -233,10 +232,29 @@ void Engine::broadcast(unsigned int index, VirtualMachine *sourceScript, bool wa
233232 m_skipFrame = false ;
234233 } else
235234 sourceScript->stop (true , true );
236- } else {
237- auto vm = script->start ();
238- m_runningScripts.push_back (vm);
239- m_runningBroadcastMap[index].push_back ({ sourceScript, vm.get () });
235+ }
236+
237+ // Start scripts which are not running
238+ Target *root = script->target ();
239+ std::vector<Target *> targets = { root };
240+
241+ if (!root->isStage ()) {
242+ Sprite *sprite = dynamic_cast <Sprite *>(root);
243+ assert (sprite);
244+ auto children = sprite->allChildren ();
245+
246+ for (auto child : children)
247+ targets.push_back (child.get ());
248+ }
249+
250+ for (Target *target : targets) {
251+ auto it = std::find_if (runningBroadcastScripts.begin (), runningBroadcastScripts.end (), [target](VirtualMachine *vm) { return vm->target () == target; });
252+
253+ if (it == runningBroadcastScripts.end ()) {
254+ auto vm = script->start (target);
255+ m_runningScripts.push_back (vm);
256+ m_runningBroadcastMap[index].push_back ({ sourceScript, vm.get () });
257+ }
240258 }
241259 }
242260}
0 commit comments