Skip to content

Commit 05e2d87

Browse files
committed
Implement looks_moveforwardbackwardlayers block
1 parent dfc3701 commit 05e2d87

File tree

3 files changed

+113
-3
lines changed

3 files changed

+113
-3
lines changed

src/blocks/looksblocks.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
3838
engine->addCompileFunction(this, "looks_switchbackdroptoandwait", &compileSwitchBackdropToAndWait);
3939
engine->addCompileFunction(this, "looks_nextbackdrop", &compileNextBackdrop);
4040
engine->addCompileFunction(this, "looks_gotofrontback", &compileGoToFrontBack);
41+
engine->addCompileFunction(this, "looks_goforwardbackwardlayers", &compileGoForwardBackwardLayers);
4142
engine->addCompileFunction(this, "looks_costumenumbername", &compileCostumeNumberName);
4243
engine->addCompileFunction(this, "looks_backdropnumbername", &compileBackdropNumberName);
4344

@@ -52,6 +53,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
5253
engine->addField(this, "NUMBER_NAME", NUMBER_NAME);
5354
engine->addField(this, "EFFECT", EFFECT);
5455
engine->addField(this, "FRONT_BACK", FRONT_BACK);
56+
engine->addField(this, "FORWARD_BACKWARD", FORWARD_BACKWARD);
5557

5658
// Field values
5759
engine->addFieldValue(this, "number", Number);
@@ -65,6 +67,8 @@ void LooksBlocks::registerBlocks(IEngine *engine)
6567
engine->addFieldValue(this, "GHOST", GhostEffect);
6668
engine->addFieldValue(this, "front", Front);
6769
engine->addFieldValue(this, "back", Back);
70+
engine->addFieldValue(this, "forward", Forward);
71+
engine->addFieldValue(this, "backward", Backward);
6872
}
6973

7074
void LooksBlocks::compileShow(Compiler *compiler)
@@ -407,6 +411,23 @@ void LooksBlocks::compileGoToFrontBack(Compiler *compiler)
407411
}
408412
}
409413

414+
void LooksBlocks::compileGoForwardBackwardLayers(Compiler *compiler)
415+
{
416+
int option = compiler->field(FORWARD_BACKWARD)->specialValueId();
417+
418+
switch (option) {
419+
case Forward:
420+
compiler->addInput(NUM);
421+
compiler->addFunctionCall(&goForwardLayers);
422+
break;
423+
424+
case Backward:
425+
compiler->addInput(NUM);
426+
compiler->addFunctionCall(&goBackwardLayers);
427+
break;
428+
}
429+
}
430+
410431
void LooksBlocks::compileCostumeNumberName(Compiler *compiler)
411432
{
412433
int option = compiler->field(NUMBER_NAME)->specialValueId();
@@ -900,6 +921,26 @@ unsigned int LooksBlocks::goToBack(VirtualMachine *vm)
900921
return 0;
901922
}
902923

924+
unsigned int LooksBlocks::goForwardLayers(VirtualMachine *vm)
925+
{
926+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
927+
928+
if (sprite)
929+
vm->engine()->moveSpriteForwardLayers(sprite, vm->getInput(0, 1)->toInt());
930+
931+
return 1;
932+
}
933+
934+
unsigned int LooksBlocks::goBackwardLayers(VirtualMachine *vm)
935+
{
936+
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
937+
938+
if (sprite)
939+
vm->engine()->moveSpriteBackwardLayers(sprite, vm->getInput(0, 1)->toInt());
940+
941+
return 1;
942+
}
943+
903944
unsigned int LooksBlocks::costumeNumber(VirtualMachine *vm)
904945
{
905946
if (Target *target = vm->target())

src/blocks/looksblocks.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ class LooksBlocks : public IBlockSection
2424
SIZE,
2525
COSTUME,
2626
BACKDROP,
27-
VALUE
27+
VALUE,
28+
NUM
2829
};
2930

3031
enum Fields
3132
{
3233
NUMBER_NAME,
3334
EFFECT,
34-
FRONT_BACK
35+
FRONT_BACK,
36+
FORWARD_BACKWARD
3537
};
3638

3739
enum FieldValues
@@ -46,7 +48,9 @@ class LooksBlocks : public IBlockSection
4648
BrightnessEffect,
4749
GhostEffect,
4850
Front,
49-
Back
51+
Back,
52+
Forward,
53+
Backward
5054
};
5155

5256
std::string name() const override;
@@ -67,6 +71,7 @@ class LooksBlocks : public IBlockSection
6771
static void compileSwitchBackdropToAndWait(Compiler *compiler);
6872
static void compileNextBackdrop(Compiler *compiler);
6973
static void compileGoToFrontBack(Compiler *compiler);
74+
static void compileGoForwardBackwardLayers(Compiler *compiler);
7075
static void compileCostumeNumberName(Compiler *compiler);
7176
static void compileBackdropNumberName(Compiler *compiler);
7277

@@ -124,6 +129,9 @@ class LooksBlocks : public IBlockSection
124129
static unsigned int goToFront(VirtualMachine *vm);
125130
static unsigned int goToBack(VirtualMachine *vm);
126131

