Skip to content

Commit af03777

Browse files
committed
Add backdrop change script map to Engine
1 parent 87b1b34 commit af03777

File tree

6 files changed

+26
-22
lines changed

6 files changed

+26
-22
lines changed

include/scratchcpp/iengine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@ class LIBSCRATCHCPP_EXPORT IEngine
251251
/*! Registers the broadcast script. */
252252
virtual void addBroadcastScript(std::shared_ptr<Block> whenReceivedBlock, Broadcast *broadcast) = 0;
253253

254+
/*! Registers the backdrop change script. */
255+
virtual void addBackdropChangeScript(std::shared_ptr<Block> hatBlock) = 0;
256+
254257
/* Registers the given "when I start as clone" script. */
255258
virtual void addCloneInitScript(std::shared_ptr<Block> hatBlock) = 0;
256259

src/blocks/eventblocks.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void EventBlocks::compileWhenBroadcastReceived(Compiler *compiler)
8282

8383
void EventBlocks::compileWhenBackdropSwitchesTo(Compiler *compiler)
8484
{
85-
// TODO: Register this hat in engine
85+
compiler->engine()->addBackdropChangeScript(compiler->block());
8686
}
8787

8888
void EventBlocks::compileWhenKeyPressed(Compiler *compiler)

src/engine/internal/engine.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
763770
void 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

src/engine/internal/engine.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class Engine : public IEngine
111111

112112
void addGreenFlagScript(std::shared_ptr<Block> hatBlock) override;
113113
void addBroadcastScript(std::shared_ptr<Block> whenReceivedBlock, Broadcast *broadcast) override;
114+
void addBackdropChangeScript(std::shared_ptr<Block> hatBlock) override;
114115
void addCloneInitScript(std::shared_ptr<Block> hatBlock) override;
115116
void addKeyPressScript(std::shared_ptr<Block> hatBlock, std::string keyName) override;
116117

@@ -163,7 +164,7 @@ class Engine : public IEngine
163164
std::shared_ptr<IBlockSection> blockSection(const std::string &opcode) const;
164165

165166
void addHatToMap(std::unordered_map<Target *, std::vector<Script *>> &map, Script *script);
166-
std::vector<Script *> getHats(Target *target, HatType type);
167+
const std::vector<libscratchcpp::Script *> &getHats(Target *target, HatType type);
167168

168169
void updateSpriteLayerOrder();
169170

@@ -195,6 +196,7 @@ class Engine : public IEngine
195196
std::recursive_mutex m_eventLoopMutex;
196197

197198
std::unordered_map<Target *, std::vector<Script *>> m_greenFlagHats;
199+
std::unordered_map<Target *, std::vector<Script *>> m_backdropChangeHats;
198200
std::unordered_map<Target *, std::vector<Script *>> m_broadcastHats;
199201
std::unordered_map<Target *, std::vector<Script *>> m_cloneInitHats;
200202
std::unordered_map<Target *, std::vector<Script *>> m_whenKeyPressedHats;

test/blocks/event_blocks_test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ TEST_F(EventBlocksTest, WhenBackdropSwitchesTo)
310310
auto backdrop = std::make_shared<Costume>("backdrop2", "a", "svg");
311311
stage.addCostume(backdrop);
312312

313+
EXPECT_CALL(m_engineMock, addBackdropChangeScript(block1));
314+
313315
compiler.init();
314316
compiler.setBlock(block1);
315317
EventBlocks::compileWhenBackdropSwitchesTo(&compiler);

test/mocks/enginemock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class EngineMock : public IEngine
9393

9494
MOCK_METHOD(void, addGreenFlagScript, (std::shared_ptr<Block>), (override));
9595
MOCK_METHOD(void, addBroadcastScript, (std::shared_ptr<Block>, Broadcast *), (override));
96+
MOCK_METHOD(void, addBackdropChangeScript, (std::shared_ptr<Block>), (override));
9697
MOCK_METHOD(void, addCloneInitScript, (std::shared_ptr<Block>), (override));
9798
MOCK_METHOD(void, addKeyPressScript, (std::shared_ptr<Block>, std::string), (override));
9899

0 commit comments

Comments
 (0)