Skip to content

Commit d1a82e4

Browse files
committed
ScriptBuilder: Fix multiple entity references
1 parent e4944e1 commit d1a82e4

File tree

3 files changed

+45
-16
lines changed

3 files changed

+45
-16
lines changed

src/dev/test/scriptbuilder.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,11 @@ void ScriptBuilder::addEntityInput(const std::string &name, const std::string &e
174174
if (!impl->lastBlock)
175175
return;
176176

177-
entity->setId(std::to_string(impl->blockId++));
177+
if (std::find(impl->entities.begin(), impl->entities.end(), entity) == impl->entities.end()) {
178+
entity->setId(std::to_string(impl->blockId++));
179+
impl->entities.push_back(entity);
180+
}
181+
178182
auto input = std::make_shared<Input>(name, Input::Type::Shadow);
179183
input->setPrimaryValue(entityName);
180184
input->primaryValue()->setValuePtr(entity);
@@ -188,7 +192,11 @@ void ScriptBuilder::addEntityField(const std::string &name, std::shared_ptr<Enti
188192
if (!impl->lastBlock)
189193
return;
190194

191-
entity->setId(std::to_string(impl->blockId++));
195+
if (std::find(impl->entities.begin(), impl->entities.end(), entity) == impl->entities.end()) {
196+
entity->setId(std::to_string(impl->blockId++));
197+
impl->entities.push_back(entity);
198+
}
199+
192200
auto field = std::make_shared<Field>(name, Value(), entity);
193201
impl->lastBlock->addField(field);
194202
}
@@ -203,8 +211,19 @@ std::shared_ptr<Block> ScriptBuilder::currentBlock()
203211
if (!impl->lastBlock)
204212
return nullptr;
205213

206-
if (!impl->lastBlock->compileFunction())
207-
build(std::make_shared<Sprite>());
214+
if (!impl->lastBlock->compileFunction()) {
215+
auto target = std::make_shared<Sprite>();
216+
const auto &variables = impl->target->variables();
217+
const auto &lists = impl->target->lists();
218+
219+
for (auto var : variables)
220+
target->addVariable(var);
221+
222+
for (auto list : lists)
223+
target->addList(list);
224+
225+
build(target);
226+
}
208227

209228
return impl->lastBlock;
210229
}

src/dev/test/scriptbuilder_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace libscratchcpp
1111
class IEngine;
1212
class Target;
1313
class Block;
14+
class Entity;
1415
class List;
1516

1617
} // namespace libscratchcpp
@@ -29,6 +30,7 @@ class ScriptBuilderPrivate
2930
std::shared_ptr<Block> lastBlock;
3031
std::vector<std::shared_ptr<Block>> blocks;
3132
std::vector<std::shared_ptr<Block>> inputBlocks;
33+
std::vector<std::shared_ptr<Entity>> entities;
3234
unsigned int blockId = 0;
3335
};
3436

test/dev/test_api/scriptbuilder_test.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <scratchcpp/input.h>
88
#include <scratchcpp/field.h>
99
#include <scratchcpp/list.h>
10-
#include <scratchcpp/broadcast.h>
10+
#include <scratchcpp/variable.h>
1111

1212
#include "../../common.h"
1313
#include "testextension.h"
@@ -183,34 +183,42 @@ TEST_F(ScriptBuilderTest, AddDropdownField)
183183

184184
TEST_F(ScriptBuilderTest, AddEntityInput)
185185
{
186-
auto broadcast = std::make_shared<Broadcast>("", "");
187-
m_engine->setBroadcasts({ broadcast });
186+
auto var = std::make_shared<Variable>("", "");
187+
m_target->addVariable(var);
188188

189189
m_builder->addBlock("test_simple");
190-
m_builder->addEntityInput("BROADCAST", "test", InputValue::Type::Broadcast, broadcast);
190+
m_builder->addEntityInput("VARIABLE", "test", InputValue::Type::Variable, var);
191191
auto block = m_builder->currentBlock();
192192
ASSERT_TRUE(block);
193193
ASSERT_EQ(block->opcode(), "test_simple");
194194
ASSERT_EQ(block->inputs().size(), 1);
195-
ASSERT_EQ(block->inputAt(0)->name(), "BROADCAST");
196-
ASSERT_EQ(block->inputAt(0)->primaryValue()->valuePtr(), broadcast);
197-
ASSERT_EQ(block->inputAt(0)->primaryValue()->type(), InputValue::Type::Broadcast);
195+
ASSERT_EQ(block->inputAt(0)->name(), "VARIABLE");
196+
ASSERT_EQ(block->inputAt(0)->primaryValue()->valuePtr(), var);
197+
ASSERT_EQ(block->inputAt(0)->primaryValue()->type(), InputValue::Type::Variable);
198+
199+
m_builder->addBlock("test_simple");
200+
m_builder->addEntityInput("VARIABLE", "test", InputValue::Type::Variable, var);
201+
m_builder->build();
198202
}
199203

200204
TEST_F(ScriptBuilderTest, AddEntityField)
201205
{
202-
auto broadcast = std::make_shared<Broadcast>("", "");
203-
m_engine->setBroadcasts({ broadcast });
206+
auto var = std::make_shared<Variable>("", "");
207+
m_target->addVariable(var);
204208

205209
m_builder->addBlock("test_simple");
206-
m_builder->addEntityField("BROADCAST", broadcast);
210+
m_builder->addEntityField("VARIABLE", var);
207211
auto block = m_builder->currentBlock();
208212
ASSERT_TRUE(block);
209213
ASSERT_EQ(block->opcode(), "test_simple");
210214
ASSERT_TRUE(block->inputs().empty());
211215
ASSERT_EQ(block->fields().size(), 1);
212-
ASSERT_EQ(block->fieldAt(0)->name(), "BROADCAST");
213-
ASSERT_EQ(block->fieldAt(0)->valuePtr(), broadcast);
216+
ASSERT_EQ(block->fieldAt(0)->name(), "VARIABLE");
217+
ASSERT_EQ(block->fieldAt(0)->valuePtr(), var);
218+
219+
m_builder->addBlock("test_simple");
220+
m_builder->addEntityField("VARIABLE", var);
221+
m_builder->build();
214222
}
215223

216224
TEST_F(ScriptBuilderTest, ReporterBlocks)

0 commit comments

Comments
 (0)