|
|
|
@ -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<PinballGame> {
|
|
|
|
|
/// {@macro flutter_forest}
|
|
|
|
@ -25,17 +23,16 @@ class FlutterForest extends Component
|
|
|
|
|
@override
|
|
|
|
|
Future<void> 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<FlutterForest>
|
|
|
|
|
with HasGameRef<PinballGame> {
|
|
|
|
|
_FlutterForestController(FlutterForest flutterForest) : super(flutterForest);
|
|
|
|
|
|
|
|
|
|
final _activatedBumpers = <String>{};
|
|
|
|
|
final _activatedBumpers = <DashNestBumper>{};
|
|
|
|
|
|
|
|
|
|
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<DashNestBumper>().forEach(
|
|
|
|
|
(dashNestBumper) => dashNestBumper.deactivate(),
|
|
|
|
|
);
|
|
|
|
|
// gameRef.read<GameBloc>().add(const BonusActivated(GameBonus.dashNest));
|
|
|
|
|
_addBonusBall();
|
|
|
|
|
_activatedBumpers.clear();
|
|
|
|
@ -74,53 +76,29 @@ class _FlutterForestController extends ComponentController<FlutterForest>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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<DashNestBumper, Ball> {
|
|
|
|
|
@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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|