From 2abd29d46fa85b54db2241f389c3bc60736d0693 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Sun, 8 May 2022 01:26:40 +0200 Subject: [PATCH] feat: arrow behaviors --- lib/bootstrap.dart | 2 +- .../android_acres/android_acres.dart | 2 + .../android_acres/behaviors/behaviors.dart | 1 + .../behaviors/ramp_multiplier_behavior.dart | 58 +++++++++++++++++++ .../behaviors/ramp_progress_behavior.dart | 16 +++-- .../behaviors/ramp_shot_behavior.dart | 2 - 6 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart diff --git a/lib/bootstrap.dart b/lib/bootstrap.dart index f4028ee1..9dea2208 100644 --- a/lib/bootstrap.dart +++ b/lib/bootstrap.dart @@ -10,7 +10,7 @@ class AppBlocObserver extends BlocObserver { @override void onChange(BlocBase bloc, Change change) { super.onChange(bloc, change); - log('onChange(${bloc.runtimeType}, $change)'); + //log('onChange(${bloc.runtimeType}, $change)'); } @override diff --git a/lib/game/components/android_acres/android_acres.dart b/lib/game/components/android_acres/android_acres.dart index 902eb11c..1b43dc54 100644 --- a/lib/game/components/android_acres/android_acres.dart +++ b/lib/game/components/android_acres/android_acres.dart @@ -23,6 +23,8 @@ class AndroidAcres extends Component { children: [ RampShotBehavior(points: Points.fiveThousand), RampBonusBehavior(points: Points.oneMillion), + RampProgressBehavior(), + RampMultiplierBehavior(), ], ), SpaceshipRail(), diff --git a/lib/game/components/android_acres/behaviors/behaviors.dart b/lib/game/components/android_acres/behaviors/behaviors.dart index 2c3335e5..ddf7d766 100644 --- a/lib/game/components/android_acres/behaviors/behaviors.dart +++ b/lib/game/components/android_acres/behaviors/behaviors.dart @@ -1,4 +1,5 @@ export 'android_spaceship_bonus_behavior.dart'; export 'ramp_bonus_behavior.dart'; +export 'ramp_multiplier_behavior.dart'; export 'ramp_progress_behavior.dart'; export 'ramp_shot_behavior.dart'; diff --git a/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart new file mode 100644 index 00000000..71ce6ce5 --- /dev/null +++ b/lib/game/components/android_acres/behaviors/ramp_multiplier_behavior.dart @@ -0,0 +1,58 @@ +import 'dart:async'; + +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +/// {@template ramp_multiplier_behavior} +/// Increases the multiplier when a [Ball] is shot 5 times into the +/// [SpaceshipRamp]. +/// {@endtemplate} +class RampMultiplierBehavior extends Component + with ParentIsA, FlameBlocReader { + /// {@macro ramp_multiplier_behavior} + RampMultiplierBehavior() : super(); + + /// Creates a [RampMultiplierBehavior]. + /// + /// 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; + } + }); + } + + @override + void onRemove() { + subscription?.cancel(); + super.onRemove(); + } +} diff --git a/lib/game/components/android_acres/behaviors/ramp_progress_behavior.dart b/lib/game/components/android_acres/behaviors/ramp_progress_behavior.dart index 6171b31f..c74d472b 100644 --- a/lib/game/components/android_acres/behaviors/ramp_progress_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_progress_behavior.dart @@ -31,29 +31,33 @@ class RampProgressBehavior extends Component void onMount() { super.onMount(); - final spaceshipRamp = parent.children.whereType().first; - var previousState = const SpaceshipRampState.initial(); subscription = subscription ?? parent.bloc.stream.listen((state) { + print("STATE $state"); final listenWhen = previousState.hits != state.hits && state.hits != 0; if (listenWhen) { - var fullArrowLit = spaceshipRamp.bloc.isFullyProgressed(); + var fullArrowLit = parent.bloc.isFullyProgressed(); var isMaxMultiplier = bloc.state.multiplier == 6; final canProgress = !isMaxMultiplier || (isMaxMultiplier && !fullArrowLit); + print("fullArrowLit $fullArrowLit"); + print("isMaxMultiplier $isMaxMultiplier"); + print("canProgress $canProgress"); if (canProgress) { - spaceshipRamp.bloc.onProgressed(); + print("onProgressed"); + parent.bloc.onProgressed(); } - fullArrowLit = spaceshipRamp.bloc.isFullyProgressed(); + fullArrowLit = parent.bloc.isFullyProgressed(); isMaxMultiplier = bloc.state.multiplier == 6; if (fullArrowLit && !isMaxMultiplier) { - spaceshipRamp.bloc.onAnimate(); + print("onAnimate"); + parent.bloc.onAnimate(); } previousState = state; 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 b15f5e30..d8565d6a 100644 --- a/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart +++ b/lib/game/components/android_acres/behaviors/ramp_shot_behavior.dart @@ -44,8 +44,6 @@ class RampShotBehavior extends Component final achievedOneMillionPoints = state.hits % 10 == 0; if (!achievedOneMillionPoints) { - bloc.add(const MultiplierIncreased()); - parent.add( ScoringBehavior( points: _points,