diff --git a/lib/game/behaviors/character_selection_behavior.dart b/lib/game/behaviors/character_selection_behavior.dart index 27003d75..e62438f6 100644 --- a/lib/game/behaviors/character_selection_behavior.dart +++ b/lib/game/behaviors/character_selection_behavior.dart @@ -2,6 +2,8 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; +import 'package:platform_helper/platform_helper.dart'; /// Updates the [ArcadeBackground] and launch [Ball] to reflect character /// selections. @@ -11,12 +13,14 @@ class CharacterSelectionBehavior extends Component HasGameRef { @override void onNewState(CharacterThemeState state) { - gameRef - .descendants() - .whereType() - .single - .bloc - .onCharacterSelected(state.characterTheme); + if (!readProvider().isMobile) { + gameRef + .descendants() + .whereType() + .single + .bloc + .onCharacterSelected(state.characterTheme); + } gameRef .descendants() .whereType() diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index d455b583..6de52b54 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -26,11 +26,13 @@ class PinballGame extends PinballForge2DGame required GameBloc gameBloc, required AppLocalizations l10n, required PinballAudioPlayer audioPlayer, + required PlatformHelper platformHelper, }) : focusNode = FocusNode(), _gameBloc = gameBloc, _audioPlayer = audioPlayer, _characterThemeBloc = characterThemeBloc, _l10n = l10n, + _platformHelper = platformHelper, super( gravity: Vector2(0, 30), ) { @@ -58,6 +60,8 @@ class PinballGame extends PinballForge2DGame final AppLocalizations _l10n; + final PlatformHelper _platformHelper; + final GameBloc _gameBloc; List? _entries; @@ -91,6 +95,7 @@ class PinballGame extends PinballForge2DGame FlameProvider.value(leaderboardRepository), FlameProvider.value(shareRepository), FlameProvider.value(_l10n), + FlameProvider.value(_platformHelper), ], children: [ BonusNoiseBehavior(), @@ -107,7 +112,7 @@ class PinballGame extends PinballForge2DGame children: [ ZCanvasComponent( children: [ - if (!PlatformHelper().isMobile) ArcadeBackground(), + if (!_platformHelper.isMobile) ArcadeBackground(), BoardBackgroundSpriteComponent(), Boundaries(), Backbox( @@ -198,6 +203,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { required ShareRepository shareRepository, required AppLocalizations l10n, required PinballAudioPlayer audioPlayer, + required PlatformHelper platformHelper, required GameBloc gameBloc, }) : super( characterThemeBloc: characterThemeBloc, @@ -205,6 +211,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ); diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index a36754d8..ffa9498a 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -11,6 +11,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class PinballGamePage extends StatelessWidget { @@ -27,6 +28,7 @@ class PinballGamePage extends StatelessWidget { final audioPlayer = context.read(); final leaderboardRepository = context.read(); final shareRepository = context.read(); + final platformHelper = PlatformHelper(); final gameBloc = context.read(); final game = isDebugMode ? DebugPinballGame( @@ -35,6 +37,7 @@ class PinballGamePage extends StatelessWidget { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: context.l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ) : PinballGame( @@ -43,6 +46,7 @@ class PinballGamePage extends StatelessWidget { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: context.l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ); diff --git a/test/game/behaviors/character_selection_behavior_test.dart b/test/game/behaviors/character_selection_behavior_test.dart index 67a8b0a5..edf17999 100644 --- a/test/game/behaviors/character_selection_behavior_test.dart +++ b/test/game/behaviors/character_selection_behavior_test.dart @@ -12,6 +12,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; +import 'package:platform_helper/platform_helper.dart'; class _TestGame extends Forge2DGame { @override @@ -28,11 +29,17 @@ class _TestGame extends Forge2DGame { Future pump( List children, { CharacterThemeCubit? characterThemeBloc, + PlatformHelper? platformHelper, }) async { await ensureAdd( FlameBlocProvider.value( value: characterThemeBloc ?? CharacterThemeCubit(), - children: children, + children: [ + FlameProvider.value( + platformHelper ?? _MockPlatformHelper(), + children: children, + ), + ], ), ); } @@ -43,6 +50,8 @@ class _MockBallCubit extends Mock implements BallCubit {} class _MockArcadeBackgroundCubit extends Mock implements ArcadeBackgroundCubit { } +class _MockPlatformHelper extends Mock implements PlatformHelper {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -68,8 +77,45 @@ void main() { ); flameTester.test( - 'onNewState calls onCharacterSelected on the arcade background bloc', + 'onNewState does not call onCharacterSelected on the arcade background ' + 'bloc when platform is mobile', + (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => true); + final arcadeBackgroundBloc = _MockArcadeBackgroundCubit(); + whenListen( + arcadeBackgroundBloc, + const Stream.empty(), + initialState: const ArcadeBackgroundState.initial(), + ); + final behavior = CharacterSelectionBehavior(); + await game.pump( + [ + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + Ball.test(), + ], + platformHelper: platformHelper, + ); + + const dinoThemeState = CharacterThemeState(theme.DinoTheme()); + behavior.onNewState(dinoThemeState); + await game.ready(); + + verifyNever( + () => arcadeBackgroundBloc + .onCharacterSelected(dinoThemeState.characterTheme), + ); + }, + ); + + flameTester.test( + 'onNewState calls onCharacterSelected on the arcade background ' + 'bloc when platform is not mobile', (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => false); final arcadeBackgroundBloc = _MockArcadeBackgroundCubit(); whenListen( arcadeBackgroundBloc, @@ -79,13 +125,16 @@ void main() { final arcadeBackground = ArcadeBackground.test(bloc: arcadeBackgroundBloc); final behavior = CharacterSelectionBehavior(); - await game.pump([ - arcadeBackground, - behavior, - ZCanvasComponent(), - Plunger.test(compressionDistance: 10), - Ball.test(), - ]); + await game.pump( + [ + arcadeBackground, + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + Ball.test(), + ], + platformHelper: platformHelper, + ); const dinoThemeState = CharacterThemeState(theme.DinoTheme()); behavior.onNewState(dinoThemeState); @@ -101,6 +150,8 @@ void main() { flameTester.test( 'onNewState calls onCharacterSelected on the ball bloc', (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => false); final ballBloc = _MockBallCubit(); whenListen( ballBloc, @@ -109,13 +160,16 @@ void main() { ); final ball = Ball.test(bloc: ballBloc); final behavior = CharacterSelectionBehavior(); - await game.pump([ - ball, - behavior, - ZCanvasComponent(), - Plunger.test(compressionDistance: 10), - ArcadeBackground.test(), - ]); + await game.pump( + [ + ball, + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + ArcadeBackground.test(), + ], + platformHelper: platformHelper, + ); const dinoThemeState = CharacterThemeState(theme.DinoTheme()); behavior.onNewState(dinoThemeState); diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 19760f64..71c8f1da 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -16,6 +16,7 @@ import 'package:pinball/game/game.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/src/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class _TestPinballGame extends PinballGame { @@ -27,6 +28,7 @@ class _TestPinballGame extends PinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -47,6 +49,7 @@ class _TestDebugPinballGame extends DebugPinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -88,6 +91,11 @@ class _MockShareRepository extends Mock implements ShareRepository {} class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index fce6e74e..a0a0f22c 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -15,6 +15,7 @@ import 'package:pinball/more_information/more_information.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; import '../../helpers/helpers.dart'; @@ -28,6 +29,7 @@ class _TestPinballGame extends PinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -63,6 +65,11 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockShareRepository extends Mock implements ShareRepository {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { final game = _TestPinballGame();