Skip to content

Commit 763c2c9

Browse files
committed
Engine: Make clones receive broadcasts
1 parent c4538e0 commit 763c2c9

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

src/engine/internal/engine.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)