// ignore_for_file: public_member_api_docs import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:meta/meta.dart'; part 'game_event.dart'; part 'game_state.dart'; class GameBloc extends Bloc { GameBloc() : super(const GameState.initial()) { on(_onBallLost); on(_onScored); on(_onBonusLetterActivated); on(_onDashNestActivated); on(_onSparkyTurboChargeActivated); } static const bonusWord = 'GOOGLE'; static const bonusWordScore = 10000; void _onBallLost(BallLost event, Emitter emit) { emit(state.copyWith(balls: state.balls - 1)); } void _onScored(Scored event, Emitter emit) { if (!state.isGameOver) { emit(state.copyWith(score: state.score + event.points)); } } void _onBonusLetterActivated(BonusLetterActivated event, Emitter emit) { final newBonusLetters = [ ...state.activatedBonusLetters, event.letterIndex, ]; final achievedBonus = newBonusLetters.length == bonusWord.length; if (achievedBonus) { emit( state.copyWith( activatedBonusLetters: [], bonusHistory: [ ...state.bonusHistory, GameBonus.word, ], ), ); add(const Scored(points: bonusWordScore)); } else { emit( state.copyWith(activatedBonusLetters: newBonusLetters), ); } } void _onDashNestActivated(DashNestActivated event, Emitter emit) { final newNests = { ...state.activatedDashNests, event.nestId, }; final achievedBonus = newNests.length == 3; if (achievedBonus) { emit( state.copyWith( balls: state.balls + 1, activatedDashNests: {}, bonusHistory: [ ...state.bonusHistory, GameBonus.dashNest, ], ), ); } else { emit( state.copyWith(activatedDashNests: newNests), ); } } Future _onSparkyTurboChargeActivated( SparkyTurboChargeActivated event, Emitter emit, ) async { emit( state.copyWith( bonusHistory: [ ...state.bonusHistory, GameBonus.sparkyTurboCharge, ], ), ); } }