diff --git a/lib/game/bloc/game_bloc.dart b/lib/game/bloc/game_bloc.dart index 4ba63092..061e5906 100644 --- a/lib/game/bloc/game_bloc.dart +++ b/lib/game/bloc/game_bloc.dart @@ -11,6 +11,8 @@ class GameBloc extends Bloc { GameBloc() : super(const GameState.initial()) { on(_onBallLost); on(_onScored); + on(_onIncreasedMultiplier); + on(_onResetMultiplier); on(_onBonusActivated); on(_onSparkyTurboChargeActivated); } @@ -21,7 +23,21 @@ class GameBloc extends Bloc { void _onScored(Scored event, Emitter emit) { if (!state.isGameOver) { - emit(state.copyWith(score: state.score + event.points)); + emit( + state.copyWith(score: state.score + state.multiplier * event.points), + ); + } + } + + void _onIncreasedMultiplier(IncreasedMultiplier event, Emitter emit) { + if (!state.isGameOver) { + emit(state.copyWith(multiplier: state.multiplier + event.increase)); + } + } + + void _onResetMultiplier(ResetMultiplier event, Emitter emit) { + if (!state.isGameOver) { + emit(state.copyWith(multiplier: 1)); } } diff --git a/lib/game/bloc/game_event.dart b/lib/game/bloc/game_event.dart index bbb89028..0b42af53 100644 --- a/lib/game/bloc/game_event.dart +++ b/lib/game/bloc/game_event.dart @@ -48,3 +48,29 @@ class SparkyTurboChargeActivated extends GameEvent { @override List get props => []; } + +/// {@template increased_multiplier_game_event} +/// Event added when multiplier is being increased. +/// {@endtemplate} +class IncreasedMultiplier extends GameEvent { + /// {@macro increased_multiplier_game_event} + const IncreasedMultiplier({ + required this.increase, + }) : assert(increase > 0, 'Increase must be greater than 0'); + + final int increase; + + @override + List get props => [increase]; +} + +/// {@template reset_multiplier_game_event} +/// Event added when multiplier is reset. +/// {@endtemplate} +class ResetMultiplier extends GameEvent { + /// {@macro reset_multiplier_game_event} + const ResetMultiplier(); + + @override + List get props => []; +} diff --git a/lib/game/bloc/game_state.dart b/lib/game/bloc/game_state.dart index c57eedb4..02098c3b 100644 --- a/lib/game/bloc/game_state.dart +++ b/lib/game/bloc/game_state.dart @@ -21,6 +21,7 @@ class GameState extends Equatable { /// {@macro game_state} const GameState({ required this.score, + required this.multiplier, required this.balls, required this.bonusHistory, }) : assert(score >= 0, "Score can't be negative"), @@ -28,12 +29,16 @@ class GameState extends Equatable { const GameState.initial() : score = 0, + multiplier = 1, balls = 3, bonusHistory = const []; /// The current score of the game. final int score; + /// The current multiplier for the score. + final int multiplier; + /// The number of balls left in the game. /// /// When the number of balls is 0, the game is over. @@ -48,6 +53,7 @@ class GameState extends Equatable { GameState copyWith({ int? score, + int? multiplier, int? balls, List? bonusHistory, }) { @@ -58,6 +64,7 @@ class GameState extends Equatable { return GameState( score: score ?? this.score, + multiplier: multiplier ?? this.multiplier, balls: balls ?? this.balls, bonusHistory: bonusHistory ?? this.bonusHistory, ); @@ -66,6 +73,7 @@ class GameState extends Equatable { @override List get props => [ score, + multiplier, balls, bonusHistory, ];