@@ -31,6 +31,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
3131 engine->addCompileFunction (this , " looks_switchcostumeto" , &compileSwitchCostumeTo);
3232 engine->addCompileFunction (this , " looks_nextcostume" , &compileNextCostume);
3333 engine->addCompileFunction (this , " looks_switchbackdropto" , &compileSwitchBackdropTo);
34+ engine->addCompileFunction (this , " looks_switchbackdroptoandwait" , &compileSwitchBackdropToAndWait);
3435 engine->addCompileFunction (this , " looks_nextbackdrop" , &compileNextBackdrop);
3536 engine->addCompileFunction (this , " looks_costumenumbername" , &compileCostumeNumberName);
3637 engine->addCompileFunction (this , " looks_backdropnumbername" , &compileBackdropNumberName);
@@ -157,6 +158,47 @@ void LooksBlocks::compileSwitchBackdropTo(Compiler *compiler)
157158 }
158159}
159160
161+ void LooksBlocks::compileSwitchBackdropToAndWait (Compiler *compiler)
162+ {
163+ Stage *stage = compiler->engine ()->stage ();
164+
165+ if (!stage)
166+ return ;
167+
168+ Input *input = compiler->input (BACKDROP);
169+
170+ if (input->type () != Input::Type::ObscuredShadow) {
171+ assert (input->pointsToDropdownMenu ());
172+ std::string value = input->selectedMenuItem ();
173+ int index = stage->findCostume (value);
174+
175+ if (index == -1 ) {
176+ if (value == " next backdrop" )
177+ compiler->addFunctionCall (&nextBackdropAndWait);
178+ else if (value == " previous backdrop" )
179+ compiler->addFunctionCall (&previousBackdropAndWait);
180+ else if (value == " random backdrop" )
181+ compiler->addFunctionCall (&randomBackdropAndWait);
182+ else {
183+ Value v (value);
184+
185+ if (v.type () == Value::Type::Integer) {
186+ compiler->addConstValue (v.toLong () - 1 );
187+ compiler->addFunctionCall (&switchBackdropToByIndexAndWait);
188+ }
189+ }
190+ } else {
191+ compiler->addConstValue (index);
192+ compiler->addFunctionCall (&switchBackdropToByIndexAndWait);
193+ }
194+ } else {
195+ compiler->addInput (input);
196+ compiler->addFunctionCall (&switchBackdropToAndWait);
197+ }
198+
199+ compiler->addFunctionCall (&checkBackdropScripts);
200+ }
201+
160202void LooksBlocks::compileNextBackdrop (Compiler *compiler)
161203{
162204 compiler->addFunctionCall (&nextBackdrop);
@@ -308,59 +350,59 @@ unsigned int LooksBlocks::previousCostume(VirtualMachine *vm)
308350 return 0 ;
309351}
310352
311- unsigned int LooksBlocks::switchBackdropToByIndex (VirtualMachine *vm)
353+ void LooksBlocks::startBackdropScripts (VirtualMachine *vm, bool wait)
354+ {
355+ if (Stage *stage = vm->engine ()->stage ()) {
356+ if (stage->costumes ().size () > 0 )
357+ vm->engine ()->broadcastByPtr (stage->costumeAt (stage->currentCostume () - 1 )->broadcast (), vm, wait);
358+ }
359+ }
360+
361+ void LooksBlocks::switchBackdropToByIndexImpl (VirtualMachine *vm)
312362{
313363 if (Stage *stage = vm->engine ()->stage ())
314364 setCostumeByIndex (stage, vm->getInput (0 , 1 )->toLong ());
315-
316- return 1 ;
317365}
318366
319- unsigned int LooksBlocks::switchBackdropTo (VirtualMachine *vm)
367+ void LooksBlocks::switchBackdropToImpl (VirtualMachine *vm)
320368{
321369 Stage *stage = vm->engine ()->stage ();
322370
323371 if (!stage)
324- return 1 ;
372+ return ;
325373
326374 const Value *name = vm->getInput (0 , 1 );
327375 std::string nameStr = name->toString ();
328376 int index = stage->findCostume (nameStr);
329377
330378 if (index == -1 ) {
331379 if (nameStr == " next backdrop" )
332- nextBackdrop (vm);
380+ nextBackdropImpl (vm);
333381 else if (nameStr == " previous backdrop" )
334- previousBackdrop (vm);
382+ previousBackdropImpl (vm);
335383 else if (nameStr == " random backdrop" ) {
336- randomBackdrop (vm);
384+ randomBackdropImpl (vm);
337385 } else {
338386 if (name->type () == Value::Type::Integer)
339387 setCostumeByIndex (stage, name->toLong () - 1 );
340388 }
341389 } else
342390 setCostumeByIndex (stage, index);
343-
344- return 1 ;
345391}
346392
347- unsigned int LooksBlocks::nextBackdrop (VirtualMachine *vm)
393+ void LooksBlocks::nextBackdropImpl (VirtualMachine *vm)
348394{
349395 if (Stage *stage = vm->engine ()->stage ())
350396 setCostumeByIndex (stage, stage->currentCostume ());
351-
352- return 0 ;
353397}
354398
355- unsigned int LooksBlocks::previousBackdrop (VirtualMachine *vm)
399+ void LooksBlocks::previousBackdropImpl (VirtualMachine *vm)
356400{
357401 if (Stage *stage = vm->engine ()->stage ())
358402 setCostumeByIndex (stage, stage->currentCostume () - 2 );
359-
360- return 0 ;
361403}
362404
363- unsigned int LooksBlocks::randomBackdrop (VirtualMachine *vm)
405+ void LooksBlocks::randomBackdropImpl (VirtualMachine *vm)
364406{
365407 if (!rng)
366408 rng = RandomGenerator::instance ().get ();
@@ -371,6 +413,94 @@ unsigned int LooksBlocks::randomBackdrop(VirtualMachine *vm)
371413 if (count > 0 )
372414 stage->setCurrentCostume (rng->randint (1 , count));
373415 }
416+ }
417+
418+ unsigned int LooksBlocks::switchBackdropToByIndex (VirtualMachine *vm)
419+ {
420+ switchBackdropToByIndexImpl (vm);
421+ startBackdropScripts (vm, false );
422+
423+ return 1 ;
424+ }
425+
426+ unsigned int LooksBlocks::switchBackdropTo (VirtualMachine *vm)
427+ {
428+ switchBackdropToImpl (vm);
429+ startBackdropScripts (vm, false );
430+
431+ return 1 ;
432+ }
433+
434+ unsigned int LooksBlocks::switchBackdropToByIndexAndWait (VirtualMachine *vm)
435+ {
436+ switchBackdropToByIndexImpl (vm);
437+ startBackdropScripts (vm, true );
438+
439+ return 1 ;
440+ }
441+
442+ unsigned int LooksBlocks::switchBackdropToAndWait (VirtualMachine *vm)
443+ {
444+ switchBackdropToImpl (vm);
445+ startBackdropScripts (vm, true );
446+
447+ return 1 ;
448+ }
449+
450+ unsigned int LooksBlocks::nextBackdrop (VirtualMachine *vm)
451+ {
452+ nextBackdropImpl (vm);
453+ startBackdropScripts (vm, false );
454+
455+ return 0 ;
456+ }
457+
458+ unsigned int LooksBlocks::nextBackdropAndWait (VirtualMachine *vm)
459+ {
460+ nextBackdropImpl (vm);
461+ startBackdropScripts (vm, true );
462+
463+ return 0 ;
464+ }
465+
466+ unsigned int LooksBlocks::previousBackdrop (VirtualMachine *vm)
467+ {
468+ previousBackdropImpl (vm);
469+ startBackdropScripts (vm, false );
470+
471+ return 0 ;
472+ }
473+
474+ unsigned int LooksBlocks::previousBackdropAndWait (VirtualMachine *vm)
475+ {
476+ previousBackdropImpl (vm);
477+ startBackdropScripts (vm, true );
478+
479+ return 0 ;
480+ }
481+
482+ unsigned int LooksBlocks::randomBackdrop (VirtualMachine *vm)
483+ {
484+ randomBackdropImpl (vm);
485+ startBackdropScripts (vm, false );
486+
487+ return 0 ;
488+ }
489+
490+ unsigned int LooksBlocks::randomBackdropAndWait (VirtualMachine *vm)
491+ {
492+ randomBackdropImpl (vm);
493+ startBackdropScripts (vm, true );
494+
495+ return 0 ;
496+ }
497+
498+ unsigned int LooksBlocks::checkBackdropScripts (VirtualMachine *vm)
499+ {
500+ if (Stage *stage = vm->engine ()->stage ()) {
501+ if ((stage->costumes ().size () > 0 ) && vm->engine ()->broadcastByPtrRunning (stage->costumeAt (stage->currentCostume () - 1 )->broadcast (), vm))
502+ vm->stop (true , true , true );
503+ }
374504
375505 return 0 ;
376506}
0 commit comments