Skip to content

Commit dfc3701

Browse files
committed
Implement looks_gotofrontback block
1 parent 029426f commit dfc3701

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

src/blocks/looksblocks.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
3737
engine->addCompileFunction(this, "looks_switchbackdropto", &compileSwitchBackdropTo);
3838
engine->addCompileFunction(this, "looks_switchbackdroptoandwait", &compileSwitchBackdropToAndWait);
3939
engine->addCompileFunction(this, "looks_nextbackdrop", &compileNextBackdrop);
40+
engine->addCompileFunction(this, "looks_gotofrontback", &compileGoToFrontBack);
4041
engine->addCompileFunction(this, "looks_costumenumbername", &compileCostumeNumberName);
4142
engine->addCompileFunction(this, "looks_backdropnumbername", &compileBackdropNumberName);
4243

@@ -50,6 +51,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
5051
// Fields
5152
engine->addField(this, "NUMBER_NAME", NUMBER_NAME);
5253
engine->addField(this, "EFFECT", EFFECT);
54+
engine->addField(this, "FRONT_BACK", FRONT_BACK);
5355

5456
// Field values
5557
engine->addFieldValue(this, "number", Number);
@@ -61,6 +63,8 @@ void LooksBlocks::registerBlocks(IEngine *engine)
6163
engine->addFieldValue(this, "MOSAIC", MosaicEffect);
6264
engine->addFieldValue(this, "BRIGHTNESS", BrightnessEffect);
6365
engine->addFieldValue(this, "GHOST", GhostEffect);
66+
engine->addFieldValue(this, "front", Front);
67+
engine->addFieldValue(this, "back", Back);
6468
}
6569

6670
void LooksBlocks::compileShow(Compiler *compiler)
@@ -388,6 +392,21 @@ void LooksBlocks::compileNextBackdrop(Compiler *compiler)
388392
compiler->addFunctionCall(&nextBackdrop);
389393
}
390394

395+
void LooksBlocks::compileGoToFrontBack(Compiler *compiler)
396+
{
397+
int option = compiler->field(FRONT_BACK)->specialValueId();
398+
399+
switch (option) {
400+
case Front:
401+
compiler->addFunctionCall(&goToFront);
402+
break;
403+
404+
case Back:
405+
compiler->addFunctionCall(&goToBack);
406+
break;
407+
}
408+
}
409+
391410
void LooksBlocks::compileCostumeNumberName(Compiler *compiler)
392411
{
393412
int option = compiler->field(NUMBER_NAME)->specialValueId();
@@ -861,6 +880,26 @@ unsigned int LooksBlocks::checkBackdropScripts(VirtualMachine *vm)
861880
return 0;
862881
}
863882

883+
unsigned int LooksBlocks::goToFront(VirtualMachine *vm)
884+
{
885+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
886+
887+
if (sprite)
888+
vm->engine()->moveSpriteToFront(sprite);
889+
890+
return 0;
891+
}
892+
893+
unsigned int LooksBlocks::goToBack(VirtualMachine *vm)
894+
{
895+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
896+
897+
if (sprite)
898+
vm->engine()->moveSpriteToBack(sprite);
899+
900+
return 0;
901+
}
902+
864903
unsigned int LooksBlocks::costumeNumber(VirtualMachine *vm)
865904
{
866905
if (Target *target = vm->target())

src/blocks/looksblocks.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class LooksBlocks : public IBlockSection
3030
enum Fields
3131
{
3232
NUMBER_NAME,
33-
EFFECT
33+
EFFECT,
34+
FRONT_BACK
3435
};
3536

3637
enum FieldValues
@@ -43,7 +44,9 @@ class LooksBlocks : public IBlockSection
4344
PixelateEffect,
4445
MosaicEffect,
4546
BrightnessEffect,
46-
GhostEffect
47+
GhostEffect,
48+
Front,
49+
Back
4750
};
4851

4952
std::string name() const override;
@@ -63,6 +66,7 @@ class LooksBlocks : public IBlockSection
6366
static void compileSwitchBackdropTo(Compiler *compiler);
6467
static void compileSwitchBackdropToAndWait(Compiler *compiler);
6568
static void compileNextBackdrop(Compiler *compiler);
69+
static void compileGoToFrontBack(Compiler *compiler);
6670
static void compileCostumeNumberName(Compiler *compiler);
6771
static void compileBackdropNumberName(Compiler *compiler);
6872

@@ -117,6 +121,9 @@ class LooksBlocks : public IBlockSection
117121
static unsigned int randomBackdropAndWait(VirtualMachine *vm);
118122
static unsigned int checkBackdropScripts(VirtualMachine *vm);
119123

