From 5007705e82d4ac0d6e2afaded1275019148ec5a3 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Tue, 10 May 2022 12:37:46 +0100 Subject: [PATCH] fix: enable auto-pulling for all devices (#455) --- .../components/game_bloc_status_listener.dart | 27 ++++------- lib/game/pinball_game.dart | 2 +- .../behaviors/plunger_pulling_behavior.dart | 15 ++++-- .../plunger/cubit/plunger_cubit.dart | 2 + .../plunger/cubit/plunger_state.dart | 6 ++- .../lib/src/components/plunger/plunger.dart | 1 + .../plunger_pulling_behavior_test.dart | 47 +++---------------- .../plunger/cubit/plunger_cubit_test.dart | 25 ++++++++++ .../game_bloc_status_listener_test.dart | 22 ++------- test/game/pinball_game_test.dart | 2 +- 10 files changed, 67 insertions(+), 82 deletions(-) create mode 100644 packages/pinball_components/test/src/components/plunger/cubit/plunger_cubit_test.dart diff --git a/lib/game/components/game_bloc_status_listener.dart b/lib/game/components/game_bloc_status_listener.dart index 6ffd2ad3..fb5fc485 100644 --- a/lib/game/components/game_bloc_status_listener.dart +++ b/lib/game/components/game_bloc_status_listener.dart @@ -5,7 +5,6 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:platform_helper/platform_helper.dart'; /// Listens to the [GameBloc] and updates the game accordingly. class GameBlocStatusListener extends Component @@ -68,31 +67,25 @@ class GameBlocStatusListener extends Component gameRef.descendants().whereType().single.bloc.onReset(); } - void _addPlungerBehaviors(Plunger plunger) { - final platformHelper = readProvider(); - const pullingStrength = 7.0; - final provider = - plunger.firstChild>()!; - - if (platformHelper.isMobile) { - provider.add( - PlungerAutoPullingBehavior(strength: pullingStrength), - ); - } else { - provider.addAll( + void _addPlungerBehaviors(Plunger plunger) => plunger + .firstChild>()! + .addAll( [ - PlungerKeyControllingBehavior(), - PlungerPullingBehavior(strength: pullingStrength), + PlungerPullingBehavior(strength: 7), + PlungerAutoPullingBehavior(), + PlungerKeyControllingBehavior() ], ); - } - } void _removePlungerBehaviors(Plunger plunger) { plunger .descendants() .whereType() .forEach(plunger.remove); + plunger + .descendants() + .whereType() + .forEach(plunger.remove); plunger .descendants() .whereType() diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index ad81425f..23769756 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -167,7 +167,7 @@ class PinballGame extends PinballForge2DGame .whereType>() .first .bloc - .pulled(); + .autoPulled(); } else { final tappedLeftSide = info.eventPosition.widget.x < canvasSize.x / 2; focusedBoardSide[pointerId] = diff --git a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart index db6bcaa3..7dc0d99b 100644 --- a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart +++ b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart @@ -28,14 +28,19 @@ class PlungerPullingBehavior extends Component } } -class PlungerAutoPullingBehavior extends PlungerPullingBehavior { - PlungerAutoPullingBehavior({ - required double strength, - }) : super(strength: strength); +class PlungerAutoPullingBehavior extends Component + with FlameBlocReader { + late final Plunger _plunger; + + @override + Future onLoad() async { + await super.onLoad(); + _plunger = parent!.parent! as Plunger; + } @override void update(double dt) { - super.update(dt); + if (!bloc.state.isAutoPulling) return; final joint = _plunger.body.joints.whereType().single; final reachedBottom = joint.getJointTranslation() <= joint.getLowerLimit(); diff --git a/packages/pinball_components/lib/src/components/plunger/cubit/plunger_cubit.dart b/packages/pinball_components/lib/src/components/plunger/cubit/plunger_cubit.dart index ce845197..694f7c94 100644 --- a/packages/pinball_components/lib/src/components/plunger/cubit/plunger_cubit.dart +++ b/packages/pinball_components/lib/src/components/plunger/cubit/plunger_cubit.dart @@ -8,4 +8,6 @@ class PlungerCubit extends Cubit { void pulled() => emit(PlungerState.pulling); void released() => emit(PlungerState.releasing); + + void autoPulled() => emit(PlungerState.autoPulling); } diff --git a/packages/pinball_components/lib/src/components/plunger/cubit/plunger_state.dart b/packages/pinball_components/lib/src/components/plunger/cubit/plunger_state.dart index 8b82ef96..0590d6fd 100644 --- a/packages/pinball_components/lib/src/components/plunger/cubit/plunger_state.dart +++ b/packages/pinball_components/lib/src/components/plunger/cubit/plunger_state.dart @@ -4,9 +4,13 @@ enum PlungerState { pulling, releasing, + + autoPulling, } extension PlungerStateX on PlungerState { - bool get isPulling => this == PlungerState.pulling; + bool get isPulling => + this == PlungerState.pulling || this == PlungerState.autoPulling; bool get isReleasing => this == PlungerState.releasing; + bool get isAutoPulling => this == PlungerState.autoPulling; } diff --git a/packages/pinball_components/lib/src/components/plunger/plunger.dart b/packages/pinball_components/lib/src/components/plunger/plunger.dart index fbb7a437..488c79bb 100644 --- a/packages/pinball_components/lib/src/components/plunger/plunger.dart +++ b/packages/pinball_components/lib/src/components/plunger/plunger.dart @@ -132,6 +132,7 @@ class _PlungerSpriteAnimationGroupComponent animations = { PlungerState.releasing: pullAnimation.reversed(), PlungerState.pulling: pullAnimation, + PlungerState.autoPulling: pullAnimation, }; current = readBloc().state; diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart index 4eec7029..c289edee 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:bloc_test/bloc_test.dart'; +import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; @@ -12,7 +13,7 @@ import 'package:pinball_components/pinball_components.dart'; class _TestGame extends Forge2DGame { Future pump( - PlungerPullingBehavior behavior, { + Component behavior, { PlungerCubit? plungerBloc, }) async { final plunger = Plunger.test(); @@ -85,62 +86,28 @@ void main() { group('PlungerAutoPullingBehavior', () { test('can be instantiated', () { expect( - PlungerAutoPullingBehavior(strength: 0), + PlungerAutoPullingBehavior(), isA(), ); }); flameTester.test('can be loaded', (game) async { - final behavior = PlungerAutoPullingBehavior(strength: 0); + final behavior = PlungerAutoPullingBehavior(); await game.pump(behavior); expect(game.descendants(), contains(behavior)); }); - flameTester.test( - "pulls while joint hasn't reached limit", - (game) async { - final plungerBloc = _MockPlungerCubit(); - whenListen( - plungerBloc, - Stream.value(PlungerState.pulling), - initialState: PlungerState.pulling, - ); - - const strength = 2.0; - final behavior = PlungerAutoPullingBehavior( - strength: strength, - ); - await game.pump( - behavior, - plungerBloc: plungerBloc, - ); - final plunger = behavior.ancestors().whereType().single; - final joint = _MockPrismaticJoint(); - when(joint.getJointTranslation).thenReturn(2); - when(joint.getLowerLimit).thenReturn(0); - plunger.body.joints.add(joint); - - game.update(0); - - expect(plunger.body.linearVelocity.x, equals(0)); - expect(plunger.body.linearVelocity.y, equals(strength)); - }, - ); - flameTester.test( 'releases when joint reaches limit', (game) async { final plungerBloc = _MockPlungerCubit(); whenListen( plungerBloc, - Stream.value(PlungerState.pulling), - initialState: PlungerState.pulling, + Stream.value(PlungerState.autoPulling), + initialState: PlungerState.autoPulling, ); - const strength = 2.0; - final behavior = PlungerAutoPullingBehavior( - strength: strength, - ); + final behavior = PlungerAutoPullingBehavior(); await game.pump( behavior, plungerBloc: plungerBloc, diff --git a/packages/pinball_components/test/src/components/plunger/cubit/plunger_cubit_test.dart b/packages/pinball_components/test/src/components/plunger/cubit/plunger_cubit_test.dart new file mode 100644 index 00000000..31c802f9 --- /dev/null +++ b/packages/pinball_components/test/src/components/plunger/cubit/plunger_cubit_test.dart @@ -0,0 +1,25 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; + +void main() { + group('PlungerCubit', () { + test('can be instantiated', () { + expect(PlungerCubit(), isA()); + }); + + blocTest( + 'overrides previous pulling state', + build: PlungerCubit.new, + act: (cubit) => cubit + ..pulled() + ..autoPulled() + ..pulled(), + expect: () => [ + PlungerState.pulling, + PlungerState.autoPulling, + PlungerState.pulling, + ], + ); + }); +} diff --git a/test/game/components/game_bloc_status_listener_test.dart b/test/game/components/game_bloc_status_listener_test.dart index 069731fd..4f7f7222 100644 --- a/test/game/components/game_bloc_status_listener_test.dart +++ b/test/game/components/game_bloc_status_listener_test.dart @@ -36,7 +36,6 @@ class _TestGame extends Forge2DGame with HasTappables { Future pump( Iterable children, { PinballAudioPlayer? pinballAudioPlayer, - PlatformHelper? platformHelper, GoogleWordCubit? googleWordBloc, }) async { return ensureAdd( @@ -62,7 +61,7 @@ class _TestGame extends Forge2DGame with HasTappables { _MockAppLocalizations(), ), FlameProvider.value( - platformHelper ?? PlatformHelper(), + PlatformHelper(), ), ], children: children, @@ -80,8 +79,6 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockShareRepository extends Mock implements ShareRepository {} -class _MockPlatformHelper extends Mock implements PlatformHelper {} - class _MockPlungerCubit extends Mock implements PlungerCubit {} class _MockGoogleWordCubit extends Mock implements GoogleWordCubit {} @@ -278,7 +275,7 @@ void main() { create: PlungerCubit.new, children: [ PlungerPullingBehavior(strength: 0), - PlungerAutoPullingBehavior(strength: 0) + PlungerAutoPullingBehavior() ], ), ); @@ -460,10 +457,8 @@ void main() { ); flameTester.test( - 'adds PlungerKeyControllingBehavior to Plunger when on desktop', + 'adds PlungerKeyControllingBehavior to Plunger', (game) async { - final platformHelper = _MockPlatformHelper(); - when(() => platformHelper.isMobile).thenReturn(false); final component = GameBlocStatusListener(); final leaderboardRepository = _MockLeaderboardRepository(); final shareRepository = _MockShareRepository(); @@ -482,7 +477,6 @@ void main() { bloc: _MockSignpostCubit(), ), ], - platformHelper: platformHelper, ); await plunger.ensureAdd( FlameBlocProvider( @@ -506,10 +500,8 @@ void main() { ); flameTester.test( - 'adds PlungerPullingBehavior to Plunger when on desktop', + 'adds PlungerPullingBehavior to Plunger', (game) async { - final platformHelper = _MockPlatformHelper(); - when(() => platformHelper.isMobile).thenReturn(false); final component = GameBlocStatusListener(); final leaderboardRepository = _MockLeaderboardRepository(); final shareRepository = _MockShareRepository(); @@ -528,7 +520,6 @@ void main() { bloc: _MockSignpostCubit(), ), ], - platformHelper: platformHelper, ); await plunger.ensureAdd( FlameBlocProvider( @@ -549,10 +540,8 @@ void main() { ); flameTester.test( - 'adds PlungerAutoPullingBehavior to Plunger when on mobile', + 'adds PlungerAutoPullingBehavior to Plunger', (game) async { - final platformHelper = _MockPlatformHelper(); - when(() => platformHelper.isMobile).thenReturn(true); final component = GameBlocStatusListener(); final leaderboardRepository = _MockLeaderboardRepository(); final shareRepository = _MockShareRepository(); @@ -571,7 +560,6 @@ void main() { bloc: _MockSignpostCubit(), ), ], - platformHelper: platformHelper, ); await plunger.ensureAdd( FlameBlocProvider( diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 05b9442c..b44295ed 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -434,7 +434,7 @@ void main() { .single .bloc; - expect(plungerBloc.state, PlungerState.pulling); + expect(plungerBloc.state, PlungerState.autoPulling); }); }); });