diff --git a/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart index bc28650f..10de2c96 100644 --- a/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_bonus_behavior.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -22,39 +23,30 @@ class RampBonusBehavior extends Component with ParentIsA { @visibleForTesting RampBonusBehavior.test({ required Points points, - required this.subscription, }) : _points = points, super(); final Points _points; - /// Subscription to [SpaceshipRampState] at [SpaceshipRamp]. - @visibleForTesting - StreamSubscription? subscription; - - @override - void onMount() { - super.onMount(); - - subscription = subscription ?? - parent.bloc.stream.listen((state) { - final achievedOneMillionPoints = state.hits % 10 == 0; - - if (achievedOneMillionPoints) { - parent.add( - ScoringBehavior( - points: _points, - position: Vector2(0, -60), - duration: 2, - ), - ); - } - }); - } - @override - void onRemove() { - subscription?.cancel(); - super.onRemove(); + Future onLoad() async { + await super.onLoad(); + await add( + FlameBlocListener( + listenWhen: (previousState, newState) => + previousState.hits != newState.hits && + newState.hits != 0 && + newState.hits % 10 == 0, + onNewState: (state) { + parent.add( + ScoringBehavior( + points: _points, + position: Vector2(0, -60), + duration: 2, + ), + ); + }, + ), + ); } } diff --git a/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart index 71ce6ce5..f3d537c4 100644 --- a/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart @@ -11,8 +11,7 @@ import 'package:pinball_flame/pinball_flame.dart'; /// Increases the multiplier when a [Ball] is shot 5 times into the /// [SpaceshipRamp]. /// {@endtemplate} -class RampMultiplierBehavior extends Component - with ParentIsA, FlameBlocReader { +class RampMultiplierBehavior extends Component with ParentIsA { /// {@macro ramp_multiplier_behavior} RampMultiplierBehavior() : super(); @@ -20,39 +19,25 @@ class RampMultiplierBehavior extends Component /// /// This can be used for testing [RampMultiplierBehavior] in isolation. @visibleForTesting - RampMultiplierBehavior.test({ - required this.subscription, - }) : super(); - - /// Subscription to [SpaceshipRampState] at [SpaceshipRamp]. - @visibleForTesting - StreamSubscription? subscription; - - @override - void onMount() { - super.onMount(); - - var previousState = const SpaceshipRampState.initial(); - - subscription = subscription ?? - parent.bloc.stream.listen((state) { - final listenWhen = - previousState.hits != state.hits && state.hits != 0; - if (listenWhen) { - final achievedFiveShots = state.hits % 5 == 0; - - if (achievedFiveShots) { - bloc.add(const MultiplierIncreased()); - } - - previousState = state; - } - }); - } + RampMultiplierBehavior.test() : super(); @override - void onRemove() { - subscription?.cancel(); - super.onRemove(); + Future onLoad() async { + await super.onLoad(); + await add( + FlameBlocListener( + listenWhen: (previousState, newState) { + final hasChanged = + previousState.hits != newState.hits && newState.hits != 0; + final achievedFiveShots = newState.hits % 5 == 0; + final canIncrease = + readBloc().state.multiplier != 6; + return hasChanged && achievedFiveShots && canIncrease; + }, + onNewState: (state) { + readBloc().add(const MultiplierIncreased()); + }, + ), + ); } } diff --git a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart index d8565d6a..52253301 100644 --- a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart @@ -4,15 +4,13 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flutter/cupertino.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'; /// {@template ramp_shot_behavior} /// Increases the score when a [Ball] is shot into the [SpaceshipRamp]. /// {@endtemplate} -class RampShotBehavior extends Component - with ParentIsA, FlameBlocReader { +class RampShotBehavior extends Component with ParentIsA { /// {@macro ramp_shot_behavior} RampShotBehavior({ required Points points, @@ -25,38 +23,27 @@ class RampShotBehavior extends Component @visibleForTesting RampShotBehavior.test({ required Points points, - required this.subscription, }) : _points = points, super(); final Points _points; - /// Subscription to [SpaceshipRampState] at [SpaceshipRamp]. - @visibleForTesting - StreamSubscription? subscription; - - @override - void onMount() { - super.onMount(); - - subscription = subscription ?? - parent.bloc.stream.listen((state) { - final achievedOneMillionPoints = state.hits % 10 == 0; - - if (!achievedOneMillionPoints) { - parent.add( - ScoringBehavior( - points: _points, - position: Vector2(0, -45), - ), - ); - } - }); - } - @override - void onRemove() { - subscription?.cancel(); - super.onRemove(); + Future onLoad() async { + await super.onLoad(); + await add( + FlameBlocListener( + listenWhen: (previousState, newState) => + previousState.hits != newState.hits && newState.hits != 0, + onNewState: (state) { + parent.add( + ScoringBehavior( + points: _points, + position: Vector2(0, -45), + ), + ); + }, + ), + ); } } diff --git a/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_ball_ascending_contact_behavior.dart b/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_ball_ascending_contact_behavior.dart index db98a30a..bb641a82 100644 --- a/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_ball_ascending_contact_behavior.dart +++ b/packages/pinball_components/lib/src/components/spaceship_ramp/behavior/ramp_ball_ascending_contact_behavior.dart @@ -16,7 +16,8 @@ class RampBallAscendingContactBehavior if (other is! Ball) return; if (other.body.linearVelocity.y < 0) { - parent.parent.bloc.onAscendingBallEntered(); + readBloc() + .onAscendingBallEntered(); } } }