124+
static unsigned int goToFront(VirtualMachine *vm);
125+
static unsigned int goToBack(VirtualMachine *vm);
126+
120127
static unsigned int costumeNumber(VirtualMachine *vm);
121128
static unsigned int costumeName(VirtualMachine *vm);
122129
static unsigned int backdropNumber(VirtualMachine *vm);

test/blocks/looks_blocks_test.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
117117
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_switchbackdropto", &LooksBlocks::compileSwitchBackdropTo));
118118
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_switchbackdroptoandwait", &LooksBlocks::compileSwitchBackdropToAndWait));
119119
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_nextbackdrop", &LooksBlocks::compileNextBackdrop));
120+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_gotofrontback", &LooksBlocks::compileGoToFrontBack));
120121
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_costumenumbername", &LooksBlocks::compileCostumeNumberName));
121122
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_backdropnumbername", &LooksBlocks::compileBackdropNumberName));
122123

@@ -130,6 +131,7 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
130131
// Fields
131132
EXPECT_CALL(m_engineMock, addField(m_section.get(), "NUMBER_NAME", LooksBlocks::NUMBER_NAME));
132133
EXPECT_CALL(m_engineMock, addField(m_section.get(), "EFFECT", LooksBlocks::EFFECT));
134+
EXPECT_CALL(m_engineMock, addField(m_section.get(), "FRONT_BACK", LooksBlocks::FRONT_BACK));
133135

134136
// Field values
135137
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "number", LooksBlocks::Number));
@@ -141,6 +143,8 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
141143
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "MOSAIC", LooksBlocks::MosaicEffect));
142144
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "BRIGHTNESS", LooksBlocks::BrightnessEffect));
143145
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "GHOST", LooksBlocks::GhostEffect));
146+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "front", LooksBlocks::Front));
147+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "back", LooksBlocks::Back));
144148

145149
m_section->registerBlocks(&m_engineMock);
146150
}
@@ -2577,6 +2581,59 @@ TEST_F(LooksBlocksTest, RandomBackdropAndWait)
25772581
LooksBlocks::rng = RandomGenerator::instance().get();
25782582
}
25792583

2584+
TEST_F(LooksBlocksTest, GoToFrontBack)
2585+
{
2586+
Compiler compiler(&m_engineMock);
2587+
2588+
// go to [front] layer
2589+
auto block1 = std::make_shared<Block>("a", "looks_gotofrontback");
2590+
addDropdownField(block1, "FRONT_BACK", LooksBlocks::FRONT_BACK, "front", LooksBlocks::Front);
2591+
2592+
// go to [back] layer
2593+
auto block2 = std::make_shared<Block>("b", "looks_gotofrontback");
2594+
addDropdownField(block2, "FRONT_BACK", LooksBlocks::FRONT_BACK, "back", LooksBlocks::Back);
2595+
2596+
compiler.init();
2597+
2598+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::goToFront)).WillOnce(Return(0));
2599+
compiler.setBlock(block1);
2600+
LooksBlocks::compileGoToFrontBack(&compiler);
2601+
2602+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::goToBack)).WillOnce(Return(1));
2603+
compiler.setBlock(block2);
2604+
LooksBlocks::compileGoToFrontBack(&compiler);
2605+
2606+
compiler.end();
2607+
2608+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_EXEC, 1, vm::OP_HALT }));
2609+
ASSERT_TRUE(compiler.constValues().empty());
2610+
}
2611+
2612+
TEST_F(LooksBlocksTest, GoToFrontBackImpl)
2613+
{
2614+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
2615+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1, vm::OP_HALT };
2616+
static BlockFunc functions[] = { &LooksBlocks::goToFront, &LooksBlocks::goToBack };
2617+
2618+
Sprite sprite;
2619+
2620+
VirtualMachine vm(&sprite, &m_engineMock, nullptr);
2621+
vm.setFunctions(functions);
2622+
2623+
EXPECT_CALL(m_engineMock, moveSpriteToFront(&sprite));
2624+
vm.setBytecode(bytecode1);
2625+
vm.run();
2626+
2627+
ASSERT_EQ(vm.registerCount(), 0);
2628+
2629+
EXPECT_CALL(m_engineMock, moveSpriteToBack(&sprite));
2630+
vm.reset();
2631+
vm.setBytecode(bytecode2);
2632+
vm.run();
2633+
2634+
ASSERT_EQ(vm.registerCount(), 0);
2635+
}
2636+
25802637
TEST_F(LooksBlocksTest, CostumeNumberName)
25812638
{
25822639
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)