diff --git a/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart b/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart index abb6de1e..787fcefc 100644 --- a/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart +++ b/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart @@ -1,5 +1,6 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -17,6 +18,7 @@ class GoogleWordBonusBehavior extends Component { readBloc() .add(const BonusActivated(GameBonus.googleWord)); readBloc().onBonusAwarded(); + add(BonusBallSpawningBehavior()); }, ), ); diff --git a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart index b01c32e1..1d3aa16c 100644 --- a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart +++ b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart @@ -11,7 +11,8 @@ class MultiballsBehavior extends Component bool listenWhen(GameState? previousState, GameState newState) { final hasChanged = previousState?.bonusHistory != newState.bonusHistory; final lastBonusIsMultiball = newState.bonusHistory.isNotEmpty && - newState.bonusHistory.last == GameBonus.dashNest; + (newState.bonusHistory.last == GameBonus.dashNest || + newState.bonusHistory.last == GameBonus.googleWord); return hasChanged && lastBonusIsMultiball; } diff --git a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart index 48c90552..b974f33c 100644 --- a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart +++ b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart @@ -9,9 +9,9 @@ import 'package:pinball_flame/pinball_flame.dart'; class MultiballBlinkingBehavior extends TimerComponent with ParentIsA { /// {@macro multiball_blinking_behavior} - MultiballBlinkingBehavior() : super(period: 0.1); + MultiballBlinkingBehavior() : super(period: 0.18); - final _maxBlinks = 10; + final _maxBlinks = 28; int _blinksCounter = 0; diff --git a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart index 379f8610..0fcf7668 100644 --- a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart +++ b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart @@ -21,7 +21,7 @@ void main() { 'MultiballBlinkingBehavior', () { flameTester.testGameWidget( - 'calls onBlink every 0.1 seconds when animation state is animated', + 'calls onBlink every 0.18 seconds when animation state is animated', setUp: (game, tester) async { final behavior = MultiballBlinkingBehavior(); final bloc = _MockMultiballCubit(); @@ -48,7 +48,7 @@ void main() { verify(bloc.onBlink).called(1); await tester.pump(); - game.update(0.1); + game.update(0.18); await streamController.close(); verify(bloc.onBlink).called(1); @@ -124,7 +124,7 @@ void main() { ); flameTester.testGameWidget( - 'onTick stops after 10 blinks repetitions', + 'onTick stops after 28 blinks', setUp: (game, tester) async { final behavior = MultiballBlinkingBehavior(); final bloc = _MockMultiballCubit(); @@ -148,7 +148,7 @@ void main() { ); await tester.pump(); - for (var i = 0; i < 10; i++) { + for (var i = 0; i < 28; i++) { behavior.onTick(); } diff --git a/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart b/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart index 3d8d2b39..4b3ec2bd 100644 --- a/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart +++ b/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart @@ -8,6 +8,7 @@ import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/components/google_gallery/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -116,5 +117,51 @@ void main() { verify(googleWordBloc.onBonusAwarded).called(1); }, ); + + flameTester.testGameWidget( + 'adds BonusBallSpawningBehavior to the game when all letters ' + 'in google word are activated', + setUp: (game, tester) async { + final behavior = GoogleWordBonusBehavior(); + final parent = GoogleGallery.test(); + final googleWord = GoogleWord(position: Vector2.zero()); + final googleWordBloc = _MockGoogleWordCubit(); + final streamController = StreamController(); + + whenListen( + googleWordBloc, + streamController.stream, + initialState: GoogleWordState.initial(), + ); + + await parent.add(googleWord); + await game.pump( + parent, + gameBloc: gameBloc, + googleWordBloc: googleWordBloc, + ); + await parent.ensureAdd(behavior); + + streamController.add( + const GoogleWordState( + letterSpriteStates: { + 0: GoogleLetterSpriteState.lit, + 1: GoogleLetterSpriteState.lit, + 2: GoogleLetterSpriteState.lit, + 3: GoogleLetterSpriteState.lit, + 4: GoogleLetterSpriteState.lit, + 5: GoogleLetterSpriteState.lit, + }, + ), + ); + await tester.pump(); + await game.ready(); + + expect( + game.descendants().whereType().length, + equals(1), + ); + }, + ); }); } diff --git a/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart b/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart index 139c7e47..7966b024 100644 --- a/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart +++ b/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart @@ -78,8 +78,24 @@ void main() { ); test( - 'is false when the bonusHistory has changed ' - 'with a bonus different than GameBonus.dashNest', () { + 'is true when the bonusHistory has changed ' + 'with a new GameBonus.googleWord', + () { + final previous = GameState.initial(); + final state = previous.copyWith( + bonusHistory: [GameBonus.googleWord], + ); + + expect( + MultiballsBehavior().listenWhen(previous, state), + isTrue, + ); + }, + ); + + test( + 'is false when the bonusHistory has changed with a bonus other than ' + 'GameBonus.dashNest or GameBonus.googelWord', () { final previous = GameState.initial().copyWith(bonusHistory: [GameBonus.dashNest]); final state = previous.copyWith(