From 37f35dc60fac0bb004fdd788ac0357e53508496e Mon Sep 17 00:00:00 2001 From: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Date: Sun, 8 May 2022 20:40:48 -0500 Subject: [PATCH 1/2] feat: google bonus ball and multiball sync (#425) --- .../behaviors/google_word_bonus_behavior.dart | 2 + .../behaviors/multiballs_behavior.dart | 3 +- .../multiball_blinking_behavior.dart | 4 +- .../multiball_blinking_behavior_test.dart | 8 ++-- .../google_word_bonus_behavior_test.dart | 47 +++++++++++++++++++ .../behaviors/multiballs_behavior_test.dart | 20 +++++++- 6 files changed, 75 insertions(+), 9 deletions(-) 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..af77ef32 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.googleWord', () { final previous = GameState.initial().copyWith(bonusHistory: [GameBonus.dashNest]); final state = previous.copyWith( From bab088faeae6bdf6edee11a4b6384ec2f3874837 Mon Sep 17 00:00:00 2001 From: Erick Date: Sun, 8 May 2022 22:55:59 -0300 Subject: [PATCH 2/2] feat: setting background music to 60% for better tuning (#424) * feat: setting background music to 60% for better tuning * better code --- .../pinball_audio/lib/src/pinball_audio.dart | 9 +++++++-- .../test/src/pinball_audio_test.dart | 17 +++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 19a5d583..9682b520 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -59,7 +59,7 @@ typedef CreateAudioPool = Future Function( typedef PlaySingleAudio = Future Function(String); /// Defines the contract for looping a single audio. -typedef LoopSingleAudio = Future Function(String); +typedef LoopSingleAudio = Future Function(String, {double volume}); /// Defines the contract for pre fetching an audio. typedef PreCacheSingleAudio = Future Function(String); @@ -101,18 +101,20 @@ class _LoopAudio extends _Audio { required this.preCacheSingleAudio, required this.loopSingleAudio, required this.path, + this.volume, }); final PreCacheSingleAudio preCacheSingleAudio; final LoopSingleAudio loopSingleAudio; final String path; + final double? volume; @override Future load() => preCacheSingleAudio(prefixFile(path)); @override void play() { - loopSingleAudio(prefixFile(path)); + loopSingleAudio(prefixFile(path), volume: volume ?? 1); } } @@ -121,10 +123,12 @@ class _SingleLoopAudio extends _LoopAudio { required PreCacheSingleAudio preCacheSingleAudio, required LoopSingleAudio loopSingleAudio, required String path, + double? volume, }) : super( preCacheSingleAudio: preCacheSingleAudio, loopSingleAudio: loopSingleAudio, path: path, + volume: volume, ); bool _playing = false; @@ -296,6 +300,7 @@ class PinballAudioPlayer { preCacheSingleAudio: _preCacheSingleAudio, loopSingleAudio: _loopSingleAudio, path: Assets.music.background, + volume: .6, ), }; } diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index e7592b8f..3e147329 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -33,7 +33,7 @@ class _MockPlaySingleAudio extends Mock { } class _MockLoopSingleAudio extends Mock { - Future onCall(String url); + Future onCall(String url, {double volume}); } abstract class _PreCacheSingleAudio { @@ -77,7 +77,8 @@ void main() { when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {}); loopSingleAudio = _MockLoopSingleAudio(); - when(() => loopSingleAudio.onCall(any())).thenAnswer((_) async {}); + when(() => loopSingleAudio.onCall(any(), volume: any(named: 'volume'))) + .thenAnswer((_) async {}); preCacheSingleAudio = _MockPreCacheSingleAudio(); when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {}); @@ -443,8 +444,10 @@ void main() { audioPlayer.play(PinballAudio.backgroundMusic); verify( - () => loopSingleAudio - .onCall('packages/pinball_audio/${Assets.music.background}'), + () => loopSingleAudio.onCall( + 'packages/pinball_audio/${Assets.music.background}', + volume: .6, + ), ).called(1); }); @@ -455,8 +458,10 @@ void main() { ..play(PinballAudio.backgroundMusic); verify( - () => loopSingleAudio - .onCall('packages/pinball_audio/${Assets.music.background}'), + () => loopSingleAudio.onCall( + 'packages/pinball_audio/${Assets.music.background}', + volume: .6, + ), ).called(1); }); });