132+
static unsigned int goForwardLayers(VirtualMachine *vm);
133+
static unsigned int goBackwardLayers(VirtualMachine *vm);
134+
127135
static unsigned int costumeNumber(VirtualMachine *vm);
128136
static unsigned int costumeName(VirtualMachine *vm);
129137
static unsigned int backdropNumber(VirtualMachine *vm);

test/blocks/looks_blocks_test.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
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));
120120
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_gotofrontback", &LooksBlocks::compileGoToFrontBack));
121+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_goforwardbackwardlayers", &LooksBlocks::compileGoForwardBackwardLayers));
121122
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_costumenumbername", &LooksBlocks::compileCostumeNumberName));
122123
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "looks_backdropnumbername", &LooksBlocks::compileBackdropNumberName));
123124

@@ -132,6 +133,7 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
132133
EXPECT_CALL(m_engineMock, addField(m_section.get(), "NUMBER_NAME", LooksBlocks::NUMBER_NAME));
133134
EXPECT_CALL(m_engineMock, addField(m_section.get(), "EFFECT", LooksBlocks::EFFECT));
134135
EXPECT_CALL(m_engineMock, addField(m_section.get(), "FRONT_BACK", LooksBlocks::FRONT_BACK));
136+
EXPECT_CALL(m_engineMock, addField(m_section.get(), "FORWARD_BACKWARD", LooksBlocks::FORWARD_BACKWARD));
135137

136138
// Field values
137139
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "number", LooksBlocks::Number));
@@ -145,6 +147,8 @@ TEST_F(LooksBlocksTest, RegisterBlocks)
145147
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "GHOST", LooksBlocks::GhostEffect));
146148
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "front", LooksBlocks::Front));
147149
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "back", LooksBlocks::Back));
150+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "forward", LooksBlocks::Forward));
151+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "backward", LooksBlocks::Backward));
148152

149153
m_section->registerBlocks(&m_engineMock);
150154
}
@@ -2634,6 +2638,63 @@ TEST_F(LooksBlocksTest, GoToFrontBackImpl)
26342638
ASSERT_EQ(vm.registerCount(), 0);
26352639
}
26362640

2641+
TEST_F(LooksBlocksTest, GoForwardBackwardLayers)
2642+
{
2643+
Compiler compiler(&m_engineMock);
2644+
2645+
// go [forward] (5) layers
2646+
auto block1 = std::make_shared<Block>("a", "looks_goforwardbackwardlayers");
2647+
addDropdownField(block1, "FORWARD_BACKWARD", LooksBlocks::FORWARD_BACKWARD, "forward", LooksBlocks::Forward);
2648+
addValueInput(block1, "NUM", LooksBlocks::NUM, 5);
2649+
2650+
// go [backward] (3) layers
2651+
auto block2 = std::make_shared<Block>("b", "looks_goforwardbackwardlayers");
2652+
addDropdownField(block2, "FORWARD_BACKWARD", LooksBlocks::FORWARD_BACKWARD, "backward", LooksBlocks::Backward);
2653+
addValueInput(block2, "NUM", LooksBlocks::NUM, 3);
2654+
2655+
compiler.init();
2656+
2657+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::goForwardLayers)).WillOnce(Return(0));
2658+
compiler.setBlock(block1);
2659+
LooksBlocks::compileGoForwardBackwardLayers(&compiler);
2660+
2661+
EXPECT_CALL(m_engineMock, functionIndex(&LooksBlocks::goBackwardLayers)).WillOnce(Return(1));
2662+
compiler.setBlock(block2);
2663+
LooksBlocks::compileGoForwardBackwardLayers(&compiler);
2664+
2665+
compiler.end();
2666+
2667+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_CONST, 1, vm::OP_EXEC, 1, vm::OP_HALT }));
2668+
ASSERT_EQ(compiler.constValues(), std::vector<Value>({ 5, 3 }));
2669+
}
2670+
2671+
TEST_F(LooksBlocksTest, GoForwardBackwardLayersImpl)
2672+
{
2673+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_CONST, 0, vm::OP_EXEC, 0, vm::OP_HALT };
2674+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_CONST, 1, vm::OP_EXEC, 1, vm::OP_HALT };
2675+
static BlockFunc functions[] = { &LooksBlocks::goForwardLayers, &LooksBlocks::goBackwardLayers };
2676+
static Value constValues[] = { 5, 3 };
2677+
2678+
Sprite sprite;
2679+
2680+
VirtualMachine vm(&sprite, &m_engineMock, nullptr);
2681+
vm.setFunctions(functions);
2682+
vm.setConstValues(constValues);
2683+
2684+
EXPECT_CALL(m_engineMock, moveSpriteForwardLayers(&sprite, 5));
2685+
vm.setBytecode(bytecode1);
2686+
vm.run();
2687+
2688+
ASSERT_EQ(vm.registerCount(), 0);
2689+
2690+
EXPECT_CALL(m_engineMock, moveSpriteBackwardLayers(&sprite, 3));
2691+
vm.reset();
2692+
vm.setBytecode(bytecode2);
2693+
vm.run();
2694+
2695+
ASSERT_EQ(vm.registerCount(), 0);
2696+
}
2697+
26372698
TEST_F(LooksBlocksTest, CostumeNumberName)
26382699
{
26392700
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)