diff --git a/lib/game/components/flutter_forest.dart b/lib/game/components/flutter_forest.dart index bc3921ae..a8e1e143 100644 --- a/lib/game/components/flutter_forest.dart +++ b/lib/game/components/flutter_forest.dart @@ -13,8 +13,6 @@ import 'package:pinball_flame/pinball_flame.dart'; /// When all [DashNestBumper]s are hit at least once, the [GameBonus.dashNest] /// is awarded, and the [BigDashNestBumper] releases a new [Ball]. /// {@endtemplate} -// TODO(alestiago): Make a [Blueprint] once [Blueprint] inherits from -// [Component]. class FlutterForest extends Component with Controls<_FlutterForestController>, HasGameRef { /// {@macro flutter_forest} @@ -25,17 +23,16 @@ class FlutterForest extends Component @override Future onLoad() async { await super.onLoad(); + gameRef.addContactCallback(_DashNestBumperBallContactCallback()); + final signPost = FlutterSignPost()..initialPosition = Vector2(8.35, 58.3); - final bigNest = _ControlledBigDashNestBumper( - id: 'big_nest_bumper', - )..initialPosition = Vector2(18.55, -59.35); - final smallLeftNest = _ControlledSmallDashNestBumper.a( - id: 'small_nest_bumper_a', - )..initialPosition = Vector2(8.95, -51.95); - final smallRightNest = _ControlledSmallDashNestBumper.b( - id: 'small_nest_bumper_b', - )..initialPosition = Vector2(23.3, -46.75); + final bigNest = _BigDashNestBumper() + ..initialPosition = Vector2(18.55, 59.35); + final smallLeftNest = _SmallDashNestBumper.a() + ..initialPosition = Vector2(8.95, 51.95); + final smallRightNest = _SmallDashNestBumper.b() + ..initialPosition = Vector2(23.3, 46.75); final dashAnimatronic = DashAnimatronic()..position = Vector2(20, -66); await addAll([ @@ -52,13 +49,18 @@ class _FlutterForestController extends ComponentController with HasGameRef { _FlutterForestController(FlutterForest flutterForest) : super(flutterForest); - final _activatedBumpers = {}; + final _activatedBumpers = {}; + + void activateBumper(DashNestBumper dashNestBumper) { + if (!_activatedBumpers.add(dashNestBumper)) return; - void activateBumper(String id) { - if (!_activatedBumpers.add(id)) return; + dashNestBumper.activate(); final activatedBonus = _activatedBumpers.length == 3; if (activatedBonus) { + children.whereType().forEach( + (dashNestBumper) => dashNestBumper.deactivate(), + ); // gameRef.read().add(const BonusActivated(GameBonus.dashNest)); _addBonusBall(); _activatedBumpers.clear(); @@ -74,53 +76,29 @@ class _FlutterForestController extends ComponentController } } -class _ControlledBigDashNestBumper extends BigDashNestBumper with ScorePoints { - _ControlledBigDashNestBumper({ - required this.id, - }); - - final String id; - +// TODO(alestiago): Revisit ScorePoints logic once the FlameForge2D +// ContactCallback process is enhanced. +class _BigDashNestBumper extends BigDashNestBumper with ScorePoints { @override int get points => 20; } -class _ControlledBigDashNestBumperBallContactCallback - extends ContactCallback<_ControlledBigDashNestBumper, Ball> { - @override - void begin(_ControlledBigDashNestBumper controlledBigDashNestBumper, _, __) { - (controlledBigDashNestBumper.parent! as FlutterForest) - .controller - .activateBumper(controlledBigDashNestBumper.id); - } -} - -class _ControlledSmallDashNestBumper extends SmallDashNestBumper - with ScorePoints { - _ControlledSmallDashNestBumper.a({ - required this.id, - }) : super.a(); +class _SmallDashNestBumper extends SmallDashNestBumper with ScorePoints { + _SmallDashNestBumper.a() : super.a(); - _ControlledSmallDashNestBumper.b({ - required this.id, - }) : super.b(); - - final String id; + _SmallDashNestBumper.b() : super.b(); @override int get points => 20; } -class _ControlledSmallDashNestBumperBallContactCallback - extends ContactCallback<_ControlledSmallDashNestBumper, Ball> { +class _DashNestBumperBallContactCallback + extends ContactCallback { @override - void begin( - _ControlledSmallDashNestBumper controlledSmallDashNestBumper, - _, - __, - ) { - (controlledSmallDashNestBumper.parent! as FlutterForest) - .controller - .activateBumper(controlledSmallDashNestBumper.id); + void begin(DashNestBumper dashNestBumper, _, __) { + if (dashNestBumper.parent is FlutterForest) return; + + final parent = dashNestBumper.parent! as FlutterForest; + parent.controller.activateBumper(dashNestBumper); } } diff --git a/lib/game/components/score_points.dart b/lib/game/components/score_points.dart index ce13c718..f0d6ec3a 100644 --- a/lib/game/components/score_points.dart +++ b/lib/game/components/score_points.dart @@ -34,10 +34,7 @@ class BallScorePointsCallback extends ContactCallback { ScorePoints scorePoints, Contact __, ) { - _gameRef.read().add( - Scored(points: scorePoints.points), - ); - + _gameRef.read().add(Scored(points: scorePoints.points)); _gameRef.audio.score(); } } diff --git a/test/game/components/flutter_forest_test.dart b/test/game/components/flutter_forest_test.dart index 3315c632..9a29557c 100644 --- a/test/game/components/flutter_forest_test.dart +++ b/test/game/components/flutter_forest_test.dart @@ -96,14 +96,13 @@ void main() { 'add Scored event', setUp: (game, tester) async { final flutterForest = FlutterForest(); - await game.ensureAdd(flutterForest); - await game.ensureAdd(ball); + await game.ensureAddAll([ + flutterForest, + ball, + ]); game.addContactCallback(BallScorePointsCallback(game)); - final bumpers = flutterForest - .descendants() - .whereType() - .whereType(); + final bumpers = flutterForest.descendants().whereType(); for (final bumper in bumpers) { beginContact(game, bumper, ball);